问题描述:一个班有学生n人,输入学生名字和2项成绩(数学和语文),找到总分最高的学生并输出,若总分最高的学生大于一人,则按照名字的字典顺序输出。
要求:输入n表示学生人数,接着依次输入学生名字,数学成绩,语文成绩,按照字典顺序输出总分最高的学生名字,数学成绩,语文成绩。
程序如下:
#include<stdio.h>
#include<string.h>
struct stu_student{
char name[19];
int mgrade;
int cgrade;
}list[200];
int main() {
struct stu_student temp[200];
int i, n,j,maxmark,mark;
int a[100] = { 0 };
scanf_s("%d", &n); //输入n,表示学生人数
for (i = 0; i < n; i++) {
scanf_s("%s", list[i].name,19);
scanf_s("%d%d", &list[i].mgrade, &list[i].cgrade);
} //依次输入名字,数学成绩,语文成绩
maxmark = list[0].mgrade + list[0].cgrade;
//以下是通过主元排序将总分从高到低排列
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
mark = list[j].mgrade + list[j].cgrade;
if (mark >= maxmark) {
maxmark = mark; //记录最高分maxmark
temp[j] = list[j];
list[j] = list[i];
list[i] = temp[j];
}
}
}
printf("\n");
//以下是通过主元排序按照字典顺序排列
for (i = 0; i < n; i++) {
if ((list[i].mgrade + list[i].cgrade) != maxmark)
break; //当总分不等于maxmark时结束循环
for (j = i+1; j < n; j++) {
if ((list[j].mgrade + list[j].cgrade) != maxmark)
break; //当总分不等于maxmark时结束循环
if (strcmp(list[j].name, list[i].name) < 0) {
temp[j] = list[j];
list[j] = list[i];
list[i] = temp[j];
}
}
}
//以下是输出
for (i = 0; (list[i].mgrade + list[i].cgrade)==maxmark; i++)
printf("%s %d %d\n", list[i].name,list[i].mgrade,list[i].cgrade);
return 0;
}