1、学生选修课选课系统目 录1 前言12 需求分析22.1 编写目的22.2 需求概述22.3 需求说明22.4 开发环境23 总体设计33.1功能模块图33.2 流程图43.3 类的设计图54 各功能模块设计74.1整体设计74.2主要的功能函数设计75 系统调试86 总结与体会146.1 总结146.2 编写程序中遇到的问题及解决办法14参考文献15附录 源程序16须眉原作1 前言随着计算机的普及,各高校均采用计算机进行学生选课。学生选修课系统主要包含选修课管理系统及学生选课系统两部分。学生选修课系统一般需要有管理员管理选修课课程,然后学生对经过管理员操作后的选修课进行选课。选修课管理系统由管
2、理员登录,对当前所有选修课课程进行管理操作。学生选课系统则是由学生登录,学生可以查看由管理员整理好的所有选修课,并从显示出的选修课中选择自己要选择的课程。管理员管理选修课实质是对后台选修课库中的选修课信息进行操作,可以在库中添加课程或删除课程。学生选课的实质即是先打印出后台选修课库中所有选修课信息以供选择,选择课程即是对后台学生信息库里的学生信息进行修改。2 需求分析2.1 编写目的 (1)要求学生达到熟练掌握C+语言的基本知识和技能; (2)基本掌握面向对象程序设计的基本思路和方法; (3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题; (4)通过编写此系统,实现选修课系统的
3、基本功能。2.2 需求概述 (1)系统中包括两个登陆身份(管理员与学生),并对应不同的功能; (2)对于管理员,此系统具有添加、删除、查看选修课等功能; (3)对于学生,此系统具有选课、查询等功能2.3 需求说明 此系统可以实现学生选课,管理员管理课程的基本功能2.4 开发环境 使用Visual C+6.0编程软件3 总体设计3.1功能模块图(1)学生学生身份有两个功能,分别是选课与查看个人信息。如图3.1所示。学生选课个人信息 图 3.1 学生功能模块图(2) 管理员管理员可以对选修课课程进行管理。如下图所示。管理员查看选修课删除选修课添加选修课图 3.2 管理员功能模块图3.2 流程图 进
4、入系统后可以选择以学生身份或者管理员身份登录。学生登录需要输入个人的学号及姓名,成功登录后可以选课或查询个人信息。管理员的登录需要输入密码,成功登录后则可以对当前所有的选修课进行管理操作,可添加新选修课或删除已有的选修课。详细操作流程如下图所示。选择身份或退出学生管理员开始结束选课个人信息查看选修课删除选修课添加选修课显示全部按类型选课按学分选课显示全部按类型查询按学分查询输入学号及姓名输入密码图 3.3 流程图3.3 类的设计图(1) Course类 Course类即选修课课程类。数据成员分别是:课程编号、课程名称、课程类型、开课时间、授课学时、实验学时、总学时以及学分。成员函数则包含所有数
5、据成员的get函数,用以获取数据成员的值,set函数用来修改课程,print函数则是打印课程的信息。如下图所示。Courseid: char *name: char *nature: char *date: char *shours: intahours: intzhours: intscore: doublescore: doublegetId(): char *getName(): char*getNature(): char*getDate(): char*getAhours(): intgetShours(): intgetZhours(): intgetScore(): double
6、set(char *a, char *b, char *c, char *d, int e, int f, double g): voidprint(): void图 3.4 Course类(2) Student类 Student类即学生类。其中包含了学生的学号、学生姓名、所选的两门课程及两门选修课课程的总学分。setId和setName是用来修改相关成员的值,getName获取学生的姓名,print函数用来打印学生的相关信息,个selectCourse则是用来选课。如下图所示。Studentid: char *name: char *c1: Coursec2: Coursezscore: d
7、ounblesetId(char * a1): voidsetName(char* a1): voidgetName(): char*selectCourse_1(Course cc): voidselectCourse_2(Course cc): voidprint(): voidprint(): void图3.5 Student类4 各功能模块设计4.1整体设计对于学生和选修课,我们分别定义了相应的类Student和类Course,其间的关系就是学生类中有两个选修课类对象成员。而对于管理员我们并没有单独去定义类,因为管理员只是对选修课进行操作,程序中并不需要访问管理员的信息。为了方便对选修
8、课进行管理及多位学生的登录,我们定义了一个选修课数组和学生数组。4.2主要的功能函数设计(1) 选课函数 void selectCourse(Student s110, Course c1M, int s_num1) 对当前学生对象进行操作,覆盖其选修课对象成员c1或c2,即学生的选课。(2) 两种输出所需选修课函数按学分输出选修课函数 void selectScore(Course c1M)按类型输出选修课void selectNature(Course c1M)对传递进来的选修课数组进行扫描,输出符合要求的选修课。(3) 选修课排序函数 void xu(Course c1M)使用冒泡排序法
9、对选修课数组进行编号从小到大的排序。(4) 主菜单函数 void menu(Course c16, Student s110)所有菜单循环都在其中,调用其他函数来实现具体功能。5 系统调试1. 系统主界面进入系统主界面后可以选择登录身份或退出程序。如图5.1所示。图5.1 系统主界面2.选修课管理系统图5.1选择登录身份为管理员,默认密码123,输入-1可返回图5.1界面。密码输入正确后可进入管理员登录系统。如图5.2所示。图5.2 选修课管理系统3. 按学分查看选修课图5.2选择查看选修课,可以查看当前所有的选修课课程的相关信息。可以选择不同的输出方式:按学分查询、按类型查询、显示全部。选择
10、按学分查询,在选择0.5,可打印当前所有课程中学分为0.5的课程信息。如图5.3所示。图5.3 按学分查看选修课4. 查询全部选修课查看选修课功能中可以选择显示全部,即罗列出当前所有的选修课课程信息。如图5.4所示。图5.4 查询全部选修课5. 管理员添加选修课图5.2选择添加选修课,可以添加一门新的选修课,然后按要求输入课程信息。如图5.5所示。图5.5 管理员添加选修课6. 添加后的选修课信息添加选修课后选择返回上一层,再选择显示全部选修课可以看到已新增的选修课已添加成功。如图5.6所示。图5.6 添加后的选修课7. 管理员删除选修课图5.2选择删除选修课。输入要删除的选修课的编号,即可删
11、除相应的选修课。如图5.7所示。图5.7 管理员删除选修课8. 删除后的选修课信息删除选修课后选择返回上一层,再选择显示全部选修课可以看到已删除的选修课已删除成功。如图5.8所示。图5.8 删除后的选修课信息9. 学生选课系统图5.1选择学生,然后输入学生的姓名及学号就能进入学生选课系统。如图5.9所示。图5.9 学生选课系统10. 学生选课以学生身份登录成功后,可以选择选课或是查询个人信息。选择选课可以选择按学分选课、按课程类型选课或显示全部课程再进行选课。选择按学分选课,再选艺术类,再输入课程编号即可选择相应课程。如图5.10所示。图5.10 学生选课11. 学生信息选择查看个人信息程序即
12、打印出当前学生的相关信息。如图5.11 所示。图5.11 学生信息12. 退出图5.1选择退出即退出程序。如图5.12所示。图5.12 退出程序6 总结与体会6.1 总结本程序实现了学生选课及管理员对课程的操作功能,而学生的选课及管理员对课程的管理,都可以按学分或类型来进行操作。管理员登录的默认密码是123,管理员可以添加新的选修课课程,也可以删除原有的选修课。经过此次的课程设计,我们受益颇丰,尤其是对在编写过程中遇到的难题的处理方法,学会了很多程序设计的技巧。6.2 编写程序中遇到的问题及解决办法(1)在无法与后台交互的情况下如何实现用户登录?因为只需要管理员有对选修课操作的能力,因此不需储
13、存管理员的信息,只需在其登录前询问密码即可。而学生的登录,在其登录时分配一个对象空间,储存在其登录时获取的学号及姓名即可,即每一个学生的登录相当于注册过程。(2)如何在不退出程序的情况下,能够让多位学生进行选课?定义学生类对象数组,每一位学生选完课后,再分配一个新的学生类对象空间。(3)如何实现对学生对象中课程对象成员的覆盖?一开始我们为了方便起见是考虑学生类课程对象定义为引用,这样只需引用已有的选修课课程即可,但这样的话,在对学生对象初始化时引用的初始化就成了问题,因此只能放弃。最终是选择了使用set和get方法对对象成员的成员一个个覆盖。参考文献1 黄维通.Visual C+面向对象与可视
14、化程序设计(第2版).北京:清华大学出版社,2007.2 张乃孝,陈光,孙猛.算法与数据结构C语言描述(第三版),2011.3 谭浩强.C程序语言设计(第三版)M.北京:清华大学出版社,2007.4 杨永斌.数据结构理论与实践M.天津:科学技术出版社,2011.5 罗建军.C+程序射机枪教程(第2版).北京:高等教育出版社,2004.6 郑振杰.C+程序设计. 北京:人民邮电出版社,2005.7 刘觉夫,王更生等.c+程序设计.北京:邮电大学出版社,2011.8 邵伟忠.C常用算法程序集.天津:人民出版社,2009.9 徐世亮.C+大学教程.北京:人民邮电出版社,2010.10 吴华恩.C+程
15、序设计.北京:机械工业出版社,2008.11 邵伟忠.C常用算法程序集.天津:人民出版社,2009.附录 源程序#include #include #define M 10class Course /选修课课程类private:char * id;char * name;char * nature;char * date;int shours;int ahours;int zhours;double score;public:Course()id = unknown;name = unknown;nature = unknown;zhours = 0;shours = 0;ahours = 0
16、;date = unknown;score = 0;Course(char *a, char *b, char *c, char *d, int e, int f, double g)id = a;name = b;nature = c;date = d;shours = e;ahours = f;score = g;zhours = e + f;void set(char *a, char *b, char *c, char *d, int e, int f, double g)id = a;name = b;nature = c;date = d;shours = e;ahours = f
17、;score = g;zhours = e + f;char * getDate()return date;int getZhours()return zhours;int getShours()eturn shours;int getAhours()return ahours;double getScore()return score;char * getNature()return nature;char * getId()eturn id;char * getName()return name;void print()cout 编号: id t;cout 名称: name t;cout
18、类型: nature t;cout 上课时间: date endl;cout 总学时: zhours h t;cout 授课学时: shours h t;cout 实验学时: ahours h t;cout 学分: score endl;class Student /学生类private: /学生选的课程是对象的成员char * id;char * name;Course c1;Course c2;double zscore;public:Student()id = unknown;name = unknown;zscore = 0;void setId(char * a1)d = a1;vo
19、id setName(char * a1)name = a1;char * getName()return name;void print()cout n学号: id endl;cout 姓名: name endl;cout 您已选的选修课:n1.;c1.print();cout 2.;c2.print();cout 选修课总学分: c1.getScore() + c2.getScore() n endl;void selectCourse_1(Course cc) /修改对象的课程成员c1.set(cc.getId(),cc.getName(),cc.getNature(),cc.getDa
20、te(),cc.getShours(),cc.getAhours(),cc.getScore();void selectCourse_2(Course cc)c2.set(cc.getId(),cc.getName(),cc.getNature(),cc.getDate(),cc.getShours(),cc.getAhours(),cc.getScore();void selectCourse(Student s110, Course c1M, int s_num1) /选课char id210, select1;int i, j, k;for(j=0; j2; j+)cout k;cout
21、 idj;for(i=0; iM & c1i.getScore() !=0; i+) /扫描所有选修课,如果当前选修课为空则跳出循环if(strcmp(idj, c1i.getId()=0)if(1 = k)s1s_num1.selectCourse_1(c1i);break;if(2 = k)s1s_num1.selectCourse_2(c1i);break;if(0 = j)cout select1;if(n = select1) break;cout n选课成功! endl;void selectScore(Course c1M) /按学分查询选修课int select, num, i
22、;cout n请输入选修课的学分:;cout n 1. 0.5n 2. 1.0 endl;cout select;num = 1;if(1 = select)for(i=0; iM & c1i.getScore() !=0; i+)if(0.5 = c1i.getScore()cout num .;c1i.print();cout endl;num+;else if(2 = select)for(i=0; iM & c1i.getScore() !=0; i+)if(1.0 = c1i.getScore()cout num .;c1i.print();cout endl;num+;else c
23、out 对不起,您的输入有误,请重新输入!nn;void selectNature(Course c1M) /按类型查询选修课int select, num, i;char n110=艺术类, n210 =学术类;cout 请输入选修课的学分:;cout n 1. 艺术类n 2. 学术类 endl;cout select;num = 1;if(1 = select)for(i=0; iM & c1i.getScore() !=0; i+)if(strcmp(n1, c1i.getNature() = 0)cout num .;c1i.print();cout endl;num+;else if
24、(2 = select)for(i=0; iM & c1i.getScore() !=0; i+)if(strcmp(n2, c1i.getNature() = 0)cout num .;c1i.print();cout endl;num+;else cout 对不起,您的输入有误,请重新输入!nn;void xu(Course c1M) /当前所有选修课进行排序(编号从小到大) int i,j,k=0,num=0; Course cc; for(j=0; jM & c1j.getScore() !=0; j+) for(i=num; i 0) k+;cc.set(c1i.getId(),c1
25、i.getName(),c1i.getNature(),c1i.getDate(),c1i.getShours(),c1i.getAhours(),c1i.getScore();c1i.set(c1i+1.getId(),c1i+1.getName(),c1i+1.getNature(),c1i+1.getDate(),c1i+1.getShours(),c1i+1.getAhours(),c1i+1.getScore();c1i+1.set(cc.getId(),cc.getName(),cc.getNature(),cc.getDate(),cc.getShours(),cc.getAho
26、urs(),cc.getScore(); else k = 2; if(1 = k) num = i; k = 0; void menu(Course c16, Student s110) /菜单int flag0, flag1, flag2, flag3, flag4, password=0 ;int select, s_num=0, i, j, num, newNum;char id1010;char select1;char id110;char name110;char da20;char na10;int sh;int ah;double sc;flag0 = 1;while(fla
27、g0)cout n= endl;cout | 菜 单 | endl;cout = endl;cout | 1.管理员 | endl;cout | 2.学生 | endl;cout | 3.退出 | endl;cout = endl;cout select;switch(select)case 1:flag3 = 1;while(1)cout password;if(-1 = password) flag3 =0;break;if(123 = password) cout n 管理员,你好!欢迎登录! endl;break;cout 密码错误,请重新输入!n;while(flag3)cout n
28、= endl;cout | 菜 单 | endl;cout = endl;cout | 1.添加选修课 | endl;cout | 2.删除选修课 | endl;cout | 3.查看选修课 | endl;cout | 4.返回上一层 | endl;cout = endl;cout select;switch(select)case 1:newNum = 0;for(i=0; iM & c1i.getScore() !=0; i+) newNum+;cout n请按格式依次输入选修课的编号、名称、上课时间(x.xx-x.xx)、类型(艺术类或学术类)、授课学时、实验学时、学分: id1 nam
29、e1 da na sh ah sc;c1newNum.set(id1, name1, da, na, sh, ah, sc);xu(c1);cout 添加成功! endl;break;case 2:flag4 = 1;j = 0;num = 0;while(flag4)cout idj;for(i=0; iM & c1i.getScore() !=0; i+)if(strcmp(idj, c1i.getId()=0)for(num=i; numM & c1i.getScore() !=0; num+)c1num.set(c1num+1.getId(),c1num+1.getName(),c1n
30、um+1.getNature(),c1num+1.getDate(),c1num+1.getShours(),c1num+1.getAhours(),c1num+1.getScore();c1num = Course();break;cout 删除成功!n;cout select1;if(n = select1) break;j+;break;case 3:flag2 = 1;while(flag2)cout n= endl;cout | 菜 单 | endl;cout = endl;cout | 1.按学分查询选修课 | endl;cout | 2.按选修课类型查询选修课 | endl;co
31、ut | 3.显示全部 | endl;cout | 4.返回上一层 | endl;cout = endl;cout select;switch(select)case 1:selectScore(c1);break;case 2:selectNature(c1);break;case 3:for(i=0; iM & c1i.getScore() !=0; i+)cout i+1 . ;c1i.print();cout endl;break;case 4:flag2 = 0;break;default :cout 对不起,您的输入有误,请重新输入!nn;break;case 4:flag3 =
32、0;break;default :cout 对不起,您的输入有误,请重新输入!nn;break;case 2:char a10, b10;s1s_num = Student();cout a;s1s_num.setId(a);cout b;s1s_num.setName(b);flag1 = 1;while(flag1)cout n= endl;cout | 菜单 | endl;cout = endl;cout | 1.选课 | endl;cout | 2.个人信息 | endl;cout | 3.返回上一层 | endl;cout = endl;cout select;switch(select)case 1:flag2 = 1;cout n s1s_num.getName() ,你好!欢迎登录! endl;while(flag2)cout n= endl;cout | 菜 单 | endl; cout = endl;cout | 1.按学分查询选修课 | endl;cout | 2.按选修课类型查询选