1、 课程设计(论文) 课程名称 程序设计实践 题 目 学生成绩管理系统设计与 实现 实现 院 (系) 理学院 专业班级 应数1401 姓 名 张丹莉 学 号 141003131 指导教师 鲁萍 白燕 2017年 1 月 12 日 第 17 页 学生成绩管理系统的设计与实现 摘要 学生成绩管理系统是典型的信
2、息管理系统,是学校教务管理的重要组成部分,其处理信息量很大. 本课程设计是用C++实现对学生的成绩管理作一个简单的模拟,实质是建立学生成绩单链表,每条记录由学号、姓名与成绩组成,即链表中每个结点由4个域组成,分别为:学号、姓名、成绩存放下一个结点地址的next域.用菜单选择操作方式完成6项功能分别写成六个函数,创建学生成绩对应建立学生单链表的功能,对全部学生成绩的排序,最后保存在文件中,另外四个功能分别对应单链表的显示、查询、修改与删除四大基本操作。该系统中的数据采用线性表中的链式存储结构即单链表来存储,用类类型定义每个学生记录并采用外部文件方式记录数据简便数据的读取与保存. 通过对学生成
3、绩管理系统的制作,能够让使用者迅速地对学生的成绩做各项处理和显示,最终的到想要的信息,方便且易于操作。 关键词 学生成绩管理系统 , C++, 链表 ,文件 目录 1 总体介绍课程设计内容 1 1.1 课设内容总体介绍 1 1。1。1设计内容 1 1。1。2课程设计的要求 1 1.2 个人完成部分 2 2 主要算法与原理 3 2。1 链表 3 2。1。1 链表的介绍 3 2。1.2 链表的创建与输出 3 2.1。3链表结点的访问 4 2.1。4链表结点的插入 4 2。1。5链表结点的删除 4 2
4、2 文件的使用 4 2。2。1。打开文件 4 2。2。2关闭文件 5 2。2。3文本文件的读写 5 3 学生成绩管理系统的设计与实现 6 3。1 学生类成员及函数 6 3。2 学生信息类成员及函数 6 3。3 主要函数说明 7 3。4 学生成绩管理系统的总结构图 7 3。5 模块的流程图 7 3。6 难点及难点的解决 8 4 结果分析及改进 9 5 小结和心得 13 6 参考文献 14 附录 15 1 总体介绍课程设计内容 1.1 课设内容总体介绍 1.
5、1。1设计内容 制作学生成绩管理系统,实现数据录入、数据删除、数据浏览以及数据查询等功能。 1。1。2课程设计的要求 包括系统设计要求,开发环境要求,技术文档要求三部分。 (1)系统设计要求: (a)学生成绩管理系统中不同使用单位(用户)的学生人数事先无法确定. (b) 该学生成绩管理系统要求有学生成绩录入,查询,修改,删除,排序. (c) 系统使用文字菜单,用户通过选择菜单项的编号,实现系统对子模块的调用。 (d) 每个班级每门课程的成绩可以从学生的成绩总表提取出子表并存储成一个文本文件。该文本文件名由班级号和课程名拼音字符串构成.输入班级号和课程名字符串后自动生成文件名.
6、 (e) 每个学生学习的课程有数学,英语,C++. (f) 学生的成绩总表结构约定为(学号,姓名,课程名,总评成绩).总评成绩等于各科成绩之和。 (g)学号是一个9位整数构成的字符串, 学号的编码规则:入学年份+在读年级+在读班级+班内编号;入学年份用4位整数构成字符串,如2014年入学则表示为:”2014";在读年级用1位整数构成字符串,如正在1年级读书则表示为:”1";在读班级用2位整数构成字符串,如正在1班读书则表示为:”01”;班内编号用2位整数构成字符串,如在班内编号为23号则表示为:"23”. (2)开发环境要求 软件环境:windows XP/windows 7,Vis
7、ual C++ 硬件环境:计算机(Pen4 CPU, 512MRAM,60G以上硬盘,输入输出设备) (3)技术文档要求: 按软件工程技术文档要求.要求流程图绘制规范,模块功能描述清晰 1.2 个人完成部分 第一阶段:学习链表相关知识来动态分配存储空间,并作出链表的程序及学习文件在C++中的应用; 第二阶段:录入学生成绩、显示学生成绩、查询学生成绩并画出相关流程图,并与队友共同把所有的程序进行整理并调试成功; 第三阶段:独立完成论文的书写。 2 主要算法与原理 2.1 链表 2。1.1 链表的介绍
8、 数组式计算机根据事先定义好的数组类型与长度自动为其分配一连续的存储单元,相同数组的位置和距离都是固定的,也就是说,任何一个数组元素的地址都可一个简单的公式计算出来,因此这种结构可以有效的对数组元素进行随机访问。但若对数组元素进行插入和删除操作,则会引起大量数据的移动,从而使简单的数据处理变得非常复杂,低效。链表是一种动态数据结构,用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。 链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空
9、地址),表示链表的结束。可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址.实际上,链表中的每个结点可以用若干个数据和若干个指针.结点中只有一个指针的链表称为单链表,这是最简单的链表结构. 2。1。2 链表的创建与输出 开辟一个新节点,并使p1,p2指向所建立的对象 当p指向的不是表尾 P指向下一个结点 输出p所指向的结点 假 真 p指向的不是尾结点 P=head,使p指向第一个结点 n=n+1 head=NULL 当读入的p1_>num 读入一个学生的数据给p1所指的结点
10、 p2->next=p1(把p1所指的结点连接到 表尾 head=p1(把p1所指的结点 再开辟一个新结点,使p1指向它 表尾结点的指针变量置NULL 读入一个学生数据给p1所指的结点 图1 动态链表创建 图 2 链表输出 2.1。3链表结点的访问 由于链表中的各个结点是由指针链接在一起的,其存储单元文笔是连续的,因此,对其中任意结点的地址无法向数组一样,用一个简单的公式计算出来,进行随机访问.只能从链表的头指针(即head)开始,用一个指针p先指向
11、第一个结点,然后根据结点p找到下一个结点。以此类推,直至找到所要访问的结点或到最后一个结点(指针为空)为止。 2。1。4链表结点的插入 如果要在链表中的结点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指针的指针为空. 2。1。5链表结点的删除
12、 如果要在链表中删除结点a并释放被删除的结点所占的存储空间,则需要考虑下列几种情况。(1)若要删除的结点a是第一个结点,则把head指向a的下一个结点.(2)若要删除的结点a存在于链表中,但不是第一个结点,则应使a得上一个结点a_k-1的指针域指向的下一个结点a_k+1。(3)空表或要删除的结点a不存在,则不做任何改变。 2.2 文件的使用 2.2.1.打开文件 在ofstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作 函数:open() 参数: filename
13、 操作文件名 mode 打开文件的方式 prot 打开文件的属性 2.2。2关闭文件 当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的.成员函数close(),它负责将缓存中的数据排放出来并关闭文件.这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了.为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close()。 2.2。3文本文件的读写 Read成员函数从一个文件读字节到一个指定的存储器区域,由长度参数确定要读
14、的字节数.如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束. 3 学生成绩管理系统的设计与实现 3.1 学生类成员及函数 表一 学生类 成员(函数) 类型 含义 Name[20] char 姓名 ID[20] char 学号(九位) Subject[3] int 科目 sum int 总成绩 Input() void 输入函数 ReadFile(istream & in) void 读入文件函数 Show void 显示函数 3。2 学生信息类成员及函数
15、表二 学生信息类 函数(成员) 类型 含义 * Head,* End; ; Student 用于链表的开始和结束 Studentmassage() 构造函数 ~Studentmassage() 析构函数 ShowMenu() void 菜单函数 AddItem() void 创建信息函数 Sort() void 排序函数 Display() void 显示信息函数 RemoveItem() void 删除信息函数 ModifyItem() void 修改信息函数 ListCount() int 记录当前链表数目 S
16、wap(Student *,Student *) void 删除结点 save () void 保存函数 3.3 主要函数说明 首先在创建菜单时,应包括创建学生成绩录入,显示,查询,修改,删除,排序这六个功能,然后通过调用创建信息函数完成学生成绩的录入,显示函数实现学生信息的全部显示,通过修改可以改变输入错的信息,针对有的学生如果转学什么的可以对其信息进行删除,利用姓名来调用查询函数能够得到所想要的学生信息;最后,通过调用排序函数后在,可以在所见的文件夹里打开所有录入的学生信息及最终排序结果。 3。4 学生成绩管理系统的总结构图 通过总结构图能够直观地看出所制作的
17、成绩管理系统的各项功能,总结构图如下图3。 图3 学生成绩管理系统的总结构 3。5 模块的流程图 根据系统提示,选择1创建学生信息,根据系统提示可以一次输入姓名,学号,成绩,如果要对成绩显示则继续选择2,可以对成绩显示,当创建的信息大于等于2时可以继续选择3,进行排序,最终的结果可以在当前所建的记事本里显示各项成绩及排序,要对信息查询选择4来查询你想要的信息,也可以对信息修改等,最终可以选择0安全退出系统. 进入系统根据系统提示来选择想要进行的操作,从而完成各项的功能,利用信息查询也可以来判断所操作的删除是否删除成功的测试,查询流程如下,图4.
18、 图4 信息查询流程图 3。6 难点及难点的解决 难点:通过构造两个类来实现各种功能,使用链表来对各项功能的实现及使用文件来保存所得到的成绩排序结果的连接中相对较难. 解决:通过自己认真学习课本所学过的链表及文件相关的知识,并通过上网查找类似的链表和文件在C++中的应用来完成。 4 结果分析及改进 首先进入系统界面后,会有时间,日期的显示,并提示密码的输入,如下图5. 图5 首界面 根据界面提示进入菜单界面,可以对想要的操作进行选择,如图6。 图6
19、菜单界面 选择1,创建学生信息,创建学生的姓名、学号,各科成绩,最后会显示添加成功,结果如下图7。 图7 创建学生信息 根据刚才创建更多的学生信息后,选择3,可以显示创建的所有学生的信息,如图8. 图8 显示学生信息 根据刚才创建的所有信息可以进行查询自己所想要的学生信息,如下图9. 图9 查询学生信息 如果有的同学转学或其他什么的,该信息已经无意义,可以对该信息进行删除,如图9。 图10 删除学生信息 如果第一次创建信息过程中出现错误或输入的姓名与学号不对应,则可以通过修改学生的信息,如图10. 图11 修改信息 最后完成所有输入的成绩排
20、序,得到最终的结果显示,如图11. 图12 排序结果 所有的操作完成后,选择0,可以安全退出系统。如下图12。 图13 系统安全退出系统 5 小结和心得 对于我们所选的学生成绩管理系统的设计与实现,我是根据我们所做的ssrt 的项目有启发而做的,经过查阅资料发现利用文件和链表来实现,所以自己又把我们学过的链表和文件进行学习,查阅相关的实例练习链表的应用,但刚开始我们想的比较简单是依据C语言而实现的,到后来经老师的点拨,发现我们做的应该是基于C++ 的程序,虽然仅剩一天半左右的时间,我和队友能够更根据自
21、己前期准备的基础上,进一步查阅资料并对自己原有的程序进行修改,最终的以完成。 通过这次C++的课程设计的学习,让我体会到我们所学的C++课程的实用性,以前我认为计算机方面的课程仅仅是我所要必修的,没有什么的实际价值,但是经过这次课程设计,看到同学们所做的小游戏后,我发现其实我们所学的都是非常有用的,只是在以前我们缺乏思考和锻炼,仅仅把游戏当作一种娱乐,并没有发现用我们所学的知识也是可以制作的,所以启发我们以后需要多思考,多进行实际操作。 利用这次训练,我发现自己能够掌握更多的知识,通过两个人的合作,能够相互取长补短,对我后期的学习也有很大的帮助,让我不再对计算机课程感到头疼,同时也增加了我
22、对编程的兴趣与爱好,希望以后的学习、生活中,我能够和做这次课程设计一样,勤于动手,动脑,努力来弥补不足之处。 6 参考文献 [1] 谭浩强。C++程序设计[M].北京.清华大学出版社,2004.6. [2] 谭浩强.C++程序设计解题与上机指导[M].北京。清华大学出版社.2005。3. [3] 钱新贤,杨猛,程兆炜,张少东.Visual C++编程疑难详解[M].北京。人民邮电出版社,2000.5 [4]http://wenku.baidu。com/link?url=H3Fwag—V9gQ5Xp2l7eH-pfvTUjUciMMvcY14V [5
23、] http://blog。
附录
#include 〈fstream〉
#include 〈string>
#include
24、int Cnum; //C++课程得分 int Mnum; //数学课程得分 int Enum; //英语课程得分 int sum; //总分 Student * Next; void Input() { cout<<”\t\t请输入学生的姓名:”; cin>>name; cout<〈"\t\t请输入学生的学号(九位):"; cin〉〉Id; cout〈<"\t\t请输入C++课程的期末成绩:"; cin〉>Cnum; cout
25、<<”\t\t请输入数学课程的期末成绩:”; cin〉〉Mnum; cout<〈”\t\t请输入英语课程的成绩:”; cin〉〉Enum; sum=Cnum+Mnum+Enum; } void ReadFile(istream & in) { in〉〉name>>Id>>Cnum>>Mnum〉〉Enum>〉sum; } void Show() { cout〈〈" 姓名 " 〈<”学号 ”<<" C++ ” 〈〈" 数学 " <〈” 英语 ”〈〈” 总成绩 ”<〈endl;
26、
cout〈〈 name<〈" "〈 27、tem();
void RemoveItem();
void Swap(Student *,Student *);
void Sort(); //void Unpass();
int ListCount(); //void Average();
void Display()
{
for(Student * p=Head->Next;p!=End;p=p->Next)
p—〉Show();
cout〈〈"输入任意字符!继续……";
getch();
}
void AddItem() 28、
{
End—>Input();
End->Next=new Student;
End=End—〉Next;
cout<<”添加成功!"< 29、p-〉Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p—>Next—>name,name))return p;
return NULL;
}
Student *FindID(char * Id)
{
for(Student * p=Head;p—〉Next!=End;p=p—>Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next-〉Id,Id))return p;
return NULL;
}
};
//﹌﹌﹌﹌ 30、﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::Studentmassage()
{
Head=new Student;
Head-〉Next=new Student;
End=Head—〉Next;
in.open(”sort.txt”);
if(!in)
cout<〈"这是一个新系统,无学生信息。请先输入。”〈〈endl;
else
{
while(!in.eof())
{
End->ReadFile(in);
if(End—〉name 31、[0]==’\0')break;
End-〉Next=new Student;
End=End-〉Next;
}
in.close();
cout<<"\t\t读取学生信息成功!"〈 32、 Head->Next=Head—〉Next—>Next;
delete temp;
}
delete Head,End;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ShowMenu()
{
cout<<”**************************************************************"〈〈endl;
cout<〈”********制作人:西安建筑科技大学 张丹莉 周春燕****** 33、**"〈〈endl;
cout〈〈”********* 欢迎来到学生成绩管理系统 ***********"< 34、 4 查询学生信息 ***********"〈〈endl;
cout<<"********* 5 删除学生信息 ***********"< 35、****************”〈 36、*****************\n";
cout〈〈"\t\t※ 1.按学生的姓名查找\n\t\t※ 2。按学生学号查找”;
cout〈〈”\n\t\t*********************************\n请选择:”;
cin〉〉x;
switch(x)
{
case 1:{cout〈〈"\t\t请输入要查找的学生的姓名:”;cin〉〉name;
if(p=FindItem(name))
{
p—〉Next-〉Show();
cout〈〈"输入任意字符!继续……”;
ge 37、tch();
}
else
{
cout<〈"\t\t没有找到该姓名的学生!"〈<’\n’<〈endl;
cout<〈"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout〈<"\t\t请输入要查找的学生的学号:";cin>〉Id;
if(p=FindID(Id))
{
p->Next—>Show();
cout〈<"输入任意字符!继续……";
getch();
38、
}
else
{
cout<<"\t\t没有找到该学好的学生!”〈〈’\n'<〈endl;
cout〈<"输入任意字符!继续……”;
getch();
}
}break;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ModifyItem() //修改信息
{
char name[20];
Student * p=NULL;
cout<〈”\t\t请输入 39、要修改的人的姓名:";cin>〉name;
if(p=FindItem(name))
{
cout〈<"\t\t已找到学生的信息,请输入新的信息!”〈〈endl;
p—〉Next—〉Input();
cout<〈"修改成功!”<〈endl;
cout<〈”输入任意字符!继续……”;
getch();
}
else
{
cout<<"\t\t没有找到!"〈〈endl;
cout〈<"输入任意字符!继续……";
getch();
}
}
//﹌﹌﹌﹌﹌ 40、﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::RemoveItem() // 删除信息
{
char name[20];
Student * p=NULL,*temp=NULL;
cout<<"\t\t请输入要删除的学生的姓名:”〈〈endl;cin〉>name;
if(p=FindItem(name))
{
temp=p—〉Next;
p—〉Next=p—〉Next-〉Next;
delete temp;
cout<<”\t\t删除成功!” 41、〈〈endl;
cout<〈"输入任意字符!继续……”;
getch();
}
else
{
cout〈〈”\t\t没有找到!”〈〈endl;
cout<<”输入任意字符!继续……";
getch();
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域
{
Student *temp=new Student;
42、 strcpy(temp->name,p1->name);
strcpy(temp—>Id,p1-〉Id);
temp-〉Cnum=p1—>Cnum;
temp—>Mnum=p1—>Mnum;
temp-〉Enum=p1->Enum;
temp—〉sum=p1—>sum;
strcpy(p1->name,p2—〉name);
strcpy(p1—>Id,p2->Id);
p1-〉Cnum=p2—>Cnum;
p1—>Mnum=p2-〉Mnum;
p1-〉Enum=p2—〉Enum;
p1->sum 43、p2->sum;
strcpy(p2—〉name,temp—>name);
strcpy(p2—〉Id,temp—>Id);
p2—>Cnum=temp—〉Cnum;
p2—>Mnum=temp—>Mnum;
p2-〉Enum=temp—〉Enum;
p2->sum=temp—〉sum;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数
{
if(! Head)
return 44、 0;
int n=0;
for(Student * p=Head—〉Next;p!=End;p=p->Next)
{
n++;
}
return n;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Sort()//对当前链表进行排序
{
cout <<"Sorting.。."〈〈endl;
Student *p=NULL,*p1=NULL,*k=NULL;
int n=Studentmassage::ListCount();
45、 if(n〈2)
return;
for(p=Head—〉Next;p!=End;p=p—>Next)
for(k=p—>Next;k!=End;k=k—〉Next)
{
if(p->sum>k—〉sum)
{
Studentmassage::Swap(p,k);
}
}
cout 〈<"排序完成!”〈〈endl;
getch();
return;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage 46、Save()
{
out.open(”sort。txt”);
for(Student *p=Head—>Next;p!=End;p=p—>Next)
out<〈p—〉name<<”\t”〈 Enum〈〈”\t"< sum<<’\n’;
out。close();
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int main()
{
int x;
bool quit=false; 47、
system("cls”);
time_t t;
time(&t);
cout <〈”***********欢迎进入西安建筑科技大学学生管理系统****************\n”〈〈endl
<< ” ^ 当前系统时间是: " <〈 ctime(&t)<〈endl; //密码设置
cout<<" ^ 进入该系统设有密码,只有2次机会! \n”<〈endl;
cout〈〈” ^ 温馨向您提示,登录密码为 123456 48、\n"〈 49、 cout<<”-——-——-——---—-—--—-————-———-———---—--——--——---—-———-—----—--—---————-—-------—-——-"<〈endl;
cout<〈"======>> 西安建筑科技大学学生成绩管理系统 <〈=====”<






