学生选修课选课系统目录1 前言 02 需求分析 (1)编写目的 (1)需求概述 (1)需求说明 (1):开发环境 (1)3 总体设计 (2)功能模块图 (2)流程图 (3)类的设计图 (4)4 各功能模块设计 (6)整体设计 (6)主要的功能函数设计 (6)|5 系统调试 (7)6 总结与体会 (13)总结 (13)编写程序中遇到的问题及解决办法 (13)参考文献 (14)附录源程序 (15)!须眉原作1 前言随着计算机的普及,各高校均采用计算机进行学生选课。
学生选修课系统主要包含选修课管理系统及学生选课系统两部分。
学生选修课系统一般需要有管理员管理选修课课程,然后学生对经过管理员操作后的选修课进行选课。
选修课管理系统由管理员登录,对当前所有选修课课程进行管理操作。
学生选课系统则是由学生登录,学生可以查看由管理员整理好的所有选修课,并从显示出的选修课中选择自己要选择的课程。
管理员管理选修课实质是对后台选修课库中的选修课信息进行操作,可以在库中添加课程或删除课程。
学生选课的实质即是先打印出后台选修课库中所有选修课信息以供选择,选择课程即是对后台学生信息库里的学生信息进行修改。
2 需求分析编写目的(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题;(4)通过编写此系统,实现选修课系统的基本功能。
需求概述(1)系统中包括两个登陆身份(管理员与学生),并对应不同的功能;(2)对于管理员,此系统具有添加、删除、查看选修课等功能;(3)对于学生,此系统具有选课、查询等功能需求说明此系统可以实现学生选课,管理员管理课程的基本功能开发环境使用Visual C++编程软件3 总体设计功能模块图(1)学生学生身份有两个功能,分别是选课与查看个人信息。
如图所示。
图学生功能模块图(2)管理员管理员可以对选修课课程进行管理。
如下图所示。
图管理员功能模块图流程图进入系统后可以选择以学生身份或者管理员身份登录。
学生登录需要输入个人的学号及姓名,成功登录后可以选课或查询个人信息。
管理员的登录需要输入密码,成功登录后则可以对当前所有的选修课进行管理操作,可添加新选修课或删除已有的选修课。
详细操作流程如下图所示。
图流程图类的设计图(1)Course类Course类即选修课课程类。
数据成员分别是:课程编号、课程名称、课程类型、开课时间、授课学时、实验学时、总学时以及学分。
成员函数则包含所有数据成员的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(): doubleset(char *a, char *b, char *c, char *d, int e, int f, double g):voidprint(): void图 Course类(2)Student类Student类即学生类。
其中包含了学生的学号、学生姓名、所选的两门课程及两门选修课课程的总学分。
setId和setName是用来修改相关成员的值,getName获取学生的姓名,print函数用来打印学生的相关信息,个selectCourse 则是用来选课。
如下图所示。
图 Student类4 各功能模块设计整体设计对于学生和选修课,我们分别定义了相应的类Student和类Course,其间的关系就是学生类中有两个选修课类对象成员。
而对于管理员我们并没有单独去定义类,因为管理员只是对选修课进行操作,程序中并不需要访问管理员的信息。
为了方便对选修课进行管理及多位学生的登录,我们定义了一个选修课数组和学生数组。
主要的功能函数设计(1)选课函数void selectCourse(Student s1[10], Course c1[M], int s_num1)对当前学生对象进行操作,覆盖其选修课对象成员c1或c2,即学生的选课。
(2)两种输出所需选修课函数按学分输出选修课函数 void selectScore(Course c1[M])按类型输出选修课void selectNature(Course c1[M])对传递进来的选修课数组进行扫描,输出符合要求的选修课。
(3)选修课排序函数void xu(Course c1[M])使用冒泡排序法对选修课数组进行编号从小到大的排序。
(4)主菜单函数void menu(Course c1[6], Student s1[10])所有菜单循环都在其中,调用其他函数来实现具体功能。
5 系统调试1.系统主界面进入系统主界面后可以选择登录身份或退出程序。
如图所示。
图系统主界面2.选修课管理系统图选择登录身份为管理员,默认密码123,输入-1可返回图界面。
密码输入正确后可进入管理员登录系统。
如图所示。
图选修课管理系统3.按学分查看选修课图选择查看选修课,可以查看当前所有的选修课课程的相关信息。
可以选择不同的输出方式:按学分查询、按类型查询、显示全部。
选择按学分查询,在选择,可打印当前所有课程中学分为的课程信息。
如图所示。
图按学分查看选修课4.查询全部选修课查看选修课功能中可以选择显示全部,即罗列出当前所有的选修课课程信息。
如图所示。
图查询全部选修课图选择添加选修课,可以添加一门新的选修课,然后按要求输入课程信息。
如图所示。
图管理员添加选修课6.添加后的选修课信息添加选修课后选择返回上一层,再选择显示全部选修课可以看到已新增的选修课已添加成功。
如图所示。
图添加后的选修课图选择删除选修课。
输入要删除的选修课的编号,即可删除相应的选修课。
如图所示。
图管理员删除选修课8.删除后的选修课信息删除选修课后选择返回上一层,再选择显示全部选修课可以看到已删除的选修课已删除成功。
如图所示。
图删除后的选修课信息9.学生选课系统图选择学生,然后输入学生的姓名及学号就能进入学生选课系统。
如图所示。
图学生选课系统10.学生选课以学生身份登录成功后,可以选择选课或是查询个人信息。
选择选课可以选择按学分选课、按课程类型选课或显示全部课程再进行选课。
选择按学分选课,再选艺术类,再输入课程编号即可选择相应课程。
如图所示。
图学生选课11.学生信息选择查看个人信息程序即打印出当前学生的相关信息。
如图所示。
图学生信息12.退出图选择退出即退出程序。
如图所示。
图退出程序6 总结与体会总结本程序实现了学生选课及管理员对课程的操作功能,而学生的选课及管理员对课程的管理,都可以按学分或类型来进行操作。
管理员登录的默认密码是123,管理员可以添加新的选修课课程,也可以删除原有的选修课。
经过此次的课程设计,我们受益颇丰,尤其是对在编写过程中遇到的难题的处理方法,学会了很多程序设计的技巧。
编写程序中遇到的问题及解决办法(1)在无法与后台交互的情况下如何实现用户登录因为只需要管理员有对选修课操作的能力,因此不需储存管理员的信息,只需在其登录前询问密码即可。
而学生的登录,在其登录时分配一个对象空间,储存在其登录时获取的学号及姓名即可,即每一个学生的登录相当于注册过程。
(2)如何在不退出程序的情况下,能够让多位学生进行选课定义学生类对象数组,每一位学生选完课后,再分配一个新的学生类对象空间。
(3)如何实现对学生对象中课程对象成员的覆盖一开始我们为了方便起见是考虑学生类课程对象定义为引用,这样只需引用已有的选修课课程即可,但这样的话,在对学生对象初始化时引用的初始化就成了问题,因此只能放弃。
最终是选择了使用set和get方法对对象成员的成员一个个覆盖。
参考文献[1] 黄维通.Visual C++面向对象与可视化程序设计(第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++程序设计.北京:机械工业出版社,2008.[11] 邵伟忠.C常用算法程序集.天津:人民出版社,2009.附录源程序#include <>#include <>#define M 10class Course ;();cout << "2.";();cout << "选修课总学分: " << () + () << '\n' <<endl;}void selectCourse_1(Course cc) etScore() !=0; i++) etId())==0) {if(1 == k){s1[s_num1].selectCourse_1(c1[i]);break;}if(2 == k){s1[s_num1].selectCourse_2(c1[i]);break;}}}if(0 == j){cout << "\n您是否想要继续选课(y/n):";cin >> select1;if('n' == select1) break;}}cout << "\n选课成功!" << endl;}void selectScore(Course c1[M]) \n 2. " << endl;cout << " 请选择:";cin >> select;num = 1;if(1 == select){for(i=0; i<M && c1[i].getScore() !=0; i++)if == c1[i].getScore()){cout << num << '.';c1[i].print();cout << endl;num++;}}}else if(2 == select){for(i=0; i<M && c1[i].getScore() !=0; i++){if == c1[i].getScore()){cout << num << '.';c1[i].print();cout << endl;num++;}}}else cout << "对不起,您的输入有误,请重新输入!\n\n";}void selectNature(Course c1[M]) 艺术类\n 2. 学术类" << endl;cout << " 请选择:";cin >> select;num = 1;if(1 == select){for(i=0; i<M && c1[i].getScore() !=0; i++){if(strcmp(n1, c1[i].getNature()) == 0){cout << num << '.';c1[i].print();cout << endl;num++;}}}else if(2 == select)for(i=0; i<M && c1[i].getScore() !=0; i++){if(strcmp(n2, c1[i].getNature()) == 0){cout << num << '.';c1[i].print();cout << endl;num++;}}}else cout << "对不起,您的输入有误,请重新输入!\n\n";}void xu(Course c1[M]) etScore() !=0; j++){for(i=num; i<M && c1[i].getScore() !=0; i++){if(strcmp( c1[i].getId(), c1[i+1].getId() ) > 0){k++;(c1[i].getId(),c1[i].getName(),c1[i].getNature(),c1[i].getDate(),c1[i].getS hours(),c1[i].getAhours(),c1[i].getScore());c1[i].set(c1[i+1].getId(),c1[i+1].getName(),c1[i+1].getNature(),c1[i+1].get Date(),c1[i+1].getShours(),c1[i+1].getAhours(),c1[i+1].getScore());c1[i+1].set(),(),(),(),(),(),());}else k = 2;if(1 == k) num = i;}k = 0;}}void menu(Course c1[6], Student s1[10]) 理员 |" << endl;cout << "| 2.学生 |" << endl;cout << "| 3.退出 |" << endl;cout << "============" << endl;cout << "\n请选择:";cin >> select;switch(select){case 1:flag3 = 1;while(1){cout << "请输入密码(输入-1退出):";cin >> password;if(-1 == password){flag3 =0;break;}if(123 == password){cout << "\n 管理员,你好!欢迎登录!" <<endl;break;}cout << "密码错误,请重新输入!\n";}while(flag3){cout << "\n================" <<endl;cout << "| 菜单 |" <<endl;cout << "================" <<endl;cout << "| 1.添加选修课 |" << endl;cout << "| 2.删除选修课 |" << endl;cout << "| 3.查看选修课 |" << endl;cout << "| 4.返回上一层 |" << endl;cout << "================" <<endl;cout << "\n请选择:";cin >> select;switch(select){case 1:newNum = 0;for(i=0; i<M && c1[i].getScore() !=0; i++) newNum++;cout << "\n请按格式依次输入选修课的编号、名称、上课时间、类型(艺术类或学术类)、授课学时、实验学时、学分:" << endl;cin >> id1 >> name1 >> da >> na >> sh >> ah >> sc;c1[newNum].set(id1, name1, da, na, sh, ah, sc);xu(c1);cout << "添加成功!" << endl;break;case 2:flag4 = 1;j = 0;num = 0;while(flag4){cout << "\n请输入您想要删除课程的编号:";cin >> id[j];for(i=0; i<M && c1[i].getScore() !=0; i++){if(strcmp(id[j], c1[i].getId())==0){for(num=i; num<M && c1[i].getScore() !=0; num++){c1[num].set(c1[num+1].getId(),c1[num+1].getName(),c1[num+1].getNature(),c1[ num+1].getDate(),c1[num+1].getShours(),c1[num+1].getAhours(),c1[num+1].getScore ());}c1[num] = Course();break;}}cout << "删除成功!\n";cout << "\n您是否想要继续删除(y/n):";cin >> 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;cout << "| 3.显示全部 |" << endl;cout << "| 4.返回上一层 |" << endl;cout << "============================" <<endl;cout << "请选择:";cin >> select;switch(select){case 1:selectScore(c1);break;case 2:selectNature(c1);break;case 3:for(i=0; i<M && c1[i].getScore() !=0; i++){cout << i+1 << '.' ;c1[i].print();cout << endl;}break;case 4:flag2 = 0;break;default :cout << "对不起,您的输入有误,请重新输入!\n\n";}}break;case 4:flag3 = 0;break;default :cout << "对不起,您的输入有误,请重新输入!\n\n";}}break;case 2:char a[10], b[10];s1[s_num] = Student();cout << "\n请输入您的学号:";cin >> a;s1[s_num].setId(a);cout << "请输入您的姓名:";cin >> b;s1[s_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 << "请选择:";cin >> select;switch(select){case 1:flag2 = 1;cout << "\n" << s1[s_num].getName() << ",你好!欢迎登录!" << endl;while(flag2){cout << "\n============================" <<endl;cout << "| 菜单 |" <<endl;cout << "=============================" <<endl;cout << "| 1.按学分查询选修课 |" << endl;cout << "| 2.按选修课类型查询选修课 |" << endl;cout << "| 3.显示全部 |" << endl;cout << "| 4.返回上一层 |" << endl;cout << "=============================" <<endl;cout << "请选择:";cin >> select;switch(select){case 1:selectScore(c1);selectCourse(s1, c1 ,s_num);break;case 2:selectNature(c1);selectCourse(s1, c1 ,s_num);break;case 3:for(i=0; i<M && c1[i].getScore() !=0; i++){cout << i+1 << '.' ;c1[i].print();cout << endl;}selectCourse(s1, c1, s_num);break;case 4:flag2 = 0;break;default :cout << "对不起,您的输入有误,请重新输入!\n\n";}}break;case 2:s1[s_num].print();break;case 3:flag1 = 0;s_num++;break;default :cout << "对不起,您的输入有误,请重新输入!\n\n";}}break;case 3:flag0 = 0;cout << " 谢谢使用!\n 再见!" << endl;break;default :cout << "对不起,您的输入有误,请重新输入!\n\n";}}}void main() //管理员默认密码:123{Student s[10]; //学生数组,用于不同学生的选课Course c[M]; //定义了一个课程类的数组,储存所有选修课c[0] = Course("001", "健康与养生", "学术类", "", 15, 0, ;c[1] = Course("003", "音乐鉴赏", "艺术类", "", 12, 3, ;c[2] = Course("006", "数学建模", "学术类", "", 10, 6, ;c[3] = Course("007", "酒文化与鉴赏", "艺术类", "", 15, 3, ;c[4] = Course("010", "影视名片鉴赏", "艺术类", "", 12, 0, ;c[5] = Course("015", "药膳", "学术类" , "", 12, 3, ;xu(c);cout << "************************************" << endl;cout << " 选修课系统 " << endl;cout << "************************************\n" << endl;menu(c, s);}(。