PAT乙级1004答案C语言版本

1004 成绩排名 (20分)

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:

每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
… … …
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:

对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

思路

第一次写的时候还不会快速排序,所以是慢慢遍历比较的
第二次直接快速排序即可。代码也更精简,后面有第二次的代码

#include
struct student
{
    char name[20];
    char number[20];
    int score;
};
int main()
{
    int n;
    scanf("%d",&n);
    struct student stu[100];
    for(int i=0;i<n;i++)
    {
        scanf("%s%s%d",stu[i].name,stu[i].number,&stu[i].score);
    }
    int sc[10000]={0};
    for(int i=0;i<n;i++)
    {
        sc[i]=stu[i].score;
    }
    int max=sc[0],min=sc[0],max_index=0,min_index=0;
    for(int i=0;i<n;i++)
    {
        if(max<sc[i])
        {
            max=sc[i];
            max_index=i;
        }
    }
    for(int i=0;i<n;i++)
    {
        if(min>sc[i])
        {
            min=sc[i];
            min_index=i;
        }
    }
    printf("%s %s\n",stu[max_index].name,stu[max_index].number);
    printf("%s %s\n",stu[min_index].name,stu[min_index].number);
    return 0;
}

第二次写的

#include
#include
typedef struct //定义结构体,存放名字学号成绩
{
    char name[11];
    char number[11];
    int score;
}student;

int cmp(const void *a,const void *b)//快速排序,将成绩从大到小排序
{
    student s1 = *(student *)a;
    student s2 = *(student *)b;
    if(s1.score!=s2.score)
        return s2.score-s1.score;
}

int main()
{
    int n;
    scanf("%d",&n);
    student stu[n]; //存放学生信息
    for(int i=0;i<n;i++)
    {
        scanf("%s%s%d",stu[i].name,stu[i].number,&stu[i].score);//输入学生信息
    }
    qsort(stu,n,sizeof(student),cmp);//进行排序
    printf("%s %s\n",stu[0].name,stu[0].number);//输出分数最高的姓名学号
    printf("%s %s\n",stu[n-1].name,stu[n-1].number);//输出最后一个学生的姓名学号,也就是最低分
    return 0;
}

你可能感兴趣的:(pat考试,c语言,c#)