《自定义数据类型》由会员分享,可在线阅读,更多相关《自定义数据类型(38页珍藏版)》请在金锄头文库上搜索。
1、第10章 自定义数据类型,回顾,编译预处理 不带参数的宏定义 带参数的宏定义,教学目标,理解为什么使用结构体 定义结构体 声明结构体变量 访问结构体成员 掌握结构体作为函数参数的用法 了解共用体 了解自定义数据类型,思考,在程序里表示一个人(姓名、年龄、性别、成绩),怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,结构体简介,I. 使用数组,解决方案:,score,num,sex,name,不能建立数组间的关系,II. 使用多维数组,C 语言不允许一个数组包含多种数据类型,III. 使用结构体,C 语言引入了称为结构体的数据存储方式,“结构体” 是一种构造数据类型,它是由若
2、干数据项组合而成的复杂数据对象,这些数据项称为结构体的成员。,定义结构体2-1,struct structurename datatype variable1;datatype variable2;. ;,结构体成员,;,结构体名,struct,student,int num;,char name20;,char sex;,定义结构体,float score;,C 语言中的有效数据类型,定义结构体2-2,struct student int num;char name20;char sex;float score; ;,num,name,sex,student,结构体定义并不预留内存,结构体定
3、义放置在程序的开始部分,位于头文件声明之后,score,结构体定义仅描述了一个结构体的形式。如果要在程序里使用结构体,需要声明结构体变量。,声明结构体变量,声明结构体变量,struct student int num;char name20;char sex;float score; ; struct student student1,student2;,I.先定义结构体,再声明结构体变量,struct student int num;char name20;char sex;float score; student1,student2;,II.在定义结构体类型的同时声明结构体变量,struc
4、t int num;char name20;char sex;float score; student1,student2;,III. 直接声明结构体变量,声明一个类型为 student 结构体的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。,struct date int month;int day;int year; ;,嵌套结构体,structint num;char name20;char sex;struct date birthday;float score; student1,student2;,访问成员是通过成员的名字,称为“按名引用”。在程序中使用结构
5、中成员的方法为:结构体变量名.成员名 例如:student1.num、student2.sex、student1.birthday.month,struct student student3=3,“Yao Ming “,M,90.5;,结构体变量初始化,3,Yao Ming,M,赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构体成员数目少。,student3.num,student3.name,student3.sex,90.5,student3.score,student1.num=1; scanf(“%s“,结构体变量赋值,1,Zhang Zi Liang,M,用输入语
6、句或赋值语句来给结构体变量的各个成员赋值,78,78,student2 = student1;,1,Zhang Zi Liang,M,78,strcpy(student1.name,“ZhangSan“);,结构体变量,如果要将“zhang”改为“zhong”,只要将结构变量student1中的数组成员name下标为2的元素a改为o即可。可以使用下列语句:student1.name2 = o;/* 为结构变量中的数组成员的一个元素赋值 */,结构体变量,对结构变量的整体操作要对结构进行整体操作有很多限制,C语言中能够对结构进行整体操作的运算不多,只有赋值“=”和取地址“ /* 结构变量整体赋值
7、 */,结构体类型的引用,不能将一个结构变量作为一个整体直接访问。例如,已定义 student1 为结构变量并且已有值。不能这样引用: printf (“%s,%c,%d,%d,%dn“, student1); 如果成员本身又是一个结构类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。 只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构变量student1,可以这样访问各个成员:student1.namestudent1.sexstudent1.birthday.monthstudent1.birthday.daystudent1.birthday.year,问题描述
8、: 根据学员的成绩,输出不及格学员的详细信息。,使用结构体示例,#include struct studentint num;/学号char *name;/姓名char sex;/性别float score;/成绩; int main()static struct student stu1=1,“李亚鹏“,M,61; static struct student stu2=2,“周晶晶“,F,92.5; static struct student stu3=3,“姚光明“,M,59; printf(“不及格学员的名单如下:n“);if(stu1.score=60 ,不及格学员的名单如下:,3 姚
9、光明 M 59.00,1,李亚鹏,M,78,2,周晶晶,F,92,3,姚光明,M,59,struct stu *pstu; (*pstu).num 或者: pstu-num,结构体指针变量,一个指针当用来指向一个结构体时, 称之为结构体指针变量。 结构体指针变量中的值是所指向的结构体变量的首地址。 结构体指针变量声明的一般形式为:struct 结构体名 *结构体指针变量名 通过结构体指针可以访问该结构体变量的成员,一般形式为:(*结构体指针变量).成员名 或者结构体指针变量-成员名,#include struct studentint num;char *name;char sex;float
10、 score;stu=1,“张宾“,F,55,*pstu; int main() pstu= ,学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 Press any key to continue,struct student int num;char* name;char sex;float score; stu30;,结构体数组,元素为结构体类型的数组称为结构体数组。 在实际应用中,经常用结构体数组来表示具有相同数据结构体的一个群体。例如一个班的学员档案,一个公司的职工档案等。,定义了一个结
11、构体数组stu1,共有30个元素,stu0stu29。每个数组元素都具有struct student的结构体形式。,问题描述: 求学员的总成绩和平均成绩,并统计不及格人数。,结构体指针变量,struct studentint num; char *name;char sex; float score;stuN= 1,“李芳“,F,45,2,“于红“,F,62.5,3,“何万山“,M,92.5,4,“程亚丽“,M,87,5,“王明“,M,58; int main( )int i,count=0; float ave,sum=0;for(i=0;iN;i+) sum+=stui.score;if(
12、stui.scoreyear = 2000;p-month = 5;p-day = 22; ,int main() struct date d;d.year = 1999; d.month = 4; d.day = 23;printf(“%d,%d,%dn”, d.year, d.month, d.day);func( ,1999,4,23,2000,5,22,结构体成员作为函数参数,struct filmchar name25; /电影名char director25; /导演int duration; /片长; void display (char *, char *, int *); int main()struct film f1; printf(“nt 请输入电影的详细信息“);printf(“nn 请输入影片名:“);gets(f1.name);fflush(stdin);printf(“n 请输入导演姓名: “);gets(f1.director);fflush(stdin);printf(“n 请输入电影片长(分钟): “);scanf(“%d“, ,