Presentation is loading. Please wait.

Presentation is loading. Please wait.

C 語言簡介 - 2.

Similar presentations


Presentation on theme: "C 語言簡介 - 2."— Presentation transcript:

1 C 語言簡介 - 2

2 運算子 (operator) 與運算式 (expression)
運算式的基礎 C語言的運算子 C語言的位元運算子 資料型態的轉換

3 運算式-說明 C語言的「運算式」(Expressions)是由一序列的「運算子」(Operators)和「運算元」(Operands)組成,用來在程式中執行所需的運算任務。

4 C語言的運算式 a b 15 -15 a + b * 1 a >= b a > b && a > 1 a = b + 1

5 運算式優先順序 (Precedence) C語言提供多種不用運算子,在同一個運算式如果使用多個運算子時,為了讓運算式能夠得到相同的運算結果,運算式是以運算子預設的優先順序進行運算,如下所示: a + b * 2 因為運算子的優先順序*大於+,所以先計算b*2後才和a相加。在運算式可以使用括號推翻預設的運算子優先順序,如下所示: (a + b) * 2 目前的運算順序是先計算 a+b,然後才乘 2。

6 運算式的種類-1 單運算元運算式(Unary Expressions)
單運算元運算式只包含一個運算元和「單運算元運算子」(Unary Operator),如下所示: -15 +10 x++ --y 在C語言的!、-、+、++、--和~是單運算元運算子,這些運算子都擁有相同的優先順序,使用右左結合(Right-to-left Associativity)進行運算式的計算。

7 運算式的種類-2 a = b = c 二元運算式(Binary Expressions)
c + d + e 第1個運算式是使用運算子優先順序執行運算。第2個運算式的2個運算子擁有相同優先順序,使用左右結合執行運算。 C語言的二元運算子大部分都是左右結合,只有指定運算式是右左結合,如下所示: a = b = c

8 運算式的種類-3 三元運算式(Ternary Expressions) 三元運算式包含3個運算元,在C語言只有一種三元運算子?:,如下所示:
hour = (hour >= 12) ? hour-12 : hour; 上述三元運算子擁有(hour >= 12、hour-12和hour三個運算元。因為運算子擁有相同優先順序,所以使用右左結合(Right-to-left Associativity)進行運算式的計算。

9 C語言的運算子 運算子的優先順序 編譯時期運算子 – sizeof 算術運算子 遞增和遞減運算子 關係與邏輯運算子 指定運算子 逗號運算子

10 運算子的優先順序

11 編譯時期運算子 – sizeof(語法) C語言的sizeof是一種單運算元運算子(Unary Operator),可以在編譯時期取得指定變數或資料型態佔用的記憶體空間的尺寸,以位元組為單位,sizeof運算的語法,如下所示: 整數常數值 = sizeof(型態名稱或變數名稱); 上述sizeof運算可以計算指定型態名稱或變數佔用的記憶空間,型態名稱需要使用括號括起,變數不用,資料型態可以是基本或延伸資料型態,其運算結果是無符號整數常數值的位元組數。

12 編譯時期運算子 – sizeof 例如:使用 sizeof 運算子取得 char 資料型態和變數test佔用的位元組數,如下所示:
printf("char =%d\n",sizeof(char)); printf("test =%d\n",sizeof(test)); 上述程式碼使用 sizeof 運算子取得資料型態 char 和變數 test 佔用的位元組數。

13 算術運算子-說明 C語言的「算術運算子」(Arithmetic Operators)可以建立數學的算術運算式(Arithmetic Expressions)。各種C語言算術運算子和運算式範例,如下表所示:

14 算術運算子-算術與指定運算式的組合 C語言在程式敘述中使用運算式可以有多種組合,例如:2個指定運算式,如下所示: 上述運算式可以寫成:
a = 4 + 5; b = 6 + a; 上述運算式可以寫成: b = 6 + (a = 4 + 5) 上述運算式先計算括號用的運算式,指定運算子是右左結合,所以先計算4+5為9,然後指定給變數a,接著計算6 + a等於15,最後指定給變數b,所以運算結果的變數a是9,b是15。

15 算術運算子-使用算術運算子建立數學公式 在C語言只需使用算術運算子和變數,就可以建立複雜的數學運算式,例如:華氏(Fahrenheit)和攝氏(Celsius)溫度轉換公式,如下所示: f = (9.0 * c) / 華氏轉攝氏的公式,如下所示: c = (5.0 / 9.0 ) * (f - 32)

16 遞增和遞減運算子-說明 C語言的遞增和遞減運算子(Increment and Decrement Operators)是一種置於變數之前或之後的運算式簡化寫法,如下表所示:

17 遞增和遞減運算子-使用在運算式 如果遞增和遞減運算子是使用在算術或指定運算式中,運算子在運算元之前或之後就有不同,如下表所示:
簡單的說,運算子在前面,變數值是立刻改變,如果在後面,表示在執行運算式後才會改變。

18 遞增和遞減運算子-使用在運算式(範例) 例如:運算子是在運算元之後,如下所示: x = 10; y = x++;
上述程式碼變數x的初始值為10,x++的運算子在後,所以之後才會改變,y值仍然為10,x為11。例如:運算元是在運算子之後,如下所示: y = --x; 上述程式碼變數x的初始值為10,--x的運算子是在前,所以y為9,x也是9。

19 關係與邏輯運算子-說明 條件運算式(Conditional Expressions)是一種複合運算式,每一個運算元使用關係運算子(Relational Operators)連結建立關係運算式,多個關係運算式使用邏輯運算子(Logical Operators)連結,如下所示: a > b && a > 1 上述條件運算式使用左右結合(Left-to-Right Associativity)進行運算,先執行a > b的運算,然後才是a > 1。

20 關係與邏輯運算子-範例 例如:「==」是判斷前後2個運算元是否相等,關係運算子的範例,如下表所示:

21 關係與邏輯運算子-邏輯運算子 邏輯運算子(Logical Operators)可以連結多個關係運算式建立複雜的條件運算式,如下表所示:

22 指定運算子-說明 指定運算式(Assignment Expressions)就是指定敘述「=」,可以將右邊運算元的值存入左邊的運算元,因此,左邊運算元需要能夠存入值,所以一定是變數。

23 指定運算子-範例

24 逗號運算子 逗號運算式(Comma Expression)是使用「,」號連結多個運算式,可以執行一序列的運算,如下所示:
x = (y = 5, y+2); 上述逗號運算式是使用左右結合進行運算,運算式依序從左邊的運算元開始,一一進行運算,直到最右邊的運算元,而最右邊的運算元是逗號運算式的值。以此例,先運算 y=5,然後是 5+2,所以運算式的值是7。

25 C語言的位元運算子-轉換表 位元運算主要是針對二進位數字表示法,筆者整理十進位、十六進位和二進位數字表示法的轉換表,如下表所示:

26 位元運算子-AND、OR和XOR運算(說明)
位元運算的NOT、AND、OR和XOR運算子類似前述的邏輯運算子,如下表所示:

27 位元運算子-NOT運算 NOT運算是一種單運算元運算子,也就是1’補數運算,1’補數運算NOT可以反轉位元狀態值,所有1設為0,0設為1。例如:a的值為 ,~a的值為 。

28 位元運算子-位移運算 (說明) C語言的提供向左移(Left Shift)和右移(Right Shift)幾個位元的位移運算,如下表所示:

29 位元運算子-位移運算 (範例) 左移運算每移1個位元,相當於乘以2。右移運算每移1個位元,相當於是除以2。例如:原始十進位值3的左移運算,右邊補0,如下所示: << 1 = ( 6) << 2 = (12) 上述運算結果的括號就是十進位值。原始十進位值120的右移運算,左邊補0,如下所示: >> 1 = (60) >> 2 = (30)

30 資料型態的轉換 「資料型態轉換」(Type Conversions)是因為運算式可能擁有多個不同資料型態的變數或常數值。例如:在運算式中擁有整數和浮點數的變數或常數值時,就需要執行型態轉換。 資料型態轉換是指轉換變數儲存的資料,而不是變數本身的資料型態,因為不同型態佔用的位元組數不同,在進行資料型態轉換時,例如:double轉換成float,變數資料就有可能損失資料或精確度。

31 指定敘述的型態轉換-說明 指定敘述的型態轉換規則很簡單,就是將「=」運算子右邊的運算式轉換成和左邊變數相同的資料型態,如下所示:
a = b; 上述指定敘述的變數a和b如果是不同的資料型態,變數 b 的值會自動轉換成變數 a 的資料型態。

32 指定敘述的型態轉換-資料損失 C語言基本資料型態的指定敘述型態轉換,其可能的資料損失,如下表所示:

33 強迫型態轉換運算子-語法 指定敘述和算術型的型態轉換都會自動進行型態轉換,不過有時,自動轉換的結果並不是預期結果,此時我們可以使用C語言的「型態轉換運算子」(Cast Operator)在運算式中強迫轉換資料型態,其語法如下所示: (型態名稱) 運算式或變數 上述語法可以將運算式或變數強迫轉換成前面括號的型態,注意!在型態名稱外一定需要括號。

34 強迫型態轉換運算子-範例 例如:整數和整數的除法17/5,其結果是整數3。如果需要精確到小數點,就不能使用算術型態轉換,而需要強迫將它轉換成浮點數,例如:a=17、b=5,如下所示: r = (float)a / (float)b; 上述程式碼將整數變數a和b都強迫轉換成浮點數float,我們也可以只強迫轉換其中之一,然後讓算術型態轉換自動轉換其它的運算元,此時17/5的結果是3.4。

35 結構化程式設計 結構化程式設計是一種軟體開發方法,它是一種組織和撰寫程式碼的技術,使用由上而下的設計方法(Top-down Design)來分析問題,將程式分解成階層架構的「模組」(Modules),每個模組是一段擁有獨立功能的程式碼,而且只有單一的進入點和離開點,各模組間使用三種流程控制來整合:循序結構(Sequential)、選擇結構(Selection)和重複結構(Iteration)。 結構化程式設計的主要觀念有三項,如下所示: 由上而下的設計方法。 流程控制結構。 模組。

36 流程控制的基礎-說明 程式語言撰寫的程式碼大部分是一列指令接著一列指令循序的執行,但是對於複雜的工作,為了達成預期的執行結果,我需要使用「流程控制結構」(Control Structures)來改變執行順序。

37 流程控制的基礎-循序結構 循序結構是程式預設的執行方式,也就是一個程式敘述接著一個敘述的依序執行,如右圖所示:

38 流程控制的基礎-選擇結構 選擇結構是一種條件控制敘述的選擇題,可以分為單一選擇、二選一或多選一三種,程式執行的順序是依照條件運算式運算結果的true或false,來決定執行哪一個區塊的程式碼,如右圖所示:

39 流程控制的基礎-重複結構 (說明) 重複結構是迴圈控制,可以重複執行一個程式區塊的程式碼,並且提供一個結束條件結束迴圈執行,依結束條件測試的位置不同分為兩種,如下所示: 前測式重複結構 後測式重複結構

40 流程控制的基礎-重複結構 (前測式重複結構)
測試迴圈結束條件在程式區塊的開頭,需要符合條件,才允許執行迴圈中程式區塊的程式碼,如右圖所示:

41 流程控制的基礎-重複結構 (後測式重複結構)
測試迴圈結束條件在程式區塊的結尾,所以迴圈的程式區塊至少執行一次,如右圖所示:

42 程式區塊-語法 程式區塊(Blocks)是一種最簡單的結構敘述,它的目的只是將零到多列的程式敘述組合成一個群組,所以也稱為「結合敘述」(Compound Statements)。 我們可以將整個程式區塊視為一列程式敘述,以結構化程式設計來說,程式區塊就是最簡單的模組,其語法如下所示: { ………… 程式敘述; }

43 程式區塊-範例 程式區塊提供群組方式的程式編排,不只如此,它還可以隱藏變數宣告,如下所示: { int temp; temp = a;
a = b; b = temp; } 程式區塊宣告整數變數temp,只能在區塊內使用,一旦離開程式區塊,就無法存取變數,稱為程式區塊的區域變數(Local to the Block)。

44 if 是否選條件敘述-範例 一個條件敘述的範例,如下所示: 如果程式區塊的程式敘述只有一列,我們還可以省略區塊的大括號,如下所示:
if ( score >= 60 ) { printf("成績及格!\n"); printf(“成績為%d\n”, score); } 如果程式區塊的程式敘述只有一列,我們還可以省略區塊的大括號,如下所示: if ( score < 60 ) printf("成績不及格!%d\n", score);

45 if 是否選條件敘述-圖例

46 if/else二選一條件敘述-範例 一個條件敘述的範例,如下所示:
if ( score >= 60 ) { printf("成績及格!%d\n", score); } else { printf("成績不及格!%d\n", score); 上述程式碼因為成績有排它性,60分以上為及格分數,60分以下為不及格,所以只會執行其中一個程式區塊。

47 if/else二選一條件敘述-圖例

48 ?:條件運算子-範例 一個條件敘述運算子的範例,如下所示:
hour = (hour >= 12) ? hour-12 : hour; 上述程式碼使用條件敘述運算子指定變數hour的值,如果條件為true(即不等於0),hour變數值為hour-12,false(等於0)就是hour。

49 巢狀條件敘述-說明 在if條件敘述的程式區塊如果擁有其它if條件敘述,程式架構稱為「巢狀條件敘述」,如下:
if ( guess == target ) { printf("猜中數字: %d\n", target); } else { printf("猜錯: "); if ( guess > target ) printf("數字太大!\n"); else printf("數字太小!\n");

50 巢狀條件敘述-圖例

51 if/else/if多選一條件敘述-說明
只需重複使用 if/else 條件建立 if/else/if 條件敘述,即可建立多選一條件敘述,如下所示: if ( guess == target ) { printf("猜中數字: %d\n", target); } else if ( guess > target ) printf("猜錯: 數字太大!\n"); else printf("猜錯: 數字太小!\n");

52 if/else/if多選一條件敘述-圖例

53 switch多選一條件敘述-語法 switch ( 變數 ) { case 常數值1: 程式敘述1; break; case 常數值2:
程式敘述2; default: 程式敘述; }

54 switch多選一條件敘述-範例 switch ( choice ) { case 1: printf("往上移動一格!\n");
break; case 2: printf("往下移動一格!\n"); case 3: printf("往左移動一格!\n"); case 4: printf("往右移動一格!\n"); default: printf("留在原地!\n"); }

55 switch多選一條件敘述-圖例

56 for計數迴圈-語法 C語言的for迴圈是簡化的while迴圈,稱為「計數迴圈」(Counting Loop),可以重複執行程式區塊固定次數,迴圈擁有預設計數器,計數器每次增加或減少一個值,直到迴圈的結束條件,其語法格式如下所示: for ( 初始值 ; 結束條件 ; 變數更新 ) { 程式敘述; ………… }

57 for計數迴圈-遞增的for計數迴圈 for迴圈使用變數控制迴圈執行,從一個值執行到另一個範圍值,例如:計算1加到變數max的總和,每次增加1,如下所示: for ( i = 1; i <= max; i++ ) { printf(" %d ", i); total += i; }

58 for計數迴圈-遞增的for計數迴圈(圖例)

59 for計數迴圈-遞減的for計數迴圈 相反的情況,如果是從max到1,計數器使用i--表示每次遞減1,如下所示:
for ( i = max; i >= 1; i-- ) { ………. }

60 for計數迴圈-for計數迴圈的應用 for計數迴圈的用途很多,屬於定量遞增或遞減的重複計算問題,都可以使用for計數迴圈。例如:使用for計數迴圈遞減溫度,建立華氏-攝氏溫度對照表,如下所示: for ( f = 200; f >= 100; f = f-20 ) printf("%d %.2f\n", f, (5.0/9.0)*(f-32)); 上述迴圈顯示溫度對照表,從華氏溫度200到100,每次減少20度。

61 前測式while迴圈敘述-語法 while迴圈敘述不同於for迴圈,需要在程式區塊自行處理計數器的增減,while迴圈是在程式區塊的開頭檢查結束條件,如果條件為true(不等於0)才進入迴圈執行,其語法格式如下所示: while ( 結束條件 ) { 程式敘述; ………… } 上述迴圈的執行次數是直到結束條件為false(等於0)為止。

62 前測式while迴圈敘述-範例1 使用while迴圈從1計算到輸入變數max的總和,如下所示:
while ( c <= max ) { total += c; c++; } 上述while迴圈計算從1加到max的總和,變數c是計數器變數,如果符合c <= max條件,就進入迴圈執行程式區塊,迴圈的結束條件為c > max。

63 前測式while迴圈敘述-圖例1

64 前測式while迴圈敘述-範例2 攝氏-華氏溫度對照表如果改為使用while迴圈來處理,如下所示: c = lower = 100;
upper = 300; step = 20; while ( c <= upper && lower >= 100 ) { f = (9.0 * c) / ; printf("%d %.2f\n", c, f); c += step; }

65 後測式do/while迴圈敘述-語法 do/while和while迴圈敘述的主要差異是在迴圈結尾檢查結束條件,因為先執行程式區塊的程式碼後才測試條件,所以do/while迴圈的程式區塊至少執行一次,其語法格式如下所示: do { 程式敘述; ………… } while ( 結束條件 ) 上述迴圈執行的次數是直到結束條件為false(等於0)為止。

66 後測式do/while迴圈敘述-範例 do/while迴圈的猜數字遊戲,如下所示: do {
printf("請輸入猜測的數字(1~500): "); scanf("%d", &guess); if ( guess > target ) printf("數字太大!\n"); if ( guess < target ) printf("數字太小!\n"); } while ( guess != target ); 迴圈的第1次執行需要到迴圈結尾,才會檢查while條件是否為true,如為true就繼續執行迴圈,迴圈結束條件是guess == target。

67 後測式do/while迴圈敘述-圖例

68 巢狀迴圈-範例 C語言的巢狀迴圈可以有二或二層以上,例如:在for迴圈內擁有while迴圈,如下所示:
for ( i = 1; i <= 9; i++ ) { …… j = 1; while ( j <= 9 ) { ….. j++; }

69 巢狀迴圈-範例說明 第一層的for迴圈執行9次,第二層的while迴圈也是執行9次,兩層迴圈總共執行81次,如下表所示:

70 跳躍指令敘述 break指令敘述 continue指令敘述 goto指令敘述和標籤

71 break指令敘述-說明 C語言的break指令敘述一共有兩個用途,一是中止switch條件的case指令,另一個用途是強迫終止for、while和do/while迴圈的執行。 雖然迴圈敘述可以在開頭或結尾測試結束條件,但是有時我們需要在迴圈中測試結束條件,break指令可以使用在迴圈中的條件測試,如同switch條件敘述使用break指令敘述跳出程式區塊一般。

72 break指令敘述-範例 do { printf(" %d ", i); i++; if ( i > 10 ) break;
} while ( 1 );

73 continue指令敘述 在迴圈的執行過程中,相對於上一節使用break指令跳出迴圈,continue指令敘述可以馬上繼續下一次迴圈的執行,而不執行程式區塊位在continue指令敘述後的程式碼,如果使用在for迴圈,一樣會更新計數器變數,如下所示: for ( i = 1; i <= 10; i++ ) { if ( (i % 2) == 1 ) continue; printf(" %d ", i); }

74 goto指令敘述和標籤-說明 結構化程式設計強調在程式中避免使用無窮迴圈和goto指令,因為goto指令會造成程式碼閱讀和維護上的困難,事實上,任何擁有goto指令的程式碼一定可以改寫成沒有goto指令的版本。 換句話說,在撰寫C程式時,我們根本不需要使用goto指令,不過仍然有一些特殊情況可以使用goto指令,最常見的應用是跳出多重巢狀迴圈,因為執行break指令敘述只能跳出一層迴圈,如果需要跳出整個巢狀迴圈,才可以考慮使用goto指令。

75 goto 指令敘述和標籤-範例 for ( i = 1; i <= 9; i++ ) { j = 1;
while ( j <= 9 ) { printf("%d*%d=%2d ", i, j, i*j); if ( a == i && b == j ) goto found; j++; } printf("\n"); found:

76 C File I/O Reading from or writing to a file in C requires 3 basic steps: Open the file. Do all the reading or writing. Close the file.

77 C File I/O : File Pointer
For files you want to read or write, you need a file pointer, e.g.: FILE *fp;

78 Opening a file In order to open a file, use the function fopen(). Use it as: fp = fopen(filename, mode); mode is a string representing how you want to open the file. 

79 Opening a file FILE *fp; fp=fopen("c:\\test.txt", "r");

80 Reading from or writing to a file
Once a file has been successfully opened, you can read from it using fscanf() write to it using fprintf() These functions work just like scanf() and printf(), except they require an extra first parameter, a FILE * for the file to be read/written.

81 Reading from a file

82 Writing to a file

83 if (feof(fp)) printf("End of file\n")
Testing for EOF if (feof(fp)) printf("End of file\n")

84 fseek() fseek() function call allows the byte location in a file to be selected for reading or writing. It has the syntax: fseek( <file_pointer>, <offset>, <origin> ); Counted in bytes

85 rewind() The "rewind()" function resets an open file back to its beginning.

86 Closing a file When done with a file, it must be closed using the function fclose(). fclose(fp);

87 Homework 下一次上課時抽驗 3~5 位同學,並於上課現場寫一個 File I/O 之 C 程式,包括:File Read、File Write、Fseek 使用等 同學必須能說明每個程式敘述的意義 所有同學都正確,全班加學期分數 1 分 任一同學未能完成,扣該同學學期分數 2 分


Download ppt "C 語言簡介 - 2."

Similar presentations


Ads by Google