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

49
國國國國國國國國國國國國國國國國國國 國國國國國 http://www.cs.nthu.edu.tw/ 111/03/30 P-1 國國國國國國國國國國國國 國國國國國國 C 語語語語語語

Upload: jamar

Post on 12-Feb-2016

115 views

Category:

Documents


0 download

DESCRIPTION

國立清華大學資訊基礎教育 教學改進計畫. C 語言基礎入門. C 語言的歷史. C 語言的真正發展要追溯到 1963 年的 ALGOL 60 語言。 1963 ,劍橋大學將 ALGOL 60 轉成 CPL(Combined Programming Language) 語言。 1967 年,劍橋大學的 Matin Richards 簡化了 CPL 成為 BCPL 語言。 1970 年,美國貝爾實驗室 Ken Thompson 修改 BCPL 成為 B 語言。 - PowerPoint PPT Presentation

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 程式設計入門 : 老園丁工作室