# [C語言] 基本觀念語法 本章節內容主要是幫助由Python作為第一次學習程式語言的學生,快速了解C語言的語法與觀念,以面對APCS考試的命題方式。 ## C語言的歷史 C 前身為B語言, 在美國Bell Lab (貝爾實驗室),由當時的研究員 Dennis Ritchie發展,目的是為了開發[UNIX作業系統](https://zh.wikipedia.org/wiki/UNIX), 替代部份`組合語言`的所完成的系統功能, 並可在不同的環境上開發系統與執行。 ## 基本程式結構 C語言的格式中預設程式執行時,從主程式`main()`開始執行,int main()中的`int`代表程式執行結束後,會傳回一個整數(integer)值 ```c= #include <stdio.h> /*宣告I/O函式庫*/ int main(void) { /*程式執行進入點由main函式開始*/ printf("Hello World\n"); return 0; } ``` ## 資料輸入輸出 ### 輸出資料 使用`printf()`函式,進行資料輸出。 要使用這個函式,必須加入它的宣告,定義在`stdio.h` 這個檔案中,所以要在程式碼最前頭進行宣告 ```c= #include <stdio.h> int main(void) { printf("Hello World\n"); return 0; } ``` ### 輸入資料 使用`scanf()`來讓使用者可以輸入資料到程式中。 請先宣告變數,請注意C語言是靜態語言,宣告變數須預先宣告型態 ```c= #include <stdio.h> int main(void) { int age; printf("please enter your age> "); scanf("%d", &age); printf("You are %d\n",age); return 0; } ``` ## C語言內建的資料型態 以下是 C 語言的資料型態: - 基礎型態 (fundamental types) - **布林數 (boolean)** - **整數 (integer)**(unsigned/signed) - `short` - `int` - `long` - **浮點數 (floating-point number)** - `float` - `double` - `long double` - **字元 (character)** - `char` - 複數 (complex number) - 列舉 (enumeration) - 衍生型態 (derived types) - **陣列 (array)** - **結構體 (structure)** - **指標 (pointer)** - **函式 (function)** - 聯合體 (union) ## 流程控制:迴圈 ### for迴圈 ```clike= for(int i=0; i < 10; i++){ ... } ``` ### while迴圈 有兩種,do-while跟while-do ```clike= int i = 0; while(i < 10){ ... i++; } ``` ```clike= int i = 0; do { ... i++; } while(i < 10) ``` ### 隨堂練習 1. 請使用for迴圈,列印1,3,5,7,9 2. 請使用while迴圈,列印2,4,6,8,10 ## 流程控制:條件判斷 ### Switch-Case ```c= switch(變數名稱或運算式) { case 符合數字或字元: 陳述句一; break; case 符合數字或字元: 陳述句二; break; default: 陳述三; break; } ``` ### if-else ```clike= if( 條件 ) { 如果條件成立時做什麼... } else { 否則做什麼... } ``` > 練習題:請讓使用者輸入成績(1~100) > 如果使用者輸入90~100的數字: 顯示結果“You Got A” > 如果使用者輸入80~89的數字: 顯示結果“You Got B” > 如果使用者輸入70~79的數字: 顯示結果“You Got C” > 如果使用者輸入60~69的數字: 顯示結果“You Got D” > 如果使用者輸入60~0的數字: 顯示結果“You Got F” > 如果使用者輸入範圍以外的數字,顯示結果“請輸入正確範圍數字” ### Break/Continue 在迴圈敘述中,我們可以使用`break`指令讓它強制離開迴圈,或是用 `continue`指令來忽略下面的指令而繼續下一次的迴圈 #### break示範使用:猜數字 ```clike= count = 1 ; while (true) { printf ("第 %d 次猜測:\n", count) ; printf ("請猜測一數:") ; scanf ("%d", &guess) ; if (guess > num){ printf ("太大!\n") ; } else if (guess < num){ printf ("太小!\n") ; } else{ printf ("猜中了!\n") ; break ; } count++ ; // 如果猜中了則此行不會執行 } // while loop ``` #### Continue示範使用 範例:將 2到100中的偶數相加,但必須排除10的倍數,也就是2+4+6+8+12+14+.....,最後印出總和。 ```clike= sum = 0 ; for (x=2 ; x<=100 ; x+=2) { /* 如果 x是10的倍數則閃過後面的 sum = sum + x; 敘述 */ if (x % 10 == 0) continue ; sum = sum + x; } printf("總和:%d \n", sum) ; ``` ### 隨堂練習 請設計一個程式,讓使用者輸入數字1~3 * 如果使用者輸入1: 顯示結果“你輸入的是選項1” * 如果使用者輸入2: 顯示結果“你輸入的是選項2” * 如果使用者輸入2: 顯示結果“你輸入的是選項3” * 如果使用者輸入非1~3的數字: 顯示結果“請輸入正確範圍數字” ## 函式 我們使用`函式(Function)`將重複出現的程式碼,通常是一系列的程序,做成函式,可以隨時呼叫使用,增加開發效率、以及讓程式碼更容易維護。 主要好處如下: * 減少撰寫重覆的程式碼 * 將程式碼以有意義的方式組織起來 * 相同的流程下,可藉由參數調整程式的行為 * 藉由函式庫可組織和分享程式碼 * 做為資料結構 (data structures) 和物件 (objects) 的基礎 ### 函式的宣告 #### 函式的類型 函式分成兩種類型,有`回傳值`與`無回傳值`。 請參考以下範例程式碼: ```c= #include<stdio.h> /*無回傳值*/ void function1(){ printf("Hello\n"); } /*有回傳值*/ int function2(){ int a = 0; a++; return a; } int main(){ int x = 0; /* 呼叫function 1 */ function1(); /* 呼叫function 2 */ x = function2(); printf("%d\n", x); return 0; } ``` #### 函式的參數 函式可以帶入`參數`,在函式內使用該參數進行運算,但也可以不帶入參數。 ```c= #include<stdio.h> /*無參數*/ int function1(){ int a = 0; int b = 0; a += 1; b = a; return b; } /*有帶入參數*/ int function2(int a){ int b = 0; a += 2; b = a; return b; } int main(){ int x = 0; int y = 0; //呼叫function 1 y = function1(); printf("%d\n", y); //呼叫function 2 y = function2(x); printf("%d\n", y); return 0; } ``` ### 隨堂練習 請使用遞迴設計程式,計算階乘5!的值 ###### tags: ` C/C++程式語言觀念`