Microsoft Word - C語言講義--完整版.doc

Similar documents
C/C++ - 文件IO

CC213

CC213

FY.DOC

C

新・明解C言語入門編『索引』

C++ 程式設計

_汪_文前新ok[3.1].doc

nooog

epub 33-8

C 1

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

untitled

untitled

Microsoft PowerPoint - C-Ch10.ppt

Microsoft PowerPoint - Class5.pptx

Microsoft PowerPoint - C-Ch12.ppt

C/C++程序设计 - 字符串与格式化输入/输出

Microsoft PowerPoint - STU_C_Lang_CH13.ppt

C C

Microsoft PowerPoint - 20-string-s.pptx

c_cpp

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

,,,,,,,,,, ( http: \ \ www. ncre. cn,, ) 30,,,,,,,, C : C : : 19 : : : /16 : : 96 : : : ISBN 7

Microsoft PowerPoint - C-Ch11.ppt

untitled

新版 明解C++入門編

C/C++语言 - C/C++数据

C

Ps22Pdf

資料結構之C語言重點複習

C/C++ 语言 - 循环

Microsoft Word - chap13.doc

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

第1章

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

Microsoft PowerPoint - ds-1.ppt [兼容模式]

untitled

Microsoft PowerPoint - 04-array_pointer.ppt

Microsoft Word _2 課本1225_OK_0222修.doc

C语言的应用.PDF

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

CC213

Microsoft Word - ACL chapter02-5ed.docx

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

C/C++ Basics

Microsoft Word - C-pgm-ws2010.doc

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

Microsoft PowerPoint - C-Ch08.ppt

[改訂新版]C言語による標準アルゴリズム事典

C/C++ Programming

Microsoft PowerPoint - 02 C語言基本概述.ppt

Microsoft PowerPoint - 02 C語言基本概述.ppt

第3章.doc

ebook8-30

中華大學國貿系教學規範

chap07.key

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

51 C 51 isp 10 C PCB C C C C KEIL

四川省普通高等学校

C 語言—陣列及字串

Ps22Pdf

2. 參考網站 C 語言考古題 & C 的解題 程式設計學習入門 ( 網址 : c.blogspot.com/) 網站 : 星子 ACM 小窩 ( 網址 : 網站 :ACM Onli

Visual C# 2005程式設計

3.1 num = 3 ch = 'C' 2

untitled

C/C++ - 数组与指针

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

PowerPoint Presentation

概述

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

Microsoft PowerPoint - Class2.pptx

1

C/C++语言 - 分支结构

The golden pins of the PCI card can be oxidized after months or years

untitled

untitled

Microsoft PowerPoint - ch03_AEL0080.ppt

Java

Microsoft Word - CPE考生使用手冊 docx

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

Microsoft PowerPoint - plan06.ppt

3. 給 定 一 整 數 陣 列 a[0] a[1] a[99] 且 a[k]=3k+1, 以 value=100 呼 叫 以 下 兩 函 式, 假 設 函 式 f1 及 f2 之 while 迴 圈 主 體 分 別 執 行 n1 與 n2 次 (i.e, 計 算 if 敘 述 執 行 次 數, 不

untitled

untitled

Microsoft PowerPoint - ch09_AEL0080.ppt

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

科学计算的语言-FORTRAN95

C/C++基礎程式設計班

Microsoft Word - part doc

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

Microsoft Word - 01.DOC

EK-STM32F

C/C++基礎程式設計班

untitled

全国计算机技术与软件专业技术资格(水平)考试

epub83-1

Transcription:

C 語言程式設計教學講義 陳佳杏製作 單元 1: 程式語言簡介...3 一 程式設計的流程... 3 二 程式語言的分類... 3 直譯器與編譯器的比較... 3 三 依程式設計的方式分類... 4 四 常見的高階程式語言... 4 單元 2: 認識 C 語言...5 一 歷史發展... 5 二 C 程式的開發環境... 5 三 繪製流程圖... 6 四 結構化程式設計... 6 單元 3: 變數與資料型態...7 一 變數與常數... 7 二 基本資料型態... 7 三 變數的命名原則... 7 四 資料型態轉換... 7 單元 4: 格式化的輸入與輸出...8 一 標準輸出指令... 8 二 跳脫字元 (Escape Sequence)... 8 三 修飾子... 8 四 格式化輸出 : 使用修飾子... 9 五 標準輸入指令... 9 單元 5: 運算子與運算式...10 一 基本運算子... 10 二 其他常用的運算子...11 單元 6: 選擇敘述句...12 一 if 敘述... 12 二 switch 敘述... 12 補充 取亂數... 13 單元 7: 迴圈敘述句...14 一 比較 for / while / dowhile... 14 二 無窮迴圈... 14 三 空迴圈... 14 四 巢狀迴圈... 15 五 迴圈的跳離... 15 單元 8: 函式...16 一 為何要函式化?... 16 二 函式 (Function) 定義的格式... 16 三 函式原形 (Prototype)...16 四 函式的呼叫... 16-1 -

五 遞迴函式 (Recursive Function)... 16 六 儲存體類別 (Storage Classes)... 17 七 範圍規則 (Scope)... 17 應用練習 : 使用遞迴函式... 18 單元 9: 前置處理器...19 一 #define 前置處理器... 19 二 #include 前置處理器... 19 單元 10: 陣列...20 一 一維陣列... 20 二 二維陣列... 20 三 陣列與函數... 21 單元 11: 字串...22 一 字元陣列... 22 二 字串的輸入 / 輸出函數... 22 三 字串陣列... 23 單元 12: 指標...24 一 指標變數... 24 二 指標運算子... 24 三 指標的運算... 25 指標的簡潔運算式... 25 四 指標與函數... 26 五 指標與陣列的關係... 26 六 指標陣列... 27 比較 字串陣列 V.S. 指標陣列... 27 七 雙重指標 指向指標的指標... 27 八 動態配置記憶體... 28 單元 13: 結構與其他資料形態...29 一 結構 (Structure)... 29 二 巢狀結構... 29 三 結構陣列... 30 四 結構指標... 30 五 結構與函數... 30 六 自訂型態 (typedef)... 31 單元 14: 檔案...32 一 檔案儲存在記憶體的形式 :... 32 二 檔案存取模式...32 三 檔案處理函數 ( 有緩衝區 )... 33 四 命令列參數的使用... 34 參考資料 : 1. C 語言教學手冊 ( 第二版 )/ 洪維恩編著 / 博碩文化 ( 民 90) 2. C 程式設計藝術 ( 第三版 )/ 吳國樑編譯 / 全華 ( 民 90) - 2 -

單元 1: 程式語言簡介 一 程式設計的流程 1. Defining the program: 定義問題 2. Planning the solution: 設計解決方案 ( 演算法 ) 3. Coding the program: 撰寫程式 4. Testing the program: 測試程式 5. Documenting the program: 撰寫程式發展文件 二 程式語言的分類 1. 機器語言 (Machine Language): 指硬體內部所使用的語言, 也是電腦唯一能直接辨識的語言, 通常是一連串的數字所組成 (0 或 1) 2. 組合語言 (Assembly Language): 最接近機器語言的一種低階語言, 屬於符號式語言 組合語言必須經由組譯器 (assembler) 轉換成機器語言, 才能在電腦上執行 3. 高階語言 (High-level Language): 又稱編譯語言, 其文法接近日常英文用語, 也包含一般常用的數學運算符號 高階語言的原始程式碼必須轉換為機器語言才能正確執行 轉換程式包含直譯器和編譯器兩種 4. 非常高階語言 (Very High-level Language): 又稱第四代語言, 如 SQL (Structual Quary Language, 結構化查詢語言 ) 5. 自然語言 (Natural Language) 直譯器與編譯器的比較 說明優缺例 直譯器 Interpreter 將原始程式的指令逐一翻譯並執行, 不需要經過編譯 佔用的記憶體較少 修改及除錯容易 每次執行前才翻譯, 執行速度慢 效率較低 BASIC HTML 編譯器 Compiler 將原始程式編譯後, 先產生目的檔 (.obj), 再將其他要連結的程式連結後, 再執行該程式 執行時不需要重複編譯, 執行速度及效率高 原始程式經過修改就必須重新編譯 較佔用記憶體空間 C/C++ COBOL PASCAL - 3 -

三 依程式設計的方式分類 1. 程序導向程式設計 (Procedure-Oriented Programming) 2. 物件導向程式設計 (Object-Oriented Programming) 如 :C++,Java,Visual BASIC 四 常見的高階程式語言語言 說明 應用 FORTRAN FORmula TRANslator (1954) 科學 COBOL COmmon Business-Oriented Language (1959) 商業 BASIC Beginner's All-purpose Symbolic Instruction Code 教育, 商業 Pascal named after French inventor Blaise Pascal (1971) 教育, 系統, 科學 Ada named after Ada, the Countess of Lovelace (1980) 軍事, 一般 C evolved from the language B, from Bell Labs (1972) 系統, 一般 - 4 -

單元 2: 認識 C 語言 一 歷史發展 C 語言是由美國貝爾實驗室 (Bell Laboratory) 的 Dennis Ritchie 在 1972 年所發展出來的 C 語言的前身是 B 語言, 原先用在 DEC PDP-11 電腦上 C 語言在各種平台上快速發展, 之後出了許多版本, 為了統一各版本, 美國國家標準局 (ANSI) 提出了一套標準, 並在 1989 年通過審查, 而在 1999 年則進行了修訂 二 C 程式的開發環境 C 程式在執行前經過六個階段 1. 編輯 : 使用者可利用文書編輯器 (editor) 撰寫或修改 C 程式碼 (source code) 2. 前置處理 : 前置處理器 (preprocessor) 會在開始編譯前自動執行, 依據程式碼中 # 所標示的指示 (preprocessor directives), 進行代換或插入等動作 例如 :#include <stdio.h> 告訴編譯器在未編譯程式之前, 先將程式庫中的標頭檔 stdio.h 插入該位置 3. 編譯 : 編譯器 (compiler) 將程式碼編譯為目的碼 (object code) 4. 連結 : 連結器 (linker) 將一個或多個目的檔 (.obj) 與靜態程式庫檔 (.lib) 連結, 產生可執行檔 (.exe) 5. 載入 : 載入器 (loader) 將可執行檔 (.exe) 載入記憶體, 並與動態程式庫檔 (.dll) 連結 動態程式庫可減少執行檔所佔的硬碟和記憶體空間 6. 執行 : 最後, 電腦在 CPU 的控制下, 開始執行所載入的程式 編輯 edit.c 前置處理編譯.obj 連結.exe preprocess compile link 載入 load 執行 execute 標頭檔.h 其他.obj.lib.dll - 5 -

三 繪製流程圖 開始 決策 預定函數的執行 設定 / 程序 結束 四 結構化程式設計 語法 循序性結構 (Sequence Structure) 選擇性結構 (Selection Structure) ifelse switchcase 重複性結構 (Iteration Structure) for while dowhile 開始 流程圖 敘述 1 敘述 2 true 判斷 false 敘述 2 敘述 1 判斷 敘述 2 false true 敘述 1 敘述 3 結束 - 6 -

單元 3: 變數與資料型態 一 變數與常數 變數 (variable) 是利用宣告的方式, 將記憶體中的某個區塊配置給此變數, 不管變數的值如何改變, 它會一直佔用相同的記憶體空間 例 :int i=3; float f=15.7; char ch='y'; 常數 (constant) 的值是固定的, 如整數常數 字元常數等 例 :const int max=65536; 二 基本資料型態 資料型態位元組範圍備註 char 字元 1 0~255 用來儲存英文字母及 ASCII 碼 int 整數 2-32768~32767 可在 int 之前加上修飾詞 (qualifier), unsigned short long float 浮點數 4 1.2e-38~3.4e38 可用小數點及指數型態表示 double 倍精度浮點數 8 2.2e-308~1.8e308 可用小數點及指數型態表示 三 變數的命名原則 所有的變數必須在使用前宣告 命名原則如下 : 1. 不能使用關鍵字 2. 只有前 8 個字元為有效字元 3. 可使用英文字母 數字或底線 4. 變數名稱中間不可以有空白 5. 第一個字元不可為數字 6. 變數名稱要有意義, 且長短適中 7. 大小寫有別 四 資料型態轉換 1. 指派轉換 ( x = 100; ) 2. 算術轉換 ( y = i * 5 + 7 / 23; ) 3. 模式轉換 ( i = (int) ( x + 0.9 ); ) 4. 函數轉換 ( x = sum (a, b); ) - 7 -

單元 4: 格式化的輸入與輸出 一 標準輸出指令 printf(" 格式字串 ", var1, var2, ); 二 跳脫字元 (Escape Sequence) \n 換行 \" 雙引號 \x ASCII 碼 (16 進位 ) \f 換頁 \' 單引號 \d ASCII 碼 (8 進位 ) \t 跳格 \/ 斜線 \b 倒退 \\ 反斜線 例子 printf("\tthis line begins with tab.\n"); printf("it\'s a \"C Tutorial\".\n"); printf("this is backslash: \\.\n"); printf("\\101 is \101.\n"); printf("\\x41 is \x41.\n"); 執行結果 This line begins with tab. It's a "C Tutorial". This is backslash: \. \101 is A. \x41 is A. 三 修飾子 -: 向左靠齊 +: 印出正負號 %c: 字元 %s: 字串 %d: 十進位整數 %f: 浮點數 ( 小數點型式 ) %l: 長整數, 加在 d u 之前 %u: 無號十進位整數 %e: 浮點數 ( 指數 e 型式 ) - 8 -

四 格式化輸出 : 使用修飾子 資料 格式 結果 12345 %10d 1 2 3 4 5 12345 %+d + 1 2 3 4 5 12345 %-10d 1 2 3 4 5 12345 % d 1 2 3 4 5 12345 %010d 0 0 0 0 0 1 2 3 4 5 123.456 %7.2f 1 2 3. 4 6 123.456 %010.3f 0 0 0 1 2 3. 4 5 6 123.456 %+10.4f + 1 2 3. 4 5 6 0 五 標準輸入指令 scanf(" 格式化字串 ", &var1, &var2, ); 1. & 是位址運算子 2. 字元陣列不需要加上 & 位址運算子 輸入格式 %d: 十進位整數 int %f: 浮點數 float, double %c: 字元 char %s: 字串 字元陣列 例子 int num1, num2; printf("enter 2 numbers: "); scanf("%d,%d",&num1,&num2); 結果執行畫面 : Enter 2 numbers: 輸入值格式 : 103,227-9 -

單元 5: 運算子與運算式 一 基本運算子 1. 算數運算子 運算子 意義 int a=9,b=4 運算結果 + 加法 a+b 13 - 減法 a-b 5 * 乘法 a*b 36 / 除法 a/b 2 % 取餘數 a%b 1 運算子 原式 簡潔運算式 += a=a+b a+=b -+ a=a-b a-=b *= a=a*b a*=b /= a=a/b a/=b %= a=a%b a%=b 2. 關係運算子 運算子 意義 例子 運算結果 > 大於 2>3 false >= 大於等於 2>=3 false < 小於 2<3 true <= 小於等於 2<=3 true == 等於 2==3 false!= 不等於 2!=3 true 3. 邏輯運算子 運算子 && 意義 AND, 且 a b a&&b a b 0 0 0 0 OR, 或! NOT, 否 0 1 0 1 1 0 0 1 1 1 1 1-10 -

二 其他常用的運算子 1. 遞增 / 減運算子 運算子 意義 int i=3; int a; 運算結果 i a ++ 變數值加 1 i++ 4 -- 變數值減 1 i-- 2 a = i++ 4 3 a = ++i 4 4 a = i-- 2 3 a = --I 2 2 i++: 先執行整個敘述後, 再將 i 的值加 1 ++i: 先將 i 的值加 1, 再執行整個敘述 2. 條件運算子 運算子 (?:) 條件判斷? 運算式 1 : 運算式 2 if( 判斷條件 ) 運算式 1; else 運算式 2; 意義 實例 a = (x > 100)? b : c; abs = (a > 0)? a : -a; if (x > 100) a = b; else a = c; if (a > 0) abs = a; else abs = -a; - 11 -

單元 6: 選擇敘述句 一 if 敘述 if 敘述 ifelse 巢狀 if ifelse ifelse if ( 判斷條件 ) 敘述 ; if ( 判斷條件 ) 敘述 1; 敘述 n; if ( 判斷條件 ) 敘述 1; else 敘述 2; if ( 判斷條件 ) 敘述主體 1; else 敘述主體 2; if ( 判斷條件 1) 敘述主體 1; if ( 判斷條件 2) 敘述主體 2; if ( 判斷條件 ) 敘述主體 1; else if ( 判斷條件 ) 敘述主體 2; else 敘述主體 n; 二 switch 敘述 switch ( 運算式 ) case 選擇值 1: 敘述主體 1; break; case 選擇值 2: 敘述主體 2; break; case 選擇值 n: 敘述主體 n; break; default: 敘述主體 ; 注意 : 1. 選擇值只能是 字元 或 常數 2. break 用於跳離 switch 區塊 3. 當選擇值皆不成立時預設處理程序放在 default 裡頭 - 12 -

隨堂練習 1. 輸入三個整數 a b c, 印出此三數的最大值 最小值 總和及平均值 2. 輸入兩整數的四則運算式 (a+b, a-b, a*b, a/b, a%b), 印出其計算結果 3. 利用 switch 敘述, 將輸入的成績 ( 分數 ) 以下列方式分級 90~100: A 級 80~89: B 級 70~79: C 級 60~69: D 級 0~59: E 級 補充 取亂數 #include <stdlib.h> #include <time.h> srand((unsigned)time(null)); /* 函數 srand(): 下亂數種子 */ int num = a + rand() % b; /* 函數 rand(): 取亂數 */ a: 起始值 b: 亂數個數 實例 : (1) 數字 0~9 的亂數取法 :rand() % 10 (2) 骰子點數 1~6 的亂數取法 :1 + rand() % 6 (3) 整數 18~32 的亂數取法 :18 + rand() % 15 (4) 五位數的亂數取法 :10000 + rand() % 90000 練習題 1. 數字加密 : 亂數產生四位數, 將每個位數的數字加 7 後除以 10 取餘數, 然後第一個數字和第三數字對調, 第二個數字和第四個數字對調 最後印出加密過的數 2. 數字解密 : 根據上題, 讀入加密過的數字, 然後解密為原來的四位數 - 13 -

單元 7: 迴圈敘述句 一 比較 for / while / dowhile for 敘述 while 敘述 dowhile 敘述 for ( 初值 ; 判斷條件 ; 增減量 ) 敘述 1; 敘述 2; 敘述 n; 設初值 ; while ( 判斷條件 ) 敘述 1; 敘述 2; 敘述 n; 設增減量 ; 設初值 do 敘述 1; 敘述 2; 敘述 n; 設增減量 ; while ( 判斷條件 ); for (i=1,sum=0;i<=9;i+=2) sum += i; printf("i=%d\n", i); printf("sum=%d\n",sum); printf("\n"); 實例 i=1; sum=0; while(i<=9) sum += i; printf("i=%d\n", i); printf("sum=%d\n",sum); printf("\n"); i += 2; i=1; sum=0; do sum += i; printf("i=%d\n", i); printf("sum=%d\n",sum); printf("\n"); i += 2; while (i<=9); 二 無窮迴圈 while (1) 敘述主體 ; 三 空迴圈 for ( 設初值 ; 判斷條件 ; 設增減量 ) 或 for ( 設初值 ; 判斷條件 ; 設增減量 ) ; - 14 -

四 巢狀迴圈 for 之巢狀迴圈 for ( 初值 1; 條件 1; 增減量 1) for ( 初值 2; 條件 2; 增減量 2) 初值 1; while ( 條件 1) while 之巢狀迴圈 初值 2; while ( 條件 2) 增減量 2; 增減量 1; 五 迴圈的跳離 break( 跳出迴圈 ) continue( 回到迴圈開始處 ) for ( 設初值 ; 判斷條件 ; 設增減量 ) 敘述 1; 敘述 2; break; 敘述 n; for ( 設初值 ; 判斷條件 ; 設增減量 ) 敘述 1; 敘述 2; continue; 敘述 n; 備註 : 在 while / do while 迴圈中的用法相同 隨堂練習 1. 輸入正整數 n (1) 求 1 + 2 + + n 的值 (2) 求 1 * 2 * * n 的值 (3) 求 1! + 2! + + n! 的值 2. 輸入大於 2 的正整數 n (1) 求小於等於 n 的所有質數 (2) 求小於 n 的所有質因數 - 15 -

單元 8: 函式 一 為何要函式化? 1. 使程式發展容易管理 2. 軟體再使用 ( 抽象化的技術, abstraction) 3. 避免重複撰寫相同的程式碼 二 函式 (Function) 定義的格式 回傳值型態函式名稱 ( 參數列 ) 變數宣告 ; 陳述句 ; return 回傳值 ; int sum(int a, int b) int num; num = a + b; return num; 三 函式原形 (Prototype) 編譯器利用函式原形來驗證函式的呼叫, 函式原形通常置於 main() 函式外, 或是標頭檔內 函式原形的另一個功能是引數型態的強制轉換 傳回值型態函式名稱 ( 引數型態 ); int sum(int, int); 或 int sum(int a, int b); 標頭檔 (Header File,.h) 含有函式原形, 以及這些函式所需的各種 資料型態 和 常數 的定義 我們可以撰寫自己的標頭檔, 以.h 為附檔名 在原始程式檔中, 以 #include 將標頭檔含括進來 四 函式的呼叫 1. 傳值呼叫 (call by value): 將引數 值 拷貝一份傳給函式, 不會影響原來的變數值 2. 傳參考呼叫 (call by reference): 將引數的 位址 傳給函式, 會影響原來的變數值 五 遞迴函式 (Recursive Function) 1. 自己呼叫自己, 注意終止條件的設定 2. 用到大量的堆疊 (stack) 空間, 容易造成記憶體不足 3. 可以改寫成迴圈形式 - 16 -

六 儲存體類別 (Storage Classes) 佔用期間類別說明 動態 靜態 自動變數 auto 暫存器變數 register 靜態變數 static 外部變數 extern auto 變數是在程式控制進入 所宣告的區塊 時才被產生出來, 一離開此區塊, 就會從記憶體中消失了 區域變數 內定為自動變數例 :auto float x,y; 宣告成 register 的變數會放到硬體暫存器中, 減少運算時從記憶體載入的負擔 register 變數只能用在 自動變數 上例 :register int counter = 1; static 變數從程式開始執行時便配置好儲存體, 並設定初值 ( 數值預設為 0, 指標預設為 NULL) static 變數包含 內部靜態變數 與 外部靜態變數 例 :static int count = 1; 外部變數包含 全域變數 和 函式名稱 外部變數也屬於靜態變數, 在程式開始執行時便佔有記憶體空間 七 範圍規則 (Scope) 分類說明包含 檔案範圍 區塊範圍 函式範圍 可在整個檔案中使用 可在區塊內使用, 也就是 包起來的範圍 只能在函式範圍內使用 1. 全域變數 (Global Variable) 2. 函式定義 3. 函式原形 1. 區域變數 (Local Variable) 2. 巢狀區塊中的變數 3. 函式的參數 標名 : 1. goto 陳述句的標名 2. switch 結構的 case 函式原形範圍 函式原形參數列中的識別字 - 17 -

應用練習 : 使用遞迴函式 1. 費氏數列 (Fibonacci): 費氏數列中第 n 項的值等於前兩項的合, 如 1 1 2 3 5 8 13 21 34 設 f(n) 表示第 n 項, 根據定義 :f(n) = f(n-1) + f(n-2) 請利用遞迴函數, 求出 f(n) int f(int n) if (n==1 n==2) return 1; else return f(n-1)+f(n-2); 2. 河內塔 (Hanoi) 問題 : 有三根柱子和 n 個大小不同的環 ( 如圖 ) 欲將 n 個環由 A 柱移到 B 柱上, 移動規則如下 : (1) 一次只能移動一個環 (2) 在搬移的過程中, 大環不能壓住小環 1 2 3 問 : 最少移動次數及搬移過程為何? void hanoi(int n, int src, int dst, int tmp) if (n==1) printf( %d %d\n, src, dst); else hanoi(n-1, src, tmp, dst); printf( %d ( %d\n, src, dst); hanoi(n-1, tmp, dst, src); [ 輸出畫面 ] Input:(n,A,B)=(3,1,3) Output: 1 3 1 2 3 2 1 3 2 1 2 3 1 3 移動次數 :7-18 -

單元 9: 前置處理器 一 #define 前置處理器 1. 增加程式的易讀性 2. 簡化修改常數或字串內容時的複雜度 3. 增加程式執行效率 4. 巨集 (Macro) 的使用可取代簡單的函數 #define MAX 32767 #define WORD "This is a test!" #define AREA(w, h) ((w)*(h)) #define POWER(i) (i)*(i)*(i) int main() printf("%d \n", MAX); printf(word); printf("area = %d \n", AREA(5, 3)); printf("%d * %d * %d = %d \n", i+1, i+1, i+1, POWER(i+1)); 二 #include 前置處理器 將標頭檔 (.h) 含括進程式中 使用說明用法 < > 到系統設定的目錄尋找該檔案如 :C:\Dev-C++\Include\ #include <stdio.h> " " 依指定的目錄尋找該標頭檔 #include "D:\myprog\area.h" - 19 -

單元 10: 陣列 一 一維陣列 宣告格式 : 型態陣列名稱 [ 個數 ]; int score[10] = 80,90,95,75,100,80,85,95,90,60; 範例 陣列裡的 10 個元素 0 1 2 3 4 5 6 7 8 9 score 80 90 95 75 100 80 85 95 90 60 score[0]........................................ score[9] 陣列名稱 每個元素佔一個 int 型態大小 (4 bytes) sizeof(score) 4 * 10 = 40 bytes 初值設定方式 : int data[5] = 1; /* 將所有元素值都設為 1 */ int num[] = 60,75,48,92; /* 依照初值設定的個數決定陣列的大小 */ int student[10] = 1,2,3,4,5; /* 初值個數少於宣告元素個數時, 剩餘空間填 0 */ 二 二維陣列 宣告格式 : 型態陣列名稱 [ 列數 ][ 行數 ]; int sale[2][4] = 10,20,30,40, 50,60,70,80; 範例 2 列 4 行 0 1 2 3 0 10 20 30 40 1 50 60 70 80 sale[0][0] 10 sale[0][1] 20 sale[1][0] 50 sale[1][1] 60 陣列中的元素個數 2*4=8 sizeof(sale) 4*(2*4)=32bytes - 20 -

初值設定方式 : int temp[][4] = 1,2,3,4, /* 未定長度之二維陣列的初值設定 */ 5,6,7,8, 9,10,11,12 ; 多維陣列的宣告和初值設定方式依此類推 三 陣列與函數 陣列可以當作引數傳遞到函數中, 此時函數接收到的是陣列的 位址, 而非陣列的值 事實上, 傳遞至函數中的也就是指向陣列位址的指標 (Pointer) #include <stdio.h> #define SIZE 5 範例 void print_matrix(int A[]); /* 函式原型 */ int main(void) int data[size] = 23,25,28,29,27; printf_matrix(data); return 0; void print_matrix(int A[]) int i; for (i=0; i<size; i++) printf("%d ", A[i]); printf("\n"); return; Memory In main() data 0 23 0253FDB8 1 25 2 28 3 29 4 27 In print_matrix() A 為指標常數 0253FDB8-21 -

單元 11: 字串 一 字元陣列 在 C 語言中並沒有字串的資料型態, 要使用字串變數, 就要宣告 字元陣列 字串常數儲存在記憶體時, 在最後面會加上字串結束字元 \0 做結尾 宣告格式 : char 字元陣列名稱 [ 字串長度 ]; char name[15] = "David Chen"; 範例 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 name D a v i d C h e n \0 比較下列三種宣告 : 宣告 說明 char a[] = "My friend"; sizeof(a) 9 個字元 + 字串結束字元 \0 = 10 bytes char b = c ; sizeof(b) 1 個字元 = 1 byte char str[] = "c"; sizeof(str) 1 個字元 + 加上字串結束字元 \0 = 2 bytes 二 字串的輸入 / 輸出函數 (1) (2) 語法 scanf("%s", 字元陣列名稱 ); printf("%s", 字元陣列名稱 ); gets( 字元陣列名稱 ); puts( 字元陣列名稱 ); - 22 -

說明範例 scanf() 讀到 Enter 或空白時就結束讀取動作, 同時在字串結尾處加上 \0 #include <stdio.h> int main(void) char name[15]; printf("what s your name?\n"); scanf("%s", name); printf("hi! %s How are you?\n", name); return 0; 1. gets() 在讀到 Enter 時才結束讀取動作, 並在字串結尾處加上 \0 2. puts() 會將 \0 轉換成換行字元, 在輸出字串時會自動換行 #include <stdio.h> int main(void) char name[15]; puts("what s your name?"); gets(name); puts("hi! "); puts(name); puts(" How are you?"); return 0; 三 字串陣列 宣告格式 : char 字元陣列名稱 [ 陣列大小 ][ 字串長度 ]; char name[3][10] = "David", "Jane Wang", "Tom Lee"; 範例 0 1 2 3 4 5 6 7 8 9 name[0] 0253FDB8 D a v i d \0 name[1] 0253FDC2 J a n e W a n g \0 name[2] 0253FDCC T o m L e e \0 name[0] 與 name[1] 相差 10 bytes name[1] 與 name[2] 相差 10 bytes 常用的字串處理函數放在 string.h 中, 請參見附錄 D-10 頁 - 23 -

單元 12: 指標 一 指標變數 指標 (Pointer) 是一種特殊的變數, 用來存放變數在記憶體中的位址 在 Dev C++ 中, 無論指標指向何種資料型態, 指標變數本身均佔有 4 個位元組 (bytes) 指標變數 存放變數位址 0253FDD0 變數 存放變數 ex:15 宣告格式 : 型態 * 指標變數 ; 0253FDD0 int *ptri; /* 整數型態之指標變數 */ char *ptrch; /* 字元型態之指標變數 */ 範例 sizeof(ptri) 4 bytes sizeof(ptrch) 4 bytes 二 指標運算子 1. 位址運算子 &: 用來取得變數或陣列元素在記憶體中的位址 2. 依址取值運算子 *: 用來取得指標所指向的記憶體位址的內容 int a = 10, b; int *p; 範例 p = &a; b = *p; *p = 20; 結果 :a = 20, b = 10-24 -

三 指標的運算 1. 設定運算 : 將等號右邊的值設定給左邊的指標變數 2. 加 / 減法運算 : 針對各個資料型態的長度來處理位址的加減法運算 3. 差值運算 : 計算兩個指標之間的距離, 其單位為資料型態的長度 int a=10, b=20; int *p1, *p2; char ch='a', *pch; 範例 /* 設定運算 */ p1 = &a; /* 將 a 的位址存放於 p1 */ p2 = &b; /* 將 b 的位址存放於 p2 */ pch = &ch; /* 將 ch 的位址存放於 pch */ /* 加減法運算 */ p1++; /* 將 p1 中的位址值加上 4 bytes (int 型態的大小 ) */ pch--; /* 將 pch 中的位址值減去 1 byte (char 型態的大小 ) */ /* 差值運算 */ sub = p1 p2; /* 計算 p1 和 p2 相差的距離 ( 以 int 為單位的距離 ) */ 指標的簡潔運算式 int X; int A[5] = 10,20,30,40,50; int *p = A + 2; 運算式同義所執行的敘述及順序 X = *(p++); X = *(++p); X = (*p)++; X = ++(*p); X = *(p--); X = *(--p); X = (*p)--; X = --(*p); X = *p++; X = *++p; X = *p--; X = *--p; X = *p; p = p + 1; p = p + 1; X = *p; X = *p; *p = *p + 1; *p = *p + 1; X = *p; X = *p; p = p - 1; p = p - 1; X = *p; X = *p; *p = *p - 1; *p = *p - 1; X = *p; 執行後 X *p 30 40 40 40 30 31 31 31 30 20 20 20 30 29 29 29-25 -

四 指標與函數函數的 return 敘述只能有一個回傳值, 當程式需要傳遞兩個以上的值時, 可以利用指標解決在函數間傳遞多個回傳值的問題 其做法是將指標當作引數傳入函數中, 由於指標內的值是所指向變數的位址, 因此不須經過 return 敘述即可更改變數的值 void swap(int *, int *); /* 函數原型, 參數為兩個整數型態的指標變數 */ int main(void) int a=3, b=5; swap(&a, &b); /* 傳遞 a 和 b 的位址 */ return 0; void swap(int *x, int *y) /* 此函數用來交換 x y 所指向的變數之值 */ int temp = *x; *x = *y; *y = temp; 範例 五 指標與陣列的關係 陣列可看成是指標的分身, 陣列元素的排列可利用指標運算來存取 int a[3] = 5,7,9; 指標的指向陣列註標陣列內容記憶體位址陣列元素位址指標的移位 *(a+0) a[0] 5 0253FDC8 &a[0] a+0 *(a+1) a[1] 7 0253FDCC &a[1] a+1 *(a+2) a[2] 9 0253FDD0 &a[2] a+2 兩種表示法同義 兩種表示法同義 注意 : 陣列 a 以指標的方式表示時,a 會被視為指標常數, 所以不可寫成 a++ - 26 -

六 指標陣列陣列中存放的變數為指標變數, 即為指標陣列 宣告格式 : 型態 * 陣列名稱 [ 個數 ]; int i=10,j=28,k=34; int* a[3]; a[0] = &j; a[1] = &k; a[2] = &i; a[0] i 10 a[1] j 28 a[2] k 34 比較 字串陣列 V.S. 指標陣列 (1) 字串陣列 :char name[3][10] = "David", "Jane Wang", "Tom Lee"; name[0] D a v i d \0 name[1] J a n e W a n g \0 name[2] T o m L e e \0 (2) 指標陣列 :char *name[3] = David, Jane Wang, Tom Lee ; name[0] D a v i d \0 name[1] J a n e W a n g \0 name[2] T o m L e e \0 利用指標陣列可節省浪費的記憶體空間 七 雙重指標 指向指標的指標指標變數中若是存放另一個指標變數的位址, 這種指向指標的指標稱為雙重指標 宣告格式 : 型態 ** 指標變數 ; 雙重指標變數指標變數變數 存放指標位址 0253FDA4 存放變數位址 0253FDD0 0253FDA4 存放變數 ex: 15 0253FDD0-27 -

八 動態配置記憶體 int n=5; int* p; p = (int*) malloc( n * sizeof(int) ); n 5 p 0x02E0 0x02E0 0x02E4 0x02E8 0x02EC 0x02F0 一維配置 配置 n 個 int int row=3,col=5,i; int** array; array = (int**) malloc(row * sizeof(int*)); for (i=0; i<row; i++) array[i] = (int*) malloc(col * sizeof(int)); 二維配置 row 3 col 5 i array 0x02A0 0x1A30 0x1A34 0x1A38 0x1A3C 0x1A40 配置 col 個 int array[0] 0x1A30 0x02A0 array[1] 0x2D70 0x02A4 array[2] 0xBDA0 0x02A8 配置 row 個 int* ( 指向 int 的指標變數 ) 0x2D70 0x2D74 0x2D78 0x2D7C 0x2D80 配置 col 個 int 0xBDA0 0xBDA4 0xBDA8 0xBDAC 0xBDB0 配置 col 個 int - 28 -

單元 13: 結構與其他資料形態 一 結構 (Structure) 格式 : struct 結構名稱 資料型態欄位名稱 1; 資料型態欄位名稱 2; ; 結構的宣告及使用範例 struct mydata /* 結構名稱 */ char name[15]; /* 欄位 */ int score; /* 欄位 */ ; /* 宣告結構變數並設定初值 */ struct mydata teacher = "Apric",90; struct mydata /* 結構名稱 */ char name[15]; /* 欄位 */ int score; /* 欄位 */ teacher = "Apric",90; /* 宣告結構變數並設定初值 */ #include <stdio.h> /* 公用的結構通常定義為外部變數的型式 */ int main(void) sturct mydata student; /* 宣告結構變數 */ printf("name: "); scanf("%s", student.name); printf("score: "); scanf("%d", &student.score); printf("%s got %d points! \n", student.name, student.score); return 0; 二 巢狀結構 struct date /* 結構名稱 */ int month; int day; ; 範例 - 29 -

struct newdata /* 結構名稱 */ char name[15]; struct date birthday; /* 結構變數 */ int score; ; int main(void) struct newdata student = "Apric", 7, 10, 90; printf("%s's birthday is %d/%d \n", student.name, student.birthday.month, student.birthday.day); printf("he/she got %d points! \n", student.score); return 0; 三 結構陣列 struct mydata student[10]; 範例 for(i=0; i<10; i++) printf("%s got %d points! \n", student[i].name, student[i].score); 四 結構指標 範例 struct mydata student[10]; /* 結構陣列 */ struct mydata *ptr = student; /* 結構指標, 初值為 student 陣列的起始位址 */ for (i=0;i<10;i++) printf("name, Score:"); scanf("%s, %d", (student+i) name, &(student+i) score); printf("%s got %d points!\n", ptr name, ptr score); ptr++; 五 結構與函數 void get_data(struct mydata *p); /* 函式原型, 參數為結構指標 */ void print_data(struct mydata a); /* 函式原型, 參數為結構變數 */ 範例 int main(void) struct mydata student; - 30 -

get_data(&student); print_data(student); return 0; void get_data(struct mydata *p) printf("name:"); scanf("%s", p name); printf("score:"); scanf("%d", &p score); void print_data(struct mydata a) printf("%s got %d!\n", a.name, a.score); return; 六 自訂型態 (typedef) 格式 : typedef 資料型態識別字 ; 由編譯器執行 typedef #define 由前置處理器主導 typedef int clock; clock hour, second; #define CLOCK int CLOCK hour, second; 利用 typedef 自訂新的結構型態 : typedef struct int minite; float second; time; time record = 3, 27.25; - 31 -

單元 14: 檔案 一 檔案儲存在記憶體的形式 : 類型儲存方式儲存單位檔案大小檔案類型 文字檔 text file 以 ASCII 碼儲存 每個字元皆佔有 1 個位元組, 如數值 132956 為 6 個字元 較大 ( 資料相同時 ) 文字資料 二進位檔 binary file 以二進位的格式儲存 以資料型態的長度為儲存單位, 如整數 132956 在 Dev C++ 中佔有 4 個位元組 較小 ( 資料相同時 ) 圖形檔 聲音檔 影像檔 二 檔案存取模式 代碼 r w a 存取模式讀取舊檔覆寫新舊檔附加新舊檔 r+ 讀取 覆寫舊檔 w+ 讀取 覆寫新舊檔 a+ 讀取 附加新舊檔 rb wb ab 讀取二進位檔 覆寫二進位檔 附加二進位檔 - 32 -

三 檔案處理函數 ( 有緩衝區 ) 變數宣告 : FILE *file; char ch; char buffer[128]; 名稱功能使用範例 fopen 開檔 file = fopen( C:\abc.txt, r ); fclose 關檔 fclose(file); getc 讀取字元 ch = getc(file); putc 寫入字元 putc(ch, file); fgets 讀取字串 fget(buffer, 128, file); fputs 寫入字串 fputs(buffer, file); fprintf 格式化輸出 fprintf(file, %c \n, ch); fscanf 格式化輸入 fscanf(file, %c, &ch); fread 區塊輸入 fread(buffer, sizeof(char), 128, file); fwrite 區塊輸出 fwrite(buffer, sizeof(char), 128, file); feof ferror 檢查是否結束 檢查錯誤 while(!feof(file) ) ch = getc(file); if ( ferror(file) ) printf( error ); fseek 移動檔案指標位置 fseek(file, 128, SEEK_SET); 函數的格式說明請參見課本 12-7, 12-8 - 33 -

四 命令列參數的使用 語法 main(argc, argv) int argc; char *argv[];... main(int argc, char* argv[])... 參數說明 1. argc (argument count): 記錄參數個數 2. argv (argument value): 記錄參數值 argv[0] 記錄程式名稱, 後面接續的參數依序指定給 argv[1] argv[2]... 命令範例 type 123 abc.txt argc = 3; argv[0] = type ( 程式名稱 ) argv[1] = 123 argv[2] = abc.txt 程式範例 #include <stdio.h> int main (int argc, char* argv[]) int i; printf( The value of argc is %d \n, argc); for(i=0; i<argc; i++) printf( argv[%d]=%s \n, i, argv[i]); return 0; - 34 -