67,732
社区成员
今天写代码题的时候
具体题目是这样的:
题目描述
弗兰奇所在的班级有 N 名同学,期末考试进行了数学、语文、英语、地理四门功课的测试。班主任要将这N名学生中总分前三名定为本学期的“学习小标兵”。现在给出这NN名学生的姓名和各科成绩,请你编程找到总分前三名,并依次输出他们的姓名。所给数据不会有总分相同的情况。
输入
输入包含 N+1 行,第一行仅有一个正整数 N(N≤40),表示弗兰奇班里学生的总数,接下来的NN行,每行描述一个学生的考试信息,依次为姓名、数学成绩、语文成绩、英语成绩与地理成绩,两两之间用一个空格分隔。
注意:姓名(不会同名)都用小写字母表示(不超过10个字母),成绩全都是不超过200 的非负整数。
输出
输出包含三行,每行仅包含一个学生的姓名,依次为第一名到第三名学生的姓名。
样例输入1
4
jing 98 90 87 74
ming 96 92 85 97
jun 95 78 56 91
hong 95 100 85 78
样例输出1
样例输出1
ming
hong
jing
然后我写的代码是这样的:
#include<stdio.h>
typedef struct students{
char name[10];
int math;
int chinese;
int english;
int geograpthy;
int sum;
}students;
int main()
{
students student[40], t;
int N, i, j;
int ch;
while (1){
scanf("%d", &N);
if (N > 0 && N <= 40) break;
}
//创建链表
for (i = 0; i < N; i++) {
j = 0;
while ((ch = getchar()) != ' ') {
student[i].name[j] = ch;
j++;
}
student[i].name[j] = '\0';
scanf("%d%d%d%d", &student[i].math, &student[i].chinese,&student[i].english,&student[i].geograpthy);
}
for (i = 0; i < N; i++) {
student[i].sum = student[i].math + student[i].chinese + student[i].english + student[i].geograpthy;
}
//链表排序
for (i = 0; i < N - 1; i++) {
for (j = 0; j < N - 1; j++) {
if (student[j].sum < student[j + 1].sum) {
t = student[j];
student[j] = student[j + 1];
student[j + 1] = t;
}
}
}
//输出前三名总分最多的人名
for (i = 0; i < 3; i++)
{
printf("%s", student[i].name);
}
return 0;
}
输出的结果是这样:
-------------------------------
4
jing 98 90 87 74
ming 96 92 85 97
jun 95 78 56 91
hong 95 100 85 78
ming
hong
jing
------------------------------
我疑惑的就是为什么在hong 95100 85 78下面会多出一行空行,很疑惑。
然后如果我在输出for循环前面加一行printf(“first”);
那么我的输出结果就变成了:
-----------------------------------
4
jing 98 90 87 74
ming 96 92 85 97
jun 95 78 56 91
hong 95 100 85 78
first
ming
hong
jing
---------------------------------
我更疑惑了,原先那一行空的内容被“first”取代了?????
哪个大佬能help一下。