资源描述
学院数据结构课程设计报告学生选修课程系统姓 名: 学 号: 班 级: 指导教师: 学院2011-x-x目录摘要3第1章概述41.1系统实现的目标41.2系统实现方案 41.3系统实现环境51.4具体的开发方法5第2章系统设计62.1系统功能设计 62.2数据库设计72.3界面的设计10第3章系统实现22总结32参考文献33附录34摘要这是一个学生选修系统,通过该系统学生可以实现网上选课,查自己某门选修课的 分数,平均成绩等。通过该系统我们学生可以清楚直观方便地了解所想选的课程的情况, 比如是否选修该课程的人数已满等。学校管理员通过该系统可以调出学生的选课名单和 成绩,也就是说管理员可以调出每门选修课的学生数,学生名单等。管理员还可以设定 每门选修课的学分。当然管理员也可以通过简单地修改,来达到增加或是减少某门选修 课的限选人数的目的。总的说来,该系统主要实现就是以上两端,即分别为选修课系统 学生端和选修课系统管理端。选修课系统学生端有四个部分组成,分别为学生选课,学 生情况和选课情况及退出系统。选修课系统管理端则主要包括:增加学生,增加课程, 删除学生,删除课程,填写成绩,更改学分,学生情况,选课情况,保存数据和退出系 统这些部分。值得注意的是在选修课系统管理端,管理员需要输入密码,当出现三次错 误,将会自动锁死。这样的设计是为了保证学生资料的安全,为了避免一些恶意修改等 情况。该系统通过这 2 个模块的组合,实现了学生选修课程的管理。该系统主要运用的 是 c+ 语言,这是一种被广泛使用地计算机编程语言,是一种流行的高级语言。它支持 大部分的基本的程序设计思想,概念和技术,其中包括对过程式及面向对象两种程序设 计范型的支持。另外 C+ 语言具有简洁,灵活和高效等特点。通过该语言设计的系统有 界面友好,操作方便等优点。另外,后台数据库采用的是 SQL SERVER 2000 。关键词 :教育信息系统; 学生选修课程系统; c+ ; sql server 2000第 1 章 概述1.1 系统实现的目标由于学校学生越来越多 ,对学生进行选修课程的管理也越来越繁琐 ,老师们希望能 更方便的进行课程的选修。现在计算机系统的高速发展是人们越来越希望可以借助计算 机系统来协助完成日常工作。在这样的背景下,很明显,学校原有的一系列系统已经不 能满足老师和学生的需要,所以需要不断完善学校的系统,使老师和学生的工作、生活 更加便捷。当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被 广泛应用于信息系统的环境。计算机的最到好处的于利用它能够进行信息管理,使用计 算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂 的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的 开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好学生选课信息而 设计的。数据处理手工操作,工作量大,出错率高,出错后不易更改,造成了时间上的浪费。 基于这个问题, 我认为有必要建立一个学生选课系统, 使学生选课信息管理工作规范化、 系统化、程序化,避免学生选课管理的随意性,提高信息处理的速度和准确性,能够及 时、准确、有效的查询和修改选课情况。1.2 系统实现方案选修课程系统主要内容及其功能:(1)选修课系统学生端 学生选课:学生可以通过输入学生的学号,姓名等信息查询所需要的学生资料。 但是学生只能查询自己的个人信息。 学生情况:学生情况里面包含课程查询和成绩查询。学生登录以后便可以方便查 询到学生所选的课程和其成绩。 选课情况:选课情况里包含全部课程种类以及学生所选课程,课程数量及各种 课程的学生兴趣度,学生可以以此结合自己的爱好和剩余选课人数来填报自己需要的 选课。 退出系统:关闭并退出整个选修课系统学生端。(2)选修课系统管理端 增加学生:在管理端通过输入正确的学生姓名及学号,可以完成在数据库种增 加该学生的信息相关项目。 增加课程:在管理端通过输入相应的新课程名称,及所给予的课程学分,完成 在数据库中增加该新课程的相关信息。 删除学生:在管理端通过输入正确的学生姓名及学号,可以删除在数据库中该 学生的信息相关项目。 删除课程:在管理端通过输入相应的课程名称及课程学分的相关信息来完成在数据库中来删除该课程的步骤。 填写成绩:在管理端通过输入学生姓名学号可以查询调出该学生在此课程中的 学习考试情况,将其的考试成绩填入系统,完成成绩数据。学生在选课系统学生端可 以查询到自己的成绩。 更改学分:在管理端通过输入学生姓名查询并调出该学生的选课成绩,进行修 改,完成更改学分的步骤。学生在选课系统学生端可以查询到自己的课程所得学分。 学生情况:通过输入学生的姓名学号可以调出该学生信息,此信息包含该学生 的选课项目及其成绩,学分。 选课情况:选课情况里包含了每种课程,每位学生的选择情况。可以看出选课 的学生方向。方便校方对一些冷门课程进行删减,来增加一些热门和新兴现代化课程。 保存数据:对所有在管理端进行的各项改动进行保存,完善学校选课的管理。 退出系统:关闭并退出整个选修课系统管理端。1.3 系统实现环境本系统采用 C/S 体系结构,系统包括选修课系统学生端,选修课系统管理端两大模 块。选修课系统学生端包括:学生选课,学生情况,选课情况,退出系统;选修课系统 管理端包括:增加学生,增加课程,删除学生,删除课程,填写成绩,更改学分,学生 情况,选课情况,保存数据和退出系统;具备学生信息录入、修改、删除系统功能。可 行性方面,我的计算机有声卡和独立显卡,使用的操作系统为微软的Windows XP,同时也安装了 microsoft visual studio 6.0 和 sql server 2000 。一个完善的管理软件,必须要有后台的数据库。而目前主流的数据库有以下几种: 低级数据库最流行的是ACCESS ;中级数据库,最流行的是SQL Server 2000,SQL Server 2005,Mysql ;高端的三大数据库,DB2,ORACLE,SYBASE。其中,我选择 SQL Server 2000 做为系统的后台数据库。SQL Server是美国微软公司开发的一款关系型数据库管理系统 的产品,具有成本低,易上手,工具全等优点。适用于大型或超大型数据库服务器端。 SQL Server 2000 是目前的最新版本,微软的软件的特点是版本分得细,可适合各种使 用者不同的需要。1.4 具体的开发方法C+设计成静态类型、和C同样高效且可移植的多用途程序设计语言。C+设 计成直接的和广泛的支援多种程序设计风格(程序化程序设计、 资料抽象化、 面 向对象程序设计、泛型程序设计)。C+设计成给程序设计者更多的选择,即使可 能导致程序设计者选择错误。C+设计成尽可能与C兼容,籍此提供一个从C到C+ 的平滑过渡。C+避免平台限定或没有普遍用途的特性。C+不使用会带来额外开 销的特性。C+设计成无需复杂的程序设计环境。出于保证语言的简洁和运行高效 等方面的考虑,C+的很多特性都是以库(如STL)或其他的形式提供的,而没有 直接添加到语言本身里。第 2 章 系统设计本系统实现了学生选修课程管理,包括选修课系统学生端,选修课系统管理端两大 模块。选修课系统学生端包括:学生选课,学生情况,选课情况,退出系统;选修课系 统管理端包括:增加学生,增加课程,删除学生,删除课程,填写成绩,更改学分,学 生情况,选课情况,保存数据和退出系统;具备学生信息录入、修改、删除系统功能。 系统由 2 个模块组成,基本上实现了学生选修课程的管理功能。本系统可以大大减少老 师计算的工作力,减轻了老师的工作负担,有效地提高了整体的工作效率和精确度。开 发系统的计算机硬件已经非常普及,完全没有问题;现在的现在的计算机各方面的技术 都非常成熟,相对来说开发此系统的技术也要求比较简单,因此在技术方面是可行的。 开发的系统操作非常简单,以便适合老师和学生都可以方便操作使用。2.1 系统功能设计本系统实现了学生选修课程管理,包括选修课系统学生端,选修课系统管理端两大 模块。选修课系统学生端包括:学生选课,学生情况,选课情况,退出系统;选修课系 统管理端包括:增加学生,增加课程,删除学生,删除课程,填写成绩,更改学分,学 生情况,选课情况,保存数据和退出系统;具备学生信息录入、修改、删除系统功能。 功能上的优点:1. 程序菜单简洁明了,相互独立又相互联系,巧妙相接,符合用户的使用习惯与思维。2. 程序提示语言人性化,而且提示明确,具有较强的明确的指导作用。提示信息井然有 序,更加有利于用户顺利,准确地进行程序的操作。3模块设计智能化,功能模块操作结束后,均会返回主菜单进行下一模块的运行,并 提示是否再进行类似的操作, 给用户带来了操作的方便, 大大提高了学生选修课的效率。2.2 数据库设计2.2.1 数据库设计SQL Server 是一个关系数据库管理系统, SQL Server 2000 是 SQL Server 数据库 管理系统的最新版本。 SQL Server 2000 具有使用方便,可伸缩性好与相关软件集成程 度高等优点,可跨越运行大型多处理器的服务器等多平台使用。 SQL Server 2000 还支 持基于标准的,与 Windows DNA 集 成 的 程 序 设 计 模 型 , 使 SQL Server 数 据 库 和 数 据仓库的使用成为生成强大的可伸缩系统的无缝部分。这些功能使您得以快速交 付 SQL Server 应用程序,使客户只需 最少的 安装和管理开销即可实现这些应用 程序。SQL Server 2000 中包括析取和分析汇总数据以进行联机分析处理(OLAP) 的工具。 SQL Server 中 还包括一些工具,可用来直观地设计数据库并通过 English Query 来分析数据。SQL Server 2000为用户提供了大规模联机事务处理(OLTP )、数据仓库和电子商务 应用程序所需要的最新的出色数据库平台。 SQL Server 2000 为用户提供了完全集成的 可扩展标记语言(XML )环境、在分析服务中添加了新的数据挖掘功能、用元数据服务增 强了知识库技术。 SQL Server 2000 提供的分析服务显著增强了联机分析处理( OLAP) 服务组件的功能。分析服务引入了数据挖掘功能,可以用来在OLAP多维数据集和关系数 据库中发现信息。 SQL Server 2000 元数据服务扩展并重命名了以前称为 Microsoft 知 识库的知识库组件。SQL Server 2000 是全面的数据库和分析解决方案。它可以提供要求 Web 和企业商 务链环境要求的性能、可伸缩性和可靠性。新的可扩展标记语言(XML )和超文本传送协 议(HTTP)支持简单的数据访问和交换,同时功能强劲的分析能力提高了数据的价值。增 强了的可用性功能最大化了正常运行时间,先进的管理功能自动操作日常任务,改进了 的编程工具和服务加快了开发速度。简化整合后端系统、使用丰富的 SQL Server 2000 XML 功能来越过防火墙进行数据 传输、并支持其它互联网标准,例如XPath、XSL和XSLT。网页开发人员可以使用XML来访问数据,而无需数据库编程。同时管理员可以轻松使用 Transact-SQL(T-SQL) 和存 储过程,以 XML 格式操作数据。通过无需进行附加的编程来使用 Web,灵活地连接到SQL Server 2000数据库和在 线分析处理(OLAP)单元。使用安全的HTTP数据库连接,以保证即便初级开发人员都可以 通过 URL 和视觉化的用户界面查询数据。使用复杂的数据挖掘工具,从数据中得到更多的价值。数据挖掘工具可以让您识别 趋势并从大量数据组中得出预测。使用 Microsoft 英文查询可快速获得结果。 英语查询允许用户以英语形式提出问题, 而无需使用结构化的查询语言 (SQL) 或多维表达式 (MDX) 。改进的全文本搜索现在允许用 户查询非结构化的数据,例如 Microsoft Word 文档、 Web 页或 Microsoft Excel 电子表 格。通过集成的 SQL Server 2000 可扩展分析服务,利用完全的、端对端的分 析能力,包括数据挖掘。新的维度类型通过广泛的等级来支持数据集。灵活的 安全功能保护立方图、成员或单元级别上的数据。2.2.2 创建数据库SQL Server 2000 有两种创建数据库的方法。这大大便利了用户创建数据库。(1) 在“企业管理器”中创建数据库。(2) 在“ SQL 查询分析器”中创建数据库。 用户可以根据自己的习惯,选择其中的一种方法来创建数据库。 在学生选课这个系统中,我是利用 SQL 查询分析器直接创建如下数据库。画出了学在上面的 E-R 图中,可以看出,这个 学生端 数据库图包括学生实体具有学生情况 属性、选课情况属性、学生选课属性、学分属性。包含了整个院校全部学生的学生基本 资料。学生端数据表,里面保存了用户信息,比如,学生姓名,选课情况,成绩等信息。学生端表的各字段和数据类型如表 2-1 所示。表2-1学生端表列名数据类型长度USER_IDInt4USER_NAMENvarchar50USER COUNTInt4USER_DATESmalldatetime4USER_CHECKBit1bi tSUB NUMBERNvarchar50管理员信息表 ADMIN 中存储了系统管理员的帐号密码信息, ADMIN 表的各字段和数 据类型如表 2-2 所示。表 2-2 ADMIN 表列名数据类型长度ADMIN_IDint4ADMIN_NAMEnvarchar50ADMIN_PASSnvarchar50图 2-2 管理员端 数据库的 E-R 图在上面的 E-R 图中,可以看出,这个 管理员端 数据库图包括增加学生, 增加课程 删除学生,删除课程,填写成绩,更改学分,学生情况,选课情况,保存数据和退出系 统。可以及时更新学生的选课情况。2.3 界面的设计选修课小系统中,学生可以在规定的时间段内选课。该规定时间段由排课者通过发布消 息通知教师和学生。选课过程如下:学生在选课表上单击课程号,则该信息被提交到服 务器,并显示学生的选课结果。菜单选择:选 1:进入学生端信息界面选 2 :进入管理端信息界面菜单选择 :选 1: 进入课程信息界面选 2: 进入学生信息界面选 3: 进入选课界面选 4:退出 ,并保存相关记录到文件里如果进入课程信息界面,出现“对不起,暂时没有学生名单!请按任意键继续。 。”表明 该界面还没开始开放,相关学生选课还没开始或者还没学生选,请按任意键继续下面的 操作。请输入管理员密码;- E:l lDebu gl 1. exe进入管理端信息界面,需输入管理员的密码,才能进入该信息界面。 管理员密码为: 009229请选择操作方式:日回田EAllXDebugMl.exeCA海 乱统 探 课课学橐 端 扣除改课岀 健.ffl.M.M 管 24.6 GO0. 统:生生绩况据 系盞盂去曇 课方扣除写生存 修于保 选操3.S.7.9.探选 1: 进入学生增加时 ,先看是否有记录 ,无则输入要增加的学生信息 ,有则显示出来 .选 2: 进入课程增加时 ,输入课程名称,后再输入此课程学分,再按任意键继续。选 3: 进入学生信息删除 ,录入要删除的学生编号 ,看是否在表中有这条记录 ,无则提示错 误,有则提示显示记录的相关信息 ,再提示是否确实要删除记录 ,要则删除 .选 4 :进入课程信息删除界面,会出现所有的课程,输入你要删除的课程名称,后按任意键继续以下操作。选 5: 进入学生成绩输入,出现所选课程,输入要填写的课程名称,录入要填写的学生成 绩编号,输入相关成绩。选 6 :进入学生学分更改,输入选课名称,输入学生编号,更改学生学分。选 7: 进入学生情况查询 ,进行选择是按学号查询或学分查询 ,不管哪种方式 ,都查询一下表 中有相关的记录 ,没有则重新选择 ,有刚显示相关记录 .界面会显示学生名单。选 8 :进入学生选课 , 输入你要查的选课名称,查看学生选课情况。若没有任何记录按任 意键继续。选 9 :保存所修改或填写数据。选 0 :退出该系统。进入增加学生界面会出现如图示的信息,输入学生姓名即可。增加学生姓名后,按任意键继续下面操作。在增加课程操作中输入课程名称即可。=:,1- E:llDebugll.exeB增扣课程操作:I请输.入课程名椒;yuwen输入此课程的学分.J随即输入课程的学分。完成上述操作后,按任意键即可学生情况操作中会显示出学生名单显示在屏幕上。賦E:llDebugl 1-exe删除课程操作所有课程如下:yuwen请输入要删除的课程:HBB删除课程操作中,所有课程会显示出来,输入要删除的课程即可随后按任意键,继续一下操作填写成绩操作中,需输入课程名称随后按任意键即可曲E: 1 lDebu g 11. exe更改学分操作:所有课程如下:yuwen请输入要改的课程:更改学分操作时,根据要改的课程,输入相应的课程输入要更改的学分随即按任意键继续以下操作选课情况查询,需输入相应的课程名称按提示继续操作。使用系统结束界面,退出整个程序。第 3 章 系统实现学生选修课程系统/学生类void readname(char N); / 读入学生的姓名void getname(char N); / 得到学生的姓名void wrcourse(char N,float score); / 要据课程名写入学生课程的成绩float average(); / 学生课程的平均成绩void addcourse(char N,float g); / 给学生增加一门课int findcourse(char N); / 查找是否已有此课程 ,如果有返回 1, 如果没有返回 0 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:wrcourse(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;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;在学生端,我们首先登入学生的界面,输入每个学生自己的姓名,并且加以保存。每个 学生,都有自己喜欢的课程,我们可以根据自己兴趣爱好及时间安排等,来选择自己所 喜欢的课程。在这次选课过程中,如果你喜欢的这门课不存在或者已经选满,系统直接 提示你选不上该课程或者是不能选该课程,如果不存在以上情况。系统将不予提示,那 么你就可以选修这门课。在这次的选修课程的过程中,限选 5 门课程,也就是说如果你 选到第 6 门,操作无法继续进行下去。在这个选修系统中,我们可以根据学生的姓名及 选修课程名来得到迅速的选修课程成绩及选修课平均分等。在这个选修系统中,我们将 利用链表的形式将所有的选修课程保存起来。以上这一部分的代码主要运用了指针的调用,重载等知识。课程根结点指针 root 首先将 root-*p ,再根据给 p 传递值,根据 while 语句逐步的寻找选修课程的学分和名 字,这样我们就可以找到我们所选课程对应的学分及选修课程平均成绩。当然其中还运 用了选择语句 if ,在其中起到连接的作用。特殊符号:1. :(1) 引用全局变量(2) 在静态成员函数中是类限定符2. -(1)为双目操作符(2) 第一个操作数为一个指向类或结构的指针,第二个操作数为第一个操作数所指 向的类或结构的成员。(3) 对- 进行重载,可以实现一种智能指针( smart pointer )/课程类class subject public: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; / 返回最多学生数 30void 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 ;课程类主要分为两个部分 :(1) 学生端 :学生选修课程的内容;包括选修课的课程题目和学分,选修课同学的成绩 如图:(2) 管理端 : 主要通过登录系统,调出学生的选课名单和成绩,进行下一步的工作。在这个过 程中,管理员可以调出每门选修课的学生数,学生名单等。管理员还可以设定每门选修 课的学分。如果老师们想要查某个同学的成绩或是某门选修课的平均成绩,都可以通过 这一系统实现,在这一系统中,我们已经将每门选修课的限报人数设定为30,当然管理员可以通过不同学校不同课程的不同情况,进行修改,比较方便。管理员可以根据不同 的提示,比较方便直观的达到自己的目的。如图:c: E:llDebugll.exe课课学曇 扣除改课出 醫更选退2 4 6 8 0 生生绩况据 加除写生存不同的步骤都可以通过程序之间的调用来实现系统的功能。例如:/学生选课int menu_1_1(studentdb *P,subjectdb *X) system(cls);coutnntttt 学生选课操作 Next;int i;char N20,M20; if(q!=NULL) coutnnntt 所有学生名单如下 :nendl;else cerrnnntt 对不起 ,暂时没有学生名单 !请按任意键继续 .stu.getname(N); 获取第 n 个学生的姓名,由 q 指向的对象类获得学生的姓 名coutttttN; coutNext ;q 指向下一个对象q = P-Next; if(q=NULL) return 1;coutN;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) coutnntt 没有这个学生 ! 请按任意键返回 .1) coutnntt 共找到 i 个姓名为 N 的学生 endl; coutk; if(ki|k=0) cerrnttt 输入有误 !按任意键继续 .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() coutntt 所选课程已满 !按任意键继续 .Next;char N120; system(cls); if(t!=NULL) coutnnntt 所有课程如下 :endl; coutntttt 课程名称 tt 学分 endl; else cerrnnntt 对不起 ,暂时没有课程 sub.getkname(N1); couttttt N1setw(26-strlen(N1)sub.readcredit()Next;char N220;coutN2;t = X-Next; while(t) t-sub.getkname(N1); if(strcmp(N1,N2)=0) if(q-stu.findcourse(N2)=1) coutntt 此课程你已选过了 ,不能再选 . 按任意键 继续.Next;char NA20;while(t) t-sub.getkname(NA);if(strcmp(NA,N2)=0) if(t-sub.retactivestudent()=t-sub.retmaxstudent () coutntt 此课程已选满 ,不能选 .按任意键继续.Next;q-stu.addcourse(N2,0.0);coutnntt 选课成功 !按任意键继续 .Next;cerrntt 没有此课程 !按任意键继续 .Next;return 1;以此类推,可以实现整个程序的调用。在这个示例中,如果我们输入的学生姓名或是课程名不存在,如果某门选课还没有学生进行选修或是已经选满,我们都可以根据系统的提示来获知这些。当然,如果你已经选过该课程,当你再选该课程时,系统也会提示你 已选过该课,并予以阻止。当你选课成功,系统也会提示你选课成功,按任意建继续 / 密码检查void password() int k = 0,i;char A = 009229;char B10;char a;system(cls);for(i=0;i8;i+) coutendl;while(k=2) cerrttt 请输入管理员密码 : ;i=0;while(1) a=getch(); if(a=13) break;Bi=a;i+;printf(*);Bi=0;if(strcmp(A,B)=0) return;else k+;centnnttt 密码输入错误 !请重新输入 !n=3) system(cls);centnnttt 输入错误密码超过三次 !请按任意键退出 .endl; getch();tuichu();、 这一段主要实现的主要的功能是验证管理员的密码。这个密码是可以自己设置的,主要 是用来方便管理员的工作。 当然也是防止一些人的随便修改, 以确保管理员工作的安全, 以避免除了管理员外的人的恶意破坏。 我们系统的密码是“009229 ”密码的要求是有 1-12 位数,如果超过 12 位数就直接跳出系统,如果有的用户嫌密码长度太长,不便记忆,或 是密码长度太短,不够安全,我们就可以通过简单的修改程序,来修改密码长短,以便 满足不同用户的不同需求。 从第一个数开始,每输入一个数, 就以 *代替来确保密码的安 全性,直至你点击确定为止,系统自动帮你比对和确认。如果你这一密码不正确,系统 会提示你:“密码输入错误 !请重新输入 !”这样超过三次就会被自动锁死。屏幕会显示: 输入错误密码超过三次 !请按任意键退出, 这一设计也是为了阻止除管理员外的人, 对一 些类似学生选修课成绩,课程限报人数等信息进行一些非法地修改 .总结通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不 够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会 服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可 以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的 过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢 固,比如说结构体,指针,链表 通过这次课程设计之后,我们把前面所学过的知识 又重新温故了一遍。通过该课程设计,全面系统的理解了编译原理程序构造的一般原理 和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计 算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深 了对理论知识的理解。这次课程设计,使我们不仅懂得更多,会运用的更多更熟练!参考文献1 C+ Primer 中文版(第 4 版).(美)Stanley B. Lippman Barbara E. Moo Josee LaJoie 著,李师贤 等译. 人民邮电出版社. 2006-32 数据结构与算法分析C+描述(第三版).(美)维斯 著,张怀勇 等译.人民邮电 出版社.2007-13 C+程序设计原理与实践(美)斯特劳斯特鲁普 著,王刚等译.机械工业出版 社.2010-64 C+程序设计教程(修订版)一一设计思想与实现钱能.清华大学出版社.2009-75 C+数据结构原理与经典问题求解左飞电子工业出版社.2008-106 C+面向对象程序设计教程游洪跃.清华大学出版社.2010-37 SQL Server 2000 基础教程.刘勇.清华大学出版社.2005-28 SQL Server 2000 数据库实训教程.李丹丹.清华大学出版社 .2007-89 SQL Server 2000 应用系统开发教程 .李春葆 曾慧.清华大学出版社 .2008-510 深入浅出一SQL Server 2000 开发与管理与应用实例.邹健.人民邮电出版 社.2008-811 SQL Server 2000 管理、开发及应用实例详解 .陈世洪.人民邮电出版社.2006-612 SQL Server 2000 中文版基础教程.宋振会.清华大学出版社.2005-5附录源代码:#include #include #include #include #include #include #include / /定义课程struct course / 某个学生所学的课程中的某一个char cname20; / 课程名称float grade; / 课程成绩course *Next; / 指向下一个课程的指针;/ /学生类class student public:student() root = NULL;const maxcourse = 5;factcourse = 0;void readname(char N); / 读入学生的姓名void getname(char N); / 得到学生的姓名void wrcourse(char N,float score); / 要据课程名写入学生课程的成绩float average(); / 学生课程的平均成绩void addcourse(char N,float g); / 给学生增加一门课int findcourse(char N); / 查找是否已有此课程 ,如果有返回 1, 如果没有返回 0int 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:wrcourse(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;/struct studentdb student stu;studentdb *Next;struct studentname char tname20; / 学生的名字float result; / 学生所得的该课程分数studentname *Next;/课程类class subject public: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; / 返回最多学生数 30void 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
展开阅读全文