1、 河南城建学院 《C++程序设计》课程设计 设计题目: 学生选修课程系统设计 指导教师: 郭力争 刘荣辉 薛冰 专 业: 数学与应用数学 学生班级: 1314101 学生学号: 131410111 学生姓名: 刘亚欣 同 组 人: 李菲 马小川 数理学院 2013年6月 目 录 1、课题目标 1 1.1设计要求 1 1.2 选题背景 1 1
2、3 课题意义 1 1.4功能需求分析 2 1.5系统功能分析 2 2、程序具体实现原理 3 2.1 总体方案 3 2.1.1开发平台 3 2.1.2基本原理 4 2.1.3数据结构 4 2.1.4类的UML图 5 2.1.5模块说明 6 2.2 程序各个功能说明 7 2.2.1 程序结构 7 2.2.2 课程设计要求的实现 9 3、调试报告 14 3.1遇到的问题及解决办法 14 3.2程序调试及运行结果 15 4、总结 19 5、参考文献 19 附录 20 河南城建学院《C++程序设计》课程设计报告 1、课题目标 1.1设计要求
3、 假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于10)自由选课。试设计一个选修课程系统,使之能提供以下功能: 1.系统以菜单方式工作; 2.课程信息录入功能(课程信息用文件保存); 3.课程信息浏览功能; 4.查询功能(至少一种查询方式:按学分查询、按课程性质查询); 5.学生选修课程。 1.2 选题背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最到好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅
4、提高了工作效率,而且大大的提高了其安全性。 尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好学生选课信息而设计的。 随着高校的多样全面发展,学生的人数和课程的种类急速增加,传统的选课管理模式已经无法满足当前的实际需求,学生选课作为一种信息资源的集散地,包含很多的信息数据的管理。由于数据繁多,容易丢失,且不易查找。并且数据处理手工操作工作量大,出错率高,出错后不易更改,造成各种不便,总的来说,缺乏系统,规范的信息管理手段。尽管有的学校有计算机,但是尚未用于信息管理,没有发挥它的效力,资源闲置
5、比较突出,这就是学生选课管理信息系统的开发基本环境背景。 1.3 课题意义 基于以上问题,我们认为有必要建立一个学生选课管理信息系统,使学生选课信息管理工作规范化、系统化、程序化,以避免学生选课管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改选课情况。 系统实现后,极大的方便对学生进行选课和选课后班级的安排管理工作,学生选课信息的管理。避免在安排课程信息的滞后,减少信息交流的繁琐过程及其带来的额外开销。促进高校教育的计算机信息化进程,提高高校的工作效率。并且对于系统本身而言,具有更高的使用性、安全性。能够满足学生选课,以及学生对选课信息的管理。 同时,通过该课
6、程设计,我们可以达到把C++程序设计理论知识更加的巩固加深,加强动手操作能力与实践能力,学以致用,与现实生活中的应用充分的结合起来,也实现了知识的活学活用。 1.4功能需求分析 一个完善的学生选课管理信息系统能够极大的提高学生选课信息的管理效率,具有检索迅速,查找方便,可靠性高,存储量大,更新快,寿命长,成本低等优点。 本系统主要可以实现以下任务目标: 1、系统可以准确的记录和查询学生、老师以及所开设的课程的基本信息 2、学生登录系统后可以根据本专业制定的教学计划进行选课操作,可以查询个人的基本信息 性能需求: 本学生信息管理系统要能够抵御用户可能的各种操作,包括修改、更新、删
7、除等操作,以保证软件的可行性、稳定性、健壮性,同时要对数据进行检验,保证数据有效性,可操作性,安全性。同时普通用户登录只有浏览的权限。系统的非功能性需求: 实用性:系统以用户需求为目标,以方便用户为原则。根据用户实际的 需求情况,度身订造一套先进的局域网数据传输,从用户角度出发尽可能的方便用户使用,满足基本的用户需要,成为学校等通用的网络软件。 高可靠性:一个实用的系统同时必须是可靠的,本设计通过合理而先进的网络设计以及软、硬件的优化选型,可保证系统数据传输的正确性。 高安全性:在设计中,将充分利用网络软、硬件提供的各种安全措施,既可以保证用户共享资源,同时也可保证关
8、键数据的安全性。 可扩展性及灵活性:系统的设计以方便未来业务的扩展和系统扩充为目标,系统要求能够方便的升级,充分保护系统的投资。 智能型:系统在设计时,充分考虑系统运行的智能性,在使用系统一段时间后,系统可以适应于任何局域网。 1.5系统功能分析 根据设计要求,我们认为该系统应该包括:(1)课程信息输入功能;(2)课程信息浏览功能;(3)按学分查询功能;(4)按课程性质查询功能;(5)数据保存功能;(6)正确退出系统功能。其中对于课程信息输入功能可以有两个实现途径:①直接在系统中根据提示输入;②根据系统的功能在相应文件下建立text文件直接输入课程信息。对于其余四个功能则主要是供
9、学生选课使用。本程序将课程性质统一规定为考试和考查两种;数据保存功能是为了保证在系统中直接输入的课程信息顺利保存到text文件。 2、程序具体实现原理 2.1 总体方案 首先根据设计要求,我们定义了三个类: Class类,Control类,Menu类。Class类用来存放一系列课程的信息,以及一些获取信息的get函数;Control类是用来定义选课类的操作属性,从Control类里面来判断并实现用户所需要执行的动作;Menu类定义了菜单的操作,其中包括显示菜单,显示提示信息,获取用户从键盘输入的信息并执行。 针对Class类的定义,首先我们定义了一系列的设置相关课程信息
10、的公有函数,用来将输入的内容传给私有函数,其次定义了常函数,目的是为了防止数据被其它函数调用时发生改变,同时将学分定义为浮点型,范围在0~10之间。 针对Menu类的定义,我们先定义了一个获取键盘输入的函数getInput(),用于获取数据,接着定义了界面友好的显示目录函数,使得用户进行操作更加方便,最后定义了一系列的显示提示信息函数。为了使得在今后的修改中更加清楚方便,我们将这些函数独立分开。 针对Control类的定义,因为它的目的是用于判断并实现用户所要执行的操作,是学生选课系统的核心。一切从start()函数开始,通过switch语句判断按下了哪个数字键,然后执行对应的操作,在文件
11、录入这一方面,我定义了一个initIalization()函数,首先建立一个输入流,打开文件,将用户录入的课程信息放入到变量中,再由变量放入文件中。其中的公有函数即课程设计所要求的功能部分:添加选课,浏览选课,查询选课,保存文件。私有函数我们用了链表,classList,用来一条一条记录课程信息,方便添加浏览以及查询。两种查询方法都运用了迭代器的功能,迭代器的作用相当于指针,从链表的头部一个个指向链表的末尾,用于浏览以及查询部分。最后把迭代器指向的对象每个字段写入文件中,文件名定义为classSave,保存到程序的当前目录下。 最后主函数的实现,代码十分简单,先定义一个Control类的对象
12、ControlClass,再通过controlClass.start()启动整个程序。 2.1.1开发平台 操作系统:Win7 开发软件:Mirosoft Visual C++ 6.0 2.1.2基本原理 开始 进入系统界面 进入主菜单 课程信息浏览 按学分查询 退出 课程信息录入 信息存储 结束 按课程性质查询 2.1.3数据结构 表1 数据结构表 数据名称 数据类型 解释 classNum string 课程编号 className string 课程名称 classProperties string 课
13、程性质 totalClassNumber Int 总课时 currentClassNumber Int 授课学时 expClassNumber Int 上级或实验学时 credit Double 学分 rightTerm string 开课学期 2.1.4类的UML图 表2 Class类的UML图 Class -ClassNum: string -ClassName: string -ClassProperties: string -TotalClassNumber: int -currentClassNumber: int -ExpClass
14、Number: int -credit: double -rightTerm: string +setClassNum(classNumTemp: string) +setClassName(classNameTemp: string) +setClassProperties(classPropertiesTemp: string) +setTotalClassNumber(totalClassNumberTemp: int) +setCurrentClassNumber(currentClassNumber: int) +setExpClassNumber(expClassN
15、umberTemp: int)
+setCredit(credit: double)
+setRightTerm(rightTermTemp: string)
<
16、const>>+getCredit() :double
<
17、edit():void
< 18、atic>>+showSuccessedSaving():void
< 19、earchByClassProperties():void
+saveClass():bool
2.1.5模块说明
(1)课程信息录入。课程信息录入应包括:课程编号、课程名称、课程性质、总学时、授课学时、实验学时、学分、开课信息八个成员,为录入以上信息,首先使用setClassNum、setClassName、setClassProperties、setTotalClassNumber、setCurrentClassNumber、setExpClassNumber、setCredit、setRightTerm输出提示信息,其次使用addClass函数添加课程信息。
(2)课程信息浏 20、览。该功能主要是读取所有的课程信息,在程序中首先通过getClassNum、getClassName、getClassProperties、getTotalClassNumber、getCurrentClassNumber、getExpClassNumber、getCredit、getRightTerm八个函数读取课程信息的相关信息,设置为静态成员函数,防止已录入的数据被篡改;其次使用showclass、showeachclassinfo函数显示全部课程信息。
(3)按学分查询。首先使用getCredit函数得到课程的学分信息,其次使用searchByCredit 函数输出 “按学分查询” 21、的提示信息;接着使用showAddCredit函数输出“请输入学分”的提示信息;最后使用showSearchByCredit函数将查询结果输出。
(4)按课程性质查询。按照课程性质的查询实现了根据课程的性质对课程的查询,程序主要通过、showAddClassProperties、setClassProperties、getClassProperties、searchByClassProperties、showSearchByClassProperties、 来实现对课程的查询,同样全部设置为静态成员函数,已经录入的数据部能被篡改,根据提示输入就能得到想要查询的内容。
(5)存储信息。选择存 22、储信息选项之后用showLoadingSaving 函数进行数据的存储,显示正在存储数据。数据存储完毕后用showSuccessedSaving函数显示输出数据存储完毕。
(6)退出系统。一个完整的系统应该包括退出系统,在程序中使用quit函数,在按数字键6后给出提示信息:“press any key to continue”提示使用者按任意键退出系统。
2.2 程序各个功能说明
2.2.1 程序结构
将class类的属性和行为进行封装:
1.Class的封装
class Class{//定义了课程类的一些属性
public:
void setClassNum(string 23、classNumTemp);//课程编号
void setClassName(string classNameTemp);//课程名称
void setClassProperties(string classPropertiesTemp);//课程性质
void setTotalClassNumber(int totalClassNumberTemp);//总学时
void setCurrentClassNumber(int currentClassNumber);//授课学时
void setExpClassNumber(int expClassNumberTemp);/ 24、/实验或上机学时
void setCredit(double credit);//学分
void setRightTerm(string rightTermTemp);//开课信息
// 录入函数设为常量函数防止信息被篡改
string getClassNum() const;// 课程编号录入
string getClassName() const;//课程名称录入
string getClassProperties() const;//课程性质录入
int getTotalClassNumber() const;//总学时录入
int getCurrentCl 25、assNumber() const;//授课学时录入
int getExpClassNumber() const;//实验或上机学时录入
double getCredit() const;//学分录入
string getRightTerm() const;//开课信息录入
// class类的私有成员
private:
string classNum;//课程编号
string className;//课程名称
string classProperties;//课程性质
int totalClassNumber;//总学时
int currentClass 26、Number;//授课学时
int expClassNumber;//上级或实验学时
double credit;//学分
string rightTerm;//开课学期
};
2.Menu类的封装
//menu类主要实现系统的主界面
class Menu{
public:
char static getInput();
void static showMenu();//显示菜单
void static clearScreen();//清屏
void static pauseScreen();//暂停
void static showAddClas 27、s();//显示添加课程信息的提示语
void static showBrowseClass();//
void static showSearchByCredit();//显示按学分查询的提示语
void static showSearchByClassProperties();显示按课程性质查询的提示语
void static showAddClassNum();//显示输入课程编号的的提示语
void static showAddClassName();//显示增加课程名称的提示语
void static showAddClassProperties();//显示输 28、入课程性质的提示语
void static showAddTotalClassNumber();//显示输入总学时的提示语
void static showAddCurrentClassNumber();//显示授课学时的提示语
void static showAddExpClassNumber();//显示输入实验学时的提示语
void static showAddCredit();//显示输入学分的提示语
void static showAddRightTerm();//显示开课学期的提示语
void static showLoadingSaving();//显示正 29、在存储信息的提示语
void static showSuccessedSaving();//显示信息已成功存储
void static quit();//退出系统函数
void static showEachClassInfo(Class classTemp);//调用class类中的对象显示信息
};
3 .Control类的封装
class Control{//定义了选课类的操作属性
public:
Control(){}
void start();
void initIalization();
void addClass();
v 30、oid quit() ; //退出函数
void showAllClass();
void searchByCredit();
void searchByClassProperties();
bool saveClass();
private:
list 31、m = classNumTemp;
}// 设置课程编号的实现
void Class::setClassName(string classNameTemp){
this->className = classNameTemp;
}//设置课程名称的实现
void Class::setClassProperties(string classPropertiesTemp){
this->classProperties = classPropertiesTemp;
}//设置课程性质的实现
void Class::setTotalClassNumber(int totalClass 32、NumberTemp){
this->totalClassNumber = totalClassNumberTemp;
}//设置总学时的实现
void Class::setCurrentClassNumber(int currentClassNumber){
this->currentClassNumber = currentClassNumber;
}//设置授课学时的实现
void Class::setExpClassNumber(int expClassNumberTemp){
this->expClassNumber = expClassNumberTemp;
33、}//设置上机或实验学时的实现
void Class::setCredit(double credit){
this->credit = credit;
}//设置课程学分的实现
void Class::setRightTerm(string rightTermTemp){
this->rightTerm = rightTermTemp;
}//设置开课学期的实现
string Class::getClassNum() const{//设置为常函数防止数据改变
return this->classNum;
}
string Class::getClassName() 34、const{
return this->className;
}
string Class::getClassProperties() const{
return this->classProperties;
}
int Class::getTotalClassNumber() const{
return this->totalClassNumber;
}
int Class::getCurrentClassNumber() const{
return this->currentClassNumber;}
int Class::getExpClassNumber( 35、) const{
return this->expClassNumber;}
double Class::getCredit() const{
return this->credit;}
string Class::getRightTerm() const{
return this->rightTerm;}
//Menu类各成员函数的实现
char Menu:: getInput(){ //获取输入函数金融数学考试大三下
char key = cin.get();
return key;}
void Menu:: showMenu(){
36、cout << " 欢迎您进入学生选课管理系统 " << endl;
cout << " ***************************************" << endl;
cout << " " << endl;
cout << " 1 课程信息录入 "<< endl;
cout << " 2 课程信息浏览功能 " << endl;
cout << " 3 根据学分查询 37、 " << endl;
cout << " 4 按课程性质查询 " << endl;
cout << " 5 存储信息 " << endl;
cout << " 6 退出系统 " << endl;
cout << " " << endl;
cout << " 请输入操作对应的序号 " << endl;
cout << " ************** 38、" << endl;
}
void Menu:: clearScreen(){
system("cls");}
void Menu:: pauseScreen(){ //暂停
system("pause");}
void Menu:: showAddClass(){ // 显示增添课程信息
cout << "请输入要添加的课程编号,课程名称,课程性质,总 学 时,授课学时,实验学时,学分,开课学期等信息" << endl;
}
void Menu:: showBrowseClass(){
39、
cout << "所有课程的信息为" << endl;}
void Menu:: showSearchByCredit(){
cout << "按照学分查询的结果为:" << endl;}
void Menu:: showSearchByClassProperties(){
cout << "按照课程性质查询的结果为:" << endl;}
void Menu:: showAddClassNum(){
cout << "\n请输入课程编号" << endl;}
void Menu:: showAddClassName(){
cout << "请输入 40、课程名称" << endl;}
void Menu:: showAddClassProperties(){
cout << "请输入课程性质" << endl;}
void Menu:: showAddTotalClassNumber(){
cout << "请输入总学时" << endl;}
void Menu:: showAddCurrentClassNumber(){
cout << "请输入授课学时" << endl;}
void Menu:: showAddExpClassNumber(){
cout << "请输入实验或上机学时" << en 41、dl;}
void Menu:: showAddCredit(){
cout << "请输入学分" << endl;}
void Menu:: showAddRightTerm(){
cout << "请输入开课学期" << endl;}
void Menu:: showLoadingSaving(){
cout << "正在存储数据" << endl;}
void Menu:: showSuccessedSaving(){
cout << "数据存储完毕" << endl;}
void Menu:: quit(){
cout<<"press 42、any key to continue";}
void Menu:: showEachClassInfo(Class classTemp){
cout << "课程编号:" << classTemp.getClassNum() ;
cout << " 课程名称:" << classTemp.getClassName();
cout << " 课程性质:" << classTemp.getClassProperties() ;
cout << " 总学时:" << classTemp.getTotalClassNumber();
cout << 43、 " 授课学时:" << classTemp.getCurrentClassNumber() ;
cout << " 实验学时:" << classTemp.getExpClassNumber();
cout << " 课程学分:" << classTemp.getCredit();
cout << " 开课学期:"<< classTemp.getRightTerm();
cout << " " < 44、oid Control:: start(){ //start里面要做的事情就是初始化界面,等待用户输入,判断输入调用
initIalization();
while(1){
Menu::clearScreen();
Menu::showMenu(); //显示了界面
char key = Menu::getInput();
switch(key){
case '1': //判断是按下了哪个按键,然后执行什么对应的操作
Menu::clearScreen();
Menu::showAddClass();
t 45、his->addClass();
cin.get();
cin.get();
break;
case '2':
Menu::clearScreen();
Menu::showBrowseClass();
this->showAllClass();
Menu::pauseScreen();
break;
case '3':
Menu::clearScreen();
this->searchByCredit();
Menu::pauseScreen 46、);
break;
case '4':
Menu::clearScreen();
this->searchByClassProperties();
Menu::pauseScreen();
break;
case '6':
Menu::clearScreen();
this->quit();
Menu::pauseScreen();
break;
case '5':
Menu::showLoadingSaving();
47、
if (this->saveClass()){
Menu::showSuccessedSaving();
}
Menu::pauseScreen();
Menu::pauseScreen();
default:
break;
}
}
}
void Control:: initIalization(){
ifstream ifs;//文件输入流ifs 相当于建立一个文件
ifs.open("classSave.txt",ios_base::in);
if (!ifs){
48、 Menu::pauseScreen();
return;}
Class classTemp;//class 类的一个对象 classTemp
if (ifs.is_open()){//系统内置函数 判断文件是否打开
string classNum(" ");//初始化
string className(" ");
string classProperties(" ");
int totalClassNumber(0);
int currentClassNumber(0);
int expClassNumber(0);
49、 double credit(0.0);
string rightTerm(" ");
while(!ifs.eof()){
ifs >> classNum >> className >> classProperties >> totalClassNumber
>> currentClassNumber >> expClassNumber >> credit >> rightTerm;//从文件读取的内容放到对应的变量里面
classTemp.setClassNum(classNum);
classTemp.setClassName 50、className);
classTemp.setClassProperties(classProperties);
classTemp.setTotalClassNumber(totalClassNumber);
classTemp.setCurrentClassNumber(currentClassNumber);
classTemp.setExpClassNumber(expClassNumber);
classTemp.setCredit(credit);
classTemp.setRightTerm(rightTerm);






