設計公司職員資料結構,使用結構體指標陣列儲存員工資訊,實現薪資總額與平均薪資統計,支援全員與特定年齡區間查詢。核心知識點:struct、指標陣列、enum、動態記憶體、選單驅動架構。
#define EMP_NUM 10
typedef struct employee {
int age;
char name[20];
unsigned salary;
} *PEMP; // PEMP 為結構體指標類型別名
typedef enum { TOTAL, AVERAGE } sel_c; // 統計模式枚舉
PEMP company[EMP_NUM]:結構體指標陣列,每個元素指向一個動態分配的員工節點update_msg、salary_analysis、display_msgvoid update_msg(PEMP company[]) {
while (1) {
PEMP new_emp = (PEMP)malloc(sizeof(*new_emp));
int id;
printf("請輸入員工資訊 (ID=-1 退出):\nID: ");
scanf("%d", &id);
while (id < -1 || id >= EMP_NUM) {
printf("ID 範圍 0~%d,重新輸入: ", EMP_NUM-1);
scanf("%d", &id);
}
if (id == -1) { free(new_emp); return; }
printf("姓名: "); scanf("%s", new_emp->name);
printf("年齡: "); scanf("%d", &new_emp->age);
while (new_emp->age < 0 || new_emp->age > 60) {
printf("年齡 0~60,重新輸入: "); scanf("%d", &new_emp->age);
}
printf("薪水: "); scanf("%u", &new_emp->salary);
while (new_emp->salary > 20000) {
printf("薪水 0~20000,重新輸入: "); scanf("%u", &new_emp->salary);
}
company[id] = new_emp; // 指定位置存入指標
}
}
void salary_analysis(PEMP company[], sel_c which) {
char sel;
int age1, age2, low, high, i, count = 0;
unsigned long sum = 0;
while (1) {
if (which == TOTAL)
printf("1:區間薪資總和 2:全員薪資總和\n");
else
printf("1:區間薪資平均 2:全員薪資平均\n");
printf("0:返回\n選擇: ");
sel = getchar(); while (getchar()!='\n'); // 清緩衝區
if (sel == '0') return;
if (sel != '1' && sel != '2') continue;
if (sel == '1') {
printf("起始年齡: "); scanf("%d", &age1);
printf("結束年齡: "); scanf("%d", &age2);
low = (age1 < age2) ? age1 : age2;
high = (age1 < age2) ? age2 : age1;
}
for (i = 0; i < EMP_NUM; i++) {
if (company[i] &&
(sel == '2' || (company[i]->age >= low && company[i]->age <= high))) {
sum += company[i]->salary;
count++;
}
}
if (count == 0) printf("無符合員工!\n");
else if (which == TOTAL)
printf("薪資總和: %lu\n", sum);
else
printf("薪資平均: %lu\n", sum / count);
return; // 統計一次即返回主選單
}
}
void display_msg(PEMP company[]) {
for (int i = 0; i < EMP_NUM; i++)
if (company[i])
printf("ID:%d 姓名:%s 年齡:%d 薪水:%u\n",
i, company[i]->name, company[i]->age, company[i]->salary);
}
int main() {
PEMP company[EMP_NUM];
memset(company, 0, sizeof(company));
char select; sel_c which;
do {
printf("\n<-----薪資統計系統----->\n");
printf("1:更新資訊 2:薪資求和 3:薪資平均 4:顯示資訊 0:退出\n選擇: ");
select = getchar(); while (getchar()!='\n');
switch (select) {
case '1': update_msg(company); break;
case '2': salary_analysis(company, TOTAL); break;
case '3': salary_analysis(company, AVERAGE); break;
case '4': display_msg(company); break;
}
} while (select != '0');
return 0;
}
| 技術點 | 應用細節 | 注意事項 |
|---|---|---|
| 結構體指標陣列 | PEMP company[10] 存指標而非實體 | 須 malloc 分配節點,用完 free |
| 枚舉類型 | sel_c 替代魔術數字 | 增強可讀性,編譯器可檢查 |
| 輸入驗證 | 年齡/薪水/ID 範圍檢查 | 防止非法資料破壞統計 |
| 靜態區域變數 | 主選單中 static PEMP *list_head | 保持鏈表頭指標生命週期 |