首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言結構體與共用體經典例題全解析:從學生資訊到絕對質數

     編輯:關於C語言

C 語言結構體與共用體經典例題全解析:從學生資訊到絕對質數

本文精選《C 語言程式設計教學》第九章 9 道經典例題,涵蓋結構體定義、巢狀結構、結構體陣列、共用體節省空間、列舉型別、typedef 簡化宣告、結構體指標傳參,每題附完整代碼與關鍵點解析。

例題 9.1:學生基本資訊輸入輸出

知識點:結構體定義、巢狀結構 (struct date)、陣列成員、字串輸入、flushall() 清緩衝。


struct date { int year, month, day; };
struct student {
    char num[9], name[21], sex;
    int age;
    struct date birthday;
    int score[3];
    float aver;
};
// 輸入 -> 計算平均 -> 格式化輸出

例題 9.2:選票統計與排序

知識點:結構體陣列、strcmp 字串比較、選擇排序依票數降序、結構體整體交換。


struct person { char name[20]; int count; };
struct person leader[3] = {"fu",0,"lu",0,"shou",0};
// 統計 -> 排序 -> 輸出

例題 9.3:競賽計時器

知識點:結構體作函數參數/返回值、kbhit()/getch() 非阻塞鍵盤檢測、sleep() 延遲、\r 回行首覆寫顯示。


struct clock { int hours, minutes, seconds; };
struct clock update(struct clock t) { ... }  // 值傳遞返回新狀態
void display(struct clock t) { printf("\r%02d:%02d:%02d", ...); }

例題 9.4:學生成績管理系統

知識點:模組化設計(輸入、平均、排序、輸出四函數)、結構體陣列排序、函數參數傳陣列指標。


void Input(struct student st[], int n);
void CalAver(struct student st[], int n);
void Sort(struct student st[], int n);   // 依平均分升序
void Output(struct student st[], int n);

例題 9.5:共用體查看整數位元組

知識點:union 成員共用記憶體、int (2/4 位元組) 與 char[2] 重疊、十六進位與字元雙重解讀。


union int_char { char ch[2]; int i; };
// i = 19788 (0x4D54) → ch[0]='T'(0x54), ch[1]='M'(0x4D) (小端序)

例題 9.6:男女生體育成績異質資料

知識點:結構體內嵌共用體、sex 判斷存取不同共用體成員、實現「同一欄位、不同結構」的多態效果。


struct boyscore { int minute, second; };
struct girlscore { char flexibility; int number; };
struct student {
    char num[9], name[21], sex;
    union { struct boyscore bs; struct girlscore gs; } score;
};

例題 9.7:枚舉型別實現排列組合

知識點:enum 定義離散常數、三層迴窮舉、switch 輸出中文、格式化列印每行 5 組。


enum color {red, yellow, white, blue, black};
for (b[0]=red; b[0]<=black; b[0]++)
  for (b[1]=red; b[1]<=black; b[1]++)
    for (b[2]=red; b[2]<=black; b[2]++)
      if (三顏色各異) 輸出;

例題 9.8:結構體陣列初始化與指標遍歷

知識點:typedef 簡化宣告、陣列初始化列表、結構體指標 p->member 存取、指標算術遍歷。


typedef struct student { int id; char name[20]; int score; } STUDENT;
STUDENT st[3] = {{10101,"Li Lin",98}, {10102,"Zhang Fun",87}, {10103,"Wang Min",79}};
for (STUDENT *p = st; p < st+3; p++) printf(...);

例題 9.9:typedef + 結構體指標實現引用傳遞

知識點:typedef 別名、函數參數用結構體指標模擬引用傳遞、-> 運算子存取成員、平均值計算。


typedef struct person { int num; char name[21]; int s[3]; float aver; } PERSON;
void Input(PERSON *p) { scanf("%d%s%d%d%d", &p->num, p->name, &p->s[0], &p->s[1], &p->s[2]); ... }
int main() { PERSON st; Input(&st); ... }

核心知識點總結表

概念關鍵語法典型應用
結構體struct Tag { members; };異質資料聚合
巢狀結構struct A { struct B b; };複雜實體建模
結構體陣列struct A arr[N];同類實體集合
共用體union Tag { members; };省記憶體、型別雙重解讀
結構體嵌共用體struct { union {A a; B b;} u; }變體記錄
枚舉enum Tag {V1, V2};離散狀態語意化
typedeftypedef struct A A;簡化宣告、資訊隱藏
結構體指標struct A *p; p->mem函數修改實參、動態配置

避坑指南

  • scanf("%s", &st.name) → 錯誤!陣列名已是位址,正確 scanf("%s", st.name)
  • flushall() 非標準,建議用 while(getchar()!='\n'); 清緩衝
  • 共用體大小 = 最大成員大小,非成員大小總和
  • 枚舉常數隱性轉為 int,可直接參與運算

掌握此 9 例,即能靈活運用結構體、共用體、枚舉解決實務中「異質資料聚合、記憶體優化、狀態機建模」等問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved