Professional Documents
Culture Documents
z 什麼是 C 語言?
z C 語言執行過程?
z C 語 言 的 特 性
(1) 可 以 像 組 合 語 言 一 樣 進 行 硬 體 之 直 接 存 取 .
(2) 為 語 法 規 則 簡 單 , 清 楚 , 容 易 使 用 之 結 構 化 語 言 .
(3) 必 要 時 可 以 與 組 合 語 言 連 結 .
( 4 ) 可 攜 性 ( Portability ) 極 佳 , 跨 平 台 的 能 力 強 .
z 標 準 C 語 言 格 式
C 語言簡介 1
基 本 資 料 型 態
z 變 數 命 名 的 原 則 ?
1. 開 頭 必 須 是 字 母 ( letter ) 或 底 線 ( underscore ) .
2. 字 元 的 大 寫 小 寫 所 代 表 的 意 義 不 同 .
3. 不 得 使 用 關 鍵 字 ( keyword ) . (在 Borland C++ 軟體中已粗體顯現)
z 變 數 的 資 料 型 態 種 類 :
類 別 符號位元 位元長(bits) 表 示 法 數 值 範 圍
16 int(short) -32768->32767
有
32 long -2147483648->2147483647
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);
} }
C 語言簡介 4
z 外 部 變 數 ( extern variable)
外 部 變 數 和 前 面 所 提 到 的 變 數 不 同。外 部 變 數 的 有 效 範 圍
不 是 區 域 性 , 而 是 整 體 性 ( global ) , 外 部 變 數 定 義 在 任 何 函
數 的 外 面 , 表 示 可 以 被 其 他 函 數 所 共 用 。
Example 1: Example 2:
main() main()
{ {
printf("%d\n",x); int x=321;
printf("%d\n",x);
} }
Example 3:
C 語言簡介 5
/* ======================================== */
/* 程式實例: */
/* 局部(local)和整體(Global) 變數 */
/* ======================================== */
#include <stdio.h>
/* ---------------------------------------- */
/* 將變數值加一 */
/* ---------------------------------------- */
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 )
邏 輯 運 算 的 種 類
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 的 運 用
Syntax 1: Syntax 2:
statement n ;
Example 1: Example 2:
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 ) ;
z 函 數 的 結 構 (格式)
1. 函 數 的 定 義 (Function Definition)
2. 呼 叫 函 數 (Function Call)
3. 函 數 原 形 宣 告 (Function Prototype)
z 函 數 的 定 義 (格式)
Example:
C 語言簡介 19
z 函 數 的 儲 存 類 別
函 數 的 儲 存 類 別
儲存類別 功能敘述
static 只能在進行宣告的編譯單位內可以執行
extern 在進行宣告的編譯單位以外也可執行
ps. 一 般 函 數 的 儲 存 類 別 可 以 省 略 , 此 時 當 作 "extern" 處 理 。
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 )
C 語言簡介 21
C 語言簡介 22
/* ================================================== */
/* 程式實例:傅值和傳址的副程序呼叫(交換 XY) */
/* ================================================== */
/* --------------------交換兩值(傳值副程序)-------------------- */
temp = x;
x = y;
y = 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);
C 語言簡介 23
遞迴 ( recursion)
C 語 言 的 函 數 可 進 行 遞 迴 呼 叫 ( recursive call ) , 也 就 是 說 在 函
數 之 中 可 呼 叫 函 數 本 身 。 函 數 在 進 行 遞迴 呼 叫 時 , 在 其 所
使 用 的 變 數 被 堆 積 在 堆 疊 區 域 , 每 次 執 行 return 敘 述 , 函 數
在 該 層 呼 叫 中 所 使 用 的 變 數 就 從 堆 疊 返 回 。
z 遞迴函數之特性
(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);
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(檔 案 的 含 入)
此 敘 述 之 主 要 目 的 是 讓 我 們 將 某 個 程 式 檔 或 標 頭 檔 包 括
在 目 前 的 程 式 內 , 使 目 前 的 程 式 可 引 用 該 檔 內 的 資 料 或 程
式 . 語 法 如 下 :
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
<1> 巨 集 #define 的 使 用 :
其 主 要 之 功 能 是 以 簡 單 的 名 稱 取 代 某 些 特 定 的 常 數 或 字
串 , 函 數 , 建 立 更 簡 單 更 易 懂 的 程 式 . 語 法 如 下 :
<2> 巨 集 #undef 的 使 用 :
其 主 要 之 功 能 則 是 取 消 最 接 近 之 #define 所 定 義 的 敘 述 .
#undef 巨集名稱
Example1:
C 語言簡介 29
Example2 : Example3:
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);
}
執行結果 : 執行結果 :
Example4 : Example5 :
C 語言簡介 30
z 條 件 式 的 編 譯
<1> 條 件 式 的 編 譯, 此 用 法 的 最 大 特 色 在 於 其 敘 述 不 僅 可 以
放 在 程 式 的 頂 端 , 亦 可 將 其 敘 述 放 置 於 程 式 中 . 以 下 所 列
(1) ,(2) ,(3) 項 為 條 件 式 編 譯 的 成 員 .
<2> 由 以 上 的 敘 述 , 我 們 不 難 發 現 這 些 條 件 式 編 譯 的 成 員
與 前 幾 章 控 制 流 程 所 提 到 if ... then ... else 的 語 法 十 分 相 似 , 且
連 使 用 方 法 與 原 理 都 非 常 相 似 .
Example1: Example2:
執行結果 : 執行結果 :
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 ] ;
<4> 我 們 可 以 在 宣 告 陣 列 時 , 指 定 數 值 給 陣 列 .
Example: 執 行 結 果 :
C 語言簡介 33
z 二 維 陣 列
<1> 二 維 陣 列 的 宣 告 方 式 如 下 所 述 :
float array2 [ 5 ][ 25 ] ;
<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> 我 們 可 以 在 宣 告 陣 列 時 , 指 定 數 值 給 陣 列 . 例
如 :
或 是 在 程 式 過 程 中 指 定 數 值 給 陣 列 . 例 如 :
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
記憶體位址 記憶體
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; /* 課程代碼變數 */
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) 列六
行一 行二 行三 行四 行五
以列為主所見之陣列表示方式如下:
列一 列二 列六
(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> 字 元 陣 列 的 宣 告 方 式 如 下 所 述 :
<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'}];
C 語言簡介 40
或 是 在 程 式 過 程 中 指 定 數 值 給 陣 列 . 例 如 :
void main(void)
<4> 如 果 字 元 陣 列 以 字 元 的 方 式 來 存 取 陣 列 , 則 須
加 結 束 字 元 \0 於 陣 列 的 最 末 端 作 為 結 束 .
Example: 執 行 結 果 :
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 可 以 自 行 參 考 相 關 的 章 節 使 用 之 . 在 此
運算元 ) ? ? ? 沒 錯 ! 那 是 因 為陣 列 本 身 的 名 稱 即 代 表
其 位 址 之 所 在 , 所 以 不 需 在 陣 列 名 稱 前 加 上 & 符
號 來 代 表 位 址 .
C 語言簡介 42
z 指 標 ( Pointer )
指 標 是 一 個 用 來 指 示 資 料 存 在 於 記 憶 體 中 的 位 址
標 示 器 . 由 指 標 的 運 用 裡 , 使 我 們 瞭 解 到 資 料 與 位
址 間 的 關 係 , 進 而 對 記 憶 體 配 置 有 很 大 的 幫 助 .
z 指 標 的 基 本 觀 念
<1>在 C 語 言 中 , 若 某 變 數 所 含 的 是 一 個 記 憶 體 位
址,此 變 數 稱 為 指 標 變 數。如 下 圖 所 示
<2> 在 C 語 言 中 , 指 標 變 數 的 宣 告 方 式 如 下 :
變數資料型態 *變數名稱 ;
如 下 圖 所 示
C 語言簡介 43
由 以 上 的 宣 告 , 表 示 了 三 件 事:
z ptr 為 指 標 變 數 , ptr 代 表 一 個 位 址 ,
z *ptr 代 表 此 位 址 內 的 資 料 .
z ptr 所 指 向 此 位 址 之 變 數 型 態 為 整 數 ( int ) .
料 型 態 也 分 為 整 數 ( int ) , 浮 點 數 ( float ) , 字 元
( char ) 三 種 .
Example: 執行結果 :
位址
C 語言簡介 44
z -二維陣列之指標表示法
陣列之表示法有兩種:
1. 以列為主或行為主之表示法
◊ 使用指標陣列
行
(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) 列六
行一 行二 行三 行四 行五
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:
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 .
陣列位址 指標相對位址
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: 執行結果 :
C 語言簡介 49
z 指 標 與 字 元 陣 列 ( 字 串 ) 間 的 關 係
Example: 執行結果 :
count,*(string+count))
;
}
z 指 標 與 陣 列 的 混 合 應 用
C 語言簡介 50
z 資料結構:指標範例之說明
q+=2; /* q 往後移 2 位 */
printf(“%d\n”,*q); Æ5
}
/* 找到 *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 語言中,結構體的宣告方式如下 :
資料型態 資料變數元素 2;
‧‧‧‧‧‧‧‧ };
陣列; 結構;
相同型態資料項目 不同型態資料
簡單變數
10 John Name
單一資料項目
20 10 Hour
41
30 30 Time
C 語言簡介 52
<2> 結構被宣告後即可定義任何變數。 由上述宣告的例子來說明 ,
標變數。
{ } ( 括號 ) 外完成稱外部宣告。
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 )
執 行 結 果 :
‧‧‧‧‧‧‧‧‧‧
C 語言簡介 55
z 指標與結構: 鏈結串列 (Linked List)
鏈結串列乃是以指標指向相關之結構。
執 行 結 果 :
(->) 運算子將指標與結構成員連結
C 語言簡介 56
z 聯集 (Union)
資料型態 資料變數元素 2;
‧‧‧‧‧‧‧‧ };
Example:
<2> 聯集與結構之不同處在於聯集所佔之空間為所有成員中最大物件擁
有之空間。也就是說,聯集中所有成員,再同一瞬間,僅能有一種
C 語言簡介 57
如何使用Visual C++說明
z 由 File 功能表選擇 New (第一次編輯程式) ,會出現下列畫面:在 Files 功能項
中,選擇 C++ Source File 選項後即可開始編輯。
z 或 Open (有現成程式)
C 語言簡介 58
z Compile: (編譯) (程式之格式與語法之檢查)
若原始程式完成後,請給一個檔名並存檔。存檔完後即可進行編譯之工作
C 語言簡介 59
z Link (連結):編譯成功後,即可進行連結 (Visual C++中之指令為 Build 或 Rebuild
)。成功後,系統會產生 ××.exe 檔
C 語言簡介 60
【範例一】撰寫一個程式,能接受一個 double float 數值之輸入,利用 exp 函數
計算其指數函數值並印出其結果。
◊ 程式
◊ Run(執行結果)
C 語言簡介 61
【範例二】撰寫一個程式,能接受一個字串之輸入,利用 atof 函數將其轉換為 Double
Float 並印出其結果。
◊ 程式
C 語言簡介 62
【範例三】 撰寫一個程式,能接受一個 double float 數值之輸入,利用 exp, log,
log10, pow, pow10 函數計算其指數及對數函數值並印出其結果。
簡易數學函數之使用,使用下列函數時,你必須在程式前面加上:
# include <math.h>
C 語言簡介 63
◊ 程式
C 語言簡介 64
【範例四】C 語言運算子之計算
<1> *x++ <2> (*x)++ <3> ++(*x) <4> *x+=1 <5> *++x
C 語言簡介 65
<2> Result of (*x)++
C 語言簡介 66
<5> Result of *++x
位址
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 語言中,結構的宣告方式如下 :
};
陣列; 結構;
相同型態資料項目 不同型態資料
簡單變數
10 John Name
單一資料項目
20 10 Hour
41
30 30 Time
C 語言簡介 68
<2> 結構被宣告後即可定義任何變數。 由上述宣告的例子來說明 , Personal 為 此結
(分號) 表示。
告。
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
C 語言簡介 70
執 行 結 果 :
z 聯集 (Union)
Example:
<2> 聯集與結構之不同處在於聯集所佔之空間為所有成員中最大物件擁有之空
間。也就是說,聯集中所有成員,再同一瞬間,僅能有一種型態存在。上例中,
float 型態所佔有空間最大。
C 語言簡介 71