3 结构体、共用体和枚举类型.ppt
第第7章章 用户自定义数据类型用户自定义数据类型教学目标n理解结构体引入的原因,掌握结构体类型、结构体变量的定义理解结构体引入的原因,掌握结构体类型、结构体变量的定义方法,熟悉结构体变量的初始化和引用;方法,熟悉结构体变量的初始化和引用;n熟悉结构体数组定义、初始化及使用;熟悉结构体数组定义、初始化及使用;n熟悉共用体类型变量的定义、变量的引用方式,了解其数据特熟悉共用体类型变量的定义、变量的引用方式,了解其数据特点;点;n熟悉枚举类型的定义和基本使用方法;熟悉枚举类型的定义和基本使用方法;n了解了解typedef的功能、最基本用法。的功能、最基本用法。重点:重点:结构体类型和结构体变量的定义,结构体变量的初始化和结构体类型和结构体变量的定义,结构体变量的初始化和引用,结构体数组定义、初始化及使用,共用体类型、枚举类引用,结构体数组定义、初始化及使用,共用体类型、枚举类型定义和变量的使用;型定义和变量的使用;难点:难点:结构体、共用体、枚举三者的异同点,类型定义与变量定结构体、共用体、枚举三者的异同点,类型定义与变量定义的差别,变量的使用及有关说明,义的差别,变量的使用及有关说明,枚举类型与整型的比较枚举类型与整型的比较。第第7章章 用户自定义数据类型用户自定义数据类型7.1 结构体 7.2 共用体 7.3 枚举类型 7.4 typedef的使用 数据类型数据类型基本类型基本类型整整 型型字符型字符型浮点型浮点型派生类型派生类型指针类型指针类型(*)数组类型数组类型()结构体类型结构体类型(struct)共用体类型共用体类型(union)类类型类类型空类型空类型(void)枚举类型枚举类型(enum)uC+的数据类型的数据类型n概念:结构体概念:结构体(structure)是一种派生数据类型,由是一种派生数据类型,由用户自己建用户自己建立,由若干个类型不同数据项组成,是一种组合型数据结构立,由若干个类型不同数据项组成,是一种组合型数据结构。n现假设有如下资料现假设有如下资料:学号学号姓名姓名性别性别年龄年龄成绩成绩家庭地址家庭地址101001张三张三m2089.5北京路123号101002李四李四f1994.3体育东路1号101003王五王五m2178.0体育西路5号intchar 20charchar 30intfloatn行行:包含包含几个数据项几个数据项,反映的是一个学生的整体信息反映的是一个学生的整体信息。记录记录问题:问题:用什么数据类型来用什么数据类型来存储存储由由多个多个类型可能不同的类型可能不同的数据项数据项组成组成的的“行行”信息信息?7.1.1为什么需要用结构体类型为什么需要用结构体类型 7.1.1为什么需要用结构体类型为什么需要用结构体类型 C+语言提供了一些系统已定义好的语言提供了一些系统已定义好的数据类型数据类型,如,如int、float、char等供用户使用。等供用户使用。我们可以通过这些类型来定义一些变量来我们可以通过这些类型来定义一些变量来存储存储学生的学生的信息信息:int num;/定义学号定义学号char name20;/定义姓名定义姓名char sex;/定义性别定义性别int age;/定义年龄定义年龄float score;/定义成绩定义成绩char addr30;/家庭地址家庭地址包含包含int、char、float三种不同数据三种不同数据类型,还定义了两类型,还定义了两个数组。个数组。但这些变但这些变量之间无内在联系量之间无内在联系。7struct student int num;/数据项学数据项学号号 char name20;/数据项姓数据项姓名名 char sex;/数据项性数据项性别别 int age;/数据项年数据项年龄龄 float score;/数据项成数据项成绩绩 char addr30;/数据项地址数据项地址;7.1.1为什么需要用结构体类型为什么需要用结构体类型 如果这样定义一如果这样定义一个个结构体类型结构体类型,数据项间就建立数据项间就建立联系了联系了。7.1.1为什么需要用结构体类型为什么需要用结构体类型struct 结构体类型名结构体类型名数据类型数据类型 成员成员1;数据类型数据类型 成员成员2;数据类型数据类型 成员成员n;结构体标识结构体标识,不能省略不能省略n定义结构体类型的一般形式定义结构体类型的一般形式 地位与地位与int、char、float、double等类型等类型名相同,名相同,通常首字母大通常首字母大写写。已有类型已有类型或或已定义的已定义的“结构体结构体”,每一个数据,每一个数据项可以是项可以是不同类型不同类型数据项名称数据项名称,又称又称“域域”struct Dateint year;int month;int day;例例:结构体类型名结构体类型名 Date struct Studentint num;char name20;char sex;int age;float score;char addr30;例:结构体类型名例:结构体类型名 Stduent 7.1.2结构体类型类型变量的定义方法结构体类型类型变量的定义方法 及初始化及初始化1.定义结构体类型变量的方法定义结构体类型变量的方法1)先声明结构体类型,再定义该类型变量)先声明结构体类型,再定义该类型变量2)在定义类型的同时声明变量)在定义类型的同时声明变量 例如:例如:struct Student int num;char name20;char sex;int age;float score;char addr30;student1,student2;struct student int num;/数据项学数据项学号号 char name20;/数据项姓数据项姓名名 char sex;/数据项性数据项性别别 int age;/数据项年数据项年龄龄 float score;/数据项成数据项成绩绩 char addr30;/数据项地址数据项地址;student student1,student2;结构体类型名结构体类型名结构体变量名结构体变量名 结构体类型名结构体类型名结构体变量名结构体变量名 3)不指定结构体类型名,直接定义结构体类型变量不指定结构体类型名,直接定义结构体类型变量 struct 成员表列成员表列 变量名表列变量名表列;n说明:说明:(1)结构体类型与结构体变量是不同的概念结构体类型与结构体变量是不同的概念。只能对变量赋值、存取或运算只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间在编译时,对类型是不分配空间的,只对变量分配空间(2)对结构体变量中的对结构体变量中的成员成员(即即“域域”),可以单独使用可以单独使用,它的作用与地位它的作用与地位相相当于普通变量当于普通变量。(3)结构体成员可以属于另一个结构体类型。结构体成员可以属于另一个结构体类型。struct Date int month;int day;int year;struct Student int num;char name20;char sex;int age;struct Date birthday;char addr30;例:例:n结构体变量的初始化结构体变量的初始化:即在:即在定义结构体变量时给它的各成员赋初值定义结构体变量时给它的各成员赋初值2.结构体变量的初始化结构体变量的初始化例例:把一个学生的信息把一个学生的信息(包括学号、姓名、性别、住址包括学号、姓名、性别、住址)放在一个结构体放在一个结构体变量中,然后输出这个学生的信息。变量中,然后输出这个学生的信息。n解题思路:解题思路:建立一个结构体类型,包括有关学生信息的各成员建立一个结构体类型,包括有关学生信息的各成员,用它用它定义结构体变量,同时赋以初值定义结构体变量,同时赋以初值,最后,最后输出该结构体变量的各成员输出该结构体变量的各成员。#include using namespace std;int main()struct studentlong int num;char name20;char sex;char addr20;a=10101,Li Lin,M,123 Beijing Road;/变量变量a初始化初始化coutNO.:a.numnname:a.namensex:a.sexnaddress:a.addr;return 0;7.1.3引用引用结构体变量结构体变量引用引用格式:格式:结构体变量名结构体变量名.成员名成员名 (.是成员运算符,优先级最高是成员运算符,优先级最高)struct Student a;a=4102,Li Ping,F,21,80,Beijing Road 11#;错误!错误!(1)同类型的结构体变量可互相赋值,同类型的结构体变量可互相赋值,如:如:student1=student2;(2)可以引用一个结构体变量中的一个成员的值。struct student a;a.score=80;strcpy(a.addr,Beijing Road 11#);正确!正确!不允许整体给不允许整体给结构体变量结构体变量赋值,赋值,只能对各个成员逐一赋值只能对各个成员逐一赋值;(3)如果如果结构体的成员中又包含结构体结构体的成员中又包含结构体,只能用多个只能用多个.号逐级找到最底层的变号逐级找到最底层的变量量,进行,进行赋值、存取及运算赋值、存取及运算,如:,如:student1.birthday.month=7;a.num=10010;正确!正确!(4)一般情况下不能对结构体变量整体使用,一般情况下不能对结构体变量整体使用,不能整体输入、输出不能整体输入、输出,只能对各成员分别引用只能对各成员分别引用;couta;(企图整体读入结构体变量企图整体读入结构体变量)错误!错误!(5)结构体的成员可以象普通变量一样进行各种运算结构体的成员可以象普通变量一样进行各种运算如:如:sum=student1.score+student2.score;(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址,可以引用结构体变量成员的地址,也可以引用结构体变量的地址,如:如:cout&students.num;cout&student1;/输出输出student1的首地址的首地址例例:输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩。输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩。n解题思路:解题思路:定义定义同一个结构体的两个同一个结构体的两个变量变量,再分别输入学生的,再分别输入学生的学号、姓名学号、姓名和成绩;和成绩;再再比较两个学生的成绩,如果比较两个学生的成绩,如果哪一个哪一个学生的成绩高学生的成绩高,就输出该学,就输出该学生生全部信息,全部信息,若若相等,输出相等,输出两两个学生的全部信息个学生的全部信息。#include using namespace std;int main()struct student int num;char name20;float score;student1,student2;coutstudent1.numstudent1.namestudent1.score;cinstudent2.numstudent2.namestudent2.score;coutstudent2.score)coutstudent1.numstudent1.namestudent1.score;else if(student1.scorestudent2.score)coutstudent2.numstudent2.namestudent2.score;else coutstudent1.numstudent1.namestudent1.score;coutstudent2.numstudent2.namestudent2.score;return 0;n 概念:顾名思义是数组中的概念:顾名思义是数组中的每一个元素都是结构体变量每一个元素都是结构体变量1.定义结构体数组一般形式:定义结构体数组一般形式:格式格式1:struct 结构体名结构体名 成员表列成员表列 数组名数组名数组长度数组长度;格式格式2:先声明一个结构体类型,然后:先声明一个结构体类型,然后再用此类型定义结构体数组再用此类型定义结构体数组,即:,即:结构体类型结构体类型 数组名数组名数组长度数组长度;n7.1.4结构体结构体数组数组 struct Student int num;char name20;char sex;int age;float score;char addr30;Student stu3;struct Student int num;char name20;char sex;int age;float score;char addr30;stu3;数组数组名名 结构体类型名结构体类型名结构体类型名结构体类型名数组数组名名 2.结构体数组的初始化:结构体数组的初始化:在定义数组的后面加上:在定义数组的后面加上:初值表列初值表列;n7.1.4结构体结构体数组数组 struct Student int num;char name20;char sex;int age;float score;char addr30;sty3=10101,Li Lin,M,18,87.5,103 Beijing Road,10102,Zhang Fun,M,19,99,130 Shanghai Road,10104,Wang Min,F,20,78.5,1010,Zhongshan Road ;例例:有有3个候选人,每个选民只能投票选一人,要求编一个统计选票的个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。程序,先后输入被选人的名字,最后输出各人得票结果。n解题思路:定义解题思路:定义一个一个包含三个元素的包含三个元素的结构体数组,每个元素信息包括候选人结构体数组,每个元素信息包括候选人姓名和得票数姓名和得票数;输入被选人姓名输入被选人姓名;然后与数组元素中的然后与数组元素中的“姓名姓名”成员比较,如成员比较,如果相同,就给这个元素中的果相同,就给这个元素中的“得票数得票数”成员的值加成员的值加1;#include using namespace std;struct person /声明结构体类型声明结构体类型struct person char name20;/候选人姓名候选人姓名 int count;/候选人得票数候选人得票数 leader3=Li,0,Zhang,0,Fun,0;/定义结构体数组并初始化定义结构体数组并初始化int main()int i,j;char leader_name20;/定义字符数组定义字符数组 for(i=1;ileader_name;/输入所选的候选人姓名输入所选的候选人姓名 for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;coutnResoult:n;for(i=0;i3;i+)coutleaderi.nameleaderi.countendl;return 0;1.通过指向结构体变量的指针引用结构体变量中的成员n7.1.5指向指向结构体结构体变量的指针变量的指针#include#include using namespace std;int main()struct Student int num;string name;char sex;float score;Student stu;Student*p=&stu;stu.num=10301;stu.name=Wang Fun;stu.sex=f;stu.score=89.5;coutstu.numstu.namestu.sexstu.scoreendl;cout(*p).num(*p).name(*p).sex(*p).scoreendl;return 0;2.用结构体变量和指向结构体变量的指针构成链表n7.1.5指向指向结构体结构体变量的指针变量的指针#define NULL 0#include using namespace std;struct Student long num;float score;struct Student*next;int main()Student a,b,c,*head,*p;a.num=31001;a.score=89.5;b.num=31003;b.score=90;c.num=31007;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do coutnum scorenext;while(p!=NULL);return 0;第第6章章 指针和引用指针和引用7.1 结构体 7.2 共用体 7.3 枚举类型 7.4 typedef的使用 生活中的例子:学校聘请生活中的例子:学校聘请4位教师来任课,每位老师都要在学位教师来任课,每位老师都要在学校住一个晚上,具体如下:校住一个晚上,具体如下:(1)什么是共用体类型?什么是共用体类型?张老师张老师周一住宿周一住宿李老师李老师周二住宿周二住宿王老师王老师周三住宿周三住宿孙老师孙老师周四住宿周四住宿 现在,学校住房紧张,如何安排住宿才能最省?现在,学校住房紧张,如何安排住宿才能最省?把他们安排在同一个房间。把他们安排在同一个房间。因为他们住宿时间不同,互不影因为他们住宿时间不同,互不影响。前提条件:响。前提条件:不同时住宿不同时住宿,这样才能共享一个房间。,这样才能共享一个房间。这种共享空间的思想是这种共享空间的思想是“共用体共用体”的基础。的基础。使几个使几个不同的变量共享同一段内存的结构不同的变量共享同一段内存的结构,称为,称为“共用体共用体”类型的结构。类型的结构。(2)如何使用共用体如何使用共用体union Data int i;char ch;float f;a.i a.ch a.f 1.声明共用体类型声明共用体类型union a,b,c;2.定义公用体定义公用体变量变量3.引用引用公用体公用体 成员成员 例例:用同一表格处理学生和教师的数据。用同一表格处理学生和教师的数据。学生的数据中包括:姓名、号码、性别、职业、学生的数据中包括:姓名、号码、性别、职业、班级班级。教师的数据包括:姓名、号码、性别、职业教师的数据包括:姓名、号码、性别、职业、职务、职务struct int num;char name10;char sex;char job;union int clas;char position10;category;person2;n分析:分析:(1)学生和教师)学生和教师num,name,sex,job项相同项相同(2)第)第项项比较特别,若比较特别,若job项是项是s,则第,则第5项项为为 class。若。若job项是项是t,则第项为,则第项为position(3)第第5项可以用共用体来处理项可以用共用体来处理#include#include using namespace std;struct int num;char name10;char sex;char job;union int clas;char position10;category;person2;int main()int i;for(i=0;i2;i+)coutpersoni.numpersoni.namepersoni.sexpersoni.job;if(personi.job=s)cinpersoni.category.clas;else if(personi.job=t)cin personi.category.position;else coutInput error!;coutn;coutNo.name sex job class/positionn;for(i=0;i2;i+)if(personi.job=s)coutpersoni.num personi.name personi.sex personi.job personi.category.clas;else coutpersoni.num personi.name personi.sex personi.job personi.category.position;return 0;第第6章章 指针和引用指针和引用7.1 结构体 7.2 共用体 7.3 枚举类型 7.4 typedef的使用(1)什么是枚举什么是枚举(enumeration)类型类型n如果一个变量如果一个变量只有几种可能的值只有几种可能的值,则可以,则可以定义为枚举类型定义为枚举类型;n所谓所谓“枚举枚举”就是就是指把可能的值一一列举出来指把可能的值一一列举出来,变量的值只变量的值只限于列举出来的值的范围内。限于列举出来的值的范围内。(2)如何使用枚举如何使用枚举(enumeration)类型类型1)声明枚举类型格式:)声明枚举类型格式:enum 枚举枚举名名 枚举元素列表枚举元素列表 枚举变量列表枚举变量列表;enum Weekday sun,mon,tue,wed,thu,fri,sat;enum Weekday workday,weekend;workday=mon;weekend=sun;weekday=mon;正确!正确!正确!正确!错误错误(为什么?为什么?)枚举名枚举名 枚举变量名;枚举变量名;2)定义枚举变量)定义枚举变量说明:(说明:(1)枚举类型的)枚举类型的枚举元素按常量处理枚举元素按常量处理,故称,故称枚举常量枚举常量(2)枚举元素)枚举元素可以用来作判断比较可以用来作判断比较。例如:。例如:if(workday=mon)(3)每一个)每一个枚举元素都代表一个整数枚举元素都代表一个整数例:设某次体育比赛的结果有例:设某次体育比赛的结果有例:设某次体育比赛的结果有例:设某次体育比赛的结果有3 3 3 3种可能:胜(种可能:胜(种可能:胜(种可能:胜(WINWINWINWIN)、负()、负()、负()、负(LOSTLOSTLOSTLOST)、)、)、)、平局(平局(平局(平局(TIETIETIETIE),编写程序顺序输出这),编写程序顺序输出这),编写程序顺序输出这),编写程序顺序输出这3 3 3 3种情况。种情况。种情况。种情况。30#include using namespace std;enum game_resultWIN,LOST,TIE;int main()game_result res;int count;for(count=WIN;count=TIE;count+)res=(game_result)count;if(res=WIN)coutWINn;else if(res=LOST)coutLOSTn;else coutTIEn;return 0;例例:口袋中有红、黄、蓝、白、黑口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中种颜色的球若干个。每次从口袋中先后取出先后取出3个球,问得到个球,问得到3种不同颜色的球的可能取法,输出每种排种不同颜色的球的可能取法,输出每种排列的情况。列的情况。n解题思路解题思路:#include#include using namespace std;int main()enum colorred,yellow,blue,white,black;enum color pri;int i,j,k,n,loop;n=0;for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for(k=red;k=black;k+)if(k!=i)&(k!=j)n=n+1;coutn;for(loop=1;loop=3;loop+)switch(loop)case 1:pri=color(i);break;case 2:pri=color(j);break;case 3:pri=color(k);break;default:break;switch(pri)case red:coutsetw(8)red;break;case yellow:coutsetw(8)yellow;break;case blue:coutsetw(8)blue;break;case white:coutsetw(8)white;break;case black:coutsetw(8)black;break;default:break;coutn;coutntotal:nn;return 0;第第6章章 指针和引用指针和引用7.1 结构体 7.2 共用体 7.3 枚举类型 7.4 typedef的使用 Typedef的作用的作用 n声明新类型名声明新类型名,简单地用一个新的类型名代替原有的类型名简单地用一个新的类型名代替原有的类型名(1)命名一个新的类型名代表整型,或者单精度型命名一个新的类型名代表整型,或者单精度型 typedef struct int month;int day;int year;Date;Date birthday;Date*p;(2)命名一个新的类型名代表结构体类型)命名一个新的类型名代表结构体类型typedef int Integer;typedef float Real;int i,j;Integer i,j;float a,b;Real a,b;等价等价typedef int Num100;Num a;(3)命名一个新的类型名代表数组类型命名一个新的类型名代表数组类型 n说明:说明:l用用typedef只是对已经存在的类型指定一个新的类型名,而没只是对已经存在的类型指定一个新的类型名,而没有创造新的类型有创造新的类型;l用用typedef声明数组类型、指针类型,结构体类型、共用体类声明数组类型、指针类型,结构体类型、共用体类型、枚举类型等,使得编程更加方便型、枚举类型等,使得编程更加方便;l使用使用typedef名称有利于程序的通用与移植。名称有利于程序的通用与移植。本讲小结n定义和使用结构体变量定义和使用结构体变量:问题的提出,结构体类型的定义,:问题的提出,结构体类型的定义,结构体变量的定义,结构体变量的初始化和使用;结构体变量的定义,结构体变量的初始化和使用;n结构体数组:结构体数组:结构体数组概念、定义、初始化和使用;结构体数组概念、定义、初始化和使用;n共用体类型:共用体类型:问题的提出,共用体类型定义的一般形式,引问题的提出,共用体类型定义的一般形式,引用共用体变量的方式,共用体类型数据的特点;用共用体变量的方式,共用体类型数据的特点;n枚举类型枚举类型:概念,定义格式,有关说明;:概念,定义格式,有关说明;nTypedef声明新类型声明新类型:用一个新的类型名代替原有的类型名,:用一个新的类型名代替原有的类型名,命名一个新的类型名代表结构体类型,命名一个新的类型名命名一个新的类型名代表结构体类型,命名一个新的类型名代表数组类型,声明一个新类型的一般方法及有关说明。代表数组类型,声明一个新类型的一般方法及有关说明。