C程序设计第9章自定义数据类型

上传人:工**** 文档编号:568230573 上传时间:2024-07-23 格式:PPT 页数:22 大小:352KB
返回 下载 相关 举报
C程序设计第9章自定义数据类型_第1页
第1页 / 共22页
C程序设计第9章自定义数据类型_第2页
第2页 / 共22页
C程序设计第9章自定义数据类型_第3页
第3页 / 共22页
C程序设计第9章自定义数据类型_第4页
第4页 / 共22页
C程序设计第9章自定义数据类型_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《C程序设计第9章自定义数据类型》由会员分享,可在线阅读,更多相关《C程序设计第9章自定义数据类型(22页珍藏版)》请在金锄头文库上搜索。

1、C程序设计第9章 自定义数据类型主讲教师:主讲教师: 鲁鲁 萍萍西安建筑科技大学西安建筑科技大学 理学院理学院1第9章 自定义数据类型小小 结结习习 题题结构体变量结构体数组结构体与指针指针与链表共用体枚举2结构体类型的定义结构体类型的定义例例1 1 学生信息学生信息:学号:学号, ,姓名姓名, ,成绩成绩, ,成绩成绩, ,成绩成绩, ,平均成绩平均成绩要求计算平均成绩,并输出学生的学号,姓名和平均成绩要求计算平均成绩,并输出学生的学号,姓名和平均成绩 问题:学生信息包含不同类型的数据问题:学生信息包含不同类型的数据例例2 2 对一个班的若干学生进行管理,实现插入新生信息和删除转对一个班的若

2、干学生进行管理,实现插入新生信息和删除转学学生信息的功能。学学生信息的功能。 问题:新数据无法和已有数据连续存储问题:新数据无法和已有数据连续存储 结构体结构体 链表链表3结构体类型的定义结构体类型的定义例例1 1学生信息学生信息:学号:学号, ,姓名姓名, ,成绩成绩, ,成绩成绩, ,成绩成绩, ,平均成绩平均成绩要求计算平均成绩,并输出学生的学号,姓名和平均成绩要求计算平均成绩,并输出学生的学号,姓名和平均成绩struct studentint num;char name20;float score1;float score2;float score3;float aver;结构体类型:

3、结构体类型:不同类型的数据的有序集合不同类型的数据的有序集合 struct struct 类型名称类型名称 成员表列成员表列 ;结构体变量:结构体变量:用结构体类型说明的变量用结构体类型说明的变量(定义结构体(定义结构体类型类型不分配内存不分配内存单元!定义结构体单元!定义结构体变量变量时分配时分配存储单元)存储单元)/定义个结构体变量定义个结构体变量struct student stu1,stu2; struct student stu3; /定义定义3个元素的结构体数组个元素的结构体数组 4结构体变量的初始化结构体变量的初始化定义时初始化:将各元素初值放在定义时初始化:将各元素初值放在“

4、”里赋值给变量。里赋值给变量。例:例: struct student int num; char name20; float score1; float score2; float score3; float aver; stu3=001,zhang3,80,88,75, 002,li4,90,83,84, 003,wang5,50,62,65;可以这样定义结构体变量可以这样定义结构体变量5001“zhang3”808875002“li4”908384stustu1 1结构体变量的定义结构体变量的定义struct studentint num;char name20;float score1;

5、float score2;float score3;float aver; stu1,stu2;存储:存储:(1)(1)结构体的所有成员各自占用不结构体的所有成员各自占用不同的内存单元同的内存单元(2)(2)一共一共占用多少字节存储单元?占用多少字节存储单元? sizeof( struct student)stu3;stustu2 2stu0stu1stu2int numchar name20float score1float score2float score3float aver38字节字节38字节字节38字节字节int numchar name20float score1float sc

6、ore2float score3float aver6 for(i=0;i3;i+) aver= score1+ score2+ score3; aver /=3; 结构体结构体 变量引用变量引用 例例11-111-1要求要求计算平均成绩计算平均成绩,并输出学生的学号,姓名和平均成绩,并输出学生的学号,姓名和平均成绩 struct student int num; char name20; float score1; float score2; float score3; float aver; stu3=001,zhang3,80,88,75, 002,li4,90,83,84, 003,w

7、ang5,50,62,65;stui. stui. stui. stui. stui. 成员的引用方式:结构体变量名成员的引用方式:结构体变量名. 成员名成员名001“zhang3”808875002“li4”908384stustu00stustu11 numname20score1score2score3avernumname20score1score2score3aver7输出学生的所有信息输出学生的所有信息 printf(”%d,%s,%f,%f,%f,%fn”,stud1); 不能不能对结构体变量对结构体变量整体输入输出整体输入输出,只能对,只能对各个成员分别输入输出各个成员分别输入

8、输出printf(”%d,%s,%f,%f,%f,%fn”,stud1.num, stu1.name, stu1.score1, stu1.score2, stu1.score3, stu1.aver);( )结构体变量引用结构体变量引用 A0901A0901:学生信息:学号:学生信息:学号, ,姓名姓名, ,成绩成绩, ,成绩成绩, ,成绩成绩, ,平均成绩平均成绩要求计算平均成绩,并要求计算平均成绩,并输出学生的学号,姓名和平均成绩输出学生的学号,姓名和平均成绩 for(i=0;i3;i+) printf(%5d%20s%8.2fn,stui.num,stui.name,stui.aver

9、);8结构体例题结构体例题A0901A0901 :#includestruct studentint num; char name20; float score1; float score2; float score3;float aver;void main() struct student stu3=001,zhang3,80,88,75, 002,li4,90,83,84, 003,wang5,50,62,65; int i; for(i=0;i3;i+) stui.aver=stui.score1+stui.score2+stui.score3; stui.aver /=3; for(

10、i=0;i3;i+) printf(%5d%20s%8.2fn,stui.num,stui.name,stui.aver);9指向结构体变量的指针指向结构体变量的指针A0901A0901 :#includestruct studentint num; char name20; float score1; float score2; float score3;float aver;stu=001,zhang3,80,88,75; struct student *p=&stu;stu. aver=stu. score1+ stu.score2+ stu.score3;stu. aver /=3;p

11、rintf(%5d%20s%8.2fn, stu.num, stu.name, stu.aver);001“zhang3”808875Pp-p-p-p-p-(*p).(*p).(*p).1 1、结构体类指针变量的定义:、结构体类指针变量的定义:结构体类型名称结构体类型名称 * *指针变量名指针变量名2 2、通过指针变量引用成员:、通过指针变量引用成员: 1) 1) 结构体类指针变量名结构体类指针变量名-成员名成员名 (常用)(常用) 2) (*2) (*结构体类指针变量名结构体类指针变量名).).成员名成员名10指向结构体数组的指针指向结构体数组的指针A0901A0901 :#includes

12、truct studentint num; char name20; float score1; float score2; float score3;float aver; stu3=001,zhang3,80,88,75,002,li4,90,83,84, 003,wang5,50,62,65;struct stud *p=stu;for(p=stu;paver=p-score1+p-score2+p-score3; p-aver /=3;for(p=stu;pnum, p-name, p-aver);848390“li4”002758880“zhang3”001stu0stu1stu2P

13、p+ 指向数组中指向数组中的下一个元素的下一个元素11用指针构成链表用指针构成链表81.3758880“zhang3”00100285.7848390“li4”59656250wang5003指针指针指针指针指针指针1249 1356 1475新新 增加增加 一个学生?一个学生?数组不能动态定义!新增信息存储单元不连续数组不能动态定义!新增信息存储单元不连续每个结构中的最后一个是指针,每个结构中的最后一个是指针,指向下一个节点的首地址,形成链式结构指向下一个节点的首地址,形成链式结构struct student int num; char name20; float score1; float

14、 score2; float score3; float aver;struct student *next;不行!不行!链表:可以使物理上不连续的存储单元在逻辑链表:可以使物理上不连续的存储单元在逻辑上连续访问上连续访问12 构建链表构建链表A0902例例 建立如下链表,由建立如下链表,由3个学生数据的结点组成。输出个学生数据的结点组成。输出各结点中的数据,并计算学生成绩的平均值。各结点中的数据,并计算学生成绩的平均值。next00189.5 00290 00485nextnextstruct student int num; float score; struct student *nex

15、t;=NULL nexthead标记链表的结束标记链表的结束链表的起始链表的起始13构建链表构建链表struct student int num; float score; struct student *next;void main() struct student a,b,c,*head,*p; a.num=001; a.score=89.5; b.num=002; b.score=90; c.num=004; c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; while ( ) printf(“%d % f n

16、”,p-num,p-score); p=p-next; next nextnext nextheada b cP00189.50029000485NULLPPPp!=NULL14链表操作:插入、删除链表操作:插入、删除 nextheadnext00189.5 a00290 nextb00485next=NULLcnext00378 1. malloc 函数函数: 内存动态存储区中分配一个长度内存动态存储区中分配一个长度为为size的连续空间的连续空间2. free函数函数 释放空间释放空间/动态申请一个节点空间 struct student *d; int len=sizeof(struct

17、student); d=(struct student *) malloc(len);/为节点赋值 scanf(%d,&(d-num); scanf(%f,&(d-score);/将节点插入链表 d-next=b.next; b.next=d;/链表删除元素链表删除元素d b.next=d-next free(d); /释放空间释放空间d-15结构体数组练习结构体数组练习A0903:有10人投票,对3个候选人得票进行统计。每此输入一个候选人的名字,要求输出最后统计结果。【程序思路分析程序思路分析】 将输入的后选人的名字与结构体中的初始名字比较,若两者相等,则将该后选人的票数加1;投票人数通过循

18、环方式进行控制;有多少人就循环多少次,但每次只能投一个人的票。结构定义:struct person char name20; int count; pers3=Zhang,0,Wang,0,Li,0;16main() struct person char name20; int count; pers3=Zhang,0,Wang,0,Li,0; int i=0,j=0; char nam20; for (;i10;i+) /*控制投票人数*/ scanf(“%s”,nam); /*输入候选人姓名*/ for(j=0;j3;j+) /*控制候选人数*/ if(strcmp(nam,persj.n

19、ame)=0) persj.count+; printf(n); for(i=0;i3;i+) printf(%6s %d,persi.name,persi.count); 17结构体变量嵌套结构体变量嵌套struct clockstruct clock int hour, minute, second; int hour, minute, second;struct datestruct date int year, month, day; int year, month, day; struct clock time; struct clock time; today,nextday ;

20、today,nextday ;1. 1. 单独引用结构体变量的成员单独引用结构体变量的成员 today.year=2004; today.year=2004; today.time.second=15; today.time.second=15; 2. 2. 结构体变量作为一个整体引用结构体变量作为一个整体引用 nextday=today;nextday=today;成员也可以是一个结构变量。成员也可以是一个结构变量。18共用体共用体共用体类型定义共用体类型定义使几种不同类型的变量存放到使几种不同类型的变量存放到同一内存单元中,相互覆盖。同一内存单元中,相互覆盖。 union union 类型

21、名称类型名称 成员表列成员表列 ;变量定义:变量定义:方法同结构体方法同结构体变量引用变量引用 共用体变量名共用体变量名共用体变量名共用体变量名. .成员名称成员名称成员名称成员名称整形i变量i字符变量ch实f型f变f量f地址地址100010001000 union data int i; char ch; float f; ;共用体变量所占内存长度共用体变量所占内存长度等于最长的成员的长度等于最长的成员的长度a,b,c;例:例:a.i=1; a.ch=A; a.f=10.50; 完成上述赋值操作后,有效完成上述赋值操作后,有效的成员是的成员是a.fa.f19枚举类型枚举类型一、一、枚举类型的

22、定义 格式格式 : enum enum 枚举类型名称枚举类型名称 枚举类成员名枚举类成员名 例:例:enum weekdaysun,mon,tue,wed,thu,fri,sat;enum weekdaysun,mon,tue,wed,thu,fri,sat; 0 1 2 3 4 5 6 0 1 2 3 4 5 6枚举元素从数值枚举元素从数值0 0开始编号,按常量处理开始编号,按常量处理 例: main() enum weekdaysun,mon,tue,wed,thu,fri,sat; enum weekday today=mon; printf(“today=%d ,today); 运行结

23、果:运行结果: today=120小结自定义数据类型结构体: 结构体变量的引用结构体数组用指针访问结构体构建链表共用体枚举struct studentint num;char name20;float score1;float score2;float score3;float aver;stu,s3;next00189.5 00290 00485nextnext21习 题B0901(习题9.1) 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年的问题B0902 (习题9.5)有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求计算每个学生的平均成绩,并输出平均分最高的学生的所有信息。(该程序可扩展为对任意一个班的学生) 22

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号