作业对比反思·学生成绩排序

  • ·先看题目

【问题描述】
对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输入次序排序。
【输入形式】
从键盘依次输入最多不超过50个学生的学生姓名和成绩:
第一行输入班级学生人数;
在单独行上输入空格隔开的学生姓名和成绩,其中学生成绩是整数。
【输出形式】
按学生成绩由高到低顺序输出学生姓名和成绩,每行输出一位学生的姓名和成绩,其中姓名(英文)占15位,成绩占5位,均按缺省方式对齐。成绩相同时按输入次序排序。
【输入样例】

4
aaa 50
bbb 70
ccc 65
ddd 90
  • 这是最新留的题目,说实话第一眼看到这题我完全傻眼,只记得上课确实学过如何一次性输出一大串,但不记得怎么用,所以还是先百度了答案。

百度结果如下:

#include<stdio.h>

struct stu

{ char name[20];

 int score;

}a[50],t;

int main()

int i,j,n;

  scanf("%d",&n);

  for(i=0;i<n;i++)

    scanf("%s%d",a[i].name,&a[i].score);

  for(i=0;i<n-1;i++)

    for(j=0;j<n-1-i;j++)

      if(a[j].score<a[j+1].score)

      {t=a[j];a[j]=a[j+1];a[j+1]=t;}  

  for(i=0;i<n;i++)

    printf("%15s%5d\n",a[i].name,a[i].score);

  return 0;

}

  • 与答案对比:

他将结构体放在了主函数外,我选择将结构体放在主函数内。

在最开始时,我并没有在意他在声明类型的同时定义的变量t,所以到后来if对比时是完全瞎写的。自己又在主函数开头定义了一个t,完全没意识到自己定义的t与结构体完全不是一个类型。包括输出的时候也是最开始的输出结果根本排不了序,我就一点一点的找原因,先是发现交换数组只交换了score,而不是整个数组,看答案也才也才意识到对应i的name和score可看做一个整体。

到后来才完全的意识到声明类型的同时定义的变量t的真正意义。

  • 修改后自己的答案:

#include<stdio.h>

int main()
{
    struct rem
    {
        char name[20];
        int score;
    }a[50],r;
    int i,j,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s %d",&a[i].name,&a[i].score);
    }
    for(i=1;i<n;i++)
    {
        for(j=0;j<n-i;j++)
        {
            if(a[j].score<a[j+1].score)
            {
                r=a[j];
                a[j]=a[j+1];
                a[j+1]=r;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%15s   %d\n",a[i].name,a[i].score);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Saocr/article/details/121723225
今日推荐