《(1.8)--第8章 自定义类型C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《(1.8)--第8章 自定义类型C语言程序设计.ppt(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第8章章 自定义类型自定义类型1 1程序不仅用于数值计算,更广泛地用于处理非数值数据,甚至具有一定结构的非数值数据。例如:性别、月份、颜色,图书、学生、教室等。由一系列相同类型或不同类型的数据构成的数据集合,用于表示具有一定结构的复杂数据称为结构体类型。使用覆盖技术使几种不同类型的变量存放到同一段内存单元中互相覆盖以节省内存空间。这种结构在C语言中被称作“共用体”类型结构。枚举是用自然语言中含义清楚的单词表示变量取值的一种方法。这种方法会使程序更容易阅读和理解。用这种方法定义的类型称枚举类型。学习目标:21.理解结构体类型的含义3.了解共用体类型的定义及使用4.了解枚举类型的定义及使用2.掌
2、握结构体类型的定义及使用本章重点内容:结构体类型1共用体类型23枚举类型38.1结构体4 4结构体(struct)是由一系列具有相同或不同类型的数据构成的数据集合。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体是一些元素的集合,这些元素称为结构体的成员(member)。1.结构体类型结构体类型第一个成员第二个成员第三个成员第n个成员第 一 个 成 员第 二 个 成 员第 三 个 成 员第 n个 成 员结构体是从多个方面(成员)描述同一个体,一维数组是从同一个方面描述不同个体。性别年龄身高体重学号身高1身高2身高3身高4身高5结构体和数组对成员有不同表示方式。18.1结构
3、体5 52.结构体的定义与声明结构体的定义与声明struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,必须列出其所有成员;variable-list为此结构体声明的变量。structtagmember-listvariable-list;tag、variable-list至少要出现1个。以下为示例:structinta;charb;doublec;s1,s220;structSimple1inta;charb;doublec;typedefstructinta;charb;doublec;Simple2;structSimple1t1,t220;Simple
4、2u1,u220;8.1结构体6 63.结构体结构体变量的初始化与赋值变量的初始化与赋值typedefstructcharnum11charname7;charsex;floatscoreM;floattotal;Student;Students1,s2=1508100201,丁兆云,M,92,73,67,92,74,90,0;strcpy(s2.num,1508100201);strcpy(s2.name,丁兆云);s2.sex=M;s2.score0=92;s2.score1=73;s2.score2=67;s2.score4=74;s2.score5=90;s2.average=0;s2
5、=s1;允许相同类型的结构体变量整体赋值7 78.1结构体4.结构体应用:结构体应用:设计一种结构存储下列数据,根据设计一种结构存储下列数据,根据计算所得计算所得总分总分由大到小的顺序排序输出。由大到小的顺序排序输出。学号学号姓名姓名性性别C程程 体育体育英英语高数高数 近代史近代史导论总分分1508100201丁原博男9273679274901508100202马云男9275637675551508100203董明珠女718568716677typedefstructcharnum11charname7;charsex;floatscoreM;floattotal;Student;Stude
6、ntsN;(1)数据类型设计:数据类型设计:用结构体数组存储一个班级学生的信息用结构体数组存储一个班级学生的信息8 88.1结构体for(i=0;iN;i+)printf(输入学号:);gets(swi.num);printf(输入姓名:);gets(swi.name);printf(输入性别(MorF):);ch=getchar();if(ch=m|ch=M)swi.sex=M;elseswi.sex=F;swi.total=0;for(j=0;jM;j+)printf(输入成绩%d:,j+1);scanf(%f,&swi.scorej);swi.total+=swi.scorej;fflu
7、sh(stdin);(2)读入读入N名同学信息和名同学信息和M门功课成绩,并计算总分:门功课成绩,并计算总分:9 9(3)对)对n名同学根据总分由大到小排序:名同学根据总分由大到小排序:8.1结构体voidsort(students,intn)inti,j;Studenttemp;for(i=0;in-1;i+)for(j=0;jn-1-i;j+)if(sj.totalsj+1.total)temp=sj;sj=sj+1;sj+1=temp;/ifprintf(-n);printf(|名次|学号|姓名|性别|成绩1|成绩2|成绩3|成绩4|成绩5|成绩6|总分|n);printf(-n);fo
8、r(i=0;iN;i+)printf(|%4d|%10s,i+1,swi.num);printf(|%6s,swi.name);if(sw0.sex=M)printf(|男);elseprintf(|女);for(j=0;jM;j+)printf(|%5.1f,swi.scorej);printf(|%5.1f|n,swi.total);printf(-n);/for1010(4)对排序结果的输出)对排序结果的输出8.1结构体8.1结构体structDateintmonth;intday;intyear;typedefstructStudentintnum;charname20;charsex
9、;structDatebirthday;floatscore;student1,student2;表示结构体变量成员的一般形式是:结构变量名.成员名例如:student1.num、student2.sex、student1.birthday.month5.结构体的嵌套定义结构体的嵌套定义1111婚姻状况8.2共用体1212姓名姓名namname e性别性别sexsex年龄年龄ageage婚姻状况婚姻状况婚姻状况婚姻状况标记标记未婚未婚 已婚已婚离婚离婚配配偶偶子子女女年年 月月日日1.共用体类型定义共用体类型定义某工会组织为工会会员建立登记卡片包括如下信息:姓名性别年龄未婚已婚离婚婚况标记未婚
10、、已婚、离婚共用婚姻状况,婚姻状况因人而异只能是三者其中之一。113138.2共用体union 共用体名共用体名 成员表列;uniondatainta;floatb;charc;intfloatchar1000地址uniondatas1,s2;1.同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,不是同时存在和起作用。2.共用体变量的初始化(1)uniondatas1=s2;(2)uniondatas1=123;/初始化共用体为第一个成员(3)uniondatas2=.c=a;/指定初始化项目3.共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有
11、成员就失去作用。14148.2共用体structPersoncharname20;charsex;intage;unionintsingle;structcharspouseName20;intchild;married;structDatedivorcedDay;marrital;intmarryFlag;2.工会会员类型定义工会会员类型定义structDateintyear;intmonth;intday;15158.2共用体structPersonp3=郑亚文,M,29,1,1;p1=p0;strcpy(p1.name,李晨);p1.age=34;strcpy(p1.marrital.m
12、arried.spouseName,孙晓);p1.marrital.married.child=1;p1.marryFlag=2;p2=p1;p2.age=45;strcpy(p2.name,刘晓光);p2.marrital.divorcedDay.year=2016;p2.marrital.divorcedDay.month=11;p2.marrital.divorcedDay.day=11;p2.marryFlag=3;16168.2共用体printf(%d%6s,i+1,pi.name);if(pi.sex=M|pi.sex=m)printf(男);elseprintf(女);print
13、f(%2d,pi.age);printf(未婚n);printf(%d%6s,i+1,pi.name);if(pi.sex=M|pi.sex=m)printf(男);elseprintf(女);printf(“%2d配偶%s孩子数%2dn,pi.age,pi.marrital.married.spouseName,pi.marrital.married.child);printf(%d%6s,i+1,pi.name);if(pi.sex=M|pi.sex=m)printf(男);elseprintf(女);printf(%2d离婚%d年%d月%d日n,pi.age,pi.marrital.di
14、vorcedDay.year,pi.marrital.divorcedDay.month,pi.marrital.divorcedDay.day);17173.共用体与结构体的区别共用体与结构体的区别8.2共用体1.struct和union都由多个不同的数据成员组成,但在任一时刻,union中只有一个被选中的成员,而struct的所有成员都存在。2.在struct中,各成员有独立的内存空间。struct变量长度等于所有成员长度之和。在union中,所有成员共享一个存储长度最长的存储空间。union变量长度等于存储长度最长的成员长度。3.对于union成员赋值,将会重写其它成员。对于struct
15、的不同成员赋值互不影响的。dateyear monthdaymarritalsingle married divorcedDay1.枚举类型定义枚举类型定义8.3枚举类型1818枚举是一个被命名的整型常数的集合。例如:用Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday表示星期要比0,1,2,3,4,5,6更容易理解。enum枚举名标识符=整型常数,标识符=整型常数,标识符=整型常数;如果枚举没有初始化,即省掉“=整型常数”时,则从第一个标识符开始顺次赋给标识符0,1,2,.。但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确
16、定其值。允许多个枚举成员有相同的值。enumNumx1,x2,x3,x4;x1,x2,x3,x4的值分别为0,1,2,3。enumNumx1,x2=0,x3=50,x4;x1=0,x2=0,x3=50,x4=51enumNumx1,x2=0,x3,x4=0;x1=0,x2=0,x3=1,x4=08.3枚举类型19192.枚举类型变量的赋值和使用枚举类型变量的赋值和使用枚举类型既没有输入、输出格式控制符或也没有标准的输入输出函数,枚举类型变量的值不能直接输入或输出。enum枚举名标识符=整型常数,标识符=整型常数,标识符=整型常数枚举变量;enum枚举名 枚举变量;已知2016年3月1日是星期二
17、,输入当月任意日期,通过编程求解该天是星期几?枚举变量=标识符;枚举变量=(enum枚举名)整型常数;8.3枚举类型2020includevoidmain()enumweekdaySunday=0,Monday,Tuesday,Wednesday,Thursday,Friday,Saturdayweek;intday;printf(todayis2016-03-);scanf(%d,&day);week=(enumweekday)(day+1)%7);switch(week)case0:printf(2016-03-%disSundayn,day);break;case1:printf(2016-03-%disMondayn,day);break;case2:printf(2016-03-%disTuesdayn,day);break;case3:printf(2016-03-%disWednesdayn,day);break;case4:printf(2016-03-%disThursdayn,day);break;case5:printf(2016-03-%disFridayn,day);break;case6:printf(2016-03-%disSaturdayn,day);break;整形常数转换为枚举类型枚举标识符的顺序号常数