1 / 56

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

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

donny
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 國立清華大學資訊基礎教育教學改進計畫 C語言基礎入門

  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。

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

  4. 基本程式1 程式碼: #include <stdio.h> main() { printf(“Hello World!\n”); } 程式執行後的輸出結果: Hello World!

  5. 基本程式1說明 • #include <stdio.h> • 將系統檔案stdio.h 導引至本程式。 • stdio.h 是標準的輸入輸出標頭檔案 (Standard Input Output Header) ,它定義了輸入輸出的動作和所需的變數及一些巨集指令。 • 這一行程式並非由編譯程式所處理,而是在編譯前由前端處理程式(Preprocessor)處理,所以這段程式稱為前端處理程式指引 (Preprocessor Directives) 。

  6. 基本程式1說明 • main() { } • main()是C語言第一個會去執行的程式,“{”表示程式開始,“}”表示程式結束。 • printf(“Hello World!\n”); • printf是一個輸出函數(定義在stdio.h檔案裡面) ,這個函數可以印出雙引號“”的內容,而\n 是 new line,將目前游標移到下一列列首。

  7. 基本程式2 程式碼: #include <stdio.h> main() { int a; a = 1; printf(“The a is : %d.\n”, a); } 程式執行後的輸出結果: The a is 1.

  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) 方式呈現。

  9. C語言的關鍵字(共32個) PS. 以上為一般C編譯器所提供的關鍵字 不同的編譯器會有其他額外的關鍵字

  10. 識別字與關鍵字 • 關鍵字如上頁表所列 • 程式語言的規定用字,使用者不可用來當變數,資料型態或函數名稱 • 如 char (宣告字元) • 識別字有兩種 • 使用者自己定義 • 如ABC_123, test1等 • 程式庫定義 • 如printf, scanf等

  11. C的常數宣告 • const int a = 1; • 在執行過程中 a 為一個故定不變動的整數,其值為1 • 常數的資料型態可為整數,浮點數,字元。 • 整數常數(short)通常介於 -32768 ~ 32767 , 佔用2bytes ,而長整數可到8 bytes 。 • 浮點常數數通常為8 bytes ,表示法如下: • 12.34e5 (12.34* ) • 1.45E-4 (1.45* ) • 字元常數通常是由單引號括起來 : ‘a’ 。

  12. C語言變數宣告方法 (指定資料型態) • short a, int b, long c; • 整數型態一般而言有三種 : short (2bytes), 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。基本上字元是以數字來儲存的,所以也可用來計算,只不過它能表示的數值較小而已。

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

  14. 執行結果 • 平台 : WinXP + Visual C++ 6.0

  15. printf 的使用 程式碼: 執行結果:

  16. printf資料型態的常用格式對照表 PS. 尚有其他控制字元,因為不常使用,故請讀者自行參考C語言書籍或相關網頁, 在此不再贅述。

  17. C語言允許使用者自行設定每項資料所需的位數,其方法是在%符號和控制字元間加上列印時所需的寬度。C語言允許使用者自行設定每項資料所需的位數,其方法是在%符號和控制字元間加上列印時所需的寬度。 例如: 字元變數 ch=‘A’ ,寬度為3 ,採向右靠齊,則指令應為: printf(“%3c”, ch); 整數變數 a = 100 , 寬度為5 ,採向左靠齊,則指令應為: printf(“%-5d”, a); printf 欄位寬度設定

  18. scanf 使用 • scanf與printf是相對的,前者為輸入函數,後者則是輸出函數。 • 在格式方面也是類似的: • scanf(“%c”, &c); %等待輸入一個字元 c • scanf(“%d”, &d); %等待輸入一個整數 d • scanf(“%f”, &f); %等待輸入一個浮點數 f • scanf(“%d %f”, &d, &f); %等待輸入兩個變數,整數,浮點數 • scanf(“%s ”, str); %輸入一個字串 (字串變數前通常‘不’需要加上 ‘&’ 符號)

  19. 基本運算式和運算符號 • 加減乘除和取餘數 • ‘+’ 、 ‘-’ 、 ‘*’ 、 ‘/’、 ‘mod’ • A = 2 *3 (A = 6) • C = 5 mod 3 (C = 2) • 邏輯符號 : • and : ‘&&’ • or : ‘||’ • if, else Example: if ((a>10) && (b<3)) printf(“OK!\n”); else Printf(“NO!\n”);

  20. 基本運算式和運算符號 • 大於等於小於 • > • = = • < • 不等於 • != • 相加後指定 • += • A += 3 (相同於 A = A +3)

  21. 控制結構 • if-else if (condition) { } else { } • 括號 { } 內的程式碼可不只一行,假如只要執行一行程式碼,則括號可以省略不寫。 • condition通常都為邏輯判斷,如 a==b or c>9等。

  22. if- else 請問這兩者的執行結果有何不同?

  23. if – else 練習 • 輸入一個數字,輸出為這個數字的平方: PS. 數學函數需要引用math.h檔案, 可用數學函數有 exp, sqrt, floor, round等 可自行查閱相關help

  24. 巢狀 if (else 與 if 的對應, a=2,b=5) 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”); } 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”); }

  25. Homework Exercise • 設計一個程式,乖乖包數與折價關係如下: • 1~5包,原價 • 6~10包以內,原價九折 • 11~20包以內,原價八折 • 21包以上,原價七折 一包原價10元,輸入購買數量,則印出所需總價。

  26. 複習:變數(variables) • 在程式中,我們使用變數代表問題中某些項目的名稱,而此變數的值,則會因程式的執行而有所改變。 • 變數名稱,第一個字必需是英文字母或底線 “_”,之後可以有數字,但不可以使用保留字。 • 試問下問那些是合法的變數名稱? • 1. num 6. average • 2. 8num 7. C&C • 3. int 8. xyz?543 • 4. _score 9. k56 • 5. BMW-Z3 10. initial value

  27. 複習:變數使用與種類 • 資料型態(data type): int, float, double, char • 分別表示整數,單準確度浮點數,倍準確度浮點數,字元 • 指定資料型態於變數宣告時 (p12-p17) • sizeof(int) 查詢資料型態佔的記憶體空間 • 輸入/出格式%c, %d, %f, %lf… • 變數的定義(宣告):全部的變數必須在使用前加以定義(definition),才能在程式中使用。 • 定義的動作,是在變數前給予一資料型態 • Ex1: int num; Ex2: int num1, num2, num3; • Ex3: int num = 100;

  28. 複習:運算式和運算符 • 基本運算式和運算符號 • 算術運算子,+-*/ % • 邏輯運算子( && )( || )( ! ) • 關係運算子( < ) (<= ) ( > ) ( >= ) ( == ) ( != ) • 下列程式片段,你覺得那裡不對? • Int I = 200; • I = I +400; • 400 = I + 500; 基本運算子優先順序表

  29. 複習: C程式的基本架構 /* This is my first program */ 註解敘述 #include <stdio.h> >>前端處理的指令 #include<stdlib.h> >>庫存函數存放處 int main() main 函數 { { int num; num = 100; main 函數的主體 printf(“num=%d\n”,num); system(“pause”); } }

  30. 特殊運算式

  31. 迴圈設計 • C語言提供3種迴圈設計方法: • for loop • while • do-while

  32. for loop • 格式 • for (i=0; i<5; i++) i ++ 相當於 i = i + 1 or i+=1 所以上式可改寫成 for (i=0; i<5; i = i + 1) 利用for loop: 用迴圈計算:1 + 2 + 3 + … + 100 = ? 執行迴圈的動作 起始值 判斷跳離迴圈條件

  33. for loop • 兩層迴圈可印出九九乘法表: • “%3dx%d=%2d” • (1)“ ” (2)%d(3)%2d(4)%3dx

  34. for loop • 兩層迴圈可印出九九乘法表:

  35. for loop 無窮迴圈 • 格式: • for (; ;) • 無窮迴路一直執行 [EX.列印Hello world\n]] • for (n=1; ;n++) • 無窮迴路每執行一次n就加一 • 例子: for (n=1; ;n++) { printf(“%d\t”, n); if (n>=5) break; } 此程式可印出 1 2 3 4 5

  36. for loop 多條件判斷運算 • i 累進,j 累減2 int main() { int i, j=10, total = 0; for(i = 1; j >= 0 && i <= 10; i++) { total += i; printf("Now j=%2d, i=%d, and total=%d\n", j, i, total); j -=2; } }

  37. while 迴圈 • 格式: While (op) { //程式碼 } op為 邏輯判斷式,如 a > 1 例如: while (a > 3) a = a – 1;

  38. while 迴圈 請問上述例子的目的是求這兩個正數的什麼?

  39. EX. • 請輸入一整數: • 請程式判別奇偶數?

  40. while 無窮迴圈 • 格式: while (1) { //程式碼 } • 熱身 : 請用 while 設計一個小程式,可以讓使用者一直輸入任何正整數,直到使用者輸入負數則離開程式。

  41. 直到使用者輸入負數則離開程式。 while (i >= 0) { //程式碼 } • 投票系統: • 請輸入候選人號次: (輸入 -1 將結束): • 1號: X票,2號: Y票,3號: Z票,廢票: W 票

  42. do-while • 格式: do { //程式碼 }while (op)

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

  44. 副程式 • 通常程式大到某種程度以上,可能會有些重複的程式碼,這些重複程式碼雖然不至於浪費運算時間,但卻讓其他程式設計師叫不容易閱讀, 而且結構顯得凌亂。為了讓程式碼更有結構和可讀性,通常我們會設計副程式。 • 一般格式的例子: 副程式 int test(int x, int y) { int z; z = pow(x, y) * 4; return z; }

  45. Homework Exercise4 • 設計一個程式,輸入一個正整數N,計算第N項之費氏級數: • F(0) = 0; • F(1) = 1; • F(N)=F(N-1)+F(N-2); • for(;;){ /* input m as loop number*/ • FN = FN-1 + FN-2; *for loop (num){ …. } • FN-2<=FN-1; *Result:. • FN-1<=FN; *F(num) = 0,1,1,2,3,5,8,13,21,… • }

  46. 副程式 (function) • …………. • ……….. • …….. • ….. • …….. • func() • ………. • …… • func() • ….. ………….. ……….. ………….. ………….. ……….. ………….. func() ………….. ……….. ………….. 經常使用的敘述群定義成函式 函式名來代表,必要時呼叫

  47. 副程式 • 副程式和主程式搭配 (兩種撰寫方式)

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

  49. 有回傳值的函式 • main{ • char c, l; • char lower(char s); • while ((c=getchar()) != ‘\x1a’) • { • l = lower(c); • putchar(l); • } • } • char lower(char s) • { • if (s >= ‘A’ && s<=‘Z’) • s = s + (‘a’ – ‘A’); • return s; • }

  50. 陣列 • 由於單一變數的彈性太小,倘若程式中需要多個變數來儲存資料,而且這些變數中是有關係性的,那麼採用陣列的資料結構是比較好的做法。 • 例如設計一個樂透程式,需要儲存6組正整數號碼,程式宣告可以為 int a, b, c, d, e, f; 也可以為 int number[6]; 第一種的變數較為繁雜,而且程式寫作限制較大,第二 種宣告表現略為簡潔,程式寫作彈性大。

More Related