- 先看题目
【问题描述】
对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过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;
}