第06章数据的抽象与封装.ppt.ppt_第1页
第06章数据的抽象与封装.ppt.ppt_第2页
第06章数据的抽象与封装.ppt.ppt_第3页
第06章数据的抽象与封装.ppt.ppt_第4页
第06章数据的抽象与封装.ppt.ppt_第5页
已阅读5页,还剩136页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、0,西安交通大学 计算机教学实验中心,数据的抽象与封装,计算机程序设计(C+),内容提要,多种数据特征的封装结构体 结构 结构变量 结构数组 结构指针 公用体 枚举类型 多种数据特征和函数的封装类 类 对象 构造函数与析构函数 类的组合 多文件结构,1,6.1多种数据特征的封装结构体,在描述某些事物时,有时只用一种数据类型往往很难处理,如手机通话记录中的信息就有多种数据类型,对方电话号码可以用字符数组或者字符串,持续时间可以用整型(以秒计时)、浮点型、双精度类型中的一种,如果只是将这两类信息定义为相互独立的简单变量,是很难反映它们之间的内在联系的,在C语言中,可以使用结构将多种数据信息封装在一

2、起。,2,6.1.1结构,结构是C语言中一种新的构造数据类型,它能把有内在联系的不同类型的数据统一成一个整体,使它们相互关联;同时,结构又是一个变量的集合,可以按照对基本数据类型的操作方法单独使用其成员变量。,3,结构体定义,struct 结构体名 类型名1 成员名表1; 类型名2 成员名表2; 类型名n 成员名表n; ;,4,简单例子,struct conversion char phonenumber11; int duration; ;,5,嵌套定义例子,struct time int hour,minute,second; struct day int year,month,date;

3、 struct conversion char phonenumber11; int duration; struct day occurrentday; struct time occurrenttime; ;,6,6.1.2结构变量,如同C语言中的基本数据类型一样,在定义了结构类型后,还需要定义结构类型的变量,然后才能通过结构变量来操作和访问结构的数据。,7,结构变量定义,单独定义 格式1: 结构体名 变量名列表; 格式2: struct 结构体名 变量名列表; 混合定义 struct 结构体名 成员表列 变量名表列; 无类型定义 struct 成员表列 变量名表列;,8,结构变量初始化,

4、struct conversion char phonenumber11; int duration; struct day occurrentday; struct time occurrenttime; account1=“1111111111”,120,2012,8,8,16,15,30;,9,结构变量使用,结构变量成员的引用 结构体变量名.成员名 结构变量的整体赋值 结构变量1=结构变量2 结构变量作为函数参数 结构变量可以作为函数参数以及函数的返回值,10,【例6-1】,查找是否有指定电话号码的通话记录 【问题分析】 表示通话记录 【算法描述】 录入通话记录,按照电话号码寻找相匹配的

5、通话记录,11,【源程序】,#include /包含基本输入输出库头文件 using namespace std; /使用名字空间 struct time /定义时间结构体 int hour,minute,second; struct day /定义日期结构体,年、月、日 int year,month,date; struct conversion/通话记录类型 char phonenumber11; /电话号码 int duration; /通话时长 struct day occurrentday; /日期 struct time occurrenttime; /时间 account1=“1

6、111111111”,120,2012,8,8,16,15,30; /初始化结构体变量account1,12,int main() /主函数 char temp11; couttemp; if(strcmp(account1.phonenumber,temp)=0) /比较电话号码 cout”find”tempendl; coutaccount1.durationendl; /打印结构体的成员 coutaccount1.occurrentday.year”t”; coutaccount1.occurrentday.month”t”; cout account1.occurrentday.dat

7、eendl; coutaccount1.occurrenttime.hour”t”; coutaccount1.occurrenttime. minute”t”; cout account1.occurrenttime.second endl; ,13,else cout”not find”tempendl; return 0; ,14,【运行结果】,结果一: 请输入对方的电话号码 1111111111 find1111111111 120 2012 8 8 16 15 30 结果二: 请输入对方的电话号码 2222222222 not find2222222222,15,【思路扩展】,如果将

8、结构变量的初始化过程改写成从键盘输入各成员的值再赋值给各成员,应该如何修改?如果将查找过程编写成函数,又该如何修改?,16,6.1.3结构数组,一个结构变量只能表示一个实体的信息,例如account1只能表示1条通话记录,如果有许多相同类型的实体,就需要使用结构数组,例如100条通话记录,由于每条记录的基本信息都是相同的,就可以将这些具有相同结构类型的变量组织起来,形成一个结构数组。 结构数组是结构与数组的结合,与普通数组的不同之处在于每个数组元素都是一个结构类型的数据,包含各个成员。,17,结构数组定义,struct conversion char phonenumber11; int du

9、ration; struct time occurrentday; struct time occurrenttime; account100;,18,结构数组初始化,struct conversion account100=“1111111111”,11,2012,8,8, 16,15,30,“2222222222”,22, 2012,8,8,16,15,30;,19,结构数组使用,结构数组成员的引用 结构数组名下标.结构成员名 结构数组元素的整体赋值 结构数组元素i=结构数组元素j,20,【例6-2】,词频统计:输入一系列英文单词,单词之间用空格隔开,用“xyz”表示结束输入,统计输入过哪

10、些单词以及各单词出现的次数,统计时,区分大小写字母,最后按单词的字典顺序输出单词和出现次数的对照表。 【问题分析】 字典的组成 【算法描述】 统计不同单词出现的次数,21,【源程序】,#include /包含基本输入输出库头文件 #include using namespace std; /使用名字空间 struct WordList/字典类型 char word50; int freq; ;,22,void Sort(WordList list,int count) /排序函数 for(int i=0;ii;j=j-1) if(strcmp(listj-1.word,listj.word)0

11、) WordList tmp; tmp=listj-1; listj-1=listj; listj=tmp; ,23,int main() /主函数 WordList list5000; int i,num=0; char temp50; couttemp; while(strcmp(temp,”xyz”)!=0) for(i=0;inum;i+) /扫描当前字典 if(strcmp(listi.word,temp)=0)/若字典中存在该单词,词频加1 listi.freq+; break; ,24,if(i=num)/若字典中无该单词,添加该词 strcpy(listi.word,temp)

12、; listi.freq=1; num+; cintemp;/继续输入单词 Sort(list,num); /对字典进行排序 cout”词频统计结果如下:”endl; for(i=0;inum;i+) coutlisti.word”t”listi.freqendl; return 0; ,25,【运行结果】,请输入一系列英语单词,以xyz表示输入结束 Do you see the star , the little star ? xyz 词频统计结果如下: , 1 ? 1 Do 1 little 1 see 1 star 2 the 2 you 1,26,【思路扩展】,如果在统计单词过程中,要

13、去掉标点符号的统计,该如何修改?实际运行时,如果标点符号与单词连在一起,统计结果会有哪些变化,应该如何解决?,27,6.1.4结构指针,指向结构的指针 *p,*p- 指向结构数组的指针 结构数组元素.成员名 结构数组元素-成员名 结构指针名-成员名 (*结构指针名).成员名 结构指针作为函数参数,28,【例6-3】,利用带结构指针的函数实现通话记录的输入、输出和查找等功能。 【问题分析】 输入、输出和查找函数 【算法描述】 批量录入通话记录,再按照电话号码寻找相匹配的通话记录。,29,【源程序】,#include /包含基本输入输出库头文件 using namespace std; /使用名字

14、空间 struct time /时间结构体 int hour,minute,second; struct day /日期结构体 int year,month,date; struct conversion /通话记录结构体 char phonenumber11; int duration; struct day occurrentday; struct time occurrenttime; void input(struct conversion *);/输入函数声明 void print(struct conversion);/输出函数声明 struct conversion find(s

15、truct conversion *, char tempnumber11);,30,int main() /主函数 char temp11; struct conversion account1,account5; /结构体变量、数组 input(account); /调用输入函数 couttemp; /输入要查找的电话号码 account1=find(account,temp); /调用查找函数 if(strcmp(account1.phonenumber,0000000000)!=0) /判断是否找到 print(account1); /找到则显示 else coutnot finden

16、dl; return 0; /主函数结束 ,31,void input(struct conversion *p)/批量输入通话记录 coutpi.phonenumberpi.duration; cinpi.occurrentday.yearpi.occurrentday.monthpi.occurrentday.date; cinpi.occurrenttime.hourpi.occurrenttime.minutepi.occurrenttime.second; ,32,void print(struct conversion q) /输出指定结构变量的全部成员信息 coutq.phone

17、numbertq.durationendl; coutq.occurrentday.yeart ; coutq.occurrentday.montht ; cout q.occurrentday.dateendl; coutq.occurrenttime.hourt; coutq.occurrenttime. minutet; cout q.occurrenttime.second endl; ,33,struct conversion find(struct conversion *p,char tempnumber11)/查找指定电话 struct conversion r=0000000

18、000;/结构变量部分成员初始化 for(int i=0;i5;i+) if(strcmp(pi.phonenumber,tempnumber)=0) r=pi; /结构变量的整体赋值 return r; ,34,【运行结果】,请输入5个人的通话记录(电话、时长、日期、时间) 1111111111 120 2012 8 8 8 8 8 2222222222 130 2012 8 9 8 8 9 3333333333 140 2012 8 1 8 8 8 4444444444 150 2012 9 9 9 9 9 5555555555 160 2012 9 9 9 9 9 input the p

19、honenumber:3333333333 3333333333 140 2012 8 1 8 8 8,35,【思路扩展】,什么情况下在函数中使用结构变量或者结构指针作为函数参数较好?,36,6.1.5公用体,结构体与共用体的本质区别只要在于存储方式,结构体的每个成员各自占用分配给自己的存储单元,各自拥有自己的地址,结构体类型分配的内存空间大小就是各成员所占存储单元的总和。共用体的各个成员则占用共同的存储单元,具有相同的首地址,占用存储单元最多的成员的长度就是共用体的长度。,37,公用体的定义,union 公用体名 类型1 成员名1; 类型2 成员名2; 类型n 成员名n; ;,38,共用体变

20、量定义,单独定义 union postion pos1,pos2,*p; 混合定义 union postion int grand; char title20; pos1,pos2,*p;,39,公用体变量初始化,共用体变量或数组在初始化时,只能对它的第一个成员赋值,对多个成员赋值是不允许的 union postion pos1=1;/正确 union postion pos2=1,2;/正确 union postion pos2=1,lector,2,lector;/错误,40,共用体变量的使用,共用体变量的引用 共用体变量名.成员 共用体变量指针.成员 公用体变量的整体赋值 共用体变量1=

21、共用体变量2,41,【例6-4】,学校人事信息管理:批量输入和输出学生或者教师信息,包括姓名、年龄、职业和职位等信息,每位学生或者教师都包含前3项信息,但对学生而言,其第4项信息表示年级;对教师而言,其第4项信息表示职称。 【问题分析】 学校人事信息的表示 【算法描述】 输入和输出学校人事信息。,42,【源程序】,#include /包含基本输入输出库头文件 using namespace std; /使用名字空间 union postion int grand; char title20; ; struct person char name20; int age; char job10; p

22、ostion pos; ;,43,int main() /主函数 person p3; int i; for(i=0;pi.agepi.job; if(strcmp(pi.job,”student”)=0) cin pi.pos.grand; else cin pi.pos.title; cout”*”endl;,44,cout”name”t”age”t”job”t” grand/title”endl; for(i=0;i3;i+) ”t”pi.age”t” pi.job”t”; if(strcmp(pi.job,”student”)=0) cout pi

23、.pos.grandendl; else cout pi.pos.titleendl; return 0;/程序结束, ,45,【运行结果】,tom 21 student 3 john 19 teacher professor rose 19 student 1 * name age job grand/title tom 21 student 3 john 19 teacher professor rose 19 student 1,46,【思路扩展】,结构体类型中包含共用体类型的定义会在哪些情况中出现?共用体类型中包含结构体类型的定义会在哪些情况中出现?,47,6.1.6枚举类型,在一些实

24、际的应用中,有些变量的取值常常被限定在一个有限范围内,如一个星期只有7天,一年只有12个月等。C语言提供的“枚举”类型能够在类型定义时列举出所有可能的取值,将枚举类型变量的取值限定在取值范围内。由于枚举变量只能取一个值,不能再分解为任何基本类型,因此枚举类型只是一种基本数据类型,而不是构造类型。,48,枚举的定义,enum 枚举名 枚举常量表,49,枚举变量的定义,单独定义 enum color temp; 混合定义 enum color red,yellow,blue,white,black temp; 无类型定义 enum red,yellow,blue,white,black temp;

25、,50,枚举变量的使用,可以把枚举常量赋值给枚举变量,但不能直接把元素的序号赋值给枚举变量。,51,【例6-5】,五色球的组合:口袋中有红、黄、蓝、白、黑5种颜色的小球若干,如果每次都从口袋中取出3个不同颜色的小球,共有多少种组合?试输出每种组合的3种颜色。 【问题分析】 小球颜色的表示 【算法描述】 使用穷举法测试符合三种颜色要求的每种组合。,52,#include /包含基本输入输出库头文件 using namespace std; /使用名字空间 int main() /主函数 enum colorred,yellow,blue,white,black; int count=0; int

26、 temp; for(int i=red;i=blue;+i)/第一次取球 for(int j=i+1;j=black;+j)/第二次取球 for(int k=j+1;k=black;k+)/第三次取球 +count;,53,for(int t=0;t3;+t)/输出每次组合中3次取球的颜色 switch(t) case 0:temp=I;break; case 1:temp=j;break; case 2:temp=k;break; default:cout”impossiblen”; switch(enum color)temp) case red:cout”red”t”;break; c

27、ase yellow:cout”yellow”t”;break; case blue:cout”blue”t”;break; case white:cout”white”t”;break; case black:cout”black”t”;break; default:cout”impossiblen”; ,54,cout”n”; cout”共有”count”种组合”endl; return 0;/程序结束, ,55,【运行结果】,red yellow blue red yellow white red yellow black red blue white red blue black re

28、d white black yellow blue white yellow blue black yellow white black blue white black 共有10种组合,56,【思路扩展】,如果本题不使用枚举类型,该如何实现?如果允许取出相同颜色的小球,该如何修改程序?,57,多种数据特征和函数的封装类,在结构体类型中可以定义若干个成员表示一个整体,比如通话记录这个结构体可以包含对方电话号码、持续时间、发生日期、发生时间等。在使用结构体类型时需要定义结构体变量,然后对它所包含的各个成员进行赋值。在默认情况下,这些成员在结构体之外是公开的(称为具有public权限),外部可以任

29、意使用。其实,C+语言对结构体进行了一定程度的改良,比如在结构体类型中不但可以增加类似成员的内部变量,还可以增加内部函数,这样就扩展了结构体的用途范围,而这些内部函数对外也是公开的。以下将要讲到的类与结构体有相似之处,它不但包含结构体所体现的功能,而且设计上更灵活,更易于管理,数据也更安全。,58,6.2.1类,类与自然界分门别类是同样一个概念,例如人是一个大类,学生和教师是其子类;数学是一个大类,高等数学和初等数学是其子类。在C+中,类也是一种数据类型。对象是每个类中的一个个实体和事项,例如学生是一个子类,而王东同学作为学生类的一个实体,他不仅属于该类,他还能展示该类所具有的基本特征、性能、

30、动作和功能等,如学号、班级、所学课程、成绩等。在C+中,类的所有特征、性能和功能等均要通过对象才能展示和实现。,59,类定义,class 类名 成员访问权限: 成员变量定义; 成员访问权限: 成员函数定义; . ;,60,成员变量 数据类型 成员变量名 ; 成员函数 如果在类内定义,其形式为: 返回类型 成员函数 ( 数据类型 形式参数1 , 数据类型 形式参数2 , . ) 函数体 如果在类外定义,其形式为: 返回类型 类名:成员函数 ( 数据类型 形式参数1 ,. ) 函数体 ,61,内联函数 隐式定义 显式定义 inline 返回类型 类名:成员函数 ( 数据类型 形式参数1 ,. )

31、函数体 ,62,class mobile private: char mynumber11;/机主的电话号码 public: void init(char number11=”0000000000”)/隐式定义的内联函数 mynumber=number; void dial();/拨打电话 void answer(char othernumber11);/接听电话 void hangup();/挂断电话 ,63,6.2.2对象,类实际上是一种抽象机制,描述了一类问题的共同属性和行为,在C+中,类的对象就是该类的某一特定实体(也称实例)。如果将类看作是一种类型,那么类的对象就可以看作为该类型的变

32、量。,64,对象定义,单独定义 类名 对象变量名 ; mobile m1,m2;/定义类对象m1和m2 混合定义 class mobile . mobile m1,m2; /定义类对象m1和m2,65,对象初始化,class mobile public: char mynumber11;/机主的电话号码 . m1=”1111111111”;,66,对象使用,对象成员的引用 对象变量名.成员变量或成员函数 对象指针名-成员变量或成员函数 对象的整体赋值 对象1=对象2 对象作为函数的形式参数,67,【例6-6】,定义手机类mobile,包括电话号码mynumber变量以及初始化函数init、拨打

33、电话函数dial、接听电话函数answer、挂断电话函数hangup。 【问题分析】 手机类的定义。 【算法描述】 定义mobile类,68,【源程序】,#include using namespace std; class mobile private: char mynumber11;/机主的电话号码 public: void init(char number11=”0000000000”)/隐式定义的内联函数 strcpy(mynumber,number); void dial();/拨打电话 void answer(char othernumber11);/接听电话 void hang

34、up();/挂断电话 ;,69,void mobile:dial() cout”Dialing number is”mynumberendl; cout”Dialing on.”endl; void mobile:answer(char othernumber11) cout”Answering number is”othernumberendl; cout”Answering in.”endl; inline void mobile:hangup()/显示定义的内联函数 cout”Hanging up.”endl; ,70,int main() mobile m1; m1.init(”111

35、1111111”);/对象对成员函数init的使用 m1.dial(); m1.hangup(); m1.answer(”2222222222”); m1.hangup(); return 0; ,71,运行结果,Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222222 Answering in. Hanging up.,72,【思路扩展】,日常生活中,还有哪些事物可以定义为类?,73,【例6-7】,定义手机类mobile,包括电话号码mynumber变量,定义初始化函数init、拨打电话

36、函数dial、接听电话函数answer、挂断电话函数hangup,要求dial和init用对象作为函数的参数,实现与【例6-6】相同的功能。 【问题分析】 函数dial和init的定义 【算法描述】 定义mobile类和能够使用该类对象的普通函数dial和init,74,【源程序】,#include using namespace std; class mobile public: char mynumber11;/机主的电话号码 ; void init(mobile ,75,void answer(char othernumber11)/接听电话 cout”Answering number

37、is”othernumberendl; cout”Answering in.”endl; void hangup()/挂断电话 cout”Hanging up.”endl; ,76,int main() /main function mobile m1; init(m1); dial(m1); hangup(); answer(”2222222222”); hangup(); return 0; ,77,【运行结果】,1111111111 Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222

38、222 Answering in. Hanging up.,78,【思路扩展】,【例6-6】与【例6-7】的区别有哪些?,79,对象与指针,指向对象的指针 类名 *对象指针名; 指向对象成员的指针 返回值类型名(类名:*指针变量名)(参数表); 指针变量名=类名:成员函数名; 指向对象的指针和指向对象成员的指针都只能访问公有成员。 this指针 存放对象的起始地址,80,【例6-8】,利用指向对象的指针以及指向对象成员函数指针完成手机mobile类中拨打、接听等函数的调用。 【问题分析】 指向对象的指针、指向对象成员变量的指针以及指向对象成员函数指针的使用 【算法描述】 在mobile类中使用

39、指向对象的指针和指向对象成员函数指针,81,【源程序】,#include using namespace std; class mobile public: char mynumber11; void init(char number11=”0000000000”)/隐式定义的内联函数 strcpy(mynumber,number); void dial();/拨打电话 void answer(char othernumber11);/接听电话 void hangup();/挂断电话 ;,82,void mobile:dial() cout”Dialing number is”mynumber

40、endl; cout”Dialing on.”endl; void mobile:answer(char othernumber11) cout”Answering number is”othernumberendl; cout”Answering in.”endl; void mobile:hangup()/显示定义的内联函数 cout”Hanging up.”endl; ,83,int main() mobile m1; mobile *p1=,84,void(mobile:*p3)(char number11); void(mobile:*p4)(); void(mobile:*p5)(

41、char othernumber11); void(mobile:*p6)(); p3=mobile:init; p4=mobile:dial; p5=mobile:answer; p6=mobile:hangup; (m1.*p3)(”1111111111”); (m1.*p4)(); (m1.*p6)(); (m1.*p5)(”2222222222”); (m1.*p6)(); return 0; ,85,【运行结果】,Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222222 Answ

42、ering in. Hanging up. 1 Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222222 Answering in. Hanging up.,86,【思路扩展】,指向对象的指针、指向对象成员变量的指针以及指向对象成员函数指针会在哪些情况中使用?,87,6.2.3构造函数,构造函数 在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。 拷贝构造函数 使用一个已经存在的对象(由拷贝构造函数的参数指定),去初始化同类的一个新对象。 析构函数 用于完成对象被删除前的一

43、些善后工作,88,构造函数,类名( 形参列表 ) 函数体 ,89,拷贝构造函数,类名(类名 class mobile public: char mynumber11; mobile();/不带参数的构造函数mobile mobile(char number11);/ 带参数的构造函数mobile mobile(); ; mobile:mobile() strcpy(mynumber,”0000000000”); coutmynumberendl; ,93,mobile:mobile(char number11) strcpy(mynumber,number); coutmynumberendl

44、; mobile() cout”Turn off the phone”endl; int main() mobile m1; return 0; ,94,【运行结果】,0000000000 Turn off the phone,95,6.2.4类的组合,组合 类名:类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),. 类的初始化 引用 循环依赖 向前引用,96,【例6-10】,定义具有GSM和CDMA两种发射制式的mobile类 【问题分析】 内嵌对象的使用 【算法描述】 在mobile类中使用内嵌对象、构造函数和析构函数,97,【源程序】,#include using namesp

45、ace std; class mobilecdma private: char mynumber11;/机主的电话号码 public: mobile(char number11)/初始化 mynumber=number; cout”Turn on the mobile”mynumberendl; mobile() cout”Turn off the mobile”mynumberendl; ;,98,class mobile private: char mynumber11;/机主的电话号码 mobilecdma core;/CDMA内核,内嵌对象 public: mobile(char *n

46、umber,char *number1):core(number1)/初始化 strcpy(mynumber,number); cout”Turn on the mobile”mynumberendl; mobile() cout”Turn off the mobile”mynumberendl; ;,99,int main() mobile m1(”1111111111”,”2222222222”); return 0; ,100,【运行结果】,Turn on the mobile2222222222 Turn on the mobile1111111111 Turn off the mob

47、ile1111111111 Turn off the mobile2222222222,101,6.2.5多文件结构,一般把类和成员变量的定义放在一个.h文件,把成员函数和静态成员的定义放在.cpp文件中,主函数放在另外的一个.cpp文件中。,102,【例6-11】,使用多文件结构组织mobile类。 【问题分析】 源文件划分 【算法分析】 mobile类的多文件结构,103,.h,/mobil.h文件放mobile的定义 #ifndef MOBILE_H #define MOBILE_H class mobile private: char mynumber11;/机主的电话号码 publi

48、c: mobile(char number11);/构造函数 void dial();/拨打电话 void answer(char othernumber11);/接听电话 void hangup();/挂断电话 mobile();/析构函数 #endif,104,.cpp,/mobile.cpp文件放mobile成员函数的定义 #include #include mobile.h using namespace std; mobile:mobile(char number11)/初始化 strcpy(mynumber,number); cout”Turn on the mobile”mynu

49、mberendl; mobile:mobile() cout”Turn off the mobile”mynumberendl; ,105,void mobile:dial() cout”Dialing number is”mynumberendl; cout”Dialing on.”endl; void mobile:answer(char othernumber11) cout”Answering number is”othernumberendl; cout”Answering in.”endl; void mobile:hangup() cout”Hanging up.”endl; ,

50、106,.cpp,/main.cpp放主函数 #include mobile.h #include using namespace std; int main() mobile m1(”1111111111”); m1.dial(); m1.hangup(); m1.answer(”2222222222”); m1.hangup(); return 0; ,107,【运行结果】,Turn on the mobile1111111111 Dialing number is1111111111 Dialing on. Hanging up. Answering number is222222222

51、2 Answering in. Hanging up. Turn off the mobile1111111111,108,【思路扩展】,在什么情况下会使用类的多文件结构?,109,【例6-12】,对每个学生的成绩进行判断,找出有不及格的课程,然后显示该同学的学号姓名以及不及格课程的名称和分数。 【问题分析】 定义结构体的数据类型student,其成员分别是学号、姓名和一个数组,该数组用来保存5门课的成绩,初始化时给出每个学生的学号、姓名和各门课程的成绩。 【算法描述】 在学生成绩结构体数组中查找不及格信息。,110,【源程序】,#include using namespace std; in

52、t main() struct student char stno9; char stname20; int score5; ;,111,student stud10=08091101,张品,76,87,69,76,78, 08091102,李利,97,67,79,45,90, 08091103,应一利,54,69,76,79,56, 08091104,周勤,87,88,97,99,76, 08091105,吴风,69,56,98,34,32, 08091106,赵强,77,87,99,65,76, 08091107,李力平,91,67,67,87,65, 08091108,张军利,87,45

53、,77,56,79, 08091109,冯红,100,69,89,89,76, 08091110,孙李,99,76,97,96,79 ; char course520=数学,物理,化学,英语,计算机; int i,j,cnt; cout每个同学的成绩:endl; cout 学号t姓名t数学t物理t化学t英语t计算机endl; cout=endl;,112,for(i=0;i10;i+) coutstudi.stnotstudi.stnamet; for(j=0;j5;j+) coutstudi.scorejt; coutendl; cout=endl; cout不及格同学的课程和成绩如下:en

54、dl; / 处理不及格分数 for(i=0;i10;i+) cnt=0;,113,for(j=0;j0) cout“姓名:”studi.stname“ 学号:”studi.stno“ 不及格门数:cntendl; cout=endl; for(j=0;j5;j+) if(studi.scorej60) coutcoursej:studi.scorejendl; cout=endl; return 0; ,114,【运行结果】,每个同学的成绩: 学号 姓名 数学 物理 化学 英语 计算机 = 08091101 张品 76 87 69 76 78 08091102 李利 97 67 79 45 9

55、0 08091103 应一利 54 69 76 79 56 08091104 周勤 87 88 97 99 76 08091105 吴风 69 56 98 34 32 08091106 赵强 77 87 99 65 76 08091107 李力平 91 67 67 87 65 08091108 张军利 87 45 77 56 79 08091109 冯红 100 69 89 89 76 08091110 孙李 99 76 97 96 79 =,115,不及格同学的课程和成绩如下: 姓名:李利 学号:08091102 不及格门数:1 = 英语:45 = 姓名:应一利 学号:08091103 不及格门数:2 = 数学:54 计算机:56 = 姓名:吴风 学号:08091105 不及格门数:3 = 物理:56 英语:34 计算机:32,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论