1《程序设计》实习报告(2012-5-31)姓名:陈孝存学号11052035日期:2011-5-311.实习题:学校招生办在录取当年新生时已为每个新生建立了一个新生基础类Base,其中包含有每位新生的基本资料:学号(longnum)、姓名(charname【20】)、性别(intsex:其中0表示男,1表示女)、年龄(intage)、主修专业名称charmdep【30】、住址(charaddr【30】);新生主修专业所在系(设每个系只包含有一个主修专业)又在学生基本资料的基础上为每位该系新生建立一个主修类First,其中除了包含原来新生基本资料外,还设有主修成绩表(设为intMscore【N】)(N是大于0的整数);为了促进复合型人才培养,学生在二年级可修读第二专业(第二学位)课程。第二学位接收系又为每位修读本系第二学位同学建立一个类Second,其中除了学生基本资料外,还设有攻读第二专业成绩表(设为intFscore【M】)(M是大于0的整数)。学校学位办为了掌握每位学生学位发放情况,又为学生建立一个管理类Manag。它应该包含学生所有资料。当学生主修专业课程全部合格(各门课程成绩大于等于60分,百分制计分),则可给他颁发主修专业学位;当学生获得主修专业学位,并攻读第二专业学位课程全部及格(各门课程成绩大于等于60分,百分制计分),则可颁发第二专业学位。按照管理规定:1.招生办工作人员只能访问到学生基本资料;2.主修系教务员只能访问到学生的基本资料和主修相关资料(但不能修改学生的基本资料);3.第二专业接收系教务员只能访问(但不能修改)其他专业来攻读本专业学生的基本资料和攻读本系第二专业相关资料;4.学位办工作人员能访问学生所有资料,但不可以修改学生任何资料。5.设每门课程的成绩都用百分制(整数)表示,每个学期结束时,各个系的教务员将输入本系同学所修各门功课的成绩,如果有其他系同学来攻读本系第二学位课程的,教务员还要输入这些同学(外来系修读本系第二学位的同学)所修读的第二学位课程的成绩。设每个学期每位主修学生修读课程不超过6门,学生修读第二学位课程不超过5门。输入结束以后:1.主修系教务员统计出本系同学里在期考中至少有3门(含3门)以上课程成绩在85分(含85分)以上、其余课程成绩不低于70分的同学并且显示出相关资料;2.主修系教务员统计出本系同学里需要参加补考的同学及其相关资料。3.第二学位的接收系的教务员统计出其他系来攻读本系第二学位的同学的中需要参加补考的同学及其相关资料;4.修业期满后,学位办工作人员统计出获得主修专业学位的同学及其相关资料,并且统计出能够获得第二学位的同学及其相关资料,最后统计出不能获得主修专业学位的同学及其相关资料。利用类与继承设计出满足上述要求的类(建立采用类界面和类实现分开的形式),并编出一个模拟程序模拟招生办工作人员、主修系教务员、第二学位接收系教务员和学位管理人员的操作且实现其工作要求。建议:同学可以根据自己的实际情况,从下面几个参考方案选一个方案并且实现之。2第一方案(基本方案):类层次为设全校有10名同学,其中有6位同学攻读第二学位;M为4,N为5;第二方案:类层次为设全校共有12名同学,主修系A,B,C各4名主修学生,各个系均有4名其他系来攻读本系主修专业双学位同学;M为4、N为5(FirstA,FirstB,FirstC分别表示主修系A,B,C);第三方案:类层次为FirstA,FirstB,FirstC分别表示主修系A,B,C;设全校学生人数为SNM(大于0的正整数,现暂时设为20人);设三个主修系主修专业的学生数分别为NA,NB,NC(均为大于0的正整数,而且NA+NB+NC=SUM);设其他系攻读各主修系双学位学生数分别为MA,MB,MC(分别为大于0的正整数,而且MA+MB+MC=SUM);其中,NA,NB,NC可以互不相等;MA,MB,MC也可以互不相等;设M为4,N为5。第四方案:基本情况与第三方案相同,但有以下不同要求:主修系A要求主修课程为SA门(大于0的正整数,暂设为6);主修系B要求主修课程为SB门(大于0的正整数,暂设为7);主修系C要求主修课程为SC门(大于0的正整数,暂设为5);要修A系双学位的同学要求修满A系KA门课程(大于0的正整数,设为5门);要修B系双学位的同学要求修满B系KB门课程(大于0的正整数,设为4门);要修C系双学位的同学要求修满C系KC门课程(大于0的正整数,设为3门);要求有良好的程序结构、程序中加入适当的注释;要求有良好的用户界面。BaseManagSecondFirstBaseFirstBFirstCManagFirstABaseFirstBFirstCManagFirstA3附加要求:题目同上,但数据的获得改为从磁盘文件中获得:1.招生办人员从Basefile.dat中读取学生基本资料;2.主修系教务员从Ffirst.dat中读取学生主修资料(如果用第2,第3,第4方案即分别从FfirstA.dat、FfirstB.dat、FfirstC.dat中读取);3.第二专业(学位)教务员从Second.dat中读取其他系来攻读第二学位的同学的相关资料(如果用第2,第3,第4方案即分别从SecondA.dat、SecondB.dat、SecondC.dat中读取);学生的基本资料格式如下(例):18001chenmin120mathB301(各项代表含义分别为学号、姓名、性别、年龄、主修专业、住址)学生主修专业资料格式如下(例):180018590758687(分别代表学号、各门功课的成绩----此处设为5门)学生第二专业(学位)资料格式如下(例):18001computer68758090(各项代表含义分别为学号、该生主修专业名、攻读第二专业各门课程成绩-----此处设为4门)各项统计所得结果除了显示之外,还应该写到A盘上生成磁盘文件:1.主修系教务员统计出至少3门以上成绩大于等于85分,其余不低于70分的同学及其资料----Gout.dat(如果用第2,第3,第4方案的即分别为GoutA.dat,GoutB.dat,GoutC.dat);2.主修系教务员统计出本系需要参加补考的同学及其相关资料----Bout.dat(若用后3个方案则分别为BoutA.dat,BoutB.dat,BoutC.dat);3.第二学位接收系的教务员统计出修读本系的双专业(双学位)的同学里需要参加补考的同学及其相关资料----SoutA.dat、SoutB.dat、SoutC.dat);4.学位办统计出各个系同学能获得双学位的同学及其相关资料(含主修专业名、成绩、双学位专业名、成绩):Ddouble.dat(若采用后3个方案则分别为DdoubleA.dat、DdoubleB.dat、DdoubleC.dat);5.学位办统计出各系只能获得主学位(不能获得双学位)的同学及其资料:Fpass.dat(若采用后3个方案则分别为FpassA.dat、FpassB.dat、FpassC.dat);6.学位办统计出各主修系中不能获得学位的同学及其相关资料:Npass.dat(若采用后3个方案则分别为NpassA.dat、NpassB.dat、NpassC.dat);其他要求同题目一样。2.解题的基本算法:1)为了提高系统的保密性,一般系统的类定义、类实现和图书系统的运行程序分别存放在三个文件中。但学生学籍管理系统所包含的实现函数过多,将所有函数的实现写入一个文件不利于系统的修改及维护,因此我将实现文件细化为:学生办文件、主修系文件、辅修系文件、管理办文件。2)接下来对三个文件的具体算法的实现进行分析:1.对类定义的头文件的分析:考虑到类与类之间的关系,学生学籍管理系统需要用继承的方式来完成。所以定义类时,需要考虑以下几个问题:①将所有输入输出文件的路径作为常量指针,修改文件或文件路径只需在头文件进行,方便其他实现文件的修改及使用;4②主修类和辅修类的基类是相同,在重复继承中,用平常的方法将会出现两个学生基本资料类,因此我将基类设置为虚基类,全部共用一个基类副本;③主修系和辅修系的数目都不止一个,但却类型相同,每个专业都设置一个类会影响程序会影响程序的通用性,因此使用创建多个类对象来对程序进行编辑;④主修系和辅修系的专业数目可能不同,专业与专业之间的课程数也可能不同;因此在头文件用将其专业数目、课程数目分别存放为不同的常量,以便日后修改;⑤将每个功能分为结点类和链表类来定义,结点类以继承的方式相互连系起来,链表类则实现每个功能模块的具体工作。⑥创建管理结点类,从其他类继承的禁止访问部分功能的函数需要屏蔽。因此该文件包括学生基本资料类,主修类,辅修类和管理类四大方面。1)学生基本资料类:结点类:包括学生学号、姓名、性别、年龄、主修专业、地址;链表类:包括创建链表、打印链表、返回头指针等函数;2)主修类:结点类:除了从学生资料基本资料结点类中继承过来的数据成员,还包括课程分数、课程数目和成绩情况;链表类:包括创建链表、打印链表、设置分数、判断成绩情况、打印优秀学生名单、打印补考学生名单等函数;3)辅修类:结点类:除了从学生资料基本资料结点类中继承过来的数据成员,还包括课程分数、课程数目和成绩情况;链表类:包括创建链表、打印链表、设置分数、判断成绩情况、打印补考学生名单等函数;4)管理类:结点类:除了从主修类和辅修类继承过来的数据成员,还包括主修专业名、辅修专业名和获得学位的情况;链表类:包括创建链表、打印链表、打印双学位学生资料、打印单学位学生资料、打印得不到学位学生资料等函数对类实现的源文件进行分析:根据①对类定义的分析,类实现的文件大体需要实现上述四个类的成员函数(为了增加程序的实用性及减少人为的工作量,该程序采用文件流的方式输入输出数据资料):①学生基本资料类Base结点类:只需定义一个构造函数对受保护的数据成员初始化及对受护数据的访问函数;链表类:需要创建学生基本资料库和打印学生基本资料的函数,与创建链表和打印链表的函数类似,这里不展开说明;②主修类First结点类:继承虚基类Base,考虑主修专业课程数的差异及方便统计学生成绩的情况,添加了主修课程的分数、主修课程数目及学生成绩情况,因此不止需要定义一个构造函数对受保护的数据成员初始化及对受保护数据的访问函数,还要设置分数的函数和判断成绩情况函数;判断成绩情况的函数:对初始化后每个学生的主修专业分数的优秀、及格、不及格的条件进行比较,记录成绩所属的类型;链表类:创建学生主修专业资料库:引入初始化好的学生基本资料5链和本主修专业名,遍历链表,根据学生的主修专业名,将与引入的本主修专业同名的学生资料作为该主修类的学生资料的数据,创建新的本主修专业的链表;打印学生主修专业资料的函数:与打印链表的函数类似;设置分数的链表:遍历主修专业链,对链表中结点的主修专业分数进行初始化;设置分数的链表:遍历主修专业链,对链表中结点的主修专业分数进行初始化并调用判断成绩情况的函数对成绩类型初始化;输出优秀学生资料的函数:遍历主修专业链,判断每个学生成绩所属的类型,与打印链表的函数类似输出满足优秀条件的学生的主修专业资料;输出补考学生资料的函数:遍历主修专业链,判断每个学生成绩所属的类型,与打印链表的函数类似输出满足补考条件的学生的主修专业资料;③辅修类Second结点类:继承虚基类Base,考虑辅修专业课程数的差异及方便统计学生成绩的情况,添加了辅修课程的分数、辅修课程数目及学生成绩情况,因此不止需要定义一个构造函数对受保护的数据成员初始化及对受保护数据的访问函数,还要设置分数的函数和判断成绩情况函数;判断成绩情况的函数:对初始化后每个学生的辅修专业分数与优秀、及格、不及格的条件进行比较,记录成绩所属的类型;链表类:创建学生辅修专业资料库:引入初始化好的学生基本资料链和本辅修专业名,打开记录对应辅修专业学生名单(由于提供的资料没有单纯对辅修学生名单的记录,因此使用了初始化分数所用文件的第一个数据,即学生学号进行判断)