C++课程设计.docx
- 文档编号:16290043
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:24
- 大小:53.61KB
C++课程设计.docx
《C++课程设计.docx》由会员分享,可在线阅读,更多相关《C++课程设计.docx(24页珍藏版)》请在冰点文库上搜索。
C++课程设计
课程设计(论文)
课程名称
程序设计实践
题目
学生成绩管理系统设计与
实现
实现
院(系)
理学院
专业班级
应数1401
姓名
张丹莉
学号
指导教师
鲁萍白燕
2017年1月12日
学生成绩管理系统的设计与实现
摘要
?
学生成绩管理系统是典型的信息管理系统,是学校教务管理的重要组成部分,其处理信息量很大。
本课程设计是用C++实现对学生的成绩管理作一个简单的模拟,实质是建立学生成绩单链表,每条记录由学号、姓名与成绩组成,即链表中每个结点由4个域组成,分别为:
学号、姓名、成绩存放下一个结点地址的next域。
用菜单选择操作方式完成6项功能分别写成六个函数,创建学生成绩对应建立学生单链表的功能,对全部学生成绩的排序,最后保存在文件中,另外四个功能分别对应单链表的显示、查询、修改与删除四大基本操作。
该系统中的数据采用线性表中的链式存储结构即单链表来存储,用类类型定义每个学生记录并采用外部文件方式记录数据简便数据的读取与保存。
通过对学生成绩管理系统的制作,能够让使用者迅速地对学生的成绩做各项处理和显示,最终的到想要的信息,方便且易于操作。
关键词学生成绩管理系统,C++,链表,文件
1总体介绍课程设计内容
1.1课设内容总体介绍
制作学生成绩管理系统,实现数据录入、数据删除、数据浏览以及数据查询等功能。
包括系统设计要求,开发环境要求,技术文档要求三部分。
(1)系统设计要求:
(a)学生成绩管理系统中不同使用单位(用户)的学生人数事先无法确定。
(b)该学生成绩管理系统要求有学生成绩录入,查询,修改,删除,排序。
(c)系统使用文字菜单,用户通过选择菜单项的编号,实现系统对子模块的调用。
(d)每个班级每门课程的成绩可以从学生的成绩总表提取出子表并存储成一个文本文件。
该文本文件名由班级号和课程名拼音字符串构成。
输入班级号和课程名字符串后自动生成文件名。
(e)每个学生学习的课程有数学,英语,C++。
(f)学生的成绩总表结构约定为(学号,姓名,课程名,总评成绩).总评成绩等于各科成绩之和。
(g)学号是一个9位整数构成的字符串,学号的编码规则:
入学年份+在读年级+在读班级+班内编号;入学年份用4位整数构成字符串,如2014年入学则表示为:
”2014”;在读年级用1位整数构成字符串,如正在1年级读书则表示为:
”1”;在读班级用2位整数构成字符串,如正在1班读书则表示为:
”01”;班内编号用2位整数构成字符串,如在班内编号为23号则表示为:
”23”。
(2)开发环境要求
软件环境:
windowsXP/windows7,VisualC++
硬件环境:
计算机(Pen4CPU,512MRAM,60G以上硬盘,输入输出设备)
(3)技术文档要求:
按软件工程技术文档要求。
要求流程图绘制规范,模块功能描述清晰
1.2个人完成部分
第一阶段:
学习链表相关知识来动态分配存储空间,并作出链表的程序及学习文件在C++中的应用;
第二阶段:
录入学生成绩、显示学生成绩、查询学生成绩并画出相关流程图,并与队友共同把所有的程序进行整理并调试成功;
第三阶段:
独立完成论文的书写。
2主要算法与原理
2.1链表
2.1.1链表的介绍
数组式计算机根据事先定义好的数组类型与长度自动为其分配一连续的存储单元,相同数组的位置和距离都是固定的,也就是说,任何一个数组元素的地址都可一个简单的公式计算出来,因此这种结构可以有效的对数组元素进行随机访问。
但若对数组元素进行插入和删除操作,则会引起大量数据的移动,从而使简单的数据处理变得非常复杂,低效。
链表是一种动态数据结构,用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。
链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。
Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。
可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。
实际上,链表中的每个结点可以用若干个数据和若干个指针。
结点中只有一个指针的链表称为单链表,这是最简单的链表结构。
2.1.2链表的创建与输出?
图1动态链表创建图2链表输出
由于链表中的各个结点是由指针链接在一起的,其存储单元文笔是连续的,因此,对其中任意结点的地址无法向数组一样,用一个简单的公式计算出来,进行随机访问。
只能从链表的头指针(即head)开始,用一个指针p先指向第一个结点,然后根据结点p找到下一个结点。
以此类推,直至找到所要访问的结点或到最后一个结点(指针为空)为止。
如果要在链表中的结点a之前插入结点b,则需要考虑下面几点情况。
(1)插入前链表是一个空表,这时插入新结点b后。
(2)若a是链表的第一个结点,则插入后,结点b为第一个结点。
(3)若链表中存在a,且不是第一个结点,则首先要找出a的上一个结点a_k,然后使a_k的指针域指向b,在令b的指针域指向a,即可完成插入。
(4)如链表中不存在a,则插在最后。
先找到链表的最后一个结点a_n,然后使a_n的指针域指向结点b,而b指针的指针为空。
如果要在链表中删除结点a并释放被删除的结点所占的存储空间,则需要考虑下列几种情况。
(1)若要删除的结点a是第一个结点,则把head指向a的下一个结点。
(2)若要删除的结点a存在于链表中,但不是第一个结点,则应使a得上一个结点a_k-1的指针域指向的下一个结点a_k+1。
(3)空表或要删除的结点a不存在,则不做任何改变。
2.2文件的使用?
在ofstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作
函数:
open()
参数:
filename?
?
操作文件名
?
?
?
?
?
?
?
?
?
?
mode?
?
?
?
?
?
?
打开文件的方式
?
?
?
?
?
?
?
?
?
?
prot?
?
?
?
?
?
?
打开文件的属性
当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。
成员函数close(),它负责将缓存中的数据排放出来并关闭文件。
这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了。
为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close()。
Read成员函数从一个文件读字节到一个指定的存储器区域,由长度参数确定要读的字节数。
如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束。
3学生成绩管理系统的设计与实现
3.1学生类成员及函数
表一学生类
成员(函数)
类型
含义
Name[20]
char
姓名
ID[20]
char
学号(九位)
Subject[3]
int
科目
sum
int
总成绩
Input()
void
输入函数
ReadFile(istream&in)
void
读入文件函数
Show
void
显示函数
3.2学生信息类成员及函数
表二学生信息类
函数(成员)
类型
含义
*Head,*End;;
Student
用于链表的开始和结束
Studentmassage()
构造函数
~Studentmassage()
析构函数
ShowMenu()
void
菜单函数
AddItem()
void
创建信息函数
Sort()
void
排序函数
Display()
void
显示信息函数
RemoveItem()
void
删除信息函数
ModifyItem()
void
修改信息函数
ListCount()
int
记录当前链表数目
Swap(Student*,Student*)
void
删除结点
save()
void
保存函数
3.3主要函数说明
首先在创建菜单时,应包括创建学生成绩录入,显示,查询,修改,删除,排序这六个功能,然后通过调用创建信息函数完成学生成绩的录入,显示函数实现学生信息的全部显示,通过修改可以改变输入错的信息,针对有的学生如果转学什么的可以对其信息进行删除,利用姓名来调用查询函数能够得到所想要的学生信息;最后,通过调用排序函数后在,可以在所见的文件夹里打开所有录入的学生信息及最终排序结果。
3.4学生成绩管理系统的总结构图
通过总结构图能够直观地看出所制作的成绩管理系统的各项功能,总结构图如下图3.
图3学生成绩管理系统的总结构
3.5模块的流程图
根据系统提示,选择1创建学生信息,根据系统提示可以一次输入姓名,学号,成绩,如果要对成绩显示则继续选择2,可以对成绩显示,当创建的信息大于等于2时可以继续选择3,进行排序,最终的结果可以在当前所建的记事本里显示各项成绩及排序,要对信息查询选择4来查询你想要的信息,也可以对信息修改等,最终可以选择0安全退出系统。
进入系统根据系统提示来选择想要进行的操作,从而完成各项的功能,利用信息查询也可以来判断所操作的删除是否删除成功的测试,查询流程如下,图4.
图4信息查询流程图
3.6难点及难点的解决
难点:
通过构造两个类来实现各种功能,使用链表来对各项功能的实现及使用文件来保存所得到的成绩排序结果的连接中相对较难。
解决:
通过自己认真学习课本所学过的链表及文件相关的知识,并通过上网查找类似的链表和文件在C++中的应用来完成。
4结果分析及改进
首先进入系统界面后,会有时间,日期的显示,并提示密码的输入,如下图5.
图5首界面
根据界面提示进入菜单界面,可以对想要的操作进行选择,如图6.
图6菜单界面
选择1,创建学生信息,创建学生的姓名、学号,各科成绩,最后会显示添加成功,结果如下图7.
图7创建学生信息
根据刚才创建更多的学生信息后,选择3,可以显示创建的所有学生的信息,如图8.
图8显示学生信息
根据刚才创建的所有信息可以进行查询自己所想要的学生信息,如下图9.
图9查询学生信息
如果有的同学转学或其他什么的,该信息已经无意义,可以对该信息进行删除,如图9.
图10删除学生信息
如果第一次创建信息过程中出现错误或输入的姓名与学号不对应,则可以通过修改学生的信息,如图10.
图11修改信息
最后完成所有输入的成绩排序,得到最终的结果显示,如图11.
图12排序结果
所有的操作完成后,选择0,可以安全退出系统。
如下图12.
图13系统安全退出系统
5小结和心得
对于我们所选的学生成绩管理系统的设计与实现,我是根据我们所做的ssrt的项目有启发而做的,经过查阅资料发现利用文件和链表来实现,所以自己又把我们学过的链表和文件进行学习,查阅相关的实例练习链表的应用,但刚开始我们想的比较简单是依据C语言而实现的,到后来经老师的点拨,发现我们做的应该是基于C++的程序,虽然仅剩一天半左右的时间,我和队友能够更根据自己前期准备的基础上,进一步查阅资料并对自己原有的程序进行修改,最终的以完成。
通过这次C++的课程设计的学习,让我体会到我们所学的C++课程的实用性,以前我认为计算机方面的课程仅仅是我所要必修的,没有什么的实际价值,但是经过这次课程设计,看到同学们所做的小游戏后,我发现其实我们所学的都是非常有用的,只是在以前我们缺乏思考和锻炼,仅仅把游戏当作一种娱乐,并没有发现用我们所学的知识也是可以制作的,所以启发我们以后需要多思考,多进行实际操作。
利用这次训练,我发现自己能够掌握更多的知识,通过两个人的合作,能够相互取长补短,对我后期的学习也有很大的帮助,让我不再对计算机课程感到头疼,同时也增加了我对编程的兴趣与爱好,希望以后的学习、生活中,我能够和做这次课程设计一样,勤于动手,动脑,努力来弥补不足之处。
6参考文献
[1]谭浩强.C++程序设计[M].北京.清华大学出版社,2004.6.
[2]谭浩强.C++程序设计解题与上机指导[M].北京.清华大学出版社.2005.3.
[3]钱新贤,杨猛,程兆炜,张少东.Visual?
C++编程疑难详解[M].北京.人民邮电出版社,2000.5
[4]
[5]
附录
#include
#include
#include
#include
#include
usingnamespacestd;
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
classStudent
{
public:
charname[20];
charId[20];
intCnum;//C++课程得分
intMnum;//数学课程得分
intEnum;//英语课程得分
intsum;//总分
Student*Next;
voidInput()
{
cout<<"\t\t请输入学生的姓名:
";
cin>>name;
cout<<"\t\t请输入学生的学号(九位):
";
cin>>Id;
cout<<"\t\t请输入C++课程的期末成绩:
";
cin>>Cnum;
cout<<"\t\t请输入数学课程的期末成绩:
";
cin>>Mnum;
cout<<"\t\t请输入英语课程的成绩:
";
cin>>Enum;
sum=Cnum+Mnum+Enum;
}
voidReadFile(istream&in)
{
in>>name>>Id>>Cnum>>Mnum>>Enum>>sum;
}
voidShow()
{
cout<<"姓名"<<"学号"<<"C++"<<"数学"<<"英语"<<"总成绩"< cout< } }; //﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ classStudentmassage { public: Studentmassage(); ~Studentmassage(); voidShowMenu(); voidFind(); voidSave(); voidModifyItem(); voidRemoveItem(); voidSwap(Student*,Student*); voidSort();//voidUnpass(); intListCount();//voidAverage(); voidDisplay() { for(Student*p=Head->Next;p! =End;p=p->Next) p->Show(); cout<<"输入任意字符! 继续……"; getch(); } voidAddItem() { End->Input(); End->Next=newStudent; End=End->Next; cout<<"添加成功! "< cout<<"输入任意字符! 继续……"; getch(); } private: Student*Head,*End; ifstreamin; ofstreamout; Student*FindItem(char*name) { for(Student*p=Head;p->Next! =End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空 if(! strcmp(p->Next->name,name))returnp; returnNULL; } Student*FindID(char*Id) { for(Student*p=Head;p->Next! =End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空 if(! strcmp(p->Next->Id,Id))returnp; returnNULL; } }; //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ Studentmassage: : Studentmassage() { Head=newStudent; Head->Next=newStudent; End=Head->Next; in.open("sort.txt"); if(! in) cout<<"这是一个新系统,无学生信息。 请先输入。 "< else { while(! in.eof()) { End->ReadFile(in); if(End->name[0]=='\0')break; End->Next=newStudent; End=End->Next; } in.close(); cout<<"\t\t读取学生信息成功! "< } } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ Studentmassage: : ~Studentmassage() { Save(); for(Student*temp;Head->Next! =End;) { temp=Head->Next; Head->Next=Head->Next->Next; deletetemp; } deleteHead,End; } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ voidStudentmassage: : ShowMenu() { cout<<"**************************************************************"< cout<<"********制作人: 西安建筑科技大学张丹莉周春燕***********"< cout<<"*********欢迎来到学生成绩管理系统***********"< cout<<"*********1创建学生信息***********"< cout<<"*********2显示学生信息***********"< cout<<"*********3排序学生信息***********"< cout<<"*********4查询学生信息***********"< cout<<"*********5删除学生信息***********"< cout<<"*********6修改学生信息***********"< cout<<"*********0成功退出系统***********"< cout<<"**************************************************************"< cout<<"**************************************************************"< cout<<"请输入您想完成的操作: "; } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ voidStudentmassage: : Find() { charname[20],Id[10]; intx; Student*p=NULL; cout<<"\n\t\t*********************************\n"; cout<<"\t\t※1.按学生的姓名查找\n\t\t※2.按学生学号查找"; cout<<"\n\t\t*********************************\n请选择: "; cin>>x; switch(x) { case1: {cout<<"\t\t请输入要查找的学生的姓名: ";cin>>name; if(p=FindItem(name)) { p->Next->Show(); cout<<"输入任意字符! 继续……"; getch(); } else { cout<<"\t\t没有找到该姓名的学生! "<<'\n'< cout<<"输入任意字符! 继续……"; getch(); } }break; case2: { cout<<"\t\t请输入要查找的学生的学号: ";cin>>Id; if(p=FindID(Id)) { p->Next->Show(); cout<<"输入任意字符! 继续……"; getch(); } else { cout<<"\t\t没有找到该学好的学生! "<<'\n'< cout<<"输入任意字符! 继续……"; getch(); } }break; } } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ voidStudentmassage: : ModifyItem()//修改信息 { charname[20]; Student*p=NULL; cout<<"\t\t请输入要修改的人的姓名: ";cin>>name; if(p=FindItem(name)) { cout<<"\t\t已找到学生的信息,请输入新的信息! "< p->Next->Input(); cout<<"修改成功! "< cout<<"输入任意字符! 继续……"; getch(); } else { cout<<"\t\t没有找到! "< cout<<"输入任意字符! 继续……"; getch(); } } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ voidStudentmassage: : RemoveItem()//删除信息 { charname[20]; Student*p=NULL,*temp=NULL; cout<<"\t\t请输入要删除的学生的姓名: "< if(p=FindItem(name)) { temp=p->Next; p->Next
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)