《第10章构造数据类型.ppt》由会员分享,可在线阅读,更多相关《第10章构造数据类型.ppt(48页珍藏版)》请在三一办公上搜索。
1、第10章 构造数据类型,南开大学非计算机专业理工科面向对象程序设计课程,2,课程内容安排(2课时),结构体枚举类型重定义typedef,3,结构体,数组是由若干同一类型的数据元素构成的有序集合。例如可以用一个数组表示某个学生所有科目的成绩,但是如果想要表示某个学生的学号、姓名、性别、年龄、成绩等不同类型的数据集合,用数组显然无法实现。这时程序员可以定义一个表示学生数据的结构体数据类型,即学生结构体类型,其中包括学生的各项数据说明,然后再根据新定义的结构体类型定义相应的结构体变量,用来表示和存储某个具体的学生数据。下面分别介绍结构体类型的定义、结构体变量的定义及其它们的使用。,4,结构体,10.
2、1.1 结构体类型的定义结构体类型定义的一般形式为:struct 结构体类型名成员列表;其中,struct是关键字,表示结构体类型的开始。struct后面就是定义的结构体类型的名称。大括号中是若干个成员的说明,每个成员说明的形式为:类型 成员名;整个定义的最后以分号结束。,5,结构体,在这段结构体类型的定义中,Student是结构体类型名,即新定义的一种构造数据类型。大括号中列出了学生结构体中包含的各成员的类型及名称,即学生类型包含的各项信息。定义了结构体类型Student之后,就可以定义相应的结构体变量表示具体的学生数据了。,例如学生结构体类型定义如下:struct Studentchar
3、num8;char name10;char sex;int age;float score;,6,结构体,提示:结构体类型定义以关键字struct开头,一对大括号不能少,尤其不要忘记最后以分号结束。结构体类型的定义一般放在程序开始的文件包含语句后面,也可以放到某个函数内部。结构体中的成员可以是前面学过的任意类型,甚至可以是结构体类型。结构体类型定义只是定义了一种新的数据类型,并不是变量,不占用内存空间。,7,结构体,10.1.2 结构体变量的定义和初始化1.结构体变量的定义结构体变量的定义方法有三种(1)先定义结构体类型,再定义结构体变量 如前面定义过结构体类型Student后,可以用以下形式
4、定义变量:Student s1,s2;该语句定义了Student类型的结构体变量s1和s2。s1和s2表示具体的两个学生变量,它们各自有学号、姓名、性别、年龄和成绩等数据成员。,8,结构体,(2)定义结构体类型的同时定义结构体变量struct Studentchar num8;char name10;char sex;int age;float score;stu1,stu2;在定义结构体类型的同时定义两个结构体变量,然后再以分号结束。,9,结构体,(3)不声明结构体类型名,直接定义结构体变量struct char num8;char name10;char sex;int age;float
5、 score;stu;直接定义上面这种结构体类型的变量stu,但是没有给出类型名,以后就不能再定义该类型的变量了。,10,结构体,2.结构体变量的初始化和其他类型的变量一样,定义结构体变量的同时可以对其进行初始化,例如:Student s1=0911001,Zhang San,M,18,606;或struct Studentchar num8;char name10;char sex;int age;float score;s2=0911002,Wang Li,F,17,666;,11,结构体,10.1.3 结构体变量的引用定义结构体变量之后,系统为其分配内存并可以对其引用,即对其赋值和其他操
6、作。但是要注意一个结构体变量由若干成员组成,所以引用结构体变量一般是对其各个成员的引用。引用结构体变量的成员的形式如下:结构体变量名.成员名其中,“.”是成员运算符。,12,结构体,如已有定义“Student stu;”,则可以进行如下操作:strcpy(stu.num,0912003);cinstu.name;stu.sex=F;stu.age=16;cinstu.score;,13,结构体,另外,相同类型的结构体变量之间可以整体赋值,例如:Student s1,s2=0911001,Zhang San,M,18,606;s1=s2;这样,s1和s2两个变量的内容完全相同,相当于将s2的各成
7、员的值依次赋值给s1的各成员。,14,结构体,【例10-1】编写程序,记录某学生的学号、姓名和三科成绩,计算并输出其平均成绩。/p10_1.cpp#include using namespace std;struct Student char num8;char name10;float score3;stu=0910128,Li Ming,86,91,78;,15,结构体,int main()float s=0;for(int i=0;i3;i+)s=s+stu.scorei;coutstu.numendlstu.nameendls/3endl;return 0;运行结果为:0910128L
8、i Ming85,16,结构体,注意:1结构体中的成员不是变量,不能单独使用,它们从属于某个结构体变量,必须通过“结构体变量名.成员名”的形式来引用。2对结构体变量只有初始化和变量之间赋值时可以整体引用,其他情况下只能引用成员。例10-1中如果没有初始化,定义后再为变量stu赋值,则只能对成员分别赋值或分别输入,如“strcpy(stu.num,0910128);”“cinstu.score0;”等形式。如果写成“stu=0910128,Li Ming,86,91,78;”则是错误的,不能同时对结构体变量整体输入输出,如“cinstu;”“coutstu;”等都是错误的。,17,结构体,3如果
9、结构体成员仍然是结构体类型的,则要对数据成员进行多层引用。如:struct Dateint year,month,day;struct Student char num8,name10;Date birthday;float score3;stu;则要引用学生stu的出生年份,就应该表示为:stu.birthday.year。,18,结构体,10.1.4 结构体指针结构体变量定义后,系统为其分配内存空间,具体分配的字节数可由sizeof(结构体类型名)或者sizeof(变量名)求得。结构体变量的内存空间的首地址表示为:&结构体变量名。可以定义结构体类型的指针变量,让其指向结构体变量,指针变量访
10、问结构体变量的成员时借助箭头成员运算符“-”,形式为:指针变量-成员名。,19,结构体,【例10-2】利用结构体指针变量实现:输入学生数据,然后输出平均成绩。/p10_2.cpp#include using namespace std;struct Student char num8;char name10;float score3;,20,结构体,int main()Student stu,*p;p=例题中,p-num等价于stu.num,也可以表示为(*p).num。其他成员的访问同理。,21,结构体,10.1.5 结构体数组如果要操作多个学生的信息,可以定义学生类型的结构体数组,如语句“
11、Student stu3;”定义了结构体数组stu,它有3个元素stu0、stu1、stu2,这3个元素就是3个结构体变量,表示3个学生,而每个元素都有学号、姓名等成员,用stui.num、stui.name(其中i的取值为0、1、2)等形式引用。,22,结构体,对结构体数组可以在定义的同时进行初始化,例如:struct Student char num8;char name10;float score3;stu2=0910127,Li Ming,86,91,78,0910128,Zhou Xun,88,81,79;,23,结构体,【例10-3】学生结构体类型包括学号、姓名、英语成绩、数学成绩
12、、计算机成绩,求某班计算机成绩的最高分。#include using namespace std;struct Student char num8;char name10;float score3;,24,结构体,int main()const int N=3;Student stuN;for(int i=0;istui.numstui.name;for(int j=0;jstui.scorej;,25,结构体,float maxScore=stu0.score2;for(int i=1;imaxScore)maxScore=stui.score2;cout全班计算机最高成绩为:maxScor
13、eendl;return 0;,26,回答问题时间,请思考并回答:1如何求每位学生的成绩最高分max?2如何求全班所有学生的三科成绩中有不及格成绩的学生总人数?3如何对学生按照某科成绩进行排序?,27,结构体,10.1.6 结构体与函数结构体类型的数据可以作为函数参数,在函数内对该参数进行操作。另外函数的返回值也可以是结构体类型的数据,函数的返回值可以是结构体类型的数据或结构体类型的指针。结构体类型作为函数参数有以下几种情况:(1)结构体变量作为函数参数;(2)结构体数组作为函数参数;(3)结构体指针或引用作为函数参数。,28,结构体,【例10-4】学生结构体类型包括学号、姓名、英语成绩、数学
14、成绩、计算机成绩,输入N个学生的数据,然后求N个学生所有成绩的最高分。#include using namespace std;struct Student char num8;char name10;float score3;,29,结构体,void Input(Student,30,结构体,void Output(Student s)/结构体变量作参数,输出某个学生的数据couts.num s.name;for(int j=0;j3;j+)couts.scorej;coutendl;,31,结构体,float FindMax(Student*s,int m,int n)/结构体指针(数组)
15、作参数,求最高成绩float maxScore=s0.score0;for(int i=0;imaxScore)maxScore=si.scorej;return maxScore;,32,结构体,int main()const int N=3;Student stuN;int i;for(i=0;iN;i+)Input(stui);coutN个学生的信息如下:endl;for(i=0;iN;i+)Output(stui);float max=FindMax(stu,N,3);cout全班最高成绩为:maxendl;return 0;,33,结构体,Input()函数中,结构体引用作为函数参数
16、。主函数中调用Input()函数时,实参stui传递给形参s,s成为stui的引用,Input()函数中对s的操作相当于对主函数中stu的操作。,34,结构体,Output()函数中,结构体变量作为函数参数。主函数调用Output()函数时,将实参stui的值传递给形参s,在函数中输出s,相当于将主函数中stui的值输出;但是和引用作参数不同的是,变量作参数,是形参向实参的单向值传递,实参获得形参的值之后,它们之间就没有关系了,如果在函数内部改变实参的值,不会影响形参。,35,结构体,FindMax()函数中,结构体指针作为函数参数,接收到的实参是主函数中的结构体数组名(即数组的首地址),形参
17、s指向了主函数中的数组stu,在函数中对si的操作相当于对主函数中stui的操作。本程序中注意各形参和实参的对应关系和书写格式。,36,枚举,10.2 枚 举实际应用中,有些变量只有几个可能的值,而且可以用整数来表示这些值,如一周有7天,一年有12个月等。这时,可以定义枚举(enumeration)类型,将几个可能的值列举出来。,37,枚举,10.2.1 枚举类型的定义枚举类型的定义形式为:enum 枚举类型名枚举常量列表;其中,enum是枚举类型关键字,枚举类型名是新定义的一种构造数据类型,大括号中将这种枚举类型可能有的几个常量的名字列举出来,最后以分号结束。,38,枚举,例如:enum W
18、eekdaysun,mon,tue,wed,thu,fri,sat;定义了枚举类型Weekday,这个类型的7个数据在大括号中被列举出来,sun,mon,tue,wed,thu,fri,sat等被称为Weekday的枚举常量,表示一周中的七天,而且它们默认对应7个整数值0,1,2,3,4,5,6。,39,枚举,在定义枚举类型时,也可以指定枚举常量对应的整数值。例如:enum Weekdaysun=7,mon=1,tue,wed,thu,fri,sat;这时,枚举常量的值依次是7,1,2,3,4,5,6。又如:enum Colorred,green,blue,white=0,black;枚举常量
19、的值依次是0,1,2,0,1。,40,枚举,10.2.2 枚举变量的定义和引用定义枚举类型之后,就可以定义相应的枚举变量,可以先定义枚举类型,再定义枚举变量,也可以在定义枚举类型的同时定义枚举变量。例如:enum Colorred,green,blue,white,blackco1,co2;或者:enum Colorred,green,blue,white,black;Color co1,co2;,41,枚举,定义了枚举变量之后,可以对枚举变量进行引用即可以对枚举变量进行初始化、赋值或其他操作,不过应该注意的是对枚举变量只能赋值为枚举常量之一。如:enum Colorred,green,blu
20、e,white,blackco1=red,co2;co2=blue;/不能写为:co2=2;但是在参加其他计算或操作时,co1的值相当于整数0,co2的值相当于整数2,如:coutco2endl;的输出结果为2;coutco1+5endl;的输出结果为5;,42,枚举,【例10-5】函数Output的功能是输出参数对应的颜色。/p10_5.cpp#include using namespace std;enum Colorred,green,blue,white,black;,43,枚举,void Output(Color co)switch(co)case 0:coutredendl;bre
21、ak;case 1:coutgreenendl;break;case 2:coutblueendl;break;case 3:coutwhiteendl;break;case 4:coutblackendl;break;,44,枚举,int main()Color co1=red,co2=white;Output(co1);Output(co2);return 0;运行结果为:redwhite,45,类型重定义typedef,10.3 类型重定义typedef在C+中,可以使用typedef关键字为已有的数据类型定义一个别名,增强程序的可读性。例如:typedef int TIME;这条语句为
22、类型名int声明了一个别名TIME,即给int起了一个新的名字TIME。以后在程序中TIME就表示int,如:TIME t1;相当于 int t1;不过前者可读性较强,直观地可以看出t1是表示时间的一个变量。,46,类型重定义typedef,再如:typedef int COUNT;/定义类型int的别名COUNTCOUNT i,j;/相当于int i,j;不过直观地可以看出i和/j是表示计数的变量可以用typedef声明数组类型名,如:typedef int ARR100;ARR a,b;/相当于int a100,b100;,47,类型重定义typedef,还可以为结构体声明新类型名,如:typedef structdouble x;double y;POINT;上面结构体的类型名是POINT,虽然在struct的后面没有给出类型名,但是最开始有关键字typedef,相当于为这个结构体起了一个新类型名POINT,以后可以用POINT定义这种类型的变量,如:POINT p1,p2;,上机实习及课后作业,上机实习(2课时):配套教材上机实习指导与习题集第10章 构造数据类型上机实习内容课后作业:配套教材上机实习指导与习题集第10章 构造数据类型习题,