




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中南大学面向对象编程C+课程设计报告题 目 研究生成绩管理系统 学生姓名 神孟秋 指导教师 学 院 信息科学与工程学院_ 专业班级 计算机科学与技术1604 二一七 年 十 月目 录1.课程设计内容32.课程设计目的43.背景知识 44.工具/准备工作45.设计步骤、方法等45.1.步骤1:相关类的定义,重载75.2.步骤2:单链表相关函数135.3.步骤3:文件操作函数的声明与定义225.4.步骤4:统计函数的声明与定义265.5.步骤5:菜单函数的书写285.6.步骤6:登录界面(密码),欢迎界面的实现316.设计结果及分析327.设计结论与感想398.对本设计过程及方法、手段的改进建议399.参考文献40程序设计基础实践报告1. 课程设计内容该课程是C+编程和数据结构课程学习内容的重要实践环节,其主要目的在于通过综合程序课程设计,培养和提高学生的独立分析问题、解决实际问题的能力和计算机语言编程能力。运用Visual C+环境,用数据结构、面向对象程序设计思想进行程序设计、功能模块调试,完成相关设计题所规定的任务、撰写课程设计报告。设计一个研究生基本信息管理,实现对不同学制的研究生包括:学术硕士和工程硕士的信息管理。定义一个基本的研究生类,基本信息包括:学号、姓名、性别、年龄、课程成绩。派生出学术硕士类,增加的属性包括:专业,发表论文(名称与级别(1、2、3),可以多篇,最多3篇),论文成绩,总成绩;工程硕士增加的属性包括:领域,参与项目(名称与级别(A,B,C,),项目成绩,总成绩。计算方式如下1) 学术硕士论文成绩计算:各个级别的论文得分为:级别*10,每个学生论文最高90分;假设某研究生发表两篇论文,级别分别为1、2,那么论文成绩=(10/90+20/90)*100,总成绩=课程成绩*0.7+论文成绩*0.3;2) 工程硕士项目成绩计算:每个学生只参与一项项目,各个级别得分:A级90,B级75,C级60,不参与项目得分为0;总成绩=课程成绩*0.5+项目成绩*0.5基本功能与技术要求:1、 数据文件管理功能:创建新文件、打开文件、保存文件。2、计算与统计功能:完成记录中相关数据的统计;1)能够打开已存在的数据表文件,对数据表中与某关键字匹配的相关记录进行数据统计(包括:总数、平均值、分段信息),例如:按总成绩得分为100、9099、8089、7079、6069和不及格学生的人数,以及所占百分比。2)计算每个研究生的总成绩。3、记录管理功能:记录的管理采用链表或者指针数组实现。1)输入添加/插入记录,并保存到数据文件中。2)查询、显示记录,根据用户要求按所给记录关键字查询一个或多个相关联记录的各项信息。3)修改记录:能够打开已存在的数据表文件,并对确定的任意记录进行修改,在修改过程中,应显示记录信息,给出确认提示,并对更新的记录信息进行文件保存。4)删除记录:能够打开已存在的数据表文件,可以删除数据表中的任一记录,要求具备逻辑删除(具有恢复功能)和物理删除功能,并对新的数据表信息进行文件保存。2. 课程设计目的课程设计是学习过程的重要环节。通过课程设计,能够进一步加深对C+语言基本知识的理解,提高C+语言综合编程能力与程序调试技巧,为后续课程的学习以及实际问题的解决打下良好的基础。更好的理解以下内容:算法的基本概念;使用常量、变量、运算符与表达式、程序控制结构、数组、函数、编译预处理、指针、类和对象的特征、正确使用类和对象、运算符重载、继承与派生、多态性与虚函数、输入输出流文件操作等C+语言要素进行程序设计;在一种C+语言开发环境下进行C+程序设计的基本步骤。3. 背景知识 C+是近年来国内外广泛使用的现代计算机语言,它既支持基于过程的程序设计,也支持面向对象的程序设计,属高级语言范畴。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序,代码清晰精简,十分灵活,作为计算机的基础课程,我们应熟练掌握。4. 工具/准备工作自主学习C+语言中输入输出流文件操作相关知识,温习C+语言知识,操作软件Visual Studio 2017。5. 设计步骤、方法等思路:首先,仔细阅读课程设计题目的具体要求(这点很关键),先写出自己的思路,如何实现各个功能,然后就是分几个大块敲代码,每完成一个函数功能,去调试运行,如果能运行的话说明这块函数大体应该是没有问题了,可以进入下一模块的书写,否则这段代码没有通过。第一次进入:登录界面输入两类研究生相关数据退出函数exit(0)之后进入:登录界面菜单界面6.信息查找2.信息插入3.信息删除4.信息输出5.信息修改7.信息统计8.退出函数9.初始化该系统1.信息录入模块的书写构建顺序:1. 进行类的定义,基类研究生,派生类学术研究生和工程研究生,类中变量的声明,进行重载,使之能够实现cin cout 的输入和输出。2. 进行单链表操作的函数的书写,使之能够对两类派生研究生进行链表的建立、输出、插入、修改、删除等基本操作。3. 进行相关文件的操作函数的声明与定义,使程序能够对缓存中的数据读到磁盘中,也可以将磁盘中的数据读取到内存中。4. 统计函数的书写,这部分用到了静态变量和静态函数,程序可以实现基本的统计功能。5. 菜单函数的书写,这部分就是美观,简单大方,cout语句进行图形绘制即可,比较容易。6. 密码,欢迎界面的实现:使程序更加美观,也能够填写正确的用户名和口令方可进入系统。 1-2-3-4-5-6下面进行代码的说明:5.1. 步骤1:相关类的定义,重载 这部分对于整个代码来说相对比较简单,运用c+对类的定义,类中数据成员的声明,重载函数的使用即可实现,这里我着重说明一下重载部分,以学术硕士的重载为例(其他相似),重载的过程中输出语句要尽可能的美观,而输入语句的话,我想要能够对用户的误操作进行处理,因为学号为0是退出录入,所以当用户输入0时,if判断语句判断是否为0,若为零,return input结束函数,其他比如说成绩,等级的输入都有限定,同理,if语句判断,若为真,配合goto语句回到输入数据前,重新输入,这么做的好处,用户一旦输入错误一个数据,马上会令用户重新输入(个人认为,相对于一些作品,等待用户将其全部数据输入之后,每个数据进行判断,若有一个不符和要求,即不录入数据好一些),其中浮点型数据的判断比较关键(不能准确的保存数据,判断浮点型数据是否=一个固定的值需要调用fabs函数实现),还有,在输入的过程中有一些数据是通过计算得到,这样的数据我在用户输入一些必要的数据后就会进行赋值,调用计算函数计算赋值,用户一旦输入完毕,相关值便赋值给该对象的数据域。但是也是有缺点的,goto语句用的偏多,这点不利于程序的稳定性,应努力加强。源代码(部分):/重载函数(派生类:学术硕士)istream& operator(istream &input, academicGraduateStudent &astu)cout astu.num;if (astu.num = 0)return input;cout ;loopse:cout astu.sex;/判断性别是否合法if (!(astu.sex = 男 | astu.sex = 女)cerr 性别输入有误,请重新输入! endl;goto loopse;cout astu.age;loopc:cout astu.courseScore;if (astu.courseScore 100)cerr 课程成绩输入有误,请重新输入! endl;goto loopc;cout astu.major;looppn:cout 发表论文篇数: astu.paperNumber;if (!(astu.paperNumber 0)cerr 输入有误,论文篇数范围1 - 3 = 1)cout astu.apaper.paper1;loopff:cout astu.apaper.paperLevel1;/判断级别是否合法if (!(astu.apaper.paperLevel1 = 1 | astu.apaper.paperLevel1 = 2 | astu.apaper.paperLevel1 = 3)cerr 输入的级别有误(级别为1 2 3),请重新输入! endl;goto loopff;loopf:cout astu.apaper.paper1Score;/判断分数是否合法if (astu.apaper.paper1Score 90)cerr 输入的分数一有误,请重新输入! = 2)cout astu.apaper.paper2;loopss:cout astu.apaper.paperLevel2;if (!(astu.apaper.paperLevel2 = 1 | astu.apaper.paperLevel2 = 2 | astu.apaper.paperLevel2 = 3)cerr 输入的级别有误(级别为1 2 3),请重新输入! endl;goto loopss;loops:cout astu.apaper.paper2Score;if (astu.apaper.paper2Score 90)cerr 输入的分数二有误,请重新输入! = 3)cout astu.apaper.paper3;looptt:cout astu.apaper.paperLevel3;if (!(astu.apaper.paperLevel3 = 1 | astu.apaper.paperLevel3 = 2 | astu.apaper.paperLevel3 = 3)cerr 输入的级别有误(级别为1 2 3),请重新输入! endl;goto looptt;loopt:cout astu.apaper.paper3Score;if (astu.apaper.paper3Score 90)cerr 输入的分数三有误,请重新输入! endl;goto loopt;cout 论文成绩:;astu.paperScore = astu.calculatePaperScore();cout astu.paperScore endl;cout 总成绩:;astu.sumScore = astu.calculateSumScore();cout astu.sumScore endl;return input;class graduateStudentpublic:graduateStudent() ;/构造函数graduateStudent() ;/析构函数protected:int num;/学号string name;/姓名string sex;/性别int age;/年龄float courseScore;/课程成绩;/学术硕士class academicGraduateStudent:public graduateStudentpublic:academicGraduateStudent *paNext;/定义一个指针,链表操作academicGraduateStudent() apaper.paper1Score = 0.0;apaper.paper2Score = 0.0;apaper.paper3Score = 0.0;apaper.paperLevel1 = 0;apaper.paperLevel2 = 0;apaper.paperLevel3 = 0;/构造函数academicGraduateStudent() ;/析构函数int getNum()const return num; /获取学号string getName()const return name; /获取姓名float calculatePaperScore();/计算论文分数float calculateSumScore();/计算总成绩/重载函数friend ostream& operator(istream&, academicGraduateStudent&);/统计函数static void statisticalData(academicGraduateStudent*);protected:static float sumAcademicScore;/学术硕士全体总成绩static int countAcademicNumber;/学术硕士总人数static float averageAcademicScore;/学术硕士平均成绩static int a6;/学术硕士总分分段人数string major;/专业struct paper/发表论文string paper1;float paper1Score;int paperLevel1;string paper2;float paper2Score;int paperLevel2;string paper3;float paper3Score;int paperLevel3;apaper;/apaper代表的是academicGraduateStudent的paperint paperNumber;/发表的论文数float paperScore;/论文成绩float sumScore;/总成绩;/工程硕士class engineeringGraduateStudent :public graduateStudentpublic:engineeringGraduateStudent *peNext;/定义一个指针,链表操作engineeringGraduateStudent() ;/构造函数engineeringGraduateStudent() ;/析构函数int getNum()const return num; /获取学号string getName()const return name; /获取姓名float calculateSumScore();/计算总分数 /重载函数friend ostream& operator(istream&, engineeringGraduateStudent&);/统计函数static void statisticalData(engineeringGraduateStudent*);protected:static float sumEngineeringScore;/工程硕士全体总成绩static int countEngineeringNumber;/工程硕士总人数static float averageEngineeringScore;/工程硕士平均成绩static int e6;/学术硕士总分分段人数string field;/领域struct project/参加项目string pName;/项目名称char pLevel;/项目等级A,B,Ceproject;float projectScore;/项目成绩float sumScore;/总成绩;5.2. 步骤2:单链表相关函数这一块代码的书写我的思路:因为有两类派生研究生,而文件操作需要的是告诉计算机字节数的读取,所以,建立两个单链表,分别对学术,工程类的研究生进行操作,链表的优势确实比数组好,可以说,链表就是一个动态的数组,链表的书写过程中是我又复习了一遍上学期学的知识,更加加深了头结点的关键作用(头结点中数据域是没有用的,只有指针域有用),我将两个头结点均声明为全局变量,方便函数的调用使用,下面展示学术类的源代码,工程类的同理。源代码(部分):/学术类研究生普通函数的定义academicGraduateStudent* seekAcademicData(academicGraduateStudent *head)/查找某个学术研究生数据if (head-paNext = NULL)/判断缓存中是否有数据cerr 错误代码:0x123458! endl;cerr 异常错误!(请上报管理员处理) endl;system(pause);exit(0);loop:cout 学号(1), 姓名(2)? i;if (!(i = 1 | i = 2)cerr 输入有误,请重新输入! paNext;int targetNum;string targetName;switch (i)case 1:loopnu:cout 请输入学号: targetNum;while (p-getNum() != targetNum)p = p-paNext;if (p = NULL)cerr 没有这个数据!请重新输入! endl;goto loopnu;return p;break;case 2:loopna:cout 请输入姓名: targetName;while (p-getName() != targetName)p = p-paNext;if (p = NULL)cerr 没有这个数据!请重新输入! endl;goto loopna;return p;break;default:cerr 错误代码:0x123459! endl;cerr 异常错误!(请上报管理员处理) endl;system(pause);exit(0);academicGraduateStudent* inputAcademicData(academicGraduateStudent *head)/录入学术研究生数据academicGraduateStudent *p, *q;p = q = new academicGraduateStudent;if (p = NULL | q = NULL)/申请内存失败操作cerr 错误代码:0x123456! endl;cerr 异常错误!(请上报管理员处理) endl;system(pause);exit(0);cout 开始录入数据(学号为零时结束) *p;cout 录入成功! getNum() != 0 )if (i = 1)head-paNext = p;elseq-paNext = p;q = p;p = new academicGraduateStudent;if (p = NULL)/申请内存失败操作cerr 错误代码:0x123457! endl;cerr 异常错误!(请上报管理员处理) *p;p-getNum();if (p-getNum() != 0)cout 录入成功! endl;elsecout 录入结束! paNext = NULL;return head;academicGraduateStudent* insertAcademicData(academicGraduateStudent *head)/插入某个学术研究生数据if (head-paNext = NULL)/判断缓存中是否有数据cerr 错误代码:0x123458! endl;cerr 异常错误!(请上报管理员处理) endl;system(pause);exit(0);academicGraduateStudent *p, *q;cout 请输入一个新的数据(学术研究生) endl;p = new academicGraduateStudent;if (p = NULL)cerr 错误代码:0x123458! endl;cerr 异常错误!(请上报管理员处理) *p;cout 录入成功! endl;cout 请输入插入在哪个数据之后? paNext = q-paNext;q-paNext = p;return head;academicGraduateStudent* delAcademicData(academicGraduateStudent *head)/删除某个学术研究生数据if (head-paNext = NULL)/判断缓存中是否有数据cerr 错误代码:0x123458! endl;cerr 异常错误!(请上报管理员处理) endl;system(pause);exit(0);academicGraduateStudent *p, *q;loop:cout 学号(1), 姓名(2)? i;if (!(i = 1 | i = 2)cerr 输入有误,请重新输入! paNext;q = head;int targetNum;string targetName;switch (i)case 1:loopnu:cout 请输入学号: targetNum;while (p-getNum() != targetNum)q = p;p = p-paNext;if (p = NULL)cerr 没有这个数据!请重新输入! endl;goto loopnu;break;case 2:loopna:cout 请输入姓名: targetName;while (p-getName() != targetName)q = p;p = p-paNext;if (p = NULL)cerr 没有这个数据!请重新输入! endl;goto loopna;break;default:cerr 错误代码:0x123459! endl;cerr 异常错误!(请上报管理员处理) endl;system(pause);exit(0);i = 0;loopq:cout 是否确定删除?是(1), 否(2) i;if (i = 1)q-paNext = p-paNext;else if (i = 2)cerr 取消成功! endl;elsecout 输入有误,请重新输入! paNext;if (head-paNext = NULL)cerr 错误代码:0x156456(链表中无数据) endl;cerr 请联系管理员处理! endl;system(pause);exit(0);while (p != NULL)cout *p paNext;return;void modifyAcademicData()/修改学术研究生的数据academicGraduateStudent *p, *q;p = seekAcademicData(aHead);q = new academicGraduateStudent;q-paNext = p-paNext;if (q = NULL)cerr 错误代码0x156112 endl;cerr 请联系管理员解决! *q;int i = 0;loop:cout 是否确定修改 是(1), 否(2)? i;if (i = 1)*p = *q;cout 修改成功 endl;else if (i = 2)cout 取消成功! endl;delete q;elsecerr 输入有误, 请重新输入! paNext;ofstream outfile(AcademicStudentData.txt, ios:out);if ( !outfile )cerr 文件打开失败! endl;cerr 错误代码0x125158 endl;cerr 请联系管理员处理 endl;system(pause);exit(0);while (p != NULL)outfile paNext;outfile.close();/建立一个dat二进制文件,方便以后读取p = head-paNext;/重新赋值ofstream outfiled(AcademicStudentData.dat, ios:out|ios:binary);if (!outfiled)cerr 文件打开失败! endl;cerr 错误代码0x125158 endl;cerr 请联系管理员处理 paNext;outfiled.close();return;/读取磁盘数据到内存academicGraduateStudent* getAcademicStudentData(academicGraduateStudent *head)/获取磁盘中学术研究生数据到缓存loop:ifstream infile(AcademicStudentData.dat, ios:in | ios:binary);if (!infile)cerr 欢迎您第一次使用该系统,您首先要做的录入数据! endl;cerr 警告:如果您不是第一次使用该系统,错误代码0x125158(请联系管理员处理) endl;firstInputData();saveStudentData();exit(0);goto loop;infile.seekg(0, ios:beg);/重置指针的位置academicGraduateStudent *p, *q;p = q = new academicGraduateStudent;if (p = NULL | q = NULL)/申请内存失败操作cerr 错误代码:0x123456! endl;cerr 异常错误!(请上报管理员处理) paNext = p;elseq-paNext = p;q = p;p = new academicGraduateStudent;if (p = NULL)/申请内存失败操作cerr 错误代码:0x123457! endl;cerr 异常错误!(请上报管理员处理) paNext = NULL;infile.close();return head;/追加函数void addAcademicStudentData(academicGraduateStudent *head)/追加学术研究生数据/建立一个txt.dat文件academicGraduateStudent *p = head-paNext;academicGraduateStudent *q = NULL;if (p = NULL)cerr 错误代码0x1566(链表 缓存中无数据) endl;cerr 请联系管理员处理! endl;system(pause);exit(0);ofstream outfile(AcademicStudentData.txt, ios:app);if (!outfile)cerr 文件打开失败! endl;cerr 错误代码0x125158 endl;cerr 请联系管理员处理 endl;system(pause);exit(0);ofstream outfiled(AcademicStudentData.dat, ios:app);if (!outfiled)cerr 文件打开失败! endl;cerr 错误代码0x125158 endl;cerr 请联系管理员处理 paNext;/寻找完毕cout 开始添加! endl;q = inputAcademicData(q);while (q != NULL)outfile paNext;cout 添加成功 paNext = NULL)cerr 错误0x4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业零售店租赁经营合同协议
- 酒店管理与服务合同协议书
- 广东自考考试试卷及答案
- 2025年新疆特色果树制种合同
- 2025年新材料研发行纪合同协议书
- 2025年轨道交通信号工(高级技师)资格考试题库(带答案)
- 2025年广西专业技术人员继续教育公需科目科目考试及答案
- 护理部礼仪考试题及答案
- 客户服务响应流程优化管理工具
- 入团笔试题型及答案大全
- 腹直肌分离康复(产后康复课件PPT)
- 聚合物成型的理论基础课件
- 药监系统官方培训06细菌内毒素方法介绍-蔡彤
- 慢性中耳炎的并发症课件
- 灭火器每月定期检查及记录(卡)表
- 千米、分米和毫米的认识单元备课
- 药品生产质量管理工程完整版课件
- 人工智能(AI)在人力资源领域的应用与展望
- GB∕T 29169-2012 石油天然气工业 在用钻柱构件的检验和分级
- 重大医疗事件报告及处理制度
- 公铁两用大桥连续刚构专项施工测量实施方案
评论
0/150
提交评论