98
第第第 第第第 第第第第第第第第第 第第第第第第第第第

第二章 建立主控台應用程式

  • Upload
    nero

  • View
    42

  • Download
    4

Embed Size (px)

DESCRIPTION

第二章 建立主控台應用程式. 章節目錄 (1). 2-1-1 程式的註解. 2-1-2 前置處理指令. 2-1-3 使用名稱空間. 2-1 程式語言的基本架構. 2-1-4 主程式. 2-1-5 保留字和識別字. 2-1-6 資料的輸入和輸出. 2-2-1 認識程式碼編輯器. 2-2 建立 Visual C++ 第一個專案. 2-2-2 利用命令提示字元執行程式. 2-2-3 以 CLR 編譯 C++ 程式. 2-3-1 基本資料型別. 2-3 資料類型和變數. 2-3-2 變數和常數. 2-3-3 變數的生命週期. - PowerPoint PPT Presentation

Citation preview

Page 1: 第二章 建立主控台應用程式

第二章第二章建立主控台應用程式建立主控台應用程式

Page 2: 第二章 建立主控台應用程式

章節目錄章節目錄 (1)(1)2-1-1 程式的註解2-1-1 程式的註解2-1-2 前置處理指令2-1-2 前置處理指令2-1-3 使用名稱空間2-1-3 使用名稱空間2-1-4 主程式2-1-4 主程式2-1-5 保留字和識別字2-1-5 保留字和識別字2-1-6 資料的輸入和輸出2-1-6 資料的輸入和輸出

2-1 程式語言的基本架構2-1 程式語言的基本架構

2-2 建立 Visual C++ 第一個專案

2-2 建立 Visual C++ 第一個專案

2-2-1 認識程式碼編輯器2-2-1 認識程式碼編輯器2-2-2 利用命令提示字元執行程式2-2-2 利用命令提示字元執行程式2-2-3 以 CLR 編譯 C++ 程式2-2-3 以 CLR 編譯 C++ 程式

2-3-1 基本資料型別2-3-1 基本資料型別2-3-2 變數和常數2-3-2 變數和常數2-3-3 變數的生命週期2-3-3 變數的生命週期

2-3 資料類型和變數2-3 資料類型和變數

Page 3: 第二章 建立主控台應用程式

章節目錄章節目錄 (2)(2)2-4-1 算術運算子2-4-1 算術運算子2-4-2 指派運算子2-4-2 指派運算子2-4-3 關係運算子2-4-3 關係運算子2-4-4 邏輯運算子2-4-4 邏輯運算子2-4-5 遞減和遞減運算子2-4-5 遞減和遞減運算子2-4-6 運算子的優先順序2-4-6 運算子的優先順序

2-4 運算子2-4 運算子

2-5-1 型別自動轉換2-5-1 型別自動轉換2-5-2 強迫型別轉換2-5-2 強迫型別轉換

2-5 型別轉換2-5 型別轉換

Page 4: 第二章 建立主控台應用程式

本章學習目標:本章學習目標:

介紹程式語言的基本架構,包含名稱空間的宣告和標頭檔的引用。

認識識別字和關鍵字。 介紹算術運算子、關係運算子、邏輯運算子和遞增、遞

減運算子。 運算式中資料型別的轉換。

Page 5: 第二章 建立主控台應用程式

2-1 2-1 程式語言的基本結構程式語言的基本結構 對 Visual C++ 2005 Express Edition 版本的工作環境有

了初步認識後,接下來介紹 C/C++ 語言的基本架構。 無論是那一種程式語言,都是由一行行的敘述組成。 在這些敘述中,可以加入變數的宣告,加入條件判斷,

或是執行運算。 一個程式中到底包含那些?我們將為你進一步探討!

Page 6: 第二章 建立主控台應用程式

2-1-1 2-1-1 程式的註解程式的註解我們先透過一個簡易的程式來瞭解基本架構:

表示許解文字

前置處理指令

宣告名稱空間

_tmain() 為主函式

輸出格式

Page 7: 第二章 建立主控台應用程式

程式組成程式組成 由圖 2-1 可以瞭解程式的結構分成好幾個部份:

註解前置處理指令名稱空間_tmain() 主函式輸出格式

除此之外,當然也包含了流程控制、函式和類別等,我們將在後面章節陸續介紹

Page 8: 第二章 建立主控台應用程式

認識程式的註解認識程式的註解 首先,說明程式註解 一個好的程式會在需要的地方加入註解,方便日後的閱讀。例如,我們在程式第一行加入註解來說明程式的名稱和程式的用途。當程式進入編譯程序時,便會忽略此註解,不會導致程式發生錯誤。

一般來說,我們將註解分成單行註解多行講解

Page 9: 第二章 建立主控台應用程式

單行註解單行註解

以兩個斜線「 // 」字元來表示單行註解。 在程式敘述後面加入註解,說明此行敘述的作用 或者直接將註解放在程式碼最前端,如圖 2-1 的第一行

也是一個單行註解。

Page 10: 第二章 建立主控台應用程式

多行註解多行註解若要加強閱讀效果,也可以使用多行註解

多行註解以「 /* 」為開始,再以「 */ 」為結束 使用者可以依據需要加入註解文字 圖 2-1 中,程式碼第 7~9 行就是多行註解文字。

回程式基本架構回程式基本架構

Page 11: 第二章 建立主控台應用程式

2-1-2 2-1-2 前置處理指令前置處理指令 前置處理指令能讓編譯器在執行編譯前,利用指令將相關的檔案內容加入程式碼中一般常見的指令為「 include 」敘述,使用時必須在敘述前端加入「 # 」符號,稱為「前置處理指令」 (Preprocessor directive)

這些引入的檔案通稱為「標頭檔」 (header file) 。Visual C++ 提供了不同作用的標頭檔,在後面的章節還會繼續討論。

Page 12: 第二章 建立主控台應用程式

使用標題檔使用標題檔 有了這樣的概念,再參閱圖 2-1 :

程式碼第 4 行加入的「 iostream 」標頭檔,用來處理資料的輸入或輸出。

然後透過程式碼第 11 、 12 行的 cout 物件來輸出內容。如果沒有引用此標頭檔,編譯時就會顯示錯誤訊息,以下圖 2-2 來說明:

編譯易顯示的錯誤訊息

回程式基本架構回程式基本架構

Page 13: 第二章 建立主控台應用程式

2-1-3 2-1-3 使用名稱空間使用名稱空間 名稱空間的功能是為了讓不同區域的相同名稱不會因為重覆性而產生衝突。

由於 C++ 標準函式庫中提供了不同用途的函式,為了避免程式的函式名稱與標準函式庫的名稱相同, C++ 提供名稱空間,標準函式庫的所有函式都存放在「 std 」這個名稱空間。當我們使用 cout 物件時,必須使用範圍解析運算子「 :: 」來存取,程式碼必須寫成「 std :: cout」。

不過這樣的撰寫方式並不是很方便,因此 C++ 提供 using directive 作法,

因此在程式碼第 5 行加上名稱空間的宣告,如下所示:

Page 14: 第二章 建立主控台應用程式

使用使用 stdstd 名稱空間名稱空間 告知編譯器,目前的函式屬於 std 名稱空間。那麼,程

式碼中就不需要同時標示函式名稱和名稱空間。 如此一來,利用 cout 物件輸出內容時,就能直接撰寫如

下:

若未使用名稱空間,則利用 cout 物件輸出內容時,結果如下:

回程式基本架構回程式基本架構

Page 15: 第二章 建立主控台應用程式

2-1-4 2-1-4 主程式主程式 .. 所有的程式都會有一個執行程式的進入點。 以 C/C++ 語言來說,程式進入點主要是透過 ma

in() 主函式。表示程式執行時會先找出 main() 主函式作為程式的進入點,若程式中沒有 main() 主函式,則會產生錯誤訊息!

對 Visual C++ 2005 來說,則是以 _tmain() 主函式作為程式的進入點。_tmain() 主函式包含函式名稱 _tmain() 和函式主體

(body) 。由「 { 」右大括號為函式的開始,「 } 」左大括號為函式的結束;大括號的內容屬於函式主體,由 { } 包含的敘述稱為區塊( Block)。

Page 16: 第二章 建立主控台應用程式

主程式主程式 .... 一般來說,所有的函式都是由函式名稱和函式主體所構成,當函式主體沒有任何敘述時,表示此函式不會做任何動作。

除了 _tmain() 主函式之外, C/C++原有的 main() 函式也會在後面的範例中繼續使用。

而 Visual C++ 2005 為了處理 Unicode 的問題,也提供 wmain() 主函式,其用法和 main() 相同,會在後面章節做介紹。

Page 17: 第二章 建立主控台應用程式

2-1-5 2-1-5 識別字和關鍵字識別字和關鍵字 在 Visual C++ 2005 中,無論是我們宣告的變數、常數、函式名稱或是類別名稱,通常將這些名稱稱為「識別字」 (identifier) 。

這些識別字必須由英文字母、底線和數字組成。使用這些識別字時必須注意幾件事情:識別字的第一個字元必須由英文字母或是底線符號來做為開頭。例如: myObj 、 _studentName 。

其他的識別字元可由英文字母、阿拉伯數字和底線符號所組成。

識別字的英文字母有大小寫之分,字母和字母之間不能有空白符號。

識別字可區分為使用者自行定義和系統提供,儘可能少用單一底線 _ 或兩個底線 __ 來做為開頭,它通常是C++ 語言關鍵字的範圍。

識別字長度可達 32 個字元,不能使用關鍵字來做為識別字的名稱。

Page 18: 第二章 建立主控台應用程式

關鍵字關鍵字 (keyword).(keyword).除了識別字之外,另一種是關鍵字 (keyword),這在 C/C++語言中有特殊用途,做為程式設計或呼叫使用,下表2-1為一些常用的關鍵字。

abstract _ _asm array auto boolbreak case catch char class

const const_cast continue default delete

do doubledynamic_cas

telse enum

event _ _event except explicit extern

false finally float for friend

delegate gcnew generic goto _ _hook

_ _identifier

ifinline int _

_interface

initonly literallong mutable namespa

ce

interior_ptr new

destructor noinline _ _noop

nullptr operator private property protected

Page 19: 第二章 建立主控台應用程式

關鍵字關鍵字 (keyword)..(keyword)..

在上述關鍵字中,如果是以「 __ 」雙底線為開頭的,通常是系統強制保留。

public _ _raise register return safecastsealed short reinterpret_cast signed static

sizeof static_cast

_ _single_inheritance struct _ _super

switchtemplat

ethis thread throw

true try unsigned typedef typeidtypenam

e union _ _unaligned virtual using

void volatile while

Page 20: 第二章 建立主控台應用程式

2-1-6 2-1-6 資料的輸入和輸出資料的輸入和輸出 一般來說,撰寫的程式要與使用者產生互動時,需要透過介面來提供使用者進行資料的輸入,或是輸出程式的執行結果。輸入裝置包含鍵盤、滑鼠等週邊硬體,以及硬碟中的檔案;

而輸出裝置亦包含螢幕、印表機等硬體和硬碟中的檔案。

Page 21: 第二章 建立主控台應用程式

輸出、輸入敘述輸出、輸入敘述以下範例將示範常用的輸出、輸入敘述:

在 C++ 中處理資料輸入及輸出最常用的方法就是 cin與 cout 物件。後面範例將會使用它們來執行資料的輸出入程序。

Page 22: 第二章 建立主控台應用程式

cincin 物件及物件及 >>>> 運算子:運算子: 無論是 cin 或 cout 物件,在使用前都必須引入「 iostre

am 」標頭檔。cin 是一個類別式的物件,不是指令。使用 cin 必須配合輸入重載運算子「 >> 」來進行,我們稱

之「標準輸入器」。下面程式碼片段說明其用法:

Page 23: 第二章 建立主控台應用程式

使用使用 cincin 物件物件 使用 cin 物件來取得輸入資料時,如果字串中含有空白, cin 物件會停止讀取資料。

為了改善上述情形, cin 物件提供 getline() 成員函式,處理由鍵盤輸入含有空白的字串,直到按下 Enter 鍵,會在字串末端自動加上「 \0 」結束字元。語法如下:

str :使用者輸入的字串。int n :用來設定輸入字串的最大長度。char ch :此參數可省略,用來設定輸入字串的結束字元

Page 24: 第二章 建立主控台應用程式

使用使用 cincin 敘述敘述舉例說明:

Page 25: 第二章 建立主控台應用程式

coutcout 物件及物件及 <<<< 運算子:運算子: 同樣地, cout 也是一個類別式的物件,它配合輸入重載

運算子「 << 」進行輸出的動作,我們稱為「標準輸出器」

此外,還有一個物件「 endl 」,將輸出於螢幕上的資料進行「換行」工作。它的用法與「 \n 」有異曲同工之妙!

Page 26: 第二章 建立主控台應用程式

coutcout 物件程式碼片段物件程式碼片段

以上只說明 C++ 基本架構使用的概念。接下來將會慢慢帶領讀者有更深入瞭解。

Page 27: 第二章 建立主控台應用程式

2-2 2-2 建立建立 Visual C++Visual C++ 第一個專案第一個專案 對於 Visual C++ 2005 的程式結構有了基本概念後,我

們建立一個 Win32 主控台應用程式,執行步驟如下:執行「檔案 /新增 / 專案」指令

點選Win32點選「 Win32 主控台應用程式」

輸入專案名稱「 ShowData 」設定儲存位置

取消此項目的勾選

按「確定」鈕

Page 28: 第二章 建立主控台應用程式

步驟步驟 22 :進入:進入 Win32Win32 應用程式精靈應用程式精靈

按「下一步」鈕

Page 29: 第二章 建立主控台應用程式

步驟步驟 33 :設定應用程式:設定應用程式 對於 Visual C++ 2005 的程式結構有了基本概念後,我

們建立一個 Win32 主控台應用程式,執行步驟如下:

選取「主制台應用程式」

選取「先行編譯標題檔」

按「完成」鈕

Page 30: 第二章 建立主控台應用程式

步驟步驟 44 :專案建置完成的畫面:專案建置完成的畫面

加入文字編輯器工具列

「原始程式檔」資料夾有兩個檔案

程式碼編輯視窗

Page 31: 第二章 建立主控台應用程式

執行步驟說明:執行步驟說明: 步驟 1 :取消「為方案建立目錄」的勾選,只會建立單純的專案。

步驟 2 、 3 :透過 Win32應用程式精靈的引導來完成步驟 4 的畫面。

步驟 4 :除了可以看到方案總管之外,視窗中央是程式碼編輯視窗,而工具列則新加入一個「文字編輯器」。文字編輯器的主要作用是讓我們撰寫程式時,用於註解程式,進行程式碼縮排動作,讓程式增加閱讀性。

Page 32: 第二章 建立主控台應用程式

2-2-1 2-2-1 認識程式碼編輯器認識程式碼編輯器 雖然應用程式精靈幫我們完成了一些程序,但仍需加入

一些程式碼才能讓程式執行 請先將滑鼠移向程式碼編輯視窗,按下滑鼠形成插入點

時,在方案總管視窗上方會顯示一個「程式碼檢視」的按鈕

Page 33: 第二章 建立主控台應用程式

範例:範例: ShowData.cpp(code)ShowData.cpp(code)

Page 34: 第二章 建立主控台應用程式

程式解說程式解說第 4 行:加入處理輸入、輸出資料的 iostream 標頭檔。第 5 行:名稱空間的宣告。第 10 行:「主程式」通常使用 Win32應用程式精靈,選

擇先行編譯標頭檔時,會以 _tmain() 主函式做為程式的進入點。

然後第 11 、 12 行利用 cout 物件來輸出字串內容。

Page 35: 第二章 建立主控台應用程式

建置程式碼建置程式碼 輸入程式碼後,將專案進行編譯的動作,請執行下列步驟:步驟 1 :進行編譯

執行「建置 /建置方案」指令或按 F7按鍵

Page 36: 第二章 建立主控台應用程式

步驟步驟 22 :檢視編譯結果:檢視編譯結果從「輸出」視窗檢視編譯結果

檢視「輸出」視窗表示程式碼沒有任何錯誤

Page 37: 第二章 建立主控台應用程式

步驟步驟 33 ::以「啟動但不偵錯」指令來執行程式。

執行「偵錯 /啟動但不偵錯」指令或按「 Ctrl + F5 」按鍵來啟動程式

Page 38: 第二章 建立主控台應用程式

步驟步驟 44 ::呼叫「命令提示字元」視窗顯示輸出結果如下圖:

Page 39: 第二章 建立主控台應用程式

執行步驟說明:執行步驟說明: 執行「步驟 1 」建置專案過程中,會在此專案底下自動產生一個「 Debug 」資料夾,然後把專案底下的相關檔案進行編譯、連結,然後產生一個「 ShowData.exe 」的執行檔。

然後利用「步驟 2 」輸出視窗來顯示編譯過程,編譯的相關資訊會記錄於「 BuildLog.htm 」檔案中。

Page 40: 第二章 建立主控台應用程式

2-2-2 2-2-2 利用命令提示字元執行程式利用命令提示字元執行程式 我們也能利用 Visual C++ 2005 Express Editio

n撰寫一個簡單的 C++ 程式,其步驟如下:

執行「檔案 /新增 / 檔案」指令

Page 41: 第二章 建立主控台應用程式

步驟步驟 22 :新增:新增 C++C++ 檔案檔案

選取「 Visual C++ 」

選取「 C++檔」 按「開啟」鈕

Page 42: 第二章 建立主控台應用程式

程式碼:程式碼: Ch02\Native\data.cppCh02\Native\data.cpp

程式碼非常簡短,利用 Visual C++ 2005 來建立一個 data.cpp 檔案,利用 C/C++原有的 main() 主函式來做為程式進入點。

此處並沒有加入名稱空間,直接以「 std :: cout 」來做為輸出內容。

完成上述動作後,我們在程式碼編輯視窗輸入下列程式碼:

Page 43: 第二章 建立主控台應用程式

儲存檔案儲存檔案我們將程式碼進行儲存,其步驟如下所示:

儲存於「 Native 」資料夾

檔名「 data.cpp 」 按「儲存」鈕

Page 44: 第二章 建立主控台應用程式

編譯程式編譯程式 完成檔案的儲存後,編譯 data.cpp 檔案須利用「命令提

示字元」視窗來進行。 首先,啟動命令提示字元視窗,請按下「開始」功能鍵,

執行「所有程式」→「 Visual C++ 2005 Express Edition 」→「 Visual Studio Tools 」→「 Visual Studio 2005 命令提示字元」,接著在「命令提示字元」執行以下動作:

輸入編譯「 cl/EHsc data.cpp 」命令

執行檔案「 data.exe 」

如果沒有任何錯誤會輸出這兩個檔案

輸出結果

Page 45: 第二章 建立主控台應用程式

程式編譯後程式編譯後 data.cpp 檔案經過編譯後,若無任何錯誤,會產生 dat

a.obj目的檔和 data.exe 執行檔。只要輸入「 data 」就會執行檔案並輸出結果。

Page 46: 第二章 建立主控台應用程式

cl/EHsccl/EHsc 編譯指令編譯指令 .... 圖 2-4 中的第一行命令『 cl/EHsc data.cpp』是用來編譯程式碼,語法為:

cl : cl.exe 是編譯命令,為 C/C++ 的編譯器和連結器,它只能在 Windows 2000 、 Windows XP 和 Windows Server 2003 作業系統上執行。

option :表示選項命令,使用時必須加入斜線「 / 」字元,例如「 /EHsc 」是編譯時加入的選項命令,使用時英文字母有大小寫之分。

file :為欲編譯的原始程式碼,此處是「 data.cpp 」檔案。

Page 47: 第二章 建立主控台應用程式

Cl/EHscCl/EHsc 編譯指令編譯指令 .... 一般來說,編譯時比較好的作法是加入例外處理動作。因此,「 EH 」即是處理例外狀況模型『 sc』參數是產生例外狀況時讓編譯器回傳錯誤訊息

在「命令提示字元」視窗下進行程式碼的編譯時,都會以「 cl/EHsc 」來執行 ( 有關例外處理,我們以後面的章節來介紹說明 ) 。

Page 48: 第二章 建立主控台應用程式

2-2-3 2-2-3 以以 CLRCLR 編譯編譯 C++C++ 程式程式 在範例 data.ccp 中,程式碼撰寫都是利用 Visual C++ 2

005 Express 來進行! 如果只是很單純的檔案,也可以直接呼叫「記事本」來撰寫,並將程式碼以 CLR 編譯器來進行編譯!執行下列步驟:

切換到「 NETprg 」目錄啟動記事本撰寫程式

Page 49: 第二章 建立主控台應用程式

步驟步驟 22 :開啟記事本:開啟記事本

開啟記事本軟體

按「是」按鈕

Page 50: 第二章 建立主控台應用程式

程式碼:程式碼: CH02\NETprog\data2.cppCH02\NETprog\data2.cpp

我們故意在程式碼第 4 行最後不加入結束的「 ; 」分號符號。接著儲存程式碼,執行「檔案 /儲存檔案」指令

再切換到「 Visual Studio 2005 命令提示字元」視窗。

Page 51: 第二章 建立主控台應用程式

執行程式執行程式 (( 錯誤!錯誤! ))

我們利用 CLR 編譯器來編譯程式。 由上圖 2-5得知,命令「 cl/clr data2.cpp 」是把檔案編

譯成「列管程式碼」,透過 clr 命令來編譯 data2.cpp 檔案。

由於程式碼有錯誤,編譯器會指出在程式碼第 6 行之前產生錯誤訊息!重新將程式碼修正後並進行儲存。

輸入「 cl/clr data2.cpp 」編譯命令

顯示錯誤訊息

Page 52: 第二章 建立主控台應用程式

執行程式執行程式 (( 正確正確 ))

當我們將 data.cpp 以「 cl 」命令進行編譯,只會產生 data.obj 和 data.exe二個檔案。

重新以「 cl/clr data2.cpp 」來編譯

執行檔案

輸出執行結果

Page 53: 第二章 建立主控台應用程式

CLRCLR 編譯器的不同編譯器的不同 ..如果透過「 clr 」編譯器會產生那些檔案,執行結果如下圖:

多了「 data2.exe.mainfest 」檔案

以「 dir 」命令列出所有檔案

Page 54: 第二章 建立主控台應用程式

CLRCLR 編譯器的不同編譯器的不同 .... 由圖 2-6 可以清楚看到,除了有「 data2.obj 」和「 data2.exe 」檔案之外,還有一個「資料清單」 (manifest) 檔案它是一個中繼資料,用來記錄組件的相關訊息如果我們使用記事本來打開它,會發現它是以 XML 標籤來組成檔案內容

Page 55: 第二章 建立主控台應用程式

2-3 2-3 資料類型和變數資料類型和變數 當我們要透過程式來對資料進行處理時,必須取得記憶體空間。

無論是資料的大小和種類都會影響記憶體配置和空間大小。

為了有效控管記憶體空間,對於資料的處理,會以變數、常數和資料型別處理。

Page 56: 第二章 建立主控台應用程式

2-3-1 2-3-1 基本資料型別基本資料型別 資料型別會影響記憶體空間的大小。 對於 Visual C++ 2005 來說,資料型別有二種:

基本資料型別延伸資料型別

基本資料型別,包含三種integralfloatingvoid

Page 57: 第二章 建立主控台應用程式

integral--integral-- 整數型別整數型別 integral 用來宣告不具小數點的整數數值

例如 12 、 3658 、 27… 等 其長度會依照作業系統環境而有所不同。

在 16位元的作業環境中(如 MS-DOS及Windows 3.1)其長度為 2 個位元組;

而在 32位元的作業環境(如 Windows 98)中,其長度就變成 4 個位元組。

為了要增加或降低變數的精確度和佔用的記憶體空間,可以加入 signed( 有號數 ) 和 unsigned( 無號數 ) 。

Page 58: 第二章 建立主控台應用程式

整數型別的種類整數型別的種類 (( 表表 2-2)2-2)

備註中的 __int 8 、 __int 16 、 __int 32 為 CLI所定義的資料型別

型別名稱 儲存空間 存取範圍 備註char 1 byte -128 至 +127 _ _int8

unsigned char 1 byte 0 ~ 255

bool 1 byte 回傳 true 或 falseshort 2

bytes

-32,768 至 +32,767 _ _int16

short int 2 byte

s

-32,768 至 +32,767 _ _int16

unsigned short

2 byte

s

0 ~ 65,535

int 4 byte

s

–2,147,483,648 至 +2,147,483,647

_ _int32

unsigned int 4 byte

s

0 ~ 4,294,967,295

long 4 byte

s

–2,147,483,648 至 +2,147,483,647

long long8 byte

s

-9,223,372,036,854,775,808 至 +9,223,372,036,854,775,808

_ _int64

unsigned long long

8 byte

s

0 ~ 18,446,744,073,709,551,615

_ _int64

Page 59: 第二章 建立主控台應用程式

Floating--Floating-- 浮點數型別浮點數型別 floating 型別包含 float 、 double 和 long dou

ble三種,用來宣告具小數點之實數數值型態,例如 5.23 、 0.3478… 等,其長度為 4 個位元組。透過下表 2-3 說明 floating 型別的儲存範圍。

型別名稱 儲存空間 存取範圍 有效位數float 4 bytes -3.4×10-38 ~

3.4×10387 位數

double 8bytes -1.7×10-308 ~ 1.7×10308

15 位數

long double

10 bytes 表 2-3 浮點數型別表 2-3 浮點數型別

Page 60: 第二章 建立主控台應用程式

void--void-- 無值無值 表示使用的 main() 主函式或是其他的函式無需回傳任何資料型別的值。

Page 61: 第二章 建立主控台應用程式

2-3-2 2-3-2 變數和常數變數和常數 對於 Visual C++ 2005 的基本資料型態有了初步認識後,

要進一步探討變數 有時程式碼是避免不了運算,運算後的結果該如何處理? 簡單來講,就是透過宣告的「變數」而儲存於記憶體中

Page 62: 第二章 建立主控台應用程式

宣告變數宣告變數 所謂「變數」 (variable) 就是資料內容會隨著處理過程而改變。

變數名稱也是識別字的一種,宣告時必須遵守識別字命名的規範。

宣告的語法如下:

資料型別代表記憶體空間大小,利用變數名稱來分配記憶體空間。

Page 63: 第二章 建立主控台應用程式

變數的程式碼片段變數的程式碼片段在程式碼如何加入變數的宣告,程式碼片段如下:

我們可以依據需求,將變數進行連續宣告,變數與變數之間須以「 , 」來隔開,或者在宣告變數的同時給予起始值的設定。

Page 64: 第二章 建立主控台應用程式

範例:範例: total.cpptotal.cpp如何取得輸入的設定值?還記得介紹程式語言的基本結構時所提及的 cin 物件,利用它來讀取輸入的變數值!我們利用下面範例來說明。

Page 65: 第二章 建立主控台應用程式

執行程式執行程式

執行「 cl/EHsc total.cpp 」命令來進行檔案的編譯

輸入「 total 」來執行檔案

輸入欲計算的分數

計算後的三科總分

Page 66: 第二章 建立主控台應用程式

程式解說程式解說 第 7 行:主程式 main() 宣告 3 個變數: math 、 eng 和

chinese 。 第 9 行:利用 cin 物件來讀取從螢幕輸入的變數值,並分

別儲存在所宣告的變數。 第 10 行:將這些變數相加並儲存於 total 變數中。 第 11 行:利用 cout 物件輸出結果。

Page 67: 第二章 建立主控台應用程式

宣告常數宣告常數 相對於變數,常數表示的不變的值。 宣告常數時有二種方式:

第一種必須加入「 const 」修飾詞;另一種則是利用前端處理指令「 #define 」。

使用【 const】的語法:

Page 68: 第二章 建立主控台應用程式

範例:範例: radius.cppradius.cpp程式碼中如果設定的值不希望被改變時,透過 const修飾詞來宣告常數是一個比較好的方式。我們以下面範例來說明: )

Page 69: 第二章 建立主控台應用程式

執行程式執行程式

執行「 cl/EHsc radius.cpp 」命令來進行檔案的編譯

輸入「 radius 」命令來執行檔案計算圓面積的結果

Page 70: 第二章 建立主控台應用程式

程式解說程式解說 在 8 行:宣告圓周率 PI 為常數,用來計算圓面積時防止被改變。

第 10 行:進行圓面積的計算 第 11 行:輸出結果! 若圓周率的值並不需要如此精確時,只要去修改第 8 行的常數值為「 PI = 3.14 」,讓程式重新去計算即可!

如果未以常數來處理,我們就得花費時間去搜尋程式碼中那些敘述使用了圓周率,然後一一更正,有時反而更容易造成計算上的錯誤!

另外,大家有無發現,為什麼計算出來的圓面積是一個整數?這個問題我們留到章節 2-5 型別轉換來討論!

Page 71: 第二章 建立主控台應用程式

以以 definedefine 定義常數定義常數另一個定義常數的方法是使用前端處理指令「 #define 」,語法為:

Page 72: 第二章 建立主控台應用程式

範例:範例: radius2.cppradius2.cpp如果我們將上一個範例更改為「 #define 」宣告,使用方式如下:

第 5 行:以「 #define 」來宣告常數,其他的程式內容並沒有改變!

Page 73: 第二章 建立主控台應用程式

2-3-3 2-3-3 變數的生命週期變數的生命週期 一般來說,變數會因為宣告的位置不同,其「有效範圍」和「生命週期」也會隨之不同。

在 C++ 中我們會以「 { } 」來表示某一段敘述是屬於某個區塊 (block)範圍。同樣地,在 main() 主函式區塊中宣告的變數,它的有效範圍 (scope)只限於主程式中。

瞭解變數的有效範圍後,才能宣告變數,設定變數值,進行運算。

當我們執行程式時,所有變數的生命週期都是有限的。宣告變數時,表示生命的開始;它可能在某個區塊的敘述中結束,或是直到程式終結才會停止。

我們將變數的生命週期依據它的有效範圍來分成「區域變數」 (Local Variable) 、全域 (globe) 變數 (請參考 6-2-1 節 ) 。

Page 74: 第二章 建立主控台應用程式

2-4 2-4 運算子運算子 無論是那一種程式語言都會有運算式,組成運算式的元素包含運算元 (operand) 和運算子 (operator) 。「運算元」是被運算子處理的資料,包含變數、常數值等;

「運算子」指的是運用一些數學符號,例如+ ( 加 ) 、- ( 減 ) 、 *(乘 ) 、 /( 除 ) 等。

運算子會針對特定的運算元進行處理程序。

Page 75: 第二章 建立主控台應用程式

運算子運算子 運算式計算的過程,如果只有一個運算元,稱為「一元運算子」,例如「 ++i 」;

如果有兩個運算元,稱為「二元運算子」,例如「 A+2 」運算式中,字元 A與數字 2 都是運算元,「 + 」則是運算子。

Visual C++ 2005 提供運算子包含:算術運算子 (Arithmetic Operator)指派運算子 (Assignment Operator)關係運算子 (Relational Operator)邏輯運算子 (Boolean Logical Operator)遞增和遞減運算子 (Increment & Decrement Opera

tor)

Page 76: 第二章 建立主控台應用程式

2-4-1 2-4-1 算術運算子算術運算子 算術運算子主要是用來做為變數間的數學運算,使用

的算術運算子整理如下表 2-4 :

運算子 用法 範例+ 加 op1 + op2

- 減 op1 – op2

* 乘 op1 * op2

/ 除 op1 / op2

% 餘數 op1 % op2

表 2-4 算術運算子表 2-4 算術運算子

Page 77: 第二章 建立主控台應用程式

2-4-2 2-4-2 指派運算子指派運算子 如果運算式是這樣敘述:

表示要將等號右邊的兩個運算元相加後再指派給等號左邊的 op1 運算元,可以簡化為:

利用指派運算子簡化運算式的作法,我們以下表 2-5 來表示其用法:

運算子 原有運算式 簡化+= op1 =op1 + 15 op1 += 15

-= op1 =op1 - 15 op1 -= 15

*= op1 = op1 * 15 op1 *= 15

/= op1 = op1 / 15 op1 /= 15

%= op1 =op1 % 15 op1 %= 15

Page 78: 第二章 建立主控台應用程式

2-4-3 2-4-3 關係運算子關係運算子 「關係運算子」亦稱為「比較運算子」,主要應用於條件判斷,用來比較運算子左右兩邊運算元的關係。關係運算子必須使用二元運算,比較後會傳回 true或 false 的布林 (Boolean)值。

有那些關係運算子,我們整理出下表 2-6 :

運算子 名稱 用法 op1=10, op2=20 的比較結果

== 等於 op1 == op2

false

> 大於 op1 > op2 false

>= 大於或等於 op1 >= op2

false

< 小於 op1 < op2 true

<= 小於或等於 op1 <= op2

true

!= 不等於 op1 != op2

true

Page 79: 第二章 建立主控台應用程式

範例:範例: relaop.cpprelaop.cpp說明關係運算子

Page 80: 第二章 建立主控台應用程式

執行程式執行程式

Page 81: 第二章 建立主控台應用程式

程式說明程式說明 第 8 行:宣告兩個變數,並分別設定起始值。 第 10~12 行將這兩個變數以關係運算子來做比較,並傳回 true 或 false 結果。我們會發現只輸出 0或 1 的結果。對 C++而言,變數要以布林值輸出時,預設會以 0 表示為 false ,以 1 表示為 true 。

第 15 行:為了能輸出 true 或 false 字串,加入boolalpha() 函式。

第 16~18 行:以 true 或 false 字串來輸出。 boolalpha() 函式語法如下:

_Str 是一個 iostream 的物件!在此範例中則直接呼叫 boolalpha 來使用。

Page 82: 第二章 建立主控台應用程式

2-4-4 2-4-4 邏輯運算子邏輯運算子 邏輯運算子主要也是應用於條件判斷。

邏輯運算子的運算結果也會以布林值回傳。當兩項變數做邏輯運算時,若條件成立則傳回 true; 若不成立則傳回 false 。我們以下表 2-7 來說明邏輯運算子的用法:運算子 用法 op1

值op2

值傳回值 說明

&&( 且

)op1 &&

op2

true true true

當 op1 、 op2 的值均為真,所得結果為真

true false false

false false false

false true false

||( 或 ) op1 || op2

true true true

只要 op1 、 op2 其中一個為真,所得結果會為真

true false true

false true true

false false false

! !op1true false 當 op1 為真,所得結果為

假false true

Page 83: 第二章 建立主控台應用程式

2-4-5 2-4-5 遞增、遞減運算子遞增、遞減運算子 在程式碼中使用的 ++( 遞增 ) 和 --( 遞減 ) 運算子都是屬於一元運算子,讓目前的變數值加 1 或減 1 。如果將運算子放在運算元之前,稱為「前序」 (prefi

x);反之,將運算子放在運算元之後,稱為「後序」 (pos

tfix) ,以下表 2-8 說明。運算 表示法 說明

前序 ++op1 op1 會先自行加入,再與其他運算元運算

後序 op1-- op1 會與其他運算元做運算,再自行減 1

Page 84: 第二章 建立主控台應用程式

範例:範例: prefix.cppprefix.cpp我們以下面範例來說明前序和後序的使用。

Page 85: 第二章 建立主控台應用程式

執行程式執行程式

第 8 行:宣告 opr1 和 opr2 兩個變數,並設定起始值。 第 9 行:執行前序運算,表示 opr1 會自行加入,得到 1

1 ,再與 opr2 相加,其結果儲存於 result 變數中。 第 11 行:輸出結果為 19 。 第 13 行必須將 opr1 的變數值重新設定。第 14 行進行

後序運算, opr1 會先與 opr2 相加得到 18 ,然後 opr1本身再加 1 。

第 15 行:輸出的 opr1 還是 1 。第 16 行: result只得18 。

因此無論是使用「前序」或「後序」,對於 opr1 來說,其值都會加 1 。 result則會受到「前序」或「後序」而影響計算結果。

Page 86: 第二章 建立主控台應用程式

2-4-6 2-4-6 運算子的優先順序運算子的優先順序不同的運算子在計算時,依其運算優先順序可以下表 2-9 來執行:

優先順序 運算子 運算順序1 ::( 範圍解析運算子 )2 .( 成員存取運算子 ) 、– >( 取值運算子 ) 、 [ ] 、 ( ) 、

++ 、––、 typeid( )由左而右

3 sizeof 、 ~ 、 ! 、– ( 正 ) 、 +( 負 ) 、 new 、 delete()

由右而左

4 *( 乘 ) 、 /( 除 ) 、 %( 取餘數 ) 由左而右5 +( 加 ) 、 -( 減 ) 由左而右6 <<( 左移 ) 、 >>( 右移 ) 由左而右7 ==( 相等 ) 、 !=( 不相等 ) 由左而右8 &&( 且 ) 由左而右9 ||( 或 ) 由左而右

10 ? :( 條件運算子 ) 由右而左11 = 、 *= 、 /= 、 %= 、 += 、– = 、 <<= 、 >>= 、 &= 、

|= 、 ^=由右而左

12 , 由左而右

Page 87: 第二章 建立主控台應用程式

2-5 2-5 型別轉換型別轉換 在運算式中倘若兩個資料型別不同的數值要一起運算,

除非是使用強迫資料轉換,要不然 C++ 會以「自動型別轉換」 (Automatic Type Conversion) ,將資料型別轉換一致後再進行運算。

那麼同一個運算式中的不同資料型別,編譯器會如何進行型別轉換 ?其轉換的順序我們以圖 2-7 來說明:

Page 88: 第二章 建立主控台應用程式

型別轉換順序型別轉換順序 轉換型別時,如果是由低階的型別轉換成高階型別並不

會發生問題。 如果是由高階型別轉換成低階型別時,由於記憶體空間縮小,有可能降低資料本身的精確度,倘若資料空間太小也會形成資料錯誤!這是我們在進行資料轉換時必須特別注意的地方。

Page 89: 第二章 建立主控台應用程式

2-5-1 2-5-1 型別自動轉換型別自動轉換 運算式中有不同的資料型別,通常會以高階型別為轉換

依據; 也就是說,編譯器會先找尋是否有 double 型別,然後是

float 型別,才是 long 型別,最後是 int 型別。請開啟原有範例「 radius.cpp 」。

Page 90: 第二章 建立主控台應用程式

程式解說程式解說 因為在第 2 行已將 area 變數宣告為整數,即使第 3 行的運算式 (PI*radius*radius)計算過程中已自動轉換為 float(因為是變數中的最高階 ) ,但是卻把結果儲存為 int 型別的 area 變數中,因此我們會得到的圓面積是「 201 」整數。

這表示運算後的資料由高階 float 再轉換成低階的 int ,會讓資料失去精確度!

那麼要如何改善這樣的情形?只要把 area 變數宣告為 float 型別,問題就能迎刃而解。

Page 91: 第二章 建立主控台應用程式

修改範例:修改範例: radius.cppradius.cpp 部份程式碼部份程式碼

Page 92: 第二章 建立主控台應用程式

執行程式執行程式

第 8 行: area 變數宣告為 float 時,計算的結果就會不一樣。

Page 93: 第二章 建立主控台應用程式

2-5-2 2-5-2 強迫型別轉換強迫型別轉換 我們也可以在運算式中加入指定的型別,讓運算式依據指定方式來轉換。強迫型別轉換的語法:

Page 94: 第二章 建立主控台應用程式

範例:範例: conver.cppconver.cpp我們利用一個簡易溫度轉換範例來說明強迫型別轉換的作法

Page 95: 第二章 建立主控台應用程式

執行程式執行程式

第 8 行:將攝氏溫度變數宣告為 int 型別 第 11 行:轉換溫度時,才將攝氏溫度轉換為 flo

at 型別。

Page 96: 第二章 建立主控台應用程式

重點整理重點整理 .. 一個 C++ 程式的基本結構包含:註解、前置處理指令、

名稱空間、主函式和輸出格式。 程式中的註解是為了增加程式的閱讀性,依據用法可分

為單行註解和多行註解。 include 是一個前置處理指令,使用時必須在最前端加上

# 符號,會在程式編譯前將不同作用的標頭檔引入。 <iostream> 是一個用來處理輸入 / 輸出資料流的標頭檔,

利用 cin 物件配合 >> 運算子來讀取輸入的資料;透過 cout 物件配合 << 運算子將結果輸出於螢幕上。

名稱空間是為了讓標準函式庫提供的函式和使用者自訂的函式同名稱時也能使用。 C++所有函式都存放在「 std 」這個名稱空間。

Page 97: 第二章 建立主控台應用程式

重點整理重點整理 .... 主程式 main()為程式的進入點,使用時必須加上 {}

來建立區塊範圍。此外 Visual C++ 2005 也提供了 _tmain()和處理 Unicode 的 wmain()主程式。

識別字可用來宣告變數、常數、函式或是類別的名稱。宣告時第一個字元必須是英文字母或是 _ 底線符號;其他的字元可由英文字母、數字和底線符號所組成。

建立主控台應用程式,如果是以專案方式建立,可選擇「建置」來編譯、連結程式,利用「啟動但不偵錯」方式來執行檔案。

建立主控台應用程式如果只是一個單純的檔案,可呼叫「命令字元提示」視窗,利用『 cl/EHsc 檔名 .cpp』進行檔案的編譯、連結,然後執行檔案,也能獲得執行結果。

Page 98: 第二章 建立主控台應用程式

重點整理…重點整理… 變數的宣告是為了取得記憶體空間,空間大小由資料型

別來決定。宣告時也能進行起始值的設定,以確保記憶體空間的運作。

變數指的是會變動的資料;常數則是不會改變的數值,可利用 const 關鍵字或是以 #define 前置處理指令來替換。

基本資料型別包含整數型別 ( 不合小數 ) 、浮點數型別和和無需回傳值的 void 型別。

運算式由運算元和運算子所組成,包含算術、指定、關係、邏輯和遞增、遞減運算子。

基本資料型別可以進行型別轉換,「自動型別轉換」是以運算式中高階型別為轉換依據。而「強迫型別轉換」則是在運算式中指定轉換的型別。