PAT乙级1004——成绩排名

题目:

题目详情 - 1004 成绩排名 (20 分) (pintia.cn)

我的思路很简单:

1.构造结构体,每个结构体里面储存学生的三个参数:姓名,学号,分数

2.构造结构体数组(这里使用到动态数组)

2.通过排序算法(可以是冒泡,快速,这里选择了冒泡排序,虽然时间复杂度会比较高)将分数排名,并将整个结构体数组里面的成员排名

4.输出分数最高的和分数最低的

尽管运行出来了正确的结果,但还是有一个测试点没有通过,很奇怪:

 

 下面是代码:

#include <iostream>
using namespace std;
//构造结构体 
typedef struct StuList
{
    char name[12];
    char id[12];
    int score;
}Slist;
    
int main()
{
    int n,i,j;
    cin>>n;  //一共有n个学生 
    
    Slist *ptr;   //构造一个结构体指针PtrS 
    ptr=new Slist [n];    //这个指针指向一个动态数组 
    
    for    (i=0;i<n;i++)
    {
        cin>>(ptr+i)->name;
        cin>>(ptr+i)->id;
        cin>>(ptr+i)->score;
    }
    
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1;j++)
        {
            if (((ptr+i)->score)<((ptr+i+1)->score))  //需要从大到小排序 
            {
                 Slist temp=*(ptr+i);
                 *(ptr+i)=*(ptr+i+1);
                 *(ptr+i+1)=temp;
            }
        }
    }
    
    cout<<(ptr)->name<<" "<<(ptr)->id<<endl;
    cout<<(ptr+n-1)->name<<" "<<(ptr+n-1)->id;
     
    return 0;
}

 

下面是我看到的别人的回答,很简单的感觉:

#include <iostream>
#include <string>
using namespace std;
int main() 
{
    int n, max = -1, min = 101, score;  //初始化最大值和最小值,这两个值都是正常成绩取不到的值 
    cin >> n;
    string maxname, minname;  //最高分的同学的姓名和最低分的姓名 
    string maxnum, minnum;     //最高分的同学的学号,最低分的学号 
    string name,num;          //姓名和学号 
    for (int i = 0; i < n; i++) 
    {
        cin >> name >> num >>score;
        if (max < score) 
        {
            max = score;
            maxname = name;
            maxnum = num;
        }
        if (min > score) 
        {
            min = score;
            minname = name;
            minnum = num;
        }
    }
    cout << maxname << " " << maxnum << endl;
    cout << minname << " " << minnum;
    return 0;
}

这个方式为什么更简单呢?

简言之:进来一个比一个,不需要全部都存储起来再排序

这个方法的缺点:设置的变量比较多,容易混淆,如果题目要求输出前三名就不好办了

总结:

看题目需求:如果只需要最大最小值,那么就进来一个比一个就好了。

posted @ 2021-11-23 00:50  EowynTang  阅读(115)  评论(0)    收藏  举报