c语言实现给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。对学生的考试成绩进行有关统计,并打印统计表,要求按总分数高低次序,打印出名次表,分数相同的为同一名次; 按名次打印出每个学生的学号、姓名、总分以及各科成绩。
时间: 2024-03-14 10:47:45 浏览: 98
好的,这是一个典型的成绩统计问题,需要用到结构体和排序算法,下面是一个基本的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 20
#define MAX_STUDENT 100
#define MAX_SUBJECT 10
typedef struct {
char name[MAX_NAME];
int id;
int score[MAX_SUBJECT];
int total_score;
} Student;
Student students[MAX_STUDENT];
int n, m;
int cmp(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
if (s1->total_score != s2->total_score) {
return s2->total_score - s1->total_score;
} else {
return s1->id - s2->id;
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d%s", &students[i].id, students[i].name);
students[i].total_score = 0;
for (int j = 0; j < m; j++) {
scanf("%d", &students[i].score[j]);
students[i].total_score += students[i].score[j];
}
}
qsort(students, n, sizeof(Student), cmp);
printf("名次\t学号\t姓名\t总分\t");
for (int j = 0; j < m; j++) {
printf("科目%d\t", j + 1);
}
printf("\n");
int rank = 1;
for (int i = 0; i < n; i++) {
if (i > 0 && students[i].total_score < students[i - 1].total_score) {
rank = i + 1;
}
printf("%d\t%d\t%s\t%d\t", rank, students[i].id, students[i].name, students[i].total_score);
for (int j = 0; j < m; j++) {
printf("%d\t", students[i].score[j]);
}
printf("\n");
}
return 0;
}
```
这个程序首先读入学生数量n和科目数量m,然后定义一个结构体Student,表示每个学生的信息。接着读入每个学生的信息,计算总分,然后用qsort函数按照总分排序。最后按照排名打印出每个学生的信息。
注意这个程序中的cmp函数,它用于比较两个学生的总分和学号,如果总分相同,则按照学号排序。这个函数会被qsort函数调用,qsort会根据这个函数的返回值进行排序。
阅读全文