749922617c6ca928abd51ddb0adec94d.ppt
- Количество слайдов: 101
書名:輕鬆學習C語言TOC • 作者:陳澤雄、蕭宗志、林國任、黃珮瑩、黃佑民 • 出版社:旗標出版股份有限公司 CIT F. 4: 2 -9, 12, 14, 18 -152, 160, 167 -201 (2011 Q 1_ME 2008: : Ch 4~~7 Only ==Week 09. Me 2008) 1
第四章 運算式與運算符號 • 運算式組成元素(Expression 3+4) • 運算子 (Operators +-*/) 2
運算式組成元素 • 運算式一般分為三類: – 算術運算式 (a+b) – 關係運算式 (a>b) – 邏輯運算式 (and or not) • 由運算元(operands)和運算子(operators)組成 – 例如: a = 1+2 -1 – 『a』、『1』、『2』就是運算式的運算元。 – 『=』、『+』、『-』就是運算式的運算子。 3
各種運算子 1. 算術運算子(Arithmetic Operator) 2. 位移運算子(Shift Operator) 3. 位元運算子(Bitwise Operator) 4. 關係運算子(Relational Operator) 5. 邏輯運算子(Logical Operator) 6. 累計運算子(Increment and Decrement Operator) 7. 指定運算子(Assignment Operator) 8. 條件運算子(Conditional Operator) 9. sizeof 運算子 4
算術運算子(Arithmetic Operator) 運算 子 + * / % 功能敘述 a+b(和 ) a-b(差 ) a b(積 ) a b(商 ) a b(取 餘數 ),又稱為mod 5
位移運算子(Shift Operator) • 位移運算,就是把位元 (bit) 向左移 (<< )或是 向右移 (>> )幾個位置。 • 向左移 n個位元,就相當於 乘 2 n ; 向右移 n個位元,相當於 除以 2 n。 運算子 使用方式 功能敘述 >> x >> n 將x向右移n個位元 << x << n 將x向左移n個位元 6
Ch 4_2 使用位移運算子 Ch 4_2 1 #include<stdio. h> 2 main(){ 5 << 2 = 20 3 int a = 5, b = 13; 13 >> 1 = 6 4 a = a << 2; 5 b = b >> 1; 6 printf(" 5 << 2 = %i n", a); 7 printf("13 >> 1 = %i n", b); 8 } 7
位元運算子(Bitwise Operator) 運算子 使用方式 功能敘述 & i & j i AND j | i | j i OR j ^ i ^ j i XOR j ~ ~ i NOT i 8
Ch 4_3 基本位元運算子運算 Ch 4_3 1 #include<stdio. h> 2 main(){ 3 int A = 3, B = 5; A & B = 1 A | B = 7 A ^ B = 6 ~A = -4 4 printf("A & B = %i n", A & B); 5 printf("A | B = %i n", A | B); 6 printf("A ^ B = %i n", A ^ B); 7 printf(" ~A = %i n", ~A ); 8 } 9
Ch 4_3的說明 0011(2) 3(10) &(AND) 0101(2) 5(10) 0001(2) 1(10) 0011(2) 3(10) |(OR) 0101(2) 5(10) 0111(2) 7(10) 0011(2) 3(10) ^(XOR) 0101(2) 5(10) 0110(2) 6(10) 10
關係運算子(Relational Operator) 運算子 > < >= <= == != 使用方式 a>b a<b a>=b a<=b a==b a!=b 功能敘述 a>b a<b a b a=b a b 11
Ch 4_4 關係運算子 3 > 5 = 0 3 < 5 = 1 3 >= 5 = 0 Ch 4_4 判斷真假 True(1)/False(0) 3 <= 5 = 1 1 #include<stdio. h> 3 == 5 = 0 2 main(){ 3 != 5 = 1 3 int i=3, j=5; 4 printf ("%i> %i = %in", i, j, i>j); 5 printf ("%i< %i = %in", i, j, i<j); 6 printf ("%i>=%i = %in", i, j, i>=j); 7 printf ("%i<=%i = %in", i, j, i<=j); 8 printf ("%i==%i = %in", i, j, i==j); 9 printf ("%i!=%i = %in", i, j, i!=j); 0 } 12
邏輯運算子(Logical Operator) 運算子 功能敘述 && i&&j i AND j || i||j i OR j ! • 邏輯運算子包括 – && (邏輯 AND) – || (邏輯 OR) – ! (NOT) 使用方式 !i NOT i • "邏輯的 AND、 OR、 NOT" 的真值表如下: AND 1 0 OR 1 0 1 1 1 0 0 1 0 Black Friday: 某月13日 及 星期五 NOT 1 0 0 1 char ans='N': if (! (ans=='N')) … Leap Year: if( (yy%400==0) || (yy%4==0 && yy%100!=0) ) … 13
Ch 4_5 邏輯運算子的應用 a=15 b=5 1 int a=5, b=10; 2 if (b%a==0 && a<=b) a=a+b; 3 if (a<10 || a>b) b=a-b; 4 printf ("a=%i b=%in", a, b); a=4 b=40 6 a=4; b=5; 7 if (!(a>b)) b=a+b; 8 if (a>b) a=b*10; else b=a*10; 9 printf ("a=%i b=%in", a, b); 14
累計運算子 • 累計運算子包含 – 增量運算子(Increment Operator ++) – 減量運算子(Decrement Operator – –) • 增量 (++)與減量 (--)運算子寫在 operand的前後,所 產生的效果也將不同。 1. 前置 模式 :是將 ++或 --置於變數之前, 是在使用此運算元之前先進行加 1或減 1之動作。 2. 後置 模式 :是將 ++或 --置於變數之後, 是在使用此運算元之後才進行加 1或減 1之動作。 15
Ch 4_6 累計運算子 Ch 4_6 寫在運算元 之前 與寫在 之後 的不同 1 #include<stdio. h> 2 main(){ 4 int a=1, b=1, c=2, d=2; 5 printf(" ++a = %in", ++a); 6 printf(" --b = %in", --b); 7 printf(" c++ = %in", c++); 8 printf(" d-- = %in", d--); 9 } ++a = 2 --b = 0 c++ = 2 d-- = 2 16
指定運算子(Assignment Operator) • 指定運算子『=』它會把右邊運算式的值指定 給左邊的變數。例如: x = y = z = 8; /* z=8; y=z; x=y; */ • 指定運算子『=』左邊必須是一個單一變數, 而不能是數值、函式、 複合運算式 (如 x + y = z,即是錯的敘述)。 17
Ch 4_7 指定運算子的使用 Ch 4_7 t = 5 1 #include<stdio. h> t = 3 ? ? 2 main(){ 4 int t = 5; 5 printf(" t = %in", t); 6 t = 3. 1415; 7 printf(" t = %in", t); 8 } 18
複合式指定運算子 (縮寫) 運算子 += -= *= /= %= ^= 使用方式 i+=j; i-=j; i*=j; i/=j; i%=j; i^=j; i=10; j=20; 等同 i=i+j; i=i-j; i=i*j; i=i/j; i=i%j; i=i^j; i=30; j=20; 19
條件運算子(Conditional Operator) • • • 條件運算子『? :』的功能 與流程控制中的if-else敘述功能相同, 可以代替簡單的if-else指令。 語法: (條件的敘述) ? 敘述ㄧ : 敘述二; 例如: (x>1) ? x=x+1 : x=x-1; if(x>1) x=x+1; else x=x-1; x = (x>1) ? x+1 : x-1; 20
Ch 4_9 輸入任意二數,並且輸出較大值及較小值 1 #include<stdio. h> 輸入兩個數: 11 32 2 main(){ 大數是: 32 4 int a, b, p, q; 小數是: 11 5 printf("輸入兩個數:"); 6 scanf("%i%i", &a, &b); 7 8 9 10 11 } p = (a>b) ? a: b; printf("大數是: %i n", p); q = (a<b) ? a: b; printf("小數是: %i n", q); 21
sizeof運算子 • sizeof 運算子是用來算出各種資料型態 所佔用的空間(單位為bytes)。 • 語法 – sizeof (資料型態) • 例如:記憶體配置大小 – sizeof(a) – sizeof('A') – sizeof(float) 22
Ch 4_11 sizeof Ch 4_11 計算一字串所佔記憶體的位元組 數 1 #include<stdio. h> 2 main(){ 3 char str[] = "THANK YOU"; 4 printf("%s 的長度為:%i bytesn", str, sizeof(str)); 5 } THANK YOU 的長度為: 10 bytes 23
運算子的優先順序與結合性 運算子 () [] ->. 運算子 一次 結合性 L ! ~ ++ -- + - * & sizeof 單向 R * / % 乘除法 L + - 加減法 L << >> 位移 L < <= > >= 比較關係 L == != 邏輯等值 L & ^ | 位元 L && || 邏輯 L ? : 條件 R = += -= /= %= &= ^= |= <<= >>= 複合 R , 逗號 L 24
Ch 4_13 運算子的優先順序 1 #include<stdio. h> 2 main(){ 3 int a=5, b=4, c=2; 4 int m, n; 5 6 7 8 9 } 加 括號 最清楚 m = a > b != c; n = a > b && c>a || a<b; printf ("m=%i n", m); printf ("n=%i n", n); m=1 n=0 25
Ch 4_13的說明 1. a > b != c → 5 > 4 != 2 → 1 2. a > b && c > a || a < b → 5 > 4 && 2 > 5 || 5 < 4 → 1 && 0 || 0 → 0 26
第五章 迴路敘述 (重複執行) 5 -1 5 -2 5 -3 for ( ; ; ){ … } while { … } do { … } while (…); 27
for敘述 • for的敘述 是最常見的迴路敘述, 其特性在於可以有彈性的控制迴路的執行次數 • for的語法 for(起始運算式; 條件運算式; 累加運算式) { 敘述; } 28
0123456789 for的流程圖 i=0 條件 i<10 false true print(i) i++ 結束 29
Ch 5_1 for Ch 5_1 列印出 0到 9之間的數 1 #include<stdio. h> i=0; printf ("%2 d", 0); 2 main(){ i=1; printf ("%2 d", 1); 只要 3 int i; i<10 i=2; printf ("%2 d", 2); … 4 i=0; i=8; printf ("%2 d", 8); 5 for (i=0; i<10; i++) { i=9; printf ("%2 d", 9); 6 printf("%2 d", i); i=10; 7 i++; 8 } 0 1 2 3 4 5 6 7 8 9 9 } 30
Ch 5_1 流程圖 a=0 a<=9 N Y print a a ++ 結束 31
Ch 5_2 for Ch 5_2 計算 sum = 1 + 2 + 3 +. . . + 99 + 100 1 #include<stdio. h> i=1; sum = sum+1; 2 main(){ i=2; sum = sum+2; i=3; sum = sum+3; 3 int i, sum=0; … 4 for (i=1; i<=100; i++){ i=99; sum = sum+99; i=100; sum = sum+100; sum += i; 5 6 } 7 printf(" Sum = %in", sum); 8 } Sum = 5050 32
Ch 5_2 流程圖 i=1, sum=0 i<=10 0 Y N sum += i i++ print sum 33
Ch 5_3 factorial Ch 5_3 計算 1 * 2 * 3 *. . . * n 的值 1 #include<stdio. h> fact = fact*1; fact = fact*2; 2 main(){ fact = fact*3; … 3 int n, i, fact=1; fact = fact*n; 4 scanf("%i", &n); 5 for (i=1; i<=n ; i++){ 6 fact *= i; 7 } 4 8 printf("%i! = %in", n, fact); 4!=24 9 } 34
Ch 5_3 流程圖 input n i=1, fact=1 i <= n N Y fact *= i i++ print fact 35
for的無窮迴路 infinite loop 有心的 無意的 • for的無窮迴路敘述 當程式一直執行相同的迴路, 而無法跳出時,稱為無窮迴路。 • for的無窮迴路語法 for( ; ; ){ 敘述; } 36
Ch 5_5 無窮迴路 輸出? ? 10 11 12 … 99 … so good Ch 5_5 1 #include<stdio. h> so good 2 main(){ 3 int i; 4 for(i=10 ; i>8 ; i++){ 5 printf("%i so goodn", i); 6 } 7 } 起初 只要 i=10 i>8 37
Ch 5_5 流程圖 i = 10 i > 8 Y print so good i ++ N 結束 38
for的巢狀結構 Nested For (for中有for) – 巢狀結構就是在迴路中包含另一個迴路 – for()巢狀結構分為內、外層迴路 – 程式會先執行外層迴路的起始運算式 – 接著執行外層迴路的條件運算式 – 其次才是內層迴路,內層迴路執行完後 – 最後才是外層迴路的累加運算式 39
for巢狀結構之語法 for(起始運算式 1; 條件運算式 1; 累加運算式 1) { 敘述 1; /*外層迴路*/ } for(起始運算式 2; 條件運算式 2; 累加運算式 2) { 敘述 2; /*內層迴 路*/ } 40
for巢狀結構的使用 • 此為允許的for巢狀結構 • 此為不允許的for巢狀結構 41
Ch 5_6 Nested For Ch 5_6 列印 5 5的倒直角三角形 1 #include<stdio. h> 2 main(){ 3 int i, j; 4 for(i=5; i>0; i--){ for(j=i; j>0; j--){ 5 printf("*"); 6 } 7 printf("n"); 8 9 } 0 } (i=5) (i=4) (i=3) (i=2) (i=1) j=5, 4, 3, 2, 1 j=3, 2, 1 j=1 ***** * 42
Ch 5_7 九九乘法表 Ch 5_7 1 #include<stdio. h> 2 main(){ 4 int i, j; 5 for (i=1; i<=9; i++) { 7 for (j=1; j<=9; j++) { 9 printf("%3 d", i*j); 10 } 11 printf("n"); 12 } 13 } (i=1)j=1, 2, 3, . . , 9 (i=2)j=1, 2, 3, . . , 9 (i=3)j=1, 2, 3, . . , 9. . . (i=9)j=1, 2, 3, . . , 9 (i=10) 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 43
while敘述 • while的敘述 – while敘述執行時會先判斷條件式是否為真 – 若為真,則執行以下之敘述 – 若為假,則跳出while敘述 • while的語法 while(條件判斷式) { 敘述; } 44
while敘述的流程圖 條件 i<10 N Y print(i) i++ 結束 45
Ch 5_9 while Ch 5_9 計算出 1加至 100 (i=1) sum=sum+1; (i=2) sum=sum+2; 1 #include<stdio. h> (i=3) sum=sum+3; 2 main(){. . . 3 int i=1, sum=0; (i=99) sum=sum+99; 4 While (i<=100){ (i=100) sum=sum+100; (i=101) 5 sum = sum +i; 6 i++; 7 } 8 printf("sum = %in", sum); 9 } sum = 5050 46
Ch 5_10 while迴路的應用 —計算 2的 n次方的 值 2 int n=1, power = 1; 3 printf(" nt 2的 n次方 n"); 4 while (n<=10){ power *= 2; 5 printf("%2 i t %i n", 6 n, power); 7 n++; 8 } n 1 2 3 4 5 6 7 8 9 10 2的 n次方 2 4 8 16 32 64 128 256 512 1024 47
while巢狀結構的語法 while (條件判斷式 1) { /*外層迴路 */ 敘述 1; } while(條件判斷式 2) { 路*/ 敘述 2; } /*內層迴 48
while巢狀結構的流程圖 N 條件 i<10 Y i++; j=i; 條件 j<10 Y j++ N 結束 49
do while敘述 • do while的敘述 – do while會先執行迴路中的敘述 – 再判斷條件式是否成立 – 不論條件判斷式成立與否,do-while中的敘述最少 會執行一次 • 語法 do{ 敘述; }while (條件判斷式); 50
do{…} while(…) 之流程圖 print(i++); yes 條件 i<10 no 51
Ch 5_11 do-while 1 int j=0; do{ printf("Hellon"); j++; }while(j<5); 2 int j=0; do{ printf("Hellon"); }while(j<5); 3 int j=0; do{ printf("Hellon"); }while(j>5); Hello Hello … Hello 52
第六章 選擇性敘述 • 有條件的選擇敘述 • 多重條件選擇敘述 • 無條件選擇敘述 53
有條件的選擇敘述 • 有條件的選擇敘述即為if敘述,其語法如下: • 語法一 if (條件運算式) 敘述; 條件 • 流程圖 運算式 yes no 敘述 1 54
有條件的選擇敘述 • 語法二 if (條件運算式){ 敘述 1 ; 敘述 2 ; ... 敘述 n ; } 如果敘述超過一個以上,則須以{ }來隔開, 如果沒有括號只會執行最接近的那一行敘述。 55
有條件的選擇敘述的流程圖 yes 條件運算式 no 敘述 1 敘述 2 . . . 敘述 n 56
Ch 6_1 if Ch 6_1 輸入 a, b兩個數,判斷並將 a, b由大到小排列 1 #include<stdio. h> input two integers: 4 3 2 main(){ 由大到小排列: 4 3 3 int a, b, t; 4 printf ("input two integers: "); 5 scanf("%i%i", &a, &b); 6 if(a<b){ 7 t = a; t a b t 8 a = b; 9 b = t; 10 } 11 printf("由大到小排列:%i%in", a, b); 12 } 57
Ch 6_1 • 程式執行結果 input two integers: 3 4 由大到小排列: 4 3 第 1步 • 說明 a 3 4 b 第 2 步 4 3 t if(a<b){ t = a; a = b; b = t; } 3 第 3步 58
if-else多重條件選擇 • 語法一 if (條件運算式) 敘述 1 ; else 敘述 2; score>=50 • 流程圖 yes 條件 運算式 no 敘述 1 敘述 2 pass fail 59
Ch 6_3 輸入兩個整數,並計算 兩個整數之差 int n 1, n 2, ans; printf("input two integers: "); scanf("%i%i", &n 1, &n 2); if(n 1>=n 2) ans = n 1 -n 2; else ans = n 2 -n 1; ans = abs(n 1 -n 2); printf("兩數之差為:%in", ans); input two integers: 25 78 兩數之差為: 53 60
Ch 6_4 輸入一個年份,測試其是否為閏年 int yy; printf("Input a year: "); scanf("%i", &yy); Input a year: 1900 is not a leap year Input a year: 2000 is a leap year if((yy%400==0)|| if( (yy%4==0 && yy%100!=0)) printf("%i is a leap yearn", yy); else printf("%i is not a leap yearn", yy); 61
if-else 兩重條件選擇 • 語法二 if (條件運算式){ 敘述 1 ; 敘述 2 ; ... 敘述 n ; }else { 敘述 a ; 敘述 b ; ... 敘述 z ; } 62
if-else 多重條件選擇 • 語法三 if (條件運算式 1) 敘述 1 ; else if (條件運算式 2) 敘述 2 ; ... else 敘述 n ; Jan Feb Mar Apr May Jun 31 28 31 30 • else會和最接近且與之配對的if一起使用。 63
if-else多重條件選擇的流程圖 no 2月 條件運算式 1 4, 6, 9, 11月 no 條件運算式 2 yes . . . yes 敘述 1 28天 敘述 2 30天 敘述 n 31天 64
Ch 6_5 (1/2) Ch 6_5 輸入 作時數 及 時薪 ,計算每週薪資 1 #include<stdio. h> 2 main(){ 3 int work_time, time_pay, salary, ot; 4 printf("請輸入每週 作時數: "); 5 scanf("%i", &work_time); 6 printf("請輸入時薪:"); 7 scanf("%i", &time_pay); … 請輸入每週 作 時數 : 45 請輸入 時薪 : 100 65
Ch 6_5 (2/2) 10 if (work_time > 40) { 11 ot = work_time - 40; 11 12 12 if (ot > 10) 13 13 salary = 40*time_pay + 10*time_pay*1. 5 + (ot-10)*time_pay*2; 14 14 else 15 15 salary = 40*time_pay + ot*time_pay*1. 5; 17 }else 18 salary = work_time * time_pay; 19 printf("每週的薪金是 %i元 n", salary); 20 } 66
switch-case 多重條件選擇的語法 switch (house){ case 'L': printf("Luthern"); break; case 'M': printf("Moodyn"); break; default: printf("Unknownn"); break; } 67
switch-case多重條件選擇的流程圖 switch(運算式 ) case 常數 1 yes 敘述 1 break yes 敘述 2 break yes 敘述 n break no case 常數 2 no ‧ ‧ ‧ default 68
Ch 6_7 (1/2) Ch 6_7 輸入一個整數,並輸出所輸入的數除以 5之 餘數 1 #include<stdio. h> 2 main(){ 3 int num; 4 printf("Please input an integer: "); 5 scanf("%i", &num); 6 switch(num%5){ 7 case 0: 8 printf("%i可被 5整除。n", num); 9 break; 10 case 1: 11 printf("%i除以 5的餘數為 1。 n", num); 12 break; 69
Ch 6_7 (2/2) Please input an integer: 56 56除以 5的餘數為 1 15 case 2: 16 printf("%i除以 5的餘數為 2。 n", num); 17 break; 18 case 3: 19 printf("%i除以 5的餘數為 3。 n", num); 20 break; 21 case 4: 22 printf("%i除以 5的餘數為 4。 n", num); 23 break; 24 } 25 } 70
goto敘述 (不鼓勵使用) • goto敘述為無條件跳躍指令,不論處於何種狀況下都 會將程式執行的控制權無條件地轉移到所指定的標籤 處,然後繼續往下執行。 • 語法一 goto 標籤 1; 敘述 1; 標籤 1: 敘述 2; • 語法二 標籤 2: 敘述 1; goto 標籤 2; 敘述 2; 71
Ch 6_8 不鼓勵使用goto Ch 6_8 計算從 1累加到 10的總和 1 #include<stdio. h> 2 main(){ 3 int i=1, sum=0; 4 loop: 5 sum += i; 6 i ++; 55 7 if(i <= 10) 8 goto loop; 9 printf("%i", sum); 10} 72
continue敘述 • 當遇到continue敘述時,便直接回到迴路開始的 地方,其下面的敘述將會被省略。 • continue敘述配合if條件,放在 – for的迴路 – while的迴路 – do-while的迴路 • 語法 for(起始運算式;條件運算式;累加運算式) { ... if (condition) continue; ... } 73
Ch 6_9 sum = 30 Ch 6_9 計算 sum = 2 + 4 + 6 + 8 + 10 1 #include<stdio. h> 2 main(){ 若i是單數, i++ 3 int i, sum=0; 4 for (i=1; i<=10; i++) { if(i%2==1) continue; 5 6 sum += i; 7 } 8 printf("sum = %in", sum); 9 } 只加雙數 74
break敘述 • break敘述有兩種用法: – 在switch敘述中扮演中斷case敘述的角色 – 強迫中斷一般迴路敘述如:for、while和do-while • 語法 for (i=0; i<10; i++) { sum += … if (sum>50) break; ... 跳出for-loop } 75
Ch 6_10 (1/2) T a i w a n U n i v e r s i t y Ch 6_10 搜尋 在字串中第一個與之 相符 的 字元 char string[20]="Taiwan University"; int i; char ch; for (i=0; i<strlen(string); i++) printf("%c", string[i]); printf("n請輸入要搜尋的字元: "); scanf("%c", &ch); for (i=0; i<strlen(string); i++) { if(string[i]==ch) break; // 找到了 } printf("%in", i); 76
Ch 6_10 (2/2) 16 if(i<strlen(string)) 17 printf("第 %i 個字元為 %cn", ++i, ch); 18 else 19 printf("找不到相符字元 n"); 20 } Taiwan University 請輸入要搜尋的字元: i 第 3 個字元為 i 請輸入要搜尋的字元: x 找不到 相符字元 77
第七章 函數 Functions 7 -1 函數的概念 7 -2 函數的基本形式 7 -3 函數的呼叫 7 -4 遞迴函數 7 -5 常用的數學函數 7 -6 儲存類別 78
函數 function 的概念 • 函數的優點 – 分 合作 – 較好的可讀性 – 便於修改、除錯 – 提高撰寫程式的效率 – 可以無限次使用(呼叫) • 函數可分成兩種型態 – 系統提供的標準函數 (e. g. toupper, rand, abs) – 使用者設計的函數 (e. g. drawline, min, max) 79
函數的基本形式 • 函數定義的語法 傳回值型態 函數名稱(參數傳遞) 參數傳遞型態 { 函數主體 } 80
Ch 7_2 x y z Ch 7_2 兩數的 平方差 的函數 A² B² 1 #include<stdio. h> a b a 2_b 2(…) int a 2_b 2(int x, int y){ 2 int z; 3 z = a*a – b*b; 4 3² 2² = 5 return z; 5 } 6 14² 6² = 160 7 main(){ 8 int a=3, b=2, c; 9 c = a 2_b 2(a, b); // 呼叫函 數 10 printf("%i² = %in", a, b, c); 11 } 81
函數呼叫的語法 • 語法 函數名稱(參數); • 說明 – 函數如果不需要呼叫參數, 則括號內的參數可以省略。 – 若參數包含一個以上時,需以逗號隔開。 – 呼叫與被呼叫的函數其參數是相對應的, 且型態要一致。 82
函數的傳回值 • 函數的傳回值,有以下幾種情況: – – – 函數沒有傳回值 ,傳回值型態為 void 函數傳回值為整數 (int)時 ,可以省略 函數有傳回值時 ,可以在傳回值上做運算 函數的傳回值型態應該和 return中的型態要一樣 使用return可以立即結束函數的執行 83
Ch 7_3 計算圓面積的函數 1 #include <stdio. h> 2 double area (float x) { 3 return 3. 1416* x * x; 4 } main(){ float r; double a; printf("Radius r: "); scanf("%f", &r); a = area(r); printf("The area is %fn", a); } x z r area(r) Radius r: 5 The area is 78. 540000 84
Ch 7_4 函數求平均值與 絕對值 float average(int t, int n){ if(n<=0) return 0; else return (float)t/n; } #include<stdio. h> main(){ int total=30, n=0; float c; c = average(total, n); printf("平 均 值 = %. 1 fn", c); } 平均值 = 0. 0 int abs(int x){ int y; if(x<0) y=–x; else y=x; return y; } 85
Ch 7_4 x 函數求最小值 min #include<stdio. h> int min (int x, int y){ return x; if(x<y) else return y; } min(a, b) = 5 min(a, b, c, d) = 3 main(){ int a=5, b=9, c=7, d=3; printf("min(a, b) = %in", min(a, b)); printf("min(a, b, c) = %in", min(a, min(b, c))); printf("min(a, b, c, d) = %in", min(a, b), min(c, d))); } 86
Ch 7_4 x 函數min 的應用 for (i=2; i<=min(a, b); i++){ if (a%i==0 && b%i==0) printf("HCF(a, b)=%in", i); } allowance = min(n. Child, 9)*30000. 0; tax = min(income, 35000)*0. 02; taxpayable = min(salary*0. 16, tax); 87
Jump to maths functions 遞迴函數 Recursion • 遞迴函數是指在程式中 直接或間接呼叫該程式本身。 • 程式中使用遞迴函數, 將可處理須重覆運算的問題。 Note: ME 2008– (SKIP this –Recursive Function)– 2011 Q 2. Week 09 88
費氏數列 Fibonacci Sequence • 費氏數列的規則如下所示: n 0 1 2 3 4 5 6 … fib(n ) 0 1 1 2 3 5 8 … • 費氏數列的數學表示式: 0 if n= 0 Fib(n)= 1 if n= 1 fib(n – 1) + fib(n – 2) if n>=2 89
Ch 7_5 遞迴函數求費氏數列 1, 1, 2, 3, 5, 8, 13, … 1 #include<stdio. h> 2 int fib (int n){ 4 if(n==0) return(0); 5 else if(n==1) return(1); 6 else return (fib(n– 1)+fib(n– 2)); 7 } fib(6)=fib(5)+fib(4)=8 10 main(){ 11 int x; 12 x = fib(6); 13 printf("fib(6) = %in", x); 14 } 90
Ch 7_5 • 程式執行結果 f(6) – The fib(6)=8 • 說明: f(4) f(2) f(0) f(1) f(5) f(3) f(1) f(2) f(0) f(1) f(4) f(2) f(0) f(1) f(3) f(1) f(2) f(0) f(1) 91
階乘函數 factorial • 定義如下: 1 if n = 0 fact(n) n * fact(n– 1) if n >= 1 • 說明: fact(3) = 3*fact(2) 3! = 3*2*fact(1) = 3*2*1! = 3*2*1*fact(0) = 3*2*1*0! = 3*2*1*1 = 6 92
Ch 7_7 利用遞迴函數求n階乘 #include<stdio. h> int fact (int n){ if(n==0) return(1); else return(n*fact(n– 1)); } main(){ 請輸入 n階乘: 6 int n; printf("請輸入 n階乘: "); 6! = 720 scanf("%i", &n); printf("%i! = %in", n, fact(n)); } 93
Ch 7_7 • 程式執行結果 請輸入 n階乘: 6 6! = 720 • 說明: 6! = 6 * fact(5) = 6 * 5 * fact(4) = 6 * 5 * 4 * fact(3) = 6 * 5 * 4 * 3 * fact(2) = 6 * 5 * 4 * 3 * 2 * fact(1) = 6 * 5 * 4 * 3 * 2 * 1 * fact(0) = 6 * 5 * 4 * 3 * 2 * 1 = 720 94
Jump to array 常用的數學函數 • 在程式中使用下列數學函數時,需在開頭加上 #include<math. h> 函數 exp log 功能敘述 格式 x和 y的資料型態 ex exp(x); double/float ln(x) log(x); double/float 指數函數 自然對數 log 10 以 10為底 log 10(x); double/float sqrt 平方根 sqrt(x); double/float fabs 絕對值 fabs(x); double/float pow xy pow(x, y) double sin 正弦函數 sin(x) double/float cos 餘弦函數 cos(x) double/float tan 正切函數 tan(x) double/float 95
儲存類別 • C語言的儲存類別 (storage class), 也就是變數的生命期 (life time)及可見度 (scope)。 一般儲存類別的宣告語法如下 : 儲存類別 資料型態 識別字 • 一般將儲存類別區分為 auto、 static、 register、 extern四大類。 儲存類別 關鍵字 生命期 可見度 自動 auto 暫時 區域變數 靜態 static 永久 可成為全域變數 暫存器 register 暫時 區域變數 外部 extern 永久 全域變數 96
內在(auto)變數 • 宣告為auto的變數,它的生命期只存活在函數的區塊 (block)中。 • 它是一個區域變數(local variable)。 #include<stdio. h> main() { auto int i; . { auto int j; . 變數 j 變數 i . 可見度 } . } 97
靜態(static)變數 • 內部靜態(static auto)變數 內部靜態變數是屬於區域變數(local variable)。 • 外部靜態(static external)變數 外部靜態變數是屬於全域變數(global variable)。 static int x; /* 外部靜態變數 */ main() { static int y; /* 內部靜態變數 */ 變數 x . 可見度 (整個程 式) . 變數 y . 可見度 } 98
Ch 7_12 全域變數與區域變數 1 #include<stdio. h> 16 void function (void) { 2 void function (void); 18 printf("全域變數 x = %in", x); 3 static int x = 1; 19 } 4 main(){ 6 static int x = 3; 7 printf("外在區域變數 x = %in", x); 8 { 9 static int x = 10; 外在區域變數 x = 3 10 printf("內在區域變數 x = %in", x); 內在區域變數 x = 10 11 } 12 printf("外在區域變數 x = %in", x); 外在區域變數 x = 3 13 function(); 全域變數 x = 1 14 printf("區域變數 x = %in", x); 區域變數 x = 3 15 } 99
外在(external)變數 • 語法 • extern 資料型態 變數名稱; int a; main(){ ‧ ‧ } prog_1. c void add(){ extern int a; ‧ ‧ } prog_2. c 100
外在(external)變數 合併兩個程 式: prog_1. c(主程式 ) prog_2. c 編譯器 prog_1. obj prog_2. obj 連結程式 prog_1. exe 101
749922617c6ca928abd51ddb0adec94d.ppt