c++学生选课系统设计报告(共34页).doc
精选优质文档-倾情为你奉上C+程序设计课程设计报告课题名称: 学生选修课程系统设计 组 号: 第八组 指导教师: 张 帆 目 录 引言.一 设计目的及内容二 课题总体设计1. 性能需求2. 功能需求.3. 功能模块图三 详细设计. 1.各模块说明. . 2.各模块功能流程图 四 测试与调试五 心得体会.六 附:源代码.引 言21世纪以高科技为核心的知识经济占主导地位,国家的综合国力和以国际竞争力将越来越取决于科学技术创新水平。教育作为知识创新,传播和应用的基础,培养和输送人才的摇篮,已经成为经济发展和社会进步的基础。 尽管人类进步的程度随着不同时代,不同地区而有所变化,教育的口径不断扩宽,以便使过去仅供少数人使用的教育资源能够为更多各种年龄,不同社会阶层和背景的人们所用。在信息爆炸的时代,传统教学管理面临诸多挑战。课程设计是课程教学必不可缺的一个重要环节,可加深学生对该课程所学内容的进一步的了解与巩固,是将计算机课程与实际问题相连接的关键步骤。此次程序设计综合运用所学知识解决实际问题,将课堂的书本知识有效的在程序中体现出来,让学生更理解了C+功能之强大,进一步让学生对面向对象的方法以及C+的编程思想有了较好了解和认识。一 设计目的及内容:网上选课系统是针对在校学生和教师使用,从学生的角度来说,由于学校教学制度的改革,现在大部分高等院校开始实行的是学生的自主选课模式,传统的教学模式(学生按照学校安排好的课程上课)已经不能适应新型的教学手段,如果仍然通过纸上的选课,一方面浪费大量的人力,物力资源,另一方面浪费时间以及在人为的统计过程中不可避免出现的差错等情况。随着学校规模的不断扩大,专业,班级,学生的数量急剧增加,有关学生选课的各种信息也成倍增加,而目前许多高校的学生的选课管理仍然停留在复杂的人工操作上,重复工作较多,工作量大,效率低,各种弊端会越来越多的暴露出来,因此利用网络,使学生只要在计算机前输入自己的个人选课信息即可完成原来几倍的工作量。从教师的角度上来说,同样是节省了大量的工作量,由于教师提出代课申请完成课程发布的工作较学生选课而言更加的复杂,因此在网上进行课程发布能大幅度的减少教师的工作量,减少错误发生几率,作为教师,也只要通过自己的电脑来操作即可,不用奔波于教务处和办公室之间。1、课题名称:学生选修课程系统设计2、课程设计详细内容说明:假定有n门课程,每门课程有课程编号、课程名称、课程性质、总学时、授课学时、实验学时、学分、开课学期等信息。学生可以按要求(如每个学生总学分不得少于20、没学期不能超过3门课程,每门课程不得超过50个人,但不能少于10否则该课程不开设)自由选课。使之能提供一些功能:要求:具体设计要求实现如下功能:1、 课程信息录入功能2、 课程信息浏览功能3、 查询功能:(按课程性质查询、按课程学分查询,查询每个学生的选修信息、查询每门课程的选修信息等)4、 学生选修课程5、修改课程或选课信息(根据课程编号或名称修改课程信息、根据学生姓名修改选课信息);6、删除课程或选课信息(根据课程编号或名称删除课程信息、根据学生姓名删除选课信息);二 课题总体设计:1、 性能需求:在现代,高科技的飞跃发展,人们工作习惯的改变,别特是电脑的大量普及,人们生活节奏越来越来快,怎样提高工作效率是人们首先考虑的问题。学生选课是一个非常繁琐与复杂的一项工作,一个原因就是工作量大,不好管。对于一个学校而言,更应该运用一些本地资源,提高管理的力度,对学生负责,对国家负责。 显然,靠手工进行管理这种选课方法已经不能适应时代的发展,学校的需求。今天这种传统的管理方法必然会被计算机为基础的信息系统所代替。同时这种传统方式放映出很多问题:第一, 当要查询某个同学或某个班级的选课情况极不方便;第二, 每次 选课时省老师花大量时间统计各班级各学生的选课情况,这样准确率也较难保证;第三, 选课的可靠性很低;第四, 现在学校虽然已用计算机进行选课管理,但工作并不完善,有很大的局限性。2、 功能需求:我们设计的是一个学生选修金额系统,这个系统的功能比较完善。使用主函数中的switch语句实现该结构,进而实现该系统的各项功能。该系统能实现六项功能:1.录入信息、2.查询信息、3.删除课程、4.显示课程、5.保存信息、6.读取信息,设计本次试验所用到的知识点有:类和对象、FOR循环、switch语句、do while()语句、构造函数等等。3、 功能模块图:学生信息模块课程信息模块选课模块三 详细设计:1. 各模块说明:(1) 我们这学生选修课系统的主界面分有两个选项一个是学生使用的学生端一个是老师使用的教师端。(2) 学生端包括学生的选课情况、学生情况和学生选课,学生可在这里进行选课查询各学生选修课情况还可以查看学生的情况。(3) 选课系统管理端只有教师可以进入因为需要密码,设计密码是防止学生进入管理端随意修改。管理端包括一些要求里有的如:课程浏览、课程录入、课程删除、课程查询等,还包括一些要求里边没有的功能如:填写成绩、更改学分等。这些功能只有管理员才能进行修改和填写。2 各模块功能流程图:开始(1)主界面流程图:接受数据数据依据输入值执行i=1i=1i=2i=2Case 2Case 1Case 1Case 2结束(2)学生端流程图:开始按任意键输入数据是否为4学生选课学生情况选课情况nY结束(3)管理端流程图:开始否但小于三次输入数据是否为Y否且大于三次输入数据录入课程删除课程保存数据等N是否为0Y结束四 测试与调试:运行:1. 学生选课主界面2. 选修课系统学生端3. 系统管理端4. 学生选课界面5. 查询学生所选课程界面6. 删除课程界面7. 课程信息录入功能8. 按课程查询所选人数遇到的问题和解决办法:这个程序用到了数据结构的内容可是我们还没有学习数据结构当时这件事真是吧我们难住了,没办法只能自己上网还有去图书馆这中间也去问过老师最终还是把主要问题解决了,不过这中间可能有一些问题是我们现在解决不了的。五 心得体会:1 每当拿到一个小工程,我们都得先仔细分析用户的需求,然后再给程序定位(所花费的人力、物力以及财力),这将花费我们大量的时间,就如本次任务一样,我们首先聚在一起分析,然后得出大致方向,再具体分配任务,无论哪一部分都是我们努力的结果。2 通过这次学生选课系统设计,以C+语言为基础的编写,更让我掌握到C+语言中的相关语句的应用。3 用Visual C+ 6.0 环境下编写,我觉得,从文件中读入数据十分麻烦,没有数据库中读入数据那么轻松,如果我要用到两个表中的记录,非常麻烦。4 整个设计过程过后,我也基本掌握了设计的基本步骤,为我们以后做毕业论文也有很好的帮助。5 C+是很好的系统编程语言,但不能以此独立,但用C+语言是做不出好的系统,还是要和其他软件结合,以C+为基础编写的系统,这样做出来的系统也更好,更美观。6 这次系统设计有很多不足之处,在这过程中也认识到自己对C+也有很多的没掌握的地方。但是在老师和同学的帮助下,也算是弄出了一个简单的系统,在以后也要更加努力的学习,掌握更好的编程技术。7 做程序真的是个很累的活,有时就为了一个小小的错误,可以一两顿饭不吃,但是做出来的那一刻,真心的感觉很开心,很有成就感,虽然其应用性不高,至少这也是我们小组努力的结果。8 经过我们多天的团结合作终于把这个学生选课系统做完了,虽然这过程是艰难的但是做完之后感觉挺有成就感的,在这个过程中我们学到了很多光听老师讲学不到的东西。在写这个程序的时候用到了数据结构的内容,如果不是这个程序我觉得我是不会去自学数据结构的内容。参考书目: 谭浩强,C+程序设计,清华大学出版社,2002.4 求是科技,Visual C+ 6.0信息管理系统开发,人民邮电出版社,2005.4 陈良银、游洪跃、李旭伟,C语言程序设计(C99版),清华大学出版社,2006.10 殷人昆,数据结构(用面向对象方法与C+语言描述),清华大学出版社,2007.2编程人员:孙双蕾、白晓兰实验报告设计:牟炼调试人员:孙双蕾讲解人员:白晓兰附录:源代码#include <iostream>#include <iomanip>#include <fstream>#include <conio.h>using namespace std; /定义课程class course /某个学生所学的课程中的某一个public:char cname20; /课程名称float grade; /课程成绩course *Next; /指向下一个课程的指针;/学生类class studentpublic:student()root = NULL;const int maxcourse = 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 retmaxcourse() return 5; /得到最多可学的课程数目void clrroot() /清零root = NULL;factcourse = 0;private:char sname20; /学生的姓名int maxcourse; /学生最多可以学五门课程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->Next;while(p)if(strcmp(p->cname,N)=0)p->grade = score;p = p->Next;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->Next=NULL;if(root = NULL)root = s;course *p = root;course *newcourse = new course;newcourse->Next = p->Next;p->Next=newcourse;strcpy(newcourse->cname,N);newcourse->grade = g;factcourse+;int student:findcourse (char N)/查找是否已有此课程,如果有返回,如果没有返回course *p = root;if(root=NULL)return 0;p = p->Next;while(p) if(strcmp(p->cname,N)=0)return 1;p = p->Next;return 0; class studentdbpublic:student stu;studentdb *Next; ;struct studentnamechar tname20; /学生的名字float result; /学生所得的该课程分数studentname *Next; ; /课程类class subjectpublic:subject()first = NULL;maxstudent=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 retmaxstudent() return 30; /返回最多学生数void clractivestudnet() activestudnet = 0; /从文件中读出来后将实际学生数清零private:int maxstudent; /最多学生数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->Next;if(p=NULL)return 0;while(p)k = k + p->result;p = p->Next ; 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->Next ; 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->Next=NULL;first = newcode;studentname *T = first;studentdb *K = P->Next;while(K)course *Y = K->stu.retroot();if(Y =NULL) K = K->Next;continue; if(Y!=NULL)Y = Y->Next;while(Y) if(strcmp(Y->cname,kname)=0)studentname *Acode = new studentname;char Name20;K->stu.getname(Name);strcpy(Acode->tname,Name);Acode->result = Y->grade;Acode->Next = T->Next;T->Next = Acode;activestudnet = activestudnet + 1;break; Y = Y->Next; K = K->Next; return ; void tuichu()system("cls");cout<<"nn谢谢你使用选修课系统nn"<<endl;cout<<"n you're welcome ! n"<<endl; getch();exit(-1); /总菜单char menu()int k=0;char a3,c,i;system("cls");cout<<endl<<endl;cout<<"*n"<<"* *n"<<"* 学生选修课系统 *n"<<"* *n"<<"* *n"<<"* 操作方式: *n"<<"* 1.选修课系统学生端 *n"<<"* *n"<<"* 2.选修课系统管理端 *n"<<"* *n"<<"*n"<<endl;while(1)cout<<"ntt请选择登入方式: "cin>>a;if(strlen(a)=1)for(i='1'i<='2'i+)c=i;if(c=a0)return c; cerr<<"nntttt输入有误!n"<<endl;k+;if(k>2)system("cls");cerr<<"nnntt提示:错误输入次数超过三次,你将被强制退出!nn"<<endl;cout<<"tt按任意键继续"<<endl;getch();tuichu(); /选修课系统端操作char custom()char A10;char b;char i;int k = 0;system("cls");cout<<"nnn"<<"n"<<" 选修课系统学生端 n"<<" n"<<" 操作方式:. n"<<" 1、 学生选课 n"<<" 2、 学生情况 n"<<" 3、 选课情况 n"<<" 4、 退出系统 n"<<" n"<<"n"<<endl;while(1)cout<<"ttt请选择操作方式: "cin>>A;if(strlen(A)=1)for(i='1'i<='4'i+)b=i;if(b=A0) return b; cerr<<"ntttt输入有误!n"<<endl;k+;if(k>2)system("cls");cerr<<"nnttt提示:错误输入超过三次!你将被强制退出!n"<<endl;cout<<"tt按任意键继续"<<endl;getch();tuichu(); char server()char A10;char b;char i;int k = 0;system("cls");cout<<"nnn"<<"n"<<" n"<<" 选修课系统管理端 n"<<" n"<<" 操作方式: n"<<" 1.增加学生 2.增加课程 n"<<" 3.删除学生 4.删除课程 n"<<" 5.填写成绩 6.更改学分 n"<<" 7.学生情况 8.选课情况 n"<<" 9.保存数据 0.退出系统 n"<<" n"<<"n"<<endl;while(1)cout<<"tt 请选择操作方式: "cin>>A;if(strlen(A)=1)for(i='0'i<='9'i+)b=i;if(b=A0)return b; cerr<<"ntttt输入有误!n"<<endl;k+;if(k>2)cerr<<"错误输入超过三次!n"exit(-1); /密码检查void password()int k=0,i;char A=""char B10;char a;system("cls");for(i=0;i<8;i+)cout<<endl;while(k<=2)printf("ttt请输入管理员密码:");i=0;while(1)a=getch();if(a=13)break;Bi=a;i+;printf("*");Bi='0'if(strcmp(A,B)=0)return;elsek+;cerr<<"nnttt密码输入错误!请重新输入!n"<<endl;if(k>=3)system("cls");cerr<<"nnttt输入错误密码超过三次!请按任意键退出."<<endl;getch();tuichu();struct subjectdbsubject sub;subjectdb *Next;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 *X) /学生选课system("cls");cout<<"nntttt学生选课操作"<<endl;studentdb *q=P->Next;int i;char N20,M20;if(q!=NULL)cout<<"nnntt所有学生名单如下:n"<<endl;elsecerr<<"nnntt对不起,暂无学生名单!请先创建!请按任意键继续."<<endl;return 1; while(q)q->stu.getname(N);cout<<"tttt"<<N;cout<<endl;q = q->Next ; q = P->Next;if(q=NULL)return 1;cout<<"nntt 请输入学生姓名:"cin>>N;i=0;q=P->Next;while(q)q->stu.getname(M);if(strcmp(N,M)=0)i+;q = q->Next; int j=0,k=1;if(i=0)cout<<"nntt没有这个学生! 请按任意键返回."<<endl;return 1; else if(i>1)cout<<"nntt共找到"<<i<<"个姓名为"<<N<<"的学生"<<endl;cout<<"tt选择第几个:"cin>>k; if(k>i|k<=0)cerr<<"nttt输入有误!按任意键继续"<<endl;return 1; q = P->Next;j=0;while(q)q->stu.getname(M);if(strcmp(N,M)=0)j+;if(j=k)if(q->stu.retfactcourse()>=q->stu.retmaxcourse()cout<<"ntt所选课程已满!按任意键继续"<<endl;return 1; elsesubjectdb *t=X->Next;char N120;system("cls");if(t!=NULL)cout<<"nnntt所有课程如下:"<<endl;cout<<"ntttt课程名称tt 学分"<<endl; elsecerr<<"nnntt对不起,暂时没有课程"<<endl;return 1; while(t)t->sub.getkname(N1);cout<<"tttt "<<N1<<setw(26-strlen(N1)<<t->sub.readcredit()<<endl;t = t->Next ; char N220;cout<<"nt 输入你所要选的课程: "cin>>N2;t = X->Next;while(t)t->sub.getkname(N1);if(strcmp(N1,N2)=0)if(q->stu.findcourse(N2)=1)cout<<"ntt此课程你已选过了,不能再选.按任意键继续"<<endl;return 1; t=X->Next;char NA20;while(t)t->sub.getkname(NA);if(strcmp(NA,N2)=0)if(t->sub.retactivestudent()>=t->sub.retmaxstudent ()cout<<"ntt此课程已选满,不能选.按任意键继续"<<endl;return 1; t = t->Next; q->stu.addcourse(N2,0.0);cout<<"nntt选课成功!按任意键继续"<<endl;return 1; t = t->Next; cerr<<"ntt没有此课程!按任意键继续"<<endl; return 1; q = q->Next; return 1; int menu_1_2(studentdb *P,subjectdb *X) /学生情况studentdb *q=P->Next;char N20;system("cls");cout<<"nntttt学生情况操作"<<endl;int i;if(q!=NULL)cout<<"nnntt所有学生选课信息如下:n"<<endl<<endl;cout<<"tt 姓名ttt选课情况n"<<endl; elsecerr<<"nnntt对不起,暂时没有学生名单!请按任意键继续."<<endl;return 1; while(q)q->stu.getname(N);cout<<"tt "<<N<<setw(25-strlen(N)<<" 已选"<<q->stu.retfactcourse()<<" 门课"<<endl;