《学生成绩管理系统C++程序设计(19页).doc》由会员分享,可在线阅读,更多相关《学生成绩管理系统C++程序设计(19页).doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-项目设计题目(学生成绩管理系统)学号: 姓名: 自评成绩: 成绩: 1.选题意义、依据 学生成绩系统的设计从学生的应用中而来,学生了解该系统的组成和运行过程,它贴近学生的生活能使学生更加方便的使用各个语句、函数、结构体等。 依据学生期末成绩表的格式。2.系统功能设计与分析(功能模块说明)系统主要用于从一个文件夹读入学生信息(101 张三 85 78 87102 李斯 57 59 60 103 王红 84 79 87104 赵子龙 72 75 76 105 李洪磊 88 98 89),包括学生学号、姓名、成绩(数学、英语、数据库),程序中引用了八个函数 void Cscore(int); vo
2、id Rank(int ave); void Listnumber(int i); void Listscore(int i); void Lookup(int); void Alter(int); void Dele(int &i); void Insert(int &i); 系统主要实现的功能有:查询、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)。 Cscore 函数主要是对学生进行排名。具有相同总分的学生具有相同的名次,例如:第三名和第四名具有相同的总分则在表中不会出现第四名,将出现两个第三名紧接着出现第五名学生的情况。Rank 函数主要用于按平均分对学生进行备注。把学生
3、分为四个等级:90分为excellent,8090分为medium,6080分为qualified,60分为disqualified。Listnumber 函数主要用于把学生的信息(学号 姓名 数学 英语 数据库 总分 平均分 名次 备注)以学号排名的顺序用表的形式输出,方便学生查看。Listnumber 函数中还调用了Cscore 和Rank 函数。Listscore 函数是把学生的信息以总成绩排名的形式输出。Lookup 函数主要运用学号或姓名形式查询单个学生信息,如果存在则输出该学生信息(学号 姓名 数学 英语 数据库 总分 平均分 名次 备注),否则输出“Input message i
4、s error.”。Alter 函数是修改指定学号的学生信息。主要用于修改指定学号学生的各科成绩并输出修改后的学生信息(学号 姓名 数学 英语 数据库 总分 平均分 名次 备注)。Delete 函数用于删除指定学生的信息。可用两种方式删除:以学号形式删除学生信息,以姓名形式删除学生信息。若要删除了学生不存在则输出“message error.”。Insert 函数用来插入学生的信息,一次调用Insert 函数可以添加多个学生的信息。Insert 函数中还调用了Cscore 和Rank 函数。3.涉及的主要知识点说明 (1)系统主要运用了函数的声明、定义、调用(值调用和地址调用)。(2) 对文件
5、的读入操作。(3) 在平均分的求取上采用四舍五入的方式,运用了类型转换。(4) 多次运用if和for嵌套,在for嵌套中又运用了break语句。(5) 运用了switch。(6) 对字符数组的比较中运用了strcmp,还运用toupper把小写字母转换成大写。(7) 对学生信息进行的插入和有序删除操作。(8) 运用iomanip对输出进行美观。4. 创新性说明(怎么解决) 创新性:系统可以对具有相同总分学生的学生输出相同的名次。若存在三个相同的分数都为第二名,则在输出时出现三个第二名不会出现第三、四名,紧接着出现第五名。 解决方法:(1)用一个数组记录具有相同分数的人数,数组下标和学生信息所具
6、有的下标相同;(2)删除相同的总分只保留其中一个分数;(3)对删除相同总分的分数按从高到底进行排序;(4)对各个学生的总分进行排名。5. 源代码/*/Student achievement program/This program has eight functions of students grade,including list/score ranking,lookup,alter,delete,insert and rank.From the file read in/student achievement.Scores of people have the same same pla
7、ce./*#include#include#include#include#include#includevoid Cscore(int);void Rank(int ave);void Listnumber(int i);void Listscore(int i);void Lookup(int);void Alter(int);void Dele(int &i);void Insert(int &i);using namespace std;const int MAX=100;struct student /定义学生信息结构体int num;char name8;int math;int
8、english;int database;int sum;int average;int score;stuMAX;int main() /主函数int i,k;char ch;string filename;ifstream infile;coutfilename;infile.open(filename.c_str();if (!infile)coutCant open the input file.endl;return 1;for (i=0; istui.numstui.namestui.mathstui.englishstui.database; stui.sum=stui.math
9、+stui.english+stui.database; stui.average=int(float(stui.sum)/3+0.5);i=i-1; coutendlWelcome to 学生成绩管理系统 endl; coutY or N 进入菜单栏 ch; ch=toupper(ch); while (ch=Y) coutendl 菜单:endl 1)查 询endl 2)修 改endl 3)删 除endl 4)插 入endl 5)成绩单(以学号排名)endl 6)成绩单(以名次排名)endl; cout*请选择 1-4 中任何一个:k; coutendl; switch (k) case
10、1:Lookup(i);break; case 2:Alter(i);break; case 3:Dele(i);break; case 4:Insert(i);break;case 5:Listnumber(i);break;case 6:Listscore(i);break; default :couterror input!endl; coutendl继续选择 Y or N ?ch; ch=toupper(ch); coutThank you for using!endl Bye bye !endl;infile.close();return 0; /end mainvoid Cscor
11、e(int i) /对学生分数进行排名int hMAX,bMAX,scoreMAX+1,n,k,j;int sum0MAX,s;n=i;for (j=0; ji; j+)sum0j=stuj.sum;for (j=0; ji; j+)hj=0;for (k=0; ki; k+)if (sum0j=sum0k)hj+; /具有同一分数的人数 /end for /end forfor (j=0; ji; j+) /删除多个同一分数只保留其中一个分数for(k=j+1; ki; k+)if(sum0j=sum0k)sum0k=sum0i-1;i-;k-; /end forfor (j=0; ji;
12、j+) /按从高到底的顺序对总分进行排名for (k=j+1; ki; k+)if (sum0jsum0k)s=sum0j;sum0j=sum0k;sum0k=s; /end if /end for /end forb0=0;score0=1;for (j=0; ji; j+) /对学生成绩进行排名for(k=0; k=90)cout=80)cout=60) coutqualified; else coutdisqualified; coutendl;void Listnumber(int i)int j;Cscore(i);cout学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 e
13、ndl;for (j=0; ji; j+) coutsetw(1)stuj.numsetw(9)stuj.namesetw(4)stuj.mathsetw(6)stuj.englishsetw(6)stuj.database;coutsetw(8)stuj.sumsetw(7)stuj.average;coutsetw(7);coutstuj.score ;Rank(stuj.average);void Listscore(int i)int j,k;Cscore(i);cout学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 endl;for (j=1; ji+1; j+)for (
14、k=0; ki; k+)if(stuk.score=j)coutsetw(1)stuk.numsetw(9)stuk.namesetw(4)stuk.mathsetw(6) stuk.englishsetw(6)stuk.database; coutsetw(8)stuk.sumsetw(7)stuk.average; coutsetw(7); coutstuk.score ; Rank(stuk.average);void Lookup(int i) /运用学号或姓名形式查询单个学生信息int j,k,n,numb;char name18; coutPlease select you che
15、ck score ways.endl;cout1 is use number,0 is use name.n;if (n) /以学号形式查询学生信息coutnumb;for (j=0;ji;j+)if (numb=stuj.num)k=j; break;else /以姓名形式查询学生信息coutname1;for (j=0;ji;j+)if (strcmp(stuj.name,name1)=0)k=j;break;if (k=MAX) coutInput message is error.endl;else /如果学生存在则输出学生信息Cscore(i);cout学号 姓名 数学 英语 数据库
16、 总分 平均分 名次 备注 endl;coutsetw(1)stuj.numsetw(9)stuj.namesetw(4)stuj.mathsetw(6)stuj.englishsetw(6)stuj.database;coutsetw(8)stuj.sumsetw(7)stuj.average; coutsetw(7);coutstuj.score ;Rank(stuj.average);void Alter(int i) /修改指定学号的学生信息int numb,j; coutalter begin.endl; coutnumb; for (j=0;ji;j+) if (numb=stuj
17、.num) coutfind out:endl; cout学号:stuj.num 姓名:stuj.nameendl; coutPlease input new result: 数学 英语 数据库 stuj.mathstuj.englishstuj.database; stuj.sum=stuj.math+stuj.english+stuj.database; stuj.average=int(float(stuj.sum)/3.0+0.5); Cscore(i); /输出修改后该学号学生的信息 cout学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 endl; coutsetw(1)
18、stuj.numsetw(9)stuj.namesetw(4)stuj.mathsetw(6)stuj.englishsetw(6)stuj.database; coutsetw(8)stuj.sumsetw(7)stuj.average; coutsetw(7); coutstuj.score ; Rank(stuj.average); break; void Dele(int &i) /删除指定学生的信息int numb,j,k;char name08;coutdelete begin.endl;coutPlease select:endl; cout 1以学号形式删除学生信息endl;c
19、out 0以姓名形式删除学生信息k;if (k) /以学号形式删除学生的信息coutnumb;for (j=0;ji;j+)if (numb=stuj.num)break;else /以姓名形式删除学生的信息coutname0;for (j=0;ji;j+)if (strcmp(name0,stuj.name)=0)break;if (ji)for(; ji-1; j+)stuj.num=stuj+1.num; strcpy(stuj.name,stuj+1.name); stuj.math=stuj+1.math; stuj.english=stuj+1.english; stuj.data
20、base=stuj+1.database; stuj.sum=stuj+1.sum; stuj.average=stuj+1.average;i=i-1;Cscore(i);elsecoutmessage error.endl;void Insert(int &i) /插入学生的信息int j,n;coutinsert begin.endl;coutn;i=i+n;coutPlease input insert message.form:endl;cout学号 姓名 数学 英语 数据库 endl;for (j=i-n; jstuj.numstuj.namestuj.mathstuj.engli
21、shstuj.database; stuj.sum=stuj.math+stuj.english+stuj.database; stuj.average=int(float(stuj.sum)/3.0+0.5);Cscore(i);cout学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 endl;for (j=i-n; ji; j+) coutsetw(1)stuj.numsetw(9)stuj.namesetw(4)stuj.mathsetw(6)stuj.englishsetw(6)stuj.database;coutsetw(8)stuj.sumsetw(7)stuj.aver
22、age;coutsetw(7);coutstuj.score ;Rank(stuj.average);6. 运行结果与分析运行结果:分析: 系统基本上能实现对成绩的查询、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)等功能,并且可以插入多个学生的信息。但在插入学生后未不能成绩单以学号排名的形式输出。为了改进程序对Insert 函数进行了一下修改。Insert 函数代码如下:void Insert(int &i) /插入学生的信息int j,k,n,m,first,last,mid;int num0,math0,english0,database0;char name08;cout
23、insert begin.endl;coutn;m=i+n;first=0;last=i-1;mid=(first+last)/2;coutPlease input insert message.form:endl;cout学号 姓名 数学 英语 数据库 endl;for (j=i; jstuj.numstuj.namestuj.mathstuj.englishstuj.database;while (first=last)if(stuj.numstumid.num)first=mid+1; else break;mid=(first+last)/2;if(firstlast)num0=stu
24、j.num; strcpy(name0,stuj.name); math0=stuj.math; english0=stuj.english; database0=stuj.database;for (k=i-1; kfirst; k-) /进行有序插入stuk.num=stuk-1.num; strcpy(stuk.name,stuk-1.name); stuk.math=stuk-1.math; stuk.english=stuk-1.english; stuk.database=stuk-1.database; stuk.sum=stuk-1.sum; stuk.average=stuk
25、-1.average;stufirst.num=num0; strcpy(stufirst.name,name0); stufirst.math=math0; stufirst.english=english0; stufirst.database=database0; stufirst.sum=stufirst.math+stufirst.english+stufirst.database; stufirst.average=int(float(stufirst.sum)/3.0+0.5);elsecoutmessage error.endl;first=0; last=i-1; mid=(first+last)/2;Cscore(i); 修改后程序经运行后结果如下: 结果发现修改后的程序运用了二分查找法、多重嵌套等,能较好的实现对学生的信息以学号为序进行了多个数据的有序插入。-第 19 页-