Anúncio

C語言列舉與聯合

Associate Professor em Personal Studio
28 de Jul de 2021
Anúncio

Mais conteúdo relacionado

Mais de 吳錫修 (ShyiShiou Wu) (20)

Anúncio

Último(20)

C語言列舉與聯合

  1. 列舉與聯合  列舉資料型別  聯合資料型別 Revised on July 28, 2021
  2. Make each day count  先前討論過,為了提高程式的易讀性及方便維護,可使用 #define 前 置處理指令定義常數,每個常數符號必須使用#define個別定義 #define PI 3.14159 #define TRUE 1 #define FALSE 0 #define AUTHOR "Wu, ShyiShiou"  列舉資料可以將⼀組整數常數定義成⼀組有意義的常數符號  雖然 #define 指令⼀次只能定義⼀個常數,但允許定義符點數常數 列舉資料型別enum 1/6 2
  3. Make each day count  enum 用來定義列舉資料,語法如下: enum 列舉名稱 { 成員名稱, 成員名稱 = 整數常數, 成員名稱, ... };  成員名稱後面沒有指定整數常數時,其整數常數值規則如下  如果為第⼀個時,整數常數值為0  如果不是第⼀個時,其整數常數值為上⼀個成員的整數常數值加 enum color { black, //black = 0 white, //white = 1 blue = 5, red, //red = 6 yellow //yellow = 7 }; 列舉資料型別enum 2/6 3
  4. Make each day count  定義完成列舉資料型別,即可用來宣告列舉變數,例如: enum color mycolor;  也可在定義列舉資料型別時⼀併宣告列舉變數 enum color { black, //black = 0 white, //white = 1 blue = 5, red, //red = 6 yellow //yellow = 7 } mycolor; 列舉資料型別enum 3/6 4
  5. Make each day count  常見的列舉定義 enum boolean {FLASE, TRUE}; enum number {ZERO, ONE, TWO, THREE, FOUR, FIVE}; enum number {CLUB, DIAMOND, HEART, SPADE}; enum direction {EAST, WEST, SOUTH, NORTH}; enum month {Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}; 列舉資料型別enum 4/6 5
  6. Make each day count #include <stdio.h> #include <stdlib.h> enum months{Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}; void test_enum(){ int month = -1, day = 0; printf("輸入今天日期(mm/dd):"); scanf("%d/%d", &month, &day); switch(month){ case Jan: printf("%d月 ⼜是新的⼀年", Jan); break; case Feb: printf("⻄洋情⼈節在%d月", Feb); break; case Mar: printf("%d月 春暖花開的季節", Mar); break; case Apr: printf("%d月 清明節祭祀祖先慎終追遠", Apr); break; 列舉資料型別enum 5/6 6
  7. Make each day count case May: printf("%d月 第⼆個星期日為⺟親節", May); break; case Jun: printf("%d月 期末考到了", Jun); break; case Jul: case Aug: printf("7,8月放暑假囉"); break; case Sep: case Oct: case Nov: printf("9, 10, 11月秋高氣爽"); break; case Dec: printf("%d月來臨,聖誕節快到了", Dec); break; default: printf("資料錯誤n"); } } 列舉資料型別enum 6/6 7
  8. Make each day count  在先前單元討論過,當宣告⼀個變數,就會在電腦的記憶體 (memory) 保留⼀個合適的空間,用來儲存變數資料  不同類型資料,所需要的儲存空間大小也不同,所以在宣告變數時要告知 預計用這個變數來儲存什麼樣的資料 聯合資料型別union 1/7 8 資料型態 說明 記憶體空間 (bytes) char 字元 1 short int 短整數 2 int 整數 4 float 單精度浮點數 4 double 倍精度浮點數 8 long double ⻑倍精度浮點數 10 array 陣列 陣列元素資料型別空間×陣列⻑度
  9. Make each day count  union 是由 struct 結構衍生出來的資料型別  union 用來定義聯合資料,語法如下: union 聯合名稱 { 資料型別 欄位名稱1, 資料型別 欄位名稱2, ... };  例如: union student { char name[10]; char subject[10]; float percentage; };  定義完成聯合資料型別,即可用來宣告聯合變數,例如: union student s1; 聯合資料型別union 2/7 9
  10. Make each day count  也可在定義聯合資料型別時⼀併宣告聯合變數 union 聯合名稱 { 資料型別 欄位名稱1, 資料型別 欄位名稱2, ... }聯合變數1, 聯合變數2;  例如: union student { char name[10]; char subject[10]; float percentage; } s1, s2;  要存取聯合變數欄位資料時,⼀樣使用「⋅」點運算子,例如: s1.percentage = 85.0; 聯合資料型別union 3/7 10
  11. Make each day count struct sdata { char name[10]; char subject[10]; float percentage; }; union sdata { char name[10]; char subject[10]; float percentage; }; 聯合資料型別union 4/7 11 name subject percentage 10bytes m 10bytes 4bytes m+10 m+20 10bytes m name subject percentage 4bytes  struct 結構中的每個欄位都會配置各自獨立的記憶體空間,但 union 中的各欄位則是共同擁有記憶體空間。當宣告⼀個 union 變數時,編 譯器會找出 union 中最大記憶體空間的欄位,並以此空間配置記憶體, 供全部欄位⼀起共用
  12. Make each day count #include <stdio.h> #include <string.h> union udata { char name[10]; char subject[10]; float percentage; } u_record; struct sdata { char name[10]; char subject[10]; float percentage; } s_record; 聯合資料型別union 5/7 12
  13. Make each day count void test_union() { strcpy(s_record.name, "Raju"); printf(" Name : %s n", s_record.name); strcpy(s_record.subject, "Maths"); printf(" Name : %s n", s_record.name); printf(" Subject : %s n", s_record.subject); s_record.percentage = 86.50; printf(" Name : %s n", s_record.name); printf(" Subject : %s n", s_record.subject); printf(" Percentage : %f n", s_record.percentage); strcpy(u_record.name, "Raju"); printf("n Name : %s n", u_record.name); strcpy(u_record.subject, "Maths"); printf(" Name : %s n", u_record.name); printf(" Subject : %s n", u_record.subject); u_record.percentage = 86.50; printf(" Name : %s n", u_record.name); printf(" Subject : %s n", u_record.subject); printf(" Percentage : %f n", u_record.percentage); } 聯合資料型別union 6/7 13
  14. Make each day count #include <stdio.h> #include <string.h> union udata { char byte[4]; short int word[2]; int value; } u_value; void test_union2() { u_value.value = 0x12345678; printf("0x%xn", u_value.byte[0]); printf("0x%xn", u_value.word[0]); printf("0x%xn", u_value.word[1]); printf("0x%xn", u_value.value); } 聯合資料型別union 7/7 14
Anúncio