1、C+语言程序设计实验报告中南大学二一二二一三学年第二学期信息科学与工程学院计算机与程序设计语言课程设计报告课程名称: 计算机与程序设计语言 班 级: 电气工程2012级 07 班 学 号: 0909120722 姓 名: 周雅玲 指导教师: 向 遥 二一三年 六 月目 录 一、设计要求*P1二、系统描述*P3三、功能模块结构*P4四、主要模块的算法说明*P15五、运行结果*P16六、课程设计总结*P24七、参考文献*P26八、附录*P27 一、设计要求(小型学生成绩管理系统)1、需要处理的基础数据 学生基本信息:如班级、学号、姓名、性别、年龄、宿舍号码、电话号码等。 学生选修课程的基本信息:课
2、程编号、课程名称、考试成绩、平时成绩、综合成绩、学分、重修否等。2、系统的基本功能 数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息; 数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息; 数据的插入:插入某个学生信息; 数据的查询:如按学号查询、按姓名查询等; 数据的删除:如删除指定学号、或者指定姓名的学生及其选修课程信息; 平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息; 考虑用文件把数据保存起来(可选)。 二、系统描述1、小型学生成绩管理系统开发设计思想 因为学生的基本信息内容较多,故定义一个Student 类
3、装学生的这些信息,而要求实现的录入增添修改删除查找等功能均会用到录入的学生的基本信息,于是考虑到用链表指针来一一查找,避免了多次重复的输入;并在Student类中定义Input() 和 Show()函数便于后面链表的使用。各功能函数均放在Studentmessage类中,使结构显得更加清晰明了。该程序用到了多态性的重载,构造函数和析构函数等。该系统主要包含三个方面:1、 操作 操作方面则有数据的输入、增添、修改和删除四个内容。2、查询 查询部分则包括按姓名,按学号查询。3、排名 排名部分则是按平均成绩从高到低排序输出学生信息。4、保存 保存所输入、增添、修改、删除等的学生信息。 输入按学号 操
4、 作按姓名 修改 增添2、流程图按姓名 删除 小型学生成绩管理系统 按姓名 查 询按学号 按平均成绩由高到低 排 名 按学号 保 存 退出系统三、 功能模块结构1、操作模块: (1)/*输入模块/ Input()是输入学生成绩信息的函数,在Student类中定义。 输入模块的功能是创建存储学生成绩信息的档案存储系统。其中的信息包括学生的班级、姓名、学号、性别、年龄、宿舍号码、电话号码、C+学分、C+平时成绩、C+考试成绩、C+综合成绩、数学学分、数学平时成绩、数学考试成绩、数学综合成绩、英语学分、英语平时成绩、英语考试成绩、英语综合成绩。 void Input() coutname; cout
5、Id; coutbanji; coutsex; coutold; coutroomnumber; couttelephonenumber; coutxuefen1; coutCnum1; coutCnum2; couttt请输入C+课程的综合成绩:; Cnum=Cnum1*0.3+Cnum2*0.7; coutCnumendl; if(Cnum60) coutttC+课程重修endl; coutxuefen2; coutMnum1; coutMnum2; couttt请输入数学课程的综合成绩:; Mnum=Mnum1*0.3+Mnum2*0.7; coutMnumendl; if(Mnum60
6、) couttt数学课程重修endl; coutxuefen3; coutEnum1; coutEnum2; couttt请输入英语课程的综合成绩:; Enum=Enum1*0.3+Enum2*0.7; coutEnumendl; if(Enum60) couttt英语课程重修Input(); End-Next=new Student; End=End-Next; cout添加成功!endl; cout输入任意字符!继续; getch(); (3)/*修改模块*/ Motify()是用于修改学生成绩信息的函数。在菜单上按2进入该系统,该系统主要有两部分:一是按照姓名修改信息,二是按照学号修改信
7、息。实现这两个功能主要是利用指针和switch结构。首先使定义空指针p,然后根据是按姓名修改还是按学号修改,使p指向姓名或学号的地址,再利用链表一直使指针指到输入函数Input(),再依次修改。void Studentmassage:ModifyItem() /定义修改模块 char name20 ,Id10; int x; Student * p=NULL; coutntt*n; couttt 1.按学生的姓名修改ntt 2.按学生的学号修改; coutx; switch(x) case 1:coutname; if(p=FindItem(name) p-Next-Input(); cout
8、修改成功!endl; cout输入任意字符!继续; getch(); else couttt没有找到该姓名的学生!nendl; cout输入任意字符!继续; getch(); break; case 2: coutId; if(p=FindID(Id) p-Next-Input(); cout修改成功!endl; cout输入任意字符!继续; getch(); else couttt没有找到!nendl; cout输入任意字符!继续; getch(); break; (4)/*删除模块*/ Remove Item()是删除学生成绩信息的函数,可以根据学生姓名或学号来找出其基本信息,当无法找到时
9、,便会在屏幕上显示出错。在主菜单中输入2进入该系统。这一部分其实与修改部分相差不大。也用到了指针和Switch结构,不同的是在删除模块中,增加定义了一个指针temp,该指针的作用是指向所要删除的对象,然后用delete删除其地址。void Studentmassage:RemoveItem() /删除模块 char name20 ,Id10; int x; Student * p=NULL,*temp=NULL; coutntt*n; couttt 1.按学生的姓名删除ntt 2.按学生的学号删除; coutx; switch(x) case 1: couttt请输入要删除的学生的姓名:nam
10、e; if(p=FindItem(name) temp=p-Next; p-Next=p-Next-Next; delete temp; couttt删除成功!endl; cout输入任意字符!继续; getch(); else couttt没有找到!endl; cout输入任意字符!继续; getch(); break; case 2: coutId; if(p=FindID(Id) temp=p-Next; p-Next=p-Next-Next; delete temp; cout修改成功!endl; cout输入任意字符!继续; getch(); else couttt没有找到!nend
11、l; cout输入任意字符!继续; getch(); break; 2、查询模块: 在菜单中输入4进入查询系统。该系统主要功能是通过选择是按姓名或是是按学号来查找该学生的所有信息并显示在屏幕上。主要思想与修改、删除的思想是一致的,通过指针指向该学生信息的地址,再通过Show()函数输出来。 void Studentmassage:Find() /定义查找部分 char name20 ,Id10; int x; Student * p=NULL; coutntt*n; couttt 1.按学生的姓名查找ntt 2.按学生学号查找; coutx; switch(x) case 1:coutname
12、; if(p=FindItem(name) p-Next-Show(); cout输入任意字符!继续; getch(); else couttt没有找到该姓名的学生!nendl; cout输入任意字符!继续; getch(); break; case 2: coutId; if(p=FindID(Id) p-Next-Show(); cout输入任意字符!继续; getch(); else couttt没有找到该学号的学生!nendl; cout输入任意字符!继续; getch(); break; 3、 排序模块: 该模块算是这个系统中较为复杂的部分。在主菜单中通过输入6进入该系统。此部分运用
13、的是链表的知识,先统计当前系统链表记录的总数,再通过该总数来判定是否进行比较排序,定义p,k两个指针,k指向的对象是p指向对象的后一位,再通过链接到两对象的平均分,通过比较平均分再进行交换两变量的数据域。为实现交换数据域这一功能,定义Student类的两个对象指针p1、p2及中间指针temp来用于p1,p2数据交换。 void Studentmassage:Sort()/对当前链表进行排序 排序模块 cout Sorting.endl; Student *p=NULL,*p1=NULL,*k=NULL; int n=Studentmassage:ListCount(); if(nNext;p!
14、=End;p=p-Next) for(k=p-Next;k!=End;k=k-Next) if(p-avek-ave) Studentmassage:Swap(p,k); cout 排序完成!Next;p!=End;p=p-Next) n+; return n; void Studentmassage:Swap(Student *p1, Student *p2)/交换两个combox变量的数据域 Student *temp=new Student; strcpy(temp-name,p1-name); strcpy(temp-Id,p1-Id); strcpy(temp-sex,p1-sex)
15、; strcpy(temp-roomnumber,p1-roomnumber); strcpy(temp-telephonenumber,p1-telephonenumber); temp-banji=p1-banji; temp-old=p1-old; temp-xuefen1=p1-xuefen1; temp-xuefen2=p1-xuefen2; temp-xuefen3=p1-xuefen3; temp-Cnum1=p1-Cnum1; temp-Cnum2=p1-Cnum2; temp-Cnum=p1-Cnum; temp-Mnum1=p1-Mnum1; temp-Mnum2=p1-M
16、num2; temp-Mnum=p1-Mnum; temp-Enum1=p1-Enum1; temp-Enum2=p1-Enum2; temp-Enum=p1-Enum; temp-sum=p1-sum; temp-ave=p1-ave; strcpy(p1-name,p2-name); strcpy(p1-Id,p2-Id); strcpy(p1-sex,p2-sex); strcpy(p1-roomnumber,p2-roomnumber); strcpy(p1-telephonenumber,p1-telephonenumber); p1-banji=p2-banji; p1-old=p
17、2-old; p1-xuefen1=p2-xuefen1; p1-xuefen2=p2-xuefen2; p1-xuefen3=p2-xuefen3; p1-Cnum1=p2-Cnum1; p1-Cnum2=p2-Cnum2; p1-Cnum=p2-Cnum; p1-Mnum1=p2-Mnum1; p1-Mnum2=p2-Mnum2; p1-Mnum=p2-Mnum; p1-Enum1=p2-Enum1; p1-Enum2=p2-Enum2; p1-Enum=p2-Enum; p1-sum=p2-sum; p1-ave=p2-ave; strcpy(p2-name,temp-name); st
18、rcpy(p2-Id,temp-Id); strcpy(p2-sex,temp-sex); strcpy(p2-roomnumber,temp-roomnumber); strcpy(p2-telephonenumber,temp-telephonenumber); p2-banji=temp-banji; p2-old=temp-old; p2-xuefen1=temp-xuefen1; p2-xuefen2=temp-xuefen2; p2-xuefen3=temp-xuefen3; p2-Cnum1=temp-Cnum1; p2-Cnum2=temp-Cnum2; p2-Cnum=tem
19、p-Cnum; p2-Mnum1=temp-Mnum1; p2-Mnum2=temp-Mnum2; p2-Mnum=temp-Mnum; p2-Enum1=temp-Enum1; p2-Enum2=temp-Enum2; p2-Enum=temp-Enum; p2-sum=temp-sum; p2-ave=temp-ave; 4、 保存模块: 这个模块存在于上面各模块中,主要用到文件的相关知识:out.open 和out.close用于文件打开关闭。同样利用Student类的指针p指向所有相关的学生成绩信息。 void Studentmassage:Save() /保存模块 out.open(
20、sort.txt); for(Student *p=Head-Next;p!=End;p=p-Next) outnametIdtbanjitsextoldtroomnumberttelephonenumbertxuefen1txuefen2txuefen3t Cnum1t Cnum2tCnumtMnum1tMnum2tMnumtEnum1tEnum2tEnumtsumtaven; out.close(); 四、主要模块的算法说明 本程序设计的主要思路是:定义两个类,一个类中包含学生的信息及输入显示函数,另一个类中包含着实现各种功能的函数。在实现各种功能时,均利用指针链表重复使用输入或显示函数,
21、使程序显得简洁易懂。 输入部分:定义Input()函数将学生信息全都包含进去,并将输入部分定义在Student类中。 显示部分:定义Show()函数输出学生信息,并判断是否需要重修,同样定义在Student类中。 修改模块:根据按姓名或按学号修改,使用指针找到对应的姓名或学号,如果没有对应的则显示错误,有的话使用链表对应着学生的信息一个接一个修改下去。 查询模块:与修改模块的思想是一致的。 删除模块:主要是需要定义另外一个指针,使用delete进行删除,找到学生信息的方法与修改、查询模块的思路是一样的。 排序模块:该模块是利用链表进行排序。先统计当前链表纪录的总数,当总数大于2时,进行指针之间
22、的比较,按平均成绩由小到大排,然后进行变量数据域之间的交换,即定义两个Student类的指针P1,P2及temp,先将P1所指向对象的信息赋给temp,再将P2所有的信息赋给P1,最后将temp中所有的信息赋给P2,这样实现了数据域之间的交换。 保存模块:定义Save()函数,利用文件out.open和out.close。 五、运行结果开始界面:主菜单输入学生信息:再次输入学生信息:有不及格科目会提示重修显示所输入的学生的所有信息:进入查询系统:(按姓名、学号查询)进入修改学生成绩系统:(按姓名、学号修改)对所输入的学生进行排序:显示排序后的信息:进入删除学生信息系统:(按姓名、学号删除)删除
23、后还有的学生成绩信息:按学号删除信息: 六、课程设计总结(1)调试过程中的问题及解决办法 对主函数所涉及的各个模块进行编程,将各个模块利用指针和链表联系起来。在环境中进行调试,我的问题便是设计好了之后直接输入了全部的代码,一次性调试,发现了很多错误,并且花了很长时间找出和修改。解决方法:应一边编译,一边调试,一个模块一个模块的调试。直至此模块完全没有错误时,再进入下一模块的调试。 设计过程中,不应忽视环境提示的警告。有时程序运行不正确与警告也有很大的关系。这次设计中遇到很多问题都是提示类型不匹配,这时就要认真检查前面的代码,及时改正并且认真仔细。 在编辑完整个程序后,进行调试阶段总是会显示he
24、ad无定义。解决办法:在类的定义时声明指针Student *Next;在声明各功能函数时,使head=new Student. 之前的程序是建立了一个新文件,当实现删除、修改功能时,新文件未能覆盖旧文件。 解决方法:先定义Readfile()函数,用于读文件,该文件中包含学生的基本信息。在显示模块中,利用in.eof()在文件中查找,使指针指向Readfile()依次按照输入的学生来查找直到找到了符合的学生再用in.close关闭文件,最后显示出来。(2)心得体会 通过此次小型学生成绩管理系统的设计,使我对+程序设计有了深一步的了解,加深了对类、对象、指针、链表的认识,对系统设计及开发有了比较
25、全面的思路。刚开始拿到题目的时候觉得要设计的内容好多,不知道从哪里入手,后来我仔细审题,按以下步骤进行设计:(1) 通过对系统进行需求分析,确定各个功能函数;(2) 一个个具体地对他们进行编程,并且仔细检查看是否有错;(3) 在完成这一步之后才开始构造主函数,通过主函数把各个功能函数联系起来,编译修改错误和不足之处。 因为此次的系统要用到类的知识,于是我考虑把学生的基本信息装入一个Student类,把实现各个功能的函数装入另外一个Studentmessage类。充分利用指针和链表,避免删除、修改、查询部分对学生基本信息的重复书写。并在Student类中定义了Input()和Show(),就是为
26、了在实现各个功能时可以多次指向它们,使程序显得更加简洁明了。稍微复杂一点的是排序部分,这个部分主要是统计输入的学生人数,再利用链表排序,按平均成绩对这些学生进行排序。可以适用于两个以上的学生成绩之间的比较。 在实际编程过程中会遇到很多不同的错误,有时候是一些很明显很细节的语法错误,如定义一个类后要加分号,这些可以通过编译来查找错误的所在,然而那些并不明显难以查找的隐性错误却真让人头痛,记得我用Switch结构用于按姓名还是按学号查询时,因为涉及到case及for循环,有时候经常忘记加入,导致了很多错误,没有办法只好利用断点调试来一步步检查代码中的错误,这样为了找一个错误花费了大量的时间,但是找
27、出错误之后的感觉却是非常好的,给了我一个非常有价值的经验。同时在定义一些变量的时候要格外小心,因为本程序中涉及的变量比较多,所以我采用将其一一记录下来逐个逐个对应;在编译,链接,调试的过程中一定要有足够的耐心。另外考虑到电话号码等长度太长,于是定义成数组类型,便于输入足够长的号码。 这个程序仍然还是有不足之处,比如当输入了两个相同学号的学生信息时,在查询时系统不会提示错误,这就说明了我在程序设计时思维不够严谨,不够细致,在今后的学习中,仍然需要加强这方面的训练。此次系统设计提高了分析问题,适应实际、实践编程的能力,为今后的学习和实践打下了良好的基础。 七、参考文献C语言程序设计第二版 中国铁道
28、出版社C+程序设计(第2版) 谭浩强 编著C+程序设计上机指导 谭浩强 编著 C+程序设计:思想与方法 人民邮电出版社 网络资料关于源代码,指针 八、附 录# include # include # include #include /用getch();using namespace std; class Student public: char name20; char Id20; int banji; int old; char sex6; char roomnumber5; char telephonenumber15; int xuefen1; int xuefen2; int xue
29、fen3; int Cnum1; /C+课程得分 int Cnum2; int Cnum; int Mnum; /数学得分 int Mnum1; int Mnum2; int Enum; /英语得分 int Enum1; int Enum2; int sum; /总分 int ave; /平均分 Student * Next; void Input() coutname; coutId; coutbanji; coutsex; coutold; coutroomnumber; couttelephonenumber; coutxuefen1; coutCnum1; coutCnum2; cou
30、ttt请输入C+课程的综合成绩:; Cnum=Cnum1*0.3+Cnum2*0.7; coutCnumendl; if(Cnum60) coutttC+课程重修endl; coutxuefen2; coutMnum1; coutMnum2; couttt请输入数学课程的综合成绩:; Mnum=Mnum1*0.3+Mnum2*0.7; coutMnumendl; if(Mnum60) couttt数学课程重修endl; coutxuefen3; coutEnum1; coutEnum2; couttt请输入英语课程的综合成绩:; Enum=Enum1*0.3+Enum2*0.7; coutEn
31、umendl; if(Enum60) couttt英语课程重修nameIdsexbanjioldroomnumbertelephonenumberCnum1Cnum2CnumMnum1Mnum2MnumEnum1Enum2Enumsumave; void Show() cout姓名:nameendl学号:Idendl班级:banjiendl性别:sexendl年龄:oldendl宿舍号码:roomnumberendl电话号码:telephonenumberendl C+平时成绩:Cnum1endlC+考试成绩:Cnum2endlC+综合成绩:Cnumendl数学平时成绩:Mnum1endl数学考试成绩:Mnum2endl数学综合成绩:Mnumendl
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922