1、C语言基本类型:字符型,整型,浮点型
2、结构体(复杂类型):自定义类型 i
3、定义变量:为了分配空间
类型 变量名; //注:分配空间编译器通过类型来分配
初始化:定义变量同时赋值
3.1定义结构体(自定义)的类型
struct 类型名
{
属性1;
属性2;
属性3;
...
};
3.1.1无嵌套结构体:所有属性都是基本类型
//定义人的类型:人的信息(姓名,姓别,身高)
struct people
{
//姓名:
char name[10];
//性别
char sex;
//身高
unsigned short height;
};
3.1.2嵌套结构体:属性是一个结构体变量
struct people
{
...
struct *** 变量名;
...
};
3.2定义结构体变量:类型 变量名;
struct 类型名 变量名;
3.3引用结构元素:一定要通过结构体变量来引用属性。
.运算符 :引用复杂类型的成员
变量名.属性;
3.4结构体的分配空间法则:以最大字元素字节对齐 (*)
1、查找最大元素的类型
2、每个元素都分配以最大类型的最小的倍数。
3、共享空间?
注:gcc编译器可以指定对齐方式(这不是C语言的标准)
__attribute__((packed))
3.5结构体变量之间赋值: 注:同类型之间,不同类型的结构体是不能赋值的
struct people a,b;
a=b;
习题:
二分查找法 :
#include<stdio.h>
void main()
{
int buf[] = {1,2,3,4,5,6,7,8,9,10,11};
//这半查找:
int mid,left=0,right=10;
int key = 2;//需要在序列中查找2是否存在
//从区间中获取中间元素的下标
while(left<=right)
{
mid = (left + right)/2;
if(key<buf[mid]) //查找值在左侧
{
right=mid-1;
printf("左侧\n");
}
else if(key>buf[mid])
{
left=mid+1;
printf("右侧\n");
}
else if(key==buf[mid])
{
printf("查找成功\n");
break;//跳出循环
}
}
}
使用递归来用二分查找法实现查找 :
#include<stdio.h>
int fun(int buf[10],int left,int right,int key)
{
int mid;
while(left<right)
{
mid = (left+right)/2;
if(key<buf[mid])
{
return fun(buf,left,mid-1,key);
}
else if(key>buf[mid])
{
return fun(buf,mid+1,right,key);
}
else if(key==buf[mid])
{
return mid;
}
}
}
void main()
{
int buf[10] = {1,2,3,4,5,6,7,8,9};
int left=0,right=8;
int key = 2;
printf("第%d个",fun(buf,left,right,key)+1);
}
C语言结构体的实现 :
#include<stdio.h>
//定义人的类型:人的信息(姓名,性别,年龄,身高,ID)
struct people
{
//性别:
char sex;
//ID
int id;
//姓名:
char name[10];
//身高:
unsigned short height;
};
//__attribute__((packed));
//学生结构
struct student
{
//属性:结构体
struct people msg;
//属性:普通
int c;
};
void main()
{
//定义变量: 类型 变量名;
int score = 100;
struct people chh = {'m',12,"chh",178};//按people类型来分配空间
//引用元素:通过名字来引用
//printf("%d\n",score);
printf("%c %d %s %d",chh.sex,chh.id,chh.name,chh.height);
printf("\n%d\n",sizeof(chh));
//定义结构体变量:分配空间
struct student chh2 = {{'m',180601,"chh",178},99};
//引用成员:变量名.属性
printf("性别:%c ID:%d 姓名:%s 身高:%d 普通:%d\n",chh2.msg.sex,chh2.msg.id,chh2.msg.name,chh2.msg.height,chh2.c);
}
习题:
1、打印所有学生信息
2、查找分类>90以上的学生信息
3、打印最高分学生信息(监哨值法)
4、查找学生分数高于平均的学生信息
#include<stdio.h>
/*
* 结构体
*/
struct student
{
//姓名:
char name[100];
//性别:
char sex;
//成绩:
int score;
};
void main()
{
//定义数组:类型 数组名[长度];
struct student e[44]={{"lm",'m',64},\
{"tzw",'m',34},\
{"lxw",'w',76},\
{"dls",'w',100},\
{"chh",'m',95}\
};
//分配空间:
printf("%d\n",sizeof(e));//长度
//引用数组的元素:下标法
int i=0,temp;
for(i=0;i<5;i++)
{
printf("姓名:%s 性别:%c 分数:%d\n",e[i].name,e[i].sex,e[i].score);
}
//求大于90的
for(i=0;i<5;i++)
{
if((e[i].score)>90)
{
printf("%s大于90分:%d\n",e[i].name,e[i].score);
}
}
//求最高分
for(i=0;i<4;i++)
{
temp = e[i].score;
if(temp<(e[i+1].score))
{
temp = e[i+1].score;
}
}
printf("最高分是%d\n",temp);
//查找dls是否存在
char num[5] = "chs";
for(i=0;i<5;i++)
{
if(strcmp(e[i].name,num)==0)
{
printf("存在");
break;
}
else
{
printf("不存在");
}
}
int x = 0,j;
for(x=0;x<5;x++)
{
j = x;
temp = e[x].score;
if(e[j].score<e[j-1].score)
{
while(j>0 && temp<e[j-1].score)
{
e[j].score=e[j-1].score;
j--;
}
e[j].score=temp;
}
}
//求大于平均分的所有分数
for(x=0;x<5;x++)
{
printf("%d\n\n",e[x].score);
}
int y=0,z=0,w=0;
for(y=0;y<5;y++)
{
z = z + e[y].score;
}
w = z/5;
printf("平均分:%d\n",w);
for(y=0;y<5;y++)
{
if((e[y].score)>=w)
{
printf("大于或等于%d的有%d\n",w,e[y].score);
}
}
}
习题 :
用二分查找来实现对结构体数组元素的查找(分数)。