C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班
課程大綱 C語言簡介 基本資料型態, 變數, 基本輸入輸出 控制敘述- 選擇控制與重覆控制 陣列 函式 指標 字元與字串 結構 檔案處理
本次課程大綱 資料型態別名 (typedef) 結構(Structure) 結構陣列 結構與函式 聯合(Union) 列舉資料型態 (enum)
typedef型態定義 (1) typedef資料型態 識別字(別名); 資料型態是識別字所對應的真實資料型態,它可以是C語言的基本資料型態,或其他已經定義過的自訂資料型態,或已經使用typedef定義過的別名。 識別字(別名),一旦經由typedef定義之後,在程式中就可以使用該別名來宣告變數,而實際上,該別名將會被編譯器代替為原來的資料型態。
typedef型態定義 (2) 範例: 例子 typedef int score; /* 定義資料型態的別名 */ score student01,student02; typedef char * STRING; /* 定義資料型態的別名 */ STRING str1="Book"; 例子
結構 (structure) (1) 由於每一種資料可能擁有不同的資料型態,因此,我們有的時候無法單純使用多維陣列來加以存放資料,例如:我們要記錄全班同學的成績,每一位同學的資料為學號(字串資料型態)、計概成績(整數資料型態)、數學成績(整數資料型態)、英文成績(整數資料型態)、平均成績(浮點數資料型態),如下圖。
結構 (structure) (3) 結構能夠結合數個彼此相關的變數在一個名稱之下, 並可包含許多不同資料型態的變數. 和結構相比, 陣列也只能包含相同資料型態的元素. struct 結構型態 { 資料型態 變數1; 資料型態 變數2; ………………….. 資料型態 變數3; };
結構 (structure)定義 struct開始定義一個結構 student稱為該結構的標籤(struct tag) { char stu_id[12]; /* 學號 */ int ScoreComputer; /* 計概 */ int ScoreMath; /* 數學 */ int ScoreEng; /* 英文 */ float ScoreAvg; /* 平均成績 */ };
結構的記憶體內容
結構宣告 struct 結構名稱 變數或陣列名稱 struct 結構資料型態名稱 { 結構主體 }結構變數名稱; struct student John; struct student IM[50]; struct 結構資料型態名稱 { 結構主體 }結構變數名稱; struct X { … }Y;
存取結構 (1) 結構體變數.資料項 結構體指標變數->資料項 struct student John; /* John是一個普通結構體變數 */ ……………… John.ScoreMath=86; John.ScoreAvg=76.67; 結構體指標變數->資料項 struct student John; /* John一個普通結構體變數 */ struct student *pJohn; /* pJohn是一個結構體指標變數(指向結構體變數的指標) */ pJohn = &John; /* pJohn指標指向John變數 */ pJohn->ScoreMath=86; pJohn->ScoreAvg=76.67;
存取結構 (2) 結構中的成員可以透過點運算符號 . 進行存取. 例子1: 建立一個存放學生資料的結構. 例子2: 一開始就給結構初始值. 例子3: 輸入某學生的出生日期, 姓名及學號.
結構與指標 (1) struct student { char name[20]; int num; }; struct student *stud;
結構與指標 (2) 若要存取結構指標變數的成員, 必須使用下列的方法: student->name; 或 輸入一個學生的資料, 並且將他輸出
結構陣列 利用結構可以存放個人的許多資料, 若宣告成陣列的話,則可以存放一群人的資料. struct { char name[20]; int num; } class[40]; class[0].name : 第一個成員的name元素 class[0].num : 第一個成員的num元素 …..以此類推
結構陣列的記憶體內容 struct student John; struct student IM[50];
例子 輸入三個學生的學號,姓名及成績並列印出來.
巢狀結構 結構中的成員也是結構時, 可以用巢狀結構來處理. 例子
結構與函式 當函式的參數的型式為結構時,將結構型態傳給函式的方式將和一般的資料型態相同. 例子1: 個別傳送結構成員 例子2: 整個結構傳送 例子3: 輸入5個學生的資料,並輸出
練習 建立一個員工結構, 裡面有 name, age, address, salary, phone的資料結構. 由使用者輸入5個員工資料.
聯合 (union) 聯合與結構相當類似,兩者之間的差異在於結構中的資料型態必須佔用不同的記憶體空間,而聯合可以使不同的資料型態佔用相同的記憶體空間. 聯合變數的長度是其中的最大值. union { int one; float two; } num;
聯合 (union) 與結構 union u_member { short int id; int income; }John; struct s_member { short int id; int income; }Mary;
例子 利用sizeof()比較結構和聯合在記憶體中所佔空間的差異. 輸入一個員工的加班時數及正常上班時數,並計算出該員工薪資.
enum列舉集合 希望變數內容被侷限在某些合法的範圍內,此時,我們可以將所有可能的狀況列舉出來,並透過C語言提供的進階資料結構enum來加以宣告。 定義語法 enum 列舉資料型態名稱{ 此資料型態內所有可能的成員 }; enum manufacturer { IBM, MAXTOR,WD,SEAGATE }; enum manufacturer HardDisk; enum 列舉資料型態名稱{ 此資料型態內所有可能的成員 }變數1,變數2,….; enum animal { dog,cat,bird } pet;
練習 改寫例子 例子 列舉成員 IBM MAXTOR WD SEAGATE 序號 1 2 3 列舉成員 IBM MAXTOR WD 1 2 3 enum manufacturer {IBM=1,MAXTOR,WD=10,SEAGATE}; 列舉成員 IBM MAXTOR WD SEAGATE 序號 1 2 10 11
今天學到了什麼 如何使用資料型態別名 (typedef) 如何使用結構(Structure) 如何使用結構陣列 如何使用結構與函式 如何使用聯合(Union) 如何使用列舉資料型態 (enum)