STRUCTURE 授課:ANT 日期:2011/4/25
OUTLINE 什麼是結構? 結構的定義、宣告以及使用 巢狀結構(nested structure) 結構陣列 指向結構的指標 結構當作引述傳遞到函數 Lab08 HW08
什麼是結構? 指能夠結合多個彼此相關的變數在一個名稱之下,且可以包含數個不 同資料型態的變數。 結構是一種使用者自定的型態,它可將不同的資料型態串在一起。 姓名 char[4] 電話 long 資料型態 年齡 int 住址 char[30] …..
結構的定義、宣告以及使用 格式: struct 結構型態名稱 { 欄項資料型態 欄項變數名稱; : : } 變數Ⅰ,變數Ⅱ……; 欄項資料型態 欄項變數名稱; : : } 變數Ⅰ,變數Ⅱ……; struct 是定義結構 EXAMPLE CODE: struct Student_PersonalData { char name[4]; int age; char address[30]; } SP_Data;
結構的定義、宣告以及使用 當我們宣告 struct team { int number ; char classroom ; char name[30]; }g1 , g2 ; g1 , g2 是struct team的變數,在記憶體裡是有分配位置的。互不相干擾。 g1的資料成員有 g2的資料成員有 number classroom name
成員們一個值 struct team { int number ; char classroom ; }student ; Student.number = 3; Student.classroom = ‘5’;
小範例 用 . 存取結構變數成員 printf( "%d", student.math ); #include <stdio.h> #include <stdlib.h> int main(void){ struct data{ char name[10]; int math; }student; printf("input your name:"); scanf("%s", student.name); printf("input your math points:"); scanf("%d", &student.math); printf("Name: %s\n", student.name); printf("Points: %d\n", student.math); system("pause"); return 0; } 用 . 存取結構變數成員 printf( "%d", student.math );
結構的定義、宣告以及使用 如何給定初值 將一個結構變數的值給另一個相同結構的變數 #include <stdio.h> #include <stdlib.h> int main(){ struct data{ char name[10]; int math; }s1 = {"aaa", 83}; struct data s2; s2 = s1; printf("s1.name = %s, s1.math = %d\n", s1.name, s1.math); printf("s2.name = %s, s2.math = %d\n", s2.name, s2.math); system("pause"); return 0; } Break point
另一種定義方式 若嫌每次定義struct變數還要寫struct這個字 就像宣告結構變數時會用 struct data s2; 可以用typedef來做宣告,宣告方式如下 typedef struct{ char name[10]; int math; }data; 當你要宣告一個結構實只要用 data s1 = {"aaa",99} , s2; s1有給初始值,s2沒有。
兩種定義方式比較
細節注意 結構不能包含自己這種結構的資料,但可以有指向自己這種結構的指 標(後面投影片講解) struct A { struct A { struct A a; struct A *a; }; }; (錯誤的寫法) (可行的寫法) struct僅僅定義型態,並未宣告變數,所以不佔記憶體空間
巢狀結構(NESTED STRUCTURE) 格式: struct 結構名稱1 { 成員型別1 成員名稱1; 成員型別2 成員名稱2; 成員型別3 成員名稱3; }; struct 結構名稱2 { 結構名稱1 成員名稱11; 成員型別2 成員名稱21; 成員型別3 成員名稱31; }; struct 結構名稱2 結構變數; //宣告結構變數 結構變數 = { { 成員 1 的值 ,成員 2 的值 , 成員 3 的值 } , 成員21的值 , 成員31的值}; //給予初始值 定義巢狀結構
範例 #include <stdio.h> #include <stdlib.h> int main(){ struct data{ int month; int day; }; struct data1{ char name[10]; int math; struct data birthday; struct data1 s1 = {"aaa", 74, {10, 2}}; printf("Name: %s\n", s1.name); printf("Points: %d\n", s1.math); printf("Birthday: %d month %d day\n", s1.birthday.month, s1.birthday.day); return 0; } 給予初始值要注意,有定義哪些變數成員
結構陣列 連同結構一起宣告的方式。 格式: struct 結構型態名稱 { 欄項資料型態 欄項變數名稱; : : }變數名稱[元素個數]; 欄項資料型態 欄項變數名稱; : : }變數名稱[元素個數]; 或者先宣告structure,再另外宣告結構變數 struct 結構型態 變數名稱[元素個數];
範例 #include <stdio.h> #include <stdlib.h> #define MAX 2 int main(){ int i , j; struct data { char name[10]; int math; }student[MAX]={ {0} , 0}; //給予字元陣列name以及變數math初始值 for(i = 0; i< MAX; i++) printf("input name:\n"); scanf("%s", student[i].name); printf("input points:\n"); scanf("%d", &student[i].math); } for(j = 0; j < MAX; j++) printf("%s的數學成績=> %d\n", student[j].name, student[j].math); return 0;
指向結構的指標 先宣告好結構,如下 struct data{ int number; char name[10]; }; 接著以下方式宣告指標來指向結構 struct data *mydataptr; 如果要取得指標mydataptr所指的資料成員name,語法為mydataptr->name printf("%s", mydataptr->name); mydataptr->number 與( *mydataptr ).number是一樣的
範例 #include <stdio.h> #include <stdlib.h> int main(){ struct data{ char name[10]; int math; int eng; }student={' ',0,0}, *ptr; ptr = &student; /*將ptr指向變數student的位址*/ printf("Student Name:"); scanf("%s", ptr->name); printf("Math Points:"); scanf("%d", &ptr->math); printf("English Points:"); scanf("%d", &ptr->eng); printf("數學:%d 英文:%d 兩科的平均:%.2f\n", ptr->math, ptr->eng, (ptr->math + ptr- >eng) / 2.0); printf("數學:%d 英文:%d 兩科的平均:%.2f\n", student.math, student.eng, (student.math + student.eng) / 2.0); return 0; }
結構當作引述傳遞到函數 #include <stdio.h> #include <stdlib.h> struct data{ char name[10]; int math; }; /*不管在哪個function都可以使用這個變數結構來宣告結構變數*/ /*副程式的宣告,必定要放在struct data宣告後,因函式宣告用到struct*/ void display(struct data); int main(){ struct data s1 = {"aaa", 74}; display(s1); return 0; } void display(struct data s){ printf("Name: %s\n", s.name); printf("Points: %d\n", s.math);
函數回傳值亦可為STRUCT型態
LAB08 此程式須包含2個structure變數。 第一個structure變數為學生的編號num以及數學成 績score(自己輸入) ex 12 60 第二個structure變數為學生的編號num以及英文成 績score(自己輸入) ex 12 80 寫一支副函式,將同一個人的其兩項成績做平均後, 用在副函式新宣告structure變數儲存,傳回存有運 算後學生編號與平均成績的structure回傳至主函式 做印出。如果編號不對則印出error message。 Hint: structure用全域變數結構(p.16)
LAB08結果圖示
HW08 建立一時間結構time,其成員包括hour(小時)、 minutes(分)及second(秒),其中hour與minutes的形態 皆為int,而second的型態則為double。 宣告一個結構time型態的變數start,並設定初值為{12 , 32 , 25.49} 宣告一個結構time型態的變數end,並設定初值為{15 , 12 , 17.53} 以hh:mm:ss.ss的格式印出結構start與end的值。 hh代 表小時,佔有2格;mm代表分,佔有2格;ss.ss代表秒, 其中秒數部分, 整數與小數部分皆均取兩位。 Ex 05:19:20.43代表了5小時19分20.43秒 試計算從start開始到end結束, 共歷經多少時間, 歷經 時間請用另一個結構變數elapse儲存, 並以hh:mm:ss.ss 的格式印出
HW08結果圖示