按以下要求优化并完善C语言代码 从文件rawscore.txt中读取学生人数、考核科目数及每位学生各科目分数等基本信息。 根据读入的信息,计算出每位学生的专业课平均分。 可以自由设置专业课成绩与德育成绩之间的比例、奖学金等级数、各等级获奖人数等基本信息。 根据设定的专业课成绩与德育成绩比例,计算学生的综合成绩。可以使用加权平均数的方法来实现。 将每个学生的综合成绩按照从小到大的顺序进行冒泡排序。 按照奖学金等级和数量依次输出排序结果。
时间: 2024-03-27 20:36:39 浏览: 73
以下是优化并完善后的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 1000
#define MAX_SUBJECTS 20
typedef struct {
int id; // 学号
char name[20]; // 姓名
double scores[MAX_SUBJECTS]; // 各科成绩
double avg; // 专业课平均分
double grade; // 综合成绩
} Student;
int main() {
FILE *file;
int n, m, i, j, k, l;
double weight, sum;
Student students[MAX_STUDENTS];
Student temp;
// 从文件中读取学生信息
file = fopen("rawscore.txt", "r");
fscanf(file, "%d%d", &n, &m);
for (i = 0; i < n; i++) {
fscanf(file, "%d%s", &students[i].id, students[i].name);
sum = 0;
for (j = 0; j < m; j++) {
fscanf(file, "%lf", &students[i].scores[j]);
sum += students[i].scores[j];
}
students[i].avg = sum / m;
}
fclose(file);
// 计算综合成绩
printf("请输入专业课成绩与德育成绩的权重(例如:0.8 0.2):");
scanf("%lf%lf", &weight, &sum);
for (i = 0; i < n; i++) {
students[i].grade = weight * students[i].avg + sum * rand() / RAND_MAX; // 加上随机德育成绩
}
// 对综合成绩进行冒泡排序
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (students[j].grade > students[j+1].grade) {
temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 输出奖学金获奖名单
printf("请输入奖学金等级数和每个等级的获奖人数(例如:3 10):");
scanf("%d%d", &k, &l);
for (i = 0; i < k; i++) {
printf("第%d等奖:\n", i+1);
for (j = n-1; j >= 0 && students[j].grade >= students[n-l*k+i].grade; j--) {
printf("%d %s %.2f\n", students[j].id, students[j].name, students[j].grade);
}
}
return 0;
}
```
代码说明:
1. 定义了一个 `Student` 结构体,用于存储每个学生的信息,包括学号、姓名、各科成绩、专业课平均分和综合成绩等字段;
2. 使用 `fscanf` 从文件中读取学生信息,并且计算出每个学生的专业课平均分;
3. 让用户输入专业课成绩与德育成绩的权重,然后计算出每个学生的综合成绩。德育成绩使用 `rand` 函数生成一个随机数,范围在 0 到 1 之间;
4. 使用冒泡排序对学生的综合成绩进行排序;
5. 让用户输入奖学金等级数和每个等级的获奖人数,然后按照奖学金等级和数量依次输出排序结果。
注意:这里的代码仅仅是一个示例,实际应用中还需要考虑很多细节问题,比如异常处理、文件读取错误处理、输入格式验证等等。
阅读全文