1、第2部分 习题解答75第1章 面向对象程序设计概述75第2章 C+基础知识85第3章 类和对象87第4章 继承与组合91第5章 多态性与虚函数94第6章 面向对象的妥协98第7章 运算符重载102第8章 模板106第9章 输入/输出流109第10章 异常处理111I第2部分 习题解答第1章 面向对象程序设计概述一、简答题简述面向过程程序设计和面向对象程序设计的编程思想,体会面向对象程序设计的优点。【答案要点】面向过程程序设计的编程思想:功能分解、逐步求精、模块化、结构化。当要设计一个目标系统时,首先从整体上概括出整个系统需要实现的功能,然后对系统的每项功能进行逐层分解,直到每项子功能都足够简单
2、,不需要再分解为止。具体实现系统时,每项子功能对应一个模块,模块间尽量相对独立,通过模块间的调用关系或全局变量而有机地联系起来。面向对象程序设计的编程思想:(1)客观世界中的事物都是对象(object),对象之间存在一定的关系。(2)用对象的属性(attribute)描述事物的静态特征,用对象的操作(operation)描述事物的行为(动态特征)。(3)对象的属性和操作结合为一体,形成一个相对独立、不可分的实体。对象对外屏蔽其内部细节,只留下少量接口,以便与外界联系。(4)通过抽象对对象进行分类,把具有相同属性和相同操作的对象归为一类,类是这些对象的抽象描述,每个对象是其所属类的一个实例。(5
3、)复杂的对象可以用简单的对象作为其构成部分。(6)通过在不同程度上运用抽象的原则,可以得到一般类和特殊类。特殊类继承一般类的属性与操作,从而简化系统的构造过程。(7)对象之间通过传递消息进行通信,以实现对象之间的动态联系。(8)通过关联表达类之间的静态关系。与传统的面向过程程序设计相比,面向对象程序设计的优点如下:(1)从认识论的角度看,面向对象程序设计改变了软件开发的方式。软件开发人员能够利用人类认识事物所采用的一般思维方式来进行软件开发。(2)面向对象程序中的数据的安全性高。外界只能通过对象提供的对外接口操作对象中的数据,这可以有效保护数据的安全。(3)面向对象程序设计有助于软件的维护与复
4、用。某类对象数据结构的改变只会引起该类对象操作代码的改变,只要其对外提供的接口不发生变化,程序的其余部分就不需要做任何改动。面向对象程序设计中类的继承机制有效解决了代码复用的问题。人们可以像使用集成电路(IC)构造计算机硬件那样,比较方便地重用对象类来构造软件系统。二、编程题【程序参考代码】/*学生信息管理系统C语言源代码student.c*/#include /*包含输入/输出头文件*/#include /*包含字符串处理头文件*/#include #define MAXSIZE 100 /*能够处理的学生总人数,可以随意修改*/typedef struct /*用于存放生日信息的结构体*/
5、 int year; int month; int day;Date;typedef struct Stud /*用于存放学生信息的结构体*/char Num12; /*学号为11位*/ char Name11; /*姓名,最多5个汉字*/ char Sex2; /*性别,男记为m,女记为f */Date Birthday; /*出生日期*/ float English, DataStructure, CPlusPlus; /*三门课成绩*/ float Sum, Average; /*总成绩、平均成绩*/Student;char CurFile40; /*存放当前正在操作的磁盘文件的文件名*
6、/int IsOpen=0; /*当前是否有磁盘文件被打开标志*/int found=0; /*在查找学生信息时是否找到标志*/Student studMAXSIZE; /*用于存放读入内存中的所有学生信息的全局数组*/int Index=0; /*存放实际学生人数的全局变量*/*各自定义函数原型声明*/void Create(); /*新建学生信息文件*/ void Open(); /*打开学生信息文件,并读取学生信息到全局数组stud中*/void Display(); /*显示学生信息*/void Search(); /*查询学生信息*/int SearchNum(char* Num);
7、 /*按学号查询学生信息*/int SearchName(char* Name); /*按姓名查询学生信息*/void Append(); /*添加学生信息*/void Modify(); /*修改学生信息*/void Delete(); /*删除学生信息*/void Total(); /*统计所有学生某一科目总成绩*/void Sort(); /*学生信息排序*/ void Backup(); /*备份学生信息*/void menu() /*系统功能菜单*/ int choice; /*用于保存用户对功能菜单的选择结果*/for( ; ; ) /*显示系统功能菜单*/printf(n*n);
8、printf(* 学生信息管理系统 *n); printf(*n); printf(* 1新建学生信息文件 *n); printf(* 2打开学生信息文件 *n); printf(* 3显示学生信息 *n); printf(* 4查询学生信息 *n); printf(* 5添加学生信息 *n);printf(* 6修改学生信息 *n);printf(* 7删除学生信息 *n);printf(* 8统计学生信息 *n);printf(* 9学生信息排序 *n); printf(* 10备份学生信息 *n); printf(* 0退出系统 *n); printf(*n); printf( 请选择要
9、执行的操作(08):_); scanf(%d, &choice); switch(choice) case 1: Create(); break; case 2: Open(); break; case 3: Display(); break; case 4: Search(); break;case 5: Append(); break;case 6: Modify(); break;case 7: Delete(); break;case 8: Total(); break; case 9: Sort(); break;case 10: Backup(); break; case 0: r
10、eturn; default: printf(选择错误!请重新选择。n);/*switch结束*/*for结束*/void ReOrEx()/*在用户执行完一项系统功能后,可以选择:是继续运行系统,还是退出系统*/int n; printf(n*n);printf(* 1. 返回上级菜单 *n); printf(* 0. 退出系统 *n);printf(*n);printf( 请选择(1/0)?_); scanf(%d,&n);if(n=0)printf(n*n); printf(* 谢谢使用本系统! *n); printf(*n); exit(1);void main()printf(*n)
11、;printf(* 欢迎使用学生信息管理系统! *n);printf(*n);system(pause); menu();/*系统功能以菜单的形式提供给用户*/ printf(n*n);printf(* 谢谢使用本系统! *n);printf(*n);/*main函数结束*/*各自定义函数实现代码*/int New(char* FileName) /*创建磁盘文件*/FILE *fp; if(fp=fopen(FileName,w)=NULL) return 0; else fclose(fp); Index=0;return 1; void Create() /*新建学生信息文件*/char
12、 FileName40;printf(请输入新建文件的名称:);scanf(%s, &FileName);if(strcmp(FileName, studentbackup) strcat(FileName, .dat);if(!New(FileName)printf(%s文件创建失败!n, FileName);else strcpy(CurFile, FileName); printf(%s文件创建成功!n, FileName);else printf(%s是备份文件,禁止创建与此文件同名的文件!n,FileName); ReOrEx();void Open() /*打开学生信息文件*/ch
13、ar FileName40;printf(请输入要打开的数据文件的名称:);scanf(%s, &FileName);if(strcmp(FileName, studentbackup)strcat(FileName, .dat); if(IsOpen=0) FILE *fp; if(fp=fopen(FileName, rb)=NULL) printf(%s文件打开失败!n, FileName); elseIsOpen=1;Index=0; while(!feof(fp)fread(&studIndex, sizeof(struct Stud), 1, fp);Index+;Index-;p
14、rintf(学生总人数为:%dn, Index);fclose(fp); printf(%s文件打开成功!n, FileName); strcpy(CurFile, FileName); elseprintf(%s文件已经打开!n, FileName); elseprintf(%s是备份文件,禁止打开此文件!n, FileName);ReOrEx();void Display() /*显示全部学生信息*/int i; if(!strcmp(CurFile, ) printf(当前并未打开或新建文件,无法显示!n); elseprintf(n 显示所有学生成绩信息nn);printf(%-12s
15、%-11s%-5s%-14s%-12s%-15s%-12s%-12s%-12sn, Num, Name, Sex, Birthday, English, DataStructure, CPlusPlus, Sum, Average); for(i=0; iIndex; i+) printf(%-12s%-11s%-5s%4d/%2d/%2d%10.2f%15.2f%12.2f%12.2f%12.2fnn, studi.Num, studi.Name, studi.Sex, studi.Birthday.year, studi.Birthday.month, studi.Birthday.day
16、, studi.English, studi.DataStructure, studi.CPlusPlus, studi.Sum, studi.Average);ReOrEx();int SearchNum(char* Num) /*按学号查询学生信息*/int i;for(i=0; Index; i+)if(!strcmp(studi.Num, Num)printf(对应此学号的学生信息存在!n);found=1;return i;printf(没有此学生的信息!n);found=0;return 0;int SearchName(char* Name) /*按姓名查询学生信息*/int i
17、;for(i=0; i=MAXSIZE)printf(错误! 学生信息已满,不能添加!n);else printf(执行添加学生信息操作!n);printf(n请输入学生学号:);scanf(%s, Num);location=SearchNum(Num);if (!found) printf(可以进行添加操作!n);printf(n请输入学生姓名:); scanf(%s, Name); printf(n请输入学生性别:); scanf(%s, &Sex); printf(n请输入学生出生年份:); scanf(%d, &Year); printf(n请输入学生出生月份:); scanf(%d
18、, &Month); printf(n请输入学生出生日:); scanf(%d, &Day); printf(n请输入学生英语成绩:); scanf(%f, &English); printf(n请输入学生数据结构成绩:); scanf(%f, &DataStructure); printf(n请输入学生C+成绩:); scanf(%f, &CPP); printf(n); strcpy(studIndex.Num, Num); strcpy(studIndex.Name, Name); strcpy(studIndex.Sex, Sex);studIndex.Birthday.year=Ye
19、ar; studIndex.Birthday.month=Month; studIndex.Birthday.day=Day;studIndex.English=English;studIndex.DataStructure=DataStructure;studIndex.CPlusPlus=CPP;studIndex.Sum=English+DataStructure+CPP;studIndex.Average=studIndex.Sum/3;Index+;printf(插入一条学生信息操作成功!n);else printf(不能进行添加学生信息操作!n);void Save(char* F
20、ileName) /*学生信息存盘*/FILE *fp;int i;if(fp=fopen(FileName, wb)=NULL)printf(文件打开失败!);return;for(i=0;I Index; i+)fwrite(&studi, sizeof(struct Stud), 1, fp);fclose(fp);void Append() /*添加学生信息*/if(!strcmp(CurFile, ) printf(当前并未打开或新建文件,无法添加!n);elseAddData(); Save(CurFile); ReOrEx();void ModifyData() /*修改一条学生
21、信息*/char Num12;char Name10;char Sex2;float English, DataStructure, CPP;int Year, Month, Day;int location;printf(n执行修改学生信息操作!nn);printf(请输入将要修改的学生的学号:);scanf(%s, Num);location=SearchNum(Num);if (found) printf(可以进行修改学生信息操作!n);printf(n请输入学生姓名:);scanf(%s, Name);printf(n请输入学生性别:); scanf(%s, &Sex); printf
22、(n请输入学生出生年份:); scanf(%d, &Year); printf(n请输入学生出生月份:); scanf(%d, &Month); printf(n请输入学生出生日:); scanf(%d, &Day); printf(n请输入学生英语成绩:); scanf(%f, &English); printf(n请输入学生数据结构成绩:);scanf(%f, &DataStructure); printf(n请输入学生C+成绩:); scanf(%f, &CPP); printf(n);strcpy(studlocation.Num, Num); strcpy(studlocation.
23、Name, Name); strcpy(studlocation.Sex, Sex);studlocation.Birthday.year=Year; studlocation.Birthday.month=Month; studlocation.Birthday.day=Day;studlocation.English=English;studlocation.DataStructure=DataStructure;studlocation.CPlusPlus=CPP;studlocation.Sum=English+DataStructure+CPP;studlocation.Averag
24、e=studIndex.Sum/3;printf(执行修改学生信息操作成功!n); else printf(不能进行修改学生信息操作!n);void Modify() /*修改学生信息*/if(!strcmp(CurFile, ) printf(当前并未打开或新建文件,无法修改!n); else ModifyData(); Save(CurFile);ReOrEx();int DeleteData()/*删除一条学生信息*/char Num12; int location,i;printf(n 执行删除学生信息操作!nn);printf(警告!学生信息一旦删除,将不可恢复。请小心使用该操作!n
25、n);printf(请输入将要删除的学生的学号:n);scanf(%s, Num);location=SearchNum(Num);if(found)if(location!=MAXSIZE)for(i=location; iMAXSIZE; i+)strcpy(studi.Num, studi+1.Num); strcpy(studi.Name, studi+1.Name);strcpy(studi.Sex, studi+1.Sex);studi.Birthday.year=studi+1.Birthday.year;studi.Birthday.month=studi+1.Birthday
26、.month;studi.Birthday.day=studi+1.Birthday.day;studi.English=studi+1.English;studi.DataStructure=studi+1.DataStructure;studi.CPlusPlus=studi+1.CPlusPlus;studi.Sum=studi+1.Sum;studi.Average=studi+1.Average;Index-;return 1;return 0;void Delete() /*删除学生信息*/if(!strcmp(CurFile, )printf(当前并未打开或新建文件,无法删除!n
27、); elseif(DeleteData()Save(CurFile);printf(删除一条学生信息操作成功!n);else printf(不能进行删除操作!n);printf(删除一条学生信息操作失败!n);ReOrEx();float GetOneCourseSum(int n) /*计算所有学生某一科目的总成绩*/float N=0;int i;switch(n)case 1:/计算英语总成绩for(i=0; iIndex; i+) N+=studi.English;break;case 2:/计算数据结构总成绩for(i=0; iIndex; i+) N+=studi.DataStructure;break;case 3:/计算C+总成绩 for(i=0; i=1 & change; -i)chang