《C++》课程设计学生成绩管理系统.docx
《《C++》课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《《C++》课程设计学生成绩管理系统.docx(33页珍藏版)》请在冰豆网上搜索。
《C++》课程设计学生成绩管理系统
《C++》课程设计学生成绩管理系统
C++课程设计报告
课题:
学生成绩管理系统
专业班级:
网工09102
学号:
200917030235
姓名:
许巧灵
指导教师:
屠添翼
评阅意见:
评定成绩:
指导老师签名:
目录
年月日
目录1.课程设计的目的和意义
2(需求分析3.系统设计
4.系统测试
5(结果分析6.心得体会
7.参考文献
8.源程序.
1
1课程设计的目的和意义
本课程设计为我们提供了一个既动手又动脑,自学,查资料,独立实践的机会。
将上学期课本上的理论知识和实际有机的结合了起来。
作为当代大学生我们应该更多地通过自己的实际操作去体会我们所学到的,以便有更多的了解和更强的动手能力,而不只是学习课本的知识,做一个“思想的巨人,行动的矮子”。
通过不断的实践,自己不停地思索,我们才能做到真正的有所获和有所感。
另一方面,我们组选择学生成绩管理系统是因为,它跟我们的生活很近,对我们以后的学习有很大的帮助,3个人一组共同学习更让我们能够体会到合作的重要性。
我想我们之所以要开展课程设计主要与以下目的:
1.锻炼我们实际分析问题和解决问题的能力,提高我们适应实际、实践编程的能力,使对C++语言系统编程有一个大致的了解。
2.加强我们的团结能力和合作精神。
3.学生管理系统是很普通的一种应用,选择该系统作为课程设计也可以为我们以后可能遇到的实际开发提供借鉴。
4.使学生掌握系统各功能模块的基本工作原理;
5.掌握C,,的基本编程原理和及基本的编程方法;
6.使学生学会系统调试;
7.提高学生的软件文档写作能力。
2
2.需求分析
根据学生成绩管理的需要,建立一个“学生成绩管理系统”,以方便对成绩的各项管理操作。
C++语言面向对象的编程思想来完成系统的设计,突出函数特征,以多个函数实现每一个子功能,并且画出功能模块图,进行简单界面设计,能够实现友好的交互;另一方面要具有清晰的程序流程图和数据结构的详细定义,熟练掌握C++语言对文件的各种操作。
据学生成绩表特点,决定选用链表这种数据结构来作为组成成绩数据库的基本框架。
链表是最简单也是最常用的一种动态数据结构。
它是对动态获得的内存进行组织的一种结构。
选用链表有即用即申请,不会造成内存空间的浪费;数据之间既有独立性,又便于数据的相互连系;便于数据的添加及删除等优点。
而用模块化程序设计理念,对各个功能定义不同函数
分块处理,这样有利于后期调试及今后对功能的完善。
功能图如下:
学生成绩管理系统
课学班
程生级
管管管
理理理
页页页
面面面
增删显修保读
添除示改存取
3
每条链表有自己独立的函数和特定的功能,“学生信息管理”里面包含了学生成绩的排序等特有函数,而且主函数简单易懂明了。
其中三条链表中都有上面所画功能图的功能,让人能一目了然。
4
3系统设计
经过我们的讨论决定将“学生成绩管理系统”分为三块,包括学生基本信息管理系统、学生课程管理系统和班级管理系统。
每个人各自负责自己的一部分,然后共同讨论,编写出主函数。
学生基本信息管理系
统
删显修保添读
除示改存加取
学生姓名、学号、基础科目成绩
主要编写部分学生基本信息管理系统:
学生信息管理系统内共包含了7个不同的函数,而每一个函数是一个模块,并对它们具体编写,使之具有不同的功能,能实行相应的操作。
3.1各模块功能分析
1.增添学生信息:
增添学生信息包括增添学生的姓名、学号、基本科目的成绩
等,用voidsadd()函数去实现。
2、删除学生信息:
具体定义voidsremove();函数,使之实现其功能。
3、查找学生信息:
定义voidssearch()函数去具体实现其操作,可以输入学号或姓名找到相应学生的信息,若不存在,则显示“未找到”。
4、排序:
根据学生情况,先定义voidstaxis()函数可选择按学号排序和以总分排序,然后,分别用voidpxh()函数和voidpAA()函数去实现它们的具体功能。
5、保存学生信息:
定义voidssave()函数
6、读取学生信息:
定义voidsread()函数,具体解法可从源程序中得出。
5
7、处理学生信息模块菜单:
具体功能由voidMenu()函数实现。
此模块可如下
编写:
intstudentlist:
:
MenuSelect()//处理学生信息模块菜单{
chars[10];
intcn;
cout<<"\t**********************\n";
cout<<"\t-----学生信息管理-----\n";
cout<<"\t1„„增加学生\n";
cout<<"\t2„„删除学生\n";
cout<<"\t3„„修改学生\n";
cout<<"\t4„„查询学生信息\n";
cout<<"\t5„„排序\n";
cout<<"\t6„„保存信息\n";
cout<<"\t7„„读取信息\n";
cout<<"\t0.返回主菜单\n";
cout<<"\t**********************\n";
cout<<"\t选择0-7:
";
for(;;)
{
gets(s);
cn=atoi(s);
if(cn>7)
cout<<"\n\t输入错误,重选0-7:
";
else
break;
6
}
returncn;
}
3.2类、函数及说明
本链表里定义的类如下:
一(
#definemax100000#includeusingnamespacestd;classstudent//定义student类
{
public:
student*next;public:
stringname;//学生姓名
longnum;//学生学号
intx,y,z;//学生成绩
intAA;//学生总成绩
voidplay();//显示函数
student(stringsname,longsnum,intsx,intsy,intsz);//构造函数
};
二(
#include"student.h"classstudentlist
7
{
private:
student*stu;
intMenuSelect();//显示和处理学生信息模块菜单
public:
studentlist()//构造函数初始化
{
stu=0;
sread();
}
~studentlist()//定义析构函数
{
student*p;
p=stu;
while(p)
{
p=p->next;
deletestu;
stu=p;
}
stu=0;
}
voidsadd();//增添学生信息
voidsremove();//删除学生信息
voidsamend();//修改学生信息
voidssearch();//查找学生信息
voidstaxis();//排序
voidssave();//保存学生信息
voidsread();//读取学生信息
8
voidpxh();//以学号排序
voidpAA();以总分排序
voidMenu();//处理学生信息模块菜单};
3.3重要模块算法
运用“冒泡法”,以学生的学号或总成绩排序:
下面例举出运用指针按学号从小到大排序
voidstudentlist:
:
pxh()//按学号从小到大排序{
student*p1,*p2;
intn;
p1=stu;
n=1;
while(p1->next)
{n++;p1=p1->next;}
cout<<"共有"<inti;
p1=stu;
for(i=1;i{
p1=stu;
if(p1->num>p1->next->num)
{
p2=p1->next;
p1->next=p1->next->next;
p2->next=p1;
stu=p2;
}
p1=stu;
9
while(p1->next->next)
{
p2=p1;
p1=p1->next;
if(p1->num>p1->next->num)
{
p2->next=p1->next;
p1->next=p1->next->next;
p2->next->next=p1;
p1=p2->next;
}
}
}
p1=stu;
do
{
p1->play();
p1=p1->next;
}while(p1);
}
显示结果下图所示:
按总分从小到大排序
10
4系统测试1.界面管理:
进入1,学生资料管理系统
2.主菜单管理:
进入6,排序
可以分为按学号从小到大和按成绩从低到高两种排序方式:
3,功能选择:
11
4.删除和修改学生信息:
5.保存和读取学生信息:
输入相应的数字,即可以得到相应的结果,进行对应的操作,若操作错误,
则会给出相应的提醒。
12
5心得体会
整整两周的程序设计弄我把本以为开学的轻松抛得一干二净,只是在心中默默地说到“要想把一个程序设计完全弄好还真不是一件简单的是。
”
虽然,上学期我们也搞了C语言程序设计,可跟这次比起来真的是有一定的差距。
因为上学期老师不是抓的太严,所以我们大部分的人的任务是只要把程序看懂就足够了,而源程序一般都是从网上找的,实践报告也马马虎虎就能过了,可这学期完全不同。
因为三个人一组每人都必须要有自己的链表,所以网上的程序一般都不符合老师要求,我们只能认认真真地也了。
在大家的共同努力下,我们总算将此程序设计出来。
尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。
另外平时扎实的基础也很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。
为了解决此。
类问题,最好就是多向同学,老师请教,不要怕难为情。
尤其是老师,评他们多年的编写程序的经验,要解决我们的问题,对他们来说只是smallcase。
在设计这个程序时,我们刚开始是根据老师给我们提供的资料,用画图以及循环将框架设计出来,但是接下去便无从下手了,计算是个关键和难点,我们也查了相应的资料,但是它上面用得是坐标来做的,所以为了方便设计程序,我们也改为坐标来做的,这样计算问题解决了。
接下去就是按键问题,我们的资料是用鼠标做的,所以关于按键这个函数就只能我们自己设计,还好手头有类似的资料,经过自己的反复尝试以及与与同学的讨论,这也不难,最好还是被我们搞定了。
最后就是闪烁,这个设计的方法很死板,都一个类型,就是算坐标比较烦琐,要确定好它的位置,但是这些只要你自己愿意去尝试,问题都可以迎刃而解的。
在学程序的过程中,还确实遇到了不少麻烦。
首先,因为我们都已经习惯了把所有程序都写在一起,而老师要求必须分模块写,确实这样做对我们真的是有很大的帮助,特别有利于错误的查找;接着是链表的应用,由于以前很少接触链表,在C语言中我们也只学了一些简单的数组和指针等,而链表是属于数据结构
13
部分,我们这学期才开始学习,特别对于排序,要用到链表就更有一定的难度。
于是,只好看书、查找资料,认真地去学习,去理解,终究还是有所收获。
在编写“stuent”链表的时候,我给它设计了不同的独立模块,分别去实现不同的功能。
如:
增添学生信息、删除学生信息、修改学生信息、查找学生信息、排序、保存学生信息读取学生信息、以学号排序、以总分排序和处理学生信息模块菜单等。
不停地思索,然后不停地学习,看着程序一点点地被自己亲手编写出来正是有一种说不出的高兴,即使有些部分是仿照老师的编写的。
呵呵,原来,只要肯学就一定会有所所获~
14
参考文献
[1]严蔚敏吴伟民.数据结构(C语言版)北京:
清华大学出版社[2]王竹林.校园网组建与管理[M].北京:
清华大学出版社,2002[3]陈维兴,林小茶《C++面向对象程序设计教程》清华大学出版[4]网站:
15
附录源程序#definemax100000#include
usingnamespacestd;classstudent//定义student类
{
public:
student*next;
public:
stringname;//学生姓名
longnum;//学生学号
intx,y,z;//学生成绩
intAA;//学生总成绩
voidplay();//显示函数
student(stringsname,longsnum,intsx,intsy,intsz);//构造函数};
#include"student.h"#include
#include
usingnamespacestd;student:
:
student(stringsname,longsnum,intsx,intsy,intsz)//初始化构造函数
{
name=sname;
num=snum;
x=sx;
y=sy;
z=sz;
}
voidstudent:
:
play()
{cout<"<"
<"<"<}
/*******************************************************************/
#include"student.h"classstudentlist
{
private:
student*stu;
intMenuSelect();//显示和处理学生信息模块菜单
16
public:
studentlist()//构造函数初始化
{
stu=0;
sread();
}
~studentlist()//定义析构函数
{
student*p;
p=stu;
while(p)
{
p=p->next;
deletestu;
stu=p;
}
stu=0;
}
voidsadd();//增添学生信息
voidsremove();//删除学生信息
voidsamend();//修改学生信息
voidssearch();//查找学生信息
voidstaxis();//排序
voidssave();//保存学生信息
voidsread();//读取学生信息
voidpxh();//以学号排序
voidpAA();以总分排序
voidMenu();//处理学生信息模块菜单};
#include"studentlist.h"
#include#includeusingnamespacestd;voidstudentlist:
:
sadd()//增添学生信息{
student*q;
stringname1;
longnum1;
intx1,y1,z1;
system("cls");
cout<<"\n**增加的学生**\n"<cout<<"请输入学生的(中间用空格间隔)"<cout<<"姓名学号数学成绩语文成绩英语成绩:
"<17
cin>>name1>>num1>>x1>>y1>>z1;
q=newstudent(name1,num1,x1,y1,z1);
q->next=0;
q->AA=x1+y1+z1;
if(stu)
{
student*t;
t=stu;
if(t->num==num1)
{
cout<<"学号已存在,请重新输入"<return;
}
while(t->next)
{
if(t->num==num1)
{
cout<<"学号已存在,请重新输入"<return;
}
t=t->next;
}
t->next=q;
}
else
{
stu=q;
}
cout<<"输入完毕"<voidstudentlist:
:
sremove()//删除学生信息{
system("cls");
intnum1;
cout<<"\n**删除学生信息**\n";
cout<<"请输入想要删除学生的学号:
";
cin>>num1;
student*p1,*p2;
p1=stu;
while(p1)
{
if(p1->num==num1)
18
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1!
=NULL)
{
p1->play();
cout<<"确定删除吗?
[Y/N]"<charc;
cin>>c;
if(toupper(c)!
='Y')return;
if(p1==stu)
{
stu=p1->next;
deletep1;
}
else
{
p2->next=p1->next;
deletep1;
}
cout<<"找到学号为"<}
else
cout<<"未找到想要删除的学生!
\n";}
voidstudentlist:
:
samend()//修改学生信息{
system("cls");
longnum1;
cout<<"\n**修改学生信息**\n";
cout<<"输入要修改学生的学号";
cin>>num1;
student*p1,*p2;
p1=stu;
while(p1)
{
if(p1->num==num1)
break;
else
{
19
p2=p1;
p1=p1->next;
}
}
if(p1!
=NULL)
{
cout<<"学号是"<cout<<"姓名"<name<<"数学"<x<<"语文"<y<<"英语
"<z<cout<<"请输入修改后的信息:
姓名数学成绩语文成绩英语成绩"<cin>>p1->name>>p1->x>>p1->y>>p1->z;
p1->AA=p1->x+p1->y+p1->z;
cout<<"修改成功"<}
else
cout<<"未找到!
\n";
}
voidstudentlist:
:
ssearch()//查找学生信息
{
system("cls");
cout<<"\n**查询学生信息**\n"<cout<<"请输入查询方式:
"<cout<<"1.按学号查询"<cout<<"2.按姓名查询"<cout<<"3.返回"<charc;
cin>>c;
switch(c)
{
case'1':
{
longnum1;
cout<<"要查询的学号"<cin>>num1;
student*p1,*p2;
p1=stu;
while(p1)
{
if(p1->num==num1)
break;
else
{
p2=p1;
p1=p1->next;
20
}
}
if(p1!
=NULL)
{
cout<<"学号是"<cout<<"姓名:
"<name<<"数学:
"<x<<"语文:
"<y<<"英
语:
"<z<cout<<"查询完毕...";
}
else
cout<<"未找到!
\n";
break;
}
case'2':
{
stringname1;
cout<<"要查询的学生姓名"<cin>>name1;
student*p1,*p2;
p1=stu;
while(p1)
{
if(p1->name==name1)
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1!
=NULL)
{
cout<cout<<"学号:
"<num<<"数学:
"<x<<"语文:
"<y<<"英
语:
"<z<cout<<"查询完毕...";
}
else
cout<<"未找到!
\n";
break;
}
case'3':
return;
21
}
}
voidstudentlist:
:
pxh()//按学号从小到大排序{
student*p1,*p2;
intn;
p1=stu;
n=1;
while(p1->next)
{n++;p1=p1->next;}
cout<<"共有"<inti;
p1=stu;
for(i=1;i{
p1=stu;
if(p1->num>p1->next->num)
{
p2=p1->next;
p1->next=p1->next->next;
p2->next=p1;
stu=p2;
}
p1=stu;
while(p1->next->next)
{
p2=p1;
p1=p1->next;
if(p1->num>p1->next->num)
{
p2->next=p1->next;
p1->next=p1->nex