资源描述
-课 程 设 计 报 告课程名称 算法与程序设计 课题名称 学生选修课程管理系统 专 业* 班 级* 学 号* 姓 名 * 指导教师* 20*年*月 * 日学生选修课程系统(一)、课程设计题目:学生选修课程系统二、目的与要求: 1、目的: 1要求学生到达熟练掌握C+语言的根本知识和技能; 2根本掌握面向对象程序设计的根本思路和方法; 3能够利用所学的根本知识和技能,解决简单的面向对象程序设计问题。 2、根本要求: 1要求利用面向对象的方法以及C+的编程思想来完成系统的设计; 2要求在设计的过程中,建立清晰的类层次; 4在系统的设计中,至少要用到面向对象的一种机制。 3、创新要求: 在根本要求到达后,可进展创新设计,如根据查找结果进展修改的功能。 4、写出设计说明书 三、设计方法和根本原理: 1、问题描述功能要求: 假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求如总学分不得少于60自由选课。试设计一选修课程系统,使之能提供以下功能:1系统以菜单方式工作2课程信息录入功能(课程信息用文件保存)输入3课程信息浏览功能输出4查询功能:(至少一种查询方式)算法按学分查询按课程性质查询5学生选修课程(可选项)2、问题的解决方案: 根据系统功能要求,可以将问题解决分为以下步骤: 1分析系统中的各个实体之间的关系及其属性和行为; 2根据问题描述,设计系统的类层次; 3完成类层次中各个类的描述包括属性和方法; 4完成类中各个成员函数的定义; 5完成系统的应用模块; 6功能调试; 7完成系统总结报告以及系统使用说明书。四辩论与评分标准: 1、完成根本功能:40分; 2、设计报告及使用说明书:40分; 3、设置错误或者按照要求改变结果:10分;4、答复下列问题:10分。五、参考文献含实验指导书谭浩强编,清华大学朱战立等著,人民邮电,;含实验指导书莉著,清华大学 钱能主编 ,清华大学 戴锋编著,清华大学 吕日著,清华大学美国 Harvey M.Deitel 等 六、课程设计时间安排1、班级:*2、指导教师:*3、时间安排:2021.12.27-2021. 1.20目 录1.封面. .12.任务书. . .23.目录. . .54.正文. . . .65.附录. . . . .136. 评分表. . . 26一、需求分析1.系统设计目的与意义:拥有大量学生资料数据的高校,急需一工具高效省时简单进展必要的数据录入与查询管理,而学生选修课管理系统滿足了高校师生的要求。通过此系统,学生和管理者都能高效省时地完成各项工作。2.系统功能需求:可通过此系统进展学生选课,查询,更改,删除,数据保存等一系列的操作。二构造设计1.系统构造图:学生选修课程管理系统学生登陆端管理者登陆端学生选课学生信息选课查询增加学生增加课程删除学生删除课程学生信息选课查询保存数据退出系统退出保存2.系统功能模块划分与设计系统功能模块图:1录入模块:选择登录方式2显示模块:显示已录入的数据3查找模块:按要求查找所要数据4删除模块:删除查出所要删去的数据5修改模块:修改查出指定的数据6保存模块:保存数据7退出模块:退出系统系统的功能模块图主菜单menu()学生登录custom()menu_1_1();menu_1_2();menu_1_3();menu_1_4();管理员登录server()menu_2_1();menu_2_2();menu_2_3();menu_2_4();menu_2_5();menu_2_6();menu_2_7();menu_2_8();menu_2_9();menu_2_0();3.3函数模块说明函数模块功能函数模块功能menu()选修课系统主界面和登入方式的选择custom()选修课系统学生端的主界面和操作方式的选择menu_1_1()学生选课,由学生根据所给定的课程进展选课menu_1_2()学生情况,查看学生根本情况menu_1_3()选课情况,查看学生选课情况menu_1_4()退出系统,使用完毕即可平安退出menu_2_1()增加学生,新参加一个选课学生menu_2_2()删除学生,删除特定的选课学生menu_2_3()增加课程,增加选课课程menu_2_4()删除课程,删除选课课程menu_2_5()填写成绩,为每一门选修课添加学生成绩menu_2_6()更改学分,更改选课课程的学分menu_2_7()学生情况,查看学生情况menu_2_8()选课情况,查看选课情况menu_2_9()保存数据,修改完毕要保存数据到文件里去menu_2_0()退出系统,使用完毕即可平安退出3.类层次图本程序共有3个大类,course 类,subject 类和student类,其中student类可以调用subject类中的数据成员,进展课程查询,学生信息查询;通过course 类的数据成员,可以查阅到由course 类定义的学生信息,以及规定的课程信息。其次是subject 类,subject类也可以调用student类中的数据成员,查阅选课情况。可以说3个类之间是相互补充,相互调用的.类层次图:StudentSubjectCourse4.类视图:Int ma*course;char sname;int factcoursefloat average();int retfactcourse();int retma*course()Student类Course类char ame;float gradefloat readcredit()Subject类int ma*student;int activestudnet;float credit;float averagerusultfloat getaverage()int retma*student()void clractivestudnet()三、使用说明及功能实现运行界面及文字说明:在VC6.0环境下运行该程序,会有如下显示:主菜单:可选择操作项 1.学生选课登陆;2.系统管理登陆操作1:学生登陆功能 1:学生选课输入1进展选课操作2:系统管理登陆局部功能如下:功能 1:登陆界面:功能 2:增加学生输入 1:功能 3:保存数据到硬盘 输入9:四、系统调试1.调试问题出现的主要问题:(主要是编译语法错误及修改)如:1.第289行:输入字符不对,指针的不准确定位。改为: coutN同学你已选stu.retfactcourse()门课,具体如下endl;2.第257行:输入语法错误:retrun改为:return3.第268行: 输入语法错误:类以分号完毕修改:在类体后加分号;五、实训心得课程设计是我们专业课程知识综合应用的实践训练,也是我们迈向社会,从事职业工作前一个必不少的过程千里之行始于足下,通过这次课程设计,我深深体会到这句千古名言的真正含义现在认真的进展课程设计,脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的根底程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术开展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C+语言又是最常见,功能最强大的一种高级语言,因此做好C+语言课程设计是十分必要的。熟悉C+集成开发环境的使用,为今后程序和调试奠定根底;也更加熟练了C+ 根本语法、程序的根本构造和调试一般程序的方法。两周的课程设计完毕了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。通过几天的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会效劳,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次真真的做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的缺乏之处,对一些前面学过的知识理解得不够深刻,掌握得不够结实,比方说构造体,指针通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。通过这次选修课程设计,我在多方面都有所提高。我比拟熟练地掌握了类的使用,知道什么时候该用类,怎样用类,怎样利用类的封装性来保护数据,建立数据与数据相结合的思想。在设计过程中遇到了许多问题,有不该犯的,习惯性的错误,也有因一些知识还未掌握而犯的错误,不过经过一次次的检查,修改,编译,渐渐的错误也就少了,懂得知识也多了,同时也使自己更加细心和耐心培养了独立思考的能力以及综合运用知识的能力,也体会到了学以致用、突出自己劳动成果的喜悦心情,从中也发现了自己平时学习的缺乏和薄弱之处,从而加以弥补。在此由要感我们的*教师.她严谨细致、一丝不苟的作风一直是我学习的典范;教师循循善诱的教诲和不拘一格的思路给予我无尽的启迪;而她开朗的个性和宽容的态度,在很大程度上帮助了我顺利的完成了这次课程设计.同时也感我的同学们,你们对我的帮助和支持,让我倍感温暖。由于本人的设计能力有限,在设计过程中难免出现错误,恳请教师们多多指教!六、附录程序源代码如下:*include *include *include *include *include using namespace std; /定义课程class course /*个学生所学的课程中的*一个public:charame20; /课程名称float grade; /课程成绩course *Ne*t; /指向下一个课程的指针;/学生类class studentpublic:student()root = NULL;const int ma*course = 5;factcourse = 0;void readname(char N ); /读入学生的void getname(char N); /得到学生的void wrecourse(char N,float score); /要据课程名写入学生课程的成绩float average(); /学生课程的平均成绩void addcourse(char N,float g); /给学生增加一门课int findcourse(char N); /查找是否已有此课程,如果有返回,如果没有返回int retfactcourse() return factcourse; /得到所学的课程数目course *retroot() return root; /利用键表将所有的课程保存起来int retma*course() return 5; /得到最多可学的课程数目void clrroot() /清零root = NULL;factcourse = 0;private:char sname20; /学生的int ma*course; /学生最多可以学五门课程int factcourse; /学生实际所学的课程数目course *root; /课程的根结点指针;void student:readname (char N)/读入学生的 strcpy(sname,N); void student:getname(char N)/得到学生的 strcpy(N,sname); void student:wrecourse(char N,float score)/要据课程名写入学生课程的成绩course *p = root;if(p=NULL)return;if(p!=NULL)p = p-Ne*t;while(p)if(strcmp(p-ame,N)=0)p-grade = score;p = p-Ne*t;float student:average()/学生课程的平均成绩float aver=0.0;course *p = root;while (p) aver = aver+p-grade; aver = aver/factcourse;return aver; void student:addcourse (char N,float g)/给学生增加一门课course *s = new course;s-Ne*t=NULL;if(root = NULL)root = s;course *p = root;course *newcourse = new course;newcourse-Ne*t = p-Ne*t;p-Ne*t=newcourse;strcpy(newcourse-ame,N);newcourse-grade = g;factcourse+;int student:findcourse (char N)/查找是否已有此课程,如果有返回,如果没有返回course *p = root;if(root=NULL)return 0;p = p-Ne*t;while(p) if(strcmp(p-ame,N)=0)return 1;p = p-Ne*t;return 0; class studentdbpublic:student stu;studentdb *Ne*t; ;class studentnamepublic:char tname20; /学生的名字float result; /学生所得的该课程分数studentname *Ne*t; ; /课程类class subjectpublic:subject()first = NULL;ma*student=30;activestudnet=0; float readcredit(); /得到课程的学分void getcredit(float a); /设置学分float getaverage(); /得到学生的平均成绩float getresult(char N); /查找*个学生的成绩void getkname(char N); /读出课程的名称void setkname(char N); /读入课程的名称studentname *retfirst() return first; /返回根结点void findstudent(studentdb *P); /根据该课程的名称,寻找选这课程的学生int retactivestudent() return activestudnet; /返回实际学生数int retma*student() return 30; /返回最多学生数void clractivestudnet() activestudnet = 0; /从文件中读出来后将实际学生数清零private:int ma*student; /最多学生数int activestudnet; /实际学生数studentname *first; /学生float credit; /该课程的学分float averagerusult; /该课程的平均成绩char kname20; /该课程的名称;float subject:readcredit ()/得到课程的学分 return credit; void subject:getcredit (float a)/设置学分 credit=a; float subject:getaverage()/得到学生的平均成绩float k = 0.0;studentname *p;p=first-Ne*t;if(p=NULL)return 0;while(p)k = k + p-result;p = p-Ne*t ; return k/activestudnet; float subject:getresult (char N) /查找*个学生的成绩studentname *p;p = first;while(p)if(strcpy(p-tname ,N)=0)return p-result;p = p-Ne*t ; return -1; void subject:getkname (char N) /读出课程的名称 strcpy(N,kname); void subject:setkname (char N) /读入课程的名称 strcpy(kname,N); void subject:findstudent(studentdb *P) /根据该课程的名称,寻找选这课程的学生studentname *newcode = new studentname;newcode-Ne*t=NULL;first = newcode;studentname *T = first;studentdb *K = P-Ne*t;while(K)course *Y = K-stu.retroot();if(Y =NULL) K = K-Ne*t;continue; if(Y!=NULL)Y = Y-Ne*t;while(Y) if(strcmp(Y-ame,kname)=0)studentname *Acode = new studentname;char Name20;K-stu.getname(Name);strcpy(Acode-tname,Name);Acode-result = Y-grade;Acode-Ne*t = T-Ne*t;T-Ne*t = Acode;activestudnet = activestudnet + 1;break; Y = Y-Ne*t; K = K-Ne*t; return ; void tuichu()system(cls); coutendlendlendl; cout 你使用选修课小系统endl;cout 此软件难免有缺乏之处,请谅解endl;cout 恳请您提出珍贵意见。! endl; getch();e*it(-1); /总菜单char menu()char a3,c,i;coutendlendlendl;cout 欢送来到选修课系统 endlendl;cout 制作人:*;班级:*; *:*endlendlendl;cout * endl;cout * * endl;cout * 选修课小系统 * endl;cout * 操作方式: * endl;cout * 1.选修课系统学生端 * endl;cout * 2.选修课系统管理端 * endl;cout * * endl;cout * endlendl;cout 请选择登入方式: a;if(strlen(a)=1)for(i=1;i=2;i+)c=i;if(c=a0)return c; /选修课系统端操作char custom()char A10;char b;char i;system(cls);coutendlendlendlendl;cout endl;cout endl;cout 选修课系统学生端 endl;cout endl;cout 操作方式: endl;cout 1.学生选课. 2.学生情况. endl;cout endl;cout endl;cout 3.选课情况. 4.退出系统. endl;cout endl;cout endlendl;cout 请选择操作方式: A;if(strlen(A)=1)for(i=1;i=4;i+)b=i;if(b=A0) return b; char server()char A10;system(cls);char b;char i;int k = 0;coutendlendlendlendl;cout endl;cout endl;cout 选修课系统管理端 endl;cout endl;cout .操作方式: endl;cout 1.增加学生 2.增加课程 endl;cout 3.删除学生 4.删除课程 endl;cout 5.填写成绩 6.更改学分 endl;cout 7.学生情况 8.选课情况 endl;cout 9.保存数据 0.退出系统 endl;cout endl;cout endl;cout 请选择操作方式: A;if(strlen(A)=1)for(i=0;i=9;i+)b=i;if(b=A0)return b; struct subjectdbsubject sub;subjectdb *Ne*t;int menu_2_7(studentdb *P);int menu_2_9(studentdb *Y,subjectdb *P);int menu_2_8(subjectdb *P);/学生端功能函数int menu_1_1(studentdb *P,subjectdb *) /学生选课system(cls);cout 学生选课操作Ne*t;int i;char N20,M20;if(q!=NULL)cout 所有学生如下:endl;elsecout 对不起,暂时没有学生!请先创立!请按任意键继续.stu.getname(N);coutNNe*t ; q = P-Ne*t;if(q=NULL)return 1;cout 请输入学生:N;i=0;q=P-Ne*t;while(q)q-stu.getname(M);if(strcmp(N,M)=0)i+;q = q-Ne*t; int j=0,k=1;if(i=0)cout没有这个学生! 请按任意键返回.1)cout共找到i个为N的学生endl;cout选择第几个:k; if(ki|k=0)cout输入有误!按任意键继续Ne*t;j=0;while(q)q-stu.getname(M);if(strcmp(N,M)=0)j+;if(j=k)if(q-stu.retfactcourse()=q-stu.retma*course()cout所选课程已满!按任意键继续Ne*t;char N120;if(t!=NULL)cout所有课程如下:endl;cout课程名称 学分endl; elsecout对不起,暂时没有课程sub.getkname(N1);coutN1setw(26-strlen(N1)sub.readcredit()Ne*t ; char N220;cout 输入你所要选的课程: N2;t = *-Ne*t;while(t)t-sub.getkname(N1);if(strcmp(N1,N2)=0)if(q-stu.findcourse(N2)=1)cout此课程你已选过了,不能再选.按任意键继续Ne*t;char NA20;while(t)t-sub.getkname(NA);if(strcmp(NA,N2)=0)if(t-sub.retactivestudent()=t-sub.retma*student ()cout此课程已选满,不能选.按任意键继续Ne*t; q-stu.addcourse(N2,0.0);cout选课成功!按任意键继续Ne*t; cout没有此课程!按任意键继续Ne*t; return 1; int menu_1_2(studentdb *P,subjectdb *) /学生情况studentdb *q=P-Ne*t;char N20;system(cls);cout学生情况操作endl;int i;if(q!=NULL)cout所有学生选课信息如下: endlendl;cout 选课情况endl; elsecout对不起,暂时没有学生!请按任意键继续.stu.getname(N);coutNsetw(25-strlen(N) 已选stu.retfactcourse() 门课Ne*t ; char M20;coutM;i=0;q=P-Ne*t;while(q)q-stu.getname(N);if(strcmp(N,M)=0)i+;q = q-Ne*t; int j=0,k=1;if(i=0)cout没找到这个学生!请按任意键继续.1)cout共找到i个为M的学生endl;coutk; if(ki|k=0)cout输入有误!按任意键继续.Ne*t;j=0;q=P-Ne*t;while(q)q-stu.getname(N);if(strcmp(N,M)=0)j+;if(j=k)course *T=q-stu.retroot();if(T=NULL)coutN同学你还未选课! 请按任意键继续.Ne*t;coutN同学你已选stu.retfactcourse()门课,具体如下endl;cout课程名称 成绩endl;while(T)coutameame)gradeNe*t; j=0; q = q-Ne*t; cout请按任意键继续.Ne*t;char N20;system(cls);cout选课情况操作endl;if(q!=NULL)cout所有选课情况如下: endl;cout课程名称 选课人数endl; elsecout对不起,暂时没有课程!请按任意键继续.sub.getkname(N);coutNsetw(28-strlen(N)sub.retactivestudent()Ne*t ; cout请按任意键继续.endl;return 1; int menu_1_4(studentdb *,subjectdb *P) /退出系统menu_2_9(*,P);tuichu();return 0; /管理端功能函数int menu_2_1(studentdb *P) /增加学生char N20;system(cls);cout增加学生操作nendl;cout请输入学生:N;coutendl增加学生操作成功,按任意键继续Ne*t = P-Ne*t ;newnode-stu.readname(N);P-Ne*t = newnode ;return 1; int menu_2_2(subjectdb *P) /增加课程float k;char N20,M20;system(cls);cout增加课程操作endl;cout 请输入课程名称:N;coutNe*t;while(q)q-sub.getkname(M);if(strcmp(N,M)=0)cout此课程已经存在,按任意键继续Ne*t; coutk;cout增加课程操作成功,按任意键继续Ne*t = P-Ne*t ;newnode-sub.setkname(N);newnode-sub.getcredit(k);P-Ne*t = newnode ;return 1; int menu_2_3(studentdb *P) /删除学生system(cls);cout删除学生操作Ne*t;if(q=NULL)return 1;int i;char N20,M20;cout请输入要删除的学生:N;i=0;while(q)q-stu.getname(M);if(strcmp(N,M)=0)i+;q = q-Ne*t; int j=0,k=1;if(i=0)cout没有这个学生!请按任意键继续.1)cout共找到i个为N的学生endl;cout要删除第几个:k; if(ki|kNe*t;studentdb *R = P;j=0;while(q)q-stu.getname(M);if(strcmp(N,M)=0)j+;if(j=k)R-Ne*t = q-Ne*t;free(q);cout删除学生操作成功,按任意键继续.Ne*t;R = R-Ne*t; return 1; int menu_2_4(subjectdb *P) /删除课程subjectdb *q=P-Ne*t;char N20;system(cls);cout删除课程操作endl;if(q!=NULL)cout所有课程如下: endl;elsecerr对不起,暂时没有课程!请按任意键继续.sub.getkname(N);coutNNe*t ; q = P-Ne*t;subjectdb *R = P;if(q=NULL)return 1;char M20;cout 请输入要删除的课程:M;while(q)q-sub.getkname(N);if(strcmp(N,M)=0)R-Ne*t = q-Ne*t;free(q);cout删除课程操作成功,按任意键继续Ne*t;R = R-Ne*t; cout没有此课程!请按任意键继续.Ne*t;char M20,N20,NA20;float score;system(cls);cout 填写成绩操作endl;if(q!=NULL)cout课程名称 选课人数endl;elsecout对不起,暂时没有任何选修课程。请按任意键继续.sub.getkname(N);coutNsetw(28-strlen(N)sub.retactivestudent()Ne*t ; q = P-Ne*t;cout请输入课程名称:M;while(q)q-sub.getkname(N);studentname *K = q-sub.retfirst();if(K!=NULL)K = K-Ne*t;if(strcmp(N,M)=0)if(K!=NULL)cout请填写选修M的学生成绩endl;cout 成绩endl; if(K=NULL)cout无任何信息!请按任意键继续.endl;while(K)couttnamescore;studentdb * = *-Ne*t;while(*)*-stu.getname(NA);if(strcmp(NA,K-tname)=0)*-stu.wrecourse(M,score);* = *-Ne*t; K = K-Ne*t; if(K=NULL)cout填写成绩完毕!请按任意键继续.Ne*t; cout没有此课程!请按任意键继续.endl;return 1; int menu_2_6(subjectdb *P) /更改学分float k;system(cls);cout更改学分操作Ne*t;char N20,M20;if(q!=NULL)cout 所有课程如下: endl;elsecout对不起,暂时没有任何可选课程。请按任意键继续.sub.getkname(N);coutNNe*t ; q = P-Ne*t;cout请输入要改的课程:M;while(q)q-sub.getkname(N);if(strcmp(N,M)=0)cout原来学分为:sub.readcredit()endl;cout现要更改为:k;q-sub.getcredit(k);cout更改课程学分成功,按任意键继续Ne*t; cout无此课程!请按任意键继续.Ne*t;char N20;system(cls);cout学生情况操作endl;if(q!=NULL)cout所有学生如下: endl;elsecout对不起,暂时没有学生!请按任意键继续.stu.getname(N);coutNendl;coutNe*t ; cout按任意键继续.Ne*t;char M20,N20;s
展开阅读全文