帮我把正确的代码完整的写一遍
时间: 2023-08-28 18:19:54 浏览: 53
好的,以下是修改后的完整代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_COURSE_NUM 10
#define MAX_STUDENT_NUM 100
typedef struct {
long num;
char name[MAX_NAME_LEN];
int score[MAX_COURSE_NUM];
int total;
int rank;
} STUDENT;
void ReadFromFile() {
FILE *fin;
int i, j, NumOfStudent, NumOfCourse;
fin = fopen("F:/学生管理/input.txt", "r");
if (fin == NULL) {
printf("Failed to open a file!\n");
exit(0);
}
fscanf(fin, "%d%d", &NumOfStudent, &NumOfCourse);
STUDENT *stu = (STUDENT*) calloc(NumOfStudent, sizeof(STUDENT));
int *Total = (int*) calloc(NumOfStudent, sizeof(int));
char buf[1024];
for (i = 0; i < NumOfStudent; i++) {
fscanf(fin, "%ld", &stu[i].num);
fgets(buf, 1024, fin);
sscanf(buf, "%s", stu[i].name);
for (j = 0; j < NumOfCourse; j++) {
fscanf(fin, "%d", &stu[i].score[j]);
Total[i] += stu[i].score[j];
}
stu[i].total = Total[i];
}
fclose(fin);
int k;
for (i = 0; i < NumOfStudent; i++) {
k = i;
for (j = i + 1; j < NumOfStudent; j++) {
if (Total[j] > Total[k]) {
k = j;
}
}
if (k != i) {
int tmp = Total[i];
Total[i] = Total[k];
Total[k] = tmp;
STUDENT tmp_stu = stu[i];
stu[i] = stu[k];
stu[k] = tmp_stu;
}
}
for (i = 0; i < NumOfStudent; i++) {
if (i == 0 || Total[i] != Total[i - 1]) {
stu[i].rank = i + 1;
} else {
stu[i].rank = stu[i - 1].rank;
}
}
printf("学号\t姓名");
for (i = 1; i <= NumOfCourse; i++) {
printf("\t课程%d", i);
}
printf("\t总分\t排名\n");
for (i = 0; i < NumOfStudent; i++) {
printf("%ld\t%s", stu[i].num, stu[i].name);
for (j = 0; j < NumOfCourse; j++) {
printf("\t%d", stu[i].score[j]);
}
printf("\t%d\t%d\n", stu[i].total, stu[i].rank);
}
free(stu);
free(Total);
}
int main() {
ReadFromFile();
return 0;
}
```
这个代码在读取学生姓名的时候使用了 fgets 函数,并在读取后去掉了换行符;在排序后设置学生排名的时候使用了 if/else 语句来处理并列排名的情况。同时,还添加了一些宏定义来规范代码,使其更易读。