期末考试结束后要对同学们的考试成绩进行排序,张老师已经计算好了每一位同学的总成绩。请编写程序,输入每位同学的总成绩并输出一个按成绩高低排列的名次表。
该问题中,在成绩排序的同时,需要相应的学号和姓名一起随之变化。因此,我们可以使用结构体,学号、姓名、成绩以及名次作为结构体成员。通过对结构体对象成员(总成绩)的大小判断,实现把结构体对象作为一个整体进行排序操作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student //声明结构体 student
{
char id[5]; //学生学号(四位)
char name[40]; //学生姓名
float score; //期末总成绩
int num; //名次
} student;
int main(int argc, char *argv[])
{
student stu[100], temp; //定义结构体对象数组 stu 和临时对象 temp
int i, j, n;
printf("输入学生人数(1~100):");
scanf("%d", &n);
printf("-----------------------\n");
for (i = 0; i < n; i++) { //输入学生成绩
printf("学号输入9999则停止输入!\n");
printf("学号(9999):");
scanf("%s", stu[i].id);
if (strcmp(stu[i].id, "-1") == 0) {
n = i;
break;
}
printf("姓名:");
scanf("%s", stu[i].name);
printf("总成绩:");
scanf("%f", &stu[i].score);
}
for (i = 0; i < n; i++) { //按成绩排序(冒泡法)
for (j = i+1; j < n; j++) {
if (stu[i].score < stu[j].score) {
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
} //结构体变量整体交换
}
stu[i].num = i+1;
}
printf("----------------------------------\n");
printf(" 学号 姓名 成绩 名次\n");
for (i = 0; i < n; i++) { //输出名次
printf("%6s",stu[i].id);
printf("%10s",stu[i].name);
printf("%12.2f",stu[i].score);
printf("%6d\n",stu[i].num);
}
return 0;
}
运行结果: