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