在嵌入式開發學習一年後,發現雖掌握 Linux、ARM、驅動等課程,但動手寫代碼能力仍薄弱。決定透過「C語言小設計」系列,從淺入深鞏固核心知識。本專案聚焦陣列、指標陣列、動態記憶體管理,實現班級成績統計功能。
| 科目 | 平均分 |
|---|---|
| 數學 | 75 |
| 物理 | 80 |
| 外語 | 83 |
| 政治 | 85 |
| 體育 | 86 |
| 人數 | 30 |
| 陣列 | 用途 | 說明 |
|---|---|---|
int *a | 數值資料 | 5科分數 + 人數 + 平均分 + 最低分 = 8 個整數 |
char *name[6] | 科目名稱 | 5科 + "科目"標題 |
char *mean_low[4] | 統計項標題 | 人數、平均成績、最低分、最低分科目 |
malloc 分配 a 陣列,指標存取運算本文展示第 2 種:核心數值動態分配,字串用靜態指標陣列。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUB_NUM 5
void init_name(char *name[]);
void init_mean_low(char *mean_low[]);
void input_message(char *name[], char *mean_low[], int *a);
void analysis_message(int *a, char *name[]);
void print_message(char *name[], char *mean_low[], int *a);
void recycle_memory(char *name[], char *mean_low[], int *a);
int main() {
int *a = (int *)malloc(8 * sizeof(int));
memset(a, 0, 8 * sizeof(int));
char *name[SUB_NUM + 1];
char *mean_low[4];
init_name(name);
init_mean_low(mean_low);
input_message(name, mean_low, a);
analysis_message(a, name);
print_message(name, mean_low, a);
recycle_memory(name, mean_low, a);
return 0;
}
void init_name(char *name[]) {
name[0] = "數學"; name[1] = "物理"; name[2] = "外語";
name[3] = "政治"; name[4] = "體育"; name[5] = "科目";
}
void init_mean_low(char *mean_low[]) {
mean_low[0] = "人數"; mean_low[1] = "平均成績";
mean_low[2] = "最低分科目成績"; mean_low[3] = "最低分科目";
}
void input_message(char *name[], char *mean_low[], int *a) {
int i;
printf("請輸入各科成績:\n");
for (i = 0; i < SUB_NUM; i++) {
printf("%s: ", name[i]);
scanf("%d", a + i);
while (a[i] > 100 || a[i] < 0) {
printf("輸入錯誤,重新輸入\n%s: ", name[i]);
scanf("%d", a + i);
}
}
printf("請輸入班級人數: ");
scanf("%d", a + SUB_NUM); // a[5] 存人數
}
void analysis_message(int *a, char *name[]) {
int i, sum = 0, min = 200, min_idx = 0;
for (i = 0; i < SUB_NUM; i++) {
sum += a[i];
if (a[i] < min) { min = a[i]; min_idx = i; }
}
a[SUB_NUM + 1] = sum / SUB_NUM; // 平均分 → a[6]
a[SUB_NUM + 2] = min; // 最低分 → a[7]
name[SUB_NUM] = name[min_idx]; // 最低分科目名 → name[5]
}
void print_message(char *name[], char *mean_low[], int *a) {
int i;
printf("分析結果:\n");
for (i = 0; i < SUB_NUM; i++)
printf("%s:%d\n", name[i], a[i]);
printf("人數:%d\n平均成績:%d\n最低科目成績:%d\n最低科目:%s\n",
a[SUB_NUM], a[SUB_NUM+1], a[SUB_NUM+2], name[SUB_NUM]);
}
void recycle_memory(char *name[], char *mean_low[], int *a) {
free(a); a = NULL;
// 注意:name/mean_low 指向字串常量,不可 free
// 若為動態分配字串,需逐個釋放
}
char *name[] 存放字串地址,靈活引用a+i 等價 &a[i],簡化存取malloc/free 配對,防洩漏strdup 或 malloc+strcpy)