第十一章结构体与共同体精品课件.ppt
《第十一章结构体与共同体精品课件.ppt》由会员分享,可在线阅读,更多相关《第十一章结构体与共同体精品课件.ppt(99页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 结构体结构体 与与 共用体共用体 结构体结构体 共用体共用体 枚枚 举举 第十一章第十一章 结构体与共用体结构体与共用体本章要求:本章要求:、掌握结构体的概念,会使用结构体、掌握结构体的概念,会使用结构体指针,结构体数组。指针,结构体数组。、链表的概念,熟练掌握用指针处理、链表的概念,熟练掌握用指针处理链表。链表。、了解共用体的概念。、了解共用体的概念。、了解枚举类型。、了解枚举类型。、会用、会用typedef定义新数据类型。定义新数据类型。11 11从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型二进制数二进制数在早期的机器指令及汇编语言中,数据对象均用二进制数在早期的机器指令及汇
2、编语言中,数据对象均用二进制数表示,没有类型的概念表示,没有类型的概念基本数据类型基本数据类型在高级语言中引入了基本数据类型:在高级语言中引入了基本数据类型:整型、实型、字符型整型、实型、字符型等等基本数据类型不能方便的解决所有问题,基本数据类型不能方便的解决所有问题,用户自己构造数据类型用户自己构造数据类型-复合数据类型复合数据类型表示复杂的数据对象,表示复杂的数据对象,数组数组、指针指针也可算作此类,也可算作此类,然而最典然而最典型的代表就是型的代表就是“结构体结构体”,抽象数据类型(抽象数据类型(Abstract Data Type,简称,简称ADT)在复合数据类型基础上增加了对数据的操
3、作在复合数据类型基础上增加了对数据的操作类类跨时代的进步跨时代的进步思考一个问题在程序里表示一个人(姓名、年龄、性别、在程序里表示一个人(姓名、年龄、性别、),),怎么表示?怎么表示?想表示多个人呢?想表示多个人呢?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?表11-1 某学校学生成绩管理表学学号号姓名姓名性性别别入学入学时间时间计计算机算机原理原理英英 语语数数 学学物物 理理1令狐冲令狐冲男男1999908372822林平之林平之男男1999789288783岳灵珊岳灵珊女女1999897298664任任莹莹莹莹女女1999789587905 6 数组的解决方法
4、数组的解决方法int stuId30;/*最多可以管理最多可以管理30个学生个学生,每个每个 学生的学号用数学生的学号用数组的下标组的下标表示表示*/char stuName3010;char stuSex302;int timeOfEnter30;/*入学时间用入学时间用int表示表示*/int scoreCom30;/*计算机原理课的成绩计算机原理课的成绩*/int scoreEng30;/*英语课的成绩英语课的成绩*/int scoreMath30;/*数学课的成绩数学课的成绩*/int scoreMus30;/*物理课的成绩物理课的成绩*/数组的解决方法数据的内存管理方式 907889
5、788392729572889887827866901234令狐冲林平之岳灵珊任莹莹男男女女1999199919991999分配内存不集中,寻址效率不高分配内存不集中,寻址效率不高分配内存不集中,寻址效率不高分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位对数组进行赋初值时,容易发生错位对数组进行赋初值时,容易发生错位对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理结构显得比较零散,不容易管理结构显得比较零散,不容易管理结构显得比较零散,不容易管理希望的内存分配图 1令狐冲令狐冲男1999908372822林平之林平之男1999789288783岳灵珊岳灵珊女199
6、9897298664任莹莹任莹莹女199978958790结构体的解决方法struct STUDENT int studID;/*每个学生的序号每个学生的序号*/char studName10;/*每个学生的姓名每个学生的姓名*/char studSex4;/*每个学生的性别每个学生的性别*/int timeOfEnter;/*每个学生的入学时间每个学生的入学时间*/int scoreCom;/*每个学生的计算机原理成绩每个学生的计算机原理成绩*/int scoreEng;/*每个学生的英语成绩每个学生的英语成绩*/int scoreMat;/*每个学生的数学成绩每个学生的数学成绩*/int
7、scoreMus;/*每个学生的物理成绩每个学生的物理成绩*/;struct STUDENT 是一个类型是一个类型struct STUDENT students4;students0.studentIDstudents0.scoreComputer它们都是变量,一般称为结构的成员变量它们都是变量,一般称为结构的成员变量一、定义一个结构的一般形式一、定义一个结构的一般形式在实际问题中,一组数据往往具有不同的数据类型。在实际问题中,一组数据往往具有不同的数据类型。例如,学生登记表中,例如,学生登记表中,姓名姓名应为应为学号学号可为可为年龄年龄应为应为性别性别应为应为成绩成绩可为可为另一种构造数据类
8、型另一种构造数据类型“结构(结构(structure)”或叫或叫“结构体结构体”它相当于其它高级语言中的记录。它相当于其它高级语言中的记录。“结构结构”是一种构造类型,它是由若干是一种构造类型,它是由若干“成员成员”组成的。每一个成员可以是一个基本数据组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种类型或者又是一个构造类型。结构既是一种“构造构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。如同在说明和调用函数之前要先定义函数一样。显然不能用一
9、个数组来存显然不能用一个数组来存放这一组数据。因为数组放这一组数据。因为数组中各元素的类型和长度都中各元素的类型和长度都必须一致,以便于编译系必须一致,以便于编译系统处理。为了解决这个问统处理。为了解决这个问题题第十一章结构体与共用体第十一章结构体与共用体字符型字符型;整型或字符型整型或字符型;整型或实型整型或实型;整型整型;字符型字符型;在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。凡说明为结构
10、stu的变量都由上述4个成员组成。由此可见 结构是一种复杂的数据类型,结构是一种复杂的数据类型,是数目固定,类型不同的若干有是数目固定,类型不同的若干有序变量的集合。序变量的集合。定义一个结构的一般形式为:定义一个结构的一般形式为:struct 结构名结构名 成员表列成员表列;成员表列由若干个成员组成,每个成员都是该结构的一成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。个组成部分。对每个成员也必须作类型说明对每个成员也必须作类型说明,其形式为:,其形式为:类型说明符类型说明符 成员名成员名;成员名的命名应符合标识符的书写规定成员名的命名应符合标识符的书写规定 struct stu
11、 int num;char name20;char sex;float score;例如:例如:复习复习:二、结构类型变量的说明二、结构类型变量的说明说明结构变量有以下三种方法。以上面定义的说明结构变量有以下三种方法。以上面定义的stu为例来加以为例来加以说明。说明。、先定义结构,再说明结构变量、先定义结构,再说明结构变量如:如:说明了两个变量说明了两个变量boy1和和boy2为为stu结构类型。也可以结构类型。也可以用宏定义使一个符号常量来表示一个结构类型。用宏定义使一个符号常量来表示一个结构类型。struct stu int num;char name20;char sex;float s
12、core;struct stu boy1,boy2;例如:例如:#define STU struct stuSTU int num;char name20;char sex;float score;STU boy1,boy2;2 2、在定义结构类型的同时说明结构变量、在定义结构类型的同时说明结构变量struct stu int num;char name20;char sex;float score;boy1,boy2;这种形式的说明的一般形式为:这种形式的说明的一般形式为:struct 结构名结构名 成员表列成员表列 变量名表列变量名表列;结构类型变量结构类型变量例如:例如:还可以还可以定义
13、定义 structstruct stustu boy3,boy4;、直接说明结构变量、直接说明结构变量例如:例如:struct int num;char name20;char sex;float score;boy1,boy2;这种形式的说明的一般形式为:这种形式的说明的一般形式为:struct 成员表列成员表列变量名表列变量名表列;结构类型变量结构类型变量第三种方法与第二种方法的区第三种方法与第二种方法的区别在于第三种方法中省去了结别在于第三种方法中省去了结构名,而直接给出结构变量。构名,而直接给出结构变量。说明了说明了boy1,boy2变量为变量为stu类型后,即可向这两个变量类型后,即
14、可向这两个变量中的中的各个成员赋值各个成员赋值。在上述。在上述stu结构定义中,所有的成员都是结构定义中,所有的成员都是基本数据类型或数组类型。基本数据类型或数组类型。三种方法中说明的三种方法中说明的boy1,boy2变量都具有下图所示的结构:变量都具有下图所示的结构:成员也可以又是一个结构,即构成了嵌套的结构。成员也可以又是一个结构,即构成了嵌套的结构。例如,下图给出了另一个数据结构。例如,下图给出了另一个数据结构。struct int num;char name20;char sex;struct date birthday;float score;boy1,boy2;按图可给出以下结构定
15、义:按图可给出以下结构定义:struct date int month;int day;int year;首先定义一个结构date,由month(月)、day(日)、year(年)三个成员组成。成员成员birthday被说明为被说明为data结构类型结构类型 成员名可与程序中其它变量同名,互不干扰成员名可与程序中其它变量同名,互不干扰。例例:struct yeardatestruct yeardate intint num;num;char name20;char name20;char sex;char sex;structstruct date birthday;date birthday
16、;float score;float score;boy1,boy2;boy1,boy2;intint score;score;三、结构变量成员的表示方法三、结构变量成员的表示方法 在程序中使用结构变量时在程序中使用结构变量时,往往不把它作为一个整体来使往往不把它作为一个整体来使用。在用。在ANSI C中除了允许具有相同类型的结构变量相互赋中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。运算等都是通过结构变量的成员来实现的。表示结构变量成员的一般形式是:表示结构变
17、量成员的一般形式是:结构变量名结构变量名.成员名成员名如果成员本身又是一个结构则必须逐级找到最低级的成如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。员才能使用。即第一个人出生的月份成员可以在程序中单独使用,与普通变量完即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。全相同。例如:例如:boy1.num 即第一个人的学号即第一个人的学号 boy2.sex 即第二个人的性别即第二个人的性别例如:例如:boy1.birthday.month四、结构变量的赋值四、结构变量的赋值结构变量的赋值就是给各成员赋值。可用输入语句或赋结构变量的赋值就是给各成员赋值。可用输入语句或
18、赋值语句来完成。值语句来完成。【例例11.1】给结构变量赋值并输出其值。给结构变量赋值并输出其值。main()structstruct stustu intint num;num;char*name;char*name;char sex;char sex;float score;float score;boy1,boy2;boy1,boy2;boy1.num=102;boy1.name=Zhang ping;printf(“输入输入性别性别and分数分数n“);scanf(%c%f,&boy1.sex,&boy1.score);boy2=boy1;printf(“学号学号=%dn姓名姓名=%s
19、n,boy2.num,boy2.name);printf(“性别性别=%cn分数分数=%fn,boy2.sex,boy2.score);u用赋值语句给用赋值语句给num和和name两个成员赋值两个成员赋值uname是一个字符串指针变量是一个字符串指针变量u用用scanf函数动态地输入函数动态地输入sex和和score成员值成员值u然后把然后把boy1的所有成员的值整体赋予的所有成员的值整体赋予boy2u最后分别输出最后分别输出boy2的各个成员值的各个成员值本例表示了结构变量的赋值、输入和输出的方法本例表示了结构变量的赋值、输入和输出的方法五、结构变量的初始化五、结构变量的初始化和其他类型变量
20、一样,结构变量可以在定义时进行初始化赋值。和其他类型变量一样,结构变量可以在定义时进行初始化赋值。【例例11.211.2】对结构变量初始化。对结构变量初始化。main()struct stu /*定义结构定义结构*/int num;char*name;char sex;float score;boy2,boy1=102,Zhang ping,M,78.5 ;boy2=boy1;printf(Number=%dnName=%sn,boy2.num,boy2.name);printf(Sex=%cnScore=%fn,boy2.sex,boy2.score);六、结构数组的定义六、结构数组的定义
21、数组的元素也可以是结构类型的。因此可以构成结构型数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的数组。结构数组的每一个元素都是具有相同结构类型的下每一个元素都是具有相同结构类型的下标结构变量标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资构的一个群体。如一个班的学生档案,一个车间职工的工资表等。表等。方法和结构变量相似,只需说明它为数组类型即可方法和结构变量相似,只需说明它为数组类型即可。struct stu int num;char *name;char sex;f
22、loat score;boy5;定义了一个结构数组定义了一个结构数组 boy,共有共有5个元素个元素:boy0boy4每个数组元素都具有每个数组元素都具有 struct stu 的结构形式的结构形式例如:例如:struct stu int num;char*name;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;对结构数组可以作初始化赋值。对结构数组可以作初始化赋值。例如:例如:当对全部元素作初始
23、化赋值时,也可不给出数组长度。当对全部元素作初始化赋值时,也可不给出数组长度。【例例11.3】计算学生的平均成绩和不及格的人数。计算学生的平均成绩和不及格的人数。struct stu int num;char*name;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;main()int i,c=0;float ave,s=0;for(i=0;i5;i+)s+=boyi.score;if(boyi.s
24、core60)c+=1;printf(s=%fn,s);ave=s/5;printf(“平均分平均分=%fn人数人数=%dn”,ave,c);定义了一个外部结构数组boy,共5个元素,并作了初始化赋值。在main函数中用for语句逐个累加各元素的score 成员值存于s之中,如score的值小于60(不及格)即计数器C加1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。【例例11.4】建立一个简易的同学通讯录建立一个简易的同学通讯录main()struct mem manNUM;int i;for(i=0;iNUM;i+)printf(“输入姓名输入姓名:n);gets(mani
25、.name);printf(“输入电话号码输入电话号码:n);gets(mani.phone);printf(nametttphonenn);for(i=0;i-成员名成员名例如:例如:(*pstu).num 或者:或者:pstu-num注意注意(*pstu)两侧的括号不可少,因为成员符两侧的括号不可少,因为成员符“.”的优先的优先级高于级高于“*”。去掉括号写作去掉括号写作*pstu.num*(pstu.num),意义就完全不对了。,意义就完全不对了。下面通过例子来说明结构指针变量的具体说明和使用方法。下面通过例子来说明结构指针变量的具体说明和使用方法。struct stu int num;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十一 结构 与共 同体 精品 课件
限制150内