#include<bits/stdc++.h>
using namespace std;
class Student //数据类;
{
string name;
int no;
int score[3];
float average;
int order;
public:
Student(int id,string na,int x,int y,int z):name(na),no(id)
{
score[0]=x, score[1]=y, score[2]=z;
order=-1,average=((score[0]+score[2]+score[1])/3);
}
Student()
{
score[0]=score[1]=score[2]=0;
order=-1,average=0;
}
void setName(string name) {this->name=name;}
string getName() {return name;}
int setN0(int n) {no=n;}
int getNO() { return no;}
int setscore0(int i)
{
score[0]=i;
average=((score[0]+score[2]+score[1])/3);
}
int setscore1(int j)
{
score[1]=j;
average=((score[0]+score[2]+score[1])/3);
}
int setscore2(int k)
{
score[2]=k;
average=((score[0]+score[2]+score[1])/3);
}
int getscore0() {return score[0];}
int getscore1() {return score[1];}
int getscore2() {return score[2];}
float getAverage() {return average;}
void setAverage(int avg) {average=avg;}
void setOrder(int x) {order=x;}
int getOrder() {return order;}
void display();
};
void Student::display()
{
cout<<name<<"\t"<<no<<'\t'<<score[0]<<"\t"<<score[1]<<"\t"<<score[2]<<"\t";
cout<<average<<"\t\t"<<order<<endl;
}
bool cmp1(Student stu1,Student stu2 ) //按照平均成绩降序排列;
{
if((stu1.getAverage()-stu2.getAverage())>=1e-9)
return 1;
else
return 0;
}
bool cmp2(Student stu1,Student stu2)
{
return stu1.getNO()<stu2.getNO(); //按照学号升序排列;
}
class Operation //定义操作类;
{
Student list[90]; //学生类对象数组;
int n; //实际学生人数;
public:
Operation() {n=0;} //或者也可写为Operation():n(0) {};
void add(); //增加学生信息;
void deletestu(); //删除学生信息;
void query(); //查询
void change(); //修改
int search(int no); //按照学号查找
void sortlist(); //排序;
void display(int flag);
};
void Operation::add()
{
int no,x,y,z;
string name;
system("cls"); //清屏;
cout<<"按学号、姓名、数学、英语、c++顺序输入学生信息,学号按-1表示结束"<<endl;
while ((cin>>no)&&no!=-1)
{
cin>>name>>x>>y>>z;
Student s(no,name,x,y,z);
list[n++]=s; //将创建的每一条学生信息存到数组里;
sortlist();
}
}
void Operation::sortlist() //对改变的成绩表进行名次更新,所以成绩与名次绑定;
{
sort(list,list+n,cmp1); //按照成绩排序;
for(int i=0;i<n;i++)
list[i].setOrder(i+1); //设置名次;(i+1)即第一名的名次为1,i从0开始;
}
void Operation::display(int flag) //展示结果可以按名次排列也可以按学号排列;
{
if(flag) sort(list,list+n,cmp2); //flag=1;按学号排列;
else sort(list,list+n,cmp1); //flag=0;按名次排列;
cout<<"姓名"<<"\t"<<"学号"<<"\t"<<"数学"<<"\t";
cout<<"英语"<<'\t'<<"c++"<<"\t"<<"平均成绩"<<"\t"<<"名次"<<endl;
for(int i=0;i<n;i++)
list[i].display();
}
int Operation::search(int no) //按照学号查找;
{
int i;
for(i=0;i<n;i++)
if(list[i].getNO()==no)
return i; //找到就返回在成绩表中的位置;
return -1; //否则返回-1;
}
void Operation::change() //按学号进行修改操作,并输出查找的结果;
{
int no,a,b,c,f,i;
//system("cls");
cout<<"请输入要修改信息的同学的学号,输入-1结束修改";
while(cin>>no&&no!=-1)
{
i=search(no);
if(i!=-1)
{
cout<<"请输入所要修改的科目信息,输入-1结束修改"<<endl;
cin>>f;
if(f==0)
{
cin>>a;
list[i].setscore0(a);
sortlist();
}
if(f==1)
{
cin>>b;
list[i].setscore1(b);
sortlist();
}
if(f==2)
{
cin>>c;
list[i].setscore2(c);
sortlist();
}
cout<<"姓名"<<"\t"<<"学号"<<"\t"<<"数学"<<"\t";
cout<<"英语"<<'\t'<<"c++"<<"\t"<<"平均成绩"<<"\t"<<"名次"<<endl;
list[i].display();
cout<<"请输入要修改信息同学的学号,按-1结束查询:";
}
else
cout<<"学号输入有误,请重输,输入-1结束查询"<<endl;
}
}
int main()
{
Operation c;
c.add();
c.display(0);
c.change();
}
编译结果:
按学号、姓名、数学、英语、c++顺序输入学生信息,学号按-1表示结束
1111 ming 10 20 30
1112 xing 20 30 40
1113 tian 30 40 50
-1 //键盘输入;
姓名 学号 数学 英语 c++ 平均成绩 名次
tian 1113 30 40 50 40 1
xing 1112 20 30 40 30 2
ming 1111 10 20 30 20 3 //c.display(0);
请输入要修改信息的同学的学号,输入-1结束修改1111
请输入所要修改的科目信息,输入-1结束修改
0
20
姓名 学号 数学 英语 c++ 平均成绩 名次
ming 1111 20 20 30 23 3
请输入要修改信息同学的学号,按-1结束查询:-1
Process returned 0 (0x0) execution time : 56.716 s
Press any key to continue.