采用结构体类型存储学生学号、37次测试成绩(9次课前测、9次课后测、9次课后作业、9次实验作业和1次阶段性测试),以及平均分;采用函数实现数据读取、计算平均分、排序和输出。
时间: 2023-12-11 17:02:26 浏览: 28
以下是一个可能的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define NUM_TESTS 37
typedef struct {
int id;
float tests[NUM_TESTS];
float avg;
} Student;
int read_students(Student *students, int num_students) {
int i, j, count = 0;
char line[1024];
for (i = 0; i < num_students; i++) {
if (fgets(line, sizeof(line), stdin) == NULL) {
break; // end of input
}
if (sscanf(line, "%d", &students[i].id) != 1) {
continue; // ignore invalid lines
}
for (j = 0; j < NUM_TESTS; j++) {
if (fgets(line, sizeof(line), stdin) == NULL) {
break; // end of input
}
if (sscanf(line, "%f", &students[i].tests[j]) != 1) {
continue; // ignore invalid lines
}
}
count++;
}
return count;
}
void calculate_averages(Student *students, int num_students) {
int i, j;
for (i = 0; i < num_students; i++) {
float sum = 0;
for (j = 0; j < NUM_TESTS; j++) {
sum += students[i].tests[j];
}
students[i].avg = sum / NUM_TESTS;
}
}
int compare_students(const void *a, const void *b) {
const Student *s1 = (const Student *) a;
const Student *s2 = (const Student *) b;
if (s1->avg > s2->avg) {
return -1;
} else if (s1->avg < s2->avg) {
return 1;
} else {
return 0;
}
}
void sort_students(Student *students, int num_students) {
qsort(students, num_students, sizeof(Student), compare_students);
}
void print_students(Student *students, int num_students) {
int i, j;
for (i = 0; i < num_students; i++) {
printf("%d %.2f\n", students[i].id, students[i].avg);
for (j = 0; j < NUM_TESTS; j++) {
printf("%.2f ", students[i].tests[j]);
}
printf("\n");
}
}
int main() {
int num_students;
Student students[100];
num_students = read_students(students, 100);
calculate_averages(students, num_students);
sort_students(students, num_students);
print_students(students, num_students);
return 0;
}
```
这个程序中,`Student` 是一个结构体类型,包含一个整型的学号、一个浮点型数组用于存储 37 次测试成绩和一个浮点型的平均分。
`read_students` 函数用于读取输入数据,它接受一个 `Student` 数组和数组长度作为参数。它从标准输入中逐行读取数据,首先读取学号,然后读取 37 次测试成绩,如果读取失败则忽略该行。该函数返回成功读取的学生个数。
`calculate_averages` 函数用于计算平均分,它接受一个 `Student` 数组和数组长度作为参数。它遍历每个学生,将其 37 次测试成绩求和并除以 37,得到平均分。
`compare_students` 函数用于比较两个学生的平均分,它被 `qsort` 函数调用以进行排序。如果第一个学生平均分更高,返回负数;如果第二个学生平均分更高,返回正数;如果两个学生平均分相同,返回 0。
`sort_students` 函数用于排序学生,它接受一个 `Student` 数组和数组长度作为参数。它使用 `qsort` 函数进行排序,排序时调用 `compare_students` 函数进行比较。
`print_students` 函数用于输出学生信息,它接受一个 `Student` 数组和数组长度作为参数。它遍历每个学生,输出学号和平均分,然后输出 37 次测试成绩。
在 `main` 函数中,我们首先声明一个长度为 100 的 `Student` 数组,然后调用 `read_students` 函数读取数据,然后调用 `calculate_averages` 函数计算平均分,然后调用 `sort_students` 函数排序,最后调用 `print_students` 函数输出结果。