CPrimer課后習(xí)題解答(第1~18章答案)_第1頁(yè)
CPrimer課后習(xí)題解答(第1~18章答案)_第2頁(yè)
CPrimer課后習(xí)題解答(第1~18章答案)_第3頁(yè)
CPrimer課后習(xí)題解答(第1~18章答案)_第4頁(yè)
已閱讀5頁(yè),還剩133頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

目錄TOC\o"1-5"\h\z\o"CurrentDocument"第一章快速入門(mén) 2\o"CurrentDocument"第二章變量和基本類型 7\o"CurrentDocument"第三章標(biāo)準(zhǔn)庫(kù)類型 13\o"CurrentDocument"第四章數(shù)組和指針 21\o"CurrentDocument"第五章表達(dá)式 31第六章語(yǔ)句 37第七章函數(shù) 37第ノ1早標(biāo)準(zhǔn)10庫(kù) 37\o"CurrentDocument"第九章順序容器 43\o"CurrentDocument"第十章關(guān)聯(lián)容器 60第H■■一章泛型算法 75\o"CurrentDocument"第十二章類和數(shù)據(jù)抽象 86\o"CurrentDocument"第十三章復(fù)制控制 94第十四章重載操作符與轉(zhuǎn)換 102\o"CurrentDocument"第十五章面向ヌ寸象編程 116\o"CurrentDocument"第十六章部分選做習(xí)題 133第十七章用于大型程序的工具 138第十八章特殊工具與技術(shù) 138第一章快速入門(mén)習(xí)題!.1查看所用的編譯器文檔,了解它所用的文件命名規(guī)范.編譯并運(yùn)行本節(jié)的main程序.【解答】一般而言,C++編譯器要求待編譯的程序保存在文件中。C++程序中一般涉及兩類文件:頭文件和源文件。大多數(shù)系統(tǒng)中,文件的名字由文件名和文件后綴(又稱擴(kuò)展名)組成。文件后綴通常表明文件的類型,如頭文件的后綴可以是上或.hpp等;源文件的后綴可以是?cc或.cpp等,具體的后綴與使用的編譯器有關(guān).通??梢酝ㄟ^(guò)編譯器所提供的聯(lián)機(jī)幫助文檔了解其文件命名規(guī)范。習(xí)題!2修改程序使其返回一L返回值ー1通常作為程序運(yùn)行失敗的指示器。然而,系統(tǒng)不同,如何(甚至是否)報(bào)告main函數(shù)運(yùn)行失敗不同.重新編譯并再次運(yùn)行ネ節(jié),看看你的系統(tǒng)如何處理main函數(shù)的運(yùn)行失敗指示器?!窘獯稹抗P者所使用的Windows操作系統(tǒng)并不報(bào)告main函數(shù)的運(yùn)行失敗,因此,程序返回一1或返回〇在運(yùn)行效果上沒(méi)有什么區(qū)別。但是,如果在DOS命令提示符方式下運(yùn)行程序,然后再鍵入echo%ERRORLEVEL%命令,則系統(tǒng)會(huì)顯示返回值-1。習(xí)題1.3編ー個(gè)程序,在標(biāo)準(zhǔn)輸出上打印"Hello,World".【解答】#include<iostream>intmainO{std::cout<<"Hello,World"<<stdzendl;return0;)習(xí)題14我們的程序利用內(nèi)置的加法操作符"+"來(lái)產(chǎn)生兩個(gè)數(shù)的和。編寫(xiě)程序,使用乘法操作符"*"產(chǎn)生兩個(gè)數(shù)的積?【解答】#include<iostream>intmain()(std::cout<<"Entertwonumbers:"<<std::endl;intvl,v2;std::cin>>vl>>v2;std::cout<<"Theproductof"<<vl<<"and"<<v2<<"is"<<vl*v2<<std::endl;return0;}習(xí)題1.5我們的程序使用了一條較長(zhǎng)的輸出語(yǔ)句。重寫(xiě)程序,使用單獨(dú)的語(yǔ)句打印每ー個(gè)操作數(shù)?!窘獯稹?include<iostream>intmain(){std::cout<<"Entertwonumbers:"<<std::endl;intvl,v2;std::cin>>vl>>v2;std::cout<<"Thesumof";std::cout<<vl;std::cout<<"andn;std::cout<<v2;std::cout<<"is";std::cout<<vl+v2;std::cout<<std::endl;return0;)習(xí)題1.6解釋下面的程序段:std::cout<<"Thesumof"<<vl;<<"and"<<v2;<<"is"<<vl+v2<<std::endl;這段代碼合法嗎?如果合法,為什么?如果不合法,又為什么?【解答】這段代碼不合法。注意,第1、2、4行的末尾有分號(hào),表示這段代碼包含三條語(yǔ)句,即第1、2行各為ー個(gè)語(yǔ)句,第3、4行構(gòu)成一個(gè)語(yǔ)句。"<<"為二元操作符,在第2、3兩條語(yǔ)句中,第一個(gè)“<<”缺少左操作數(shù),因此不合法。在第2、3行的開(kāi)頭加上"std::couピ,即可更正。習(xí)題1.7編譯有不正確嵌套注釋的程序?!窘獯稹坑勺⑨寣?duì)嵌套導(dǎo)致的箜的惠叁編譯器錯(cuò)誤信息通常令人迷惑。例如,在筆者所用的編譯器中編譯13節(jié)中給出的帶有不正確嵌套注釋的程序:#include<iostream>/**commentpairs/**/cannotnest.*"cannotnest"isconsideredsourcecode,*asistherestoftheprogramVintmainO{return0;)編譯器會(huì)給出如下錯(cuò)誤信息:errorC2143:syntaxerror:missingbefore'<'errorC2501:'include':missingstorage-classortypespecifierswarningC4138:'*/'foundoutsideofcomment(第6行)errorC2143:syntaxerror:missingbefore'{'(第8行)errorC2447:'{':missingfunctionheader(old-styleformallist?)(第8行)習(xí)題1.8指出下列輸出語(yǔ)句哪些(如果有)是合法的。std::cout<<ソ?";std::cout<<**/";std::cout<</***/**/;預(yù)測(cè)結(jié)果,然后編譯包含上述三條語(yǔ)句的程序,檢査你的答案。糾正所遇到的錯(cuò)誤?!窘獯稹康谝粭l和第二條語(yǔ)句合法。第三條語(yǔ)句中<<操作符之后至第二個(gè)雙引號(hào)之前的部分被注釋掉了,導(dǎo)致<<操作符的右操作數(shù)不是ー個(gè)完整的字符串,所以不合法。在分號(hào)之前加上一個(gè)雙引號(hào)即可更正。習(xí)題1.9下列循環(huán)做什么?sum的最終值是多少?intsum=0;for(inti=-100;i<=100;++i)sum+=i;【解答】該循環(huán)求?100~100之間所有整數(shù)的和(包括?100和100Isum的最終值是〇〇習(xí)題!.10用for循環(huán)編程,求從50~100的所有自然數(shù)的和。然后用while循環(huán)重寫(xiě)該程序?!窘獯稹坑胒or循環(huán)編寫(xiě)的程序如下:#include<iostream>intmain()(intsum=0;for(inti=50;i<=100;++i)sum+=i;std::cout<<"Sumof50to100inclusiveis"<<sum<<std::endl;return0;}用while循環(huán)編寫(xiě)的程序如下:#include<iostream>intmain()(intsum=0,inti=50;while(i<=100){sum+=i;++i;}std::cout<<"Sumof50to100inclusiveis'<<sum<<std::endl;return0;}習(xí)題1.11用while循環(huán)編程,輸出10-0遞減的自然數(shù).然后用for循環(huán)重寫(xiě)該程序.【解答】用while循環(huán)編寫(xiě)的程序如下:#include<iostream>intmain()(inti=10;while(i>=0){std::cout<<i-i;)return0;)用for循環(huán)編寫(xiě)的程序如下:#include<iostream>intmain()(for(inti=10;i>=0;-i)std::cout<<i<<"return0;}習(xí)題!.12對(duì)比前面兩個(gè)習(xí)題中所寫(xiě)的循環(huán)。兩種形式各有何優(yōu)缺點(diǎn)?【解答】在for循環(huán)中,循環(huán)控制變量的初始化和修改都放在語(yǔ)句頭部分,形式較簡(jiǎn)潔,且特別適用于循環(huán)次數(shù)已知的情況.在while循環(huán)中,循環(huán)控制變量的初始化一般放在while語(yǔ)句之前,循環(huán)控制變量的修改一般放在循環(huán)體中,形式上不如for語(yǔ)句簡(jiǎn)潔,但它ヒ匕較適用于循環(huán)次數(shù)不易預(yù)知的情況用某ー條件控制循環(huán)),兩種形式各有優(yōu)點(diǎn),但它們?cè)诠δ苌鲜堑葍r(jià)的,可以相互轉(zhuǎn)換.習(xí)題1.13編譯器不同,理解其診斷內(nèi)容的難易程度也不同.編寫(xiě)ー些程序,包含本小節(jié)"再談編譯"部分討論的那些常見(jiàn)錯(cuò)誤.研究編譯器產(chǎn)生的信息,這樣你在編譯更復(fù)雜的程序遇到這些信息時(shí)不會(huì)陌生.【解答】對(duì)于程序中出現(xiàn)的錯(cuò)誤,編譯器通常會(huì)給出簡(jiǎn)略的提示信息,包括錯(cuò)誤出現(xiàn)的文件及代碼行、錯(cuò)誤代碼、錯(cuò)誤性質(zhì)的描述.如果要獲得關(guān)于該錯(cuò)誤的詳細(xì)信息,一般可以根據(jù)編譯器給出的錯(cuò)誤代碼在其聯(lián)機(jī)幫助文檔中查找.習(xí)題1.14如果輸入值相等,本節(jié)展示的程序?qū)a(chǎn)生什么問(wèn)題?【解答】sum的值即為輸入值.因?yàn)檩斎氲膙l和v2值相等(假設(shè)為x),所以|ower和upper相等,均為x.for循環(huán)中的循環(huán)變量val初始化為lower,從而val<=upper為真,循環(huán)體執(zhí)行一次,sum的值為val(即輸入值x);然后val加1,val的值就大于upper,循環(huán)執(zhí)行結(jié)束.習(xí)題1.15用兩個(gè)相等的值作為輸入編譯并運(yùn)行本節(jié)中的程序.將實(shí)際輸出與你在習(xí)題1.14中所做的預(yù)測(cè)相比較,解釋實(shí)際結(jié)果和你預(yù)計(jì)的結(jié)果間的不相符之處.【解答】運(yùn)行1.4.3節(jié)中給出的程序,輸入兩個(gè)相等的值(例如3,3),則程序輸出為:Sumof3to3inclusiveis3與習(xí)題1.14中給出的預(yù)測(cè)一致.習(xí)題1.16編寫(xiě)程序,輸出用戶輸入的兩個(gè)數(shù)中的較大者.【解答】#include<iostream>intmain()(std::cout<<"Entertwonumbers:"<<std::endl;intvl,v2;std::cin>>vl>>v2;〃讀入數(shù)據(jù)if(vl>=v2)std::cout<<"Thebiggernumberis"<<vl<<std::endl;elsestd::cout<<"Thebiggernumberis"<<v2<<std::endl;return0;}習(xí)題!.17編寫(xiě)程序,要求用戶輸入ー組數(shù).輸出信息說(shuō)明其中有多少個(gè)負(fù)數(shù).【解答】#include<iostream>intmain()(intamount=0,value;〃讀入數(shù)據(jù)直到遇見(jiàn)文件結(jié)束符,計(jì)算所讀入的負(fù)數(shù)的個(gè)數(shù)

while(std::cin>>value)if(value<=0)++amount;std::cout<<"Amountofallnegativevaluesreadis"<<amount<<std::endl;return0;}習(xí)題1.18編寫(xiě)程序,提示用戶輸入兩個(gè)數(shù)并將這兩個(gè)數(shù)范圍內(nèi)的每個(gè)數(shù)寫(xiě)到標(biāo)準(zhǔn)輸出?!窘獯稹?include<iostream>intmain(){std::cout<<"Entertwonumbers:"<<std::endl;intvl,v2;std::cin>>vl>>v2;〃讀入兩個(gè)數(shù)/Z用較小的數(shù)作為下界lower.較大的數(shù)作為上界upperintlower,upper;if(vl<=v2){lower=vl;upper=v2;}else{lower=v2;upper=vl;)/Z輸出從lower到upper之間的值std::cout<<"Valuesof"<<lower<<"to"<<upper<<"inclusiveare:"<<std::endl;for(intval=lower;val<=upper;++val)std::cout<<val<<"";return0;)習(xí)題1.19如果上題給定數(shù)1000和2000,程序?qū)a(chǎn)生什么結(jié)果?修改程序,使每一行輸出不超過(guò)10個(gè)數(shù)?!窘獯稹克袛?shù)的輸出連在ー起,不便于閱讀。程序修改如下:#include<iostream>intmainQstd::cout<<"Entertwonumbers:"<<std::endl;intvl,v2;std::cin>>vl>>v2;〃讀入兩個(gè)數(shù)/Z用較小的數(shù)作為下界lower.較大的數(shù)作為上界upperintlower,upper;if(vl<=v2){lower=vl;upper=v2;}else{lower=v2;upper=vl;}/Z輸出從lower至!Iupper之間的值std::cout<<"Valuesof"<<lower<<"to"<<upper<<"inclusiveare:"<<std::endl;for(intval=lower,count=l;val<=upper;++val,++count){std::cout<<val<<"";if(count%10ニ=0)〃每行輸出10個(gè)值std::cout<<std::endl;}return0;}粗黑體部分為主要的修改:用變量count記錄已輸出的數(shù)的個(gè)數(shù);若count的值為!0的整數(shù)倍,則輸出ー個(gè)換行符。習(xí)題1.20編寫(xiě)程序,求用戶指定范圍內(nèi)的數(shù)的和,省略設(shè)置上界和下界的if測(cè)試。假定輸入數(shù)是フ和3,按照這個(gè)JI質(zhì)序,預(yù)測(cè)程序運(yùn)行結(jié)果。然后按照給定的數(shù)是7和3運(yùn)行程序,看結(jié)果是否與你預(yù)測(cè)的相符。如果不相符,反復(fù)研究關(guān)于for和while循環(huán)的討論直到弄清楚其中的原因?!窘獯稹靠删帉?xiě)程序如下://l-20.cpp//省略設(shè)置上界和下界的if測(cè)試,求用戶指定范圍內(nèi)的數(shù)的和#include<iostream:>intmain()(std::cout<<"Entertwonumbers:"<<std::endl;intvl,v2;intsum=0;std::cin>>vl>>v2;〃intsum=0;/Z求和for(intval=vl;val<=v2;++val)sum+=val;//sum=sum+valstd::cout<<"Sumof"<<vl<<"to"<<v2<<"inclusiveis"<<sum<<std::endl;return0;}如果輸入數(shù)據(jù)為7和3,則vl值為フ,v2值為3。for語(yǔ)句頭中將val的初始值設(shè)為フ第一次測(cè)試表達(dá)式val<=v2時(shí)該表達(dá)式的值為falsefor語(yǔ)句的循環(huán)體ー次也不執(zhí)行,所以求和結(jié)果sum為〇。習(xí)題1.21本書(shū)配套網(wǎng)站(/cpp_primer)的第1章的代碼目錄下有Sales_item.h源文件。復(fù)制該文件到你的工作目錄。編寫(xiě)程序,循環(huán)遍歷ー組書(shū)的銷(xiāo)售交易,讀入每筆交易并將交易寫(xiě)至標(biāo)準(zhǔn)輸出?!窘獯稹?include<iostream>#include"Salesjtem.h"intmain(){Salesjtembook;/Z讀入ISBN,售出書(shū)的本數(shù),銷(xiāo)售價(jià)格std::cout<<"Entertransactions:"<<std::endl;while(std::cin>>book)(/Z輸出ISBN,售出書(shū)的本數(shù),總收入,平均價(jià)格std::cout<<"ISBN,numberofcopiessold,"<<"totalrevenue,andaveragepriceare:"<<std::endl;std::cout<<book<<std::endl;)return0;)習(xí)題!.22編寫(xiě)程序,讀入兩個(gè)具有相同ISBN的Salesjtem對(duì)象并產(chǎn)生它們的和。【解答】#include<iostream>#include"Salesjtem.h"intmain(){Salesjtemtransl,trans2;〃讀入交易std::cout<<"Entertwotransactions:"<<std::endl;std::cin>>transl>>trans2;if(transl.same_isbn(trans2))std::cout<<"Thetotalinformation:"<<std::endl<<"ISBN,numberofcopiessold,"<<"totalrevenue,andaveragepriceare:"<<std::endl<<transl+trans2;elsestd::cout<<"ThetwotransactionshavedifferentISBN."<<std::endl;return0;}習(xí)題1.23編寫(xiě)程序,讀入幾個(gè)具有相同ISBN的交易,輸出所有讀入交易的和?!窘獯稹?include<iostream>#include"Salesjtem.h"intmain()(Salesjtemtotal,trans;/Z讀入交易std::cout<<"Entertransactions:"<<std::endl;if(std::cin>>total){while(std::cin>>trans)if(total.samejsbn(trans))//ISBN相同total=total+trans;else{//ISBN不同std::cout<<"DifferentISBN."<<std::endl;return-1;}/Z輸出交易之和std::cout<<"Thetotalinformation:"<<std::endl<<"ISBN,numberofcopiessold,"<<"totalrevenue,andaveragepriceare:"<<std::endl<<total;}else{std::cout<<"Nodata?!"<<std::endl;return-1;)return0;)習(xí)題1.24編寫(xiě)程序,讀入幾筆不同的交易.對(duì)于每筆新讀入的交易,要確定它的ISBN是否和以前的交易的ISBNー樣,并且記下每一個(gè)ISBN的交易的總數(shù).通過(guò)給定多筆不同的交易來(lái)測(cè)試程序.這些交易必須代表多個(gè)不同的ISBN,但是每個(gè)ISBN的記錄應(yīng)分在同一組.【解答】#include<iostream>#include"Sales_item.h"intmainQ{//聲明變量以保存交易記錄以及具有相同ISBN的交易的數(shù)目Salesjtemtransl,trans2;intamount;/Z讀入交易std::cout<<"Entertransactions:"<<std::endl;std::cin>>transl;amount=l;while(std::cin>>trans2)if(transl.same_isbn(trans2))//ISBN相同++amount;else{//ISBN不同std::cout<<"TransactionamountofpreviousISBN:'<<amount<<std::endl;transl=trans2;amount=l;)/Z輸出最后ー個(gè)ISBN的交易數(shù)目std::cout<<"TransactionamountofthelastISBN:"<<amount<<std::endl;return0;)習(xí)題1.25使用源自本書(shū)配套網(wǎng)站的Sales_item.h頭文件,編譯并執(zhí)行L6節(jié)給出的書(shū)店程序.【解答】可從C++Primer(第4版)的配套網(wǎng)站(/cpp_primer)下載頭文件Sales_item.h,然后使用該頭文件編譯并執(zhí)行1.6節(jié)給出的書(shū)店程序.習(xí)題1.26在書(shū)店程序中,我們使用了加法操作符而不是復(fù)合賦值操作符將trans加到total中,為什么我們不使用復(fù)合賦值操作符?【解答】因?yàn)樵?.5.1節(jié)中提及的Salesjtem對(duì)象上的操作中只包含了+和=,沒(méi)有包含+=操作.(但事實(shí)上,使用Sales_item.h文件,已經(jīng)可以用+=操作符取代=和+操作符的復(fù)合使用.)第二章變量和基本類型習(xí)題2.1intxlong和short類型之間有什么差別?【解答】它們的最小存儲(chǔ)空間不同,分別為16位、32位和16位.一般而言,short類型為半個(gè)機(jī)器字(word)長(zhǎng),int類型為一個(gè)機(jī)器字長(zhǎng),而!ong類型為一個(gè)或兩個(gè)機(jī)器字長(zhǎng)(在32位機(jī)器中,int類型和long類型的字長(zhǎng)通常是相同的X因此,它們的表示范圍不同.習(xí)題2.2unsigned和signed類型有什么差別?【解答】前者為無(wú)符號(hào)類型,只能表示大于或等于〇的數(shù).后者為帶符號(hào)類型,可以表示正數(shù)、負(fù)數(shù)和0.習(xí)題2.3如果在某機(jī)器上short類型占16位,那么可以賦給short類型的最大數(shù)是什么?unsignedshort類型的最大數(shù)又是什么?【解答】若在某機(jī)器上short類型占16位那么可以賦給short類型的最大數(shù)是215-1I即32767;而unsignedshort類型的最大數(shù)為216-1I即65535.習(xí)題2.4當(dāng)給!6位的unsignedshort對(duì)象賦值!00000時(shí),賦的值是什么?【解答】34464.100000超過(guò)了16位的unsignedshort類型的表示范圍,編譯器對(duì)其二進(jìn)制表示截取低16位,相當(dāng)于對(duì)65536求余(求模,%),得34464.習(xí)題2.5float類型和double類型有什么差別?【解答】二者的存儲(chǔ)位數(shù)不同(一般而言,float類型為32個(gè)二逬制位(double類型為64個(gè)二進(jìn)制位),因而取值范圍不同,精度也不同(float類型只能保證6位有效數(shù)字,而double類型至少能保證10位有效數(shù)字I習(xí)題2.6要計(jì)算抵押貸款的償還金額,利率、本金和付款額應(yīng)分別選用哪種類型?解釋你選擇的理由?!窘獯稹坷士梢赃x擇float類型,因?yàn)槔释ǔ榘俜种畮?一般只保留到小數(shù)點(diǎn)后兩位,所以6位有效數(shù)字就足以表示了.本金可以選擇long類型,因?yàn)楸窘鹜ǔ檎麛?shù)。long類型可表示的最大整數(shù)一般為231-1(即2147483647),應(yīng)該足以表示了。付款額一般為實(shí)數(shù),可以選擇double類型,因?yàn)閒loat類型的6位有效數(shù)字可能不足以表示。習(xí)題2.7解釋下列字面值常量的不同之處。'a',L'a7a,,L*a,10,10u,10L,10uL,012,0xC3.14,3.14f,3.14L【解答】'a'.L'a'."aM'a''a為char型字面值,L'a為wchar_t型字面值,*a”為字符串字面值,ビa”為寬字符串字面值。10,10u,10L,10uL,012,0xC10為int型字面值,10u為unsigned型字面值,10L為long型字面值,10uL為unsignedlong型字面值012為ハ逬制表示的int型字面值,0xC為十六逬制表示的int型字面值。3.14,3.14f,3.14L3.14為double型字面值314f為float型字面值3.14L為!ongdouble型字面值.習(xí)題2.8確定下列字面值常量的類型:-10(b)-10u(c)-10.(d)-10e-2【解答】⑶int型unsignedint型double型double型習(xí)題2.9下列哪些(如果有)是非法的?"WhogoeswithF\145rgus?\012'3.14elL(c)"two"L"some"1024f(e)3.14UL(f)"multiplelinecomment"【解答】(c)非法.因?yàn)樽址置嬷蹬c寬字符串字面值的連接是未定義的.(d)非法.因?yàn)檎麛?shù)1024后面不能帶后綴f.(e)非法.因?yàn)楦↑c(diǎn)字面值不能帶后綴U.(f)非法.因?yàn)榉謨尚袝?shū)寫(xiě)的字符串字面值必須在第一行的末尾加上反斜線.習(xí)題2.10使用轉(zhuǎn)義字符編寫(xiě)一段程序,輸出2M,然后換行.修改程序,輸出2,跟著ー個(gè)制表符,然后是M,最后是換行符.【解答】輸出2M、然后換行的程序段:/Z輸出“2M"和換行字符std::cout<<"2M"<<'\n';修改后的程序段:/Z輸出2,'\t','M'和換行字符std::cout<<'2'<<'\t'<<'M'<<'\n';習(xí)題2.11編寫(xiě)程序,要求用戶輸入兩個(gè)數(shù)——底數(shù)(base)和指數(shù)(exponent),輸出底數(shù)的指數(shù)次方的結(jié)果.【解答】#include<iostream>intmain()(/Z局部對(duì)象intbase,exponent;longresult=l;/Z讀入底數(shù)(base)和指數(shù)(exponent)std::cout<<"Enterbaseandexponent:"<<std::endl;std::cin>>base>>exponent;if(exponent<0){std::cout<<"Exponentcan'tbesmallerthan0"<<std::endl;return-1;)if(exponent>0){〃計(jì)算底數(shù)的指數(shù)次方for(intent=1;ent<=exponent;++cnt)result*=base;}std::cout<<base<<"raisedtothepowerof"<<exponent<<":"<<result<<std::endl;return0;)習(xí)題2.12區(qū)分左值和右值,并舉例說(shuō)明.【解答】左值(lvalue)就是變量的地址,或者是ー個(gè)代表"對(duì)象在內(nèi)存中的位置”的表達(dá)式.右值(rvalue)就是變量的值,見(jiàn)2.3.1節(jié).變量名出現(xiàn)在賦值運(yùn)算符的左邊,就是ー個(gè)左值;而出現(xiàn)在賦值運(yùn)算符右邊的變量名或字面常量就是ー個(gè)右值.例如:vall=val2/8這里的vail是個(gè)左值,而val2和8都是右值.習(xí)題2.13舉出ー個(gè)需要左值的例子.【解答】賦值運(yùn)算符的左邊(被賦值的對(duì)象)需要左值,見(jiàn)習(xí)題2.12.習(xí)題2.14下面哪些(如果有)名字是非法的?更正每個(gè)非法的標(biāo)識(shí)符名字.(a)intdouble=3.14159;(b)charj(c)boolcatch-22;(d)charl_or_2='l';floatFloat=3.14f;【解答】⑶double是C++語(yǔ)言中的關(guān)鍵字,不能用作用戶標(biāo)識(shí)符,所以非法.此語(yǔ)句可改為:doubledval=3.14159;.(c)名字catch-22中包含在字母、數(shù)字和下劃線之外的字符"-",所以非法.可將其改為:catch_22;.(d)名字l_or_2非法,因?yàn)闃?biāo)識(shí)符必須以字母或下劃線開(kāi)頭,不能以數(shù)字開(kāi)頭.可將其改為:one_or_two;.習(xí)題2.15下面兩個(gè)定義是否不同?有何不同?intmonth=9,day=7;intmonth=09,day=07;如果上述定義有錯(cuò)的話,那么應(yīng)該怎樣改正呢?【解答】這兩個(gè)定義不同.前者定義了兩個(gè)int型變量,初值分別為9和7;后者也定義了兩個(gè)int型變量,其中day被初始化為ハ進(jìn)制值7;而month的初始化有錯(cuò):試圖將month初始化為ハ進(jìn)制值09,但ハ進(jìn)制數(shù)字范圍為〇?7,所以出錯(cuò).可將第二個(gè)定義改為:intmonth=011,day=07;習(xí)題2.16假設(shè)calc是ー個(gè)返回double對(duì)象的函數(shù).下面哪些是非法定義?改正所有的非法定義.intcar=1024,auto=2048;intival=ival;std::cin>>intinput_value;doublesalary=wage=9999.99;doublecalc=calc();【解答】(a)非法:auto是關(guān)鍵字,不能用作變量名.使用另ー變量名,如aut即可更正.(c)非法:>>運(yùn)算符后面不能進(jìn)行變量定義.改為:intinput_value;std::cin>>input_value;(d)非法:同一定義語(yǔ)句中不同變量的初始化應(yīng)分別進(jìn)行.改為:doublesalary=9999.99,wage=9999.99;注意,(b)雖然語(yǔ)法上沒(méi)有錯(cuò)誤,但這個(gè)初始化沒(méi)有實(shí)際意義,ival仍是未初始化的.習(xí)題2.17下列變量的初始值(如果有)是什么?std::stringglobal_str;intglobaljnt;intmain()(intlocaljnt;std::stringlocal_str;II...return0;)【解答】global_str和local_str的初始值均為空字符串globaljnt的初始值為〇,local_int沒(méi)有初始值.習(xí)題2.18解釋下列例子中name的意義:externstd::stringname;std::stringname("exercise3.5a");externstd::stringname('exercise3.5a");【解答】第一條語(yǔ)句是ー個(gè)聲明,說(shuō)明std::string變量name在程序的其他地方定義。第二條語(yǔ)句是一個(gè)定義,定義了std::string變量name併將name初始化為"exercise3.5a".第三條語(yǔ)句也是ー個(gè)定義,定義了std::string變量name,并將name初始化為“exercise3.5a",但這個(gè)語(yǔ)句只能出現(xiàn)在函數(shù)外部(即,name是ー個(gè)全局變量X習(xí)題2.19下列程序中j的值是多少?inti=42;intmainO{inti=100;intj=i;II...)【解答】j的值是!00.j的賦值所使用到的i應(yīng)該是main函數(shù)中定義的局部變量!,因?yàn)榫植孔兞康亩x會(huì)屏蔽全局變量的定義.習(xí)題2.20下列程序段將會(huì)輸出什么?inti=100,sum=0;for(inti=0;i!=10;++i)sum+=i;std::cout<<i<<""<<sum<<std::endl;【解答】輸出為:10045for語(yǔ)句中定義的變量i,其作用域僅限于for語(yǔ)句內(nèi)部.輸出的i值是for語(yǔ)句之前所定義的變量i的值.習(xí)題2.21下列程序合法嗎?intsum=0;for(inti=0;i!=10;++i)sum+=i;std::cout<<"Sumfrom0to"<<i<<°is"<<sum<<std::endl;【解答】不合法.因?yàn)樽兞縤具有語(yǔ)句作用域,只能在for語(yǔ)句中使用,輸出語(yǔ)句中使用i屬非法.習(xí)題2.22下列程序段雖然合法,但是風(fēng)格很糟糕.有什么問(wèn)題呢?怎樣改善?for(inti=0;i<100;++i)//processi【解答】問(wèn)題主要在于使用了具體值100作為循環(huán)上界:100的意義在上下文中沒(méi)有體現(xiàn)出來(lái),導(dǎo)致程序的可讀性差;若100這個(gè)值在程序中出現(xiàn)多次,則當(dāng)程序的需求發(fā)生變化(如將100改變?yōu)?00)時(shí),對(duì)程序代碼的修改復(fù)雜且易出錯(cuò),導(dǎo)致程序的可維護(hù)性差.改善方法:設(shè)置ー個(gè)const變量(常量)取代100作為循環(huán)上界使用,并為該變量選擇有意義的名字.習(xí)題2.23下列哪些語(yǔ)句合法?對(duì)于那些不合法的使用,解釋原因.constintbuf;intent=0;constintsz=ent;cnt++;sz++;【解答】(a)不合法.因?yàn)槎xconst變量(常量)時(shí)必須進(jìn)行初始化,而buf沒(méi)有初始化.(b)合法.(c)不合法.因?yàn)樾薷牧薱onst變量S2的值.習(xí)題2.24下列哪些定義是非法的?為什么?如何改正?(a)intival=1.01;(b)int&rvall=1.01;(c)int&rval2=ival;(d)constint&rval3=1;【解答】(b)非法.因?yàn)閞vall是ー個(gè)非const引用,非const引用不能綁定到右值而1.01是ー個(gè)右值.可改正為int&rvall=ival;(假設(shè)iva!是一個(gè)已定義的int變量!習(xí)題2.25在習(xí)題2.24給出的定義下,下列哪些賦值是非法的?如果賦值合法,解釋賦值的作用.(a)rval2=3.14159;(b)rval2=rval3;(c)ival=rval3;(d)rval3=ival;【解答】(d)非法.因?yàn)閞val3是一個(gè)const引用,不能進(jìn)行賦值.合法賦值的作用:(a)將一個(gè)double型字面值賦給int型變量ival,發(fā)生隱式類型轉(zhuǎn)換,ival得到的值為3.(b)將int值1賦給變量ival.(c)將int值!賦給變量ival.習(xí)題2.26(a)中的定義和(b)中的賦值存在哪些不同?哪些是非法的?intival=0;(b)ival=ri;constint&ri=0;ri=ival;【解答】intival=0;定義iva!為int變量,并將其初始化為0.constint&ri=0;定義ri為const引用,并將其綁定到右值〇.ival=ri;將0值賦給ival.ri=ival;試圖對(duì)ri賦值,這是非法的,因?yàn)閞i是const引用,不能賦值.習(xí)題2.27下列代碼輸出什么?inti,&ri=i;i=5;ri=10;std::cout<<i<<""<<ri<<std::endl;【解答】輸出:1010ri是i的引用,對(duì)ri進(jìn)行賦值,實(shí)際上相當(dāng)于對(duì)i進(jìn)行賦值,所以輸出i和ri的值均為10。習(xí)題2.28編譯以下程序,確定你的編譯器是否會(huì)警告遺漏了類定義后面的分號(hào)。classFoo{//empty}//Note:nosemicolonintmain()(return0;}如果編譯器的診斷結(jié)果難以理解,記住這些信息以備后用?!窘獯稹吭诠P者所用的編譯器中編譯上述程序,編譯器會(huì)給出如下錯(cuò)誤信息:errorC2628:'Foo'followedby'int'isillegal(didyouforgetaソ?)(第4行)warningC4326:returntypeof'main'shouldbe'intorvoid'insteadof'Foo'(第5行)errorC2440:'return':cannotconvertfrom'int'to'Foo'(第6行)也就是說(shuō),該編譯器會(huì)對(duì)遺漏了類定義后面的分號(hào)給出提ホ〇習(xí)題2.29區(qū)分類中的public部分和private部分?!窘獯稹款愔衟ublic部分定義的成員在程序的任何部分都可以訪問(wèn)。通常在public部分放置操作,以便程序中的其他部分可以執(zhí)行這些操作。類中private部分定義的成員只能被作為類的組成部分的代碼(以及該類的友元)訪問(wèn)。通常在private部分放置數(shù)據(jù),以對(duì)對(duì)象的內(nèi)部數(shù)據(jù)進(jìn)行隱藏。習(xí)題2.30定義表示下列類型的類的數(shù)據(jù)成員:(a)電話號(hào)碼(b)地址(c)員エ或公司(d)夢(mèng)芭莎優(yōu)惠券網(wǎng)里面的文章【解答】(a)電話號(hào)碼classTel_number{public:〃…對(duì)象上的操作private:std::stringcountry.number;std::stringcity_number;std::stringphone_number;);ifetitclassAddress{public:〃…對(duì)象上的操作private:std::stringcountry;std::stringcity;std::stringstreet;std::stringnumber;};(c)員工或公司classEmployee{public:〃…對(duì)象上的操作private:std::stringID;std::stringname;charsex;Addressaddr;Tel_numbertel;);classCompany{public:〃…對(duì)象上的操作private:std::stringname;Addressaddr;Tel_numbertel;};(d)某大學(xué)的學(xué)生classStudent{public:〃…對(duì)象上的操作private:std::stringID;std::stringname;charsex;std::stringdept;/Z所在系std::stringmajor;Addresshome_addr;Tel_numbertel;};注意,在不同的具體應(yīng)用中,類的設(shè)計(jì)會(huì)有所不同,這里給出的只是一般性的簡(jiǎn)單例子。習(xí)題2.31判別下列語(yǔ)句哪些是聲明,哪些是定義,請(qǐng)解釋原因。externintix=1024;intiy;externintiz;externconstint&ri;【解答】⑶是定義,因?yàn)閑xtern聲明進(jìn)行了初始化。(b)是定義,變量定義的常規(guī)形式。⑹是聲明,extern聲明的常規(guī)形式。(d)是聲明,聲明了一個(gè)const弓|用。習(xí)題2.32下列聲明和定義哪些應(yīng)該放在頭文件中?哪些應(yīng)該放在源文件中?請(qǐng)解釋原因。intvar;constdoublepi=3.1416;externinttotal=255;constdoublesq2=squt(2.0);【解答】(a)、(c)、(d)應(yīng)放在源文件中,因?yàn)?a)和(c)是變量定義,定義通常應(yīng)放在源文件中。(d)中的const變量sq2不是用常量表達(dá)式初始化的,所以也應(yīng)該放在源文件中。(b)中的const變量pi是用常量表達(dá)式初始化的,應(yīng)該放在頭文件中。參見(jiàn)2.9.1節(jié)。習(xí)題2.33確定你的編譯器提供了哪些提高警告級(jí)別的選項(xiàng)。使用這些選項(xiàng)重新編譯以前選擇的程序,查看是否會(huì)報(bào)告新的問(wèn)題?!窘獯稹吭诠P者所用的編譯器(MicrosoftVisualC++.NET2003)中,在Project菜單中選擇Properties菜單項(xiàng),在Configurationproperties—C/C++—General-WarningLevel中可以選擇警告級(jí)別。第三章標(biāo)準(zhǔn)庫(kù)類型習(xí)題3.1用適當(dāng)?shù)膗sing聲明,而不用std::前綴,訪問(wèn)標(biāo)準(zhǔn)庫(kù)中的名字,重新編寫(xiě)2.3節(jié)的程序,計(jì)算ー給定數(shù)的給定次鬲的結(jié)果?!窘獯稹?include<iostream>usingstd::cin;usingstd::cout;intmain()(/Z局部對(duì)象intbase,exponent;longresult=l;/Z讀入底數(shù)和指數(shù)cout<<"Enterbaseandexponent:"<<endl;cin>>base>>exponent;if(exponent<0){cout<<"Exponentcan'tbesmallerthan0"<<endl;return-1;}if(exponent>0){〃計(jì)算底數(shù)的指數(shù)次方for(intent=1;ent<=exponent;++cnt)result*=base;)cout<<base<<"raisedtothepowerof"<<exponent"<<result<<endl;return0;)習(xí)題3.2什么是默認(rèn)構(gòu)造函數(shù)?【解答】默認(rèn)構(gòu)造函數(shù)(defaultconstructor)就是在沒(méi)有顯式提供初始化式時(shí)調(diào)用的構(gòu)造函數(shù)。它由不帶參數(shù)的構(gòu)造函數(shù),或者為所有形參提供默認(rèn)實(shí)參的構(gòu)造函數(shù)定義.如果定義某個(gè)類的變量時(shí)沒(méi)有提供初始化式,就會(huì)使用默認(rèn)構(gòu)造函數(shù)。如果用戶定義的類中沒(méi)有顯式定義任何構(gòu)造國(guó)數(shù),編譯器就會(huì)自動(dòng)為該類生成默認(rèn)構(gòu)造函數(shù),稱為合成的默認(rèn)構(gòu)造函數(shù)(synthesizeddefaultconstructor1習(xí)題3.3列舉出三種初始化string對(duì)象的方法?!窘獯稹?1)不帶初始化式,使用默認(rèn)構(gòu)造函數(shù)初始化stringヌ撿。⑵使用ー個(gè)已存在的stringヌ域作為初始化式,將新創(chuàng)建的string對(duì)象初始化為已存在ヌ寸象的副本。(3)使用字符串字面值作為初始化式,將新創(chuàng)建的string對(duì)象初始化為字符串字面值的副本。習(xí)題3.4s和s2的值分別是什么?strings;intmain(){strings2;}【解答】s和s2的值均為空字符串.習(xí)題3.5編寫(xiě)程序?qū)崿F(xiàn)從標(biāo)準(zhǔn)輸入每次讀入一行文本。然后改寫(xiě)程序,每次讀入ー個(gè)單詞.【解答】〃從標(biāo)準(zhǔn)輸入每次讀入一行文本#include<iostream>#include<string>usingnamespacestd;intmain()(stringline;/Z一次讀入一行,直至遇見(jiàn)文件結(jié)束符while(getline(cin,line))cout<<line<<endI;/Z輸出相應(yīng)行以進(jìn)行驗(yàn)證return0;}修改后程序如下:〃從標(biāo)準(zhǔn)輸入每次讀入一個(gè)單詞#include<iostream>#include<string>usingnamespacestd;intmain()stringword;stringword;/Z一次讀入一個(gè)單詞,直至遇見(jiàn)文件結(jié)束符while(cin>>word)cout<<word<<endl;I!輸出相應(yīng)單詞以進(jìn)行驗(yàn)證return0;)注意,一般而言,應(yīng)該盡量避免使用using指示而使用using聲明(參見(jiàn)!7.2.4節(jié)),因?yàn)槿绻麘?yīng)用程序中使用了多個(gè)庫(kù),使用using指示引入這些庫(kù)中定義的名字空間,容易導(dǎo)致名字沖突。但本書(shū)中的程序都只使用了標(biāo)準(zhǔn)庫(kù),沒(méi)有使用其他庫(kù)。使用using指示引入名字空間std中定義的所有名字不會(huì)發(fā)生名字沖突。因此為了使得代碼更為簡(jiǎn)潔以節(jié)省篇幅,本書(shū)的許多代碼中都使用了using指小usingnamespacestd;來(lái)引入名字空間std0另外,本題中并未要求輸出,加入輸出是為了更清楚地表示讀入的結(jié)果。本書(shū)后面部分有些地方與此類似處理,不再贅述。習(xí)題3.6解釋string類型的輸入操作符和getline函數(shù)分別如何處理空白字符?!窘獯稹縮tring類型的輸入操作符對(duì)空白字符的處理:讀取并忽略有效字符(非空白字符)之前所有的空白字符,然后讀取字符直至再次遇到空白字符,讀取終止(該空白字符仍留在輸入流中\(zhòng)getline函數(shù)對(duì)空白字符的處理:不忽略行開(kāi)頭的空白字符,讀取字符直至遇到換行符,讀取終止并丟棄換行符(換行符從輸入流中去掉但并不存儲(chǔ)在string對(duì)象中\(zhòng)習(xí)題3.7編一個(gè)程序讀入兩個(gè)string對(duì)象,測(cè)試它們是否相等。若不相等,則指出兩個(gè)中哪個(gè)較大。接著,改寫(xiě)程序測(cè)試它們的長(zhǎng)度是否相等,若不相等,則指出兩個(gè)中哪個(gè)較長(zhǎng)?!窘獯稹繙y(cè)試兩個(gè)string對(duì)象是否相等的程序:#include<iostream>#include<string>usingnamespacestd;intmain()(stringsi,s2;〃讀入兩個(gè)string對(duì)象cout<<"Entertwostrings:"<<endl;C++Primer(4版)習(xí)題解答41cin>>si>>s2;/Z測(cè)試兩個(gè)string對(duì)象是否相等if(si==s2)cout<<"Theyareequal."<<endl;elseif(si>s2)cout<<?ヽ""<<si<<"\"isbiggerthan"<"\""<<s2<<"\""<<endl;elsecout<<"\""<<s2<<"\"isbiggerthan"<"V"<<si<<"\""<<endl;return0;}測(cè)試兩個(gè)string對(duì)象的長(zhǎng)度是否相等的程序:#include<iostream>#include<string>usingnamespacestd;intmain()(stringsi,s2;/Z讀入兩個(gè)string對(duì)象cout<<"Entertwostrings:"<<endl;cin>>si>>s2;〃比較兩個(gè)string對(duì)象的長(zhǎng)度string::size_typelenl,Ien2;C++Primer(4版)習(xí)題解答42lenl=sl.size();Ien2=s2.size();if(lenl==Ien2)cout<<"Theyhavesamelength."<<endl;elseif(lenl>Ien2)cout<<"\""<<si<<"\"islongerthan"<"V"<<s2<<"\""<<endl;elsecout<<"\""<<s2<<"\"islongerthan"<<"V"<<si<<"V"<<endl;return0;}習(xí)題3.8編ー個(gè)程序,從標(biāo)準(zhǔn)輸入讀取多個(gè)stringヌ域,把它們連接起來(lái)存放到ー個(gè)更大的string對(duì)象中,并輸出連接后的stringヌ寸象。接著,改寫(xiě)程序,將連接后相鄰stringヌ域以空格隔開(kāi)?!窘獯稹?include<iostream>#include<string>usingnamespacestd;intmain(){stringresult_str,str;/Z讀入多個(gè)string對(duì)象并進(jìn)行連接C++Primer(4版)習(xí)題解答43cout<<"Enterstrings(Ctrl+Ztoend):"<<endl;while(cin>>str)result_str=result_str+str;/Z輸出連接后的string對(duì)象cout<<"Stringequaltotheconcatenationofthesestringsis:"<<endl<<result_str<<endl;return0;)改寫(xiě)后的程序:#include<iostream>#include<string>usingnamespacestd;intmainO{stringresult_str,str;〃讀入多個(gè)string對(duì)象并進(jìn)行連接cout<<"Enterstrings(Ctrl+Ztoend):"<<endl;cin>>result_str;〃讀入第一個(gè)string對(duì)象,放到結(jié)果對(duì)象中while(cin>>str)result_str=result_str+''+str;/Z輸出連接后的string對(duì)象cout<<"Stringequaltotheconcatenationofthesestringsis:"<<endl<<result.str<<endl;return0;C++Primer(4版)習(xí)題解答44}習(xí)題3.9下列程序?qū)崿F(xiàn)什么功能?實(shí)現(xiàn)合法嗎?如果不合法,說(shuō)明理由。strings;cout<<s[0]<<endl;【解答】該程序段輸出string對(duì)象s所對(duì)應(yīng)字符串的第一個(gè)字符。實(shí)現(xiàn)不合法。因?yàn)閟是ー個(gè)空字符串,其長(zhǎng)度為〇,因此s[0]是無(wú)效的。注意,在一些編譯器(如MicrosoftVisualC++.NET2003)的實(shí)現(xiàn)中,該程序段并不出現(xiàn)編譯錯(cuò)誤。習(xí)題3.10編ー個(gè)程序,從string對(duì)象中去掉標(biāo)點(diǎn)符號(hào)。要求輸入到程序的字符串必須含有標(biāo)點(diǎn)符號(hào),輸出結(jié)果則是去掉標(biāo)點(diǎn)符號(hào)后的string對(duì)象?!窘獯稹?include<iostream>#include<string>#include<cctype>usingnamespacestd;intmain(){strings,result_str;boolhas.punct=false;〃用于標(biāo)記字符串中有無(wú)標(biāo)點(diǎn)charch;〃輸入字符串C++Primer(4版)習(xí)題解答45cout<<"Enterastring:"<<endl;getline(cin,s);〃處理字符串:去掉其中的標(biāo)點(diǎn)for(string::size_typeindex=0;index!=s.size();++index)(ch=s[index];if(ispunct(ch))has_punct=true;elseresult,str+=ch;)if(has.punct)cout<<"Result:"<<endl<<result_str<<endl;else{cout<<"Nopunctuationcharacterinthestring?!"<<endl;return-1;}return0;}習(xí)題3.11下面哪些vector定義不正確?vector<vector<int>>ivec;vector<string>svec=ivec;vector<string>svec(10,"null");C++Primer(4版)習(xí)題解答46【解答】(b)不正確。因?yàn)閟vec定義為保存string對(duì)象的vector對(duì)象,而ivec是保存vector<int>對(duì)象的vector對(duì)象(即ivec是vector的vector)?二者的元素類型不同,所以不能用ivec來(lái)初始化svec。習(xí)題3.12下列每個(gè)vector對(duì)象中元素個(gè)數(shù)是多少?各元素的值是什么?vector<int>ivecl;vector<int>ivec2(10);vector<int>ivec3(10,42);vector<string>svecl;vector<string>svec2(10);vector<string>svec3(10,"hello");【解答】(a)元素個(gè)數(shù)為0.(b)元素個(gè)數(shù)為10,各元素的值均為〇。(c)元素個(gè)數(shù)為10,各元素的值均為42O(d)元素個(gè)數(shù)為〇。(e)元素個(gè)數(shù)為10,各元素的值均為空字符串。(f)元素個(gè)數(shù)為10,各元素的值均為"hello"。習(xí)題3.13讀ー組整數(shù)到vector對(duì)象,計(jì)算并輸出每對(duì)相鄰元素的和。如果讀入元素個(gè)數(shù)為奇數(shù),則提示用戶最后ー個(gè)元素沒(méi)有求和,并輸出其值。然后修改程序:頭尾元素兩兩配對(duì)(第一個(gè)和最后ー個(gè),第二個(gè)和倒數(shù)第二個(gè),以此類推),計(jì)算每對(duì)元素的和,并輸出?!窘獯稹俊ㄗxー組整數(shù)到vector對(duì)象,計(jì)算并輸出每對(duì)相鄰元素的和C++Primer(4版)習(xí)題解答47#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>ivec;intival;〃讀入數(shù)據(jù)到vector對(duì)象cout<<"Enternumbers(Ctrl+Ztoend):"<<endl;while(cin>>ival)ivec.push_back(ival);〃計(jì)算相鄰元素的和并輸出if(ivec.size()==0){cout<<"Noelement?!"<<endl;return-1;}cout<<"Sumofeachpairofadjacentelementsinthevector:"<<endl;for(vector<int>::size_typeix=0;ix<ivec.size()-l;ix=ix+2){cout<<ivec[ix]+ivec[ix+l]<<"\t";if((ix+l)%6==0)//每行輸出6個(gè)和cout<<endl;}C++Primer(4版)習(xí)題解答48if(ivec.size()%2!=0)//提示最后ー個(gè)元素沒(méi)有求和cout<<endl<<"Thelastelementisnotbeensummed"<<"anditsvalueis"<<ivec[ivec.size()-l]<<endl;return0;}修改后的程序:〃讀ー組整數(shù)到vector對(duì)象,計(jì)算首尾配對(duì)元素的和并輸出#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>ivec;intival;〃讀入數(shù)據(jù)至リvector對(duì)象cout<<"Enternumbers:"<<endl;while(cin>>ival)ivec.push_back(ival);〃計(jì)算首尾配對(duì)元素的和并輸出if(ivec.size()==0){cout<<"Noelement?!"<<endl;return-1;C++Primer(4版)習(xí)題解答49}cout<<"Sumofeachpairofcounterpartelementsinthevector:"<<endl;vector<int>::size_typeent=0;for(vector<int>::size_typefirst=0,last=ivec.size()-1;first<last;++first,—last){cout<<ivec[first]+ivec[last]<<"\t";++cnt;if(ent%6==0)〃每行輸出6個(gè)和cout<<endl;)if(first==last)〃提示居中元素沒(méi)有求和cout<<endl<<"Thecenterelementisnotbeensummed"<<"anditsvalueis"<<ivec[first]<<endl;return0;}習(xí)題3.14讀入一段文本到vector對(duì)象,每個(gè)單詞存儲(chǔ)為vector中的一個(gè)元素。把vector對(duì)象中每個(gè)單詞轉(zhuǎn)化為大寫(xiě)字母。輸出vectorヌ慘中轉(zhuǎn)化后的元素,每8個(gè)單詞為一行輸出?!窘獯稹俊ㄗx入一段文本到vector對(duì)象,每個(gè)單詞存儲(chǔ)為vector中的一^元素。C++Primer(4版)習(xí)題解答50〃把vector對(duì)象中每個(gè)單詞轉(zhuǎn)化為大寫(xiě)字母?!ㄝ敵鰒ector對(duì)象中轉(zhuǎn)化后的元素,每8個(gè)單詞為一行輸出#include<iostream>#include<string>#include<vector>#include<cctype>usingnamespacestd;intmain()(vector<string>svec;stringstr;/Z讀入文本到vector對(duì)象cout<<"Entertext(Ctrl+Ztoend):"<<endl;while(cin>>str)svec.push_back(str);〃將vector對(duì)象中每個(gè)單詞轉(zhuǎn)化為大寫(xiě)字母,并輸出if(svec.size()==0){cout<<"Nostring?!"<<endl;return-1;}cout<<"Transformedelementsfromthevector:"<<endl;for(vector<string>::size_typeix=0;ix!=svec.size();++ix){C++Primer(4版)習(xí)題解答51for(string::size_typeindex=0;index!=svec[ix].size();++index)if(islower(svec[ix][index]))〃單詞中下標(biāo)為index的字符為小寫(xiě)字母svec[ix][index]=toupper(svec[ix][index]);cout<<svec[ix]<<"";if((ix+1)%8==0)〃每8個(gè)單詞為一行輸出cout<<endl;}return0;}習(xí)題3.15下面程序合法嗎?如果不合法,如何更正?vector<int>ivec;ivec[O]=42;【解答】不合法。因?yàn)閕vec是空的vector對(duì)象,其中不含任何元素,而下標(biāo)操作只能用于獲取已存在的元素。更正:將賦值語(yǔ)句改為語(yǔ)句ivec.push_back(42);o習(xí)題3.16列出三種定義vectorヌ域的方法,給定10個(gè)元素,每個(gè)元素值為42。指出是否還有更好的實(shí)現(xiàn)方法,并說(shuō)明為什么?!窘獯稹糠椒ㄒ?vector<int>ivec(10,42);C++Primer(4版)習(xí)題解答52方法二:vector<int>ivec(10);for(ix=0;ix<10;++ix)ivec[ix]=42;方法三:vector<int>ivec(10);for(vector<int>::iteratoriter=ivec.begin();iter!=ivec.end();++iter)*iter=42;方法四:vector<int>ivec;for(ent=1;ent<=10;++cnt)ivec.push_back(42);方法五:vector<int>ivec;vector<int>::iteratoriter=ivec.end();for(inti=0;i!=10;++i){ivec.insert(iter,42);iter=ivec.endO;)各種方法都可達(dá)到目的,也許最后兩種方法更好一些。它們使用標(biāo)準(zhǔn)庫(kù)中定義的容器操作在容器中增添元素,無(wú)需在定義vector對(duì)象時(shí)指定容器的大小,比較靈活而且不容易出錯(cuò)。習(xí)題3.17C++Primer(4版)習(xí)題解答53重做3.3.2節(jié)的習(xí)題,用迭代器而不是下標(biāo)操作來(lái)訪問(wèn)vector中的元素?!窘獯稹恐刈隽?xí)題3.13如下:〃讀ー組整數(shù)到vector對(duì)象,計(jì)算并輸出每對(duì)相鄰元素的和〃使用迭代器訪問(wèn)vector中的元素#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>ivec;intival;〃讀入數(shù)據(jù)到vector對(duì)象cout<<"Enternumbers(Ctrl+Ztoend):"<<endl;while(cin>>ival)ivec.push_back(ival);〃計(jì)算相鄰元素的和并輸出if(ivec.size()==0){cout<<"Noelement?!"<<endl;return-1;}cout<<"Sumofeachpairofadjacentelementsinthevector:"<<endl;vector<int>::size_typeent=0;C++Primer(4版)習(xí)題解答54for(vector<int>::iteratoriter=ivec.begin();iter<ivec.end()-l;iter=iter+2){cout<<*iter+*(iter+l)<<"\t";++cnt;if(ent%6==0)〃每行輸出6個(gè)和cout<<endl;)if(ivec.sizeO%2!二〇)〃提示最后ー個(gè)元素沒(méi)有求和cout<<endl<<"Thelastelementisnotbeensummed"<<"anditsvalueis"<<*(ivec.endQ-l)<<endl;return0;)〃讀ー組整數(shù)到vector對(duì)象,計(jì)算首尾配對(duì)元素的和并輸出〃使用迭代器訪問(wèn)vector中的元素#include<iostream>#include<vector>usingnamespacestd;intmain()(vector<int>ivec;intival;C++Primer(4版)習(xí)題解答55〃讀入數(shù)據(jù)至リvectorヌ寸象cout<<"Enternumbers(Ctrl+Ztoend):"<<endl;while(cin>>ival)ivec.push_back(ival);〃計(jì)算首尾配對(duì)元素的和并輸出if(ivec.size()==0){cout<<"Noelement?!"<<endl;return-1;}cout<<"Sumofeachpairofcounterpartelementsinthevector:"<<endl;vector<int>::size_typecnt=0;for(vector<int>::iteratorfirst=ivec.begin(),last=ivec.endO-1;first<last;++first,—last){cout<<*first+*last<<"\t";++cnt;if(ent%6==0)〃每行輸出6個(gè)和cout<<endl;)if(first==last)〃提示居中元素沒(méi)有求和cout<<endl<<"Thecenterelementisnotbeensummed"C++Primer(4版)習(xí)題解答56<<"anditsvalueis"<<*first<<endl;return0;重做習(xí)題3.14如下:〃讀入一段文本到vector對(duì)象,每個(gè)單詞存儲(chǔ)為vec

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論