You are on page 1of 71

C 語 言 的 格 式

z 什麼是 C 語言?

z C 語言執行過程?

原始程式 --> 經由編譯器 --> 變成目的檔 --> 經由連結器 --> 變成執行檔


SOURCE.C --> COMPILER --> SOURCE.OBJ --> LINKER --> SOURCE.EXE

z C 語 言 的 特 性

(1) 可 以 像 組 合 語 言 一 樣 進 行 硬 體 之 直 接 存 取 .
(2) 為 語 法 規 則 簡 單 , 清 楚 , 容 易 使 用 之 結 構 化 語 言 .
(3) 必 要 時 可 以 與 組 合 語 言 連 結 .
( 4 ) 可 攜 性 ( Portability ) 極 佳 , 跨 平 台 的 能 力 強 .

z 標 準 C 語 言 格 式

#include < stdio.h > ----> 前置處理器

subroutine( ) ----> 副程式


{.
..
}

subroutine( ) ----> 副程式


{
}
main( ) ----> 主程式
{
int i=0 ; /* 變 數 宣 告 */
i=i+1; /* 算 數 運 算 */----> 程式主體
printf("i=%d\n",i) ; /* 輸 出 至 螢 幕 */
}

C 語言簡介 1
基 本 資 料 型 態

z 變 數 命 名 的 原 則 ?
1. 開 頭 必 須 是 字 母 ( letter ) 或 底 線 ( underscore ) .
2. 字 元 的 大 寫 小 寫 所 代 表 的 意 義 不 同 .
3. 不 得 使 用 關 鍵 字 ( keyword ) . (在 Borland C++ 軟體中已粗體顯現)

z 變 數 的 資 料 型 態 種 類 :

類 別 符號位元 位元長(bits) 表 示 法 數 值 範 圍

16 int(short) -32768->32767

32 long -2147483648->2147483647

整 數 16 unsigned int 0->65535

無 16 unsigned short 0->65535

32 unsigned long 0->4294967295


32 float 10^-38->10^38
浮點數 有
64 double 10^-308-->10^308
字元 無 8 char 0->255

C 語言簡介 2
z 變 數 的 宣 告 方 法 :

(1) 整 數 部 份 :
int a;
int b,c=45;
short int name;
long int var_name;
unsigned int argu1=30;

(2) 浮 點 數 部 份 :
float a=12.3456; /*單精準度*/
float b=0.12345e2;
double score=4.987654322e-7; /*雙精準度*/

(3) 字 元 部 份 :

char c='c';
char bell=7; /*7 為 ASCII 之響聲字元*/

C 語言簡介 3
儲 存 類 別

z 自 動 變 數 ( auto variable )

z 自 動 變 數 只 在 它 所 定 義 的 區 塊 內 有 效 。 只 要 在 變 數 所
屬 的 區 塊 結 構 內 執 行,該 變 數 的 資 料 是 有 效 而 正 確 的。
當 程 式 執 行 離 開 了 該 區 塊 , 所 有 於 區 塊 內 定 義 的 自 動
變 數 就 不 存 在 了 。

z Example 1:

z main( ) z inner( )
{ {
int x=1; int x=2;
inner( ); printf("%d\n",x);
printf("%d\n",x); }
}

z 靜 態 變 數 ( static variable)

靜 態 變 數 與 自 動 變 數 一 樣 , 是 某 特 定 函 數 內 的 區 域 性 變
數 , 但靜 態 變 數 的 值 不 會 因 函 數 的 執 行 結 束 而 消 失 。

靜 態 變 數 的 宣 Example 1: Example 2:
告 如 下 所 示 :
main() main()
{ {
{ increment(); increment();
static int a; increment(); increment();
static int b=12345; increment(); increment();
static char c; } }
static float d=13.45;
. increment() increment()
. { {
. int x=0; static int x=0;
} x=x+1; x=x+1;
printf("%d\n",x); printf("%d\n",x);
} }

Result = ????? Result = ?????

C 語言簡介 4
z 外 部 變 數 ( extern variable)

外 部 變 數 和 前 面 所 提 到 的 變 數 不 同。外 部 變 數 的 有 效 範 圍
不 是 區 域 性 , 而 是 整 體 性 ( global ) , 外 部 變 數 定 義 在 任 何 函
數 的 外 面 , 表 示 可 以 被 其 他 函 數 所 共 用 。

Example 1: Example 2:

int x=123; int x=123;

main() main()
{ {
printf("%d\n",x); int x=321;
printf("%d\n",x);

} }

Result = ????? Result = ?????

Example 3:

#include < stdio.h > extern.c 內 容 如 下 :


#include "extern.c"
#include < stdio.h >
int x=123; run2()
main() {
{ extern int x;
printf("%d\n",x); printf("%d\n",x);
run1(); }
run2();
}
run1()
{ Result = ?????
printf("%d\n",x);
}

C 語言簡介 5
/* ======================================== */
/* 程式實例: */
/* 局部(local)和整體(Global) 變數 */
/* ======================================== */
#include <stdio.h>

int step = 10; /* 整體變數宣告 */


int count = 5; /* 整體變數宣告 */

/* ---------------------------------------- */
/* 將變數值加一 */
/* ---------------------------------------- */
void increment()
{
int step = 0; /* 局部變數 step 宣告 */

step++; /* 局部變數加一 */
count++; /* 整體變數加一 */
printf(" 副程序 %2d %2d \n",step, count);
}

/* ---------------------------------------- */
/* 主程式 */
/* ---------------------------------------- */
void main()
{
int count = 0; /* 局部變數宣告 */

count++; /* 局部變數加一 */
step++; /* 整體變數加一 */
printf(" 程序名 STEP COUNT \n");
increment(); /* 副程序呼叫 */
printf(" 主程序 %2d %2d \n",step, count);
}/* ======================================== */

執行結果
程序名 STEP COUNT
副程序 1 6
主程序 11 1

C 語言簡介 6
基 本 輸 入 / 輸 出 函 數

z 格 式 化 輸 出 函 數 printf( )

語 法 如 下 : printf(format_string,arg1,arg2,...argn);

轉換字元的種類
種 類 表 示 法 功 能 敘 述
d 以十進位方式印出。
o 以八進位方式印出。
整 數(integer) x 以十六進位方式印出。
u 以不帶符號的十進位方式印出。
l 以長整數(long)方式印出。
f 以 xxx.xxxxxxx 方式印出。
浮點數(float)
e 以指數的方式印出。
c 以字元方式印出。
字元(char)
s 以字串方式印出。
- 向左邊靠齊印出 。
dd 指定欄位寬。
其他(other)
. 分隔欄寬。
*.* 指定浮點數之精確度。

{ result:
int x=42;
float y=12.345;
char c='A',c1[4]="ABC "; /42/
printf("/%d/\n",x); / 42/
printf("/%15d/\n/%-15d/\n",x,x); /42 /
printf("/%f %4.3f/\n",y,y); /12.3450000 12.345/
printf("/%08.4f/\n",y); /012.3450/
printf("/%0*.*f/\n",8,4,y); /012.3450/
printf("/%c %s/\n",c,c1); /A ABC/
}

C 語言簡介 7
表二.特殊控制碼
種 類 功 能 敘 述
\n newline 新行。
\r carriage return 回歸鍵。
\t tab 跳格。
\b backspace 退位。
\f form feed 跳頁。
\\ backslash 反斜線。
\' single quote 單引號。
\" double quote 雙引號。

z 格 式 化 輸 入 函 數 scanf( )
語 法 如 下 :

scanf(format_string,argptr1,argptr2,...argptrn);

main( ) result :
{
int x;
float y; 24 12.45 G -----> 此處為鍵盤輸入之資料
char z;
scanf("%d %f %c",&x,&y,&z); 24 12.4500001 G
printf("%d %f %c\n",x,y,z);
scanf("%3d %4f",&x,&y); 123 4567890 ------> 此處為鍵盤輸入之資料
printf("%d %f\n",x,y);
} 123 4567.00000

C 語言簡介 8
C 語言基本資料處理

z 算 術 運 算 元 ( Arithmetic operators )
將 整 數及浮 點 數 或 字 元 指 定 給 某 一 不 特 定 的 變 數 之 動 作

z 加、減、乘、除、負 數 及 模 數 運 算子

加 ( + )、減 ( - )、乘 ( * )、除 ( / ) 為 一 般 的 四 則 運 算 , 而 模 數 運 算 ( % )


是 經 由 兩 常 數 相 除 所 得 的 餘 數 稱 之。負 數 是 在 某 個 常 數 前
面 加 個 減 號 所 成 的 組 合 稱 之 。

z 運 算 子 的 優 先 權

*、/、%、+、- 以 上 所 標 示 的 運 算 子 , 其 運 算 的 優 先 順 序 由 左 至
右 。

負號 (-) ←高優先順序

乘 ( * )、除 ( / )、餘數( % ) ←中優先順序

加 ( +)、減 ( - ) ←低優先順序

z 型別之轉換:
語法: (type) expression

main( ) Result:
{
int x1; 4 9.20000000 5.00000000
float y1,y2;
x1=(int)4.123;
y1=(float)46/5;
y2=(int)5.3456;
printf("%d %f %f\n",x1,y1,y2);
}

C 語言簡介 9
z 遞 增 與 遞 減

遞 增 與 遞 減 又 分 為 前 置 模 式 ( prefix ) 與 後 置 模 式( postfix ) ;

前 置 模 式:是 將 ++ 或 - - 置 於 變 數 之 前,其運算是在使用此運算元之前
先進行加一或減一之動作。

後 置 模 式: 是 將 ++ 或 - - 置 於 變 數 之 後,其運算是在使用此運算元之後
才進行加一或減一之動作 。

main() Result:
{
int a=1,b=1,c=1,d=1; 2 1
int aplus,bplus; 2 2
int cminus,dminus; 0 1
aplus=++a; 0 0
bplus=b++;
cminus=--c;
dminus=d--;
printf("%d %d\n",aplus,bplus);
printf("%d %d\n",a,b);
printf("%d %d\n",cminus,dminus);
printf("%d %d\n",c,d);
}

z 設定特殊運算式
特殊運算式 基本運算式
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

C 語言簡介 10
z 邏 輯 運 算 子 ( Logical operators )

邏 輯 運 算 的 種 類

運算子 功能敘述 運算子 功能敘述


&& AND(及) ~ 1' complement(一的補數)
|| OR(或) << Left shift(左移)
! NOT(反向) >> Right shift

z 關 係 運 算 子 ( Relational operators ) : 一 般 用 於 控 制 流

程 或 有 條 件 的 敘 述 當 中 ,

關 係 運 算 子
運算子 功能敘述 運算子 功能敘述
< 小於 >= 大於等於
<= 小於等於 == 等於
> 大於 != 不等於

!, 負號 (-), ++, --

乘 ( * )、除 ( / )、餘數( % )

加 ( +)、減 ( - )

<, <=, >, >=

==, !=

&&

||

基本運算子優先順序表

C 語言簡介 11
流 程 控 制

z 控 制 結 構 ( control structure )

結 構 化 程 式 設 計 的 基 礎 建 立 在 下 列 三 個 結 構 :

( 1 ) 循 序 ( sequential ) : 以 一 個 接 著 一 個 方 式 進 行 作 業 。

( 2 ) 條 件 執 行 ( conditional ) : if_then_else 。

( 3 ) 迴 路 ( looping ) :

z 條 件 執 行 if 的 運 用

以 下 是 if_then_else 流 程 控 制 可 能 出 現 的 四 種 語 法

syntax 1: syntax 3:

if (關係運算元) if (關係運算元)
statement ;
statement ; else
statement ;
syntax 2: syntax 4:

if (關係運算元) if (關係運算元)
{ {
statement 1 ; statement 1 ;
statement 2 ; statement 2 ;
. .
. statement n ;
. }
statement n ; else
} {
statement 1 ;
statement 2 ;
.
statement n ;
}

C 語言簡介 12
ps. 如果 statement 超 過 一 個 以 上,則 須 以 { } 將 其區塊分隔開來 。

Example 1: Example 2:
Void main(void) Void main(void)
{ {
int x; char c;
scanf("%d",&x); scanf("%c",&c);
if ( x >= 10 ) if( c == 'A' )
printf("%d >= 10\n",x); {
else printf("c=%c\n",c);
printf("%d < 10\n",x); printf("This is true.\n");
} }
else
{
printf("c!=A\n");
printf("That isn't true.\n");
}

Result:
A -----> 此處為鍵盤輸入值
Result: c=A
This is true
10 ---> 此處為鍵盤輸入值
10 >= 10

C 語言簡介 13
z 迴 路 while 的 運 用

在 while 的敘述中,當關係運算元之條件為真時 , 會不斷地重覆執行位於 while 後


所 列 的 敘 述 , 直 到 條 件 變 為 否 定 才 停 止 。

Syntax 1: Syntax 2:

while ( 關係運算元 ) while ( 關係運算元 )


statement ; {
statement 1 ;

statement n ;

Example 1: Example 2:

Void main( ) Void main( )


{ {
int i=0; int i=0,c=0;
while ( i < 5 ) while ( i < 5 )
printf("%d\n",i++); {
printf("%d",i++);
printf("out of loop.\n"); printf("%d\n",++c);
} }
printf("out of loop.\n");
}
Result = ????? Result = ?????

C 語言簡介 14
z 迴 路 do-while 的 運 用

do-while 迴 路 , 由 於 測 試 條 件 在 迴 路 的 後 面 , 所 以 迴 路 中 的
敘 述 至 少 會 被 執 行 一 次 ,

Syntax 1: Example:

do Void main( )
{
statement ; int i=0,c=0;
do
while ( 關係運算元 ) ; {
printf("%d",i++);
Syntax 2: printf("%d\n",++c);
} while ( i < 5 ) ;
do
{ printf("out of the loop.\n");
statement 1 ; }
statement 2 ;
.
statement n ; Result = ?????
} while ( 關係運算元 ) ;

C 語言簡介 15
z 迴 路 for 的 運 用

for 允 許 使 用 者 在 同 一 行 敘 述 中 就 設 定 了 迴 路 的 三 個 部 份 。
(1) 計 數 器 的 初 值,(2) 關 係 運 算 元,(3) 增 減 迴 路 計 數 器 的
值 。 其 語 法 如 下 所 示 ,

for ( 計數器初值,關係運算元,計數器值更新 )
statement ;
or

for ( 計數器初值,關係運算元,計數器值更新 )
{ statement 1 ;
.
statement n ;
}

Example 1: Example 2:
Void main( )
Void main( ) {
{ int i,c;
int i; for (i=0, c=1 ; i < 5 ; ++i,++c )
for( i = 0 ; i <= 5 ; ++i ) {
printf("%d ",i); printf("%d",i);
} printf("%d\n",c);
}
Result = ????? printf("Out of Loop.\n");
}
012345
Result = ?????

C 語言簡介 16
z goto 的 運 用

在 一 個 程 式 中 , 使 用 goto 敘 述 可 以 強 制 改 變 程 式 執 行 的 步
驟 , 但 也 會 因 此 使 程 式 的 結 構 混 亂 , 所 以 此 敘 述 應 儘 量 不
用 。 其 語 法 如 下 所 述 。

Example:
Syntax :
goto label ; main( )
. {
. int i=1111;
. repeat :
label : printf("%d\n",i);
goto repeat ;
. }

z 條 件 執 行 switch 的 運 用

switch 語 法 如 下 所 示

switch ( 變數)
{
case 常數 1 :
statement 1 ;
case 常數 2 :
statement 2 ;
.
case 常數 n :
statement n ;

default :
statement ;
}

ps. 此 處 常 數 的 資 料 型 態 為 整 數 與 字 元 兩 種 。

C 語言簡介 17
Example 1:

Void main( )
{
char var='D';
switch (var )
{
case 'A' :
printf("var = A\n");
break;
case 'B' :
printf("var = B\n");
break;
case 'C' :
printf("var =C\n");
break;
default :
printf("I'm in default.");
} /* end of switch */
} /*end of main */
Example 2:

Void main( )
{
int var=3;
switch ( var )
{
case 1 :
printf("var = 1\n");
break;
case 2 :
printf("var = 2\n");
break;
case 3 :
printf("var = 3\n");
break;
default :
printf("I'm in default");
} /* end of switch */

}/*end of main */

C 語言簡介 18
函 數

z 何 謂 函 數 ?

1. C 語言使用的函數可以寫出非常漂亮的程式結構,使程式簡單化,偵錯容易。

2. 將重複之某些指令撰寫成一個函數,可減少編輯程式時間,更可使程式精
簡,清晰了解。

3. C 語言使用的函數其呼叫方法與數學上使用函數完全相同,

例 如 :
a = function ( x , y ) ;

表示將變數 x , y 輸入函數 function , 其傳回函數值設定給變數 a 。

z 函 數 的 結 構 (格式)
1. 函 數 的 定 義 (Function Definition)
2. 呼 叫 函 數 (Function Call)
3. 函 數 原 形 宣 告 (Function Prototype)

z 函 數 的 定 義 (格式)

Example:

儲存類別 資料型別 函數名稱 (形式引數 void line (void)


的串列)
{
int j;
{
形式引數的宣告 ; for (j=1;j<20;j++)
printf(“%d\n”,j);
函數的本體(執行敘述)
}
}

C 語言簡介 19
z 函 數 的 儲 存 類 別

函 數 的 儲 存 類 別
儲存類別 功能敘述
static 只能在進行宣告的編譯單位內可以執行
extern 在進行宣告的編譯單位以外也可執行

ps. 一 般 函 數 的 儲 存 類 別 可 以 省 略 , 此 時 當 作 "extern" 處 理 。

Example1: file1.c Example2: file2.c

extern func1( ) extern func1( );


{
. static func3( )
. {
} .
static func2( ) .
{ func1( );
. .
} }

z 函 數 的 傳 回 值 與 資 料 形 態

要 求 函 數 送 回 傳 回 值 (函數值) , 必 須 在 函 數 本 體 中 利 用 return
敘 述 進 行 , 例 如 :

return ( 變數或式子 ) ;

此 處 必 須 先 宣 告 傳 回 值 (函數值) 的 資 料 形 態 是 什 麼 。
return()敘述之目的如下

1. 將控制權傳回給呼叫程式
2. 將 return()敘述後括號內之數值傳給呼叫程式之方式

C 語言簡介 20
呼叫程式
函數
v o id m a in (v o id )
{ in t a n s; in t fu n c (v o id )
******* {*******
******* *******
a n s= fu n c (); x=3;
***** r e tu r n (x );
} }

z 值 的 傳 遞 方 法

( 1 ) 傳 遞 變 數 值 本 身 ( Call by value )

( 2 ) 傳 遞 變 數 的 位 址 ( Call by reference )

Example 1: 傳值呼叫 Example 2: 傳址呼叫

#include < stdio.h > #include < stdio.h >

int func(a,b,c) void func(a,b,c,d)


int a,b,c; int *a,*b,*c,*d;
{ {
int d; *d=*a+*b+*c;
d=a+b+c; }
return(d);
} void main(void)
{
void main(void) int x,y,z,p;
{ x=y=z=3;
int x,y,z,p; func(&x,&y,&z,&p);
x=y=z=3; printf("p-->%d\n",p);
p=func(x,y,z); }
printf("p-->%d\n",p);
}
result : p-->9 result : p-->9

C 語言簡介 21
C 語言簡介 22
/* ================================================== */
/* 程式實例:傅值和傳址的副程序呼叫(交換 XY) */
/* ================================================== */

/* --------------------交換兩值(傳值副程序)-------------------- */

void swap1(int x,int y)


{ int temp;

temp = x;
x = y;
y = temp;
}

/* ------------------- 交換兩值(傳址副程序) ----------------- */

void swap2(int *x,int *y)


{ int temp;

temp = *x;
*x = *y;
*y = temp;
}

/* ---------------------主程式---------------------- */

void main()
{
int x = 10, y=0; /* 局部變數宣告 */

printf(" X Y \n");
printf(" 初值 %d %d \n",x,y);
swap1(x,y); /* 傳值副程序呼叫(交換 XY) */
printf(" 傳值 %d %d \n",x,y);

swap2(&x,&y); /* 傳址副程序呼叫(交換 XY) */


printf(" 傳址 %d %d \n",x,y);
}

C 語言簡介 23
遞迴 ( recursion)

C 語 言 的 函 數 可 進 行 遞 迴 呼 叫 ( recursive call ) , 也 就 是 說 在 函
數 之 中 可 呼 叫 函 數 本 身 。 函 數 在 進 行 遞迴 呼 叫 時 , 在 其 所
使 用 的 變 數 被 堆 積 在 堆 疊 區 域 , 每 次 執 行 return 敘 述 , 函 數
在 該 層 呼 叫 中 所 使 用 的 變 數 就 從 堆 疊 返 回 。

z 遞迴函數之特性

(1) 每 次 執 行 return 敘 述,問題範圍縮小

(2) 具有一個終止遞迴之條件

程式實例: 遞迴

int factorial(int j)

{
if(n==1)
return(1);
else
return(n*factorial(n-1));
}

void main(void)
{
int i;
for (i=0; i< 5; i++)
printf("%d! = %d\n", i , factorial(i));
}

result :
1! is 1
2! is 2
3! is 6
4! is 24

C 語言簡介 24
z 遞迴函數之內部處理

1. 一般函數之呼叫

2. 遞迴函數之呼叫

01 * =================================================== */
02 /* 程式實例:使用列印陣列函數說明遞迴函數之呼叫 */
03 /* ================================================== */
04
05 int list[6] = { 1, 2, 3, 4, 5, 6 }; /* 陣列內容 */
06
07 /* ----------------------------------------------------------------------------------- */
08 /* 遞迴陣列反向列印函數 */
09 /* ----------------------------------------------------------------------------------- */
10 void invert array(int j)
11 {
12 if ( j < 6 ) /* 終止條件 */
13 { /* 遞迴串列列印函數呼叫 */
14 invert array(j + 1);
15 printf("[%d]",list[j]); /* 列印元素資料 */
16 }
17 }
18 /* ----------------------------------------------------------------------------------- */
19 /* 主程式: 反向列印陣列內容. */
20 /* ----------------------------------------------------------------------------------- */
21 void main()
22 {
23 int i;
24
25 printf("陣列的內容:\n");
26 for ( i= 0; i < 6 ; i++)
27 printf("[%d]",list[i]); /* 列印元素資料 */
28 printf("\n"); /* 換行 */
29 printf("遞迴列印陣列的內容:\n");
30 invert array(0); /* 呼叫列印函數 */
31 printf("\n"); /* 換行 */
32 }

C 語言簡介 25
程式實例: 費博尼西數列

long fib(int n)

if (n <=2)

return (1);

return (fib( n-2) + fib(n-1));

Fib函數執行計算過程

C 語言簡介 26
C 的 前 置 處 理 器

z 前 置 處 理 器 (preprocessor)

我 們 在 寫 程 式 的 時 候 , 常 常 會 碰 到 某 些 資 料 重 覆 使 用 或 是
某 些 程 式 片 段 因 特 定 的 條 件 下 須 放 棄 , 如 果 以 正 常 的 方 式
來 寫 作 程 式 , 可 能 會 增 加 無 謂 的 程 式 片 段 , 使 的 程 式 笨 重
不 堪 , 但 如 果 能 好 好 運 用 C 語 言 所 提 供 的 前 置 處 理 器 , 則 上
述 的 狀 況 將 改 善 許 多 . 這 個 功 能 並 非 C 語 言 本 身 的 格 式 , 但
仍 為 編 譯 程 式 所 能 接 受 . 對 前 置 處 理 器 的 解 釋 , 如 圖 所 示 ,
因 為 它 是 在 程 式 編 譯 之 前 執 行 , 所 以 顧 名 思 義 稱 之 前 置 處
理 .

前置處理 編譯處理 連結處理

原始 目的 執行
檔案 檔案 檔案

Include
檔案

C 語言簡介 27
z 前 置 處 理 器 格 式 與 種 類

<1> 前 置 處 理 器 的 格 式 如 下:

#前置處理器名稱 處理內容

<2> 前 置 處 理 器 敘 述 可 寫 在 程 式 中 的 任 何 地 方 .
<3> 前 置 處 理 器 的 種 類 如 下 表 一 所 列 , 其 各 種 前 置 處 理 器
之 使 用 方 法 , 我 們 將 在 以 下 的 章 節 中 一 一 介 紹 .

┌──────────┬────────────────────┐
│ 功 能 │ 前置處理器之敘述 │
├──────────┼────────────────────┤
│ 檔案的含入 │#include │
├──────────┼────────────────────┤
│字串的置換/巨集定義 │#define / #undef │
├──────────┼────────────────────┤
│ │#if .... #elif .... #else .... #endif │
│ 條 件 編 譯 │ │
│ │#ifdef (#ifndef) .... #else .... #endif │
└──────────┴────────────────────┘

z #include(檔 案 的 含 入)

此 敘 述 之 主 要 目 的 是 讓 我 們 將 某 個 程 式 檔 或 標 頭 檔 包 括
在 目 前 的 程 式 內 , 使 目 前 的 程 式 可 引 用 該 檔 內 的 資 料 或 程
式 . 語 法 如 下 :

<1> #include "檔案名稱" : 此表示系統將會到目前的目錄 (路徑 )


下尋找所指定的檔案 ,如果找不到 ,則
會去系統設定的目錄底下尋找 .

<2> #include <檔案名稱> : 此表示系統將會到系統設定的目錄底下


尋找所指定的檔案 .

C 語言簡介 28
Example:
-- def.h 的檔案內容 --
#include < stdio.h >
#include "def.h" #define PI 3.14159
#define a 10
main() #define b 20
{ ----------------------

printf("PI=%2.5f\n",PI); 執行結果 :

printf("a+b=%d\n",a+b); PI=3.14159
} a+b=30

z #define(字 串 的 置 換 / 巨 集 定 義)與 #undef

<1> 巨 集 #define 的 使 用 :

其 主 要 之 功 能 是 以 簡 單 的 名 稱 取 代 某 些 特 定 的 常 數 或 字
串 , 函 數 , 建 立 更 簡 單 更 易 懂 的 程 式 . 語 法 如 下 :

#define 巨集名稱 常數或函式或字串

<2> 巨 集 #undef 的 使 用 :

其 主 要 之 功 能 則 是 取 消 最 接 近 之 #define 所 定 義 的 敘 述 .

#undef 巨集名稱

Example1:

#include < stdio.h > 執行結果 :


#define PI 3.14159
main() PI=3.14159
{
printf("PI=%2.5f",PI);
}

C 語言簡介 29
Example2 : Example3:

#include < stdio.h > #include < stdio.h >


#define add(a,b) a+b #define pstring "This is my first C
program.\n"

void main(void)
{ void main(void)
int i,j,k; {
i=2; printf(pstring,1);
j=3; }
k=add(i,j);

printf("i+j=%d\n",k);
}

執行結果 : 執行結果 :

i+j=5 This is my first C program.

Example4 : Example5 :

#include < stdio.h > #include < stdio.h >


#define compare(a,b) \ #define TURBOC
if ( a > b ) \ void main(void)
printf("a > b"); \ {
else \ #ifdef TURBOC
if ( a < b ) \ printf("Borland C
printf("a < b");\ compiler.\n");
else \ #endif
printf("a = b");
#undef TURBOC
void main(void)
{ #ifndef TURBOC
int a,b; printf("MircoSoft C
a=5; compiler.\n");
b=10; #endif
compare(a,b); }
}
執行結果 :
執行結果 : Borland C compiler.
a < b MircoSoft C compiler.

C 語言簡介 30
z 條 件 式 的 編 譯

<1> 條 件 式 的 編 譯, 此 用 法 的 最 大 特 色 在 於 其 敘 述 不 僅 可 以
放 在 程 式 的 頂 端 , 亦 可 將 其 敘 述 放 置 於 程 式 中 . 以 下 所 列
(1) ,(2) ,(3) 項 為 條 件 式 編 譯 的 成 員 .

(1) #if 和 #endif


(2) #else / #elif
(3) #ifdef 和 #ifndef

<2> 由 以 上 的 敘 述 , 我 們 不 難 發 現 這 些 條 件 式 編 譯 的 成 員
與 前 幾 章 控 制 流 程 所 提 到 if ... then ... else 的 語 法 十 分 相 似 , 且
連 使 用 方 法 與 原 理 都 非 常 相 似 .

Example1: Example2:

#include < stdio.h > #include < stdio.h >


#define value 99 #define value 100

void main(void) void main(void)


{ {
#if value < 100 #if value < 100
printf("value < 100"); printf("value < 100");
#else #elif value > 100
printf("value >= 100"); printf("value > 100");
#endif #else
} printf("value = 100");
#endif
}

執行結果 : 執行結果 :

value < 100 value = 100

C 語言簡介 31
陣 列 與 指 標

z 何 謂 陣 列 ( Array)

1. 有限個相同資料型態之元素組成之集合

2. 一大塊連續之記憶體

3. 一組索引與資料對映

z 一 維 陣 列

<1> 一 維 陣 列 的 宣 告 方 式 如 下 所 述 :

陣列的資料型態 陣列的名稱 [ 陣列的大小 ] ;

int array1 [ 20 ] ;

float array2 [ 25 ] ;

char array3 [ 50 ] ;

<2> 宣 告 陣 列 的 位 置 為 程 式 之 最 上 端 .

<3> 一 維 陣 列 的 排 列 結 構 如 下 圖 所 述 . 若 一 陣 列 名

叫 A 的 陣 列 , 其 陣 列 大 小 有 n 個 , 即 為 A[n] .
C 語言簡介 32
範例:有一陣列宣告如下:

int A[ 20 ] ;

陣列名稱→ A[0] A[1] A[2] ..... A[19]


記憶體→
記憶體位址→ m
(陣列第一元素 m+2 m+4 m+2*(19)
之位址)

<4> 我 們 可 以 在 宣 告 陣 列 時 , 指 定 數 值 給 陣 列 .

陣列的資料型態 陣列的名稱 [ 陣列的大小 ]= {××,××,…××};

範例: int score[5]={ 2, 5, 7 ,9 ,10 };

陣列名稱→ score[0] score[1] score[2] score[3] score[4]


記憶體→ 2 5 7 9 10

Example: 執 行 結 果 :

#include < stdio.h >


void main(void) number[0]=1
{ number[1]=2
int count,total=0; number[2]=3
int number[10]={ 1,2,3,4,5,6,7,8,9,10 }; number[3]=4
number[4]=5
for( count=0 ; count < 10 ; ++count ) number[5]=6
{ number[6]=7
printf("number[%d]=%d\n", number[7]=8
count,number[count]); number[8]=9
total=total + number[count]; number[9]=10
} 1+2+3+4+5+6+7+8+9+10=55
printf("1+2+3+4+5+6+7+8+9+10=%d
\n",total);
}

C 語言簡介 33
z 二 維 陣 列

<1> 二 維 陣 列 的 宣 告 方 式 如 下 所 述 :

陣列的資料型態 陣列的名稱[ 列陣列的大小 ][ 行陣列大小 ] ;

For example: int array1 [ 10 ][ 20 ] ;

float array2 [ 5 ][ 25 ] ;

char array3 [ 100 ][ 50 ] ;

<2> 宣 告 陣 列 的 位 置 為 程 式 之 最 上 端 .

<3> 二 維 陣 列 的 排 列 結 構 如 下 圖 所 述 . 我 們 舉 例 一

陣 列 名 叫 A 的 陣 列 , 其 列 陣 列 大 小 有 m 個 , 行 陣

列 大 小 有 n 個 , 即 為 A[m][n] .


(column)
列 A [ 0 ] [ 0 ] A [ 0 ] [ 1 ] A [ 0 ] [ 2 ] . . . . . . A[0][n-1]
(row) A [ 1 ] [ 0 ] A [ 1 ] [ 1 ] A [ 1 ] [ 2 ] . . . . . . A [ 1 ] [ n - 1 ]
A [ 2 ] [ 0 ] A [ 2 ] [ 1 ] A [ 2 ] [ 2 ] . . . . . . A[2][n-1]
. . . . .
. . . . .
A[m-1][0] A[m-1][1] A[m-1][2] A[m-1][n-1]

C 語言簡介 34
<4> 我 們 可 以 在 宣 告 陣 列 時 , 指 定 數 值 給 陣 列 . 例

如 :

int score1[2][5]={{ 1, 2, 3, 4, 5 },{ 5, 4, 3, 2, 1 }};

或 是 在 程 式 過 程 中 指 定 數 值 給 陣 列 . 例 如 :

void main(void)
{
int score1[2][5]; /* 陣列宣告 */
score1[0][0]=1; /* 程式本體 */
score1[0][1]=2;
score1[0][2]=3;
score1[0][3]=4;
score1[0][4]=5;
score1[1][0]=5;
score1[1][1]=4;
score1[1][2]=3;
score1[1][3]=2;
score1[1][4]=1;
……
}

C 語言簡介 35
【實例探討】某學生之功課表如下,(每個課程名稱皆以代碼表示)

一 二 三 四 五
1 2 2
2 1 4 1 4 1
3 5 5 5
4
5 3 3 3
6

課程名稱 代碼
計算機概論 1
離散數學 2
資料結構 3
資料庫概論 4
上機實習 5

此課表可以以一個二維陣列表示,其宣告方式如下: int course [6][5];

記憶體位址 記憶體
a (陣列起始位址) course [0][0]
a+2 course [0][1]
a+4 course [0][2]

a + 56 course [5][3]
a + 58 course [5][4]

此課表之抽象表示如下:
(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)
(4,0) (4,1) (4,2) (4,3) (4,4)
(5,0) (5,1) (5,2) (5,3) (5,4)
C 語言簡介 36
/* ================================================== */
/* 程式實例: 查詢上課的課目,其中課程以代碼表示. */
/* 0 表示沒課 */
/* 1 表示計算機概論 */
/* 2 表示離散數學 */
/* 3 表示資料結構 */
/* 4 表示資料庫概論 */
/* 5 表示上機實習; */
/* ================================================== */
void main()
{
int course[6][5] = { 0, 2, 0, 2, 0, /* 課程定義 */
1, 4, 1, 4, 1,
5, 0, 5, 0, 5,
0, 0, 0, 0, 0,
3, 0, 3, 0, 3,
0, 0, 0, 0, 0 };
int week; /* 星期資料變數 */
int class; /* 第幾節課的變數 */
int class_no; /* 課程代碼變數 */

printf("請輸入星期(1 到 5). ==> ");


scanf("%d",&week); /* 讀取星期資料 */
printf("請輸入第幾節課(1 到 6). ==> ");
scanf("%d",&class); /* 讀取第幾節課 */
class_no = course[class-1][week-1]; /* 課程查詢 */
switch ( class_no ) /* 印出課程名稱 */
{
case 0: printf("這節沒課\n");
break;
case 1: printf("計算機概論\n");
break;
case 2: printf("離散數學\n");
break;
case 3: printf("資料結構\n");
break;
case 4: printf("資料庫概論\n");
break;
case 5: printf("上機實習\n");
break;
}
}

C 語言簡介 37
/* ======================================== */
/* 計算出一星期的課程總數 */
/* ======================================== */

void main()
{
int course[6][5] = { 0, 2, 0, 2, 0, /* 課程定義 */
1, 4, 1, 4, 1,
5, 0, 5, 0, 5,
0, 0, 0, 0, 0,
3, 0, 3, 0, 3,
0, 0, 0, 0, 0 };
int sum; /* 課程總數 */
int i,j;

sum = 0; /* 設定課程總數初值 */
for ( i = 0; i < 6; i++ ) /* 二維陣列的走訪 */
for ( j = 0; j < 5; j++ )
if ( course[i][j] != 0 ) /* 檢查有沒有課 */
sum++;
printf("課程總數: %d\n",sum); /* 印出課程總數 */
}

C 語言簡介 38
z 陣 列 表 示 法

陣列之表示法有兩種:

1. 以列為主或行為主之表示法

2. 使用指標陣列 (指標單元再介紹)

◊ 以列為主或以行為主之表示法


(0,0) (0,1) (0,2) (0,3) (0,4) 列一
(1,0) (1,1) (1,2) (1,3) (1,4) 列二
(2,0) (2,1) (2,2) (2,3) (2,4) 列三

(3,0) (3,1) (3,2) (3,3) (3,4) 列四
(4,0) (4,1) (4,2) (4,3) (4,4) 列五
(5,0) (5,1) (5,2) (5,3) (5,4) 列六
行一 行二 行三 行四 行五

陣列共有 6*5=30 元素。然而,記憶體實際以宣告一個長度為 30 之一維陣


列儲存之,其宣告方式如下:

int class [30];

以列為主所見之陣列表示方式如下:

列一 列二 列六
(0,0) (0,1) (0,2) (0,3) (0,4) (1,0) (1,1) (1,2) (1,3) (1,4) … (5,0) (5,1) (5,2) (5,3) (5,4)
0 1 2 3 4 5 6 7 8 9 25 26 27 28 29

以行為主所見之陣列表示方式如下:

行一 行二 行六
(0,0) (1,0) (2,0) (3,0) (4,0) (5,0) (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) … (0,4) (1,4) (2,4) (3,4) (4,4) (5,4)
0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29

C 語言簡介 39
【公式】:假設有一二維陣列 A[r,c] 之大小為 r*c,則此二維陣列 A[i,j]

以一維陣列表示之索引值為:

1. 以列為主:i*c+j

2. 以行為主:j*r+i

z 字 元 陣 列

<1> 字 元 陣 列 的 宣 告 方 式 如 下 所 述 :

char 陣列的名稱 [ 陣列的大小 ] ;

or char 陣列的名稱 [ 列陣列的大小 ][ 行陣列大小 ] ;

For example: char array1 [ 10 ] ;


char array2 [ 5 ][ 25 ] ;

<2> 宣 告 陣 列 的 位 置 為 程 式 之 最 上 端 .

<3> 我 們 可 以 在 宣 告 陣 列 時 , 指 定 字 元 給 陣 列 .

例一 : int string[6]={'A','B','C','D','E','\0'};

或 int string[5]="ABCDE";

例二 : int string1[2][6]={{'A','B','C','D','E','\0'},
{'F','G','H','I','J','\0'}];

或 int string1[2][5]={ "ABCDE","FGHIJ" };

C 語言簡介 40
或 是 在 程 式 過 程 中 指 定 數 值 給 陣 列 . 例 如 :

void main(void)

{ int string[6]; /* 陣列宣告 */


score1[0]='M'; /* 程式本體 */
score1[1]='E';
score1[2]='R';
score1[3]='R';
score1[4]='Y';
score1[5]='\0';
strcpy(string,"MERRY");
/* 將 "MERRY" 字串拷貝至 string 陣列中 */

<4> 如 果 字 元 陣 列 以 字 元 的 方 式 來 存 取 陣 列 , 則 須

加 結 束 字 元 \0 於 陣 列 的 最 末 端 作 為 結 束 .

Example: 執 行 結 果 :

#include < stdio.h >


string1="ABCDE?ABCDE"
void main(void) string2 = "ABCDE"
{ string3 = "ABCDE"
char string1[5]={'A','B','C','D','E'}; string4 = "ABCDE"
char
string2[6]={'A','B','C','D','E','\0'};
char string3[6]="ABCDE\0";
char string4[5]="ABCDE";

printf("string1 = \"%s\"\n",string1);
printf("string2 = \"%s\"\n",string2);
printf("string3 = \"%s\"\n",string3);
printf("string4 = \"%s\"\n",string4);
}

C 語言簡介 41
z 陣 列 與 基 本 輸 出 / 輸 入 函 數 的 搭 配

無 論 是 整 數 , 浮 點 數 或 字 元 陣 列 (字串 ) 均 可 與 基 本

輸 出 / 輸 入 函 數 的 搭 配 .

printf("%s\n",array1);

puts(array1);

scanf("%s",array1);

gets(array1);

所 以 USER 可 以 自 行 參 考 相 關 的 章 節 使 用 之 . 在 此

補 充 一 點 , 上 述 所 敘 述 scanf 函 數 是 乎 少 一 個 & (位址

運算元 ) ? ? ? 沒 錯 ! 那 是 因 為陣 列 本 身 的 名 稱 即 代 表

其 位 址 之 所 在 , 所 以 不 需 在 陣 列 名 稱 前 加 上 & 符

號 來 代 表 位 址 .

C 語言簡介 42
z 指 標 ( Pointer )

指 標 是 一 個 用 來 指 示 資 料 存 在 於 記 憶 體 中 的 位 址

標 示 器 . 由 指 標 的 運 用 裡 , 使 我 們 瞭 解 到 資 料 與 位

址 間 的 關 係 , 進 而 對 記 憶 體 配 置 有 很 大 的 幫 助 .

z 指 標 的 基 本 觀 念

<1>在 C 語 言 中 , 若 某 變 數 所 含 的 是 一 個 記 憶 體 位

址,此 變 數 稱 為 指 標 變 數。如 下 圖 所 示

<2> 在 C 語 言 中 , 指 標 變 數 的 宣 告 方 式 如 下 :

變數資料型態 *變數名稱 ;

For example int *ptr ;

如 下 圖 所 示

ptr → 變數 ptr → 1010 H



指 0800H
標 0802H
變 ….. …
數 1010H 16 ←*ptr
記憶體

C 語言簡介 43
由 以 上 的 宣 告 , 表 示 了 三 件 事:

z ptr 為 指 標 變 數 , ptr 代 表 一 個 位 址 ,

z *ptr 代 表 此 位 址 內 的 資 料 .

z ptr 所 指 向 此 位 址 之 變 數 型 態 為 整 數 ( int ) .

<3> 指 標 變 數 宣 告 的 關 鍵 字 為 " * " , 而 指 標 變 數 的 資

料 型 態 也 分 為 整 數 ( int ) , 浮 點 數 ( float ) , 字 元

( char ) 三 種 .

Example: 執行結果 :

#include < stdio.h > x = 10


&x = ffda
void main(void) *y = 10
{ y = ffda
int x=10;
int *y;
y=&x;
printf(" x = %d\n", x);
printf("&x = %x\n",&x);
printf("*y = %d\n",*y);
printf(" y = %x\n", y);
}

<4> "&" 為另一重要符號,"&"為一個特殊運算子,目的為傳回運算元之

位址

<5>為什麼 scanf() 中之所有引數變數一定要加上"&"符號???……….

C 語言簡介 44
z -二維陣列之指標表示法

陣列之表示法有兩種:

1. 以列為主或行為主之表示法

2. 使用指標陣列 (現在介紹,學生之功課表為例,見講義 36~38 頁)

◊ 使用指標陣列


(0,0) (0,1) (0,2) (0,3) (0,4) 列一
(1,0) (1,1) (1,2) (1,3) (1,4) 列二
(2,0) (2,1) (2,2) (2,3) (2,4) 列三

(3,0) (3,1) (3,2) (3,3) (3,4) 列四
(4,0) (4,1) (4,2) (4,3) (4,4) 列五
(5,0) (5,1) (5,2) (5,3) (5,4) 列六
行一 行二 行三 行四 行五

陣列 course[6][5]共有 6*5=30 元素。今宣告一指標陣列 pointer[6]代表陣


列 course 之列數,其宣告方式如下:

int pointer[6];

此指標陣列之圖形表示方式如下:

列一 列一
列三 列二
列二 列三
列四
列五
列五 列六
data pointer

C 語言簡介 45
【公式】:假設有一二維陣列 A[r,c] 之大小為 r*c,則此二維陣列 A[i,j]

在指標陣列之圖形表示方式法之索引值為:

pointer(i) + j

index value
0 0 0 2 0 2 0
1 10 5 0 5 0 5
2 5 1 4 1 4 1
3 25 3 0 3 0 3
4 15 0 0 0 0 0
5 20 0 0 0 0 0
pointer

/* ======================================== */
/* 計算出一星期的課程總數.(指標陣列一) */
/* ======================================== */
void main()
{
int pointer[6] = { 0, 10, 5, 25, 15, 20 };
int data[30] = { 0, 2, 0, 2, 0, /* 課程定義 */
5, 0, 5, 0, 5,
1, 4, 1, 4, 1,
3, 0, 3, 0, 3,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0 };
int sum; /* 課程總數 */
int i,j;
sum = 0; /* 設定課程總數初值 */
for ( i = 0; i < 6; i++ ) /* 陣列的走訪 */
for ( j = 0; j < 5; j++ )
if ( data[pointer[i]+j] != 0 ) /* 檢查有沒有課 */
sum++;
printf("課程總數: %d\n",sum); /* 印出課程總數 */
}

C 語言簡介 46
index value
0 0 0 2 0 2 0
1 10 5 0 5 0 5
2 5 1 4 1 4 1
3 20 3 0 3 0 3
4 15 0 0 0 0 0
5 20
pointer

/* ======================================== */
/* 計算出一星期的課程總數.(指標陣列二) */
/* ======================================== */
void main()
{
int pointer[6] = { 0, 10, 5, 20, 15, 20 };
int data[25] = { 0, 2, 0, 2, 0, /* 課程定義 */
5, 0, 5, 0, 5,
1, 4, 1, 4, 1,
3, 0, 3, 0, 3,
0, 0, 0, 0, 0 };
int sum; /* 課程總數 */
int i,j;
sum = 0; /* 設定課程總數初值 */
for ( i = 0; i < 6; i++ ) /* 陣列的走訪 */
for ( j = 0; j < 5; j++ )
if ( data[pointer[i]+j] != 0 ) /* 檢查有沒有課 */
sum++;
printf("課程總數: %d\n",sum); /* 印出課程總數 */
}

C 語言簡介 47
z 指 標 與 函 數 間 的 關 係

關 於 函 數 呼 叫 的 方 式 中 , Call by value 的 引 數 傳 遞 方

式 , 被 呼 叫 函 數 不 能 直 接 更 改 呼 叫 函 數 中 的 變 數 ,

但 如 果 是 以 指 標 當 作 函 數 的 引 數 ( Call by reference ) , 則

上 述 的 狀 況 均 迎 刃 而 解 , 而 且 也 不 受 函 數 返 回 值

( return ) 只 能 有 一 個 的 影 響 .

Example:

#include < stdio.h >

change(x,y)
int *x,*y;
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}

void main(void)
{
int m=3,n=4;
printf(" m = %d n= %d \n\n",m,n);
printf(" m = %d n= %d \n\n",m,n);
change(&m,&n);
printf(" m = %d n= %d \n",m,n);
}

C 語言簡介 48
z 指 標 與 陣 列 的 關 係

我 們 可 以 將 指 標 與 陣 列 的 關 係 來 做 一 對 比 . 例 如 :

有 一 整 數 陣 列 名 為 array , 其 陣 列 大 小 為 五 個 , 其 內

容 分 別 是 1,2,3,4,5 .

For example: int array[5]={ 1,2,3,4,5 };

陣列位址 指標相對位址
array[0] → 1 *(array+0)
array[1] → 2 *(array+1)
array[2] → 3 *(array+2)
array[3] → 4 *(array+3)
array[4] → 5 *(array+4)

Example: 執行結果 :

#include < stdio.h >


array[0]=1 <--> *(array+0)=1
void main(void) array[1]=2 <--> *(array+1)=2
array[2]=3 <--> *(array+2)=3
{
array[3]=4 <--> *(array+3)=4
int array[5]={ 1,2,3,4,5 };
array[4]=5 <--> *(array+4)=5
int count;

for ( count=0 ; count<5 ; ++count )


printf("array[%d]=%d
<-->*(array+%d\)=%d\n",count,
array[count], count,
*(array+count));
}

C 語言簡介 49
z 指 標 與 字 元 陣 列 ( 字 串 ) 間 的 關 係

Example: 執行結果 :

#include < stdio.h >


string[0]=P <--> *(string+0)=P
string[1]=O <--> *(string+1)=O
void main(void)
string[2]=I <--> *(string+2)=I
{
string[3]=N <--> *(string+3)=N
char string[7]="POINTER"; string[4]=T <--> *(string+4)=T
int count; string[5]=E <--> *(string+5)=E
string[6]=R <--> *(string+6)=R
for (count=0 ; count<7 ; ++count )
printf("string[%d]=%c <-->
*\(string+%d\)=%c\n",
count, string[count],

count,*(string+count))
;
}

z 指 標 與 陣 列 的 混 合 應 用

指標之運算有兩種: (+) 、 (-) 。

假設指標 ptr 指令 執行結果 執行動作


所指資料為 ptr++ 1668 指向下一個整數位址
整數,且其為 ptr−− 1664 指向前一個整數位址
指為 1666 ptr+7 1676 指向第七個整數位址

C 語言簡介 50
z 資料結構:指標範例之說明

(A) void main()


{
int s[] = {3,2,5,7,9}, *q;
q=s;
printf(“%d\n”,*q); Æ 3
printf(“%d\n”,(*q)+3); Æ3
printf(“%d\n”,*(q+4)); Æ9 /* q=s 不動 */

q+=2; /* q 往後移 2 位 */
printf(“%d\n”,*q); Æ5
}

(B) void main()


{
int s[] = {1,3,7,9,6,8}, *q;
q=s; /* q=s 不動 */
printf(“%d\n”,*q++); Æ 1
/* 後置增量乃處理所有工作完再增加; q++ ~~ q=q+1 */

/* 找到 *q 後再增加一單位位址 */
printf(“%d\n”,(*q)+2); Æ 5 /* 3+2 */
printf(“%d\n”,*(q+2)); Æ 9
/* q 以下 2 單位位址所對應之數值 */
q++;
/* q 增加一單位 */ /* q 往後移 1 位 */
printf(“%d\n”,*q); Æ 7
}

C 語言簡介 51
結 構 與 聯 集

z 結 構 (Structure)

通常一個簡單之變數或陣列不足以用來儲存複雜之記錄。C 語言中有結構

體之架構,允許使用者宣告資料實體將不同形式之元素儲存一起。事實

上,結構是一種是一種由使用者自訂之資料型態。

<1> 在 C 語言中,結構體的宣告方式如下 :

struct 結構名稱標籤 { 資料型態 資料變數元素 1;

資料型態 資料變數元素 2;

‧‧‧‧‧‧‧‧ };

For example struct Personal {char Name;


int Hour;
int Minute;
};

陣列; 結構;
相同型態資料項目 不同型態資料

簡單變數
10 John Name
單一資料項目

20 10 Hour

41
30 30 Time

C 語言簡介 52
<2> 結構被宣告後即可定義任何變數。 由上述宣告的例子來說明 ,

Personal 為 此結構之名稱 ,又稱為標籤 ( tag ) , 而在{ } ( 括 號 )

內的敘述則是 personal 這個結構的成員 , Name 為 Personal 這個結

構的變數名稱 。最後在結構宣告結束時須加一 ; (分號) 表示。

<3> 結構的成員其資料型態可以使用 int, float 及 char。也可用陣列與指

標變數。

<4> 結構的宣告與使用亦分為內,外部 。所謂內部宣告即表示結構的宣告

在程式的 { } ( 括 號 ) 內完成 , 反之 , 如果結構的宣告在程式的

{ } ( 括號 ) 外完成稱外部宣告。

C 語言簡介 53
z 結 構 的 使 用

C 語言簡介 54
上例中結構變數 taipei 的宣告, 當結構變數 taipei 宣告完成後即

表示其成員包含 下列六項 :

taipei.id ( 或 taipei->id )

taipei.name ( 或 taipei->name )

taipei.age ( 或 taipei->age )

taipei.sex ( 或 taipei->sex )

taipei.address ( 或 taipei->address )

taipei.tel ( 或 taipei->tel )

執 行 結 果 :

Please input your id : 007

Please input your name : Mike

Please input your address : Taipei

Please input your telephone number : 12345678

Please input your sex ( M or F ) : M

Please input your age : 29

‧‧‧‧‧‧‧‧‧‧

Your telephone number : 12345678

C 語言簡介 55
z 指標與結構: 鏈結串列 (Linked List)

鏈結串列乃是以指標指向相關之結構。

執 行 結 果 :

p.s. (.) 運算子將結構與結構成員連結

(->) 運算子將指標與結構成員連結

C 語言簡介 56
z 聯集 (Union)

<1> 聯集之形式與結構非常類似。在 C 語言中, 聯集之宣告方式如下 :

union 聯集名稱標籤 { 資料型態 資料變數元素 1;

資料型態 資料變數元素 2;

‧‧‧‧‧‧‧‧ };

Example:

union unit { object.ch = ‘a’;


char ch; object.num = 100;
int num; object.fl = 3.41;
float fl;
} object;

<2> 聯集與結構之不同處在於聯集所佔之空間為所有成員中最大物件擁

有之空間。也就是說,聯集中所有成員,再同一瞬間,僅能有一種

型態存在。上例中,聯集 object 不可能擁有字元 ’a’ 與整數 100; 它

僅佔有 4 個 Bytes ,因為成員中 float 型態所佔有空間最大。

C 語言簡介 57
如何使用Visual C++說明
z 由 File 功能表選擇 New (第一次編輯程式) ,會出現下列畫面:在 Files 功能項
中,選擇 C++ Source File 選項後即可開始編輯。

z 或 Open (有現成程式)

C 語言簡介 58
z Compile: (編譯) (程式之格式與語法之檢查)

若原始程式完成後,請給一個檔名並存檔。存檔完後即可進行編譯之工作

(Visual C++中之指令為 Build 或 Rebuild )。 編譯成功後(即 No Errors) (Some

warnings are allowed but should be noticed),系統會產生 ××.obj 檔 (No Errors)

C 語言簡介 59
z Link (連結):編譯成功後,即可進行連結 (Visual C++中之指令為 Build 或 Rebuild
)。成功後,系統會產生 ××.exe 檔

z Run/Execute( 執行 ) :可看見程式之執行結果 (Visual C++ 中之指令為 Execute


)

C 語言簡介 60
【範例一】撰寫一個程式,能接受一個 double float 數值之輸入,利用 exp 函數
計算其指數函數值並印出其結果。

exp 函數語法: double exp(double x);

◊ 程式

◊ Run(執行結果)

C 語言簡介 61
【範例二】撰寫一個程式,能接受一個字串之輸入,利用 atof 函數將其轉換為 Double
Float 並印出其結果。

atof 函數語法: double atof(const char *string);


此函數會將字串參數 string 轉換為 Double Float 浮點數

◊ 程式

C 語言簡介 62
【範例三】 撰寫一個程式,能接受一個 double float 數值之輸入,利用 exp, log,
log10, pow, pow10 函數計算其指數及對數函數值並印出其結果。

簡易數學函數之使用,使用下列函數時,你必須在程式前面加上:

# include <math.h>

◊ Log 函數語法: double log(double x);


log(x); 此函數將會計算出以 自然對數 e 為底之對數值之 Double Float

◊ log10 函數語法: double log10(double x);


log10(x); 此函數將會計算出以 10 為底之對數值之 Double Float 數

◊ pow 函數語法: double pow(double x, double y);


pow(x,y); 此函數將會計算出 x 之 y 次方值

◊ pow10 函數語法: double pow10(int p);


pow10(x); 此函數將會計算出 10 之 x 次方值

◊ exp 函數語法: double pow(double x, double y);


exp(x); 此函數將會計算出 e 之 x 次方值

C 語言簡介 63
◊ 程式

C 語言簡介 64
【範例四】C 語言運算子之計算

<1> *x++ <2> (*x)++ <3> ++(*x) <4> *x+=1 <5> *++x

<1> result of *x++

C 語言簡介 65
<2> Result of (*x)++

<3> Result of ++(*x)

<4> Result of *x +=1

C 語言簡介 66
<5> Result of *++x

位址

9294 *X=10 X=S[0]

9296 20 S[1]

<1> *x++ <2> (*x)++ <3> ++(*x) <4> *x+=1 <5> *++x

20 11 11 11 20

C 語言簡介 67
結 構 與 聯 集

z 結 構 (Structure)

通常一個簡單之變數或陣列不足以用來儲存複雜之記錄。C 語言中有結構體之架

構,允許使用者宣告資料實體將不同形式之元素儲存一起。事實上,結構是一種是一

種由使用者自訂之資料型態。

<1> 在 C 語言中,結構的宣告方式如下 :

struct 結構名稱標籤 { 資料型態 資料變數元素 1;


資料型態 資料變數元素 2;
‧‧‧‧‧‧‧‧ };

For example struct Personal {char Name;


int Hour;
int Minute;

};

陣列; 結構;
相同型態資料項目 不同型態資料

簡單變數
10 John Name
單一資料項目

20 10 Hour

41
30 30 Time

C 語言簡介 68
<2> 結構被宣告後即可定義任何變數。 由上述宣告的例子來說明 , Personal 為 此結

構之名稱 ,又稱為標籤 ( tag ) , 而在{ } ( 括 號 ) 內的敘述則是 personal 這個結構

的成員 , Name 為 Personal 這個結構的變數名稱 。最後在結構宣告結束時須加一 ;

(分號) 表示。

<3> 結構的成員其資料型態可以使用 int, float 及 char。也可用陣列與指標變數。

<4> 結構的宣告與使用亦分為內,外部 。所謂內部宣告即表示結構的宣告在程式的 { }

( 括 號 ) 內完成 , 反之 , 如果結構的宣告在程式的 { } ( 括號 ) 外完成稱外部宣

告。

z 結 構 的 使 用

C 語言簡介 69
上例中結構變數 taipei 的宣告, 當結構變數 taipei 宣告完成後即表示其成員包含 下
列六項 :
taipei.id ( 或 taipei->id )
taipei.name ( 或 taipei->name )
taipei.age ( 或 taipei->age )
taipei.sex ( 或 taipei->sex )
taipei.address ( 或 taipei->address )
taipei.tel ( 或 taipei->tel )

執 行 結 果 :
Please input your id : 007
Please input your name : Mike
Please input your address : Taipei
Please input your telephone number : 12345678
Please input your sex ( M or F ) : M
Please input your age : 29
‧‧‧‧‧‧‧‧‧‧
Your telephone number : 12345678

z 指標與結構: 鏈結串列 (Linked List)


鏈結串列乃是以指標指向相關之結構。

C 語言簡介 70
執 行 結 果 :

p.s. (.) 運算子將結構與結構成員連結


(->) 運算子將指標與結構成員連結

z 聯集 (Union)

<1> 聯集之形式與結構非常類似。在 C 語言中, 聯集之宣告方式如下 :

union 聯集名稱標籤 { 資料型態 資料變數元素 1;


資料型態 資料變數元素 2;
‧‧‧‧‧‧‧‧ };

Example:

union unit { object.ch = ‘a’;


char ch; object.num = 100;
int num; object.fl = 3.41;
float fl;
} object;

<2> 聯集與結構之不同處在於聯集所佔之空間為所有成員中最大物件擁有之空

間。也就是說,聯集中所有成員,再同一瞬間,僅能有一種型態存在。上例中,

聯集 object 不可能擁有字元 ’a’ 與整數 100; 它僅佔有 4 個 Bytes ,因為成員中

float 型態所佔有空間最大。

C 語言簡介 71

You might also like