狠狠撸

狠狠撸Share a Scribd company logo
列舉與聯合
? 列舉資料型別
? 聯合資料型別
Revised on July 28, 2021
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
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
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
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
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
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
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 陣列 陣列元素資料型別空間×陣列?度
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
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
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 中最大記憶體空間的欄位,並以此空間配置記憶體,
供全部欄位?起共用
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
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
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

More Related Content

颁语言列举与联合

  • 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