Download - 國立清華大學資訊基礎教育 教學改進計畫

Transcript
Page 1: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫資訊工程系 http://www.cs.nthu.edu.tw/112/04/22 P-1

國立清華大學資訊基礎教育教學改進計畫

C語言基礎入門

Page 2: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-2

C 語言的歷史◙ C 語言的真正發展要追溯到 1963 年的 ALGOL 60 語言。◙ 1963 ,劍橋大學將 ALGOL 60 轉成 CPL(Combined

Programming Language) 語言。◙ 1967 年,劍橋大學的 Matin Richards 簡化了 CPL 成為

BCPL 語言。◙ 1970 年,美國貝爾實驗室 Ken Thompson 修改 BCPL 成

為 B 語言。◙ 1973 年,美國貝爾實驗室 D.M.RITCHIE 以 B 語言為基礎發展出新的語言,以 BCPL 的第二個字為基礎,稱為

C 語言。◙ 1983 年,美國國家標準局語言標準化委員會對 C 語言進行了標準化, 稱為 ANSI C 。

Page 3: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-3

C 語言的特色◙一共有 9 種控制語句, 32 個關鍵字。◙資料結構豐富 : 除了基本的整數實數變數字元之外,也涵蓋結構變數,指標變數等。◙語法限制不嚴格,設計彈性大。◙應用範圍大,適合在各種作業系統上使用。

Page 4: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-4

基本程式 1程式碼 :#include <stdio.h>main(){ printf(“Hello World!\n”);}

程式執行後的輸出結果 :Hello World!

Page 5: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-5

基本程式 1 說明◙ #include <stdio.h>

將系統檔案 stdio.h 導引至本程式。 stdio.h 是標準的輸入輸出標頭檔案 (Standard

Input Output Header) ,它定義了輸入輸出的動作和所需的變數及一些巨集指令。◙這一行程式並非由編譯程式所處理,而是在編譯前由前端處理程式 (Preprocessor) 處理,所以這段程式稱為前端處理程式指引

(Preprocessor Directives) 。

Page 6: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-6

基本程式 1 說明◙ main()

{} main() 是 C 語言第一個會去執行的程式,“ {”表示程式開始,“ }” 表示程式結束。

◙ printf(“Hello World!\n”); printf 是一個輸出函數 ( 定義在 stdio.h 檔案裡

面 ) ,這個函數可以印出雙引號“”的內容,而 \n 是 new line ,將目前游標移到下一列列首。

Page 7: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-7

基本程式 2程式碼 :#include <stdio.h>main(){

int a;a = 1;printf(“The a is : %d.\n”, a);

}

程式執行後的輸出結果 :The a is 1.

Page 8: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-8

基本程式 2 說明◙ int a;

int 為 C 語言關鍵字 (Key words) 之一, int 表示integer 之意,即宣告 a 這個變數的資料型態為整數。

◙ a = 1; a 這個變數我們又稱為 識別字 (Identifiers) ,是由程式設計師自己定義的,然而有以下的限制 :

變數名稱需為英文字母或底線字元 ( _ ) 或阿拉伯數字組成。第一個字只能為英文字母或底線字元 ( _ ) 。變數名稱不能過長 ( 傳統只允許 8 字元 , turbo C 可到 32 字元 ) 。變數有分大小寫, ABC 和 abc 是不同的兩個變數。

◙ printf(“The a is : %d.\n”, a); %d 是代表 a 變數的值以十進位 (decimal) 方式呈現。

Page 9: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-9

C 語言的關鍵字 ( 共 32 個 )asm double goto structauto else if switch

break end int typedefcase entry long unionchar enum register unsigned

continue extern short unixdefault float sizeof void

do for static volatilePS. 以上為一般 C 編譯器所提供的關鍵字 不同的編譯器會有其他額外的關鍵字

Page 10: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-10

識別字與關鍵字◙關鍵字如上頁表所列

程式語言的規定用字,使用者不可用來當變數,資料型態或函數名稱如 char ( 宣告字元 )

◙識別字有兩種 使用者自己定義

如 ABC_123, test1 等 程式庫定義

如 printf, scanf 等

Page 11: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-11

C 的常數宣告◙ const int a = 1;

在執行過程中 a 為一個故定不變動的整數,其值為 1

常數的資料型態可為整數,浮點數,字元。◙ 整數常數通常介於 -32768 ~ 32767 , 佔用

2bytes ,而長整數可到 4 bytes 。◙ 浮點常數數通常為 8 bytes ,表示法如下 :

12.34e5 (12.34* ) 1.45E-4 (1.45* )

◙ 字元常數通常是由單引號括起來 : ‘a’ 。

510410

Page 12: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-12

C 語言變數宣告方法◙ short a, int b, long c;

整數型態一般而言有三種 : short , int , long ( 佔記憶由小至大排列 ) 。

◙ unsigned d, unsigned int e; unisgned 表示只有正數沒有負數可搭配以上整數型態宣告,如 unsigned long x;

◙ float f, double g; float 浮點數, double倍精數,後者的有效位數和精確度皆高於前者 ( 通常為 4 bytes VS. 8 bytes) 。

◙ char h; 字元 : 資料存的是內碼值 ,如字元 ‘ A’ 的 ASCII內碼為 65 。基本上字元是以數字來儲存的,所以也可用來計算,只不過它能表示的數值較小而已。

Page 13: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-13

測試變數的記憶體空間 - sizeof

Page 14: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-14

執行結果◙平台 : WinXP + Visual C++ 6.0

Page 15: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-15

void 資料型態◙ 一開始 C 語言的每一個函數需要傳回值,然而有些函數並不需要傳回值,所以 ANSI 定義了 void 來代表這個函數它不需要任何回傳值,所以 void 有人稱之為虛擬型態。void main(void){

printf(“test!\n”);}int main(){

int a = 10; return a;}

Page 16: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-16

printf 的使用程式碼 :

執行結果 :

Page 17: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-17

printf 資料型態的常用格式對照表Printf() 控制字元 資料型態%c 字元%s 字串%d 有號十進位整數%e 浮點 ( 指數表示 )%f 浮點 ( 小數點表示 )%g 浮點 (最精簡表示 )%u 無正負號之十進位整數%ld 有號長整數十進位數PS. 尚有其他控制字元,因為不常使用,故請讀者自行參考 C 語言書籍或相關網頁, 在此不再贅述。

Page 18: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-18

printf 欄位寬度設定◙ C 語言允許使用者自行設定每項資料所需的位數,其方法是在 %符號和控制字元間加上列印時所需的寬度。例如 :

字元變數 ch=‘A’ ,寬度為 3 ,採向右靠齊,則指令應為 : printf(“%3c”, ch); 整數變數 a = 100 , 寬度為 5 ,採向左靠齊,則指令應為 : printf(“%-5d”, a);

Page 19: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-19

scanf 使用◙ scanf 與 printf 是相對的,前者為輸入函數,後者則是輸出函數。◙在格式方面也是類似的 :

scanf(“%c”, &c); % 等待輸入一個字元 c scanf(“%d”, &d); % 等待輸入一個整數 d scanf(“%f”, &f); % 等待輸入一個浮點數 f scanf(“%d %f”, &d, &f); % 等待輸入兩個變數,整數,浮點數 scanf(“%s ”, str); % 輸入一個字串 ( 字串變數前通常‘不’需要加上 ‘ &’ 符號 )

Page 20: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-20

基本運算式和運算符號◙加減乘除和取餘數

‘+’ 、 ‘ -’ 、 ‘ *’ 、 ‘ /’、 ‘ mod’ A = 2 *3 (A = 6) C = 5 mod 3 (C = 2)

◙邏輯符號 : and : ‘&&’ or : ‘||’ if, elseExample:if (a>10) && (b<3)

printf(“OK!\n”);else

Printf(“NO!\n”);

Page 21: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-21

基本運算式和運算符號◙大於等於小於

> = = <

◙不等於 !=

◙相加後指定 += A += 3 (相同於 A = A +3)

Page 22: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-22

控制結構◙ if-else

if (condition){}

else{}

◙ 括號 { } 內的程式碼可不只一行,假如只要執行一行程式碼,則括號可以省略不寫。◙ condition 通常都為邏輯判斷,如 a==b or c>9 等。

Page 23: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-23

if- else

請問這兩者的執行結果有何不同 ?

Page 24: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-24

if – else 練習◙ 輸入一個數字,輸出為這個數字的平方 :

PS. 數學函數需要引用 math.h 檔案 , 可用數學函數有 exp, sqrt, floor, round 等 可自行查閱相關 help

Page 25: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-25

巢狀 if if (a>3)

if (b>3)printf(“a and b are both greater than 3!\n”);else printf(“b is not greater than 3!\n”);

以下範例的執行結果與上面相同 : 因為 else 是找最近的 if 作對應if (a>3)

if (b>3)printf(“a and b are both greater than 3!\n”);

else printf(“b is not greater than 3!\n”);

Page 26: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-26

switch-case◙ 當 if else 寫的太多造成閱讀程式碼的困難,此時我們可以改用

switch case 方式書寫來增加清晰性,如下例原本程式碼與後來程式碼比較 :if-else 程式 : switch case 程式 :

Page 27: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-27

switch-case 解說◙架構 :

switch (op){

case X : ……………; break;default: ……………;

}op 可以是 實數 或者 字元,在 ANSI C op 不支援字串case 後面加上 break; 若不加 break ,則程式會一路比下去,所得的結果就非我們想要的了, default則設定當比較所有 pattern都不符合時要執行的步驟。

Page 28: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-28

Homework Exercise◙ 設計一個程式,乖乖包數與折價關係如下 :

1~5包,原價 6~10包以內,原價九折 11~20包以內,原價八折 21包以上,原價七折一包原價 10 元,輸入購買數量,則印出所需總價。

Page 29: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-29

迴圈設計◙ C 語言提供 3 種迴圈設計方法 :

for loop while do-while

Page 30: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-30

for loop

◙格式 for (i=0; i<5; i++)

i ++ 相當於 i = i + 1 or i+=1所以上式可改寫成 for (i=0; i<5; i = i + 1)

起始值 判斷跳離迴圈條件執行迴圈的動作

Page 31: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-31

for loop◙ 兩層迴圈可印出九九乘法表 :

Page 32: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-32

for loop 無窮迴圈◙ 格式 :

for (; ;)無窮迴路一直執行

for (n=1; ;n++)無窮迴路每執行一次 n就加一

◙例子 :for (n=1; ;n++){

printf(“%d\t”, n);if (n>5)

break;}此程式可印出 1 2 3 4 5

Page 33: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-33

while 迴圈◙格式 :

While (op){

// 程式碼}op 為 邏輯判斷式,如 a > 1例如 :while (a > 3)

a = a – 1;

Page 34: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-34

while 迴圈

請問上述例子的目的是求這兩個正數的什麼 ?

Page 35: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-35

while 無窮迴圈◙格式 :

while (1){

// 程式碼}

◙熱身 : 請用 while 設計一個小程式,可以讓使用者一直輸入任何正整數,直到使用者輸入負數則離開程式。

Page 36: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-36

do-while

◙格式 :do{

// 程式碼}while (op)

Page 37: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-37

do-while example

scanf(“%d%*c”, &i); 和 scanf(“%c%*c”, &t); 其中 補上 %*c 是為了配合輸入後 按下 enter 鍵。

Page 38: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-38

副程式◙ 通常程式大到某種程度以上,可能會有些重複的程式碼,這些重複程式碼雖然不至於浪費運算時間,但卻讓其他程式設計師叫不容易閱讀, 而且結構顯得凌亂。為了讓程式碼更有結構和可讀性,通常我們會設計副程式。◙ 一般格式的例子 :副程式

int test(int x, int y){

int z;z = pow(x, y) * 4;return z;

}

Page 39: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-39

Homework Exercise 2◙ 設計一個程式,輸入一個正整數 N ,計算第 N項之費氏級數 :

F(0) = 0; F(1) = 1; F(N)=F(N-1)+F(N-2);

Page 40: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-40

副程式◙ 副程式和主程式搭配 ( 兩種撰寫方式 )

Page 41: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-41

副程式◙請用副程式的做法設計下列圖形表示 * * * * * * * * * * * * * * *

Page 42: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-42

陣列◙ 由於單一變數的彈性太小,倘若程式中需要多個變數來儲存資料,而且這些變數中是有關係性的,那麼採用陣列的資料結構是比較好的做法。◙例如設計一個樂透程式,需要儲存 6 組正整數號碼,程式宣告可以為

int a, b, c, d, e, f;也可以為int number[6];第一種的變數較為繁雜,而且程式寫作限制較大,第二種宣告表現略為簡潔,程式寫作彈性大。

Page 43: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-43

陣列界線檢查◙ C 語言與高階語言不同的是,它並沒有做任何陣列的界線檢查,也就是說當程式存取超過陣列界線的值時,就會發生不可預期的錯誤,而且這樣的程式在編譯時期並不會被偵測出來,這是為了考量 C 語言在執行上的效率,所以程式設計師必須自行小心的存取陣列所規範的值。

Page 44: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-44

陣列表示◙ 整數一維陣列表示

int a[10]; % 從 a[0] ~ a[9] 共 10 個 elements 初始值設定 : int a[10] = {1,2,3,4,5,6,7,8,9,10};

◙ 浮點數二維陣列表示 float a[2][3]; % 2 x 3 的 matrix 從 a[0][0]~ a[2][3] 。

◙ 在 C 語言中,所有多維陣列其實在記憶體擺放都是以一維來呈現的,如一個 2 x 2 的矩陣 :

在記憶體中的排列方式則是 A[0][0]A[0][1]A[1][0]A[1][1]

A[0][0] A[0][1]

A[1][0] A[1][1]

Page 45: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-45

Exercise◙請設計一個 “簡單的”支援 2 x 2 的正整數矩陣相乘的程式,例如 輸入方式為 :第一個矩陣的第一列 : 2 3第一個矩陣的第二列 : 1 4第二個矩陣的第一列 : 1 3第二個矩陣的第二列 : 0 2

輸出結果 :矩陣的第一列 : 2 12 矩陣的第二列 : 1 11

Page 46: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-46

基本字串簡介◙ C 語言並沒有提供字串的基本資料型態,而是由字元陣列來處理。如下例 :

char string[5] = “ABC”;在記憶體中的位置

◙ 字串是一維的字元陣列,而字串陣列則是一個二維的字元陣列,每一列代表一個字串。如下例 :char week[7][10] = {“Monday”, “Tuesday”, “Wednesday”,

“Thursday”, “Friday”, “Saturday”, “Sunday”};

A B C \0 ?

Page 47: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-47

字串基本處理◙讀取字串

char abc[10];scanf(“%s”, abc); // 不需在 abc 前面加上 &

◙ 字串處理的基本函數 strcmp strcpy strcat strlen以上均可 help string 查知其用法細節請參閱 C 語言進階

Page 48: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫

Homework Exercise 4

◙設計一程式,讓使用者輸入一字串 ( 不超過 30 字元 ) ,之後將該字串以反序且大小寫互換的方式印出來。

例如:輸入” Hello” 後,程式顯示出” OLLEh” 。

112/04/22 P-48

Page 49: 國立清華大學資訊基礎教育 教學改進計畫

國立清華大學資訊基礎教育教學改進計畫112/04/22 P-49

參考資料◙網頁 :

C 語言簡介 : http://yach.idv.tw/aky/cth/cpg.htm C 語言簡介 :

http://www.pconline.com.cn/pcedu/rookie/basic/10111/16058.html

C 編程介紹 :

http://zh.wikipedia.org/wiki/C%E7%B7%A8%E7%A8%8B%E8%AA%9E%E8%A8%80

◙書籍 : C 語言詳論 : Jeri R. Hanly 等著 , 潘育群 蔡明志譯 Turbo C 程式設計入門 : 老園丁工作室