C课程设计学生成绩管理系统1

上传人:仙*** 文档编号:103703445 上传时间:2022-06-09 格式:DOC 页数:25 大小:169.50KB
收藏 版权申诉 举报 下载
C课程设计学生成绩管理系统1_第1页
第1页 / 共25页
C课程设计学生成绩管理系统1_第2页
第2页 / 共25页
C课程设计学生成绩管理系统1_第3页
第3页 / 共25页
资源描述:

《C课程设计学生成绩管理系统1》由会员分享,可在线阅读,更多相关《C课程设计学生成绩管理系统1(25页珍藏版)》请在装配图网上搜索。

1、中南大学二一二二一三学年第二学期信息科学与工程学院C+程序设计语言课程设计报告课程名称:C+程序设计语言班 级:电气信息类1206班 学 号:0909120629姓 名:邬继阳指导教师:王磊 二0一三年零七月目录1.课程设计目的32.系统描述需求分析32.1需要处理的基础数据32.2系统的基本功能32.3可行性分析43.功能模块设计43.1类的分析与设计43.1.1 Course类43.1.2 Stu类53.2整体流程64.主要模块的算法说明74.1信息的保存和读取74.2 对信息的处理74.2.1 数据的录入和插入74.2.2 数据的查询74.2.3 数据的修改74.2.4 数据的删除74.

2、2.5 数据的排序85.程序运行结果85.1 菜单欢迎界面85.3信息的显示95.4 信息的查询95.5 信息的修改105.6 信息的删除115.7 按平均分降序排列115.8 查看全部信息125.9 输出不及格学生信息125.10 退出系统136.课程设计总结137.参考文献138.附录源代码141.课程设计目的1.1使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。1.2使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。1.3使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力

3、。2.系统描述需求分析2.1需要处理的基础数据学生基本信息:如班级、学号、姓名、性别、年龄、宿舍号码、电话号码等。学生选修课程的基本信息:课程编号、课程名称、考试成绩、平时成绩、综合成绩、学分、重修否等。2.2系统的基本功能数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息;数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息;数据的插入:插入某个学生信息数据的查询:如按学号查询、按姓名查询等;数据的删除:如删除指定学号、或者指定姓名的学生及其选修课的信息;平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息;列出不及格学生清

4、单学号、姓名、不及格的课程和成绩。考虑用文件把数据保存起来可选。2.3可行性分析如上所示,该系统要求处理一些学生成绩的基本数据,包括两个方面:学生身份信息和学生成绩信息。具体可以考虑创建两个类,一个学生基本信息类,一个学科基本信息类。这样既可以保持二者的独立性,也可以使之相关联。该系统不仅要求能录入一些基本数据外,还要能对这些数据进行处理,比如修改,删除,插入,查询等。对这些操作的实现可以暂时放开面向对象,而采用面向过程的方法。另外,因为对数据库了解不多,可以考虑用文件保存的形式将数据保存起来,最后在查找的时候采用文件读取。3.功能模块设计3.1类的分析与设计由上面的需求分析可以知道,在本程序

5、中,需要处理两大类数据:一个是学生的身份基本信息,另一个是该同学的课程基本信息。而且要求二者既要相互联系,又不能太相互制约。于是可以考虑创建两个类: Stu 类学生信息类和 Course 类课程信息类。为了使二者相互关联,可以让 Course 的一个类对象作为Stu 对象的一个基本数据成员。具体如下: Course类由于学生只需要一些课程信息,故在该类中只有一些基本的成员数据,不涉及成员函数之类的对数据进行操作的函数。把对学生信息进行处理的函数放在Stu类中。成员成员属性访问类型course_num数据成员publiccourse_name数据成员publicregular_score数据成员

6、publicFinal_score数据成员publicaverage_score数据成员publicstudy_score数据成员publicrebulid数据成员public由于这些数据信息是作为Stu类的一个信息的,为了使stu类中的函数可以访问这些成员数据,故要将访问类型定义为public型。 Stu类正如上面所述,Course类的一个对象作为Stu类的一个数据成员,但是正常情况下,一个同学是不只一门科目的,所以要定义一个Course类的数组来存放同一学生的不同科目信息Course course20。为了其信息的隐蔽性,我们把所有的数据成员都声明为private。接下来,要处理的就是函数

7、了。有两种处理方式,但到底是采用成员函数还是采用友元函数呢?在本例中,我采用的是友元函数。原因如下:1采用友元函数,可以使类的结构变得更加简单,有助于整个设计过程的思考。2使用友元函数,将函数独立于类的结构之外而采用类对象传参的方式,可以使该函数的独立性大大提高,有助于在其他地方的使用。具体如下:成员成员属性访问类型Class_num数据成员privatenum数据成员privatename数据成员privatesex数据成员privateage数据成员privateroom数据成员privatetel数据成员privateaverage数据成员privateNum_of_course数据成员

8、privateorder数据成员privateCourse20数据成员private友元函数:Input输入学生信息Statistic学生信息输出Lookup查找学生信息Modify修改学生信息Delete 删除学生信息Output输出全部信息Sort对学生进行排序Insert 插入学生信息Showfail 查找不及格学生Write文件写入函数Read 文件读取函数void menu菜单函数,以供选择3.2整体流程查询删除显示不及格显示全部主菜单函数 上面已经主要分开介绍了两个独立的类及其内部成员,现在来介绍整个学生系统功能实现的流程。输入修改插入Switch语句选择排序查看学生成绩文件保存文

9、件读取4.主要模块的算法说明4.1信息的保存和读取 在本次课程设计中,因为还没有接触到数据库的有关知识,故采用文件流来写入和读取信息。主要涉及到fstream类。在系统运行过程中,会利用该类将学生的基本身份信息和基本课程信息全部存到自定义的一个文件中,当需要使用这些数据时,例如查询,修改,显示等,再将需要的读取出来进行相关的操作。4.2 对信息的处理 数据的录入和插入 数据的录入和插入基本一样,这里只介绍录入。 当在主菜单里选择信息录入时,会跳出录入页面,只需依次输入提示的信息即可。在整个大体框架上,采用一个while语句判断是否继续录入。注意在录入学生成绩信息时。需要输入要登记的课程数目。其

10、中成绩信息的各科综合成绩和是否重修不需要手动录入,它会在登记完平时成绩和末考成绩后自动生成。当所有信息录入完成后,该生所有科目的平均成绩average也会自动计算。 数据的查询 所谓数据的查询,就是把存放在文档中的学生数据读取出来并加以输出。 当只针对某个人的查询时,需要输入学号或姓名,再调用read函数将相关的数据读取出来,至于需要输出哪些,可以自己控制。 当要输出所有学生的数据是时,首先调用read函数返回数据的个数count,即学生的个数。最后采用for循环控制依次输出每一个学生的信息。 数据的修改当修改数据时,只需输入需要修改学生的学号即可。首先会将该生的相关信息输出出来。然后再提示重

11、新输入信息。执行到这里时基本就和前面的数据录入,插入一样了。 数据的删除 本例中,对数据的删除比较简单。只需输入学号或姓名,当查找到该生的相关信息后。将后面一个学生的信息赋值给他,相当于该生的信息被覆盖,也就是删除。 数据的排序 在需求分析中,有一项功能,按学生成绩平均分降序排列。此功能还是比较好实现的。在输入学生数据时,当所有课程分数输入完毕,会自动生成一个平均分,该数值就是学生类Stu中的average数据成员。然后采用冒泡法比较大小,把这些学生的数据重新排列,最后再依次输出。5.程序运行结果5.1 菜单欢迎界面5.2 信息的录入如上所示,依次输入需要填写的信息,其中该门课的综合成绩和是否

12、重修是不需要输入,系统自动执行的。最后还会提示是否继续填写YN。5.3信息的显示在这个功能里面主要显示全部同学的身份信息和平均分:5.4 信息的查询信息的查询分两种方式:当你选择1 时,表示按学号查询,当你选择2 时,表示按姓名查询。下面介绍的是按学号查询。如上所示,当输入需要查询的同学的学号时,会输出该同学的身份信息以及每一门课的综合成绩,还有这些课的平均成绩。5.5 信息的修改当输入需要修改的学生学号时,会首先输出该同学现在的已经存在的信息:然后提示重新输入:输入完成后,会提示是否保存:5.6 信息的删除信息的删除也分两种类型:选择不同的方式,进入不同的界面按姓名删除按学号删除5.7 按平

13、均分降序排列会输出学生的一些基本信息和平均分与名次。5.8 查看全部信息由于一个同学的全部信息较多,于是分成两部分输出:身份信息和成绩信息在身份信息中,主要包括班级,学号,姓名,年龄,性别,宿舍,电话等。在成绩信息中,包括该同学的各科成绩,是否重修,获得的学分,以及所有科目的平均分。5.9 输出不及格学生信息 当选择该功能时,首先会输出该同学的学号,姓名和班级,然后再输出他的不及格科目以及分数,如下所示。5.10 退出系统6.课程设计总结1回顾此次课程设计,感慨良多,从刚拿到题目时的一脸茫然,到最后能成功解决,觉得此次课程设计我又学到了好多知识。首先在这里要感谢一下王磊指导老师,经过他的细心讲

14、解,我才有了一个完整的设计思路。2在这次课程设计的过程中,最大的感觉就是对知识的不熟悉,一些C+基础知识似懂非懂,结果总要去查书才能写出不出错误的代码,结构就是耗费了大量的时间,事倍功半。经历这次教训,我想会对我以后的计算机语言学习起到一定的帮助。3在这次的课程设计过程中,通过查书的学习,对C+的了解又加深了不少,包括类的结构,以及怎样在类外访问类类的私有成员等,我想下次再写基于对象的程序时,一定会得心应手。4还有比较重要的收获就是类的相互嵌套使用,就拿本例来说,在一个类中设置一个数据成员,而该数据成员确是另一个类的对象。这对理解数据类型起到了不少的作用。5总的来说,这次程序设计让我获益匪浅,

15、对C+语言也有了进一步的认识:语言功能高、表达能力强、使用灵活方便、目标程序效率高等等。C+语言是在国内外广泛使用的一种计算机语言,相信除了以上优点,还有许多我们还未发现,希望能在以后的学习中有更深入的认识。7.参考文献1C+程序设计第二版 谭浩强 编著2visual C+从入门到精通 明日科技 编著3C+编程思想 美埃克尔 编著 刘宗田 译8.附录源代码#include #include #include /后面的exit函数和syetem函数要用#include using namespace std;class Course /定义一个课程信息类public: int course_nu

16、m; /课程编号 string course_name;/课程名称 float regular_score;/平时成绩 float final_score;/末考成绩 float average_score;/综合成绩 float study_score;/学分 string rebulid;/是否重修;class Stu /把对类的私有成员的处理函数全部定义为友元函数public: friend void Input ; /学生成绩录入函数 friend void Statistic;/学生信息输出函数 friend void Lookup ; /学生成绩查找函数 friend void M

17、odify ; /学生成绩修改函数 friend void Delete ; /学生信息删除函数 friend void Output ; /学生全部信息输出函数 friend void Sort ; /学生成绩排序函数 friend void Insert ; /学生成绩插入函数 friend void Write;/学生成绩写入档案函数 friend int Read; /学生成绩信息读取函数 friend void Showfail; /查找不及格学生private: int class_num; /班级号码 int num;/学号 string name;/姓名 int age;/年龄

18、 char sex;/性别 int room;/宿舍 string tel;/电话 float average;/所有课程平均分 int num_of_course;/课程数目 int order;/名次 Course course20;/课程信息数组;void Write /文件写入函数 fstream myFile; /定义一个文件输入输出类 myFile.open; if coutD:student.dat.txt cant open!endl; exit; int count=n; myFilecountendlendl; forint i=0; i myFilestudi.class

19、_num studi.num studi.name studi.age studi.sex studi.room studi.tel studi.num_of_course studi.average endl; forint j=0; j myFilestudi.coursej.course_num studi.coursej.course_name studi.coursej.regular_score studi.coursej.final_score studi.coursej.average_score studi.coursej.study_score studi.coursej.

20、rebulidendl; myFile.close;int Read /文件读取函数 fstream myFile; myFile.open; if coutD:student.dat.txt cant open!endl; exit; int count; myFile.seekg; myFilecount; forint i=0; i myFilestudi.class_numstudi.numstudi.namestudi.agestudi.sexstudi.roomstudi.telstudi.num_of_coursestudi.average; forint j=0; j myFi

21、lestudi.coursej.course_numstudi.coursej.course_namestudi.coursej.regular_score studi.coursej.final_scorestudi.coursej.average_scorestudi.coursej.study_scorestudi.coursej.rebulid; myFile.close; return count ; /函数返回一个查询出来的数值void Input /学生成绩录入函授 system; /调用系统命令cls,清除屏幕 int i=0; / int num; char sign; co

22、utendl 请输入学生成绩 =endl; while coutstudi.class_num;loop: /loop循环,VB中的循环 coutstudi.num; int c=0; whilec c+; if cout 你输入的学号已经存在!请重新输入。endl; goto loop; coutstudi.name; coutstudi.age; coutstudi.sex; coutstudi.room; coutstudi.tel; coutstudi.num_of_course; int j; float sum=0; forj=0; j cout请登记第j+1门课的信息:endl;

23、 coutstudi.coursej.course_num; coutstudi.coursej.course_name; coutstudi.coursej.regular_score; coutstudi.coursej.final_score; coutstudi.coursej.study_score; studi.coursej.average_score=studi.coursej.regular_score*0.3+studi.coursej.final_score*0.7; cout该门课的综合成绩是:studi.coursej.average_scoreendl; ifstu

24、di.coursej.average_score studi.coursej.rebulid=是; else studi.coursej.rebulid=否; cout是否重修:studi.coursej.rebulidendl; sum=sum+studi.coursej.average_score; studi.average=sum/studi.num_of_course; cout 该学生这几门课的平均分为:studi.averageendl; cout提示:是否继续写入学生成绩?; cinsign; i+; Write; /调用文件写入函数,把信息写入文件void Statistic

25、 /学生成绩数据输出函数 system; int n=Read; cout班级t学号t姓名t年龄t性别t宿舍t电话tt平均成绩endl; forint i=0; i coutstudi.class_numtstudi.numtstudi.nametstudi.agetstudi.sextstudi.roomtstudi.teltstudi.averageendl; system;void Lookup /学生成绩查找函数 system; int n=Read; int s1; string s2; int i=0; int choose; cout请输入查询方式:endlendl; cout按

26、学号查询: 1 -endl; cout按姓名查询: 2 -endl; do coutchoose; while&; switch case 1: system; coutendl 查找学生成绩 =endl; cout请输入需要查找学生的学号:s1; while!=0&i i+; if cout提示:对不起,无法找到该学生的信息!endl; else cout-endl; cout班级:studi.class_numendl; cout学号:studi.numendl; cout姓名:studi.nameendl; cout年龄:studi.ageendl; cout性别:studi.sexen

27、dl; cout宿舍:studi.roomendl; cout电话:studi.telendl; forint j=0; j coutstudi.coursej.course_name:; coutstudi.coursej.average_scoreendl; cout平均分:studi.averageendl; break; case 2: system; coutendl 查找学生成绩 =endl; cout请输入需要查找学生的姓名:s2; int flag=0; fori=0; i if cout-endl; cout班级:studi.class_numendl; cout学号:stu

28、di.numendl; cout姓名:studi.nameendl; cout年龄:studi.ageendl; cout性别:studi.sexendl; cout宿舍:studi.roomendl; cout电话:studi.telendl; forint j=0; j coutstudi.coursej.course_name:; coutstudi.coursej.average_scoreendl; cout平均分:studi.averageendl; flag=1; break; if cout提示:对不起,无法找到该学生的信息!endl; void Modify /学生成绩修改函

29、数 system; int n=Read; int s; int i=0; coutendl 修改学生成绩 =endl; cout请输入需要修改成绩学生的学号:s; while!=0&i i+; if cout提示:对不起,无该学生的成绩endl; else cout-该学生的信息-endl; cout班级t学号t姓名t年龄t性别t宿舍t电话endl; cout-endl; coutstudi.class_numtstudi.numtstudi.nametstudi.agetstudi.sextstudi.roomtstudi.telendl; forint j=0; j coutstudi.

30、coursej.course_name:; coutstudi.coursej.average_scoreendl; cout平均分:studi.averageendl; cout请重新输入该学生的信息endl; cout班级:studi.class_num; cout学号:studi.num; cout姓名:studi.name; cout年龄:studi.age; cout性别:studi.sex; cout宿舍:studi.room; cout电话:studi.tel; coutstudi.num_of_course; int j; float sum=0; forj=0; j cout

31、请登记第j+1门课的信息:endl; coutstudi.coursej.course_num; coutstudi.coursej.course_name; coutstudi.coursej.regular_score; coutstudi.coursej.final_score; coutstudi.coursej.study_score; studi.coursej.average_score=studi.coursej.regular_score*0.3+studi.coursej.final_score*0.7; cout该门课的综合成绩是:studi.coursej.averag

32、e_scoreendl; ifstudi.coursej.average_score studi.coursej.rebulid=是; else studi.coursej.rebulid=否; cout是否重修:studi.coursej.rebulidendl; sum=sum+studi.coursej.average_score; studi.average=sum/studi.num_of_course; cout 该学生这几门课的平均分为:studi.averageendl; char c; cout是否保存数据?c; if Write; void Delete /删除学生信息函数

33、 system; int s1; string s2; int n=Read; int i=0,j; char sign; cout请选择删除学生信息的方式endlendl; cout按学号删除 1 -endl; cout按姓名删除 2 -endl; int choose; do coutchoose; while&; switch case 1: system; coutendl 删除学生成绩 =endl; while cout请输入需要删除学生的学号:s1; while!=0&i i+;/这种结构形式决定一次只能删除一个学生 if cout提示:对不起,无法找到该学生endl; else

34、forj=i; j studj=studj+1; cout提示:已成功删除!endl; n-; cout提示:是否继续删除学生信息?Y/N; cinsign; Write; break; case 2: system; int flag=0; coutendl 删除学生成绩 =endl; while cout请输入需要删除学生的姓名:s2; fori; i if / studi=studi+1; forj=i;j studj=studj+1; cout提示:已成功删除!endl; flag=1; break; if cout提示:对不起,无法找到该学生endl; break; n-; cout

35、提示:是否继续删除学生信息?Y/N; cinsign; Write; break; void Insert /学生信息插入函数 system; int flag; int n=Read; char s; coutendl 增加学生成绩=endl; while coutstudn.class_num; coutstudn.num; coutstudn.name; coutstudn.age; coutstudn.sex; coutstudn.room; coutstudn.tel; coutstudn.num_of_course; int j; float sum=0; forj=0; j co

36、ut请登记第j+1门课的信息:endl; coutstudn.coursej.course_num; coutstudn.coursej.course_name; coutstudn.coursej.regular_score; coutstudn.coursej.final_score; coutstudn.coursej.study_score; studn.coursej.average_score=studn.coursej.regular_score*0.3+studn.coursej.final_score*0.7; cout该门课的综合成绩是:studn.coursej.average_scoreendl; ifstudn.coursej.average_score studn.coursej.rebulid=是; else studn.coursej.rebulid=否; cout是否重修:studn.coursej.rebulidendl; sum=sum+studn.coursej.average_score; studn.average=sum/studn.num_of_course; cout 该学生这几门课的平均分为:studn.averageendl; n+; cout提示:插入成功!endl; cout是否继续输入s;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!