结构体类型.ppt

上传人:sccc 文档编号:5313842 上传时间:2023-06-25 格式:PPT 页数:42 大小:871.02KB
返回 下载 相关 举报
结构体类型.ppt_第1页
第1页 / 共42页
结构体类型.ppt_第2页
第2页 / 共42页
结构体类型.ppt_第3页
第3页 / 共42页
结构体类型.ppt_第4页
第4页 / 共42页
结构体类型.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《结构体类型.ppt》由会员分享,可在线阅读,更多相关《结构体类型.ppt(42页珍藏版)》请在三一办公上搜索。

1、重庆电力高等专科学校,10.1 结构体类型,10.3 结构体指针,10.4 枚举类型,10.2 自定义类型,10.5 共用体,10.6 程序综合举例,10.7 上机实训,重庆电力高等专科学校,10.1 结构体类型10.1.1 结构体类型的用途理解结构体类型的意义并掌握结构体类型的用法,对进一步学习C+、Java等面向对象编程语言是有帮助的。考虑这样一个问题:定义a、b、c 三个变量存放三个人通讯信息。每个通讯信息含有:姓名、生日、电子邮箱和手机号这四项内容。具体情况如如下图所示:a、b、c三个变量每一个都包含了三个整型和三个字符串,重庆电力高等专科学校,再举一例:学生班级考试成绩排名次的问题。

2、定义一个数组:数组每个元素(一个学生)都包含一个学生的姓名(一个字符串)、学号(一个字符串)及各科成绩(若干个整数)。数组的结构如下图所示:从以上两个问题可知:每一个变量(或元素)都是由基本类型复合而成的多类型。C语言中允许用户在程序里自己构建程序所需要的这种类型由基本类型复合而成的类型,在C语言里称为结构体(structure)类型。,重庆电力高等专科学校,10.1.2结构体类型的构建及结构体变量的定义1.结构体类型的构建构建一个结构体类型的一般形式为:struct 类型名数据类型 成员名1;数据类型 成员名2;数据类型 成员名n;,注意:在“”后不要忘了写“;”,每个成员的数据类型可以是简

3、单数据类型或复杂类型。,重庆电力高等专科学校,【例10.1】构建通讯录问题所需要的结构体类型。struct info/*通讯录类型*/char name50;/*姓名*/int year;/*年*/int month;/*月*/int day;/*日*/char email100;/*电子邮箱*/char mobile_num12;/*手机号*/;这段代码构建了通讯录问题所需要的结构体类型,结构类型名为info。,重庆电力高等专科学校,【例10.2】构建学生成绩单问题所需要的结构体类型。struct student/*学生成绩类型*/char name30;/*姓名*/char num20;/

4、*学号*/int c_lang;/*C语言成绩*/int english;/*英语成绩*/int math;/*数学成绩*/;这段代码构建了通讯录问题所需要的结构体类型,类型名为student。,重庆电力高等专科学校,2结构体变量的定义结构体变量定义的一般形式:struct 类型名 变量名表列;注意:初学者在概念上必须认识清楚:结构体类型虽然由基本类型复合而成,但它也是一种类型,而不是一个变量实体。注意区别结构体类型和结构体变量。请比较:两个定义相比较得:struct info相当于int的地位,二者都是类型,只不过struct info是结构体类型,是一种复合类型,而int是基本类型。,重庆

5、电力高等专科学校,【例10.3】用例10.1所构建的struct info类型定义a、b、c三个变量,以备存储王晓明、李大伟和张欣欣三个好友的资料。struct info a;struct info b;struct info c;或:struct info a,b,c;【例10.4】用例10.2所构建的struct student类型定义数组soft1以备存储软件一班的所有学生的期末考试成绩。struct student soft130;,重庆电力高等专科学校,3构建结构体类型的同时定义结构体变量【例10.5】构建结构体类型struct info的同时定义struct info类型的变量a、

6、b和c。struct info char name50;int year;int month;int day;char email100;char mobile_num12;a,b,c;上面定义中的类型名“info”可以省略不写:,重庆电力高等专科学校,struct char name50;int year;int month;int day;char email100;char mobile_num12;a,b,c;,注意:,注意:虽然允许在定义结构体类型的同时定义结构体变量,但先定义结构体类型,再用结构体类型定义结构体变量,则更加规范一些;如果能把结构体类型定义在所有的函数之外,并放在文件

7、的开始处则更好;如果自定义类型较多,最好把它们集中放在一个头文件中。,重庆电力高等专科学校,4 结构体变量作为结构体类型的成员【例10.6】用新的方式构建例10.1构建的struct info类型。struct date int year;int month;int day;struct info char name50;struct date bith;char email100;char mobile_num12;结构体类型的成员不但可以是基本类型的变量,也可以是结构体类型变量。,重庆电力高等专科学校,【例10.7】用新的方式构建例10.2构建的struct student类型。struc

8、t student char name30;/*姓名*/char num20;/*学号*/struct/*定义结构体类型的同时定义结构体变量score*/int c_lang;/*C语言成绩*/int english;/*英语成绩*/int math;/*数学成绩*/score;注意:结构体类型的成员还可以是其所在的结构体类型的指针。这样就可以实现复杂的数据结构。,重庆电力高等专科学校,10.1.3 结构体变量的使用1结构体变量成员的引用结构体变量的成员需要通过分量运算符“.”来引用。引用格式:结构体变量.成员名【例10.8】给例10.3所定义的变量a赋值并输出:strcpy(a.name,王

9、晓明);a.year=1988;a.month=5;a.day=16;strcpy(a.email,);strcpy(a.mobile_num,19801020304);printf(姓名:%s 出生时期:%d年%d月%d日 e-mail:%s 手机号:%s,a.name,a.year,a.month,a.day,a.email,a.mobile_num);,重庆电力高等专科学校,【例10.9】为例10.4定义的soft1的数组的元素soft10赋值:strcpy(soft10.name,李文星);strcpy(soft10.num,0705231);soft10.c_lang=86;soft

10、10.english=72;soft10.math=93;如果结构体变量的成员又是一个结构体变量,则需要再加一级分量运算符来引用成员变量的成员变量。请看下例:【例10.10】用例10.6构建的结构体类型定义变量a并赋值。strcpy(a.name,王晓明);a.birth.year=1988;a.birth.month=5;a.birth.day=16;strcpy(a.email,);strcpy(a.mobile_num,19801020304);,重庆电力高等专科学校,2结构体变量之间的赋值结构体变量之间可以直接赋值,而不必用分量运算符一个一个地赋值。【例10.11】定义struct s

11、tudent类型的变量b,并把例10.10中里每个成员都赋了值的a变量的值赋给b变量。只需写成:struct student b;b=a;而不必像下面这样,为对应的成员之间一个一个地赋值:strcpy(b.name,a.name);b.birth.year=a.b.year;,重庆电力高等专科学校,3结构体变量的初始化有两种方式:用赋值语句逐一对结构体变量成员赋值(如例10.8-10.10)。在定义结构体变量的同时为结构体变量指定初始值。【例10.12】用例10.1和例10.6构建的struct info类型定义变量a,并初始化。例10.1构建:struct info a=王晓明,1988,5

12、,16,19801020304;例10.6构建:struct info a=王晓明,1988,5,16,19801020304;,重庆电力高等专科学校,4结构体数组的初始化【例10.13】用例10.7构建的struct student类型定义数组soft1并初始化:struct student soft130=李文星,0705231,86,72,93,王功名,0705215,75,84,79,刘建业,0705226,58,95,99.;或:struct student soft130=李文星,0705231,86,72,93,王功名,0705215,75,84,79,刘建业,0705226,5

13、8,95,99.;,重庆电力高等专科学校,10.1.4 结构体数组应用实例【例10.14】编程实现对候选人投票并统计票数的程序。具体要求:有三个候选人,程序运行时,用户要投哪个候选人的票,就输入哪个候选人的代号,程序最后统计并输出每个候选人的得票数。程序代码:#include struct cand/*定义候选人类型*/char name30;/*候选人姓名*/int cnt;/*候选人票数*/;,重庆电力高等专科学校,void main()/*三个候选人未投票之前票数都为0*/struct cand p3=张三,0,李四,0,王五,0;int i;/*投票次数循环变量*/int j;/*候选

14、人数组元素下标循环变量*/int n;/*投票人数*/int m;/*被赞成的候选人的代号*/printf(投票人数:);/*输入投票人数*/scanf(%d,重庆电力高等专科学校,printf(n(还有%d票未投)输入您要选的候选人的代号:,n-i);while(1)scanf(%d,重庆电力高等专科学校,程序运行结果(斜粗体表示用户输入文字):投票人数:101 张三 2 李四 3 王五(还有10票未投)输入您要选的候选人的代号:11 张三 2 李四 3 王五(还有9票未投)输入您要选的候选人的代号:21 张三 2 李四 3 王五(还有8票未投)输入您要选的候选人的代号:31 张三 2 李四

15、 3 王五(还有7票未投)输入您要选的候选人的代号:11 张三 2 李四 3 王五(还有6票未投)输入您要选的候选人的代号:21 张三 2 李四 3 王五(还有5票未投)输入您要选的候选人的代号:11 张三 2 李四 3 王五(还有4票未投)输入您要选的候选人的代号:11 张三 2 李四 3 王五,重庆电力高等专科学校,(还有3票未投)输入您要选的候选人的代号:21 张三 2 李四 3 王五(还有2票未投)输入您要选的候选人的代号:21 张三 2 李四 3 王五(还有1票未投)输入您要选的候选人的代号:2得票统计:张三:4票 李四:5票 王五:1票,重庆电力高等专科学校,10.2 自定义类型1

16、0.2.1 自定义类型的定义及使用C语言语法规定:可以用typedef关键字声明新的类型名来代替已有的类型名。例如:typedef int INTEGER;typedef float SINGLE;则可以用:INTEGER a;/*等价于int a;*/SINGLE f;/*等价于float f;*/注意:用typedef声明了新的类型名后,原有的类型名和新的类型名都可以使用。主要是为了照顾有其他编程语言背景的人对C语言的使用。,重庆电力高等专科学校,【例10.15】构建最多可以拥有250个字符的字符串类型。typedef char string250;string s;/*等价于char s

17、250;*/strcpy(s,C Language);【例10.16】把字符指针定义为字符串类型typedef char*string;string s1,s2;/*等价于char*s1,s2;*/s1=C Language;s2=s1;这样一来就使得自定义类型string更像C+和Java语言里的字符串类型,变量s则更像Java里的字符串对象引用变量。,重庆电力高等专科学校,10.2.2 自定义类型编程实例【例10.17】用户输入某班每个学生的姓名、学号及每个学生的每门课程的分数,程序输出成绩单。程序如下:#include#include#include typedef structint

18、c_lang;int english;int math;int sum;score;,重庆电力高等专科学校,10.3 结构体指针10.3.1 引用结构体指针指向的结构体变量的成员1结构体指针变量的定义结构体指针变量定义形式:struct 结构体类型名*变量,*变量,;2利用结构体指针引用指向的结构体变量的成员引用格式:结构体指针变量-成员或:(*结构体指针变量).成员,重庆电力高等专科学校,【例10.18】把例10.17的程序中的void output(stu s)函数的参数改为结构体指针的形式。原函数定义部分:void output(stu s)printf(%-8s%-8s%-8d%-8d

19、%-8d%-8dn,s.num,s.name,s.sc.c_lang,s.sc.english,s.sc.math,s.sc.sum);改为:void output(stu*p)printf(%-8s%-8s%-8d%-8d%-8d%-8dn,(*p).num,(*p).name,(*p).sc.c_lang,(*p).sc.english,(*p).sc.math,(*p).sc.sum);主调函数中调用语句部分:output(si);需改为:output(,重庆电力高等专科学校,【例10.19】显示俱乐部会员信息#define MALE 男#define FEMALE 女typedef c

20、har Sex3;typedef structchar name30;Sex sex;int age;Person;Person member=张伟,MALE,23,李壮,MALE,19,王霞,FEMALE,21;void main()Person*p;int cnt;cnt=sizeof(member)/sizeof(member0);for(p=member;pname,p-sex,p-age);,程序运行结果:张伟 男 23 李壮 男 19 王霞 女 21,重庆电力高等专科学校,10.3.2 通过结构体的指针成员实现链表的原理线性表:为了实现同一类型的若干个数据形成一个有序的集合,这种有

21、序的同类型数据集合在数据结构里被称作线性表。链表也是一种线性表,也就是说链表能实现数组所能实现的功能。下面的程序用以说明单向链表的原理。试着读这个程序,看一看链表的作用与数组是否相同。【例10.20】试读下面的程序,体会链表原理(建立链表、输出链表)。typedef struct PersonX char*name;struct PersonX*next;Person;#define NULL 0void create();void show(Person*p);Person a,b,c,d;,重庆电力高等专科学校,void main()create();show(,程序运行结果:张伟李壮王霞

22、,重庆电力高等专科学校,create()函数使得a、b和c构成以下关系:这个结构就是一个单向链表。在结点C前(王霞)插入赵海结点d。在create();与show(,重庆电力高等专科学校,产生的效果如下图所示:,重庆电力高等专科学校,删除第1个节点(指从0开始计数的第1个,即b结点):a.next=产生的效果如下图所示:,重庆电力高等专科学校,10.4 枚举类型 10.4.1 C语言枚举类型的语法规定枚举:就是将变量的值一一列出来,变量的值仅限于列举出来的范围内。1枚举类型的定义Enum 枚举类型名枚举常量1=整型常量,枚举常量2=整型常量,枚举常量n=整型常量;说明:整型常量是为枚举常量的序

23、号值,默认第一个为0,以后每个依次递增。,重庆电力高等专科学校,例如:enum week Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;定义了一个枚举类型week含7个枚举常量。SundaySaturday默认值依次为06。2枚举变量的定义Enum 枚举类型名 枚举变量名表例如:enum week workday;enum color c1,c2;3引用枚举类型应用下面通过程序实例来说明如何创建枚举类型,及如何指定枚举常量的值和使用枚举值。【例10.21】enum weekdaySUN,MON,TUE,WED,THU,FRI,

24、SAT;void main()enum weekday a,b;a=MON;b=FRI;printf(a=%d,b=%d,a,b);,程序运行结果:a=1,b=5,重庆电力高等专科学校,【例10.22】enum weekdaySUN,MON,TUE,WED,THU,FRI,SAT;void main()printf(%d%d%d%d%d%d%dn,SUN,MON,TUE,WED,THU,FRI,SAT);程序运行结果:0 1 2 3 4 5 6【例10.23】把例10.22中的enum weekday的定义改为:enum weekdaySUN=5,MON,TUE,WED,THU,FRI,SAT

25、;程序运行结果:5 6 7 8 9 10 11,重庆电力高等专科学校,【例10.24】把例10.22中的enum weekday的定义改为:enum weekdaySUN=5,MON,TUE,WED=10,THU,FRI,SAT;程序运行结果:5 6 7 10 11 12 13【例10.25】把例10.22中的enum weekday的定义改为:enum weekdaySUN=9,MON,TUE,WED=10,THU,FRI,SAT;程序运行结果:9 10 11 10 11 12 13说明:在C语言里,同一枚举类型定义时所指定的不同名字的枚举常量可以有相同的值。【例10.26】把例10.22中

26、的enum weekday的定义改为:enum weekdaySUN=9,MON,TUE,WED=-5,THU,FRI,SAT;程序运行结果:9 10 11-5-4-3-2说明:枚举常量的值可以是负数。,重庆电力高等专科学校,10.5 共用体 共用体:所有成员的存储单元共用同一个存储单元,又称为联合体。创建共用体的一般形式为:union 共用体名 数据类型 成员名1;数据类型 成员名2;数据类型 成员名n;,例如:union dataint i;char c;float f;定义了一个共用体类型union data,再用这个类型定义一个变量n:union data n;,重庆电力高等专科学校,

27、共用体变量所占的内存长度是其最长的成员的长度,共用体量中起作用的成员是最后一次存放的成员。共用体类型多用用于和底层有关的操作。例如:union fourbytelong n;char b4;这时,可以用b0、b1、b2和b3分别表示n的4个字节。共用体类型对于我们做一般情况下的编程,并不是很常用。,重庆电力高等专科学校,10.7 上机实训实训题目:对10.5节的程序进行完善,为其添加链表排序的功能。实训要求:程序运行结果及部分代码已给出,要求补全list_sort函数的函数体,如list_sort需要调用源程序里没给出的函数,可自行定义。,重庆电力高等专科学校,void list_sort(N

28、ode*list)/*在此补全程序*/void sort_demo(Node*list)list_sort(list);printf(排序后链表:n);list_show(list);void main()Node*list=NULL;message(演示创建链表.);create_demo(,重庆电力高等专科学校,程序运行结果:演示创建链表.结点数:60号结点的值:dog1号结点的值:cat2号结点的值:lion3号结点的值:tigar4号结点的值:eagle5号结点的值:wolf创建后的链表:0号结点的值:dog 1号结点的值:cat 2号结点的值:lion,3号结点的值:tigar4号结点的值:eagle5号结点的值:wolf演示对链表进行升序排列.排序后链表:0号结点的值:cat1号结点的值:dog2号结点的值:eagle3号结点的值:lion4号结点的值:tigar5号结点的值:wolf,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号