三版序 隨著電腦硬體技術不斷地進步, 軟體亦隨著日新月異 而指揮電腦運作的程式語言, 由早期的機器語言 組合語言 FORTRAN COBOL BASIC C PHP Java C++ 和 C# 等, 直不斷演進 其中 C 語言是 個 效率且介於 階和低階之語言, 適合開發各種系統或應用程式, 可攜性及執行效率, 因此很受程式設計師的喜愛, 尤其由 C 延伸出來的 C++ 是屬於物件導向程式語言, 很適合用來開發大型應用程式, 已成為今後程式設計的主流 Unix 作業系統是利用 C 語言所發展出來, 像 Java PHP C++ C# 以及 Flash 的 ActionScript 3.0 等也都是由 C 語言演進而來 由此可知,C 語言與 C++ 的重要性 由於 C++ 主要著重物件導向, 因此將本書分成 C 和 C++ 兩大部分做介紹,C 部分以 ANSI C 為主, 主要培養初學者程式設計的基本能力,C++ 主要介紹物件導向程式設計 樣版和 STL C 語言部份頁數較多, 章節採循序漸進方式, 範例偏重科學 工程為主, 以應用到相關課程, 提 學習效果 C & C++ 程式的開發環境種類多, 而 Dev C++ 和 Visual C++ 2013 程式語言是目前市面使用率較 的兩種程式語言, 本書均可使用這兩種程式語言來上課教學或初學者自我學習 本書對 Dev C++ Visual C++ 2013 兩種程式語言都提供完整範例, 由於 Dev C++ 和 Visual C++ 2013 少許的函式名稱有些不同, 為方便教師教學和初學者學習, 針對函式名稱不同處, 書中都有加註說明 至於本書範例程式請至碁峯網站 http://books.gotop.com.tw/download/ael015600 下載 ( 檔案為 ZIP 格式 ), 請讀者自行解壓縮即可 購買本書者可以運用這些資料, 但請勿散佈 下載解壓縮後,Dev C++ Visual C++ 2013 範例分別置於下列兩種資料夾之, 讀取指定的程式檔便可輕易教學或自我學習 ii
序 devc 資料夾 : 存放本書 Dev C++ 的範例程式檔 vc2013 資料夾 : 存放本書 Visual C++ 2013 的範例程式檔 為方便教學, 本書目錄索引前面打 星號者, 表示較進階的主題與範例, 上課教師可依學 學習狀況及教學時數 短, 彈性增刪調整教學進度 若初學者沒有 C 或 C++ 的整合開發環境, 可參閱附錄 B 學習下載及安裝 Dev C++ 為給予初學者信心及減少學習上的障礙, 每個範例都精挑細選, 以增進學習效果 本書另提供 Power Point 投影片光碟以利教學 若採用本書授課教師可向碁峰業務索取 本書承蒙全國知名補教業者採用, 為使本書內容更加豐富 更容易教學, 特更改書中筆誤, 以及解說不詳實的地方加以修改, 將範例程式碼變得更精簡, 希望使得本書教學能更加順暢, 提 學 學習效率, 新版也同時注重程式設計觀念 著重演算法或流程圖的撰寫能力, 以養成學 日後能獨立思考, 養成具有獨立程式設計的能力 本書主要是針對學習 C&C++ 程式設計初學者而編寫的, 較偏重程式設計能力, 限於篇幅難免有遺珠之憾, 實感抱歉 本書雖經多次精心校對, 難免百密 疏, 尚祈讀者先進不吝指正, 以期再版時能更趨紮實 先感謝吳昱宗對本書所有章節和範例提供寶貴意見和測試, 更感謝碁峰許多同仁的鼓勵與協助, 使得本書得以順利出書 編著蔡文龍僑光科大資科系講師 MVP 策劃吳明哲興大資科系退休中華 國 103 年 8 月 iii
.. 函式 8 8.1 函式簡介 在撰寫一個大的應用程式時, 常會碰到一些具有小功能的程式片段在程式中多處重複出現, 若不加以處理會導致程式冗長不具結構化且不易維謢, 因此我們將這些小功能的程式片段獨立出來撰寫成函式 (Function), 所以函式就是指具有某種特定功能的一段程式碼 程式中使用函式最主要是用來精減程式碼及重覆使用, 使得程式達到模組化及函式可重複使用為目標 函式必須透過呼叫才能執行, 不允許單獨執行, 但它是主程式的一部分 函式名稱在整個程式中不允許與其他函式同名 程式執行中當呼叫函式時, 可接受或不接受傳入的資料, 再進入函式內執行其程式碼, 執行完畢依程式需求將結果傳回或不傳回 C 的函式即 BASIC 語言的副程式 (Subroutine) 和函數或 Pascal 語言的程序 (Procedure) 譬如 : 左下圖未使用函式, 計算平均 程式區段重複出現三次, 除增加程式長度外, 修改時需改多處易造成不易維護 右下圖將 計算平均 寫成名稱為 myfun() 函式,myfun() 函式定義寫在 main() 主程式之前, 在主程式中需要使用該函式時, 只要在需要的地方插入一行呼叫該函式的敘述即可, 總共呼叫 myfun 三次, 如此不但可縮短程式的長度而且易維護和可讀性高
C & C++ 程式設計經典 主程式 - main() myfun 計算平均 計算平均 主程式 - main() 計算平均 呼叫 myfun; 呼叫 myfun; 計算平均 呼叫 myfun; 使用函式有下列好處 : 1. 函式可重複使用, 免除程式中重複出現相同程式碼, 節省撰寫時間及程式的長度, 方便維謢與除錯 2. 函式可以讓其他程式檔或專案套用 3. 函式的邏輯簡單 明確和可讀性高, 可降低主程式的複雜度 4. 函式具有模組化的功能, 符合結構化語言的特性 5. 當開發較大應用程式, 可分割成數個小且功能不同的函式, 讓不同的程式設計師分別撰寫, 加快程式開發的時間 8.2 內建函式 C 語言將函式分為兩大類, 其一為程式語言製造商為了方便使用者, 在設計程式時將常用到產生亂數 數學公式 資料型別轉換 字串和數值處理 檔案處理等寫成函式, 只要給予函式輸入值, 該函式便將結果傳回, 以供使用者套用 我們將這類函式稱為 內建函式 (Builded-In Function) ANSI C 所提供的內建函式說明收錄於附錄 C 詳讀這些函式的使用, 將使您撰寫程 8-2
Chapter 8 函式 式的功力如虎添翼 另一種為使用者定義定函式 (User Defined Function) 簡稱 自定函式, 此類函式不是廠商提供而是程式設計者為因應程式的需求自己建立的 我們都知道 C 語言是從 main() 開始執行,main() 本身就是一個函式我們稱為主函式或主程式,printf()/scanf() 也是函式, 這些都是系統廠商提供的內建函式 至於如何來呼叫這些內建函式, 我們以內建函式 pow() 計算某數的次方為例, 來熟悉 C 語言所提供內建函式的用法 : 語法 double c = double pow(double a,double b ) ; /* 傳回 a b 值給 c */ 一般當您查閱 C 語言使用手冊時, 都會對所提供的內建函式告知其原型 (Prototype) 是放在哪個標頭檔, 由於 power() 函式的原型 (Prototype) 是定義在 math.h 標頭檔內, 使用時必須先含入 #include <math.h> 語法中在函式名稱 pow() 前面的 double 是告知函式的傳回值為浮點數資料型別, 在 pow() 函式後面小括號內的參數, 是告知呼叫該函式時, 必須傳入兩個浮點數 譬如下面 power.c 簡例是取得 F(x)=4x 3 +3x 2 +2x+1 數學函式的函式值 : power.c 使用 pow() 內建次方函式計算鍵盤輸入一個整數 x 值, 求下列函數值 F(x) = 4x 3 + 3x 2 + 2x + 1 執行結果 8-3
C & C++ 程式設計經典 FileName : power.c 01 #include <stdio.h> 02 #include <stdlib.h> 03 #include <math.h> 04 int main(int argc, char *argv[]) 05 { 06 int x; 07 int power3,power2,power1,power0,value; 08 09 printf(" 請輸入一個整數值 : "); 10 scanf("%d",&x); /* scanf_s() for VC++ 2013 */ 11 12 power3=pow(x,3.0); 13 power2=pow(x,2.0); 14 power1=pow(x,1.0); 15 value=4*power3+3*power2+2*power1+1; 16 17 printf("when x = %d \n",x); 18 printf("f(x)= 4xpow(x,3) + 3xpow(x,2) + 2xpow(x,1) + 1 \n"); 19 printf("f(%d)= 4xpow(%d,3) + 3xpow(%d,2) + 2xpow(%d,1) + 1 \n",x,x,x,x); 20 printf("f(%d)= 4x%d + 3x%d + 2x%d + 1 \n",x,power3,power2,power1); 21 printf("f(%d)= %d + %d + %d + 1 \n",x,4*power3,3*power2,2*power1); 22 printf("f(%d)= %d \n",x,value); 23 printf("\n"); 24 system("pause"); 25 return 0; 26 } 8.3 自定函式的定義與呼叫 8.3.1 如何宣告與定義自定函式? 若您在設計程式時, 需要使用到一個小功能, 這個功能在內建函式中找不到, 那麼只好在程式中自己定義一個具有此小功能的函式, 我們稱為 使用者定義函式 (User Defined Function) 簡稱 自定函式, 由於使用者自定 8-4
Chapter 8 函式 函式是無中生有的, 因此必須在使用前先定義該函式, 此即為該函式的主體 函式主體的位置通常撰寫在 #include 和 main() 主函式的之間, 即 main() 主函式的前面, 也允許放在 main() 主函式的後面, 若使用後者就必須在 main() 主函式前面先宣告函式的原型, 以告知編譯器此自定函式在程式中有定義, 由於編譯程式時是由程式的最前面往下逐行編譯, 以避免因先編譯 main() 主函式找不到該函式的定義, 而發生編譯上的錯誤 若使用前者自定函式的定義寫在 main() 主函式之前, 自定函式的原型宣告可以省略, 但為求程式一致性及可讀性建議還是不要省略 下面即為自定函式的兩種寫法 : 方法一 宣告 方法二 下面列出 main() 主函式與多個自定函式間正確與錯誤用法 : 1. 此種方式 &2 要宣告 2. 此種方式 &2 不用宣告 主函式 -main() 主函式 -main() 正確 正確 8-5
C & C++ 程式設計經典 3. 此種方式僅 要宣告 4. 此種方式僅 要宣告 宣告 宣告 正確 正確 5. 任何函式主體不可在主程式內 6. 函式主體內不可在其他函式主體內 錯誤 錯誤 一. 函式原型宣告語法 語法 [ 傳回值型別 ] 函式名稱 ( 資料型別 1, 資料型別 2, 資料型別 n 引數 n); 8-6
Chapter 8 函式 說明 1. double cal(int); 宣告 cal 函式, 此函式可傳回 double 浮點數資料型別的資料, 呼叫時必須傳入一個 int 整數資料型別的資料 2. int add(int, int); 宣告 add 函式, 此函式可傳回 int 整數資料型別的資料, 呼叫時必須傳入兩個 int 整數資料型別的資料 二. 函式定義語法 語法 [ 傳回值型別 ] 函式名稱 ( 資料型別 1 引數 1, 資料型別 2 引數 2, 資料型別 n 引數 n) { 引數串列程式區段 ; return 運算式 ; } 說明 1. 傳回值型別函式的傳回值可以是數值 (byte, int, float, ) 字元 字串 指標 等資料型別 若函式不傳回任何資料, 必須將傳回值型別設為 void 2. 函式名稱在同一個程式中自定函式的名稱不可以重複定義 ; 函式名稱也不能和系統所提供的內建函式的名稱相同 3. 引數串列 ( 資料型別 1 引數 1, 資料型別 2 引數 2,. 資料型別 n 引數 n) 是指呼叫該函式時, 會將傳入值依序存入對應的引數, 要注意兩者的資料型別要一致 引數可以是變數 常數 陣列 指標 自訂資料型別, 但不可以是運算式 若引數串列的個數是一個 ( 含 ) 以上, 引數間必須使用逗號來分隔 若無傳入值時, 引數串列可省略變成一個空的小括號 至於有關引數的傳遞方式將在第十一章中詳述 在函式的原型宣告中小括號內的引數串列, 只有對應的資料型別, 引數可以省略不寫 8-7