輸入 5 位學生的學號、姓名、三科成績;計算個人平均、全班總平均;找出最高平均分學生並輸出其姓名與平均。要求模組化:輸入、計算平均、找最高分分別為函式。
scanf("%d%c", &stu[i].num, &stu[i].name) 格式錯誤:%c 只讀單一字元,且會讀取殘留換行符。應用 %s 讀字串,並在 %d 後加空格跳過空白字元。average 欄位,導致平均分另存全域陣列 ave[3],大小不足且易混淆。max() 回傳 maxi 為索引+1,主函式未使用回傳值輸出結果。stdio.h、stdlib.h 標頭檔;main 未回傳 int。#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct {
int num;
char name[20];
int score[3];
float average;
} Student;
Student stu[N];
void input();
void calculate_average();
int find_highest();
int main() {
input();
calculate_average();
int idx = find_highest();
// 輸出總平均
float total_avg = 0;
for (int i = 0; i < N; i++) total_avg += stu[i].average;
total_avg /= N;
printf("\n全班總平均:%.2f\n", total_avg);
// 輸出最高分學生
printf("最高分學生:%s 平均:%.2f\n", stu[idx].name, stu[idx].average);
return 0;
}
void input() {
for (int i = 0; i < N; i++) {
printf("\n第 %d 位學生:\n", i+1);
printf("學號:"); scanf("%d", &stu[i].num);
printf("姓名:"); scanf("%19s", stu[i].name); // 防止緩衝區溢位
for (int j = 0; j < 3; j++) {
printf("第 %d 科成績:", j+1);
scanf("%d", &stu[i].score[j]);
}
}
}
void calculate_average() {
for (int i = 0; i < N; i++) {
int sum = 0;
for (int j = 0; j < 3; j++) sum += stu[i].score[j];
stu[i].average = sum / 3.0f;
}
}
int find_highest() {
int max_idx = 0;
for (int i = 1; i < N; i++) {
if (stu[i].average > stu[max_idx].average) max_idx = i;
}
return max_idx;
}
average 欄位,資料封裝性更好。scanf("%19s", ...) 限制字串長度,避免緩衝區溢位。