0、班级成绩管理
自动化专业12级有4个班,每班现假定有32名同学,本学期有6门课程考试(课程名你知道,我不知道),每门课程成绩是百分制。现规定每个同学的成绩记录包含以下数据,学号、姓名以及各门课程的成绩共8项,其中学号是一个10位的字符串,每个学生都有唯一的学号。完成以下操作要求:
⑴ 编写一个成绩生成函数,使用随机数方法,利用随机函数生成学生的各门课程的成绩(每门课程的成绩都是0∽100之间的整数),通过调用该函数生成全部学生的成绩(因为学生太多,现在不要你输入真实成绩);
⑵ 编写一个平均成绩计算函数,计算每个同学的平均成绩并保存在成绩数组中;
⑶ 对4个班的成绩按每个同学的平均成绩的以从大到小的递增方式进行班内排序;
⑷ 实现对某一个学生全部或某科成绩的查找功能。
⑸ 实现统计分析功能:分班和分课程进行各个分数段(分几段自己定)的统计;
⑹ 实现学生成绩修改功能。
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<iomanip.h>
const int M = 20;
class stucopy
{
public:
char id[20];
char sex[10];
char name[10];
double grade[5];
double sumsum;
double average;
};
class student
{
friend class list;
public:
char id[20];
char sex[10];
char name[10];
double grade[6];
student()
{
next=0;
for (int i=0;i<20;i++) id[i]=0;
for (i=0;i<10;i++) sex[i]=0;
for (i=0;i<10;i++) name[i]=0;
}
void s();
void setid(char id1[20])
{
for(int i=0;i<20;i++)
id[i]=id1[i];
}
void setsex(char sex1[10])
{
for(int i=0;i<10;i++)
sex[i]=sex1[i];
}
void setname(char name1[10])
{
for(int i=0;i<10;i++)
name[i]=name1[i];
}
void setgrade(double grade1[6])
{
for(int i=0;i<6;i++)
grade[i]=grade1[i];
}
student *next;
char * outid(){return id;};
char * outsex(){return sex;};
char * outname(){return name;};
double outsum()
{
double sum=0;
for(int i=0;i<6;i++)
sum+=this->outgrade(i);
return sum;
}
double outav(){return this->outsum()/6;}
double outgrade(int i){return grade[i];};
void intgrade(int);
};
void student::intgrade(int j)
{
switch (j)
{
case 1:
cout<<" 请输入模电成绩:\n";
cin>>grade[0];break;
case 2:
cout<<"请输入数电成绩:\n";
cin>>grade[1];break;
case 3:
cout<<"请输入C++成绩:\n";
cin>>grade[2];break;
case 4:
cout<<"请输入英语成绩:\n";
cin>>grade[3];break;
case 5:
cout<<"请输入毛概成绩:\n";
cin>>grade[4];break;
case 6:
cout<<"请输入体育成绩:\n";
cin>>grade[5];break;
}
}
void student::s()
{
cout<<"请输入学号:\n";
cin>>id;
cout<<"请输入姓名:\n";
cin>>name;
cout<<"请输入性别:\n";
cin>>sex;
cout<<"请输入模电成绩:\n";
cin>>grade[0];
cout<<"请输入数电成绩:\n";
cin>>grade[1];
cout<<"请输入C++成绩:\n";
cin>>grade[2];
cout<<"请输入英语成绩:\n";
cin>>grade[3];
cout<<"请输入毛概成绩:\n";
cin>>grade[4];
cout<<"请输入体育成绩:\n";
cin>>grade[5];
}
class list
{
private:
double high[6],low[6];
public:
student *last,*first;
double totoal;
list(){last=0;first=0;};
~list();
void instu();
void outstu(char *);
int delstu(char *n);
void outstu1(char *);
int delstu1(char *n);
void outsum(char *);
void outsum1(char *);
void think();
void search(char s[10],int);
void search1(char s[20],int);
double hi(int i);
double lo(int i);
void av(int i);
void ev(int i);
void scanall();
};
list::~list()
{
if(first!=0)
{
student *p=first,*temp;
while(p!=NULL){
temp=p;
p=p->next;
delete temp;
cout<<"ok\n";
}}}
void list::instu()
{ student *p=new student();
p->s();
if(first==0){first=last=p;}else{last->next=p;last=p;}
}
void list::outstu(char *n)
{
if(first==0) {cout<<"班级无成员!查无此人!"<<endl;return;}
student *temp=first;for(;temp!=NULL;temp=temp->next)
if(strcmp(temp->outname(),n)==0)
{
cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(6)<<"性别"<<setw(6)<<"模电"<<setw(6)
<<"数电"<<setw(6)<<"C++"<<setw(14)<<"英语"<<setw(6)<<"毛概"<<setw(6)<<"体育"<<endl;
cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(6)<<temp->outsex()<<setw(6)
<<temp->outgrade(0)<<setw(6)<<temp->outgrade(1)<<setw(6)<<temp->outgrade(2)<<setw(14)
<<temp->outgrade(3)<<setw(6)<<temp->outgrade(4)<<setw(6)<<temp->outgrade(5);return;}
cout<<"查无此人!"<<endl;
return;
}
void list::outstu1(char *n)
{
if(first==0) {cout<<"班级无成员!查无此人!"<<endl;return;}
student *temp=first;for(;temp!=NULL;temp=temp->next)
if(strcmp(temp->outid(),n)==0)
{
cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(6)<<"性别"<<setw(6)<<"模电"<<setw(6)
<<"数电"<<setw(6)<<"C++"<<setw(14)<<"英语"<<setw(6)<<"毛概"<<setw(6)<<"体育"<<endl;
cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(6)<<temp->outsex()<<setw(6)
<<temp->outgrade(0)<<setw(6)<<temp->outgrade(1)<<setw(6)<<temp->outgrade(2)<<setw(14)
<<temp->outgrade(3)<<setw(6)<<temp->outgrade(4)<<setw(6)<<temp->outgrade(5);return;}
cout<<"查无此人!"<<endl;
return;
}
int list::delstu(char *n)
{
if(first==0) {cout<<"无数据!"<<endl;return 0;}
student *temp=first;
student *p;
if(strcmp(first->outname(),n)==0)
{ first=first->next;delete temp;
cout<<"\n删除成功\n";return 0;}
else for(;temp->next!=NULL;temp=temp->next)
{if(strcmp(temp->next->outname(),n)==0)
{p=temp->next;temp->next=temp->next->next;delete p;
cout<<"\n删除成功\n";return 0;}}
cout<<"\n查无此人,删除失败\n";
return 0;
}
int list::delstu1(char *n)
{
if(first==0) {cout<<"无数据!"<<endl;return 0;}
student *temp=first;
student *p;
if(strcmp(first->outid(),n)==0)
{ first=first->next;delete temp;
cout<<"\n删除成功\n";return 0;}
else while(temp->next!=NULL)
{if(strcmp(temp->next->outid(),n)==0)
{p=temp->next;temp->next=temp->next->next;delete p;
cout<<"\n删除成功\n";return 0;}
else temp=temp->next;}
cout<<"\n查无此人,删除失败\n";
return 0;
}
void list::think()
{
if(first==0) {cout<<"无数据!"<<endl;return;}
int i=0;
student *p=first;
while (p!=NULL)
{
p=p->next;
i++;
}
totoal=i;
cout<<"人数:"<<i<<endl;
cout<<"模电\n";
cout<<"最高分:"<<hi(0)<<" "<<"最低分:"<<lo(0)<<" "<<"平均分:";
av(0);
ev(0);
cout<<"数电\n";
cout<<"最高分:"<<hi(1)<<" "<<"最低分:"<<lo(1)<<" "<<"平均分:";
av(1);
ev(1);
cout<<"C++\n";
cout<<"最高分:"<<hi(2)<<" "<<"最低分:"<<lo(2)<<" "<<"平均分:";
av(2);
ev(2);
cout<<"英语\n";
cout<<"最高分:"<<hi(3)<<" "<<"最低分:"<<lo(3)<<" "<<"平均分:";
av(3);
ev(3);
cout<<"毛概\n";
cout<<"最高分:"<<hi(4)<<" "<<"最低分:"<<lo(4)<<" "<<"平均分:";
av(4);
ev(4);
cout<<"体育\n";
cout<<"最高分:"<<hi(4)<<" "<<"最低分:"<<lo(4)<<" "<<"平均分:";
av(5);
ev(5);
}
double list::hi(int i)
{
high[i]=0.00;
student *temp=first;
while(temp!=0)
{if(temp->outgrade(i)>high[i])
high[i]=temp->outgrade(i);
temp=temp->next;
}
return high[i];
}
double list::lo(int i)
{
low[i]=100;
student *temp=first;while(temp!=0)
{if(temp->outgrade(i)<low[i])
low[i]=temp->outgrade(i);
temp=temp->next;
}
return low[i];
}
void list::av(int i)
{
double aver=0;
student *temp=first;
while(temp!=NULL)
{
aver+=temp->outgrade(i);
temp=temp->next;
}
cout<<aver/totoal<<endl;
}
void list::ev(int i)
{ int a=0,b=0,c=0,d=0,e=0,f=0;
student *temp=first;while(temp!=0)
{switch((int)temp->outgrade(i)/10)
{
case 10:a++;break;case 9:a++;break;
case 8:b++;break;case 7:c++;break;
case 6:d++;break;case 5:e++;break;
default:f++;
}
temp=temp->next;
}
cout<<"100-90的人数:"<<a<<" 89-80的人数:"<<b<<" 79-70的人数:"<<c
<<" 69-60的人数:"<<d<<" 59-50的人数:"<<e<<" 50以下的人数:"<<f
<<" 及格的人数:"<<(a+b+c+d)<<" 不及格的人数:"<<(e+f)<<endl;
}
void list::search(char s[10],int n)
{
student *temp=first;for(;temp!=NULL;temp=temp->next)
if(strcmp(temp->outname(),s)==0)temp->intgrade(n);
}
void list::search1(char s[20],int n)
{
student *temp=first;for(;temp!=NULL;temp=temp->next)
if(strcmp(temp->outid(),s)==0)temp->intgrade(n);
}
void list::outsum(char *n)
{
if(first==0) {cout<<"无数据!"<<endl;return;}
student *temp=first;for(;temp!=NULL;temp=temp->next)
if(strcmp(temp->outname(),n)==0)
{
cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"性别"<<setw(8)<<"总成绩"<<
setw(10)<<"平均成绩"<<"\n";
cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(8)
<<temp->outsex()<<setw(8)<<temp->outsum()<<setw(10)<<temp->outav();
return;
}
cout<<"查无此人!"<<endl;
return;
}
void list::outsum1(char *n)
{
double sum=0;
int i=0;
double av=0;
if(first==0) {cout<<"无数据!"<<endl;return;}
student *temp=first;for(;temp!=NULL;temp=temp->next)
if(strcmp(temp->outid(),n)==0)
{
cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"性别"<<setw(8)<<"总成绩"<<
setw(10)<<"平均成绩"<<"\n";
cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(8)
<<temp->outsex()<<setw(8)<<temp->outsum()<<setw(10)<<temp->outav();
return;
}
cout<<"查无此人!"<<endl;
return;
}
void list::scanall()
{
student *temp;
for(temp = first;temp!=NULL;temp=temp->next)
cout<<setw(8)<<temp->outid()<<setw(8)<<temp->outname()<<setw(6)
<<temp->outsex()<<setw(6)<<temp->outgrade(0)<<setw(6)<<temp->outgrade(1)
<<setw(6)<<temp->outgrade(2)<<setw(14)<<temp->outgrade(3)<<setw(6)
<<temp->outgrade(4)<<setw(6)<<temp->outgrade(5)<<setw(8)<<temp->outsum()<<setw(10)<<temp->outav()<<endl;
}
void main()
{
stucopy stu[M];
stucopy stutemp;
list will;
student *p, *p1=new student(),*q;
ifstream input;
ofstream output;
char file[20],classname[20],temp[80],id[20],name[9],sex1[10];
int m=0,n=0,j=0,i=0;
double grade1[5];
for(i=0;i<20;i++) id[i]=0;
for(i=0;i<9;i++) name[i]=0;
do{
cout<<"**********************************************************"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"******* **********"<<endl;
cout<<"******* 欢迎使用自动化班级成绩管理系统 **********"<<endl;
cout<<"******* **********"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"**********************************************************"<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"******************请选择您需要的操作********************* "<<endl;
cout<<"************************【操作】**************************"<<endl;
cout<<"[0]退出系统"<<endl;
cout<<"[1]录入成绩"<<endl;
cout<<"[2]查询成绩"<<endl;
cout<<"[3]修改成绩"<<endl;
cout<<"[4]删除数据"<<endl;
cout<<"[5]统计与分析成绩"<<endl;
cout<<"[6]按姓名查询"<<endl;
cout<<"[7]输出所有学生的数据"<<endl;
cout<<"[8]各科不及格人数"<<endl;
cout<<"[9]按总分查询排名"<<endl;
cout<<"[10]按学号顺序输出学生信息,并可保存成文件"<<endl;
cout<<"选择相关操作请输入[0]-[10]选项"<<endl;
cin>>m;
switch(m)
{
case 1:
will.instu();
break;
case 2:
cout<<"1.根据学号查询 2.根据姓名查询"<<endl<<"请输入:";
cin>>n;
switch(n){
case 1:
cout<<"请输入学号\n";
cin>>id;
will.outstu1(id);
cout<<"\n";break;
case 2:
cout<<"请输入姓名\n";
cin>>name;
will.outstu(name);
cout<<"\n";break;}break;
case 3:
cout<<"1.根据学号查询 2.根据姓名查询"<<endl<<"请输入:";
cin>>n;
switch(n){
case 1:
cout<<"请输入学号\n";
cin>>id;
will.outstu1(id);
cout<<"\n";
cout<<setw(6)<<"1.模电"<<
setw(6)<<"2.数电"<<setw(6)<<"3.C++ "<<
setw(14)<<"4.英语"<<setw(6)<<"5.毛概"<<setw(6)<<"6.体育"<<endl;
cout<<"请输入要修改的课程编号:";
cin>>j;
will.search1(id,j);break;
case 2:
cout<<"请输入姓名\n";
cin>>name;
will.outstu(name);
cout<<"\n";
cout<<setw(6)<<"1.模电"<<
setw(6)<<"2.数电"<<setw(6)<<"3.C++ "<<
setw(14)<<"4.英语"<<setw(6)<<"5.毛概"<<setw(6)<<"6.体育"<<endl;
cout<<"请输入课程编号:";
cin>>j;
will.search(name,j);break;}break;
case 4:
cout<<"1.根据学号删除 2.根据姓名删除"<<endl<<"请输入:";
cin>>n;
switch(n){
case 1:
cout<<"请输入学号\n";
cin>>id;
will.outstu1(id);
will.delstu1(id);break;
case 2:
cout<<"请输入姓名\n";
cin>>name;
will.outstu(name);
will.delstu(name);break;}break;
case 5:
will.think();
break;
case 6:
cout<<"1.根据学号查询 2.根据姓名查询"<<endl<<"请输入:";
cin>>n;
switch(n){
case 1:
cout<<"请输入学号\n";
cin>>id;
will.outsum1(id);break;
case 2:
cout<<"请输入姓名\n";
cin>>name;
will.outsum(name);break;}break;
case 7:
cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(6)<<"性别"<<setw(6)<<"模电"<<
setw(6)<<"数电"<<setw(6)<<"C++"<<
setw(14)<<"英语"<<setw(6)<<"毛概"<<setw(6)<<"体育"<<setw(8)<<"总成绩"<<
setw(10)<<"平均成绩"<<"\n";
will.scanall();
break;
case 8:
cout<<"请输入文件名:"<<endl;
cin>>file;
input.open(file);
if (input.fail())
{
cout<<"File does not exist"<<endl;
break;
}
input.getline(temp,80);
input.getline(temp,80);
if(input.eof()) {cout<<"文件中无数据!"<<endl;break;}
input>>id>>name>>sex1>>grade1[0]>>grade1[1]>>grade1[2]>>
grade1[3]>>grade1[4];
input>>temp;
input>>temp;
p1->setid(id);
p1->setname(name);
p1->setsex(sex1);
p1->setgrade(grade1);
will.first=p1;
will.last=will.first;
while(!input.eof())
{
p=new student();
q=will.last;
will.last->next=p;
will.last=p;
input>>id>>name>>sex1>>grade1[0]>>grade1[1]>>grade1[2]>>
grade1[3]>>grade1[4];
will.last->setid(id);
will.last->setname(name);
will.last->setsex(sex1);
will.last->setgrade(grade1);
input>>temp;
input>>temp;
}
will.last=q;
will.last->next=NULL;
input.close();break;
case 9:
p=will.first;
for(i=0;i<20&&p!=NULL;i++,p=p->next)
{
for (j=0;j<20;j++)
{
stu[i].id[j]=p->id[j];
}
for (j=0;j<10;j++)
{
stu[i].name[j]=p->name[j];
}
for (j=0;j<10;j++)
{
stu[i].sex[j]=p->sex[j];
}
stu[i].sumsum=p->outsum();
stu[i].average=p->outav();
}
for(n=0;n<i-1;n++)
for(j=1;j<i;j++)
{
if (stu[n].sumsum<stu[j].sumsum)
{
stutemp=stu[j];
stu[j]=stu[n];
stu[n]=stutemp;
}
}
cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(6)<<"性别"<<setw(8)<<"总成绩"<<
setw(10)<<"平均成绩"<<"\n";
for (j=0;j<i;j++)
cout<<setw(8)<<stu[j].id<<setw(8)<<stu[j].name<<setw(6)
<<stu[j].sex<<setw(8)<<stu[j].sumsum<<setw(10)<<stu[j].average<<endl;break;
case 11:
p=will.first;
for(i=0;i<20&&p!=NULL;i++,p=p->next)
{
for (j=0;j<20;j++)
{
stu[i].id[j]=p->id[j];
}
for (j=0;j<10;j++)
{
stu[i].name[j]=p->name[j];
}
for (j=0;j<10;j++)
{
stu[i].sex[j]=p->sex[j];
}
stu[i].sumsum=p->outsum();
stu[i].average=p->outav();
for(j=0;j<5;j++)
stu[i].grade[j]=p->grade[j];
}
for(n=0;n<i-1;n++)
for(j=1;j<i;j++)
{
if (stu[n].id>stu[j].id)
{
stutemp=stu[j];
stu[j]=stu[n];
stu[n]=stutemp;
}
}
cout<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(6)<<"性别"<<setw(6)<<"模电"
<<setw(6)<<"数电"<<setw(6)<<"C++"<<setw(14)<<"英语"<<setw(6)
<<"毛概"<<setw(6)<<"体育"<<setw(8)<<"总成绩"<<setw(10)<<"平均成绩"<<endl;
for (j=0;j<i;j++)
cout<<setw(8)<<stu[j].id<<setw(8)<<stu[j].name<<setw(6)<<stu[j].sex<<setw(6)
<<stu[j].grade[0]<<setw(6)<<stu[j].grade[1]<<setw(6)<<stu[j].grade[2]<<setw(14)
<<stu[j].grade[3]<<setw(6)<<stu[j].grade[4]<<setw(6)<<stu[j].grade[5]<<setw(8)<<stu[j].sumsum<<setw(10)
<<stu[j].average<<endl;
cout<<"\n 输入1.将上述信息保存成文件; 输入0:返回"<<endl;
cin>>m;
if (m==1)
{
cout<<"请输入文件名:"<<endl;
cin>>file;
cout<<"请输入班级名称:"<<endl;
cin>>classname;
output.open(file);
output<<classname<<"成绩单"<<endl<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(6)<<"性别"<<setw(6)<<"数学"<<
setw(6)<<"英语"<<setw(6)<<"政治"<<
setw(14)<<"程序设计基础"<<setw(6)<<"物理"<<setw(8)<<"总成绩"<<
setw(10)<<"平均成绩"<<endl;
for(j=0;j<i;j++)
output<<setw(8)<<stu[j].id<<setw(8)<<stu[j].name<<setw(6)<<stu[j].sex<<setw(6)
<<stu[j].grade[0]<<setw(6)<<stu[j].grade[1]<<setw(6)<<stu[j].grade[2]<<setw(14)
<<stu[j].grade[3]<<setw(6)<<stu[j].grade[4]<<setw(8)<<stu[j].sumsum<<setw(10)
<<stu[j].average<<endl;
output.close();
}break;
}
cout<<"\n 输入1: 继续; 输入0: 退出\n";
cin>>m;
}while(m==1);
}