C++语言课程设计报告书.doc
淮 海 工 学 院 计算机工程学院课程设计报告设计名称:学生成绩系统姓 名:学 号:专业班级:系 (院):计算机科学与技术系设计时间:设计地点:计算机工程学院机房、教室、学生宿舍、图书馆成绩:指导教师评语: 签名: 年 月 日1课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完C+程序设计课程后进行的一次全面的综合练习。本课程设计的目的和任务:(1)巩固和加深学生对C+课程的基本知识的理解和掌握;(2)掌握C+编程和程序调试的基本技能;(3)利用C+进行简单软件设计的基本思路和方法;(4)提高运用C+解决实际问题的能力;(5)掌握书写程序设计说明文档的能力。本次课程设计利用C+程序设计课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,使学生能够独立完成所布置的任务。2课程设计任务与要求:要求:1) 设计题目、设计要求以及系统功能需求分析;2) 总体设计:包括模块说明、模块结构图和系统流程图;3) 详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图;4) 源程序代码及设计成果:完整源程序清单和设计成果;5)总结: 调试分析过程描述:包括测试数据、测试输出结果以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等)包括课程设计过程中的学习体会与收获、对C+和本次课程设计的认识等内容.;任务:设计一个学生成绩排名系统,该系统的主要功能如下:1) 具备对成绩的管理功能(添加、删除、排序)2) 具备对成绩的统计功能(最高分,最低分,平均分,及格率等)3) 具备按学号、姓名、或课程名查询成绩的功能。4)学生成绩应该保存在文件中。备注:成绩记录以下信息:学号,姓名,课程名,成绩(百分制)。可以用能表示学生成绩的结构体数组存储数据。3课程设计说明书概要设计一、模块说明在我设计的程序中一共包括了六个模块,分别是:添加模块、删除模块、排序模块、统计模块、查找模块、界面模块。这六个模块都是独立分开作为子函数的,其它五个则是作为switch语句中的一部分,通过switch语句,从界面模块中调用,把六大模块联系了起来,同时,为了实现多次使用这六大模块,在其它模块中也加入了界面模块的调用。二、模块结构图Main 函数界面模块添加信息删除信息信息排序统计信息查找信息三、系统流程图各功能模块流程图:添加信息添加信息输入学号姓名成绩替换到已定义的数组中删除信息删除信息输入要删除的学号将目标数组各项都替换为0信息排序信息排序按数学按英语按C+按总分选择法冒泡法冒泡法冒泡法统计信息统计信息学号不是0人数+1 计入总分并判断是否及格YN及格人数+1Y统计总分及格率等N查找信息查找信息按学号按姓名按总分按数学按英语按C+按科目输入后与有成绩的数组中的目标项对比,相同即输出界面模块界面成绩统计成绩查找添加成绩删除成绩成绩排序成绩管理4课程设计成果程序源代码,运行结果#include <iostream>#include <string>#include <iomanip>#include <fstream> using namespace std;class chengjipublic:int num;string name;int m_num; int e_num;int c_num;int t_num;int a_num;public:chengji() /构造函数初始化num=0;name='0'm_num=0;e_num=0;c_num=0;t_num=m_num+e_num+c_num; /求总成绩a_num=t_num/3; /求平均成绩void tianjia(int); /实现添加功能的成员函数void shanchu(int); /实现删除功能的成员函数friend void paixu(); /实现排序功能的友员函数friend void tongji(); /实现统计功能的友元函数friend void chazhao(); /实现查找功能的友元函数friend void jiemian(); /实现界面功能的友元函数friend void save();student41;void chengji:tianjia(int tnum) /定义添加功能的成员函数string tname;int tm_num;int te_num;int tc_num; ofstream outfile("C:chengji.txt",ios:out); /定义文件流对象,打开磁盘文件chengji.txtcout<<"请输入姓名:"cin>>tname; /输入姓名cout<<"请输入数学成绩:"cin>>tm_num; /输入数学成绩 cout<<"请输入英语成绩:"cin>>te_num; /输入英语成绩cout<<"请输入C+成绩:"cin>>tc_num; /输入C+成绩num=tnum; /将学号赋给类中的numname=tname; /将姓名赋给类中的namem_num=tm_num; /将数学成绩赋给类中的m_nume_num=te_num; /将英语成绩赋给类中的e_numc_num=tc_num; /将C+成绩赋给类中的c_numt_num=m_num+e_num+c_num; /将学号赋给类中的t_numa_num=t_num/3; /将学号赋给类中的a_num for(int i=0;i<41;i+)outfile<<studenti.num<<" "<<studenti.name<<" "<<studenti.m_num<<" "<<studenti.e_num<<" "<<studenti.c_num<<" "<<studenti.t_num<<endl;out(); cout<<"添加成功!"<<endl;jiemian(); /调用界面函数void chengji:shanchu(int n) /定义删除功能的成员函数studentn-1.num=0;studentn-1.name='0'studentn-1.m_num=0;studentn-1.e_num=0;studentn-1.c_num=0;studentn-1.t_num=0;studentn-1.a_num=0;cout<<"删除成功!"<<endl;jiemian(); /调用界面函数void paixu() /定义排序功能的友员函数cout<<"请选择排序的方式:1:按数学成绩 2:按英语成绩3:按C+成绩 4:按总分"<<endl; int n1;cin>>n1;switch(n1)case 1: /按数学成绩排序chengji fangshi41,change;int n2,n3=-1,n4,k;for(n2=0;n2<41;n2+)if(studentn2.num!=0)n3+;fangshin3.num=n2+1;fangshin3.name=studentn2.name;fangshin3.m_num=studentn2.m_num;if(fangshi0.num=0) cout<<"没有数据,请重新选择!"<<endl;jiemian();elsen4=n3+1;for(n2=0;n2<n4-1;n2+)k=n2;for(n3=n2+1;n3<n4;n3+)if(fangshik.m_num<fangshin3.m_num)k=n3;change.num=fangshik.num;change.name=fangshik.name;change.m_num=fangshik.m_num;fangshik.num=fangshin2.num;fangshik.name=fangshin2.name;fangshik.m_num=fangshin2.m_num;fangshin2.num=change.num;fangshin2.name=change.name;fangshin2.m_num=change.m_num;for(n2=0;n2<n4;n2+)cout<<fangshin2.num<<setw(20)<<fangshin2.name<<setw(5)<<fangshin2.m_num<<endl;jiemian();break;case 2: /按英语成绩排序chengji fangshi50,change;int n2,n3=-1,n4;for(n2=0;n2<50;n2+)if(studentn2.num!=0)n3+;fangshin3.num=n2+1;fangshin3.name=studentn2.name;fangshin3.e_num=studentn2.e_num;if(fangshi0.num=0) cout<<"没有数据,请重新选择!"<<endl;jiemian();elsen4=n3+1;for(n2=0;n2<n4-1;n2+)for(n3=n4-1;n3>n2;n3-)if(fangshin3.e_num>fangshin3-1.e_num)change.num=fangshin3.num;change.name=fangshin3.name;change.e_num=fangshin3.e_num;fangshin3.num=fangshin3-1.num;fangshin3.name=fangshin3-1.name;fangshin3.e_num=fangshin3-1.e_num;fangshin3-1.num=change.num;fangshin3-1.name=change.name;fangshin3-1.e_num=change.e_num;for(n2=0;n2<n4;n2+)cout<<fangshin2.num<<setw(20)<<fangshin2.name<<setw(5)<<fangshin2.e_num<<endl;jiemian(); /调用界面函数break;case 3: /按C+成绩排序chengji fangshi50,change;int n2,n3=-1,n4;for(n2=0;n2<50;n2+)if(studentn2.num!=0)n3+;fangshin3.num=n2+1;fangshin3.name=studentn2.name;fangshin3.c_num=studentn2.c_num;if(fangshi0.num=0) cout<<"没有数据,请重新选择!"<<endl;jiemian(); /调用界面函数elsen4=n3+1;for(n2=0;n2<n4-1;n2+)for(n3=n4-1;n3>n2;n3-)if(fangshin3.c_num>fangshin3-1.c_num)change.num=fangshin3.num;change.name=fangshin3.name;change.c_num=fangshin3.c_num;fangshin3.num=fangshin3-1.num;fangshin3.name=fangshin3-1.name;fangshin3.c_num=fangshin3-1.c_num;fangshin3-1.num=change.num;fangshin3-1.name=change.name;fangshin3-1.c_num=change.c_num;for(n2=0;n2<n4;n2+)cout<<fangshin2.num<<setw(20)<<fangshin2.name<<setw(5)<<fangshin2.c_num<<endl;jiemian(); /调用界面函数break;case 4: /按总分进行排序chengji fangshi50,change;int n2,n3=-1,n4;for(n2=0;n2<50;n2+)if(studentn2.num!=0)n3+;fangshin3.num=n2+1;fangshin3.name=studentn2.name;fangshin3.t_num=studentn2.t_num;if(fangshi0.num=0) cout<<"没有数据,请重新选择!"<<endl;jiemian(); /调用界面函数elsen4=n3+1;for(n2=0;n2<n4-1;n2+)for(n3=n4-1;n3>n2;n3-)if(fangshin3.t_num>fangshin3-1.t_num)change.num=fangshin3.num;change.name=fangshin3.name;change.t_num=fangshin3.t_num;fangshin3.num=fangshin3-1.num;fangshin3.name=fangshin3-1.name;fangshin3.t_num=fangshin3-1.t_num;fangshin3-1.num=change.num;fangshin3-1.name=change.name;fangshin3-1.t_num=change.t_num;for(n2=0;n2<n4;n2+)cout<<fangshin2.num<<setw(20)<<fangshin2.name<<setw(5)<<fangshin2.t_num<<endl;/输出符合条件的学号.姓名.总分jiemian(); /调用界面函数break;default :cout<<"输入错误,已返回主菜单"<<endl;jiemian(); /调用界面函数break;void tongji() /定义统计功能的友元函数int n1,n2=0,n_m=0,n_e=0,n_c=0,t_m=0,t_e=0,t_c=0,t_t=0; /n_m为统计数学分数的人数,n_e为统计英语分数的人数,n_c为统计C+分数的人数int m_max=0,e_max=0,c_max=0,t_max=0,m_min=101,e_min=101,c_min=101,t_min=101;for(n1=0;n1<41;n1+)if(studentn1.num!=0)n2+;t_m=t_m+studentn1.m_num; /t_m为数学成绩的总分t_e=t_e+studentn1.e_num; /t_e为英语成绩的总分t_c=t_c+studentn1.c_num; /t_c为C+成绩的总分t_t=t_t+studentn1.t_num; /t_t为所有成绩的总分if(studentn1.m_num>=60) /数学及格人数的统计n_m+;if(studentn1.e_num>=60) /英语及格人数的统计n_e+;if(studentn1.c_num>=60) /C+及格人数的统计n_c+;if(studentn1.m_num>m_max)m_max=studentn1.m_num;if(studentn1.e_num>e_max)e_max=studentn1.e_num;if(studentn1.c_num>c_max)c_max=studentn1.c_num;if(studentn1.t_num>t_max)t_max=studentn1.t_num;if(studentn1.m_num<m_min&&studentn1.m_num!=0)m_min=studentn1.m_num;if(studentn1.e_num<e_min&&studentn1.e_num!=0)e_min=studentn1.e_num;if(studentn1.c_num<c_min&&studentn1.c_num!=0)c_min=studentn1.c_num;if(studentn1.t_num<t_min&&studentn1.t_num!=0)t_min=studentn1.t_num;if(n2=0) cout<<"对不起,无记录"<<endl;jiemian(); /调用界面函数else cout<<"总人数为:"<<setw(5)<<n2<<endl;cout<<"数学平均分为:"<<t_m/n2<<"及格率为:"<<n_m*100/n2<<"%"<<endl;cout<<"英语平均分为:"<<t_e/n2<<"及格率为:"<<n_e*100/n2<<"%"<<endl; cout<<"C+平均分为:"<<t_c/n2<<"及格率为:"<<n_c*100/n2<<"%"<<endl;cout<<"数学最高分为:"<<m_max<<"最低分为:"<<m_min<<endl;cout<<"英语最高分为:"<<e_max<<"最低分为:"<<e_min<<endl;cout<<"C+最高分为:"<<c_max<<"最低分为:"<<c_min<<endl;cout<<"总分最高为:"<<t_max<<"最低分为:"<<t_min<<endl;cout<<"总分平均分为:"<<t_t/n2<<endl;void chazhao() /定义查找函数int n0,n1;cout<<"请选择查找的方式:"<<endl<<"1:按学号"<<endl<<"2:按姓名"<<endl<<"3:按课程"<<endl;cin>>n0;switch(n0)case 1: /按学号查找cout<<"请输入要查找的学号:"<<endl;int cznum;cin>>cznum;if(studentcznum-1.num!=0) cout<<" 学号是 :"<<studentcznum-1.num<<endl;cout<<" 姓名是 :"<<studentcznum-1.name<<endl;cout<<"数学成绩是:"<<studentcznum-1.m_num<<endl<<"英语成绩是:"<<studentcznum-1.e_num<<endl;cout<<"C+成绩是:"<<studentcznum-1.c_num<<endl;else cout<<"对不起,您所查找的学号没有记录。"<<endl;jiemian(); /调用界面函数break;case 2: /按姓名查找cout<<"请输入要查找的姓名:"<<endl;string czname;cin>>czname;int n2=0;for(n1=0;n1<41;n1+)if(studentn1.name=czname) n2=1;cout<<" 学号是 :"<<studentn1.num<<endl;cout<<" 姓名是 :"<<studentn1.name<<endl;cout<<"数学成绩是:"<<studentn1.m_num<<endl;cout<<"英语成绩是:"<<studentn1.e_num<<endl;cout<<"C+成绩是:"<<studentn1.c_num<<endl;if(n2=0) cout<<"对不起,您所查找的姓名没有记录。"<<endl;jiemian(); /调用界面函数break;case 3: /按课程分数查找cout<<"请输入要查找的科目编号:1.数学 2.英语 3.C+ 4.总分"<<endl;int n2=0,n3;cin>>n3;switch(n3)case 1:for(n1=0;n1<41;n1+)if(studentn1.num!=0) cout<<"学号是:"<<setw(5)<<studentn1.num<<" 姓名是:"<<setw(20)<<studentn1.name<<" 数学成绩是:"<<setw(5)<<studentn1.m_num<<endl;n2=1;if (n2=0) cout<<"对不起,您所查找的学号没有记录。"<<endl;jiemian(); /调用界面函数break;case 2:for(n1=0;n1<41;n1+)if(studentn1.num!=0) cout<<"学号是:"<<setw(5)<<studentn1.num<<" 姓名是:"<<setw(20)<<studentn1.name<<" 英语成绩是:"<<setw(5)<<studentn1.e_num<<endl;n2=1;if (n2=0) cout<<"对不起,您所查找的学号没有记录。"<<endl;jiemian(); /调用界面函数break;case 3:for(n1=0;n1<41;n1+)if(studentn1.num!=0) cout<<"学号是:"<<setw(5)<<studentn1.num<<" 姓名是:"<<setw(20)<<studentn1.name<<" c+成绩是:"<<setw(5)<<studentn1.c_num<<endl;n2=1;if (n2=0) cout<<"对不起,您所查找的学号没有记录。"<<endl;jiemian(); /调用界面函数break;case 4:for(n1=0;n1<50;n1+)if(studentn1.num!=0) cout<<"学号是:"<<setw(5)<<studentn1.num<<" 姓名是:"<<setw(20)<<studentn1.name<<" 总分是:"<<setw(5)<<studentn1.t_num<<endl;n2=1;if (n2=0) cout<<"对不起,您所查找的学号没有记录。"<<endl;jiemian(); /调用界面函数break;default :cout<<"输入错误,已返回主菜单"<<endl;jiemian(); /调用界面函数break;break;void jiemian() /定义界面函数cout<<"欢迎使用计算机121班成绩排名系统,请按提示使用本软件的功能(输入功能前面数字即可):"<<endl;cout<<"="<<endl;cout<<"1.成绩的管理功能(添加、删除、排序)"<<endl;cout<<"2.成绩的统计功能(最高分,最低分,平均分,及格率等)"<<endl;cout<<"3.按学号、姓名、或课程名查询成绩的功能"<<endl;cout<<"="<<endl;int n1;cin>>n1;switch(n1)case 1:cout<<"1.添加"<<endl<<"2.删除"<<endl<<"3.排序"<<endl;int n2;cin>>n2;switch(n2)case 1:cout<<"请输入要添加的学号:"int n3;cin>>n3;studentn3-1.tianjia(n3);break;case 2:cout<<"请输入要删除的学号:"int n4;cin>>n4;studentn4-1.shanchu(n4);break;case 3:paixu();break;default :cout<<"输入错误,请重新输入"<<endl;jiemian();break;break;case 2:tongji();jiemian();break;case 3:chazhao();break;default :cout<<"输入错误,请重新输入"<<endl;jiemian();break;void main()jiemian();程序运行结果1.初始界面2.添加信息3.删除信息4.信息排序5.查找信息6.信息统计5.课程设计心得在这次课程设计中我遇到了很多的问题,对于刚学习一年C+的我,对各个模块的编程后整合在一起的能力很差,经过反复的调试之后,才让程序能顺利的运行,但是最终我成功的完成了这次课程设计,并且通过这次课程设计我也提高了自己的程序设计、编辑、测试的水平,也认识到了自己对于文件流,模块整合等方面的不足,以后我会不断的努力学习,提高自己编程的能力!