C:结构体
结构体
构造类型:就是有基本的类型组成的
1.结构体 结构体是一种自定义的数据类型 和 int float 是一样的都可以定义变量
数组 只能存放一种类型的容器
结构体 可以存放多种数据类型 相对于数组更加的完整
2.一个结构体可以被作为另一个结构体中的普通变量
3.结构体的声明(数据类型的声明)
/* struct 结构体名 {
char name[20];
int age; //结构体成员 结构体成员之间是要用分号隔开 在结构体内部定义变量的时候仅仅是声明,不能赋值
}; //分号是结构体声明的结束标示符,在声明的时候不能省略
*/
声明一个结构体变量(变量的声明)
//定义一个结构体变量
struct student stu1 ={"lee", 18,'m',90};
struct student{//学生的结构体 char name[20]; int age; // char stuTele[11]; char gender;//性别 float score; }; struct point{//点的结构体 float x;//横坐标 float y;//纵坐标 }; struct rect{//长方形结构体 float width;//宽度 float height;//长度 float x;//x坐标 float y;//y坐标 }; struct round{//圆圈 Point p;//一个结构体可以被作为另一个结构体中的普通变量 float r; }; struct cube{//定义一个立方体 float leight;//长 float width;//宽度 float height;//高度 }; int main(int argc, const char * argv[]) {//main() 上面的都是 全局变量 //结构体类型 struct + 结构体名 //定义一个结构体变量 struct student stu1 = {"lee", 18,'m',90}; struct point p1 = {23, 12.25}; struct rect r1 = {23,34}; struct round round1 = { {12.5,15.6}, 12.5};//这里要注意一下 struct cube cube1 = {12.5,3.4,23.5}; }
//给结构体的类型重命名 typedef
typedef struct student Student;
// 结构体重命名的第二种形式 typedef struct data{ int year; int mounth; int day; }Day;//直接在定义的时候就重命名了 新起的名字与重命名的是等同的 都可以用 Day d1 = {2015,07,31};// 我们使用重命名的名字进行定义变量 Student stu1 = {"lee", 18,'m',90}; // 结构体成员的访问 结构体变量.成员变量名 //获取stu 的姓名,性别,年龄,分数 //给字符串赋值的时候要用到 strcpy()函数 strcpy(stu1.name, "Kitty");//给stud1的姓名改为kitty printf("%s \n",stu1.name); stu1.age; stu1.name; stu1.gender; stu1.score;
//获取stu1的基本信息; 输出其信息 //结构体的访问是通过 变量名.成员变量名 printf("name = %s age = %d gender = %c score = %.2f",stu1.name,stu1.age,stu1.gender,stu1.score);
struct point p ={23.3,45.7}; //赋值的第一种方式 单个成员逐个赋值 p.x = 12; p.y = 13; //赋值的第二种方式 整体结构体赋值 struct point p1 = {120,23}; p = p1; printf("%.2f %.2f \n",p.x,p.y);
//对于整体赋值的小技巧 数组作为一个结构体的成员时,就可以直接给数组赋值,对比之前数组是不能直接赋值的
//对于整体赋值的小技巧 数组作为一个结构体的成员时,就可以直接给数组赋值,对比之前数组是不能直接赋值的 printf("%.2f %.2f \n",p.x,p.y); printf("%.2f %.2f \n",p.x,p.y);//语句要写在函数的内部 //赋值技巧 struct one{ int a[10]; int num; }; //数组作为结构体成员变量时,可以通过结构体的整体赋值为数组的每个元素赋值 struct one s1 ={{1,2},3}; struct one s2 ={{12,13},3}; s1 = s2; for (int i = 0; i < 2; i++) { printf("%d \t",s1.a[i]); }
minAgePer = p1.age > p2.age ? p1 : p2;//这里是保存的是最大年龄的人的整体信息
minAgePer = minAgePer.age > p3.age ? minAgePer : p3;
下午笔记
struct teachr{ char name[20];//分号隔开 char gender; int age; // float height; }; //定义一个有5个元素的结构体数组 struct teachr Tea[5] ={//存有5个结构体的数组 结构体数组 {"AA",'m',22},//结构体数组元素 以逗号 隔开 {"邓超",'m',19}, {"王大治",'m',14}, {"陈姐",'w',12}, {"XXX",'w',21},//这里的逗号写不写无所谓 }; int b = Tea[3].age; struct teachr tea1 = Tea[0]; for (int i = 0; i < 5; i++) { printf("name is %s ,age is %d, sex is %c \n",Tea[i].name,Tea[i].age,Tea[i].gender); }
结构体的内存空间:结构体的内存对齐方式--------(结构体所占内存空间大小 是以成员中最大数据类型为基本单位分配的)
*****
struct test{ char m[10];//如果把这一行放最后面 打印为 16 double a;//double 8个字节 float b;// int 、float 4个字节 //为了节省存储空间我们把定义的时候把所占内存最大的放最上面 // char m[10]; double a; float a; 顺序不同的放看结果 }; printf("%lu \n",sizeof(struct test));
分配的空间 前面的必须是后面的整数倍
实战:
1.创建一个 Size 结构体,包含 width,height 两个变量。 并写以下函数: 函数 1,判断两个 size 是否等宽。 函数 2,判断两个 size 是否在等高。 函数 3,判断两个 size 是否相等 2.创建一个 Point 结构体,包含 x,y 两个变量。 并写以下函数: 函数 1,判断两个点是否在一条水平线上。 函数 2,判断两个点是否在一条垂直线上。 函数 3,判断两个点是否相等 3.某班有 5 个学生,三门课。分别编写 3 个函数实现以下要求: (1) 求各门课的平均分; (2) 找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩; (3) 找出三门课平均成绩在 85-90 分的学生,并输出其学号和姓名 4.创建一个Rect结构体,包含origin,size两个变量。其中origin是Point类型的,size是Size类型的。 并写以下函数: 函数1,判断两个Rect是否相交。 函数2,判断两个Rect是否包含某个Point。 函数3,判断一个Rect是否在另外一个Rect中。 ====== 耶稣有13个门徒, 循环开始报数, 报道3的人去死, 最后存活的就是叛徒,找到叛徒的原来位置 有A,B,C,D四个候选人, 有n个人对其进行投票, 按票数从高到低进行输出.