第10章--结构和联合ppt课件.ppt

上传人:春哥&#****71; 文档编号:16978306 上传时间:2022-05-20 格式:PPT 页数:36 大小:960.50KB
返回 下载 相关 举报
第10章--结构和联合ppt课件.ppt_第1页
第1页 / 共36页
第10章--结构和联合ppt课件.ppt_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《第10章--结构和联合ppt课件.ppt》由会员分享,可在线阅读,更多相关《第10章--结构和联合ppt课件.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第10章-结构和联合本章将主要介绍C语言中的构造数据类型:结构体、联合以及用户自定义类型等。知识点结构体的定义、变量的说明和引用联合定义、变量的说明和引用10.1结构的说明与引用10.2结构数组的声明、引用和初始化10.3联合10.4应用程序举例10.5常见错误解析10.6本章小结“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。定义一个结构的一般形式为:struct 结构名 成员表列;成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符 成员名;例如: struct stu int

2、 num; char name20; char sex; float score; 在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。先定义结构,再说明结构变量。先定义结构,再说明结构变量。如:struct stu int num; char name20; char sex; float score; ; struct stu student1, student 2;在定义结构类型的同时说明结构变量。在定义结构类型的同时说明结构变量。例如:struct stu

3、int num; char name20; char sex; float score; student1, student2;直接说明结构变量。直接说明结构变量。例如:struct int num; char name20; char sex; float score; student1, student2;这种形式的说明的一般形式为:struct成员表列变量名表列;成员也可以又是一个结构,即构成了嵌套的结构。,下图给出了另一个数据结构。按图可给出以下结构定义:struct date int month; int day; int year; ;Struct int num; char na

4、me20; char sex; struct date birthday; float score; student1, student2;首先定义一个结构date,由month(月)、day(日)、year(年) 三个成员组成。 在定义并说明变量 student1 和 student2 时,其中的成员birthday被说明为data结构类型。成员名可与程序中其它变量同名,互不干扰。引用时应遵循以下规则:(1)不能将一个结构体变量作为一个整体进行输入和输出。只能对结构体变量中的各个成员分别进行输入和输出。例如,已定义student1和student2为结构体变量并且它们已有值。不能这样引用:p

5、rintf(”%ld,%s,%c,%d,%f”,student1); 也不能用以下语句整体读入结构体变量,如:scanf(”%ld,%s,%c,%d,%d”,&student1); 但可以通过赋值语句,把一个结构体变量的值赋给同类型的结构体变量中。例如:student2=student1;则student2和student1具有相同的内容。引用结构体变量中成员的方式为:结构体变量名.成员名例如:student1.num 即第一个人的学号student2.sex 即第二个人的性别如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。只能对最低级的成员进行赋值、存取以及运算。例如:可以对变量

6、的成员赋值,例如:student1.num=200201001(2)对结构体变量的成员可以像普通变量一样进行各种运算。例如:student2.score=student1.score;sum=student1.score+student2.score;student1.age+;由于“.”运算符的优先级最高,因此student1.age+是对student1.age进行自加运算,而不是先对age进行自加运算。(3)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如:scanf(”%ld”,&sl.num); (输入student1.num的值)printf(”%o”,&student

7、1); (输出student1的首地址)结构体变量的地址主要用于作函数参数,传递结构体的地址。(4)结构体变量的初始化和其他类型变量一样,对结构体变量可以在定义时指定初始值。例如:struct stu long num;char name15;char sex;int age;int score;student1=200201001, ”zhangsan”,M,18,86;经过初始化后,student1.num=200201001student1.name=”zhangsan”student1.sex=Mstudent1.age=18student1.score=86例例1用输入语句或赋值语句

8、来完成给结构变量赋值并输出其值。#include stdio.h int main() struct stu int num; char *name; char sex; float score; student1, student2; student1.num=102; student1.name=Zhang ping; printf(input sex and scoren); scanf(%c %f,&student1.sex,&student1.score); student2=student1; printf(Number=%dnName=%sn,student2.num,stude

9、nt2.name);printf(Sex=%cnScore=%fn,student2.sex,student2.score); return 0;结构数组的每一个元素都是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。例如:struct stu int num; char *name; char sex; float score;student5;定义了一个结构数组student,共有5个元素,student 0student 4。每个数组元素都具有struct stu的结构形式。对结构数组可以作初始化赋

10、值。例如:struct stu int num; char *name; char sex; float score; student 5= 101,Li miao,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58; 当对全部元素作初始化赋值时,也可不给出数组长度。【例例2】计算学生的平均成绩和不及格的人数。#include stdio.hstruct stu int num; char *name; char sex; float score;student 5=

11、101,Li miao,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58, ;int main() int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=student i.score; if(student i.score60) c+=1; printf(s=%.2fn,s); ave=s/5;printf(average=%.2fncount=%dn,ave,c);return 0;【例例3】建立同学通讯录#includestdi

12、o.h#define NUM 3struct AddressBook char name20; char phone10;int main() struct AddressBook ClassMateNUM; int i; for(i=0;iNUM;i+) printf(input name:n); gets(ClassMatei.name); printf(input phone:n); gets(ClassMatei.phone); printf(nametttphonenn); for(i=0;i符号, 此时联合访问成员可表示成: 联合名-成员名。联合也是一种新的数据类型, 它是一种特殊

13、形式的变量。 联合变量定义与结构十分相似。其形式为: union 联合名 成员表 ; 成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名 成员名的命名应符合标识符的规定。 例如: 定义一个联合变量“data”。 union data char a;int b;float c;该共用体的名称为data,该共用体中有三个成员,分别为a、b、c。它们占用同一个起始地址的存储空间,内存长度等于最长的成员的长度。需要注意的是:联合定义之后,即可进行联合变量说明,被说明为data类型的变量,可以存放字符型量a或整型量b或存放浮点型量c。要么赋予字符型量,要么赋予整型量,要么赋予浮点型量,不能把3

14、者同时赋予它。 例如: Struct int age; char *addr; union int i; char *ch; x; y10; 若要访问结构变量y1中联合x的成员i, 可以写成: y1.x.i; 若要访问结构变量y2中联合x的字符串指针ch的第一个字符可写成: *y2.x.ch; 若写成y2.x.*ch;是错误的。2、联合变量的说明 联合变量的说明和结构变量的说明方式相同, 也有三种形式。即先定义,再说明、定义同时说明和直接说明。以联合变量department为例,说明如下: union department int grade; char office; ; union dep

15、artment a,b; /*说明a,b为department类型*/ 或者: union department int grade; char office; a,b; /*同时说明a,b为department类型*/或者: union int grade; char office; a,b /*直接说明a,b为department类型*/ 经说明后的a,b变量均为department类型。a,b变量的长度应等于 department 的成员中最长的长度, 即等于 office数组的长度,共10个字节。a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。 对联合变量

16、的赋值、使用都只能是对变量的成员进行。 联合变量的成员表示为: 联合变量名.成员名 例如,a被说明为department类型的变量之后,可使用 a. grade或a.office 。不允许只用联合变量名作赋值或其它操作。也不允许对联合变量作初始化赋值,赋值只能在程序中进行一个联合变量, 每次只能赋予一个成员值。一个联合变量的值就是联合变员的某一个成员值。【例】设有一个教师与学生通用的表格,教师数据有姓名,年龄,身份,教研室四项。学生有姓名,年龄, 身份,班级四项。编程输入人员数据, 再以表格输出。 #include#define N 3int main() struct char name15

17、; int age; char status; union int grade; char office20; depa; body3; int i; for(i=0;iN;i+) printf(input name:n);/*提示语*/ gets(bodyi.name); /*gets函数接收带空格的姓名*/ printf(input age:n); scanf(%d,&bodyi.age); getchar(); /*吸收上一句输入的回车符*/ printf(input status(s or t) :n); bodyi. status=getchar(); if( bodyi. stat

18、us=s) getchar(); /*吸收上一句输入的回车符*/ printf(input grade:n); scanf(%d,&bodyi.depa.grade); getchar(); /*吸收上一句输入的回车符*/ else getchar(); /*吸收上一句输入的回车符*/ printf(input office:n); gets(bodyi.depa.office); printf(namettage status grade/officen); for(i=0;iN;i+) if(bodyi.status=s) printf(%15st%3d%3c%20dn,bodyi.nam

19、e,bodyi.age,bodyi.status,bodyi.depa.grade);/*对齐输出数据*/ else printf(%15st%3d%3c%20sn,bodyi.name,bodyi.age,bodyi.status,bodyi.depa.office); /*对齐输出数据*/ return 0;在处理结构体问题时经常涉及字符或字符串的输入,这时要注意:scanf()函数用%s输入字符串遇空格即结束,因此输入带空格的字符串可改用gets函数。在输入字符类型数据时往往得到的是空白符(空格、回车等),甚至运行终止,因此常作相应处理,即在适当的地方增加getchar();空输入语句,

20、以消除缓冲区中的空白符。语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。typedef定义的一般形式为:typedef 原类型名 新类型名 其中原类型名中含有定义部分,新类型名一般用大写表示,以便于区别。有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。例如,有整型量a,b,其说明如下:int a,b;int的完整写法为integer,为了增加程序的可读性,可把整型说明符用typedef定义为:typedef int

21、INTEGER这以后就可用INTEGER来代替int作整型变量的类型说明了。 例如:INTEGER a,b;它等效于:int a,b;例如:typedef char NAME20; 表示NAME是字符数组类型,数组长度为20。然后可用NAME 说明变量,如:NAME a1,a2,s1,s2;完全等效于:char a120,a220,s120,s220又如: typedef struct stu char name20; int age; char sex; STU;定义STU表示stu的结构类型,然后可用STU来说明结构变量:STU body1,body2;10.4应用程序举例应用程序举例【例

22、5】一个公司有10名员工,每个员工的数据包括职工号、姓名、生日和工资。请使用结构体表示员工的信息,并用结构体数组来存所有员工的数据。要求输入10名员工的信息,计算平均工资,并输出工资最高的员工的数据。然后对上述的员工数据数组按工资从大到小排序,并输出排序后各员工的信息。#include #define N 3 /*员工个数N在下列各个函数内的数值都是10,是不变的。*/float avesalary; struct stint num;char name20;char birth20;float salary; ;void input(struct st a) /*输入所有员工信息*/int

23、i;for(i=0;iN;i+) printf(职工号,姓名,出生日期,工资:n); scanf(%d%s%s%f,&ai.num,ai.name,&ai.birth,&ai.salary);void aves(struct st b) /*求出所有员工的平均工资*/ int i; float total=0; for(i=0;iN;i+)total = total +bi.salary; avesalary= total /N;void sort(struct st c) /*按员工工资从高到低进行排序*/ int i,j;struct st t;for(i=0;iN-1;i+) for(j

24、=0;jN-1-i;j+) if(cj.salarycj+1.salary) t=cj;cj=cj+1;cj+1=t;void outputmax(struct st d) /*输出最高工资的员工信息*/ printf(最高工资的员工信息:职工号%d,姓名%s,生日%s,工资%.2fn,d0.num,d0.name,d0.birth,d0.salary); void outputall(struct st e) /*输出所有员工信息*/ int i;for(i=0;iN;i+) printf(职工号%d,姓名%s,生日%s,工资%.2fn,ei.num,ei.name,ei.birth,ei.

25、salary);int main() struct st sN;input(s); printf(n); aves(s); sort(s); printf(平均工资为:%.2fn,avesalary); outputmax(s); printf(n);printf(按工资排序后各员工信息:n); outputall(s); return 0;1结构体成员连续为字符串时,常常会出现一些问题,如下例:#include struct student char num6;char name10;int main() student stu1;scanf(%s%s,stu1.num,stu1.name)

26、;printf(%sn%sn,stu1.num,stu1.name);return 0;分析:char num6最多只能接受6个字符,而且必须包含字符串结束标志,这样字符串长度才满足要求,如果输入“100123回车”,字符串中就没有结束标志了,所以后面的字符也跟着输出了。解决方法:最长输入5个字符或改变字符数组长度。本章学习了C语言的用户自定义类型,包括结构体、联合(共用体),还学习了用户定义类型名的方法。本章学习的重点是结构体类型,在学习了结构体类型后,知道了联合类型与之相似和区别之处,掌握联合类型也就比较容易了。1.结构和联合有很多的相似之处,它们都由成员组成。成员可以具有不同的数据类型。成员的表示方法相同。都可用三种方式作变量说明。 2. 在结构中,各成员都占有自己的内存空间,它们是同时存在的。一个结构变量的总长度等于所有成员长度之和。在联合中,所有成员不能同时占用它的内存空间,它们不能同时存在。联合变量的长度等于最长的成员的长度。 3. 结构定义允许嵌套,结构中也可用联合作为成员,形成结构和联合的嵌套。4联合类型。从它与结构体的相似与区别着手,掌握类型的定义、变量的说明和引用,以及共用体的主要用途等。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁