void statistics(struct Score scores[], struct Course courses[],int numScores) { int i,j,k; printf("课程名\t\t平均分\t\t最高分\t\t最低分"); for ( i = 0; i < MAX_COURSE_NUM; i++) { if (numScores==0) { break; } float sum = 0, max = courses[0].scores[i].score, min = courses[0].scores[i].score; int count = 0; for ( j = 0; j < numScores; j++) { for ( k = 0; k < students[j].course_num; k++) { if (strcmp(students[j].courses[k].name, students[0].courses[i].name) == 0) { sum += students[j].courses[k].score; if (courses[0].scores[i].score> max) { max = courses[0].scores[i].score; } if (courses[0].scores[i].score< min) { min = courses[0].scores[i].score; } count++; break; } } } printf("%s\t\t%.2f\t\t%.2f\t\t%.2f", courses[].name, sum / count, max, min); } } struct Course { //课程结构体 char name[MAX_NAME_LEN]; //课程名 char teacher[MAX_NAME_LEN]; //授课老师名 }courses[MAX_COURSES]; ////课程结构体数组变量 struct Score { //成绩结构体 char courseName[MAX_NAME_LEN];//课程名 int score; //分数 }scores[MAX_COURSES]; //定义成绩结构体数组变量 int numCourses = 0; //初始化课程数量为0 int numScores = 0; // 初始化成绩数量为0 优化代码
时间: 2024-02-14 18:04:57 浏览: 51
好的,我看到你的代码了。在优化代码前,我想先指出一些问题:
1. 在统计每门课程的平均分、最高分和最低分时,你在循环中的变量i应该是遍历课程数组,而不是学生数组。
2. 在计算每门课程的平均分时,你的代码没有考虑到某门课程没有学生选修的情况,这会导致除以0的错误。
3. 在计算每门课程的最高分和最低分时,你的代码中的变量max和min并没有与每个学生的成绩进行比较,而是一直和第一个学生的分数进行比较,这会导致最终的结果不正确。
好的,接下来是我对你的代码的优化建议:
1. 在统计每门课程的平均分、最高分和最低分时,可以先对每门课程的成绩进行排序,然后取出最高分和最低分,再计算平均分。这样可以减少循环次数,提高效率。
2. 在计算每门课程的平均分时,可以先判断该门课程是否有学生选修,如果没有,则平均分为0。
3. 在计算每门课程的最高分和最低分时,可以使用一个变量来保存当前最高分和最低分,然后依次与每个学生的分数进行比较,更新最高分和最低分。
最终的优化代码可能会像这样:
```
void statistics(struct Score scores[], struct Course courses[], int numScores) {
int i, j, k;
printf("课程名\t\t平均分\t\t最高分\t\t最低分");
for (i = 0; i < MAX_COURSE_NUM && i < numCourses; i++) {
float sum = 0, max = 0, min = 100;
int count = 0;
if (courses[i].numStudents == 0) {
printf("%s\t\t%.2f\t\t%.2f\t\t%.2f", courses[i].name, 0.0, 0.0, 0.0);
continue;
}
for (j = 0; j < courses[i].numStudents; j++) {
sum += courses[i].students[j].score;
if (courses[i].students[j].score > max) {
max = courses[i].students[j].score;
}
if (courses[i].students[j].score < min) {
min = courses[i].students[j].score;
}
count++;
}
printf("%s\t\t%.2f\t\t%.2f\t\t%.2f", courses[i].name, sum / count, max, min);
}
}
```
希望这些优化建议能对你有所帮助!
阅读全文