#include<bits/stdc++.h>
using namespace std;
class Student //数据类;
{ //私有成员放在第一段,可以省略关键字private
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;}
int getOrder() {return order;}
void setOrder(int x) {order=x;}
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();
/* for(int i=0;i<n;i++)
list[i].display(); 调试语句,对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 main()
{
Operation c;
c.add();
c.display(1); //或者c.display(0);
}
(1). sortlist语句功能调试结果:
按学号、姓名、数学、英语、c++顺序输入学生信息,学号按-1表示结束
1111 ming 40 50 60 //输入
ming 1111 40 50 60 50 1
1122 xing 30 50 60 //输入
ming 1111 40 50 60 50 1
xing 1122 30 50 60 46 2
1100 chen 50 60 70 //输入
chen 1100 50 60 70 60 1
ming 1111 40 50 60 50 2
xing 1122 30 50 60 46 3
即每输入一条学生信息就对所有学生按照平均成绩进行名次排序;
注意:/*for(int i=0;i<n;i++)
list[i].display(); */ 此条调试语句可能对整个程序在功能上没有多大用处,但是在调试时要保证每条语句的正确性,所以要注意调试。
(2)c.display(1)的编译结果: //按照学号排序;
按学号、姓名、数学、英语、c++顺序输入学生信息,学号按-1表示结束
1111 ming 50 60 70
1112 xing 40 50 60
1110 chen 60 70 80
1109 han 30 40 50
-1 //输入;
姓名 学号 数学 英语 c++ 平均成绩 名次
han 1109 30 40 50 40 4
chen 1110 60 70 80 70 1
ming 1111 50 60 70 60 2
xing 1112 40 50 60 50 3
(3)c.display(0)的编译结果: //按照名次排序;
按学号、姓名、数学、英语、c++顺序输入学生信息,学号按-1表示结束
1111 ming 50 60 70
1112 xing 40 50 60
1110 chen 60 70 80
1109 han 30 40 50
-1 //输入;
姓名 学号 数学 英语 c++ 平均成绩 名次
chen 1110 60 70 80 70 1
ming 1111 50 60 70 60 2
xing 1112 40 50 60 50 3
han 1109 30 40 50 40 4