#include<iostream>
#include <string>
using namespace std;
class Student{
protected:
string S_num;
string S_name;
public:
static double max;//因为max的值需要在每一次输入数据之后产生变化,在下一次输入之前保持原来的值,但每次输入数据都将调用构造函数(max=0)所以需要使用static。
virtual void display()=0; //虚函数使用;
virtual double average()=0;
Student(string num,string name){
S_num=num;
S_name=name;
}
};
double Student::max=0;//Student::max类成员变量和成员函数在类外使用都用::;
class GroupA : public Student{
protected:
int GA_s1, GA_s2;
public:
GroupA(string num,string name,int s1,int s2):Student(num,name),GA_s1(s1),GA_s2(s2){
if(average()>Student::max){Student::max=average();}
}
//类的构造函数简单使用;
double average(){
return((GA_s1+GA_s2)*1.0/2);
}
void display(){
if(average()==Student::max)
cout<<S_num<<" "<<S_name<<endl;
}
};
class GroupB: public Student{
protected:
int GB_s1,GB_s2,GB_gs;
public:
GroupB(string num,string name,int s1,int s2,char gs):Student(num,name),GB_s1(s1),GB_s2(s2),GB_gs(gs){
if(average()>Student::max){Student::max=average();}
}
double average(){
return((GB_s1+GB_s2)*1.0/2);
}
void display(){
if(average()>=Student::max*0.7 && GB_gs=='A' )
cout<<S_num<<" "<<S_name<<endl;
}
};
class GroupC: public Student{
protected:
int GC_s1,GC_s2,GC_s3,GC_s4,GC_s5;
public:
GroupC(string num,string name,int s1,int s2,int s3,int s4,int s5):Student(num,name),GC_s1(s1),GC_s2(s2),GC_s3(s3),GC_s4(s4),GC_s5(s5){
if(average()>Student::max){Student::max=average();}
}
double average(){
return((GC_s1+GC_s2+GC_s3+GC_s4+GC_s5)*1.0/5);
}
void display(){
if(average()>=Student::max*0.9)
cout<<S_num<<" "<<S_name<<endl;
}
};
int main()
{
const int Size=50;
string num, name;
int i,ty,s1,s2,s3,s4,s5;
char gs;
Student *pS[Size];
int count=0;
for(i=0;i<Size;i++){
cin>>ty;
if(ty==0) break;
cin>>num>>name>>s1>>s2;
//多态的使用;
switch(ty){
case 1:pS[count++]=new GroupA(num, name, s1, s2); break;
case 2:cin>>gs; pS[count++]=new GroupB(num, name, s1,s2, gs); break;
case 3:cin>>s3>>s4>>s5; pS[count++]=new GroupC(num, name, s1,s2,s3,s4,s5); break;
}
}
for(i=0;i<count;i++) {
pS[i]->display();
delete pS[i];
}
system("pause");//代码编辑器;
return 0;
}
//常变量和符号常量区别:常变量(const int a=20)与符号常量(#define a 20)的区别:符号常量不占用内存空间,在预编译时就全部由符号常量的值替换了,而常变量占用内存空间,只是此变量在存在期间不能重新赋值。