学生信息系统操作类add功能详解

#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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值