项目设计题目(学生成绩管理系统)学号:姓名:自评成绩:成绩:1.选题意义、依据学生成绩系统的设计从学生的应用中而来,学生了解该系统的组成和运行过程,它贴近学生的生活能使学生更加方便的使用各个语句、函数、结构体等。
依据学生期末成绩表的格式。
2.系统功能设计与分析(功能模块说明)系统主要用于从一个文件夹读入学生信息(101 张三85 78 87102 李斯57 59 60103 王红84 79 87104 赵子龙72 75 76105 李洪磊88 98 89),包括学生学号、姓名、成绩(数学、英语、数据库),程序中引用了八个函数void 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); 系统主要实现的功能有:查询、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)。
Cscore 函数主要是对学生进行排名。
具有相同总分的学生具有相同的名次,例如:第三名和第四名具有相同的总分则在表中不会出现第四名,将出现两个第三名紧接着出现第五名学生的情况。
Rank 函数主要用于按平均分对学生进行备注。
把学生分为四个等级:>90分为excellent,80—90分为medium,60—80分为qualified,<60分为disqualified。
Listnumber 函数主要用于把学生的信息(学号姓名数学英语数据库总分平均分名次备注)以学号排名的顺序用表的形式输出,方便学生查看。
Listnumber 函数中还调用了Cscore 和Rank 函数。
Listscore 函数是把学生的信息以总成绩排名的形式输出。
Lookup 函数主要运用学号或姓名形式查询单个学生信息,如果存在则输出该学生信息(学号姓名数学英语数据库总分平均分名次备注),否则输出“Input message is error.”。
Alter 函数是修改指定学号的学生信息。
主要用于修改指定学号学生的各科成绩并输出修改后的学生信息(学号姓名数学英语数据库总分平均分名次备注)。
Delete 函数用于删除指定学生的信息。
可用两种方式删除:以学号形式删除学生信息,以姓名形式删除学生信息。
若要删除了学生不存在则输出“messageerror.”。
Insert 函数用来插入学生的信息,一次调用Insert 函数可以添加多个学生的信息。
Insert 函数中还调用了Cscore 和Rank 函数。
3.涉及的主要知识点说明(1)系统主要运用了函数的声明、定义、调用(值调用和地址调用)。
(2)对文件的读入操作。
(3)在平均分的求取上采用四舍五入的方式,运用了类型转换。
(4)多次运用if和for嵌套,在for嵌套中又运用了break语句。
(5)运用了switch。
(6)对字符数组的比较中运用了strcmp,还运用toupper把小写字母转换成大写。
(7)对学生信息进行的插入和有序删除操作。
(8)运用iomanip对输出进行美观。
4.创新性说明(怎么解决)创新性:系统可以对具有相同总分学生的学生输出相同的名次。
若存在三个相同的分数都为第二名,则在输出时出现三个第二名不会出现第三、四名,紧接着出现第五名。
解决方法:(1)用一个数组记录具有相同分数的人数,数组下标和学生信息所具有的下标相同;(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 place.//******************************************************************#include<iostream>#include<string>#include<cctype>#include<cstring>#include<iomanip>#include<fstream>void 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 name[8];int math;int english;int database;int sum;int average;int score;}stu[MAX];int main() //主函数{int i,k;char ch;string filename;ifstream infile;cout<<"Please input the filenames: ";cin>>filename;infile.open(filename.c_str());if (!infile){cout<<"Can't open the input file."<<endl;return 1;}for (i=0; i<MAX && infile; i++){infile>>stu[i].num>>stu[i].name>>stu[i].math>>stu[i].english>>stu[i].database;stu[i].sum=stu[i].math+stu[i].english+stu[i].database;stu[i].average=int(float(stu[i].sum)/3+0.5);}i=i-1;cout<<endl<<"Welcome to 学生成绩管理系统"<<endl;cout<<"Y or N 进入菜单栏"<<endl;cin>>ch;ch=toupper(ch);while (ch=='Y'){cout<<endl<<" 菜单:"<<endl<<" 1)查询"<<endl<<" 2)修改"<<endl<<" 3)删除"<<endl<<" 4)插入"<<endl<<" 5)成绩单(以学号排名)"<<endl<<" 6)成绩单(以名次排名)"<<endl;cout<<"***请选择1--4 中任何一个:"<<endl;cin>>k;cout<<endl;switch (k){case 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 :cout<<"error input!"<<endl;}cout<<endl<<"继续选择Y or N ?"<<endl;cin>>ch;ch=toupper(ch);}cout<<"Thank you for using!"<<endl<<"Bye bye !"<<endl;infile.close();return 0;} //end mainvoid Cscore(int i) //对学生分数进行排名{int h[MAX],b[MAX],score[MAX+1],n,k,j;int sum0[MAX],s;n=i;for (j=0; j<i; j++){sum0[j]=stu[j].sum;}for (j=0; j<i; j++){h[j]=0;for (k=0; k<i; k++){if (sum0[j]==sum0[k]){h[j]++; //具有同一分数的人数}} //end for} //end forfor (j=0; j<i; j++) //删除多个同一分数只保留其中一个分数{for(k=j+1; k<i; k++){if(sum0[j]==sum0[k]){sum0[k]=sum0[i-1];i--;k--;}}} //end forfor (j=0; j<i; j++) //按从高到底的顺序对总分进行排名{for (k=j+1; k<i; k++){if (sum0[j]<sum0[k]){s=sum0[j];sum0[j]=sum0[k];sum0[k]=s;} //end if} //end for} //end forb[0]=0;score[0]=1;for (j=0; j<i; j++) //对学生成绩进行排名{for(k=0; k<n; k++){if(sum0[j]==stu[k].sum){score[j+1]=score[j]+b[j];stu[k].score=score[j+1];b[j+1]=h[k];} //end if} //end for} //end for}void Rank(int ave) //对学生等级输出{if(ave>=90){cout<<"excellent";}else if (ave>=80){cout<<"medium";}else if (ave>=60){cout<<"qualified";}else{cout<<"disqualified";}cout<<endl;}void Listnumber(int i){int j;Cscore(i);cout<<"学号姓名数学英语数据库总分平均分名次备注"<<endl;for (j=0; j<i; j++){cout<<setw(1)<<stu[j].num<<setw(9)<<stu[j].name<<setw(4)<<stu[j].math<<setw(6) <<stu[j].english<<setw(6)<<stu[j].database;cout<<setw(8)<<stu[j].sum<<setw(7)<<stu[j].average;cout<<setw(7);cout<<stu[j].score<<" ";Rank(stu[j].average);}}void Listscore(int i){int j,k;Cscore(i);cout<<"学号姓名数学英语数据库总分平均分名次备注"<<endl;for (j=1; j<i+1; j++){for (k=0; k<i; k++){if(stu[k].score==j){cout<<setw(1)<<stu[k].num<<setw(9)<<stu[k].name<<setw(4)<<stu[k].math<<setw(6)<<stu[k].english<<setw(6)<<stu[k].database;cout<<setw(8)<<stu[k].sum<<setw(7)<<stu[k].average;cout<<setw(7);cout<<stu[k].score<<" ";Rank(stu[k].average);}}}}void Lookup(int i) //运用学号或姓名形式查询单个学生信息{int j,k,n,numb;char name1[8];cout<<"Please select you check score ways."<<endl;cout<<"1 is use number,0 is use name."<<endl;cin>>n;if (n) //以学号形式查询学生信息{cout<<"Please input student number: ";cin>>numb;for (j=0;j<i;j++){if (numb==stu[j].num){k=j;break;}}}else //以姓名形式查询学生信息{cout<<"Please input student name: ";cin>>name1;for (j=0;j<i;j++)if (strcmp(stu[j].name,name1)==0){k=j;break;}}if (k==MAX){cout<<"Input message is error."<<endl;}else //如果学生存在则输出学生信息{Cscore(i);cout<<"学号姓名数学英语数据库总分平均分名次备注"<<endl;cout<<setw(1)<<stu[j].num<<setw(9)<<stu[j].name<<setw(4)<<stu[j].math<<setw(6) <<stu[j].english<<setw(6)<<stu[j].database;cout<<setw(8)<<stu[j].sum<<setw(7)<<stu[j].average;cout<<setw(7);cout<<stu[j].score<<" ";Rank(stu[j].average);}}void Alter(int i) //修改指定学号的学生信息{int numb,j;cout<<"alter begin..."<<endl;cout<<"Please input number:";cin>>numb;for (j=0;j<i;j++){if (numb==stu[j].num){cout<<"find out:"<<endl;cout<<"学号:"<<stu[j].num<<" 姓名:"<<stu[j].name<<endl;cout<<"Please input new result: 数学英语数据库"<<endl;cin>>stu[j].math>>stu[j].english>>stu[j].database;stu[j].sum=stu[j].math+stu[j].english+stu[j].database;stu[j].average=int(float(stu[j].sum)/3.0+0.5);Cscore(i);//输出修改后该学号学生的信息cout<<"学号姓名数学英语数据库总分平均分名次备注"<<endl;cout<<setw(1)<<stu[j].num<<setw(9)<<stu[j].name<<setw(4)<<stu[j].math<<setw(6) <<stu[j].english<<setw(6)<<stu[j].database;cout<<setw(8)<<stu[j].sum<<setw(7)<<stu[j].average;cout<<setw(7);cout<<stu[j].score<<" ";Rank(stu[j].average);break;}}}void Dele(int &i) //删除指定学生的信息{int numb,j,k;char name0[8];cout<<"delete begin..."<<endl;cout<<"Please select:"<<endl;cout<<" [1]以学号形式删除学生信息"<<endl;cout<<" [0]以姓名形式删除学生信息"<<endl;cin>>k;if (k) //以学号形式删除学生的信息{cout<<"Please input delete number:";cin>>numb;for (j=0;j<i;j++){if (numb==stu[j].num)break;}}else //以姓名形式删除学生的信息{cout<<"Please input delete name:";cin>>name0;for (j=0;j<i;j++){if (strcmp(name0,stu[j].name)==0)break;}}if (j<i){for(; j<i-1; j++){stu[j].num=stu[j+1].num;strcpy(stu[j].name,stu[j+1].name);stu[j].math=stu[j+1].math;stu[j].english=stu[j+1].english;stu[j].database=stu[j+1].database;stu[j].sum=stu[j+1].sum;stu[j].average=stu[j+1].average;}i=i-1;C score(i);}elsecout<<"message error."<<endl;}void Insert(int &i) //插入学生的信息{int j,n;cout<<"insert begin..."<<endl;cout<<"Please input insert number of people:";cin>>n;i=i+n;cout<<"Please input insert message.form:"<<endl;cout<<"学号姓名数学英语数据库"<<endl;for (j=i-n; j<i; j++){cin>>stu[j].num>>stu[j].name>>stu[j].math>>stu[j].english>>stu[j].database;stu[j].sum=stu[j].math+stu[j].english+stu[j].d atabase;s tu[j].average=int(float(stu[j].sum)/3.0+0.5);}Cscore(i);cout<<"学号姓名数学英语数据库总分平均分名次备注"<<endl;for (j=i-n; j<i; j++){cout<<setw(1)<<stu[j].num<<setw(9)<<stu[j].name<<setw(4)<<stu[j].math<<setw(6) <<stu[j].english<<setw(6)<<stu[j].database;cout<<setw(8)<<stu[j].sum<<setw(7)<<stu[j].average;cout<<setw(7);cout<<stu[j].score<<" ";Rank(stu[j].average);}}6.运行结果与分析运行结果:分析:系统基本上能实现对成绩的查询、、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)等功能,并且可以插入多个学生的信息。