




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机电工程学院 中 南 大 学计算机程序设计基础C+ 课 程 设 计题 目 学生成绩管理系统 成员姓名 姚东盼 学号 0801130924班级:机械1309成员姓名 吴子珍 学号 0801130905班级:机械1309成员姓名 李文林 学号 0801130926班级:机械1309指导教师 杨放琼 学 院 机 电 工 程 学 院 日 期 2014 年 7 月 2 日 目录:第一章 设计任务及任务分配1. 课题及功能组成12. 小组成员及任务分配13. 进度安排14. 小组成员设计内容简介1第二章 需求分析1. 程序设计要求22. 程序实现形式23. 程序函数原型24. 程序流程图2第三章 程序设计1. 概要设计42. 具体程序设计43. 调试及错误分析22第四章 程序使用说明及运行实例1. 程序演示232. 注意事项26第五章 课程设计心得1.程序设计过程272.心得体会27(附录)源代码(全)28第一章 设计任务及任务分配1. 课题及功能组成我们选择的是学生成绩管理系统,面向的是老师统计学生的成绩。根据设计任务要求,我们主要划分了6个主要的功能函数:查找信息函数、修改信息函数、插入或新建文件函数、删除信息函数、实现统计功能的函数、查看信息函数。为了方便对多个成绩单文件进行操作,我们还额外加了一个可以选择文件的功能。2. 小组成员及任务分配组长:姚东盼 总体设计。设计流程、模块函数原型接口设计,模块组装调试以及查看(载入)函数,删除和统计函数的编写,撰写报告。组员:李文林 吴子珍 负责模块程序设计,并独立调试自己的程序。其中吴子珍负责查找函数,插入函数的编写;李文林负责修改信息函数以及开始函数的编写。3.进度安排第一周:查找资料,了解要实现的功能,完成分工,学习补充文件操作的知识,以及链表的知识。第二周:认真完成各自的任务,组建调试,纠错分析,撰写实践报告。4.小组成员设计内容简介姚东盼: 建立学生链表的数据结构 设计总体流程及具体实现方法 void zairu()函数,此函数将文件信息提取到内存,以链表的形式存储。 void tongji( )函数,此函数实现统计功能:排序、计算及格率、平均分。 void shanchu()函数,此函数通过将文件信息调入内存,然后删除文件内容,找到要删除的记录,除要删除的记录以外都重新写入文件。从而实现删除功能。 吴子珍 void chazhao()函数,此函数通过比较要查找的数据成员与内存中链表的是否相似选择输出。 void charu()函数,此函数实现添加记录和新建文件的功能。 void chose()函数,选择功能函数。李文林 void start()函数,开始菜单函数。void xiugai()函数,此函数通过将文件信息调入内存,然后将文件内容删除,将内存中链表的内容修改后,进行二次重写。第二章 需求分析1. 程序设计要求基本要求:(1)所有记录保存在一个数据文件中;(2)具备记录添加功能;(3)具备记录删除功能;(4)具备记录修改功能;(5)具备记录查询功能;(6)计算统计功能;(7)良好操作界面菜单。2. 实现形式分析课设要求,其中要求记录保存在一个数据文件中,因此程序设计必须包括文件的输入输出。另外要求具备记录添加功能,由于不确定要添加的内容多少以及文件内容的多少,根据链表可以接尾添加数据的特性可得出这里选择链表作为学生成员的数据结构更合适一些。由于面向对象部分我们还没有深入学习而且此处用之前c语言面向对象过程的内容完全可以胜任,故选择面向过程的方法。3. 程序函数原型所有函数成员:void main();/主函数void start();/开场界面void zairu();/载入文件到内存链表以及输出信息void chose();/选择功能函数的函数void chazhao();/查找函数void xiugai();/修改函数void charu();/插入函数void shanchu();/删除函数void tongji();/统计函数void jige();/统计函数子函数 计算及格率void paixu();/统计函数子函数 进行成绩排序void pingjun();/统计函数子函数 计算平均分4.程序框图计算平均分计算及格率信息排序退出系统查看信息重新选择文件统计功能删除数据插入数据修改数据查找数据 开始界面 选择功能载入文件第三章 程序设计1.概要设计本课程设计假设面向的使用对象是老师,用于老师录入,修改,查看学生成绩。程序主要录入学生的信息内容包括:学号、姓名、性别、数学成绩、英语成绩、vc成绩(其他成绩如果添加的话完全和上面三门相同)。为了便于对多个成绩文件的管理,本程序还特意添加了选择文件的功能。整体设计尽可能的考虑了不同的意外情况和应用需求,并给予了解决方案。2.具体程序设计、首先是主函数。为了使程序结构尽可能的清晰,主函数尽量的进行了简洁化处理。void main()cout * 欢迎使用学生信息管理系统 *endl;coutendl;loop1: cout请输入目标文件名fname; zairu();loop:start();/开场chose();/选择功能fanhui();/返回函数if(flag2)flag2=0;goto loop1;/flag2是判断是否重新选择文件的标志位if(!flag2&m!=8)goto loop;/m=8是重新返回主菜单操作界面开始start()函数void start()/打印初始界面函数coutendl;coutendl; cout * 请选择要进行的操作 *endl; cout * * * * * * * * * * * * * * * *endl; cout * 1.查找信息 2.修改信息 *endl; cout * 3.插入信息 4.删除信息 *endl; cout * 5.统计功能 6.选择文件 *endl; cout * 7.查看信息 8.退出系统 *endl; cout * * * * * * * * * * * * * * * * endl; coutendl; cout请选择*m;switch(m) case 1: chazhao();break; case 2: xiugai();break; case 3: charu();break; case 4: shanchu();break; case 5: tongji();break; case 6: flag2=1;break; case 7: zairu();break; case 8: cout谢谢使用!endl;break; default: cout请输入正确数字(1-8)endl; 载入函数(显示信息函数)载入函数,就是将文件里的信息提取到内存链表中。其中两点注意部分。其一是,要将文件中头部的汉字提取过滤掉(因为这不是学生的数据信息)。具体实施方法就是提取到一个字符串变量中,然后丢掉。其二,关于用eof()函数对文件是否读取结束的判断。由于,eof()函数并不是读完最后一个数据返回false值,而是读完最后一个数据再往下读不到的时候才返回false值,即提取完最后一个字符eof()函数还为true。解决办法:设置一个数据缓冲位。void zairu() /载入函数,将文件内容提取到内存 ifstream infile;infile.open(fname,ios:in); /读入文件 if(!infile)cout文件读取失败endl; /判断文件是否读取成功 elsecout检索所有数据endl;coutsetw(10)学号setw(8)姓名setw(8)性别setw(8)数学setw(8)英语setw(8)VCstname1stname1stname1stname1stname1stname1; /把数据中的汉字部分提取后丢掉 head=last=NULL; /先置为空指针 p=new student; /开辟新的单元用于存放从文件中提取的信息 infilep-idp-namep-sexp-mathp-Englishp-vc; /读取链表的头 coutsetw(10)idsetw(8)namesetw(8)sexsetw(8)mathsetw(8)Englishsetw(8)vcnext=p;infilestname1; /作为缓冲,读完这个数据可以看出数据是否读完if(!infile.eof() /二次判断strcpy(p-id,stname1);infilep-namep-sexp-mathp-Englishp-vc;last=p;coutsetw(10)idsetw(8)namesetw(8)sexsetw(8)math;coutsetw(8)Englishsetw(8)vcendl;cout*endl;coutnext=NULL;infile.close(); /切断内存与文件的联系查找函数查找函数提供了两种查找方式,按学号查找和按姓名查找。两种操作完全类似。具体实施办法是:获取要查找的学号或者姓名信息,然后读取已载入内存中的链表学号或者姓名信息,用字符串比较函数比较两者是否相同,相同则输出,不相同则不输出。void chazhao() /查找函数loop:cout请选择查找方式endl;cout 1.按学号查找 2.按姓名查找n;if(n=1)cout请输入学号endl; else if(n=2)cout请输入名字endl;elsecout请输入正确的数字1-2stname;p=head;while(p) /读取链表数据,写入文件if(n=1)strcpy(stname1,p-id);if(n=2)strcpy(stname1,p-name);if(strcmp(stname,stname1); /字符串比较函数,判断是否是查找的数据elseflag=1; /标志位重置cout下面是搜索到的记录endl;coutsetw(10)idsetw(8)namesetw(8)sexsetw(8)mathcoutsetw(8)Englishsetw(8)vcnext; if(flag=0)cout没有要查找的数据endl; 修改函数xiugai()修改函数借用了查找函数,提供了两种查找对象的方式。修改内容利用了switch语句,通过字符串复制函数实施姓名、学号、性别的修改。具体实施办法是,将文件中的内容提取到内存中,然后第二次以写入的方式打开,清除文件内容,将要修改的内容在内存里修改之后重新写入文件。void xiugai() /修改函数cout请选择查找对象方式endl;cout 1.按学号查找对象 2.按名字查找对象 n;if(n=1)cout请输入学号endl; else if(n=2)cout请输入名字endl;elsecout请输入正确的数字1-2stname;p=head;loop:ofstream outfile(fname,ios:out); /文件输出流对象outfilesetw(10)学号setw(8)姓名setw(8)性别setw(8)数学setw(8)英语setw(8)VCsetw(8)id);if(n=2)strcpy(stname1,p-name);if(strcmp(stname,stname1) /字符串比较函数,判断是否是查找的数据outfilesetw(10)idsetw(8)namesetw(8)sexsetw(8)mathsetw(8)Englishsetw(8)vcendl;elseflag=1;cout下面是搜索到的记录endl;coutsetw(10)idsetw(8)namesetw(8)sexsetw(8)math;coutsetw(8)Englishsetw(8)vcendl;cout请选择要修改的内容endl; /选择修改的内容cout * endl;cout * (1)学号 (2)姓名 * endl;cout * (3)性别 (4)数学 * endl;cout * (5)English (6)VC * endl;cout * q;switch(q) /修改 case 1:cout请输入 :将原学号id修改为stname;strcpy(p-id,stname);break;case 2:cout请输入 :将原姓名name修改为stname;strcpy(p-name,stname);break;case 3:cout请输入 :将原性别sex修改为sex1;strcpy(p-sex,sex1);break;case 4:cout请输入 :将原数学成绩math修改为score;p-math=score;break;case 5:cout请输入 :将原英语成绩English修改为score;p-English=score;break;case 6:cout请输入 :将原VC成绩vc修改为score;p-vc=score;break;default:cout请输入正确的数字(1-6)endl;flag1=1;outfilesetw(10)idsetw(8)namesetw(8)sexsetw(8)math;outfilesetw(8)Englishsetw(8)vcnext; if(flag1=1)goto loop; /没找到要修改的数据,重新返回outfile.close();if(flag=0)cout没有要查找的数据endl;else cout修改成功!endl; 插入函数插入函数提供了两种功能,一是在文件末尾添加数据,另外就是新建一个文件加入数据(如果原有文件存在默认清除数据再新建)。实施方法:在末尾添加数据,写入方式为IOS:app;新建写入方式是IOS:out;void charu()ifstream infile;ofstream outfile;cout插入(1) 新建(2)m;if(m=1) /在已有的文件末尾添加记录infile.open(fname,ios:in);outfile.open(fname,ios:app);else if(m=2) /新建文件,并添加记录outfile.open(fname,ios:out);infile.open(fname,ios:in);outfilesetw(10)学号setw(8)姓名setw(8)性别setw(8)数学setw(8)英语setw(8)VCendl;elsecout请输入正确的数字(1-2)endl;if(!infile)cout文件读取失败endl;if(!outfile)cout文件写入失败endl;if(!infile|!outfile)cout操作失败endl;else /插入记录cout请输入要插入的数据个数n;cout请输入数据endl;coutsetw(10)学号 姓名 性别 数学 英语 VC p-id;cinp-namep-sex; cinp-mathp-Englishp-vc;head=last=p;for(i=1;inext=p;cinp-id;cinp-namep-sex ;cinp-mathp-Englishp-vc;last=p;last-next=NULL;p=head;cout已录入的数据为endlendl;coutsetw(10)学号setw(8)姓名setw(8)性别setw(8)数学setw(8)英语setw(8)VCendl;while(p)outfilesetw(10)idsetw(8)namesetw(8)sexsetw(8)mathsetw(8)Englishsetw(8)vcendl;coutsetw(10)idsetw(8)namesetw(8)sexsetw(8)mathsetw(8)Englishsetw(8)vcnext;infile.close();outfile.close(); 删除函数删除函数和修改函数思路基本完全一致。先读入到内存,然后清空文件,用字符串比较函数找到要删除的数据记录,对要删除信息不再重新写入,其他重新写入文件。void shanchu() /删除函数cout请输入要删除的学生的姓名stname;ofstream outfile(fname,ios:out);outfilesetw(10)学号setw(8)姓名setw(8)性别setw(8)数学setw(8)英语setw(8)VCsetw(8)name) /字符串比较函数,判断是否是查找的数据outfilesetw(10)idsetw(8)namesetw(8)sex;outfilesetw(8)mathsetw(8)Englishsetw(8)vcendl;elseflag=1;cout下面是搜索到的记录endl;coutsetw(10)idsetw(8)namesetw(8)sexsetw(8)mathsetw(8)Englishsetw(8)vcendl;cout确定要删除(y/n)ch;if(ch=y)cout数据已删除!endl; if(ch=n) /判断是否确定删除,是则不将提取的文件重新写入,否则继续写入outfilesetw(10)idsetw(8)namesetw(8)sex;outfilesetw(8)mathsetw(8)Englishsetw(8)vcendl;cout数据未修改next;if(flag=0)cout您要删除的数据不存在!endl;outfile.close();统计函数统计函数提供三个功能,不过主要是通过调用其他子函数。void tongji() /统计函数 int t;loop:cout请输入要执行的操作endl;cout * endl;cout * (1)排序 (2)平均分 (3)及格率 * endl;cout * t;if(t=1)paixu();else if(t=2)pingjun();else if(t=3)jige();else cout请输入正确的数字1-3endl;goto loop; 排序函数 排序函数思路是,先利用链表的指针计数链表中数据个数,然后再采用冒泡排序的方法排序。排序的结果不改变文件的存储顺序,只是改变输出的顺序。该函数提供了升序、降序两种排序方式,在比较之前添加了一个缓冲数据,实现两种不同排序方式。void paixu() /排序函数 coutendl;loop1:cout请选择排序方式endl;cout * endl;cout * (1)学号 (2)数学 * endl;cout * (3)英语 (4)vc * endl;cout * q;if(q!=1&q!=2&q!=3&q!=4) /if语句用于判断输入数字是否正确cout请输入正确的数字1-4endl;goto loop1; coutendl;loop2:cout (1)升序 (2)降序s;if(s!=1&s!=2)cout请输入正确的数字1-2next;int i,j,max;char stname315,sex45;for(i=0;icount;i+) /冒泡排序for(j=0,p=head;jnext!=NULL;j+,p=p-next)if(q!=1) /用于区分字符串学号与整型数据int a,b;if(q=2)a=p-math;b=p-next-math;if(q=3)a=p-English;b=p-next-English;if(q=4)a=p-vc;b=p-next-vc;if(s=1)max=a;a=b;b=max; /判断升序还是降序排列if(anext-math;p-next-math=p-math;p-math=max;max=p-next-English;p-next-English=p-English;p-English=max;max=p-next-vc;p-next-vc=p-vc;p-vc=max;strcpy(stname3,p-next-id);strcpy(p-next-id,p-id);strcpy(p-id,stname3);strcpy(stname3,p-next-name);strcpy(p-next-name,p-name);strcpy(p-name,stname3);strcpy(sex4,p-next-sex);strcpy(p-next-sex,p-sex);strcpy(p-sex,sex4);else /学号字符串利用字符串比较函数 冒泡排序char id115,id215;strcpy(id2,p-next-id);strcpy(id1,p-id);if(s=1)strcpy(stname3,id2);strcpy(id2,id1);strcpy(id1,stname3);if(strcmp(id1,id2)=-1)max=p-next-math;p-next-math=p-math;p-math=max;max=p-next-English;p-next-English=p-English;p-English=max;max=p-next-vc;p-next-vc=p-vc;p-vc=max;strcpy(stname3,p-next-id);strcpy(p-next-id,p-id);strcpy(p-id,stname3);strcpy(stname3,p-next-name);strcpy(p-next-name,p-name);strcpy(p-name,stname3);strcpy(sex4,p-next-sex);strcpy(p-next-sex,p-sex);strcpy(p-sex,sex4);p=head;while(p) /将排好的次序打印出来coutsetw(10)idsetw(8)namesetw(8)sexsetw(8)mathsetw(8)Englishsetw(8)vcnext;平均函数计算平均分。先利用指针计数,然后累加再除。void pingjun() /求平均分函数p=head;int i=0,j,k;loop:cout (1)数学 (2)英语 (3)vc j;if(j!=1&j!=2&j!=3)cout请输入正确的数字1-3next)if(j=1)k=p-math ;if(j=2)k=p-English ;if(j=3)k=p-vc ;s=s+k;i+;s=s/i;cout该科平均分为sendl;求及格率函数思路与平均分函数完全类似。void jige()/求及格率函数p=head;int i=0,j,k;loop:cout (1)数学 (2)英语 (3)vc j;if(j!=1&j!=2&j!=3)cout请输入正确的数字1-3next)if(j=1)k=p-math ;if(j=2)k=p-English ;if(j=3)k=p-vc ;if(k=60)s+;i+;s=s/i;cout该科及格率为sendl;3.程序调试及错误分析程序调试过程中,主要出现了两个比较棘手的问题。一个就是刚开始不了解eof函数读取文件数据返回false值的条件,总是多读取一次文件,读入错误数据。不过,经过我们从网上查资料,最终解决了。另外一个就是,链表内容数据的排序问题,对于链表的指针不是特别熟练,经常使用while语句或者某个语句中不清楚NULL指针是在哪个地方,有的时候指针跳到NULL后,忘记将它置为一个值,导致程序编译没错误,运行起来总是出错。还有对于链表中的冒泡排序也不是特别熟悉。不过最后,反复调试最终解决了。第四章 程序使用说明及运行实例1.程序演示(以查找和统计排序为例)程序开始运行:输入文件名选择1.输入学号 0801130923按任意键 然后按下Enter选择5选择1按学号升序排序 1返回,退出系统2.注意事项1.对于初始文件的输入,如果成绩文件与程序在同一个目录文件中,可以直接输入相对路径(即,只输入文件名字)例:如果不在同一个文件下,必须输入全部名称。2.如果打开的文件不存在系统会提示打开失败,但会自动建立新的文件,可以用插入函数新建功能添加数据。此时,如果插入数据时不提示文件读取失败说明文件已经新建好。如果仍旧提示文件读取失败,说明文件格式不正确。系统识别的文件时txt记事本文件。第五章 课程设计心得1.程序设计过程总体来说,程序设计不是一帆风顺的。此次程序设计历时一个多星期,从刚开始感觉无从下手,慢慢一点点写出各个函数,写不出的时候查资料,有错误的时候反复调试,虽然有的小错误很难找出但是却是很致命。比如说,排序函数的指针编译总是正确,但是运行总是出错。2.心得体会本次课程设计,虽然有的时候很艰辛,调程序老是出错。最可气的是编译器能通过,没有错误,但是程序运行起来就是到某个点就出错。这是一件很恼人的事情,因为这时候很难找出哪里出错。但是坚持就是胜利!合作就是力量!通过这次课程设计,我们收获了许多,知识上,我们通过自学,学会了链表的基本操作,对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国坚果行业市场发展现状及发展趋势与投资风险研究报告
- 2025-2030中国圆形验粉筛行业发展前景与投资效益分析研究报告
- 2025-2030中国半自动纸箱架行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国劳动力资源行业供求趋势预测与整体运行态势分析研究报告
- 2025-2030中国列车自动运行系统行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国冷轧钢行业市场现状供需分析及投资评估规划分析研究报告
- 2025年酸解复合淀粉项目市场调查研究报告
- 某年度YS系列环氧乙烷银催化剂战略市场规划报告
- 2025年苏科版小学三年级心理健康教育计划
- 智能智能环境监测设备开发合同
- 园林工程施工现场危险源一览表
- 500KV变电站设备、接线特点及保护配置原则
- 第十章-老年人的临终护理课件
- 结构化学大纲
- 康复评定学第三章肌力
- 图形创意(高职艺术设计)PPT完整全套教学课件
- 2023年财会金融-注册会计师-审计(官方)考试历年真题甄选版带答案
- 2023学年完整公开课版粘压阻力
- 十大元帅罗荣桓
- 生态环境材料第三章
- 基于STM32的平衡车系统设计
评论
0/150
提交评论