題目要求:
#define MAX_STU 100
typedef struct {
char id[10]; // 學號
char name[20]; // 姓名
char major[20]; // 專業
float eng; // 英語
float math; // 高數
float c_lang; // C語言
float avg; // 個人平均分
} Student;
Student stu[MAX_STU];
int stu_count = 0;
inputData)void inputData() {
// 預置專業與學號前綴
char *majors[] = {"網絡", "會計"};
char *prefix[] = {"A", "B"};
int per_major = 5;
for (int m = 0; m < 2; m++) {
for (int i = 1; i <= per_major; i++) {
Student *s = &stu[stu_count++];
sprintf(s->id, "%s%02d", prefix[m], i); // A01, A02... B01, B02...
strcpy(s->major, majors[m]);
printf("請輸入 %s (%s) 的姓名 英語 高數 C語言: ", s->id, s->major);
scanf("%s %f %f %f", s->name, &s->eng, &s->math, &s->c_lang);
s->avg = (s->eng + s->math + s->c_lang) / 3.0f;
}
}
}
calcMajorAvg)// 返回指定專業指定科目的平均分,無學生返回 -1
float calcMajorAvg(const char *major, int subject) {
// subject: 0=英語, 1=高數, 2=C語言
float sum = 0;
int cnt = 0;
for (int i = 0; i < stu_count; i++) {
if (strcmp(stu[i].major, major) == 0) {
switch (subject) {
case 0: sum += stu[i].eng; break;
case 1: sum += stu[i].math; break;
case 2: sum += stu[i].c_lang; break;
}
cnt++;
}
}
return (cnt == 0) ? -1.0f : (sum / cnt);
}
displayResults)void displayResults() {
printf("\n===== 學生個人平均分 =====\n");
printf("%-8s %-10s %-8s %6s %6s %6s %6s\n", "學號", "姓名", "專業", "英語", "高數", "C語言", "平均");
for (int i = 0; i < stu_count; i++) {
Student *s = &stu[i];
printf("%-8s %-10s %-8s %6.1f %6.1f %6.1f %6.2f\n",
s->id, s->name, s->major, s->eng, s->math, s->c_lang, s->avg);
}
printf("\n===== 專業每科平均分 =====\n");
char *majors[] = {"網絡", "會計"};
char *subjects[] = {"英語", "高數", "C語言"};
for (int m = 0; m < 2; m++) {
printf("\n--- %s 專業 ---\n", majors[m]);
for (int sub = 0; sub < 3; sub++) {
float avg = calcMajorAvg(majors[m], sub);
if (avg >= 0)
printf("%s平均分: %.2f\n", subjects[sub], avg);
else
printf("%s平均分: 無數據\n", subjects[sub]);
}
}
}
int main() {
inputData();
displayResults();
return 0;
}
| 知識點 | 應用位置 |
|---|---|
| 結構體數組管理多條記錄 | Student stu[MAX_STU] |
| 字符串操作 (strcpy, strcmp, sprintf) | 學號生成、專業比較、輸入輸出 |
| 浮點數運算與格式化輸出 | 平均分計算、%.2f 顯示 |
| 模塊化函數設計 | inputData / calcMajorAvg / displayResults |
| 巢狀循環遍歷專業與學生 | 數據初始化、統計計算 |
fprintf/fscanf),實現數據持久化。qsort 按平均分排名輸出。本題核心是結構體數組建模實體數據、巢狀循環批量處理、分組統計計算。代碼結構清晰分離「數據輸入、業務計算、結果展示」三層,易於維護擴展。掌握此模式,可快速構建各類「分組統計」類控制台應用(如銷售報表、實驗數據分析、員工績效統計等)。