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