C++小型学生成绩管理系统.docx
- 文档编号:15738691
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:29
- 大小:215.88KB
C++小型学生成绩管理系统.docx
《C++小型学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C++小型学生成绩管理系统.docx(29页珍藏版)》请在冰点文库上搜索。
C++小型学生成绩管理系统
高级程序设计实践报告
课题名称:
小型学生成绩管理系统
姓名:
小戴
专业班级:
电气1207
学号:
0909120700
指导老师:
向老师
上课时间:
6.24~7.4
一.课程设计目的
1、使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;
2、使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力;
3、使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
二.设计要求
1、需要处理的基础数据
1)学生基本信息:
如班级、学号、姓名、性别、年龄、宿舍号码、电话号码等。
2)学生选修课程的基本信息:
课程编号、课程名称、考试成绩、平时成绩、综合成绩、学分、重修否等。
2、系统的基本功能
*数据的录入:
如录入学生的基本信息,以及该学生选修课程的基本信息;
*数据的修改:
如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息;
*数据的插入:
插入某个学生信息;
*数据的查询:
如按学号查询、按姓名查询等;
* 数据的删除:
如删除指定学号、或者指定姓名的学生及其选修课程信息;
*平均成绩的计算:
计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息;
*列出不及格学生清单(学号、姓名、不及格的课程和成绩)。
*考虑用文件把数据保存起来(可选)。
三.概要设计
1.整体框架:
整个学生成绩管理系统采用链表作为基本数据结构,创建一个类student用于保存学生的数据且是链表中的一个节点。
类list作为保存整个链表之用。
主函数通过switch语句来根据用户的需要连接各个模块,以实现用户的需要。
2.模块基本介绍:
1).用户输入模块
在此模块中,用户将根据菜单提示结合自己的需求输入一个0~8的值,来实现一定的功能。
2).学生信息录入模块
此模块可以让用户从键盘输入每个学生的信息:
学号、姓名、性别、各门课程的成绩。
用户可插入一个或多个学生信息到当前编辑的班级数据中。
用户可删除一个或多个学生信息。
3).文件保存功能模块
用户在确定以录入的成绩无误之后,可以将学生信息以每一班为单位存为一个数据文件。
用户输入的学生信息可随时保存数据文件。
4).文件打开功能模块
用户可以用此模块将数据文件在程序中打开、编辑,程序只能对当前打开的数据文件进行编辑。
5).查询功能模块
在此模块里,用户可实现以下操作:
1.浏览所有学生信息;2.按学号查询学生信息;3.按姓名查询学生信息;4.查询一个班每个人的总成绩和平均成绩;5.查询一个班某一门课每个人的总成绩和平均成绩;6.列出不及格清单。
6).报表输出功能模块
在此模块中,用户可以浏览所有学生的信息,或者可以按学号输出一个班学生信息:
学号、姓名、性别、各门课成绩和总成绩,到屏幕和文件。
也可以按平均成绩输出从高到低输出学号、姓名信息。
3.模块图:
四.详细设计
主要功能模块的算法设计思路:
1.用户输入模块设计
提示用户输入一个0~8的值,并存储在一个整型变量m中。
2.学生信息录入模块设计
通过应用list中的instu()函数,来新建一个链表中的节点,即一个新的学生信息,来进行成绩的录入功能。
成绩修改功能,可以根据姓名或学号进行查询并修改相应的课程的成绩,使用了voidsearch(chars[10],int)和voidsearch1(chars[20],int)函数进行操作。
search函数根据姓名查找,search1函数根据学号进行查找。
因为学号和姓名,都是存储在字符数组中的,所以都是通过字符串的比较进行查找的。
然后根据整形参数进行对应的课程成绩的修改。
成绩删除功能,也是可以根据姓名或学号进行删除,查询的算法和成绩修改功能的查询方法是一样的,当找到要删除的节点时,因为节点都是在堆内存中保存的,所以可以直接delete掉,并将前一个节点的next指针指向被删掉的节点的next指针所指向的节点。
3.文件保存功能模块
先提示用户输入保存文件的文件名及班级名称。
文件的前两行分别是班级名称和成绩单的开头,然后通过ofstream变量output来进行学生信息的输出,一项一项的输出,并设定格式,直到输出节点为NULL为止,之后关闭output。
4.查询功能模块
可以根据姓名或学号进行查找,搜索方法和前几个模块相同。
通过outstu1(char*n)和outstu(char*n)来进行输出。
总成绩和平均成绩的查询通过函数voidoutsum(char*)和voidoutsum1(char*)来完成。
通过函数scanall()来浏览所有学生的信息。
通过函数think()来进行成绩的统计分析。
5.报表输出功能模块
通过建立一个新的类classstucopy用于拷贝student的数据,并实现排序功能。
创建一个stucopystu[M]数组,将原链表的数据拷贝与数组中,然后用选择排序方法将数组排序,然后用output按照标准的格式输出或保存为数据文件。
五.运行结果
(1)信息的录入
(2)成绩的查询
(3)成绩的修改
(4)数据的删除
(5)列出不及格清单
(6)浏览所有学生信息
(7)保存文件
(8)按平均成绩排序输出学生信息
六.心得体会
虽说已经有过一次程序设计的经历,但这次的难度显然是比上次要大的多的。
本此程序设计所用时间较长,工作量很大,且所涉及的知识很多,光凭我们在课堂上学的知识是远远不够的。
开始的时候我还是很期待这次挑战的,但当我真正着手策划设计的时候,才发现有些东西已经超过了自己的能力范围了,但这并不意味着我会因此放弃,接着我就去接了几本相关的书籍,在遇到问题的时候我就会去查阅,也确实解决了一些问题,但显然还有许多问题无从下手,这时就不得不向大神求助了。
我觉得在编写程序时需要的是灵感,有时苦坐数个小时什么都没做,但有时在夜深人静的时候却一下子解决了好多问题,虽然熬得很晚,却很值得。
为了这个程序设计确实是忙活了好久,总算勉强完成了。
我相信我收获的绝不仅仅是一个程序,还有在思维上的锻炼,以及编写能力的提高。
总而言之,我觉得这次课程设计很有意义,很有价值。
附录:
#include
#include
#include
#include
intgrade_number;//课程数
constintM=20;
classstucopy//此类用于拷贝student的数据,用于排序功能的实现
{
public:
charid[20];
charsex[10];
charname[10];
charcourse[5];//课程编号
doublegrade[2][5];
doublesumsum;//总成绩
doubleaverage;//平均成绩
doublexuefen;
charage[5];
chardorm[5];
chartele[20];
};
classstudent//用于保存学生信息的类
{
friendclasslist;
public:
charid[20];//保存学号
charsex[10];//保存性别
charname[10];//保存名字
doublegrade[2][5];//保存成绩
charcourse[5];//保存课程编号
doublexuefen;
charage[5];
chardorm[5];
chartele[20];
student()
{
next=0;
for(inti=0;i<20;i++)id[i]=0;
for(inti=0;i<10;i++)sex[i]=0;
for(inti=0;i<10;i++)name[i]=0;
for(inti=0;i<5;i++)age[i]=0;
for(inti=0;i<5;i++)dorm[i]=0;
for(inti=0;i<20;i++)tele[i]=0;
}
voids();
voidsetid(charid1[20])
{
for(inti=0;i<20;i++)
id[i]=id1[i];
}
voidsetsex(charsex1[10])
{
for(inti=0;i<10;i++)
sex[i]=sex1[i];
}
voidsetname(charname1[10])
{
for(inti=0;i<10;i++)
name[i]=name1[i];
}
voidsetage(intage1[5])
{
for(inti=0;i<5;i++)
age[i]=age1[i];
}
voidsetdorm(intdorm1[5])
{
for(inti=0;i<5;i++)
dorm[i]=dorm1[i];
}
voidsettele(inttele1[5])
{
for(inti=0;i<5;i++)
tele[i]=tele1[i];
}
voidsetcourse(intcourse1[5])
{
for(inti=0;i<5;i++)
course[i]=course1[i];
}
student*next;//next指向下一个学生,构成链表
char*outid(){returnid;}
char*outsex(){returnsex;}
char*outname(){returnname;}
char*outage(){returnage;}
char*outdorm(){returndorm;}
char*outtele(){returntele;}
doubleoutav(){returnthis->outsum()/grade_number;}
doubleoutgrade(inti){returngrade[2][i]=grade[0][i]*0.3+grade[1][i]*0.7;}
charoutcourse(inti){returncourse[i];}
voidintgrade(int);
doubleoutsum()
{
doublesum=0;
for(inti=0;i sum+=this->outgrade(i); returnsum; } }; voidstudent: : s()//用于录入学生的信息 {cout<<"请输入课程数: "< cin>>grade_number; cout<<"请输入学号: "< cin>>id; cout<<"请输入姓名: "< cin>>name; cout<<"请输入性别: "< cin>>sex; cout<<"请输入年龄: "< cin>>age; cout<<"请输入宿舍号: "< cin>>dorm; cout<<"请输入电话: "< cin>>tele; for(inti=0;i {cout<<"请输入课程编号: "< cin>>course[i]; cout<<"学分: "< cin>>xuefen; cout<<"平时成绩: "< cin>>grade[0][i]; if(grade[0][i]>100||grade[0][i]<0) {cout<<"请输入0~100之间的数! "< cout<<"请重新输入: "< cin>>grade[0][i];} cout<<"考试成绩"< cin>>grade[1][i]; if(grade[1][i]>100||grade[1][i]<0) {cout<<"请输入0~100之间的数! "< cout<<"请重新输入: "< cin>>grade[1][i];} } } voidstudent: : intgrade(intj)//用于修改学生的成绩 { for(inti=0;i if(j==i+1) { cout<<"平时成绩"< cin>>grade[0][i]; if(grade[0][i]>100||grade[0][i]<0) {cout<<"请输入0~100之间的数! "< cout<<"请重新输入: "< cin>>grade[0][i];} cout<<"考试成绩"< cin>>grade[1][i]; if(grade[1][i]>100||grade[1][i]<0) {cout<<"请输入0~100之间的数! "< cout<<"请重新输入: "< cin>>grade[1][i];} } } classlist//此类为链表 { public: student*last,*first;//链表的开头和结尾 doubletotoal; list(){last=0;first=0;}; ~list(); voidinstu();//新建一个学生的数据 voidoutstu(char*);//根据姓名输出一个学生的信息 intdelstu(char*n);//根据姓名删除一个学生的信息 voidoutstu1(char*);//根据学号输出一个学生的信息 intdelstu1(char*n);//根据学号删除一个学生的信息 voidoutsum(char*);//根据姓名输出一个学生的总成绩和平均成绩 voidoutsum1(char*);//根据学号输出一个学生的总成绩和平均成绩 voidthink();//用于输出班级成绩的统计分析 voidsearch(chars[10],int);//根据姓名修改一个学生的成绩 voidsearch1(chars[20],int);//根据学号修改一个学生的成绩 voidscanall();//输出所有学生的信息 }; list: : ~list()//析构函数,将所有创建的学生对象删掉 { if(first! =0) { student*p=first,*temp; while(p! =NULL){ temp=p; p=p->next; deletetemp; cout<<"ok"< }}} voidlist: : instu() {student*p=newstudent(); p->s(); if(first==0){first=last=p;}else{last->next=p;last=p;} } voidlist: : outstu(char*n)//按姓名输出 { if(first==0){cout<<"班级无成员! 查无此人! "< student*temp=first;for(;temp! =NULL;temp=temp->next) if(strcmp(temp->outname(),n)==0) {cout< for(inti=0;i {cout< cout< cout< < for(inti=0;i {cout< return;} cout<<"查无此人! "< return; } voidlist: : outstu1(char*n)//按学号输出 { if(first==0){cout<<"班级无成员! 查无此人! "< student*temp=first;for(;temp! =NULL;temp=temp->next) if(strcmp(temp->outid(),n)==0) {cout< for(inti=0;i {cout< cout< cout< < for(inti=0;i {cout< return;} cout<<"查无此人! "< return; } intlist: : delstu(char*n)//删除学生成绩 { if(first==0){cout<<"无数据! "< student*temp=first; student*p; if(strcmp(first->outname(),n)==0) {first=first->next;deletetemp; cout<<"\n删除成功\n";return0;} elsefor(;temp->next! =NULL;temp=temp->next) {if(strcmp(temp->next->outname(),n)==0) {p=temp->next;temp->next=temp->next->next;deletep; cout<<"\n删除成功\n";return0;}} cout<<"\n查无此人,删除失败\n"; return0; } intlist: : delstu1(char*n) { if(first==0){cout<<"无数据! "< student*temp=first; student*p; if(strcmp(first->outid(),n)==0) {first=first->next;deletetemp; cout<<"\n删除成功\n";return0;} elsewhile(temp->next! =NULL) {if(strcmp(temp->next->outid(),n)==0) {p=temp->next;temp->next=temp->next->next;deletep; cout<<"\n删除成功\n";return0;} elsetemp=temp->next;} cout<<"\n查无此人,删除失败\n"; return0; } voidlist: : think()//列出不及格清单 { cout< < student*p=first;for(;p! =NULL;p=p->next) for(intj=0;j {if(p->grade[2][j]<60) { cout< < } } } voidlist: : search(chars[10],intn)//根据姓名修改 { student*temp=first;for(;temp! =NULL;temp=temp->next) if(strcmp(temp->outname(),s)==0)temp->intgrade(n); } voidlist: : search1(chars[20],intn)//根据学号修改 { student*temp=first;for(;temp! =NULL;temp=temp->next) if(strcmp(temp->outid(),s)==0) temp->intgrade(n); } voidlist: : scanall() { if(first==0){cout<<"班级无成员! 查无此人! "< student*temp=first;for(;temp! =NULL;temp=temp->next) {cout< for(inti=0;i {cout< cout< cout< for(inti=0;i {cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 小型 学生 成绩管理系统