C Programming

From YuntechWiki

Jump to: navigation, search

Contents

C++程式設計

開啟程式設計能力的關鍵

本書特色

  1. 練習為主,文字為輔:眾多學者的研究結果顯示,最有效的學習程式設計的方法是「實際動手寫程式」。本書精心安排的練習題目以由淺入深、循序漸進,配合在關鍵題目提供部分程式碼的方式,以將近兩百題的練習題目,一步一步的開啟與培養學習者的程式設計思考力。
  2. 本數位教科書可以讓學習者連線至國立雲林科技大學的「程式語言學習網」,透過下載的影音教材、練習、提示及編輯器,大幅簡化寫程式的難度。
  3. 採用美國麻省理工學院與加州大學柏克萊分校等著名大學的入門程式語言─Scheme為培養程式設計思考力的媒介,使得學習者能夠不被複雜的語法干擾,而能專注於思考能力的提升與精進。
  4. 以迥異於傳統程式設計課程的教學方式,帶領學習者突破程式設計思考能力的關鍵障礙,包括:邏輯判斷、遞迴、迴圈、遞迴程序轉換成迴圈程序及能夠抽取程式碼邏輯的高階程序等。
  5. 以打開神秘黑盒子的方式,實做物件導向程式語言的核心語意,並以實例學習物件、繼承、動態連結與抽象類別的有趣應用。
  6. 提供了陣列、排序、二元搜尋樹及關連式資料庫等單元的進階練習。
  7. 為學習C++、Java等語言提供了「程式設計思考能力」的預備,讓學習者可以逐步漸進的排除學習程式設計的許多障礙。總的來說,甚至比直接學習C++或Java還要快速、有效。如果您不想在C++或Java的複雜功能中「陣亡」,本書無疑提供了您一條活路。

目錄

  1. 程式類語言
  2. C++語言
  3. 變數
  4. 運算子與運算式
  5. 流程控制
  6. 遞迴與迴圈
  7. 函數的設計
  8. 類別與指標
  9. 陣列
  10. 字串
  11. 結構
  12. 檔案處理
  13. 動態資料結構
  14. 物件與類別
  15. 繼承與多型

程式類語言

PLWEB 平台解說檔_sunny老師講解區 http://140.126.112.33/~sunny/EXE/PLWEB_SETUP/PLWEBSET_index.htm

第一章 程式語言概論_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH1/ch1_index.htm

程式類語言的演進與分類

第一個程式語言的出現至今才不過半個世紀多, 但在短短的 50 年, 就已發展出數量多到令人眼花撩亂的程式語言種類。低階語言有可以分為機器語言與組合語言,所謂機器語言 (Machine Language) ,對於電腦來說, 它真正所懂得的語言只有一種, 就是機器語言。所謂的機器語言, 其實是以0與1數字來表示電腦所能進行的各個動作, 當電腦看到這0與1數字後, 就會依照每個數字所代表的意義做出指定的動作。

組合語言

組合語言 (Assembly) ,使用文字符號替代機器碼撰寫程式的語言, 就稱為組合語言。這種寫法絕對要比原本的機器語言要容易懂得多, 不過這樣一來, 雖然人們看得懂, 但是電腦卻看不懂, 而必須透過一個翻譯的動作, 將這個用組合語言寫成的程式轉換成電腦看得懂的機器語言, 負責這個翻譯動作的就是組譯器 (Assembler)

高階語言

高階語言,比使用低階語言所寫出來的程式精簡多了。不過電腦並無法看懂這樣的程式, 和組合語言一樣需要一個轉譯的動作, 將使用高階語言所撰寫的程式轉換成電腦所能看懂的機器語言, 然後才能依此執行。這個轉換的動作是由各程式語言的編譯器 (Compiler) 或是解譯器 (Interpreter) 來進行。隨著軟體技術的不斷演進, 高階語言也仍不斷在改良、演進。約在 1960 年代興起了物件導向 (Object-Oriented) 的觀念, 簡單的說就是將資料和程式結合成物件, 在設計程式時以物件的方式來思考及設計程式的內容。目前比較著名的物件導向程式語言, 除了 C++ 外, 還有 Ada、Java 、 Smalltalk 。目前常見的高階程式語言有 Basic/QBasic/Visual Basic、FORTRAN 、COBOL 、Pascal/Delphi 、C/C++、Java。

Basic/QBasic/Visual Basic

Basic 是 Beginer's All Purpose Symbolic Instruction Code 的縮寫, 是 1964 年發展出來的高階語言, 意思是一種多用途 (不限商用或工程用) 的初學者符號式指令語言, 其特徵是有行號、易學及直譯式的執行方式。什麼是直譯式的執行方式?所謂直譯式執行, 就是程式一面翻譯成機器碼, 一面執行, 其優點就是使用的親和性高。什麼是使用親和性高呢?因為程式一面翻譯時, 遇有錯誤就告訴使用者, 但編譯式的程式語言, 則要等全部的程式均無誤後才能有執行結果。除了 Basic 外, 幾乎所有的程式語言都是先完成編譯再執行, 其優點是執行效率較高。Basic 是古老的程式語言中較受廠商與使用者青睞的語言, 早期的 Basic 無法顯示中文, 倚天公司的 ETBasic 則提供處理中文的能力。早期的 Basic 結構化指令並不完善, 所寫起程式來, 都是 Goto 來 Goto去, 後來的人稱這一類的程式像一碗通心麵。Basic 的後續版本為 QBasic, QBasic 和 Basic 的差異在於原來的 Basic 加上一些結構化的 While...Wend 及Do...Loop 等指令, 使得程式符合結構化的要求; 同時 QBasic 亦增加整合的編輯環境, 可在同一環境編輯、編譯及執行程式。QBasic 的優點是解決結構化的問題, 但一切程式均要從零開始, 就像蓋房子要在現場拌水泥作窗戶與門一樣辛苦, 所以 1990 年代有 Visual Basic的出現, Visual Basic 在原結構化條件下增加物件導向的觀念及視覺化元件。簡單的說就是有很多現成的元件可供使用, 就像現代人蓋房子, 不用在現場拌水泥與製作窗戶, 只要利用現成的水泥、門窗及衛浴等元件就可以輕鬆的完成高樓大廈, 當然程式設計者也可以作元件供自己或他人使用。Visual Basic 同時提供編譯程式給使用者, 待使用者於解譯無誤後使用,如此可以提昇程式的執行速度。Visual Basic 的優點是容錯能力比較強, 此一特性必然造成編譯與執行的負擔, 因而減緩執行速度。

FORTRAN

FORTRAN (FORmula TRANslation) 是 1995 年發表的程式語言, 它著重在工程的運算, 民國七十年代的大學工科學生大多使用這種語言作為程式設計的工具, 當時微電腦並不普及 (所以當然沒有鍵盤), 所有的指令均要在卡片 (此種卡片與聯考作答的卡片類似) 打孔, 再交由計算機中心的小姐放入電腦主機執行, 執行結果統一列印於報表紙, 再由小姐每天二至三次放在外面各班的信箱, 可惜筆者沒這麼老, 所以無法體會其辛勞, 目前約 50年次以上的人才會有這種經驗。之後, 微電腦普及, 當然也可在家學FORTRAN, 但隨著週邊設備的複雜化, 此種語言已不符時代潮流, 現已幾乎消聲匿跡。 COBOL COBOL (Common Businese Oriented Language) 是 1959 年所發表的商用程式語言, 也是民國七、八十年間商科學生學習程式語言的工具, 其特徵是變數又臭又長, 當然程式也很冗長, 使用這種語言必須有極快的打字速度, 現在除了一些銀行還在使用此種語言外, 也是漸漸走入歷史。

Pascal/Delphi

Pascal 是於 1968 年, 由 Niklaus Wirth 所研發及發表的程式語言, 這個語言一直給人學院派的印象, 直到 1984 年個人電腦逐漸流行, Borland 公司推出 PC 上的 Pascal 編譯器, 其名稱為 Turbo Pascal, 當時亦是 Pascal 最紅的年代。但是, 隨著微軟視窗軟體的大行其道, Turbo Pascal 的最後版本是Borland Pascal 7.01 。1995 年, 微軟的 VB 已如日中天, Borland 公司為了扭轉 Pascal 的頹勢,所以另外開發 Delphi 1.0, 它是繼承 Pascal 語法、並加入物件導向及視覺化輸出入元件的一種快速應用程式開發工具 (Rapid Application Development,以下簡稱 RAD), Borland 並希望此軟體能與微軟的 VB 一較長短。

C 語言

C 語言是 1972 年在 AT&T 貝爾實驗室 (Bell Laboratory) 中發展出來的, 環顧當時的高階語言 Basic 、FORTRAN 及 COBOL 等, 其優點就是具有高階語言的親和性, 其缺點則都是執行效率遠遠落後組合語言。原創者 Dennis Ritchie當時的貝爾實驗室乃改進 Pascal 的語法, 使之更簡捷, 且加入指標型態直接存取記憶體而大大提昇程式的執行效率。雖然執行效率仍無法與組合語言相比, 但其具有高階語言的親和性, 以使它逐漸取代組合語言。當時是為了要發展 UNIX 作業系統, 所以需要一種具有類似組合語言般的高效率,以及能很方便移植到各機型 (高可攜性) 之程式語言, 於是創造了 C 語言。後來, 由於 C 語言所具備的效率、彈性、可攜性等各項優點, 逐漸成為一種廣受歡迎的程式語言。C 語言的優點包括程式碼精簡, 產生的程式執行效率佳。具有很高的可攜性。完全支援模組化的程式設計。彈性大而擴充性強。C 語言在 1980 年代時愈來愈流行, 但在商業領域及政府單位對各種事物要求標準化的需求下, 在 1983 年時, 美國國家標準學會 (ANSI) 開始著手制定 C 語言的標準, 並在 1989 年時推出第一版的 C 語言標準。目前最新版的標準則是 1999 年定案的, 稱為 C99。

C++

C++ 於 1980 年由貝爾實驗室所發表, 是一種繼承 C 語言的編譯程式 (所謂繼承就是新創的語言要能讓原有的程式都順利執行), 它的創新之處是加上物件導向的設計觀念 ---- 類別與物件。Microsoft Visual C++ 是微軟公司針對 C++語言所發展的編譯程式, 它的特色是從原有的 C++增加以下工具, 諸如 MFC (Microsoft Foundation Class)、OLE (Object Linking and Embedding) 、ODBC (Open DataBase Connectivity)、DAO (Data Access Object)、ActiveX、COM (Component Object Model) 等微軟大力行銷的程式設計工具。此後 C with Classes 不斷被改良, 並在 1983 年時正式命名為 C++。在 C 語言中, ++ 是一個遞增運算子 (Increment operator), 如果將 C 當成是變數, 則 C++ 就代表 C=C+1 之意;由此可看出 C++ 的目標就是要創造一個更好的 C, 而且仍可與 C 相容並保有 C 原來的各項優點。

由於 C++ 可與 C 相容, 所以大部份在 C 語言上發展出來的軟體仍可以在 C++ 中繼續使用, 再加上其本身具有許多比 C 更強的特性, 使得 C++ 在短短幾年之間, 搖身一變成為目前最熱門的語言之一。最初的 C++ 只是在 UNIX 上的一個轉譯器 (名為 Cfront), 可將 C++ 程式先轉成 C 語言後再加以編譯; 其後, 隨著使用者不斷增加, 而逐漸有了在各作業系統上的編譯器, 使 C++ 應用程式的產生更加方便。C++ 的標準化是由 ANSI 和國際標準組織 (ISO) 共同進行的, 兩個組織均成立工作小組專責制定 C++ 的標準, 同時也針對使用者的需求, 修正及強化 C++ 的功能。ANSI/ISO 的 C++ 標準經過漫長的討論與修正, 在 1998 年正式發布了編號為 ISO/IEC 14882:1998 的 C++ 標準, 簡稱為 ISO C++98 或 C++98。在此之後, 各主要 C++ 編譯器開發者大多也都遵循 ISO 的標準來設計他們的 C++ 語法。在 ISO 完成 C++98 標準後, 也隨即展開下一代 C++ 標準的制定工作, 這個下一版的 C++ 標準預計在 200X 年能正式推出, 所以被稱為 C++0X。雖然目前難以預測下一代的 C++ 標準會有什麼樣的變化, 但可以預見的是:在業界的要求下, 新 C++0X 仍會與目前的 C++ 相容, 並增加一些讓程式設計人員更方便的功能。

因此我們現在學好 C++, 不必擔心過10年後會出現一個令人陌生的新 C++ 語言, 又要重學很多東西。我們現在所學、所寫 的 C++ 程式, 可能不必做任何修改、或是只需做局部修改, 就能符合下一代的 C++ 標準, 也能用在下一代的 C++ 編譯器。C++ 與 Java、C# 的競爭, 對程式語言陌生的讀者, 雖然沒寫過什麼程式, 可能也聽說過被視為 C++ 對手的 Java、C# 程式語言。這兩個語言也是目前流行的物件導向程式語言, 使用的軟體公司 / 程式設計人員也不少, 很多人也將這幾個語言視為彼此互相競爭的對手。

OQM7pX <a href="http://mzhjhablytgo.com/">mzhjhablytgo</a>, [url=http://wvbxkdlmsalf.com/]wvbxkdlmsalf[/url], [link=http://eajgjdhedtkl.com/]eajgjdhedtkl[/link], http://coxvefrgsduq.com/

各語言之差異

  1. C++:發展最久, 應用也最廣泛, 幾乎所有的作業系統 / 平台上都可找得到開發 C++ 應用程式的工具, 而且編譯出來的程式, 其執行效能最佳。
  2. Java:目前主要應用在開發網路及行動裝置的應用程式, 其特色是跨平台, 換言之編譯好的 Java 程式, 可以在任何已安裝 Java 執行環境 (JRE, Java Runtime Enviroment) 的作業系統上執行。
  3. C#:微軟所開發的程式語言, 也已被 ISO 及歐洲標準組織 (ECMA) 認可為一項程式語言標準。C# 和 Java 有個相似的特性:C# 的程式在編譯後, 需在 .NET 環境下執行, 換句話說, 只要有 .NET 環境的平台, 都能執行 C# 應用程式, 達到跨平台執行的效果, 但由於在 Windows 以外的作業系統很難看到 .NET 的蹤影, 所以實際上主要的應用仍侷限在微軟 Windows 作業系統。和 C++ 相較, 用 C# 開發 Windows 圖形介面的程式較為方便。

C++ 程式開發工具

工欲善其事必先利其器, 要學習 C++ 語言, 當然要先準備好一套實用的開發工具來進行開發。命令列工具與整合開發環境如下: 1. Visual C++ 系列 2. Borland C++Builder/C++BuilderX 系列 3. GCC 4. Dev C++ 5. PLWEB平台


Visual C++ 系列

微軟公司的 Visual C++ 是 Windows 平台上主流的 C++ 整合開發環境之一。Visual C++ 的 IDE 和微軟公司其它程式語言產品 (包括 Visual Basic、C#、J# 等) 其實是共用一個名為 Visual Studio 的 IDE。對於想同時用微軟其它語言或技術的開發人員而言, 由於只需熟悉一套操作介面即可, 所以使用起來較為方便。近三年來, 微軟為推展其 .NET 技術, 也將相關技術加到 Visual C++ 中, 其特色之一就是能以微軟自家的 Managed C++ 語法, 撰寫專門用在 .NET 環境下執行的 C++ 程式。可參考微軟 .NET 網站 (http://www.microsoft.com/Net/) Visual C++ 網站 (http://msdn.microsoft.com/visualc/)、或其它相關書籍。

Borland C++Builder/C++BuilderX 系列

Borland 公司的 C++Builder/C++BuilderX 整合開發環境, 由於具備類似 Visual Basic 的設計介面, 可以很容易設計圖形使用者介面, 因此廣受使用者歡迎。而且 C++BuilderX 同時支援 Windows、Linux、Solaris 等三種作業系統。 從官方網站 http://www.borland.com/ downloads/ 除了可下載個人版及企業版的試用版外, 也可找到只能在文字模式下使用的純編譯器版本。

QxIHJ7 <a href="http://zuzytigcxwpi.com/">zuzytigcxwpi</a>, [url=http://szdriiqutkdk.com/]szdriiqutkdk[/url], [link=http://oecrancllitt.com/]oecrancllitt[/link], http://dlmvniwlgwqs.com/

WA63n6 <a href="http://rtwugwenaijo.com/">rtwugwenaijo</a>, [url=http://tjmwhvimihbu.com/]tjmwhvimihbu[/url], [link=http://pqrsvejtrsyw.com/]pqrsvejtrsyw[/link], http://caovqjlofrgq.com/

PLWeb

串流解說檔http://140.126.112.33/~sunny/EXE/PLWEB_SETUP/PLWEBSET_index.htm

PLWeb使用 jEdit程式碼編輯器為開發工具,為不同的學習單元內嵌了解譯器、編譯器、測試案例、程式碼提示,以及提問、回答、繳交等功能, 使得程式的撰寫、測試、偵錯、繳交等動作均能省時而又方便的完成。利用循序漸進的練習題組, 以按部就班的方式進行觀念的學習,增快學習有趣觀念的速度,能提升學習的成效。PLWEB平台資訊請至其官方網站:http://www.plweb.org。 ___________________________________________________________________________________________________________________________________

C++ 程式

C++_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH2/ch2_index.htm

C++ 程式的組成及語法規則

C++ 的程式輪廓

#include <iostream>
using namespace std;
 
int main(void)
{
cout << "I think so I am." << endl;
return 0;
}

標準函式庫

C++ 語言提供了一組具備各式功能的工具箱, 這個工具箱一般稱為標準函式庫 (standard library)。C++ 標準函式庫提供的不只是函式, 也有許多實用的類別 (class) 和物件 (object) 可直接取用。C++ 語言規定, 使用任何函式、類別、物件時, 必須先宣告。同樣的, 要使用標準函式庫所提供的函式、類別、物件, 也都必需在程式中一一宣告這些函式、類別、物件的名字。

#include<iostream>

使用 std 名稱空間

using namespace std;   // 使用 std 名稱空間

u4sXyu <a href="http://mctrlizeiacd.com/">mctrlizeiacd</a>, [url=http://rrfobvbqnsxc.com/]rrfobvbqnsxc[/url], [link=http://yklgxpkamffd.com/]yklgxpkamffd[/link], http://ibhqmagwtbdn.com/

良好的程式撰寫習慣

C++ 是自由格式的程式語言, 只要有確實遵照字符間加上必要的空格、敘述結尾加上分號… 等基本的語法規則, 不管我們的程式如何排列, C++ 編譯器仍能正常讀取進而編譯。要養成良好的程式撰寫習慣, 因為寫程式並不只是寫給 C++ 編譯器看, 很多時候程式也要給自己以外的人閱讀。良好的程式撰寫習慣說明如下:

  1. 適當的分行:便於整篇程式的閱讀。
  2. 適當縮排:提高可讀性。
  3. 程式碼的註解:幫助瞭解程式。

範例練習

  1. http://140.126.112.33/~sunny/ch1/1_1.htm
  2. http://140.126.112.33/~sunny/ch1/1_2.htm

________________________________________________________________________________________________________________________________

i3vP8n <a href="http://acqqzyabyvpv.com/">acqqzyabyvpv</a>, [url=http://hkoipakdwqcx.com/]hkoipakdwqcx[/url], [link=http://rhszmukrelou.com/]rhszmukrelou[/link], http://evljvvdrwpnc.com/

運算子與運算式

運算子與運算式_sunny老師講解區http://140.126.112.33/~sunny/EXE/CH4/ch4_index.htm


程式的敘述是由運算式 (Expression) 所構成,運算式是由一組一組的運算子 (Operator) 與運算元 (Operand) 組成。運算子代表的是運算的種類 (或者說是運算符號), 而運算元則是要運算的資料。

運算式 8+2=10
+ 代表運算子,表示要進行加法運算
82 代表運算元

C++ 的算術

tRaBqx <a href="http://unhzsyeweibs.com/">unhzsyeweibs</a>, [url=http://hzjsgvrocowo.com/]hzjsgvrocowo[/url], [link=http://wlmommmwqwbq.com/]wlmommmwqwbq[/link], http://oumnaaqlwtsm.com/

比較運算子

  1. > 表示大於
  2. = 表示大於等於
    
#<= 表示小於等於   <code scheme> ex. a > b 表示 a 是否大於 b ex. a < b 表示 a 是否小於 b ex. a == b 表示 a 是否等於 b ex. a != b 表示 a 是否不等於 b ex. a >= b 表示 a 是否大於等於 b ex. a <= b 表示 a 是否小於等於 b </code>   ===邏輯運算子=== #&& 表示AND邏輯運算 #|| 表示OR邏輯運算 #! 表示NOT邏輯運算 <code scheme> ex. m && n 表示m 與 n 作 AND 邏輯運算 ex. m || n 表示m 與 n 作 OR 邏輯運算 ex. !m 表示m 作 NOT 邏輯運算 </code>   ===位元運算子=== #>> 表示位元右移 ex. k >> n 表示 k 的各個位元右移 n 個位元,左邊補 0 #<< 表示位元左移 ex. k << n 表示 k 的各個位元左移 n 個位元,右邊補 0 #& 表示AND ex. k & m 表示 k 與 m 對應的位元作 AND 運算 #| 表示OR ex. k | m 表示 k 與 m 對應的位元作 OR 運算 #~ 表示NOT ex. ~k 表示 k 的各個位元作 NOT 運算 #^ 表示XOR ex. k ^ m 表示 k 與 m 對應的位元作 XOR 運算   idt6cB <a href="http://dmzhyopuzlfy.com/">dmzhyopuzlfy</a>, [url=http://kbvbhjaizpdi.com/]kbvbhjaizpdi[/url], [link=http://nimqhxtpijtu.com/]nimqhxtpijtu[/link], http://cqdxijmkcibe.com/   ===強制型別轉換=== 可以用型別轉換 (Cast) 運算子來作強制的型別轉換   <code scheme> int i,j; double sum; sum=(double)i/j;   將變數 i 先轉型成 double 型別, 再做除法運算 (轉型運算子的優先順序較高), 所以就能算出含小數的商值。 </code>   範例練習 #http://140.126.112.33/~sunny/ch4/4_1.htm #http://140.126.112.33/~sunny/ch4/4_2.htm #http://140.126.112.33/~sunny/ch4/4_3.htm #http://140.126.112.33/~sunny/ch4/4_4.htm #http://140.126.112.33/~sunny/ch4/4_5.htm #http://140.126.112.33/~sunny/ch4/4_6.htm #http://140.126.112.33/~sunny/ch4/4_7.htm #http://140.126.112.33/~sunny/ch4/4_8.htm   = 流程控制 = 第五章 流程控制_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH5/ch5_index.htm   mLcQCp <a href="http://hqlelurbsorw.com/">hqlelurbsorw</a>, [url=http://vqdahqewkifd.com/]vqdahqewkifd[/url], [link=http://lxfggvlvoyhr.com/]lxfggvlvoyhr[/link], http://wdhdvzfpmjeu.com/   NU5VRo <a href="http://nnhkceclblze.com/">nnhkceclblze</a>, [url=http://npjrtduglkui.com/]npjrtduglkui[/url], [link=http://qpeksbzqvwon.com/]qpeksbzqvwon[/link], http://devlwcbaemzn.com/   =函數的設計 = 函數_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH6/ch6_index.htm   函數的功能 #將程式中重覆或相同功能的程式區塊合而為一,減少重覆。 #以呼叫函數的方式只需一行程式碼,可以代替長而複雜的程式區段,使程式更為簡潔。 #可使程式更有結構化而易於閱讀及維護。   <code scheme> 函數的定義(語法):傳回型態 函數名稱(參數0, 參數1, 參數2, ...) { 函數內容; ... return 傳回值; } </code>   函數的呼叫(語法):函數名稱(參數0, 參數1, 參數2, ...); 函數的宣告(語法):傳回型態 函數名稱(參數0, 參數1, 參數2, ...);   <code scheme> 1. 請設定2個函式 CtoF (double f)及 FtoC (double f)。 2. 各函式溫度公式計算,參考以下。 C = (F - 32) * 5 / 9; // 華氏溫度轉換攝氏溫度公式的算式 F = (C + 32) / 5 * 9; // 攝氏溫度轉換華氏溫度公式的算式 3. 請輸入攝氏的溫度35度,輸出華氏溫度的值。 4. 請輸入華氏的溫度60度,輸出攝氏溫度的值。   void CtoF (double f) // 將華氏溫度轉成攝氏的函式 { cout << "換算成華氏溫度為" << ((f + 32) / 5 * 9) << "度\n"; // 溫度轉換公式的算式 }   void FtoC (double f) // 將華氏溫度轉成攝氏的函式 { cout << "換算成攝氏溫度為" << ((f - 32) * 5 / 9) << "度\n"; // 溫度轉換公式的算式 }   int main() { double x; cout << "請輸入攝氏的溫度:"; cin >> x; CtoF(x); // 用 x 為參數呼叫 CtoF() cout << "請輸入華氏的溫度:"; cin >> x; FtoC(x); // 用 x 為參數呼叫 FtoC()   } </code>   ==傳遞參數== 1.可以將資料傳入函式內,函式可根據傳入的內容,做特定的處置。   ===變數的作用範圍與生命週期=== #局部變數 #靜態局部變數 #全域變數 #外部變數: 外部變數的宣告方法是在資料型別前加上 extern 關鍵字。   <code scheme> int x=10; // 全域變數 int main() { int x=100; cout << "局部變數 x = " << x << '\t' << "全域變數 x = " << ::x << "\n"; // 用 :: 存取全域變數 x += ::x++; cout << "局部變數 x = " << x << '\t' << "全域變數 x = " << ::x << "\n"; } </code>     ==函式傳回值== S2j4zI <a href="http://yqgsovsuvfcs.com/">yqgsovsuvfcs</a>, [url=http://pmcjcjxptfaa.com/]pmcjcjxptfaa[/url], [link=http://xezudmnelxpt.com/]xezudmnelxpt[/link], http://qsoutiwveosp.com/   ==C++ 標準函式庫== 每種程式語言都會提供各種工具函式, 讓程式設計人員直接使用,不必再重複設計函式。C++ 語言提供的工具函式,分類放置在不同的標準函式庫中,如使用 cin/cout 要先含括 <iostream> ; 數學計算函式如次方、平方根、指數、對數、三角函數等,要先含括 <cmath>, 即可進行基本運算。   ==函式多載== <code> double newV(double t, double a=9.8, double v0 = 0) { // 兩個參數有預設值 return v0 + a*t; }   int main() { cout << "速度與加速度的計算示範:V=V0+at" << endl;   cout << "若V0=100,a=2.8,t=15,則"V=" << newV(15,2.8,100) << "\n";   cout << "若V0=0,a=9.8,t=15,則V=" << newV(15)<< "\n"; // 只傳一個參數 }   </code> <code> Ex. 6_10 #include <iostream> using namespace std;   void volume (double r) // 計算球體體積 { cout << "半徑 " << r << " 的球體體積為 " << 4 / 3 * 3.14159 * r * r * r << endl; } // 計算長方體體積 void volume (double l, double w, double h) { cout << "長 " << l << " 寬 " << w << " 高 " << h << " 的長方體體積為 "<< l * w * h << endl; }   int main() { volume(15); volume(5,15,25); } </code>   <code> Ex. 6_11 #include <iostream> using namespace std;   int fact(int); int main(void) { int a; do { cout << "Input an integer:"; cin >> a; } while (a<=0); // 確定輸入的a為大於0的數 cout << "1*2*...*" << a << "=" << fact(a) << endl; return 0; }   int fact(int a) // 自訂函數fact(),計算a! { if(a>0) return (a*fact(a-1)); else return 1; } </code>   <code> Ex. 6_12 #include <iostream> using namespace std;   int power(int,int); int main(void) { int a=2,b=3; cout << a << "^" << b << "="; cout << power(a,b) << endl; // 印出a^b的結果 return 0; }   int power(int a,int b) // 自訂函數power(),計算a的b次方 { if(b==0) return 1; else return (a*power(a,b-1)); } </code>   #http://140.126.112.33/~sunny/ch6/6_1.htm #http://140.126.112.33/~sunny/ch6/6_2.htm #http://140.126.112.33/~sunny/ch6/6_3.htm #http://140.126.112.33/~sunny/ch6/6_4.htm #http://140.126.112.33/~sunny/ch6/6_5.htm #http://140.126.112.33/~sunny/ch6/6_6.htm #http://140.126.112.33/~sunny/ch6/6_7.htm #http://140.126.112.33/~sunny/ch6/6_8.htm #http://140.126.112.33/~sunny/ch6/6_9.htm #http://140.126.112.33/~sunny/ch6/6_10.htm #http://140.126.112.33/~sunny/ch6/6_11.htm #http://140.126.112.33/~sunny/ch6/6_12.htm   = 指標與陣列 = 陣列與指標_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH7/ch7_index.htm   Pg5HgN <a href="http://vnxzkwyncrvo.com/">vnxzkwyncrvo</a>, [url=http://jytydfhedhzp.com/]jytydfhedhzp[/url], [link=http://hsaihtgcofmt.com/]hsaihtgcofmt[/link], http://zidjejxgqyqx.com/   ==陣列 == 宣告與定義陣列 陣列的宣告方式和宣告一般變數一樣, 都要指明資料型別和變數名稱, 此外需在變數名稱後加上一對中括號 [ ] (稱為足標標算子, subscript operator), 表示這是個陣列變數。並需在中括號內填入陣列的容量, 表示可以容納多少個同型別的變數 ex. int iArray[5]; //宣告可存放 5 個元素的整數陣列 iArray   ==字元陣列== 由於字串和字元陣列一樣都是一組字元的集合, 所以我們可把字元陣列當成字串使用。 <code> #include <iostream> #define SIZE 5 // 陣列大小常數 using namespace std;   int main() { char array[SIZE]={'c','h','m','i','n'};   cout << "排序前:"; for (int i=0;i<SIZE;i++) // 輸出排序前的陣列內容 cout << array[i]; for (int i=0;i<SIZE;i++) for (int j=i+1;j<SIZE;j++) if (array[i]<array[j]) // 若 array[i] 的值小於 array[j] { // 就將 2 個元素的值對調 char temp = array[i]; // temp 是對調時用到的暫存變數 array[i] = array[j]; array[j] = temp; }   cout << endl << "排序後:"; for (int i=0;i<SIZE;i++) // 輸出排序後的陣列內容 cout << array[i]; cout << "\n"; } </code>   ==多維陣列== ex. int sale[2][4]={{30,35,40,45},{33,44,25,30}};// 宣告陣列並設定初值   <code> #include <iostream> using namespace std;   int main(void) { int i,j,sum=0; int sale[2][4]={{30,35,40,45},{33,44,25,30}};// 宣告陣列並設定初值 for(i=0;i<2;i++) // 輸出銷售量並計算總銷售量 { cout << "業務員" << (i+1) << "的業績分別為 "; for(j=0;j<4;j++) { cout << sale[i][j] << " "; sum+=sale[i][j]; } cout << endl; } cout << "本年度總銷售量為" << sum << "輛車" << endl; return 0; } </code>   #http://140.126.112.33/~sunny/ch7/7_1.htm #http://140.126.112.33/~sunny/ch7/7_2.htm #http://140.126.112.33/~sunny/ch7/7_3.htm #http://140.126.112.33/~sunny/ch7/7_4.htm #http://140.126.112.33/~sunny/ch7/7_5.htm #http://140.126.112.33/~sunny/ch7/7_6.htm #http://140.126.112.33/~sunny/ch7/7_7.htm #http://140.126.112.33/~sunny/ch7/7_8.htm #http://140.126.112.33/~sunny/ch7/7_9.htm   =類別與指標 = 類別與指標_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH8/ch8_index.htm   類別又稱為使用者自訂資料型別 (User Defined Data Type), 表示它是由程式設計人員自訂出的資料型別, 而編譯器也會把類別當成一種資料型別來處理。   定義類別的語法 #資料成員 #成員函式 #靜態成員     我們可以用 class 或 struct 關鍵字來定義類別, 以下就是定義一個空白的類別, 其名稱為 Car   class Car {   };   Car mycar,yourcar;   完成類別的定義, 就等於告訴編譯器我們已定義了一個新資料型別, 接著就能用它來建立物件了, 宣告的方式和使用內建資料型別宣告變數一樣。在此類別名稱就像是一個新的型別名稱, 並可用來定義出各個性質相同的物件, 這些物件就稱為該類別的個體 (Instance), 例如上例中的 mycar、yourcar 就稱為 Car 類別的個體。   物件導向程式設計具有三項特性:封裝(Encapsulation )、繼承 (Inheritance)、多面性 (Polymorphism), 本章我們先來認識什麼是封裝。封裝的意思是指將類別的屬性及操作屬性的方法都包裝在其中, 而且只對外公開一些操作資料的方法, 外人無法直接存取類別 (物件) 未公開的屬性。   == 封裝 == 封裝的目的是讓使用類別的人, 不需要理會、瞭解類別中包裝了什麼樣的內容, 他只需透過公開的方法來操作物件即可達到使用類別的目的 (就像只要會操作搖控器就能看電視, 而不需瞭解電視內部的設計)。這樣的理念讓設計好的類別有如軟體 IC, 程式設計人員可將既有的 IC (類別) 組合起來, 實作出程式的功能, 如此不但讓程式碼可重複使用, 更能提高工作效率。   封裝的另一個意義則是資料隱藏 (Data Hiding), 類別中的成員預設都無法被外界任意存取。因為若能被外界任意存取、修改資料成員, 又失去了物件導向程式設計的意義。類別中不能被外部存取的成員, 統稱為私有 (private) 成員;相對於私有成員則是公開 (public) 成員, 它們可被類別外部的程式任意存取。   ==字串 == <code> 1.用字串查驗身份證字號的格式。 2.一個正確的身份證字號, 必定是由一個英文字母以及 9 個數字所組成。 3.第 1 字是否為大寫或小寫英文字母所組成。 4.身份證字號後面9個字應是數字。   #include<iostream> #include<string> #include<cctype> using namespace std;   int main() { string idStr; // 記錄使用者輸入資料 bool isID = false; // 使用者輸入的格式是否正確 string num = "0123456789"; // 用來檢證是否為數字的字串   do { cout << "請輸入身份證字號:"; cin >> idStr; if(idStr.size()!=10) { cout << "身份證字號共十個字元,請不要輸入空白!" << endl; continue; } if (isalpha(idStr[0])) // 第 1 字是否為大寫或小寫英文字母 if (idStr.substr(1,9).find_first_not_of("0123456789") == string::npos) // 檢查後 9 字是否含數字以外的字元 isID = true; else cout << "身份證字號後面9個字應是數字!" << endl; else cout << "身份證字號第 1 個字應為英文字母!" << endl; } while (!isID); } </code>   <code> 1.檢核輸入的身份證字號是否合法。 2.一個正確的身份證字號, 必定是由一個英文字母以及 9 個數字所組成。 3.第 1 字是否為大寫或小寫英文字母所組成。 4.身份證字號後面9個字應是數字。 5.從第 2 個數字開始, 將第 2 個數字乘以 9、第 3 個數字乘以 8、..、第 9 個數字乘以 2、第 10 及第 1 個數字都是乘以 1, 將這些相乘的結果加總起來。 6.用 10 減去加總值的個位數。結果個位數和身份證字號的最後一個數字相同, 此身份字號即為合法, 否則即為不合法的身份字號。   #include<iostream> #include<string> #include<cctype> using namespace std;   bool checkID (string idStr) // 查驗身份證字號的函式 { int letterNums[] = {10,11,12,13,14,15,16,17,34,18, 19,20,21,22,35,23,24,25,26,27, 28,29,32,30,31,33};   if (islower(idStr[0])) // 先將第一個英文字母轉為大寫 idStr[0] = toupper(idStr[0]);   int total = (letterNums[idStr[0] - 'A'] / 10) + (letterNums[idStr[0] - 'A'] % 10) * 9; for(int i = 1;i < 9;i++) total += (idStr[i] - '0') * (9 - i); // 依序加總   // 以10減去加總值之個位數後再取個位數 int checkNum = (10 - total % 10) % 10;   return checkNum == (idStr[9] - '0'); //與身份證字號最後一碼比 }   int main() { string idStr; // 記錄使用者輸入資料 bool isID = false; // 使用者輸入的格式是否正確 string num = "0123456789"; // 用來檢證是否為數字的字串   do { cout << "請輸入身份證字號:"; cin >> idStr; if(idStr.size()!=10) { cout << "身份證字號共十個字元,請不要輸入空白!" << endl; continue; } if (isalpha(idStr[0])) // 第 1 字是否為大寫或小寫英文字母 if (idStr.substr(1,9).find_first_not_of("0123456789") == string::npos) // 檢查後 9 字是否含數字以外的字元 if (isID = checkID(idStr)) // 呼叫 checkID() 進行查驗 cout << "查驗通過" << endl; else cout << "不是合法的身份證字號" << endl; else cout << "身份證字號後面9個字應是數字!" << endl; else cout << "身份證字號第 1 個字應為英文字母!" << endl; } while (!isID); } </code>   == 類別 ==   <code> #include<iostream> using namespace std;   class Car { public: static void setEff(double e) { eff = e;} // 設定靜態資料成員 double getEff() { return eff; } static double GtoL(double G) { return G*3.78533; } // 將加侖換算為公升, 1加侖為 3.78533 公升 static double LtoG(double L) { return L*0.26418; } // 將公升換算為加侖, 1公升為 0.26418 加侖 private: static double eff; // 靜態資料成員 };   double Car::eff = 0; // 定義靜態資料成員   int main() { // 未建立物件也可呼叫靜態成員函式 cout << "10加侖等於 " << Car::GtoL(10) << " 公升" << endl; // 用物件呼叫成員函式 cout << "10公升等於 " << Car::LtoG(10) << " 加侖" << endl; // 用類別呼叫成員函式 } </code>     #http://140.126.112.33/~sunny/ch8/8_1.htm #http://140.126.112.33/~sunny/ch8/8_2.htm #http://140.126.112.33/~sunny/ch8/8_3.htm #http://140.126.112.33/~sunny/ch8/8_4.htm #http://140.126.112.33/~sunny/ch8/8_5.htm #http://140.126.112.33/~sunny/ch8/8_6.htm #http://140.126.112.33/~sunny/ch8/8_7.htm #http://140.126.112.33/~sunny/ch8/8_8.htm   =建構函式與解構函式 = 建構函式與解構函式_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH9/ch9_index.htm   <code> #include<iostream> using namespace std;   class Time { public: Time(int,int,int); // 只有一個建構函式 void show() { cout << hour << "點" << min << "分" << sec << "秒" << endl; } private: int hour, min, sec; // 代表時分秒的成員 };   Time::Time(int h =12, int m=1, int s=1) { hour = (h>=0 && h<=23) ? h:12; // 檢查 h 是否在 0 至 23 間 min = (m>=0 && m<=59) ? m:0; // 檢查 m 是否在 0 至 59 間 sec = (s>=0 && s<=59) ? s:0; // 檢查 s 是否在 0 至 59 間 }   int main() { Time t1; // 不加參數 Time t2(10); // 一個參數 Time t3(8,24); // 二個參數 Time t4(10,20,30); // 三個參數   t1.show(); t2.show(); t3.show(); t4.show(); } </code>   =動態資料結構 = 動態資料結構是一種結構可隨程式執行過程而變大變小。每個節點都可以是每一個獨立的資料結構區塊。將每一個節點串起來就形成串列鏈(linked list)。不一樣的串列方式形成不一樣的結構,如堆疊、佇列。   <code> 1.請寫出算術及幾和平均的程式。 2.請利用動態配置記憶體空間, 配置空間型別 為 double,配置空間為 sizeof (double)*how_many。how_many, 可由使用者鍵盤輸入的數值個數。 3.輸入預計算算術及幾和平均的數字。 4.配置指定數量的記憶體。 5.計算所有數值的總和及計算所有數值的乘積。 6.輸出算數平均及幾何平均。 7.釋放動態配置的陣列空間。   #include <iostream> #include <cmath> using namespace std;   int main() { int how_many; cout << "請問要計算多少個數字的算術及幾和平均:"; cin >> how_many; double *dptr = new double[how_many]; // 配置指定數量的記憶體   for(int i=0;i<how_many;i++) { cout << "請輸入第 " << (i+1) << " 個數值:"; cin >> *(dptr+i); }   double sum = 0;   for(int i=0;i<how_many;i++) // 計算所有數值的總和 sum += *(dptr+i);   cout << "算數平均為:" << (sum / how_many) << endl; sum = 1;   for(int i=0;i<how_many;i++) // 計算所有數值的乘積 sum *= *(dptr+i);   cout << "幾何平均為:" << pow(sum,1.0/how_many)<< "\n";   delete [] dptr; } </code>   #http://140.126.112.33/~sunny/ch9/9_1.htm #http://140.126.112.33/~sunny/ch9/9_2.htm #http://140.126.112.33/~sunny/ch9/9_3.htm #http://140.126.112.33/~sunny/ch9/9_4.htm     ==物件與類別 == public 稱為存取修飾字 (Access Specifier), 存取修飾字共有 3 個, 分別是:   #public:在此段落中的成員都是公開的成員。若是用 struct 定義類別, 則類別中的成員預設是公開的成員。 #private:在此段落中的成員都是私有的成員。用 class 定義類別時, 則成員預設都是私有的成員。 #protected:在此段落中的成員對外部程式而言屬於私有的成員, 但對繼承的類別而言, 則是公開的成員。   成員函式與一般函式或其他類別中的函式同名並不算多載 (overloading), 因為它們都分屬不同的視野, 所以彼此互不相關, 根本不會形成多載。只有同一個類別內的同名函式, 才會型成多載。   資料成員前面加上 static 關鍵字, 使其成為靜態的資料成員。一般的資料成員是每個物件都有自己的資料成員;但靜態資料成員則是所有同類別的物件共用的, 換言之類別的靜態資料成員在記憶體中只有一份, 每個同類別物件所存取到的靜態資料成員都是相同的, 若有物件更改了靜態資料成員的值, 則所有物件存取到的值也跟著改變。由於這項特性, 靜態資料成員適用於存放類別的共通屬性。     <code> class Car { public: Car() { gas = 10; counter++; } // 將油量設為 10, 計數器加 1 static const int howmany() { return counter; } // 傳回計數器值 private: double gas; // 油量 static double eff; // 靜態成員 static int counter; // 物件計數器 }; </code>   #http://140.126.112.33/~sunny/ch10/10_1.htm #http://140.126.112.33/~sunny/ch10/10_2.htm #http://140.126.112.33/~sunny/ch10/10_3.htm   =繼承與多型 = 運算子多載及字串_sunny老師講解區 http://140.126.112.33/~sunny/EXE/CH10/ch10_index.htm   指標在類別上的應用包括:建立指向物件的指標, 以及在類別中使用指標型別的資料成員, 其中包括一個所有類別都有的 this 指標。   #指向物件的指標 #指標型別的成員 #this 指標   建立指向基本資料型別的指標時, 要存取變數值, 需使用間接存取運算子 *。但建立指向物件的指標時, 要用物件指標存取公開的成員時, 並不需使用間接存取運算子, 但需使用另一個成員存取運算子 "->" (橫線加大於符號) 來存取成員。宣告類別指標變數時, 可用 new 運算子建立新的物件, 讓指標可指向該物件。編譯器會自動在成員函式的參數列最前面加上一個該類別的指標參數, 並以 this 為參數名稱, 然後再將函式定義內所有出現資料成員的部份, 均改成 this->資料成員的形式。   ==運算子多載==   #一般運算子的多載: 在 C++ 中, 運算子也是一種函式, 我們可以用函式的形式來表示運算子, 只要在運算子的符號前面加上一個關鍵字 operator。 #單元運算子: 以簡單的邏輯運算子 ! 為例, 原本指的是 not 的意思, 如果我們自訂的字串類別想提供一個方法判斷物件所含的字串是否為空字串, 我們就可多 載 ! 運算子, 讓它可在字串為空字串時傳回 true, 函式原型如下: #正負號運算子:+、- 運算子除了可當成加減法雙元運算子外, 也可當成單元運算子, 也就是表示數值的正負。而用在非數字性的類別, 則可設計成改變物件狀態或改變資料成員的形式等等 #型別轉換: 以基本型別的加法為例, 由於 C++ 已預先定義好了各基本型別間的轉換方式, 所以只要針對二個相同型別的參數定義加法函式即可。如果是要將類別物件轉型為基本資料型別, 就必須透過多載型別轉換運算子 (type) 來達成, 其中 type 可代換為任何要轉換的型別名稱。型別轉換運算子函式必須為函式成員, 它不接收任何參數, 而且也不必指定傳回值型別, 因為傳回值即是函式名稱所指出的型別。     Ex. ostream& operator<<(ostream& o, Circle& c) // 輸出圓點座標及半徑 { return o << '(' << c.getX() << ',' << c.getY() << ')' << "r = " << c.r; }   <code> ex. 1. 請建立Shape 的類別。 class Shape { public: Shape (int i=0, int j=0) { x = i; y = j; } double getX() { return x;} double getY() { return y;} private: double x, y; };   2. 請建立Rectangle及Circle 類別物件的建構函式,Rectangle 及 Circle 類別都是衍生自 Shape 的類別。 3. 建立Circle c(1,1,2)並輸出此物件;   #include<iostream> using namespace std;   class Shape { public: Shape (int i=0, int j=0) { x = i; y = j; } double getX() { return x;} double getY() { return y;} private: double x, y; // 代表圖形的起點 };   class Circle : public Shape { // 繼承 Shape 的特性 friend ostream& operator<<(ostream& o, Circle& c); public: Circle(int i, int j, int radius): Shape(i,j), r(radius) { } // 在成員初始化串列呼叫父類別的建構函式 private: double r; // 代表圓半徑 };   ostream& operator<<(ostream& o, Circle& c) // 輸出圓點座標及半徑 { return o << '(' << c.getX() << ',' << c.getY() << ')' << endl << "r = " << c.r; }   int main() { Circle c(1,1,2); // 建立 Circle 物件 cout << c; } </code>   #http://140.126.112.33/~sunny/ch11/11_1.htm #http://140.126.112.33/~sunny/ch11/11_2.htm #http://140.126.112.33/~sunny/ch11/11_3.htm
Personal tools