編寫簡(jiǎn)單的C++程序_第1頁
編寫簡(jiǎn)單的C++程序_第2頁
編寫簡(jiǎn)單的C++程序_第3頁
編寫簡(jiǎn)單的C++程序_第4頁
編寫簡(jiǎn)單的C++程序_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1.1 編寫簡(jiǎn)單的C+程序本章介紹C+的大局部根本要素:內(nèi)置類型、庫類型、類類型、變量、表達(dá)式、語句和函數(shù)。在這一過程中還會(huì)簡(jiǎn)要說明如何編譯和運(yùn)行程序。讀者讀完本章內(nèi)容并做完練習(xí),就應(yīng)該可以編寫、編譯和執(zhí)行簡(jiǎn)單的程序。后面的章節(jié)會(huì)進(jìn)一步說明本章所介紹的主題。要學(xué)會(huì)一門新的程序設(shè)計(jì)語言,必須編寫程序。在這一章,我們將編寫程序解決一個(gè)簡(jiǎn)單的數(shù)據(jù)處理問題:某書店以文件形式保存其每一筆交易。每一筆交易記錄一本特定的書的銷售情況,含有ISBN國(guó)際標(biāo)準(zhǔn)書號(hào),世界上每種書籍的唯一標(biāo)識(shí)符、銷售冊(cè)數(shù)和銷售單價(jià)。每一筆交易形如:編寫簡(jiǎn)單的C+程序11.1 編寫簡(jiǎn)單的C+程序本章介紹C+的大局部根本要素:內(nèi)置類型、

2、庫類型、類類型、變量、表達(dá)式、語句和函數(shù)。在這一過程中還會(huì)簡(jiǎn)要說明如何編譯和運(yùn)行程序。讀者讀完本章內(nèi)容并做完練習(xí),就應(yīng)該可以編寫、編譯和執(zhí)行簡(jiǎn)單的程序。后面的章節(jié)會(huì)進(jìn)一步說明瘟畜黍恐冀吁古特商厚正芽珊狼份晝因危冪謄瓷奸辜號(hào)奢高磅族奈鼓曼具江泵赦楚誣脫失陳埃險(xiǎn)兩望育蘑攬樊廁蓮乎矽糯閱短詞框舊諷福困棉法粕0-201-70353-X 4 24.99第一個(gè)元素是ISBN,第二個(gè)元素是銷售的冊(cè)數(shù),最后是銷售單價(jià)。店主定期地查看這個(gè)文件,統(tǒng)計(jì)每本書的銷售冊(cè)數(shù)、總銷售收入以及平均售價(jià)。我們要編寫程序來進(jìn)行這些計(jì)算。在編寫這個(gè)程序之前,必須知道C+的一些根本特征。至少我們要知道怎么樣去編寫、編譯和執(zhí)行簡(jiǎn)單的程

3、序。這個(gè)程序要做什么呢?雖然還沒有設(shè)計(jì)出解決方案,但是我們知道程序必須: 定義變量。 實(shí)現(xiàn)輸入和輸出。 定義數(shù)據(jù)結(jié)構(gòu)來保存要處理的數(shù)據(jù)。 測(cè)試是否不同的記錄含有相同的ISBN。 編寫循環(huán),處理交易文件中的每一條記錄。我們將首先考察C+的這些局部,然后編寫書店問題的解決方案。1.1 編寫簡(jiǎn)單的C+程序每個(gè)C+程序都包含一個(gè)或多個(gè)函數(shù),而且必須有一個(gè)命名為main。函數(shù)由執(zhí)行函數(shù)功能的語句序列組成。操作系統(tǒng)通過調(diào)用main函數(shù)來執(zhí)行程序,main函數(shù)那么執(zhí)行它的組成語句并返回一個(gè)值給操作系統(tǒng)。下面是一個(gè)簡(jiǎn)單的main函數(shù),它不執(zhí)行任何功能但是返回一個(gè)值:int main() return 0;操作

4、系統(tǒng)通過main函數(shù)返回的值確定程序是否成功執(zhí)行完畢。返回0值說明程序成功執(zhí)行完畢。main函數(shù)在很多方面都比擬特別,其中最重要的是每個(gè)C+程序必須含有main函數(shù),且main函數(shù)是唯一被操作系統(tǒng)顯式調(diào)用的函數(shù)。定義main函數(shù)和定義其他函數(shù)一樣。定義函數(shù)必須指定四個(gè)元素:返回類型、函數(shù)名、圓括號(hào)內(nèi)的形參表可能為空和函數(shù)體。main函數(shù)只能有一組受限的形參。本例中定義的main函數(shù)形參表為空。節(jié)將介紹main函數(shù)中可以定義的其他形參。main函數(shù)的返回值必須是int型,該類型表示整數(shù)。int類型是內(nèi)置類型,即該類型是由C+語言定義的。函數(shù)體是函數(shù)定義的最后局部,是以花括號(hào)開始并以花括號(hào)結(jié)束的語

5、句塊: return 0;例中唯一的語句就是return,該語句終止函數(shù)。注意return語句后面的分號(hào)。在C+中多數(shù)語句以分號(hào)作為結(jié)束標(biāo)記。分號(hào)很容易被忽略,漏寫分號(hào)將會(huì)導(dǎo)致莫名其妙的編譯錯(cuò)誤信息。當(dāng)return帶上一個(gè)值,如0,這個(gè)值就是函數(shù)的返回值。返回值類型必須和函數(shù)的返回類型相同,或者可以轉(zhuǎn)換成函數(shù)的返回類型。對(duì)于main函數(shù),返回類型必須是int型,0是int型的。在大多數(shù)系統(tǒng)中,main函數(shù)的返回值是一個(gè)狀態(tài)指示器。返回值0往往表示main函數(shù)成功執(zhí)行完畢。任何其他非零的返回值都有操作系統(tǒng)定義的含義。通常非零返回值說明有錯(cuò)誤出現(xiàn)。每一種操作系統(tǒng)都有自己的方式告訴用戶main函數(shù)返

6、回什么內(nèi)容。1.1.1 編譯與執(zhí)行程序程序編寫完后需要進(jìn)行編譯。如何進(jìn)行編譯,依賴于操作系統(tǒng)和編譯器。你需要查看有關(guān)參考手冊(cè)或者詢問在行的同事,以了解你所用的編譯器的工作細(xì)節(jié)。許多基于PC的編譯器都在集成開發(fā)環(huán)境IDE中運(yùn)行,IDE將編譯器與相關(guān)的構(gòu)建和分析工具綁定在一起。這些環(huán)境在開發(fā)復(fù)雜程序時(shí)非常有用,但掌握起來需要花費(fèi)一點(diǎn)時(shí)間。通常這些環(huán)境包含點(diǎn)擊式界面,程序員在此界面下可以編寫程序,并使用各種菜單來編譯并執(zhí)行程序。本書不介紹怎樣使用這些環(huán)境。大多數(shù)編譯器,包括那些來自IDE的,都提供了命令行接口。除非你已經(jīng)很熟悉你的IDE,否那么從使用簡(jiǎn)單的命令行接口開始可能更容易些。這樣可以防止在學(xué)

7、習(xí)語言之前得先去學(xué)習(xí)IDE。1. 程序源文件命名標(biāo)準(zhǔn)不管我們使用命令行接口還是IDE,大多數(shù)編譯器希望待編譯的程序保存在文件中。程序文件稱作源文件source file。大多數(shù)系統(tǒng)中,源文件的名字由兩局部組成:文件名如prog1和文件后綴。依據(jù)慣例,文件后綴說明該文件是程序。文件后綴通常也說明程序是用什么語言編寫的,以及選擇哪一種編譯器運(yùn)行。我們用來編譯本書實(shí)例的系統(tǒng)將帶有后綴.cc的文件視為C+程序,因此我們將該程序保存為:prog1.ccC+程序文件的后綴依賴于你所運(yùn)行的編譯器,其他的形式還包括:prog1.cxxprog1.cppprog1.cpprog1.C調(diào)用GNU或微軟編譯器 調(diào)用

8、C+編譯器的命令因編譯器和操作系統(tǒng)的不同而不同,常用的編譯器是GNU編譯器和微軟Visual Studio編譯器。調(diào)用GNU編譯器的默認(rèn)命令是g+:$ g+ prog1.cc o prog1這里的$是系統(tǒng)提示符。這個(gè)命令產(chǎn)生一個(gè)名為prog1或prog1.exe的可執(zhí)行文件。在UNIX系統(tǒng)下,可執(zhí)行文件沒有后綴;而在Windows下,后綴為.exe。-o prog1是編譯器參數(shù)以及用來存放可執(zhí)行文件的文件名。如果省略-o prog1,那么編譯器在UNIX系統(tǒng)下產(chǎn)生名為a.out而在Windows下產(chǎn)生名為a.exe的可執(zhí)行文件。微軟編譯器采用命令cl來調(diào)用:C:directory cl GX

9、prog1.cpp這里的C:directory是系統(tǒng)提示符,directory是當(dāng)前目錄名。cl是調(diào)用編譯器的命令,-GX是一個(gè)選項(xiàng),該選項(xiàng)在使用命令行接口編譯程序時(shí)是必需的。微軟編譯器自動(dòng)產(chǎn)生與源文件同名的可執(zhí)行文件,這個(gè)可執(zhí)行文件具有.exe后綴且與源文件同名。本例中,可執(zhí)行文件命名為prog1.exe。更多的信息請(qǐng)參考你的編譯器用戶指南。2. 從命令行運(yùn)行編譯器如果使用命令行接口,一般在控制臺(tái)窗口例如UNIX的shell窗口或Windows的命令提示窗口編譯程序。假設(shè)main程序在名為prog1.cc的文件中,可以使用如下命令來編譯:$ CC prog1.cc這里CC是編譯器命令名,$表

10、示系統(tǒng)提示符。編譯器輸出一個(gè)可執(zhí)行文件,我們可以按名調(diào)用這個(gè)可執(zhí)行文件。在我們的系統(tǒng)中,編譯器產(chǎn)生一個(gè)名為a.exe的可執(zhí)行文件。UNIX編譯器那么會(huì)將可執(zhí)行文件放到一個(gè)名為a.out的文件中。要運(yùn)行可執(zhí)行文件,可在命令行提示符處給出該文件名:$ a .exe執(zhí)行編譯過的程序。在UNIX系統(tǒng)中,即使在當(dāng)前目錄,有時(shí)還必須指定文件所在的目錄。這種情況下,鍵入:$ ./a.exe“.后面的斜杠說明文件處于當(dāng)前目錄下。訪問main函數(shù)的返回值的方式和系統(tǒng)有關(guān)。不管UNIX還是Windows系統(tǒng),執(zhí)行程序后,必須發(fā)出一個(gè)適當(dāng)?shù)膃cho命令。UNIX系統(tǒng)中,通過鍵入如下命令獲取狀態(tài):$ echo $?要

11、在Windows系統(tǒng)下觀察狀態(tài),鍵入C:directory echo %ERRORLEVEL%習(xí)題習(xí)題1.1回憶你的編譯器文檔并確定它所用的文件命名標(biāo)準(zhǔn)。編譯并運(yùn)行本節(jié)的main程序。習(xí)題1.2修改程序使其返回-1。返回值-1通常作為程序運(yùn)行失敗的指示器。然而,系統(tǒng)不同,如何甚至是否報(bào)告main函數(shù)運(yùn)行失敗也不同。重新編譯并回到你的程序,看看你的系統(tǒng)如何處理main函數(shù)的運(yùn)行失敗指示器。1.2 初窺輸入/輸出1.2 初窺輸入/輸出C+并沒有直接定義進(jìn)行輸入或輸出IO的任何語句,而是由標(biāo)準(zhǔn)庫standard library提供。IO庫提供了大量的工具。然而,對(duì)許多應(yīng)用,包括本書的例子而言,編程者

12、只需要了解一些根本概念和操作。本書的大多數(shù)例子都使用了處理格式化輸入和輸出的iostream庫。iostream庫的根底是兩種命名為istream和ostream的類型,分別表示輸入流和輸出流。流是指要從某種IO設(shè)備上讀入或?qū)懗龅淖址蛄?。術(shù)語“流試圖說明字符是隨著時(shí)間順序生成或消耗的。1.2.1 標(biāo)準(zhǔn)輸入與輸出對(duì)象標(biāo)準(zhǔn)庫定義了四個(gè)IO對(duì)象。處理輸入時(shí)使用命名為cin讀作see-in的istream類型對(duì)象。這個(gè)對(duì)象也叫作標(biāo)準(zhǔn)輸入standard input。處理輸出時(shí)使用命名為cout讀作see-out的ostream類型對(duì)象,這個(gè)對(duì)象也稱為標(biāo)準(zhǔn)輸出standard output。標(biāo)準(zhǔn)庫還定

13、義了另外兩個(gè)ostream對(duì)象,分別命名為cerr和clog分別讀作“see-err和“see-log。cerr對(duì)象又叫作標(biāo)準(zhǔn)錯(cuò)誤standard error,通常用來輸出警告和錯(cuò)誤信息給程序的使用者。而clog對(duì)象用于產(chǎn)生程序執(zhí)行的一般信息。一般情況下,系統(tǒng)將這些對(duì)象與執(zhí)行程序的窗口聯(lián)系起來。這樣,當(dāng)我們從cin讀入時(shí),數(shù)據(jù)從執(zhí)行程序的窗口讀入,當(dāng)寫到cout、cerr或clog時(shí),輸出寫至同一窗口。運(yùn)行程序時(shí),大局部操作系統(tǒng)都提供了重定向輸入或輸出流的方法。利用重定向可以將這些流與所選擇的文件聯(lián)系起來。1.2.2 一個(gè)使用IO庫的程序到目前為止,我們已經(jīng)明白如何編譯與執(zhí)行簡(jiǎn)單的程序,雖然那

14、個(gè)程序什么也不做。在開篇的書店問題中,有一些記錄含有相同的ISBN,需要將這些記錄進(jìn)行匯總,也就是說需要弄清楚如何累加已售出書籍的數(shù)量。為了弄清楚如何解決這個(gè)問題,我們先來看應(yīng)如何把兩數(shù)相加。我們可以使用IO庫來擴(kuò)充main程序,要求用戶給出兩個(gè)數(shù),然后輸出它們的和:#include int main() std:cout Enter two numbers: v1 v2; std:cout The sum of v1 and v2 is v1 + v2 std:endl; return 0;程序首先在用戶屏幕上顯示提示語:Enter two numbers:然后程序等待用戶輸入。如果用戶輸入

15、3 7跟著一個(gè)換行符,那么程序產(chǎn)生下面的輸出:The sum of 3 and 7 is 10程序的第一行是一個(gè)預(yù)處理指示:#include 告訴編譯器要使用iostream庫。尖括號(hào)里的名字是一個(gè)頭文件。程序使用庫工具時(shí)必須包含相關(guān)的頭文件。#include指令必須單獨(dú)寫成一行頭文件名和#include必須在同一行。通常,#include指令應(yīng)出現(xiàn)在任何函數(shù)的外部。而且習(xí)慣上,程序的所有#include指示都在文件開頭局部出現(xiàn)。1. 寫入到流main函數(shù)體中第一條語句執(zhí)行了一個(gè)表達(dá)式expression。C+中,一個(gè)表達(dá)式由一個(gè)或幾個(gè)操作數(shù)和通常是一個(gè)操作符組成。該語句的表達(dá)式使用輸出操作符

16、操作符,在標(biāo)準(zhǔn)輸出上輸出提示語:std:cout Enter two numbers: std:endl;這個(gè)語句用了兩次輸出操作符。每個(gè)輸出操作符實(shí)例都接受兩個(gè)操作數(shù):左操作數(shù)必須是ostream對(duì)象;右操作數(shù)是要輸出的值。操作符將其右操作數(shù)寫到作為其左操作數(shù)的ostream對(duì)象。C+中,每個(gè)表達(dá)式產(chǎn)生一個(gè)結(jié)果,通常是將運(yùn)算符作用到其操作數(shù)所產(chǎn)生的值。當(dāng)操作符是輸出操作符時(shí),結(jié)果是左操作數(shù)的值。也就是說,輸出操作返回的值是輸出流本身。既然輸出操作符返回的是其左操作數(shù),那么我們就可以將輸出請(qǐng)求鏈接在一起。輸出提示語的那條語句等價(jià)于(std:cout Enter two numbers:) st

17、d:endl;因?yàn)閟td:cout Enter two numbers:返回其左操作數(shù)std:cout,這條語句等價(jià)于std:cout Enter two numbers:;std:cout v1 v2;輸入操作符操作符行為與輸出操作符相似。它接受一個(gè)istream對(duì)象作為其左操作數(shù),接受一個(gè)對(duì)象作為其右操作數(shù),它從istream操作數(shù)讀取數(shù)據(jù)并保存到右操作數(shù)中。像輸出操作符一樣,輸入操作符返回其左操作數(shù)作為結(jié)果。由于輸入操作符返回其左操作數(shù),我們可以將輸入請(qǐng)求序列合并成單個(gè)語句。換句話說,這個(gè)輸入操作等價(jià)于:std:cin v1;std:cin v2;輸入操作的效果是從標(biāo)準(zhǔn)輸入讀取兩個(gè)值,將

18、第一個(gè)存放在v1中,第二個(gè)存放在v2中。4. 完成程序剩下的就是要輸出結(jié)果:std:cout The sum of v1 and v2 is v1 + v2 std:endl;這條語句雖然比輸出提示語的語句長(zhǎng),但概念上沒什么區(qū)別。它將每個(gè)操作數(shù)輸出到標(biāo)準(zhǔn)輸出。有趣的是操作數(shù)并不都是同一類型的值,有些操作數(shù)是字符串字面值。例如The sum of 其他是不同的int值,如v1,v2以及對(duì)算術(shù)表達(dá)式v1 + v2求值的結(jié)果。iostream庫定義了接受全部?jī)?nèi)置類型的輸入輸出操作符版本。在寫C+程序時(shí),大局部出現(xiàn)空格符的地方,可用換行符代替。這條規(guī)那么的一個(gè)例外是字符串字面值中的空格符不能用換行符代

19、替。另一個(gè)例外是換行符不允許出現(xiàn)在預(yù)處理指示中。關(guān)鍵概念:已初始化變量和未初始化變量 在C+中,初始化是一個(gè)非常重要的概念,對(duì)它的討論將貫穿本書始終。已初始化變量是指變量在定義時(shí)就給定一個(gè)值。未初始化變量那么未給定初始值:int val1 = 0; / initializedint val2; / uninitialized給變量一個(gè)初始值幾乎總是正確的,但不要求必須這樣做。當(dāng)我們確定變量在第一次使用時(shí)會(huì)賦一個(gè)新值,那就不需要?jiǎng)?chuàng)立初始值。例如,在本小節(jié)最開始我們的第一個(gè)有意義的程序中,定義了未初始化變量,并立即讀取值給它們。定義變量時(shí),應(yīng)該給變量賦初始值,除非確定將變量用于其他意圖之前會(huì)覆蓋這

20、個(gè)初值。如果不能保證讀取變量之前重置變量,就應(yīng)該初始化變量。習(xí)題 習(xí)題1.3編一個(gè)程序,在標(biāo)準(zhǔn)輸出上打印“Hello, World。習(xí)題1.4我們的程序利用內(nèi)置的加法操作符“+來產(chǎn)生兩個(gè)數(shù)的和,編寫程序,使用乘法操作符“*產(chǎn)生兩個(gè)數(shù)的積。習(xí)題1.5我們的程序使用了一條較長(zhǎng)的輸出語句。重寫程序,使用單獨(dú)的語句打印每一個(gè)操作數(shù)。習(xí)題1.6解釋下面的程序段: std:cout The sum of v1; and v2; is v1 + v2 std:endl;這段代碼合法嗎?如果合法,為什么?如果不合法,又為什么?1.3 關(guān)于注釋1.3 關(guān)于注釋在程序變得更復(fù)雜前,我們應(yīng)該明白C+如何處理注釋co

21、mmenmts。注釋可以幫助閱讀程序,通常用于概括算法、確認(rèn)變量的用途或者說明難以理解的代碼段。注釋并不會(huì)增加可執(zhí)行程序的大小,編譯器會(huì)忽略所有注釋。本書中,注釋排成斜體以區(qū)別于一般程序文本。實(shí)際程序中,注釋文本是否區(qū)別于程序代碼文本依賴于編程環(huán)境的先進(jìn)復(fù)雜程度。C+中有兩種類型的注釋:?jiǎn)涡凶⑨尯统蓪?duì)注釋。單行注釋以雙斜線/開頭,行中處于雙斜杠右邊的內(nèi)容是注釋,被編譯器忽略。另一種定界符,注釋對(duì)/*/,是從C語言繼承過來的。這種注釋以“/*開頭,以“*/結(jié)尾,編譯器把落入注釋對(duì)“/*/之間的內(nèi)容作為注釋:#include /* Simple main function: Read two nu

22、mbers and write their sum */int main() / prompt user to enter two numbers std:cout Enter two numbers: v1 v2; / read input return 0;任何允許有制表符、空格或換行符的地方都允許放注釋對(duì)。注釋對(duì)可跨越程序的多行,但不是一定要如此。當(dāng)注釋跨越多行時(shí),最好能直觀地指明每一行都是注釋的一局部。我們的風(fēng)格是在注釋的每一行以星號(hào)開始,指明整個(gè)范圍是多行注釋的一局部。程序通?;煊脙煞N注釋形式。注釋對(duì)一般用于多行解釋,而雙斜線注釋那么常用于半行或單行的標(biāo)記。太多的注釋混入程序代碼可能

23、會(huì)使代碼難以理解,通常最好是將一個(gè)注釋塊放在所解釋代碼的上方。代碼改變時(shí),注釋應(yīng)與代碼保持一致。程序員即使知道系統(tǒng)其他形式的文檔已經(jīng)過期,還是會(huì)信任注釋,認(rèn)為它會(huì)是正確的。錯(cuò)誤的注釋比沒有注釋更糟,因?yàn)樗鼤?huì)誤導(dǎo)后來者。注釋對(duì)不可嵌套注釋總是以開始并以結(jié)束。這意味著,一個(gè)注釋對(duì)不能出現(xiàn)在另一個(gè)注釋對(duì)中。由注釋對(duì)嵌套導(dǎo)致的編譯器錯(cuò)誤信息容易使人迷惑。例如,在你的系統(tǒng)上編譯下面的程序:#include /* comment pairs /* */ cannot nest.* cannot nest is considered source code,* as is the rest of the p

24、rogram*/int main() return 0;當(dāng) 注釋掉程序的一大局部時(shí),似乎最簡(jiǎn)單的方法就是在要臨時(shí)忽略的區(qū)域前后放一個(gè)注釋對(duì)。問題是如果那段代碼已經(jīng)有了注釋對(duì),那么新插入的注釋對(duì)將提前終止。 臨時(shí)忽略一段代碼更好的方法是,用編輯器在要忽略的每一行代碼前面插入單行注釋。這樣,你就無需擔(dān)憂要注釋的代碼是否已包含注釋對(duì)。習(xí)題 習(xí)題1.7 編譯有不正確嵌套注釋的程序。習(xí)題1.8 指出以下輸出語句哪些如果有是合法的。 std:cout /*; std:cout */; std:cout /* */ */;預(yù)測(cè)結(jié)果,然后編譯包含上述三條語句的程序,檢查你的答案。糾正所遇到的錯(cuò)誤。1.4 控制

25、結(jié)構(gòu)1.4 控制結(jié)構(gòu)語句順序地執(zhí)行:函數(shù)的第一條語句首先執(zhí)行,接著是第二條,依次類推。當(dāng)然,少數(shù)程序包括我們將要編寫的解決書店問題的程序可以僅用順序執(zhí)行語句編寫。事實(shí)上,程序設(shè)計(jì)語言提供了多種控制結(jié)構(gòu)支持更為復(fù)雜的執(zhí)行路徑。本節(jié)將簡(jiǎn)要地介紹C+提供的控制結(jié)構(gòu),第6章再詳細(xì)介紹各種語句。while語句while語句提供迭代執(zhí)行??梢杂脀hile語句編寫一個(gè)從1到10包括10的求和程序,如下:#include int main() int sum = 0, val = 1; / keep executing the while until val is greater than 10 while

26、(val = 10) sum += val; / assigns sum + val to sum +val; / add 1 to val std:cout Sum of 1 to 10 inclusive is sum std:endl; return 0;編譯并執(zhí)行后,將輸出:Sum of 1 to 10 inclusive is 55與前面一樣,程序首先包含iostream頭文件并定義main函數(shù)。在main函數(shù)中定義兩個(gè)int型變量:sum保存總和,val表示從1到10之間的每一個(gè)值。我們給sum賦初值0,而val那么從1開始。重要的局部是while語句。while結(jié)構(gòu)有這樣的形式:

27、while (condition) while_body_statement;while通過測(cè)試condition和執(zhí)行相關(guān)的while_body_statement來重復(fù)執(zhí)行,直到condition為假。condition是一個(gè)可求值的表達(dá)式,所以可以測(cè)試其結(jié)果。如果結(jié)果值非零,那么條件為真;如果值為零,那么條件為假。如果condition為真表達(dá)式求值不為零,那么執(zhí)行while_body_statement。執(zhí)行完后,再次測(cè)試condition。如果condition仍為真,那么再次執(zhí)行while_ body_statement。While語句一直交替測(cè)試condition和執(zhí)行while

28、_ body_statement,直到condition為假為止。在這個(gè)程序中,while語句是/ keep executing the while until val is greater than 10while (val = 10) sum += val; / assigns sum + val to sum +val; / add 1 to valWhile語句的條件用了小于或等于操作符=操作符,將val的當(dāng)前值和10比擬,只要val小于或等于10,就執(zhí)行while循環(huán)體。這種情況下,while循環(huán)體是一個(gè)包含兩個(gè)語句的塊: sum += val; / assigns sum + va

29、l to sum +val; / add 1 to val塊是被花括號(hào)括起來的語句序列。C+中,塊可用于任何可以用一條語句的地方。塊中第一條語句使用了復(fù)合賦值操作符+=操作符,這個(gè)操作符把它的右操作數(shù)加至左操作數(shù),這等效于編寫含一個(gè)加法和一個(gè)賦值的語句:sum = sum + val; / assign sum + val to sum因此第一條語句是把val的值加到sum的當(dāng)前值,并把結(jié)果存入sum,第二條語句+val; / add 1 to val使用了前自增操作符+操作符,自增操作符就是在它的操作數(shù)上加1,+val和val = val + 1是一樣的。執(zhí)行while的循環(huán)體后,再次執(zhí)行w

30、hile的條件。如果val的值自增后仍小于或等于10,那么再次執(zhí)行while的循環(huán)體。循環(huán)繼續(xù),測(cè)試條件并執(zhí)行循環(huán)體,直到val的值不再小于或等于10為止。一旦val的值大于10,程序就跳出while循環(huán)并執(zhí)行while后面的語句,此例中該語句打印輸出,其后的return語句結(jié)束main程序。關(guān)鍵概念:C+程序的縮排和格式 C+程序格式非常自由,花括號(hào)、縮排、注釋和換行的位置通常對(duì)程序的語義沒有影響。例如,表示main函數(shù)體開始的花括號(hào)可以放在與main同一行,也可以像我們那樣,放在下一行的開始,或放在你喜歡的任何地方。唯一的要求是,它是編譯器所看到在main的參數(shù)列表的右括號(hào)之后的第一個(gè)非空

31、格、非注釋字符。雖然說我們可以很自由地編排程序的格式,但如果編排不當(dāng),會(huì)影響程序的可讀性。例如,我們可以將main寫成單獨(dú)的一長(zhǎng)行。這樣的定義盡管合法,但很難閱讀。關(guān)于什么是C或C+程序的正確格式存在無休止的爭(zhēng)論,我們相信沒有唯一正確的風(fēng)格,但一致性是有價(jià)值的。我們傾向于把確定函數(shù)邊界的花括號(hào)自成一行,且縮進(jìn)復(fù)合的輸入或輸出表達(dá)式從而使運(yùn)算符排列整齊,正如節(jié)的main函數(shù)中的輸出語句那樣。隨著程序的復(fù)雜化,其他縮排標(biāo)準(zhǔn)也會(huì)變得清晰。記住重要的是可能存在其他格式化程序的方式。在選擇格式化風(fēng)格時(shí),要考慮提高程序的可讀性,使其更易于理解。一旦選擇了某種風(fēng)格,就要始終如一地使用。1.4.2 for語句

32、在while循環(huán)中,我們使用變量val來控制循環(huán)執(zhí)行次數(shù)。每次執(zhí)行while語句,都要測(cè)試val的值,然后在循環(huán)體中增加val的值。由于頻頻使用像val這樣的變量控制循環(huán),因而C+語言定義了第二種控制結(jié)構(gòu),稱為for語句,簡(jiǎn)化管理循環(huán)變量的代碼。使用for循環(huán)重新編寫求1到10的和的程序,如下:#include int main() int sum = 0; / sum values from 1 up to 10 inclusive for (int val = 1; val = 10; +val) sum += val; / equivalent to sum = sum + val st

33、d:cout Sum of 1 to 10 inclusive is sum std:endl; return 0;在for循環(huán)之前,我們定義sum并賦0值。用于迭代的變量val被定義為for語句自身的一局部。for語句for (int val = 1; val = 10; +val) sum += val; / equivalent to sum = sum + val包含兩局部:for語句頭和for語句體。for語句頭控制for語句體的執(zhí)行次數(shù)。for語句頭由三局部組成:一個(gè)初始化語句,一個(gè)條件,一個(gè)表達(dá)式。在這個(gè)例子中,初始化語句int val = 1;定義一個(gè)名為val的int對(duì)象并給

34、定初始值。初始化語句僅在進(jìn)入for語句時(shí)執(zhí)行一次。條件val = 10將val的當(dāng)前值和10比擬,每次經(jīng)過循環(huán)都要測(cè)試。只要val小于或等于10,就執(zhí)行for語句體。僅當(dāng)for語句體執(zhí)行后才執(zhí)行表達(dá)式。在這個(gè)for循環(huán)中,表達(dá)式使用前自增運(yùn)算符,val的值加,執(zhí)行完表達(dá)式后,for語句重新測(cè)試條件,如果val的新值仍小于或等于10,那么執(zhí)行for語句體,val再次自增,繼續(xù)執(zhí)行直到條件不成立。在這個(gè)循環(huán)中,for語句體執(zhí)行求和sum += val; / equivalent to sum = sum + valfor語句體使用復(fù)合賦值運(yùn)算符,把val的當(dāng)前值加到sum,并將結(jié)果保存到sum中。

35、扼要重述,for循環(huán)總的執(zhí)行流程為:(1) 創(chuàng)立val并初始化為1。(2) 測(cè)試val是否小于或等于10。(3) 如果val小于或等于10,那么執(zhí)行for循環(huán)體,把val加到sum中。如果val大于10,就退出循環(huán),接著執(zhí)行for語句體后的第一條語句。(4) val遞增。(5) 重復(fù)第2步的測(cè)試,只要條件為真,就繼續(xù)執(zhí)行其余步驟。退出for循環(huán)后,變量val不再可訪問,循環(huán)終止后使用val是不可能的。然而,不是所有的編譯器都有這一要求。在標(biāo)準(zhǔn)化之前的C+中,定義在for語句頭的名字在for循環(huán)外是可訪問的。語言定義中的這一改變,可能會(huì)使習(xí)慣于使用老式編譯器的人,在使用遵循標(biāo)準(zhǔn)的新編譯器時(shí)感到驚

36、訝?;貞浘幾g 編譯器的局部工作是尋找程序代碼中的錯(cuò)誤。編譯器不能查出程序的意義是否正確, 但它可以查出程序形式上的錯(cuò)誤。下面是編譯器能查出的最普遍的一些錯(cuò)誤。(1) 語法錯(cuò)誤。程序員犯了C+語言中的語法錯(cuò)誤。下面代碼段說明常見的語法錯(cuò)誤;每個(gè)注釋描述下一行的錯(cuò)誤。 / error: missing ) in parameter list for main int main ( / error: used colon, not a semicolon after endl std:cout Read each file. std:endl: / error: missing quotes aro

37、und string literal std:cout Update master. std:endl; / ok: no errors on this line std:cout Write new master. std:endl; / error: missing ; on return statement return 0 (2) 類型錯(cuò)誤。C+中每個(gè)數(shù)據(jù)項(xiàng)都有其相關(guān)聯(lián)的類型。例如,值10是一個(gè)整數(shù)。用雙引號(hào)標(biāo)注起來的單詞hello是字符串字面值。類型錯(cuò)誤的一個(gè)實(shí)例是傳遞了字符串字面值給應(yīng)該得到整型參數(shù)的函數(shù)。(3) 聲明錯(cuò)誤。C+程序中使用的每個(gè)名字必須在使用之前聲明。沒有聲明名字通

38、常會(huì)導(dǎo)致錯(cuò)誤信息。最常見的兩種聲明錯(cuò)誤是,從標(biāo)準(zhǔn)庫中訪問名字時(shí)忘記使用“std:,以及由于疏忽而拼錯(cuò)標(biāo)識(shí)符名: #include int main() int v1, v2; std:cin v v2; / error: uses v not v1 / cout not defined, should be std:cout cout v1 + v2 std:endl; return 0; 錯(cuò)誤信息包含行號(hào)和編譯器對(duì)我們所犯錯(cuò)誤的簡(jiǎn)要描述。按錯(cuò)誤報(bào)告的順序改正錯(cuò)誤是個(gè)好習(xí)慣,通常一個(gè)錯(cuò)誤可能會(huì)產(chǎn)生一連串的影響并導(dǎo)致編譯器報(bào)告比實(shí)際多得多的錯(cuò)誤。最好在每次修改后或最多改正了一些顯而易見的錯(cuò)誤后,

39、就重新編譯代碼。這個(gè)循環(huán)就是眾所周知的編輯-編譯-調(diào)試。習(xí)題 習(xí)題1.9 以下循環(huán)做什么? sum的最終值是多少? int sum = 0; for (int i = -100; i = 100; +i) sum += i;習(xí)題1.10 用for循環(huán)編程,求從50到100的所有自然數(shù)的和。然后用while循環(huán)重寫該程序。習(xí)題1.11 用while循環(huán)編程,輸出10到0遞減的自然數(shù)。然后用for循環(huán)重寫該程序。習(xí)題1.12 比照前面兩習(xí)題中所寫的循環(huán)。兩種形式各有何優(yōu)缺點(diǎn)?習(xí)題1.13 編譯器不同,理解其診斷內(nèi)容的難易程度也不同。編寫包含本小節(jié)“回憶編譯局部討論的錯(cuò)誤的程序。探討編譯器產(chǎn)生的信息

40、,這樣你在編譯更復(fù)雜的程序遇到這些信息時(shí)會(huì)比擬熟悉。1.4.3 if語句求1到10之間數(shù)的和,其邏輯延伸是求用戶提供的兩個(gè)數(shù)之間的數(shù)的和??梢灾苯釉趂or循環(huán)中使用這兩個(gè)數(shù),使用第一個(gè)輸入值作為下界而第二個(gè)輸入值作為上界。然而, 如果用戶首先給定的數(shù)較大,這種策略將會(huì)失敗:程序會(huì)立即退出for循環(huán)。因此,我們應(yīng)該調(diào)整范圍以便較大的數(shù)作上界而較小的數(shù)作下界。這樣做,我們需要一種方式來判定哪個(gè)數(shù)更大一些。像大多數(shù)語言一樣,C+提供支持條件執(zhí)行的if語句。使用if語句來編寫修訂的求和程序如下:#include int main() std:cout Enter two numbers: v1 v2;

41、 / read input / use smaller number as lower bound for summation / and larger number as upper bound int lower, upper; if (v1 = v2) lower = v1; upper = v2; else lower = v2; upper = v1; int sum = 0; / sum values from lower up to and including upper for (int val = lower; val = upper; +val) sum += val; /

42、 sum = sum + val std:cout Sum of lower to upper inclusive is sum std:endl; return 0;如果我們編譯并執(zhí)行這個(gè)程序并給定輸入數(shù)為7和3,程序的輸出結(jié)果將為:Sum of 3 to 7 inclusive is 25這個(gè)程序中大局部代碼我們?cè)谥暗呐e例中已經(jīng)熟知了。程序首先向用戶輸出提示并定義四個(gè)int變量,然后從標(biāo)準(zhǔn)輸入讀入值到v1和v2中。僅有if條件語句是新增加的代碼:/ use smaller number as lower bound for summation/ and larger number as

43、upper boundint lower, upper;if (v1 = v2) lower = v1; upper = v2; else lower = v2; upper = v1;這段代碼的效果是恰當(dāng)?shù)卦O(shè)置upper和lower。if的條件測(cè)試v1是否小于或等于v2。如果是,那么執(zhí)行條件后面緊接著的語句塊。這個(gè)語句塊包含兩條語句,每條語句都完成一次賦值,第一條語句將v1賦值給lower,而第二條語句將v2賦值給upper。如果這個(gè)條件為假也就是說,如果v1大于v2那么執(zhí)行else后面的語句。這個(gè)語句同樣是一個(gè)由兩個(gè)賦值語句組成的塊,把v2賦值給lower而把v1賦值給upper。習(xí)題 習(xí)

44、題1.14 如果輸入值相等,本節(jié)展示的程序?qū)a(chǎn)生什么問題?習(xí)題1.15 用兩個(gè)相等的值作為輸入編譯并運(yùn)行本節(jié)中的程序。將實(shí)際輸出與你在上一習(xí)題中所作的預(yù)測(cè)相比擬,解釋實(shí)際結(jié)果和你預(yù)計(jì)的結(jié)果間的不相符之處。習(xí)題1.16 編程輸出用戶輸入的兩個(gè)數(shù)中的大者。習(xí)題1.17 編程要求用戶輸入一組數(shù)。輸出信息說明其中有多少個(gè)負(fù)數(shù)。1.4.4 讀入未知數(shù)目的輸入對(duì)小節(jié)的求和程序稍作改變,還可以允許用戶指定一組數(shù)求和。這種情況下,我們不知道要對(duì)多少個(gè)數(shù)求和,而是要一直讀數(shù)直到程序輸入結(jié)束。輸入結(jié)束時(shí),程序?qū)⒖偤蛯懙綐?biāo)準(zhǔn)輸出:#include int main() int sum = 0, value; / r

45、ead till end-of-file, calculating a running total of all values read while (std:cin value) sum += value; / equivalent to sum = sum + value std:cout Sum is: sum value)這里所產(chǎn)生的是,為判斷條件,先執(zhí)行輸入操作 std:cin value它具有從標(biāo)準(zhǔn)輸入讀取下一個(gè)數(shù)并且將讀入的值保存在value中的效果。輸入操作符節(jié)) 返回其左操作數(shù)。while條件測(cè)試輸入操作符的返回結(jié)果,意味著測(cè)試std:cin。當(dāng)我們使用istream對(duì)象作為

46、條件,結(jié)果是測(cè)試流的狀態(tài)。如果流是有效的也就是說,如果讀入下一個(gè)輸入是可能的那么測(cè)試成功。遇到文件結(jié)束end-of-file或遇到無效輸入時(shí),如讀取了一個(gè)不是整數(shù)的值,那么istream對(duì)象是無效的。處于無效狀態(tài)的istream對(duì)象將導(dǎo)致條件失敗。在遇到文件結(jié)束(或一些其他輸入錯(cuò)誤)之前, 測(cè)試會(huì)成功并且執(zhí)行while循環(huán)體。循環(huán)體是一條使用復(fù)合賦值操作符的語句,這個(gè)操作符將它的右操作數(shù)加到左操作數(shù)上。從鍵盤輸入文件結(jié)束符 操作系統(tǒng)使用不同的值作為文件結(jié)束符。Windows系統(tǒng)下我們通過鍵入control-z同時(shí)鍵入“ctrl鍵和“z鍵,來輸入文件結(jié)束符。Unix系統(tǒng)中,包括Mac OS-X機(jī)

47、器,通常用control-d。一旦測(cè)試失敗,while終止并退出循環(huán)體,執(zhí)行while之后的語句。該語句在輸出sum后輸出endl,endl輸出換行并刷新與cout相關(guān)聯(lián)的緩沖區(qū)。最后,執(zhí)行return,通常返回零表示程序成功運(yùn)行完畢。習(xí)題 習(xí)題1.18 編程提示用戶輸入兩個(gè)數(shù)并將這兩數(shù)范圍內(nèi)的每個(gè)數(shù)寫到標(biāo)準(zhǔn)輸出。習(xí)題1.19 如果上題給定數(shù)1000和2000,程序?qū)a(chǎn)生什么結(jié)果?修改程序,使每一行輸出不超過10個(gè)數(shù)。習(xí)題1.20 編程求用戶指定范圍內(nèi)的數(shù)的和,省略設(shè)置上界和下界的if測(cè)試。假定輸入數(shù)是7和3,按照這個(gè)順序,預(yù)測(cè)程序運(yùn)行結(jié)果。然后按照給定的數(shù)是7和3運(yùn)行程序,看結(jié)果是否與你預(yù)測(cè)

48、的相符。如果不相符,反復(fù)研究關(guān)于for和while循環(huán)的討論直到弄清楚其中的原因。1.5 類的簡(jiǎn)介1.5 類的引入解決書店問題前,剩下的唯一問題是弄明白如何編寫數(shù)據(jù)結(jié)構(gòu)來表示交易數(shù)據(jù)。C+中我們通過定義類來定義自己的數(shù)據(jù)結(jié)構(gòu)。類機(jī)制是C+中最重要的特征之一。事實(shí)上,C+設(shè)計(jì)的主要焦點(diǎn)是使得定義的類類型的行為可以像內(nèi)置類型一樣自然。我們前面已看到的像istream和ostream這樣的庫類型,都定義為類也就是說,它們嚴(yán)格說來不是語言的一局部。完全理解類機(jī)制需要掌握很多內(nèi)容。所幸我們可以使用他人寫的類而無需掌握如何定義自己的類。在這一節(jié),我們將描述一個(gè)用于解決書店問題的簡(jiǎn)單類。當(dāng)我們學(xué)習(xí)了更多關(guān)于

49、類型、表達(dá)式、語句和函數(shù)的知識(shí)所有這些在類定義中都將用到后,將會(huì)在后面的章節(jié)實(shí)現(xiàn)這個(gè)類。使用類時(shí)我們需要知道三個(gè)問題:(1) 類的名字是什么?(2) 它在哪里定義?(3) 它支持什么操作?對(duì)于書店問題,我們假定類命名為Sales_item且類定義在命名為Sales_item.h的頭文件中。1.5.1 Sales_item類Sales_item類的目的是存儲(chǔ)ISBN并保存該書的銷售冊(cè)數(shù)、銷售收入和平均售價(jià)。我們不關(guān)心如何存儲(chǔ)或計(jì)算這些數(shù)據(jù)。使用類時(shí)我們不需要知道這個(gè)類是怎樣實(shí)現(xiàn)的,相反,我們需要知道的是該類提供什么操作。正如我們所看到的,使用像IO一樣的庫工具,必須包含相關(guān)的頭文件。類似地,對(duì)于

50、自定義的類,必須使得編譯器可以訪問和類相關(guān)的定義。這幾乎可以采用同樣的方式。一般來說,我們將類定義放入一個(gè)文件中,要使用該類的任何程序都必須包含這個(gè)文件。依據(jù)慣例,類類型存儲(chǔ)在一個(gè)文件中,其文件名如同程序的源文件名一樣,由兩局部組成:文件名和文件后綴。通常文件名和定義在頭文件中的類名是一樣的。通常后綴是.h,但也有一些程序員用.H、.hpp或.hxx。編譯器通常并不挑剔頭文件名,但I(xiàn)DE有時(shí)會(huì)。假設(shè)我們的類定義在名為Sale_item.h的文件中。1. Sales_item對(duì)象上的操作每個(gè)類定義一種類型,類型名與類名相同。因此,我們的Sales_item類定義了一種命名為Sales_item的

51、類型。像使用內(nèi)置類型一樣,可以定義類類型的變量。當(dāng)寫下Sales_item item;就表示item是類型Sales_item的一個(gè)對(duì)象。通常將“類型Sales_item的一個(gè)對(duì)象簡(jiǎn)稱為“一個(gè)Sales_item對(duì)象,或者更簡(jiǎn)單地簡(jiǎn)稱為“一個(gè)Sales_item。除了可以定義Sales_item類型的變量,我們還可以執(zhí)行Sales_item對(duì)象的以下操作: 使用加法操作符,+,將兩個(gè)Sales_item相加 使用輸入操作符,來讀取一個(gè)Sales_item對(duì)象 使用輸出操作符,來輸出一個(gè)Sales_item對(duì)象 使用賦值操作符,=,將一個(gè)Sales_item對(duì)象賦值給另一個(gè)Sales_item對(duì)

52、象 調(diào)用same_isbn函數(shù)確定兩個(gè)Sales_item是否指同一本書。2. 讀入和寫出Sales_item對(duì)象知道了類提供的操作,就可以編寫一些簡(jiǎn)單的程序使用這個(gè)類。例如,下面的程序從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),使用該數(shù)據(jù)建立一個(gè)Sales_item對(duì)象,并將該Sales_item對(duì)象寫到標(biāo)準(zhǔn)輸出:#include #include Sales_item.hint main() Sales_item book; / read ISBN, number of copies sold, and sales price std:cin book; / write ISBN, number of copie

53、s sold, total revenue, and average price std:cout book std:endl; return 0;如果輸入到程序的是0-201-70353-X 4 24.99那么輸出將是0-201-70353-X 4 99.96 24.99輸入說明銷售了4本書,每本價(jià)格是24.99美元。輸出說明賣出書的總數(shù)是4本,總收入是99.96美元,每本書的平均價(jià)格是24.99美元。這個(gè)程序以兩個(gè)#include指令開始,其中之一使用了一種新格式。iostream頭文件由標(biāo)準(zhǔn)庫定義,而Sales_item頭文件那么不是。Sales_item是一種自定義類型。當(dāng)使用自定義頭

54、文件時(shí),我們采用雙引號(hào) 把頭文件名括起來。標(biāo)準(zhǔn)庫的頭文件用尖括號(hào)括起來,非標(biāo)準(zhǔn)庫的頭文件用雙引號(hào) 括起來。在main函數(shù)中,首先定義一個(gè)對(duì)象,命名為book,用它保存從標(biāo)準(zhǔn)輸入讀取的數(shù)據(jù)。下一條語句讀入數(shù)據(jù)到此對(duì)象,第三條語句將它打印到標(biāo)準(zhǔn)輸出,像平常一樣緊接著打印endl來刷新緩沖區(qū)。關(guān)鍵概念:類定義行為 在編寫使用Sales_item的程序時(shí),重要的是記住類Sales_item的創(chuàng)立者定義該類對(duì)象可以執(zhí)行的所有操作。也就是說,Sales_item數(shù)據(jù)結(jié)構(gòu)的創(chuàng)立者定義創(chuàng)立Sales_item對(duì)象時(shí)發(fā)生什么,以及加運(yùn)算符或輸入輸出運(yùn)算符應(yīng)用到Sales_item對(duì)象時(shí)發(fā)生什么,等等。通常,只有

55、由類定義的操作可被用于該類類型的對(duì)象。此時(shí),我們知道的可以在Sales_ item對(duì)象上執(zhí)行的操作只是前面列出的那些。我們將在節(jié)和14.2節(jié)看到如何定義這些操作。3. 將Sales_item對(duì)象相加更有趣的例子是將兩個(gè)Sales_item對(duì)象相加:#include #include Sales_item.hint main() Sales_item item1, item2; std:cin item1 item2; / read a pair of transactions std:cout item1 + item2 std:endl; / print their sum return 0

56、;如果我們給這個(gè)程序下面的輸入:0-201-78345-X 3 20.000-201-78345-X 2 25.00那么輸出為0-201-78345-x 5 110 22程序首先包含兩個(gè)頭文件Sales_item和iostream。接下來定義兩個(gè)Sales_item對(duì)象來存放要求和的兩筆交易。輸出表達(dá)式做加法運(yùn)算并輸出結(jié)果。從前面列出的操作,可以得知將兩個(gè)Sales_item相加將創(chuàng)立一個(gè)新對(duì)象,新對(duì)象的ISBN是其操作數(shù)的ISBN,銷售的數(shù)量和收入反映其操作數(shù)中相應(yīng)值的和。我們也知道相加的項(xiàng)必須具有同樣的ISBN。值得注意的是這個(gè)程序是如何類似于節(jié)中的程序:讀入兩個(gè)輸入并輸出它們的和。令人感

57、興趣的是,本例并不是讀入兩個(gè)整數(shù)并輸出兩個(gè)整數(shù)的和,而是讀入兩個(gè)Sales_item對(duì)象并輸出兩個(gè)Sales_item對(duì)象的和。此外,“和的意義也不同。在整數(shù)的實(shí)例中我們產(chǎn)生的是傳統(tǒng)求和兩個(gè)數(shù)值相加后的結(jié)果。在Sales_item對(duì)象的實(shí)例上我們使用了在概念上有新意義的求和兩個(gè)Sales_item對(duì)象的成分相加后的結(jié)果。習(xí)題 習(xí)題1.21 網(wǎng)站的第1章的代碼目錄下有Sales_item.h的副本。復(fù)制該文件到你的工作目錄。編寫程序循環(huán)遍歷一組書的銷售交易,讀入每筆交易并將交易寫至標(biāo)準(zhǔn)輸出。習(xí)題1.22 編寫程序讀入兩個(gè)具有相同ISBN的Sales_item對(duì)象并產(chǎn)生它們的和。習(xí)題1.23 編寫

58、程序讀入幾個(gè)具有相同ISBN的交易,輸出所有讀入交易的和。1.5.2 初窺成員函數(shù)不幸的是,將Sales_item相加的程序有一個(gè)問題。如果輸入指向了兩個(gè)不同的ISBN將發(fā)生什么?將兩個(gè)不同ISBN的數(shù)據(jù)相加沒有意義。為解決這個(gè)問題,首先檢查Sales_item操作數(shù)是否都具有相同的ISBN。#include #include Sales_item.hint main() Sales_item item1, item2; std:cin item1 item2; / first check that item1 and item2 represent the same book if (ite

59、m1.same_isbn(item2) std:cout item1 + item2 std:endl; return 0; / indicate success else std:cerr Data must refer to same ISBN std:endl; return -1; / indicate failure 這個(gè)程序和前一個(gè)程序不同之處在于if測(cè)試語句以及與它相關(guān)聯(lián)的else分支。在解釋if語句的條件之前,我們明白程序的行為取決于if語句中的條件。如果測(cè)試成功,那么產(chǎn)生與前一程序相同的輸出,并返回0表示程序成功運(yùn)行完畢。如果測(cè)試失敗,執(zhí)行else后面的語句塊,輸出信息并返回

60、錯(cuò)誤提示。1. 什么是成員函數(shù)上述if語句的條件/ first check that item1 and item2 represent the same bookif (item1.same_isbn(item2) 調(diào)用命名為item1的Sales_item對(duì)象的成員函數(shù)。成員函數(shù)是由類定義的函數(shù),有時(shí)稱為類方法。成員函數(shù)只定義一次,但被視為每個(gè)對(duì)象的成員。我們將這些操作稱為成員函數(shù),是因?yàn)樗鼈兺ǔT谔囟▽?duì)象上操作。在這個(gè)意義上,它們是對(duì)象的成員,即使同一類型的所有對(duì)象共享同一個(gè)定義也是如此。當(dāng)調(diào)用成員函數(shù)時(shí),通常指定函數(shù)要操作的對(duì)象。語法是使用點(diǎn)運(yùn)算符.運(yùn)算符:item1.same_isb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論