结构体

来源:互联网 发布:刘强东脸盲 知乎 编辑:程序博客网 时间:2024/06/05 07:00

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

  任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:

  7279

  5279

  这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:

  5279

  7279

  则按输出错误处理,不能得分。 

       本题给了每个学生3门课的成绩:语文、数学、英语。而我们要对所有学生排序:排序是先后顺序是总分,语文和学号。所以,每个学生有5个关键数据项:语文,数学,英语,总分和学号。排序的关键属性有3个:总分,语文和学号。所以,我们尝试用结构体来定义一个类型包含这3个数据项。



#include<iostream>

#include <algorithm>

using namespace std;

struct student   //定义类型,分别是总分,语文和学号

{

    intscore;

       intchinese;

    intid;   

};

student stu[310];

int n,chinese,math,english;

void init() //读入数据

{

   cin>>n;

    for(int i=1;i<=n;i++)  //读入三门课成绩,并分别记录语文,学号和总分。

    {

       cin>>chinese>>math>>english;

       stu[i].chinese=chinese;

       stu[i].id=i;

       stu[i].score=chinese+math+english;

    }

}

void mysort() //冒泡排序。

{

       for(int i=1;i<n;i++)

       {

     boolflag=1;   //这个是冒泡排序的一个优化。

     for(int j=1;j<=n-i;j++) //仔细理解 这个长关系表达式。

       if(  (stu[j].score<stu[j+1].score)  ||

                  ( (stu[j].score==stu[j+1].score)&& (stu[j].chinese<stu[j+1].chinese) )  ||

          ((stu[j].score==stu[j+1].score) && (stu[j].chinese==stu[j+1].chinese)&& (stu[j].id>stu[j+1].id) ) )

       {

                      flag=0; //标记交换。

                      swap(stu[j],stu[j+1]);   //进行交换

          }

     if(flag) break;   //如果没有交换,表明已经有序了。直接退出。

       }  

}

void print()

{

    for (inti=1;i<=5;i++)  //输出前5个。

     cout<<stu[i].id<<' '<<stu[i].score<<endl; 

}

int main()

{     

    init();

       mysort();

       print();

    return0;

}

       这种排序有一个名称,叫多关键字排序。因为决定顺序的不止一个数据项,每一个相关的数据项叫关键字,等级最高的叫第一关键字,其次叫第二关键字,依次类推。

       像上题中,总分score是第一关键字,语文chinese是第二关键字,学号id是第三关键字。

       我们再来看一下那个关系表达式:

 (stu[j].score<stu[j+1].score)  ||

          ( (stu[j].score==stu[j+1].score) &&(stu[j].chinese<stu[j+1].chinese) ) ||

          ( (stu[j].score==stu[j+1].score) &&(stu[j].chinese==stu[j+1].chinese) && (stu[j].id>stu[j+1].id) ) )

在此表达式中:首先比较第一关键字总分,如果第一关键字相等,比较第二关键字语文,如果第一关键字和第二关键字都相等,比较第三关键字学号。并且关键字的大小顺序还不同。这个关系式希望深刻理解。

 



 

原创粉丝点击