PowerPoint 簡報

Download Report

Transcript PowerPoint 簡報

國立清華大學資訊基礎教育
教學改進計畫
C語言基礎入門
資訊工程系 http://www.cs.nthu.edu.tw/
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-1
C語言的歷史
◙ C語言的真正發展要追溯到1963年的ALGOL 60語言。
◙ 1963 ,劍橋大學將ALGOL 60 轉成 CPL(Combined
◙
◙
◙
◙
2015/7/16
Programming Language) 語言。
1967年,劍橋大學的Matin Richards 簡化了CPL成為
BCPL語言。
1970年,美國貝爾實驗室Ken Thompson 修改BCPL成為
B語言。
1973年,美國貝爾實驗室D.M.RITCHIE 以B語言為基礎
發展出新的語言,以BCPL的第二個字為基礎,稱為C語
言。
1983年,美國國家標準局語言標準化委員會對C語言進
行了標準化, 稱為ANSI C。
國立清華大學資訊基礎教育教學改進計畫
P-2
C語言的特色
◙ 一共有9種控制語句,32個關鍵字。
◙ 資料結構豐富: 除了基本的整數實數變數
字元之外,也涵蓋結構變數,指標變數等。
◙ 語法限制不嚴格,設計彈性大。
◙ 應用範圍大,適合在各種作業系統上使用。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-3
基本程式1
程式碼:
#include <stdio.h>
main()
{
printf(“Hello World!\n”);
}
程式執行後的輸出結果:
Hello World!
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-4
基本程式1說明
◙ #include <stdio.h>


將系統檔案stdio.h 導引至本程式。
stdio.h 是標準的輸入輸出標頭檔案 (Standard
Input Output Header) ,它定義了輸入輸出的動
作和所需的變數及一些巨集指令。
◙ 這一行程式並非由編譯程式所處理,而是
在編譯前由前端處理程式(Preprocessor)處
理,所以這段程式稱為前端處理程式指引
(Preprocessor Directives) 。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-5
基本程式1說明
◙ main()
{
}

main()是C語言第一個會去執行的程式,“{”
表示程式開始,“}”表示程式結束。
◙ printf(“Hello World!\n”);

2015/7/16
printf是一個輸出函數(定義在stdio.h檔案裡面) ,
這個函數可以印出雙引號“”的內容,而\n
是 new line,將目前游標移到下一列列首。
國立清華大學資訊基礎教育教學改進計畫
P-6
基本程式2
程式碼:
#include <stdio.h>
main()
{
int a;
a = 1;
printf(“The a is : %d.\n”, a);
}
程式執行後的輸出結果:
The a is 1.
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-7
基本程式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);

2015/7/16
%d 是代表 a 變數的值以十進位 (decimal) 方式呈現。
國立清華大學資訊基礎教育教學改進計畫
P-8
C語言的關鍵字(共32個)
asm
double
goto
struct
auto
else
if
switch
break
end
int
typedef
case
entry
long
union
char
enum
register
unsigned
continue
extern
short
unix
default
float
sizeof
void
do
for
static
volatile
PS. 以上為一般C編譯器所提供的關鍵字 不同的編譯器會有其他額外的關鍵字
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-9
識別字與關鍵字
◙ 關鍵字如上頁表所列

程式語言的規定用字,使用者不可用來當變
數,資料型態或函數名稱
如 char (宣告字元)
◙ 識別字有兩種

使用者自己定義
如ABC_123, test1等

程式庫定義
如printf, scanf等
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-10
C的常數宣告
◙ const int a = 1;


在執行過程中 a 為一個故定不變動的整數,其值為1
常數的資料型態可為整數,浮點數,字元。
◙ 整數常數(short)通常介於 -32768 ~ 32767 , 佔
用2bytes ,而長整數可到8 bytes 。
◙ 浮點常數數通常為8 bytes ,表示法如下:

5
10
12.34e5 (12.34*
)

4
10
1.45E-4 (1.45*
)
◙ 字元常數通常是由單引號括起來 : ‘a’ 。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-11
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;

2015/7/16
字元: 資料存的是內碼值 ,如字元 ‘A’ 的ASCII內碼
為65。基本上字元是以數字來儲存的,所以也可用來
計算,只不過它能表示的數值較小而已。
國立清華大學資訊基礎教育教學改進計畫
P-12
測試變數的記憶體空間 - sizeof
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-13
執行結果
◙ 平台 : WinXP + Visual C++ 6.0
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-14
printf 的使用
程式碼:
執行結果:
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-15
printf資料型態的常用格式對照表
Printf()控制字元
資料型態
%c
字元
%s
字串
%d
有號十進位整數
%e
浮點(指數表示)
%f
浮點(小數點表示)
%g
浮點(最精簡表示)
%u
無正負號之十進位整數
%ld
有號長整數十進位數
PS. 尚有其他控制字元,因為不常使用,故請讀者自行參考C語言書籍或
相關網頁, 在此不再贅述。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-16
printf 欄位寬度設定
◙ C語言允許使用者自行設定每項資料所需的位
數,其方法是在%符號和控制字元間加上列印
時所需的寬度。
例如:


2015/7/16
字元變數 ch=‘A’ ,寬度為3 ,採向右靠齊,則指令
應為: printf(“%3c”, ch);
整數變數 a = 100 , 寬度為5 ,採向左靠齊,則指
令應為: printf(“%-5d”, a);
國立清華大學資訊基礎教育教學改進計畫
P-17
scanf 使用
◙ scanf與printf是相對的,前者為輸入函數,
後者則是輸出函數。
◙ 在格式方面也是類似的:





2015/7/16
scanf(“%c”, &c); %等待輸入一個字元 c
scanf(“%d”, &d); %等待輸入一個整數 d
scanf(“%f”, &f); %等待輸入一個浮點數 f
scanf(“%d %f”, &d, &f); %等待輸入兩個變數,
整數,浮點數
scanf(“%s ”, str); %輸入一個字串 (字串變數前
通常‘不’需要加上 ‘&’ 符號)
國立清華大學資訊基礎教育教學改進計畫
P-18
基本運算式和運算符號
◙ 加減乘除和取餘數



‘+’ 、 ‘-’ 、 ‘*’ 、 ‘/’、 ‘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”);

2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-19
基本運算式和運算符號
◙ 大於等於小於



>
==
<
◙ 不等於

!=
◙ 相加後指定


2015/7/16
+=
A += 3
(相同於 A = A +3)
國立清華大學資訊基礎教育教學改進計畫
P-20
控制結構
◙ if-else
if (condition)
{
}
else
{
}
◙ 括號 { } 內的程式碼可不只一行,假如只要執行
一行程式碼,則括號可以省略不寫。
◙ condition通常都為邏輯判斷,如 a==b or c>9等。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-21
if- else
請問這兩者的執行結果有何不同?
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-22
if – else 練習
◙ 輸入一個數字,輸出為這個數字的平方:
PS. 數學函數需要引用math.h檔案, 可用數學函數有 exp, sqrt, floor,
round等 可自行查閱相關help
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-23
巢狀 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”);
}
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-24
Homework Exercise
◙ 設計一個程式,乖乖包數與折價關係如下:
1~5包,原價
 6~10包以內,原價九折
 11~20包以內,原價八折
 21包以上,原價七折
一包原價10元,輸入購買數量,則印出所需總價。

2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-25
複習:變數(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
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-26
複習:變數使用與種類
◙ 資料型態(data type): int, float, double, char




分別表示整數,單準確度浮點數,倍準確度浮點數,
字元
指定資料型態於變數宣告時 (p12-p17)
sizeof(int) 查詢資料型態佔的記憶體空間
輸入/出格式%c, %d, %f, %lf…
◙ 變數的定義(宣告):全部的變數必須在使用前加
以定義(definition),才能在程式中使用。



2015/7/16
定義的動作,是在變數前給予一資料型態
Ex1: int num; Ex2: int num1, num2, num3;
Ex3: int num = 100;
國立清華大學資訊基礎教育教學改進計畫
P-27
複習:運算式和運算符
◙ 基本運算式和運算符號



!, 負號 (-), ++, --
乘 ( * )、除 ( / )、餘數( % )
算術運算子,+-*/ %
邏輯運算子( && )( || )( ! )
關係運算子( < ) (<= ) ( > )
( >= ) ( == ) ( != )
加 ( +)、減 ( - )
<, <=, >, >=
==, !=
&&
||
基本運算子優先順序表
◙ 下列程式片段,你覺得那裡不對?



2015/7/16
Int I = 200;
I = I +400;
400 = I + 500;
國立清華大學資訊基礎教育教學改進計畫
P-28
複習: C程式的基本架構
/* This is my first program */
#include <stdio.h>
#include<stdlib.h>
int main()
{
int num;
num = 100;
printf(“num=%d\n”,num);
system(“pause”);
}
2015/7/16
註解敘述
>>前端處理的指令
>>庫存函數存放處
main 函數
{
main 函數的主體
}
國立清華大學資訊基礎教育教學改進計畫
P-29
特殊運算式
2015/7/16
特殊運算式
基本運算式
a += b
a=a+b
a -= b
a=a-b
a *= b
a=a*b
a /= b
a=a/b
a %= b
a=a%b
國立清華大學資訊基礎教育教學改進計畫
P-30
迴圈設計
◙ C語言提供3種迴圈設計方法:



2015/7/16
for loop
while
do-while
國立清華大學資訊基礎教育教學改進計畫
P-31
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 = ?
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-32
for loop
◙ 兩層迴圈可印出九九乘法表:
◙ “%3dx%d=%2d”

2015/7/16
(1)“ ” (2)%d (3)%2d (4)%3dx
國立清華大學資訊基礎教育教學改進計畫
P-33
for loop
◙ 兩層迴圈可印出九九乘法表:
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-34
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
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-35
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;
}
}
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-36
while 迴圈
◙ 格式:
While (op)
{
//程式碼
}
op為 邏輯判斷式,如 a > 1
例如:
while (a > 3)
a = a – 1;
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-37
while 迴圈
請問上述例子的目的是求這兩個正數的什麼?
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-38
EX.
◙ 請輸入一整數:
◙ 請程式判別奇偶數?
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-39
while 無窮迴圈
◙ 格式:
while (1)
{
//程式碼
}
◙ 熱身 : 請用 while 設計一個小程式,可以讓使用
者一直輸入任何正整數,直到使用者輸入負數則
離開程式。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-40
◙ 直到使用者輸入負數則離開程式。
while (i >= 0)
{
//程式碼
}
◙ 投票系統:


2015/7/16
請輸入候選人號次: (輸入 -1 將結束):
1號: X票,2號: Y票,3號: Z票,廢票: W 票
國立清華大學資訊基礎教育教學改進計畫
P-41
do-while
◙ 格式:
do
{
//程式碼
}while (op)
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-42
do-while example
scanf(“%d%*c”, &i); 和 scanf(“%c%*c”, &t); 其中
補上 %*c 是為了配合輸入後 按下 enter 鍵。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-43
副程式
◙ 通常程式大到某種程度以上,可能會有些重複的
程式碼,這些重複程式碼雖然不至於浪費運算時
間,但卻讓其他程式設計師叫不容易閱讀, 而
且結構顯得凌亂。為了讓程式碼更有結構和可讀
性,通常我們會設計副程式。
◙ 一般格式的例子:
副程式
int test(int x, int y)
{
int z;
z = pow(x, y) * 4;
return z;
}
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-44
Homework Exercise 4
◙ 設計一個程式,輸入一個正整數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;
FN-1<=FN;

2015/7/16
*Result:.
*F(num) = 0,1,1,2,3,5,8,13,21,…
}
國立清華大學資訊基礎教育教學改進計畫
P-45
副程式 (function)
◙ ………….
…………..
………..
…………..
◙ ………..
◙ ……..
…………..
………..
…………..
◙ ……..
◙ func()
◙ ……….
◙ ……
◙ func()
◙ …..
◙ …..
經常使用的敘述群定義成函式
函式名來代表,必要時呼叫
2015/7/16
func()
…………..
………..
…………..
國立清華大學資訊基礎教育教學改進計畫
P-46
副程式
◙ 副程式和主程式搭配 (兩種撰寫方式)
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-47
副程式
◙ 請用副程式的做法設
計下列圖形表示
*****
****
***
**
*
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-48
有回傳值的函式
◙ main{
◙ char c, l;
◙ char lower(char s);
◙ while ((c=getchar()) !=
◙
◙
◙
◙
◙
2015/7/16
‘\x1a’)
{
l = lower(c);
putchar(l);
}
}
◙ char lower(char s)
◙{
◙ if (s >= ‘A’ &&
s<=‘Z’)
◙ s = s + (‘a’ – ‘A’);
◙ return s;
◙}
國立清華大學資訊基礎教育教學改進計畫
P-49
陣列
◙ 由於單一變數的彈性太小,倘若程式中需要多個
變數來儲存資料,而且這些變數中是有關係性的,
那麼採用陣列的資料結構是比較好的做法。
◙ 例如設計一個樂透程式,需要儲存6組正整數號
碼,程式宣告可以為
int a, b, c, d, e, f;
也可以為
int number[6];
第一種的變數較為繁雜,而且程式寫作限制較大,第二
種宣告表現略為簡潔,程式寫作彈性大。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-50
陣列界線檢查
◙ C語言與高階語言不同的是,它並沒有做
任何陣列的界線檢查,也就是說當程式存
取超過陣列界線的值時,就會發生不可預
期的錯誤,而且這樣的程式在編譯時期並
不會被偵測出來,這是為了考量C語言在
執行上的效率,所以程式設計師必須自行
小心的存取陣列所規範的值。
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-51
陣列表示
◙ 整數一維陣列表示


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]
在記憶體中的排列方式則是 
2015/7/16
A[0][0]
A[0][1]
A[1][0]
A[1][1]
國立清華大學資訊基礎教育教學改進計畫
P-52
Exercise
◙ 請設計一個 “簡單的”支援 2 x 2 的正整數矩陣
相乘的程式,例如 輸入方式為 :
第一個矩陣的第一列 : 2 3
第一個矩陣的第二列 : 1 4
第二個矩陣的第一列 : 1 3
第二個矩陣的第二列 : 0 2
輸出結果:
矩陣的第一列 : 2 12
矩陣的第二列 : 1 11
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-53
基本字串簡介
◙ C語言並沒有提供字串的基本資料型態,而是由
字元陣列來處理。如下例:
char string[5] = “ABC”;
在記憶體中的位置
A
B
C
\0
?
◙ 字串是一維的字元陣列,而字串陣列則是一個二
維的字元陣列,每一列代表一個字串。如下例:
char week[7][10] = {“Monday”, “Tuesday”, “Wednesday”,
“Thursday”, “Friday”, “Saturday”, “Sunday”};
2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-54
字串基本處理
◙ 讀取字串
char abc[10];
scanf(“%s”, abc); //不需在abc前面加上 &
◙ 字串處理的基本函數
strcmp
 strcpy
 strcat
 strlen
以上均可 help string 查知其用法
細節請參閱 C語言進階

2015/7/16
國立清華大學資訊基礎教育教學改進計畫
P-55
參考資料
◙ 網頁:



C語言簡介 : http://yach.idv.tw/aky/cth/cpg.htm
C語言簡介 :
http://www.pconline.com.cn/pcedu/rookie/basic/10111/1
6058.html
C編程介紹:
http://zh.wikipedia.org/wiki/C%E7%B7%A8%E7%A8%
8B%E8%AA%9E%E8%A8%80
◙ 書籍:


2015/7/16
C語言詳論 : Jeri R. Hanly等著, 潘育群 蔡明志譯
Turbo C 程式設計入門 : 老園丁工作室
國立清華大學資訊基礎教育教學改進計畫
P-56