版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C++Primerthe4thedition
習(xí)題1.1
查看所用的編譯器文檔,了解它所用的文件命名規(guī)范。編譯并運(yùn)行本節(jié)的main
程序。
【解答】
一般而言,C++編譯器要求待編譯的程序保存在文件中。C++程序中一般涉及兩
類文件:頭文件和源文件。大多數(shù)系統(tǒng)中,文件的名字由文件名和文件后綴(又
稱擴(kuò)展名)組成。文件后綴通常表明文件的類型,如頭文件的后綴可以是.h
或.hpp等;源文件的后綴可以是.cc或.cpp等,具體的后綴與使用的編譯器有
關(guān)。通??梢酝ㄟ^編譯器所提供的聯(lián)機(jī)幫助文檔了解其文件命名規(guī)范。
習(xí)題1.2
修改程序使其返回返回值-1通常作為程序運(yùn)行失敗的指示器。然而,系統(tǒng)
不同,如何(甚至是否)報(bào)告main函數(shù)運(yùn)行失敗也不同。重新編譯并再次運(yùn)行
程序,看看你的系統(tǒng)如何處理main函數(shù)的運(yùn)行失敗指示器。
【解答】
筆者所使用的Windows操作系統(tǒng)并不報(bào)告main函數(shù)的運(yùn)行失敗,因此,程序返
回-1或返回0在運(yùn)行效果上沒有什么區(qū)別。但是,如果在DOS命令提示符方式
下運(yùn)行程序,然后再鍵入echo%ERRORLEVEL%命令,則系統(tǒng)會顯示返回值-1。
習(xí)題1.3
編一個程序,在標(biāo)準(zhǔn)輸出上打印“Hello,World'o
#include<iostream>
#include"windows.h"
usingnamespacestd;
intmainO
{system("CLSH);
cout?"Hcllo,World!"?cndl;
return0;
習(xí)題1.4
我們的程序利用內(nèi)置的加法操作符“+”來產(chǎn)
生兩個數(shù)的和。編寫程序,使用乘
法操作符“木”產(chǎn)生兩個數(shù)的積。
#include<iostream>
#include"windows.h"
usingnamespacestd;
intmain()
{system("CLSM);
cout?"Entertwonumbers:n?endl;
intvl,v2;
cin?vl?v2;
cout?',rrheproductot"?vl?"and',?v2?"is"?vl*v2?endl;
return0;
習(xí)題1.5
我們的程序使用了一條較長的輸出語句。重寫程序,使用單獨(dú)的語句打印每一
個操作數(shù)。
#include<iostream>
#include"windows.h"
usingnamespacestd;
inimain()
(
system("CLS");
cout?"Entertwonumbers:"?endl;
intvl,v2;
cin?vl?v2;
cout?"Thesumofu;
cout?vl;
cout?"and
cout?v2;
cout?"is”;
cout?vl+v2;
cout?endl;
return0;
}習(xí)題L6
解釋下面的程序段:
std::cout?”Thesumof”<<vl;
<<"andz/?v2;
〃is〃?vl+v2
<<std::endl;
這段代碼合法嗎?如果合法,為什么?如果不合法,乂為什么?
【解答】
這段代碼不合法。
注意,第1、2、4行的末尾有分號,表示這段代碼包含三條語句,即第1、2行
各為一個語句,第3、4行構(gòu)成一個語句。“<<”為二元操作符,在第2、3兩
條語句中,第一個缺少左操作數(shù),因此不合法。
在第2、3行的開頭加上“std::cout",即可更正。
習(xí)題1.7
編譯有不正確嵌套注釋的程序。
[解答]
由注信對嵌套導(dǎo)致的編譯器錯誤信息通常令人迷惑。例如,在筆者所用的編譯
器中編譯1.3節(jié)中給出的帶有不正確嵌套注釋的程序:
^include<iostream>
/*
*commentpairs/**/cannotnest.
*cannotnest"isconsideredsourcecode,
*asistherestoftheprogram
*/
intmain()
return0;
編譯器會給出如下錯誤信息:
errorC2143:syntaxerror:missing'before'
errorC2501:'include':missingstorage-classortypespecifiers
warningC4138:'*/'foundoutsideofcomment(第6行)
errorC2143:syntaxerror:missing'before'{'(第8行)
errorC2447:'{':missingfunctionheader(old-styleformallist?)(第
8行)
習(xí)題1.8
指出下列輸出語句哪些(如果有?)是合法的。
std::cout?〃/*〃;
std::cout?〃*/〃;
std::cout?/*"*/〃*/;
預(yù)測結(jié)果,然后編譯包含上述三條語句的程序,檢查你的答案。糾正所遇到的
錯誤。
【解答】
第一條和第二條語句合法。
第三條語句中《操作符之后至第二個雙引號之前的部分被注釋掉了,導(dǎo)致“操
作符的右操作數(shù)不是一個完整的字符串,所以不合法。在分號之前加上一個雙
引號即可更正。
習(xí)題1.9
下列循環(huán)做什么?sum的最終值是多少?
intsum=0;
for(inti=-100;i<=100;++i)
sum+=i;
【解答】
該循環(huán)求TOOlOO之間所有整數(shù)的和(包括T00和100)。
sum的最終值是0。
習(xí)題1.10
用for循環(huán)編程,求從50~100的所有自然數(shù)的和。然后月while循環(huán)重寫該程
序。
【解答】
用for循環(huán)編寫的程序如下:
ttinclude<iostream>
#include"windows.h〃
intmain()
(
intsum-0;
system("CLS");
for(inti=50;i<=100;++i)
sum+=i;
std::cout?”Sumof50to100inclusiveis”
<<sum<<std::endl;
return0;
)
用while循環(huán)編寫的程序如下:
#include<iostream>
#include"windows.h〃
usingnamespacestd;
intmain()
(
intsum=O,i=50;
system("CLS");
while(i<=100)
(
sum+=i;
i++;
)
J
cout<</zSumof50to100inclusiveis〃<<sum<<endl;
return0;
)
習(xí)題1.11
用while循環(huán)編程,輸出10~0遞減的自然數(shù)。然后用for循環(huán)重寫該程序。
【解答】
用while循環(huán)編寫的程序如下:
#include<iostream>
#include"windows.h〃
usingnamespacestd:
intmain()
{inti=10;
system("CLS");
while(i>=0)
(
cout?i?z,
i—;
cout<<cndl;
return0;
)
用for循環(huán)編寫的程序如下:
#include<iostream>
#include"windows.h〃
usingnamespacestd;
intmain()
{system("CLS");
for(inLi-10;i>-0;i―)
(
cout?i?z,,z;
)
cout<<endl;
return0;
)
習(xí)題1.12
對比前面兩個習(xí)題中所寫的循環(huán)。兩種形式各有何優(yōu)缺點(diǎn)?
【解答】
在for循環(huán)中,循環(huán)控制變量的初始化和修改都放在語句頭部分,形式較簡潔,
且特別適用于循環(huán)次數(shù)已知的情況。在while循環(huán)中,循環(huán)控制變量的初始化
一?般放在while語句之前,循環(huán)控制變量的修改一般放在循環(huán)體中,形式上不
如for語句簡潔,但它比較適月于循環(huán)次數(shù)不易預(yù)知的情況(用某一條件控制
循環(huán))。兩種形式各有優(yōu)點(diǎn),但它們在功能上是等價的,可以相互轉(zhuǎn)換。
習(xí)題1.13
編譯器不同,理解其診斷內(nèi)容的難易程度也不同。編寫一些程序,包含本小節(jié)
“再談編譯”部分討論的那些營見錯誤。研究編譯器產(chǎn)生的信息,這樣你在編
譯更復(fù)雜的程序遇到這些信息時不會陌生。
[解答]
對于看序中出現(xiàn)的錯誤,編譯器通常會給出簡略的提示信息,包括錯誤出現(xiàn)的
文件及代碼行、錯誤代碼、錯誤性質(zhì)的描述。如果要獲得關(guān)于該錯誤的詳細(xì)信
息,一般可以根據(jù)編譯器給出的錯誤代碼在其聯(lián)機(jī)幫助文檔中查找。
習(xí)題1.14
如果輸入值相等,本節(jié)展示的程序?qū)a(chǎn)生什么問題?
【解答】
sum的值即為輸入值。因?yàn)檩斎氲膙l和v2值相等(假設(shè)為X),所以lower和
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
用兩個相等的值作為輸入編譯并運(yùn)行本節(jié)中的程序。將實(shí)際輸出與你在習(xí)題
1.14中所做的預(yù)測相比較,解釋實(shí)際結(jié)果和你預(yù)計(jì)的結(jié)兵間的不相符之處。
[解答]
運(yùn)行;4.3節(jié)中給出的程序,輸入兩個相等的值(例如3,3),則程序輸出為:
Sumof3to3inclusiveis3
與習(xí)題1.14中給出的預(yù)測一致。
習(xí)題1.16
編寫程序,輸出用戶輸入的兩人數(shù)中的較大者。
ttincludc<iostrcam>
#include"windows.h〃
usingnamespacestd;
intmain()
(
system("CLS");
cout<<z,Entertwonumbers:,,<<endl;
intvl,v2;
cin?vl?v2;
lf(vl>-v2)
cout?z,Thebiggernumberis:〃<<vl〈<endl;
else
cout?,,Thebiggernumberis:,z<<v2<<cndl;
return0;
)
習(xí)題1.17
編寫程序,要求用戶輸入一組數(shù)。輸出信息說明其中有多少個負(fù)數(shù)。
#include<iostream>
#include"windows,h”
usingnamespacestd;
intmain()
intamount=0,value;
system("CLS");
//讀入數(shù)據(jù)直到遇見文件結(jié)束符,計(jì)算所讀入的負(fù)數(shù)的個數(shù)
while(cin?value)
if(value<=0)
-+amount;
cout<<"Amountofallnegativevaluesreadis”
<<amount<<std::endl;
return0;
}
習(xí)題1.18
編寫程序,提示用戶輸入兩個數(shù)并將這兩個數(shù)范圍內(nèi)的每個數(shù)寫到標(biāo)準(zhǔn)輸出。
#include<iostream>
#include"windows.h〃
usingnamespacestd;
intmain()
(
system("CLS"):
cout<<^Entertwonumbers:〃<<endl;
intvl,v2;
cin?vl?v2;
intlower,upper;
lower=vl;
upper=v2;
if(vl>=v2)
(
upper=vl;
lower=v2;
)
cout<<z,Valuesof〃<<lower<<〃to”《upper<<〃inclusiveare:"<<endl;
for(;lower<=upper;lower-+)
cout<<lower<<,z
coul<<endl;
return0;
}
習(xí)題1.19
如果上題給定數(shù)1000和2000,程序?qū)a(chǎn)生什么結(jié)果?修改程序,使每一行輸出
不超過10個數(shù)。
【解答】
所有數(shù)的輸出連在一起,不便于閱讀。
程序修改如下:
#include<iostrcam>
#include"windows.h〃
usingnamespacestd;
intmain()
(
system(〃CLS〃);
cout<<,zEntertwonumbers:,,<<endl;
intvl,v2;
cin?vl?v2;
intlower,upper;
lower=vl;
upper=v2;
if(vl>=v2)
(
upper=vl;
lowcr=v2;
]
cout<</zValuesof”<<lower<<〃to〃<<upper<<〃inclusiveare:〃<<endl;
for(intcount=l:lower<=upper;lower++,count++)
(
cout?lower<<,/〃;
if(count%10==0)
cout?endl;
J
cout<<endl;
return0;
}
習(xí)題1.20
編寫程序,求用戶指定范圍內(nèi)的數(shù)的和,省略設(shè)置上界和下界的if測試。假定
輸入數(shù)是7和3,按照這個順序,預(yù)測程序運(yùn)行結(jié)果。然后按照給定的數(shù)是7和
3運(yùn)行程序,看結(jié)果是否與你預(yù)測的相符。如果不相符,反復(fù)研究關(guān)于for和
while循環(huán)的討論直到弄清楚其中的原因。
#include<iostream>
#include“windows.h〃
usingnamespacesld;
intmain()
(
system("CLS");
cout<<z,Entertwonumbers:z,<<endl;
intvl,v2,sum=0;
cin?vl?v2;
for(intval=vl;val<=v2;val++)
sum+=val;
cout<<,,Sumof〃?vl?〃to”<<v2?〃inclusiveis”《sum<<endl;
return0;
)
如果輸入數(shù)據(jù)為7和3,則vl值為7,v2值為3。for語句頭中將val的初
始值設(shè)為7,第一次測試表達(dá)式val(=v2時,該表達(dá)式的值為false,for語
句的循環(huán)體一次也不執(zhí)行,所以求和結(jié)果sum為0。
習(xí)題1.21
本書配套網(wǎng)站(http://www.awprofessional.com/cppprimer)的第1章的代
碼目錄下有Sales_item,h源文件。復(fù)制該文件到你的工作目錄。編寫程序,
循環(huán)遍歷一組書的銷售交易,讀入每筆交易并將交易寫至標(biāo)準(zhǔn)輸出。
#include<iostream>
#include"Salesitem.h〃
#include"windows.h〃
usingnamespacestd;
intmain()
(
Salesitembook;
system(,/CLS,/);
cout<<"Entertransactions:?endl;
while(cin?book)
(
//輸出ISBN,售出書的本數(shù),總收入,平均價格
cout<<"ISBN,numberofcopiessold,〃<<"tctalrevenue,andaveragepriceare:
/z?endl;
cout<<book?endl;
]
return0;
}
習(xí)題1.22
編寫程序,讀入兩個具有相同ISBN的Sales_item對象并產(chǎn)生它們的和。
#include<iostream>
#include"Salesitem.
#include“windows.h〃
usingnamespacesld;
intmain()
(
Salcs_itcmtrans1,trans2;
//讀入交易
system("CLS");
cout<<"Entertwotransactions:^<<endl;
cin>>transl>>trans2:
if(transl.same_isbn(trans2))
cout<<"Thetotalinformation:"<<endl
<<"ISBN,numberofcopiessold,“
<<"totalrevenue,andaveragepriceare:“
<<endl?trans1+trans2;
else
cout<<"ThetwotransactionshavedifferentISBN.,,<<endl;
return0;
)
習(xí)題1.23
編寫程序,讀入幾個具有相同ISBN的交易,輸出所有讀入交易的和。
#include<iostream>
#includez,Sales_item.h〃
ttinclude"windows.h〃
usingnamespacestd;
intmain()
(
Sales_iten)total,trans:
system("CLS");
cout<<"Entertransactions:^?endl;
if(cin?total)
(
while(cin>>trans)
if(total.same_isbn(trans))//ISBN相同
total=total+trans;
)
else
(//ISBN不同
cout<<''DifferentISBN."?endl;
return-1;
)
//輸出交易之和
cout<<"Thetotalinformation:"<<endl
<<"ISBN,numberofcopiessold,“
<<toLalrevenue,andaveragepriceare:〃
<<endl?total;
else
(
cout<<"Nodata?!<<endl;
return-1;
]
return0;
習(xí)題1.24
編寫程序,讀入幾筆不同的交易。對于每筆新讀入的交易,要確定它的ISBN是
否和以前的交易的ISBN一樣,并且記下每一個ISBN的交易的總數(shù)。通過給定
多筆不同的交易來測試程序。這些交易必須代表多個不同的ISBN,但是每個ISBN
的記錄應(yīng)分在同一組。
#include<iostream>
#include"Salesitem.h〃
#include"windows.h〃
usingnamespacestd;
intmain()
(
Salesitemtransl,trans2;
intamount;
system(〃CLS〃);
cout<<"Entertransactions?endl;
cin>>trans1;
amount=l;
while(cin?trans2)
if(transl.sameisbn(trans2))
++amount;
else
(
cout?^TransactionamountofpreviousISBN:"
?amount<<endl:
transl=trans2;
amount-l;
}
cout<<"TransactionamountofthelastISBN:"
?amount<<cndl:
return0;
}
/*習(xí)題1.25
使用源自本書配套網(wǎng)站的Sales,tern,h頭文件,編譯并執(zhí)行1.6節(jié)給出的書店
程序。*/
習(xí)題1.26
在書店程序中,我們使用了加法操作符而不是復(fù)合賦值操作符將trans加到
total中,為什么我們不使用復(fù)合賦值操作符?
【解答】
因?yàn)樵?.5.1節(jié)中提及的Sales_item對象上的操作中只包含了+和二,沒有包含
+二操作。(但事實(shí)上,使用Sales_item.h文件,已經(jīng)可以用+二操作符取代工和+
操作符的復(fù)合使用。)
習(xí)題2.1
int、long和short類型之間有什么差別?
【解答】
它們的最小存儲空間不同,分別為16位、32位和16位。一般而言,short類
型為半個機(jī)器字(word)長,int類型為一個機(jī)器字長,而long類型為一個或
兩個機(jī)器字長(在32位機(jī)器中,int類型和long類型的字長通常是相同的)。
因此,它們的表示范圍不同。
習(xí)題2.2
unsigned和signed類型有什么差別?
【解答】
前者為無符號類型,只能表示天于或等于0的數(shù)。后者為帶符號類型,可以表
示正數(shù)、負(fù)數(shù)和0。
習(xí)題2.3
如果在某機(jī)器上short類型占16位,那么可以賦給short類型的最大數(shù)是什么?
unsignedshort類型的最大數(shù)又是什么?
【解答】
若在某機(jī)器上short類型占16位,那么可以賦給short類型的最大數(shù)是215T,
即32767;而unsignedshort類型的最大數(shù)為216T,即65535。
習(xí)題2.4
當(dāng)給16位的unsignedshort對象賦值100000時,賦的值是什么?
【解答】
34464。
100000超過了16位的unsignedshort類型的表示范圍,編譯器對其二進(jìn)制表
示截取低16位,相當(dāng)于對65536求余(求模,%),得34464。
習(xí)題2.5
float類型和double類型有什么差別?
【解答】
二者的存儲位數(shù)不同(一般而言,float類型為32個二進(jìn)制位,double類型為
64人二進(jìn)制位),因而取值范圍不同,精度也不同(float類型只能保證6位
有效數(shù)字,而double類型至少能保證10位有效數(shù)字)。
習(xí)題2.6
要計(jì)算抵押貸款的償還金額,利率、本金和付款額應(yīng)分別選用哪種類型?解釋
你選擇的理由。
[解答]
利率方以選擇float類型,因?yàn)槔释ǔ榘俜种畮住R话阒槐A舻叫?shù)點(diǎn)后
兩位,所以6位有效數(shù)字就足以表示了。
本金可以選擇long類型,因?yàn)楸窘鹜ǔ檎麛?shù)。long類型可表示的最大整數(shù)一
般為231T(即2147483647),應(yīng)該足以表示了。
付款額一般為實(shí)數(shù),可以選擇double類型,因?yàn)閒loat類型的6位有效數(shù)字可
能不足以表示。
習(xí)題2.7
解釋下列字面值常量的不同之處。
(a)a,La,a,La
(b)10,lOu,10L,lOuL,012,OxC
(c)3.14,3.14f,3.14L
【解答】
a,La,a,La
'a'為char型字面值,L'a'為wchajt型字面值,〃a〃為字符串字面值,L〃a〃為
寬字符串字面值。
(b)10,10u,10L,10uL,012,OxC
10為int型字面值,lOu為unsigned型字面值,10L為long型字面值,10uL
為unsignedlong型字面值,012為八進(jìn)制表示的int型字面值,OxC為十六進(jìn)制表示的int型
字面值。
(c)3.14,3.14f,3.14L
3.14為double型字面值,3.14f為float型字面值,3.14L為longdouble型
字面值。
習(xí)題2.8
確定下列字面值常量的類型:
(a)-10(b)-10u(c)-10.(d)-10e-2
【解答】
(a)int型
(b)unsignedint型
(c)double型
(d)double型
習(xí)題2.9
下列哪些(如果有)是非法的?
(a)“WhogoeswithF\145rgus?\012〃
(b)3.14elL(c)〃two〃L〃somo〃
(d)1024f(e)3.14UL
(f)multipleline
conlinent,z
【解答】
(c)非法。因?yàn)樽址置嬷蹬c寬字符串字面值的連接是未定義的。
(d)非法。因?yàn)檎麛?shù)1024后面不能帶后綴臭
(e)非法。因?yàn)楦↑c(diǎn)字面值不能帶后綴U。
(f)非法。因?yàn)榉謨尚袝鴮懙淖址置嬷当仨氃诘谝恍械哪┪布由戏葱本€。
習(xí)題2.10
使用轉(zhuǎn)義字符編寫一段程序,輸出2M,然后換行。修改程序,輸出2,跟著一
個制表符,然后是M,最后是換行符。
【解答】
輸出2M、然后換行的程序段:
//輸出〃2M〃和換行字符
std::cout?〃2M"<<''n';
修改后的程序段:
//輸出'2','\t','M'和換行字符
std::cout'2''\t'<<'<<)\n;
習(xí)題2.11
編寫程序,要求用戶輸入兩個數(shù)一一底數(shù)(base)和指數(shù)(exponent),輸出
底數(shù)的指數(shù)次方的結(jié)果。
#include<iosLreain>
ttinclude"windows.h〃
usingnamespacestd;
intmain()
(
intbase,exponent;
longresult=l;
system(〃CLS〃);
cout<<"Enterbaseandexponent:"<<endl;
cin?base>>exponcnt;
if(exponent<0)
(
cout<<,,Exponentcan'tbesmallerthanO,z<<endl;
return-1;
]
if(exponent>0)
(
for(intcnt=l;cnt<=exponent;cnt++)
result*二base;
)
cout<<base<<,/raisedtothepowerof,z<<exponent?,z:,,<<result<<endl:
return0;
}
習(xí)題2.12
區(qū)分左值和右值,并舉例說明。
【解答】
左值(lvalue)就是變量的地址,或者是一個代表“對象在內(nèi)存中的位置”的
表達(dá)式。
右值(rvalue)就是變量的值,見2.3.1節(jié)。
變量名出現(xiàn)在賦值運(yùn)算符的左邊,就是一個左值;而出現(xiàn)在賦值運(yùn)算符右邊的
變量名或字面常量就是一個右值。
例如:
vall=val2/8
這里的vail是個左值,而val2和8都是右值。
習(xí)題2.13
舉出一個需要左值的例子。
[解答]
賦值總算符的左邊(被賦值的對象)需要左值,見習(xí)題2.12。
習(xí)題2.14
下面哪些(如果有)名字是非法的?更正每個非法的標(biāo)識符名字。
(a)intdouble=3.14159;(b)char
(c)boolcatch-22;(d)charl__or_2='1';
(e)floatFloat=3.14f;
【解答】
(a)double是C+十語言中的關(guān)鍵字,不能用作用戶標(biāo)識符,所以非法。此語句
可改為:doubledval=3.14159;o
(c)名字catch-22中包含在字母、數(shù)字和下劃線之外的字符“-",所以非法。
可將其改為:catch_22;<,
(d)名字l_or_2非法,因?yàn)闃?biāo)識符必須以字母或下劃線開頭,不能以數(shù)字開頭。
可將其改為:oneor_two;。
習(xí)題2.15
下面兩個定義是否不同?有何大同?
intmonth=9,day=7;
intmonth=09,day=0/;
如果上述定義有錯的話,那么應(yīng)該怎樣改正呢?
【解答】
這兩個定義不同。前者定義了兩個int型變量,初值分別為9和7;后者也定義
了兩個int型變量,其中day被初始化為八進(jìn)制值7;而month的初始化有錯:
試圖將month初始化為八進(jìn)制值09,但八進(jìn)制數(shù)字范圍為0、7,所以出錯。可
將第二個定義改為:
intmonth=011,day=07;
習(xí)題2.16
假設(shè)calc是一個返回double對象的函數(shù)。下面哪些是非法定義?改正所有的
非法定義。
(a)intcar=1024,auto=2048;
(b)intival=ival;
(c)std::cin>>intinput_value;
(d)doublesalary=wage=9999.99;
(e)doublecalc=calc();
【解答】
(a)非法:auto是關(guān)鍵字,不能用作變量名。使用另一變量名,如aut即可更
JEo
(C)非法:>>運(yùn)算符后面不能進(jìn)行變量定義。改為:
intinput_value;
std::cin>>inputvalue:
(d)非法:同一定義語句中不同變量的初始化應(yīng)分別進(jìn)行。改為:
doublesalary=9999.99,wage=9999.99;
注意,(b)雖然語法上沒有錯誤,但這個初始化沒有實(shí)際意義,ival仍是未初始化的。
習(xí)題2.17
下列變量的初始值(如果有)是什么?
std::stringglobal_str;
intglobal_int;
intmain()
(
intlocal_int;
std::stringlocalstr;
//...
return0;
}
【解答】
global_str和local_str的初始值均為空字符串,的初始值為0,
local_int沒有初始值。
習(xí)題2.18
解釋下列例子中name的意義:
externstd::stringname;
std::stringname("exercise3.5a〃);
externstd::stringname(''exercise3.5a〃);
【解答】
第一條語句是一個聲明,說明std::string變量name在程序的其他地方定義。
第二條語句是一個定義,定義了std::string變量name,并將name初始化為
“exercise3.5a〃。
第二條語句也是一個定義,定義了std::string變量name,并將name初始化為
“exercise3.5a〃,但這個語句只能出現(xiàn)在函數(shù)外部(即,name是一個全局變量)。
習(xí)題2.19
下列程序中j的值是多少?
inti=42;
intmain()
(
inti=100;
intj=i;
//...
}
【解答】
j的值是100。j的賦值所使用到的i應(yīng)該是main函數(shù)中定義的局部變量i,因
為局部變量的定義會屏蔽全局變量的定義。
習(xí)題2.20
下列程序段將會輸出什么?
inti=100,sum=0;
for(inti=0;i!=10;++i)
sum+二i;
std::cout<<i?〃<<sum?std::endl;
【解答】
輸出為:
10045
for語句中定義的變量i,其作用域僅限于for語句內(nèi)部。輸出的i值是for語
句之前所定義的變量i的值。
習(xí)題2.21
下列程序合法嗎?
intsum=0;
for(inti=0;i!=10;++i)
sum+=i;
std::cout<<"Sumfrom0to〃<<i
<<〃is〃<<sum<<std::endl;
【解答】
不合法。因?yàn)樽兞縤具有語句作用域,只能在for語句中使用,輸出語句中
使用i屬非法。
習(xí)題2.22
下列程序段雖然合法,但是風(fēng)格很糟糕。有什么問題呢?怎樣改善?
for(inti=0;i<100;++i)
//processi
【解答】
問題主要在于使用了具體值100作為循環(huán)上界:100的意義在上下文中沒有體現(xiàn)
出來,導(dǎo)致程序的可讀性差;若100這個值在程序中出現(xiàn)多次,則當(dāng)程序的需
求發(fā)生變化(如將100改變?yōu)?00)時,對程序代碼的修改復(fù)雜且易出錯,導(dǎo)致
程序的可維護(hù)性差。
改善方法:設(shè)置一個const變量(常量)取代100作為循環(huán)上界使用,并為該
變量選擇有意義的名字。
習(xí)題2.23
下列哪些語句合法?對于那些大合法的使用,解釋原因。
(a)constintbut;
(b)intent=0;
constintsz=ent;
(c)cnt++;sz++;
【解答】
(a)不合法。因?yàn)槎xconst變量(常量)時必須進(jìn)行初始化,而buf沒有初
始化。
(b)合法。
(c)不合法。因?yàn)樾薷牧薱onst變量sz的值。
習(xí)題2.24
下列哪些定義是非法的?為什么?如何改正?
(a)intival=1.01;(b)int&,rvall=1.01;
(c)int&rval2=ival;(d)constint&rval3=1;
【解答】
(b)非法。
因?yàn)閞vall是一個非const引用,非const引用不能綁定到右值,而1.01是一
個右值??筛恼秊椋?/p>
int&rvall=ival;
(假設(shè)ival是一個已定義的int變量)。
習(xí)題2.25
在習(xí)題2.24給出的定義下,下列哪些賦值是非法的?如具賦值合法,解釋賦值
的作用。
(a)rval2=3.14159;(b)rva12=rval3;
(c)ival=rval3;(d)rval3=ival;
【解答】
(d)非法。因?yàn)閞val3是一個const引用,不能進(jìn)行賦值。
合法賦值的作用:
(a)將一個double型字面值賦給int型變量ival,發(fā)生隱式類型轉(zhuǎn)換,ival得
到的值為3。
(b)將int值1賦給變量ival。
(c)將int值1賦給變量ival.
習(xí)題2.26
(a)口的定義和(b)中的賦值存在哪些不同?哪些是非法的?
(a)intival=0;(b)ival=ri;
constint&ri=0;ri=ival;
【解答】
intival=0;定義ival為int變量,并將其初始化為0。
constint&ri=0;定義ri為const引用,并將其綁定到右值0。
ival=ri;將0值賦給ival。
ri-ival;試圖對ri賦值,這是非法的,因?yàn)閞i是const引用,
不能賦值。
習(xí)題2.27
下列代碼輸出什么?
inti,&ri=i;
i=5;ri=10;
std::cout<<i<<〃〃<<ri<<std::endl;
【解答】
輸出:
1010
ri是i的引用,對ri進(jìn)行賦值,實(shí)際上相當(dāng)于對i進(jìn)行賦值,所以輸出i和
ri的值均為10。
習(xí)題2.28
編譯以下程序,確定你的編譯器是否會警告遺漏了類定義后面的分號。
classFoo{
//empty
}//Note:nosemicolon
intmain()
(
return0;
)
如果編譯器的診斷結(jié)果難以理解,記住這些信息以備后用。
【解答】
在筆者所用的編譯器中編譯上述程序,編譯器會給出如下錯誤信息:
errorC2628:'Foo'followedby'int'isillegal(didyouforgeta';'?)
(第4行)
warningC4326:returntypeof'main'shouldbe'intorvoid,insteadof
'Fo。'(第5行)
errorC2440:'return':cannotconvertfrom'int'to'Foo'(第
6行)
也就是說,該編譯器會對遺漏了類定義后面的分號給出提示。
習(xí)題2.29
區(qū)分類中的public部分和private部分。
【解答】
類中public部分定義的成員在程序的任何部分都可以訪問。通常在public部
分放置操作,以便程序中的其他部分可以執(zhí)行這些操作。
類中private部分定義的成員只能被作為類的組成部分的代碼(以及該類的友
元)訪問。通常在private部分放置數(shù)據(jù),以對對象的內(nèi)部數(shù)據(jù)進(jìn)行隱臧。
習(xí)題2.30
定義表示下列類型的類的數(shù)據(jù)成員;
(a)電話號碼(b)地址
(c)員工或公司(d)某大學(xué)的學(xué)生
【解答】
(a)電話號碼
classTel_number{
public:
〃一.對象上的操作
private:
sLd::siringcountrynumber;
std::stringcity_numbcr;
std::stringphone_number;
);
(b)地址
classAddress{
public:
〃.…對象上的操作
private:
std::stringcountry;
std::stringcity;
std::stringstreet;
std::stringnumber;
};
(c)員工或公司
classEmployee{
public:
//...對象上的操作
private:
std::stringID;
std::stringname;
charsex;
Addressaddr;
Telnumbertel;
};
classCompany{
public:
//...對象上的操作
private:
std::stringname;
Addressaddr;
Tel_numbertel;
);
(d)某大學(xué)的學(xué)生
classStudent{
public:
//...對象上的操作
private:
std::stringID;
std::stringname;
charsex;
std::stringdept;//所在系
std::stringmajor;
Addresshome_addr;
Tel_numbertel;
};
注意,在不同的具體應(yīng)用中,類的設(shè)計(jì)會有所不同,這里給出的只是一般性的
簡單例子。
習(xí)題2.31
判別下列語句哪些是聲明,哪些是定義,請解釋原因。
(a)externintix=1024;
(b)intiy;
(c)externintiz;
(d)externconstint&ri;
[解答]
(a)是定義,因?yàn)閑xtern聲明進(jìn)行了初始化。
(b)是定義,變量定義的常規(guī)形式。
(c)是聲明,extern聲明的常規(guī)形式。
(d)是聲明,聲明了一個const引用。
習(xí)題2.32
下列聲明和定義哪些應(yīng)該放在頭文件中?哪些應(yīng)該放在源文件中?請解釋原
因。
(a)intvar;
(b)constdoublepi=3.1416;
(c)externinttotal=255;
(d)constdoublesq2=squt(2.0);
【解答】
(a)、(c)、(d)應(yīng)放在源文件中,因?yàn)?a)和(c)是變量定義,定義通常應(yīng)放在源
文件中。(d)中的const變量sq2不是用常量表達(dá)式初始化的,所以也應(yīng)該放在
源文件中。
(b)口的c;nst變量pi是用常量表達(dá)式初始化的,應(yīng)該放在頭文件中。
參見2.9.1節(jié)。
習(xí)題2.33
確定你的編譯器提供了哪些提高警告級別的選項(xiàng)。使用這些選項(xiàng)重新編譯以前
選擇的程序,查看是否會報(bào)告新的問題。
【解答】
在筆者所用的編譯器(MicrosoftVisualC++.NET2003)中,在Project菜
單中選擇Properties菜單項(xiàng),在Configuration
Properties->C/C++->Genera1-*WarningLevel中可以選擇警告級別°
習(xí)題3.1
用適當(dāng)?shù)膗sing聲明,而不用std::前綴,訪問標(biāo)準(zhǔn)庫中的名字,重新編寫2.3
節(jié)的程序,計(jì)算一給定數(shù)的給定次累的結(jié)果。
^include<iostream>
#include“windows.h〃
usingnamespacestd;
intmain()
(
intbase,exponent;
longresult=l;
system(〃CLS〃);
cout<</zEnterbaseandexponent:〃<<endl;
cin?base>>exponent;
if(exponent<0)
(
c()ul<<,,ExporienlcarfLbesmallerthan0,z?endl;
return-1;
)
if(cxponcnt>0)
(
for(intcnt=l;cnt<=exponent;cnt++)
result*=base;
]
cout<<base<<A,raisedtothepowerof*?exponent?*:*<<result<<endl
return0;
習(xí)題3.2
什么是默認(rèn)構(gòu)造函數(shù)?
【解答】
默認(rèn)構(gòu)造函數(shù)(defaultconstructor)就是在沒有顯式提供初始化式時調(diào)用的
構(gòu)造函數(shù)。它由不帶參數(shù)的構(gòu)造函數(shù),或者為所有形參提供默認(rèn)實(shí)參的構(gòu)造函
數(shù)定義。如果定義某個類的變量時沒有提供初始化式,就會使用默認(rèn)構(gòu)造函數(shù)。
如果用戶定義的類中沒有顯式定義任何構(gòu)造函數(shù),編譯器就會自動為該類生成
默認(rèn)構(gòu)造函數(shù),稱為合成的默認(rèn)構(gòu)造函數(shù)(synthesizeddefaultconstructor)0
習(xí)題3.3
列舉出三種初始化string對象的方法。
【解答】
(1)不帶初始化式,使用默認(rèn)構(gòu)造函數(shù)初始化string對象。
(2)使用一個已存在的string對象作為初始化式,將新創(chuàng)建的string對象初
始化為已存在對象的副本。
(3)使用字符串字面值作為初始化式,將新創(chuàng)建的string對象初始化為字符串
字面值的副本。
習(xí)題3.4
s和$2的值分別是什么?
strings;
intmain(){
strings2;
)
【解答】
s和s2的值均為空字符串。
習(xí)題3.5
編寫程序?qū)崿F(xiàn)從標(biāo)準(zhǔn)輸入每次讀入一行文本。然后改寫程序,每次讀入一個單
詞。
#include<iostream>
#include<string>
#include“windows.h〃
usingnamespacestd;
intmain()
(
stringline;
system("CLS");
while(gelline(cin,line))
cout<<line<<endl;
return0;
}
修改后程序如下:
〃從標(biāo)準(zhǔn)輸入每次讀入一個單詞
#include<iostream>
#include<string>
#include"windows,h”
usingnamespacestd;
intmain()
stringword;
system(〃CLS〃);
while(getline(cin,word))
cout<<word?endl;
return0;
注意,一般而言,應(yīng)該盡量避免使用using指示而使用using聲明(參見17.2.4
節(jié)),因?yàn)槿绻麘?yīng)用程序中使月了多個庫,使用using指示引入這些庫中定義的名字空間,容易
導(dǎo)致名字沖突。但本書中的程序都只使用了標(biāo)準(zhǔn)庫,沒有使
用其他庫。使用using指示引入名字空間std中定義的所有名字不會發(fā)生名字
沖突。因此為了使得代碼更為簡潔以節(jié)省篇幅,本書的許多代碼中都使用了
using指示usingnamespacestd;來引入名字空間sld。另外,本題中并未要求
輸出,加入輸出是為了更清楚地表示讀入的結(jié)果。本書后面部分有些地方與此
類似處理,不再贅述。
習(xí)題3.6
解釋string類型的輸入操作符和getline函數(shù)分別如何處理空白字符。
【解答】
string類型的輸入操作符對空白字符的處理:讀取并忽略有效字符(非空白字
符)之前所有的空白字符,然后讀取字符直至再次遇到空白字符,讀取終止(該
空白字符仍留在輸入流中)。
getline函數(shù)時空白字符的處理:不忽略行開頭的空白字符,讀取字符直至遇到
換行符,讀取終止并丟棄換行符(換行符從輸入流中去掉但并不存儲在string
對象中)。
習(xí)題3.7
編一個程序讀入兩個string對象,測試它們是否相等。若不相等,則指出兩個
中哪個較大。接著,改寫程序測試它們的長度是否相等,若不相等,則指出兩
個中哪個較長。
#include<iostrcam>
#include<string>
usingnamespacestd;
intmain()
stringsi,s2;
cout<<"Entertwostrings:〃?endl;
cin>>si?s2;
if(si==s2)
coul<<"Theyareequal.,z?endl;
elseif(si>s2)
cout?〃\〃〃<<si?〃\"isbiggerthan”
<<〃]<<s2endl;
else
cout<<〃、〃〃<<s2<<〃\〃isbiggerthan”
?〃'〃〃<<siendl;
return0;
測試兩個string對象的長度是否相等的程序:
#include<iostream>
#include<string>
usingnamespacestd;
intmain()
(
stringsi,s2;
cout?”Entertwostrings:“?endl;
cin>>si?s2;
string::size_typelenl,len2;
lenl=si.size();
len2=s2.size();
if(lenl==len2)
cout?”Theyhavesamelength.77?endl;
elseif(lenl>len2)
cout<<〃\〃〃<<si?〃\〃islongerthan”
?〃、〃〃<<s2?《endl;
else
cout?〃\〃〃<<s2?〃\〃islongerthan"
?〃'〃〃<<si"〃,〃〃<<endl;
return0;
)
習(xí)題3.8
編一個程序,從標(biāo)準(zhǔn)輸入讀取多個string對象,把它們連接起來存放到一個更
大的string對象中,并輸出連接后的string對象。接著,改寫程序,將連接
后相鄰string對象以空格隔開。
【解答】
#include<iostream>
ttinclude<string>
usingnamespacestd;
intmain()
(
stringresult_str,str;
cout<<"Enterstrings(Ctrl+Ztoend):〃<<endl;
while(cin?str)
result_str=result_str+str;
cout<<"Stringequaltotheconcatenationofthesestringsis:
<<endl<<result_str<<endl;
return0;
)
改寫后的程序:
^include<iostream>
ttinclude<string>
usingnamespacestd;
intmain()
(
stringresult_str,str;
cout<<"Enterstrings(Ctrl+Ztoend):〃<<endl;
cin?result_str;
while(cin?str)
resultstr=resultstr+''+str;
cout<<"Stringequaltotheconcatenationofthesestringsis:〃
<<endl<<result_str<<endl;
return0;
}
習(xí)題3.9
下列程序?qū)崿F(xiàn)什么功能?實(shí)現(xiàn)合法嗎?如果不合法,說明理由。
strings;
cout<<s[0]<<endl;
【解答】
該程序段輸出string對象s所對應(yīng)字符串的第一個字符。
實(shí)現(xiàn)不合法。因?yàn)閟是一個空字符串,其長度為0,因此s[0]是無效的。
注意,在一些編譯器(如MicrosoftVisualC++.NET2003)的實(shí)現(xiàn)中,該
程序段并不出現(xiàn)編譯錯誤。
習(xí)題3.10
編一個程序,從string對象中去掉標(biāo)點(diǎn)符號。要求輸入到程序的字符串必須含
有標(biāo)點(diǎn)符號,輸出結(jié)果則是去掉標(biāo)點(diǎn)符號后的string對象。
【解答】
#include<iostream>
^include〈siring〉
#include<cctype>
usingnamespacestd;
intmain()
(
strings,result_str;
boolhas_punct=false;
charch;
cout<<"Enterastring:“?endl;
gctlinc(cin,s);
for(string::size_typeindex=0;index!=s.sizeO;++index)
(
ch=s[index];
if(ispunct(ch))
has_punct=true;
else
result_str+=ch;
}
if(has_puncl)
cout<<"Result:"<<endl?result_str<<endl;
else{
cout<<〃Nopunctuationcharacterinthestring?!”<<endl;
return-1;
)
return0;
)
習(xí)題3.11
下面哪些vector定義不正確?
(a)vector<vector<int>>ivec;
(b)vector<string>svec=ivec;
(c)vector<string>svec(10,〃null〃);
【解答】
(b)穴正確。因?yàn)閟vec定義為保存string對象的vector對象,而ivec是
保存vector<int〉對象的vector對象(即ivec是vector的vector),二者
的元素類型不同,所以不能用ivec來初始化svec。
習(xí)題3.12
下列每個vector對象中元素個數(shù)是多少?各元素的值是什么?
(a)vector<int>ivecl;
(b)vector<int>ivec2(10);
(c)vector<int>ivec3(10,42);
(d)vector<string>svecl;
(e)vector<string>svec2(10);
(f)vector<string>svec3(10,“hello");
【解答】
(a)元素個數(shù)為0。
(b)元素個數(shù)為10,各元素的值均為0。
(c)元素個數(shù)為10,各元素的值均為42。
(d)元素個數(shù)為0。
(e)元素個數(shù)為10,各元素的值均為空字符串.
(f)元素個數(shù)為10,各元素的值均為〃hello”。
習(xí)題3.13
讀一組整數(shù)到vector對象,計(jì)算并輸出每對相鄰元素的和。如果讀入元素個數(shù)
為奇數(shù),則提示用戶最后一個元素沒有求和,并輸出其值。然后修改程序:頭
尾元素兩兩配對(第一個和最后一個,第二個和倒數(shù)第二個,以此類推),計(jì)
算每對元素的和,并輸出。
【解答】
〃讀一組整數(shù)到vector對象,計(jì)算并輸出每對相鄰元素的和
ttincludc<iostrcam>
#include<vector>
usingnamespacestd;
intmain()
(
vector<int>ivec;
intival;
//讀入數(shù)據(jù)到vector對象
cout<<"Enternumbers(Ctrl+Ztoend):,z<<endl;
while(cin?ival)
ivec.push_back(ival);
//計(jì)算相鄰元素的和并輸出
if(ivec.sizeO==0){
cout<<"Noelement?!<<endl;
return-1;
)
cout?”Sumofeachpairofadjacentelementsinthevector/7
<<endl;
for(vector<int>::size_typeix=0;ix<ivec.size()-1;ix=ix+2)
cout
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上海市東方公證處招聘公證員助理、輔助人員備考題庫完整答案詳解
- 3D打印個性化縫合導(dǎo)板的設(shè)計(jì)與應(yīng)用
- 2型糖尿病社區(qū)綜合管理路徑優(yōu)化
- 2025年工作地在合川備考題庫重慶一國企招聘及答案詳解1套
- 2025年楓亭鎮(zhèn)中心衛(wèi)生院招聘編外工作人員備考題庫及答案詳解一套
- 2025年第十師北屯面向社會公開引進(jìn)高層次事業(yè)編工作人員備考題庫及答案詳解一套
- 2025年資陽市人才發(fā)展集團(tuán)有限公司誠聘3名項(xiàng)目人員備考題庫帶答案詳解
- 灰色時尚商務(wù)總結(jié)匯報(bào)模板
- 2025年個舊市醫(yī)共體卡房分院招聘備考題庫及1套參考答案詳解
- 2025年廣州南沙人力資源發(fā)展有限公司招聘公辦幼兒園編外工作人員備考題庫及1套完整答案詳解
- 歡慶元旦啟赴新章-2026年元旦聯(lián)歡主題班會課件
- 2025山東省人民檢察院公開招聘聘用制書記員(40名)備考考試題庫及答案解析
- 2026屆新高考?xì)v史沖刺備考復(fù)習(xí)第一次世界大戰(zhàn)與戰(zhàn)后國際秩序
- 消防設(shè)施操作員基礎(chǔ)知識
- 2025天津大學(xué)管理崗位集中招聘15人參考筆試題庫及答案解析
- 2025年江蘇省《保安員資格證考試》考試題庫含答案
- 發(fā)展心理學(xué)-終結(jié)性考核-國開(GS)-參考資料
- 北京市西城區(qū)2022-2023學(xué)年六年級上學(xué)期數(shù)學(xué)期末試卷(含答案)
- 智慧校園云平臺規(guī)劃建設(shè)方案
- 機(jī)械制圖公開課課件
- 內(nèi)鏡下治療知情同意書
評論
0/150
提交評論