




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、譚浩強(qiáng)C+課后習(xí)題答案1請根據(jù)你的了解,敘述C+的特點(diǎn)。C+對C有哪些發(fā)展?【解】 略。2一個C+的程序是由哪幾部分構(gòu)成的?其中的每一部分起什么作用?【解】 略。3從拿到一個任務(wù)到得到最終結(jié)果,一般要經(jīng)過幾個步驟?【解】 略。4請說明編輯、編譯、連接的作用。在編譯后得到的目標(biāo)文件為什么不能直接運(yùn)行?【解】 編譯是以源程序文件為單位進(jìn)行的,而一個完整的程序可能包含若干個程序文件,在分別對它們編譯之后,得到若干個目標(biāo)文件(后綴一般為.obj),然后要將它們連接為一個整體。此外,還需要與編譯系統(tǒng)提供的標(biāo)準(zhǔn)庫相連接,才能生成一個可執(zhí)行文件(后綴為.exe)。不能直接運(yùn)行后綴為.obj的目標(biāo)文件,只能運(yùn)
2、行后綴為.exe的可執(zhí)行文件。5分析下面程序運(yùn)行的結(jié)果。#include <iostream>using namespace std;int main( )cout<<" This "<<" is "cout<<" a "<<" C+ "cout<<"program. " << endl;return 0;【解】 輸出的結(jié)果為ThisisaC+program.6分析下面程序運(yùn)行的結(jié)果。 #include <
3、iostream> using namespace std; int main( ) int a,b,c;a=10;b=23;c=a+b;cout<<" a+b="cout<<c;cout<<endl;return 0;【解】 前兩個cout語句在輸出數(shù)據(jù)后不換行,第3個cout語句輸出一個換行,因此輸出的結(jié)果為a+b=337分析下面程序運(yùn)行的結(jié)果。請先閱讀程序?qū)懗龀绦蜻\(yùn)行時應(yīng)輸出的結(jié)果,然后上機(jī)運(yùn)行程序,驗證自己分析的結(jié)果是否正確。以下各題同。#include <iostream>using namespace std
4、;int main( )int a,b,c;int f(int x,int y,int z);cin>>a>>b>>c;c=f(a,b,c);cout<<c<<endl;return 0;int f(int x,int y,int z) int m; if (x<y) m=x; else m=y; if (z<m) m=z; return(m); 【解】 程序的作用是:輸入3個整數(shù),然后輸出其中值最小的數(shù)。在主函數(shù)中輸入3個整數(shù),然后調(diào)用f函數(shù),在f函數(shù)中實(shí)現(xiàn)找最小的整數(shù),用if語句比較兩個數(shù),將小者存放在變量m中,經(jīng)過兩
5、個if語句的比較,m中存放的是3個整數(shù)中最小的數(shù)。運(yùn)行情況如下:1 5 3 (輸入3個整數(shù))1 (輸出其中最小的數(shù))8在你所用的C+系統(tǒng)上,輸入以下程序,進(jìn)行編譯,觀察編譯情況,如果有錯誤,請修改程序,再進(jìn)行編譯,直到?jīng)]有錯誤,然后進(jìn)行連接和運(yùn)行,分析運(yùn)行結(jié)果。int main( ); int a,b; c=a+b; cout >>" a+b=" >> a+b; 【解】 上機(jī)編譯出錯,編譯出錯信息告知在第2行出錯,經(jīng)檢查,發(fā)現(xiàn)第1行的末尾多了一個分號,編譯系統(tǒng)無法理解第2行的花括號,導(dǎo)致報告第2行出錯。將第1行的末尾的分號去掉,重新編譯,編譯出錯信息
6、告知在第5行和第6行出錯。第5行出錯原因是cout未經(jīng)聲明,因為cout不是C+語言提供的系統(tǒng)的關(guān)鍵字,而是輸出流的對象,必須使用頭文件iostream。第6行出錯原因是main是int型函數(shù),應(yīng)返回一個整型值。將程序改為#include <iostream>int main( ) int a,b; c=a+b; cout >>" a+b=" >> a+b; return 0; 重新編譯。編譯出錯信息告知在第5行和第6行出錯。第5行出錯原因是變量c未定義,第6行出錯原因是cout未經(jīng)聲明,說明#include <iostream&g
7、t;命令行未能起作用,原因是未指明命名空間。將程序改為#include <iostream>using namespace std;int main( ) int a,b,c; c=a+b; cout>>" a+b=" >>a+b; return 0; 重新編譯。編譯出錯信息告知在第7行出錯,經(jīng)檢查,是“>>”用得不當(dāng),“>>”是提取運(yùn)算符,應(yīng)與cin聯(lián)合使用,用來從輸入流中提取數(shù)據(jù),輸出時應(yīng)該用插入運(yùn)算符“<<”。把兩處“>>”都改為“<<”,再重新編譯,發(fā)現(xiàn)沒有error錯誤
8、,但有兩個警告(warning),原因是定義了a和b,但未對它們賦值。應(yīng)增加賦值語句或輸入語句,使a和b獲得值,將程序改為#include <iostream>using namespace std;int main( ) int a,b,c; cin>>a>>b; c=a+b; cout>>" a+b=" >>a+b;return 0;重新編譯,沒有編譯錯誤,能通過編譯和連接,可以正常運(yùn)行,在Visual C+ 6.0環(huán)境下運(yùn)行時屏幕顯示如下:5 9a+b=14Press any key to continue顯
9、然這樣的輸出不理想,“Press any key to continue”是Visual C+系統(tǒng)在輸出了運(yùn)行結(jié)果后自動顯示的一個信息,告訴用戶“如果想繼續(xù)工作,請按任何一個鍵”。當(dāng)用戶按任何一個鍵后,顯示運(yùn)行結(jié)果的窗口消失,屏幕顯示回到Visual C+的主窗口,顯示出源程序和編譯信息。為了解決以上輸出不理想的情況,可以在最后一個輸出語句中增加輸出一個換行符。最后的程序如下:#include <iostream>using namespace std;int main( ) int a,b,c; cin>>a>>b; c=a+b; cout<<
10、"a+b="<<a+b<<endl; return 0; 運(yùn)行時屏幕顯示如下:5 9a+b=14Press any key to continue這就完成了程序的調(diào)試。這里對本題的調(diào)試過程作了比較詳細(xì)的分析,以便使讀者對如何調(diào)試程序有比較具體而清晰的了解。需要說明:(1)編譯系統(tǒng)給出的編譯出錯信息,只是提示性的,引導(dǎo)用戶去檢查錯誤,用戶必須根據(jù)程序的上下文和編譯出錯信息,全面考慮,找出真正出錯之處。例如編譯出錯信息通知第2行出錯,其實(shí)可能是第1行出錯。(2)有時,有的錯誤開始時未被檢查出來并告知用戶(例如未定義變量c),由于其他錯誤未解決,掩蓋了這個
11、錯誤。當(dāng)解決了其他錯誤后,這個錯誤會被檢查出來。有時在調(diào)試過程中會不斷檢查出新的錯誤,這是不奇怪的。一一處理,問題會迎刃而解。(3)為了說明調(diào)試過程,這里全部依靠計算機(jī)系統(tǒng)來檢查錯誤,其實(shí)有些明顯的錯誤,完全可以由人工查出,這樣可以提高調(diào)試效率。由人工在紙面或屏幕上檢查錯誤,稱為靜態(tài)查錯,用計算機(jī)編譯系統(tǒng)檢查錯誤,稱為動態(tài)查錯。建議盡量先用靜態(tài)查錯的方法排除錯誤,只有人工檢查不出來的錯誤才讓計算機(jī)檢查。9輸入以下程序,進(jìn)行編譯,觀察編譯情況,如果有錯誤,請修改程序,再進(jìn)行編譯,直到?jīng)]有錯誤,然后進(jìn)行連接和運(yùn)行,分析運(yùn)行結(jié)果。#include <iostream>using name
12、space std;int main( )int a,b;c=add(a,b)cout<<"a+b="<<c<<endl;return 0; int add(int x,int y); z=x+y;retrun(z);【解】 發(fā)現(xiàn)7個錯誤:(1)對add函數(shù)未聲明就調(diào)用,應(yīng)在main函數(shù)中對add函數(shù)進(jìn)行聲明。(2)定義add函數(shù)時,函數(shù)首行末尾不應(yīng)有分號。(3)變量c未經(jīng)定義。(4)add函數(shù)中的變量z未經(jīng)定義。(5)第6行末尾少了一個分號。(6)add函數(shù)中的retrun拼寫錯誤,應(yīng)為return。編譯系統(tǒng)把retrun作為未聲明的標(biāo)
13、識符而報錯,因為retrun(z)會被認(rèn)為是函數(shù)調(diào)用的形式。(7)變量a和b未被賦值。改正后的程序如下:#include <iostream>using namespace std;int main( )int add(int x,int y); int a,b,c; cin >> a >> b; c=add(a,b); cout <<" a+b=" << c <<endl; return 0;int add(int x,int y)int z; z=x+y; return(z);運(yùn)行情況如下:5 81
14、310輸入以下程序,編譯并運(yùn)行,分析運(yùn)行結(jié)果。#include <iostream>using namespace std;int main( ) void sort(int x,int y,int z);int x,y,z;cin >> x >> y >> z;sort(x,y,z);return 0;void sort(int x, int y, int z) int temp; if (x>y) temp=x;x=y;y=temp; / 內(nèi)3個語句的作用是將x和y的值互換 if (z<x) cout << z <
15、;< ',' << x << ',' << y << endl; else if (z<y) cout << x <<',' << z << ',' << y << endl; else cout << x << ',' << y << ',' << z << endl; 請分析此程序的作用。sor
16、t函數(shù)中的if語句是一個嵌套的if語句。運(yùn)行時先后輸入以下幾組數(shù)據(jù),觀察并分析運(yùn)行結(jié)果。 3 6 10 6 3 10 10 6 3 10,6,3【解】 程序的作用是對輸入的3個整數(shù)按由小到大的順序進(jìn)行排序。sort函數(shù)中的第1個if語句的作用是先將x和y排序,使x小于或等于y。第2個if語句是一個嵌套的if語句,先比較z和x,如果z<x,顯然由小到大的順序應(yīng)當(dāng)是z,x,y,按此順序輸出;如果z不小于x,而小于y,顯然由小到大的順序應(yīng)當(dāng)是x,z,y,按此順序輸出;如果z既不小于x,又不小于y,顯然由小到大的順序應(yīng)當(dāng)是x,y,z,按此順序輸出。按題目要求分別輸入以下幾組數(shù)據(jù),運(yùn)行結(jié)果如下:
17、3 6 103,6,10 6 3 103,6,10 10 6 33,6,10 10,6,3-858993460,-858993460,10以上是在Visual C+ 6.0環(huán)境下運(yùn)行的情況,前3次運(yùn)行正常,表明當(dāng)輸入不同的數(shù)據(jù)時,程序能實(shí)現(xiàn)由小到大的排序功能。第4次運(yùn)行的結(jié)果顯然不正常,這是由于輸入數(shù)據(jù)時出了問題,本來要求在輸入數(shù)據(jù)時,數(shù)據(jù)之間以空格或換行相隔,而現(xiàn)在卻以逗號相隔,只有第一個整數(shù)能正常賦給變量x,第二和第三個數(shù)據(jù)均無法正常賦給變量y和z,y和z的值來自輸入流中相應(yīng)字節(jié)的內(nèi)容。11求2個或3個正整數(shù)中的最大數(shù),用帶有默認(rèn)參數(shù)的函數(shù)實(shí)現(xiàn)。【解】 可以編寫出以下程序:#include
18、 <iostream>using namespace std;int main( )int max(int a,int b,int c=0); int a,b,c; cin >> a >> b >> c; cout << " max(a,b,c)= " << max(a,b,c) << endl; cout << " max(a,b)= " <<max(a,b) << endl; return 0;int max(int a,int b
19、,int c)if(b>a) a=b; if(c>a) a=c; return a;運(yùn)行情況如下:13 5 76max(a,b,c)=76 (從3個數(shù)中找最大者)max(a,b)=13 (從前2個數(shù)中找最大者)如果想從3個數(shù)中找大者,可以在調(diào)用時寫成“max(a,b,c)”形式,如果只想從2個數(shù)中找大者,則在調(diào)用時寫成“max(a,b)”形式,此時c自動取默認(rèn)值0,由于0比任何正整數(shù)都小,因此從14,5,0中選最大者和從14,5中選大者的結(jié)果是一樣的。12輸入兩個整數(shù),將它們按由大到小的順序輸出。要求使用變量的引用?!窘狻?可以編寫出以下程序:#include<iostrea
20、m>using namespace std;int main( ) void change(int &,int &); int a,b; cin>>a>>b; if(a<b) change(a,b); /如果a<b,使a和b的值互換 cout<<"max="<<a<<" min="<<b<<endl; return 0;void change(int &r1,int &r2) /函數(shù)的作用是使r1與r2互換 int tem
21、p; temp=r1; r1=r2; r2=temp; 運(yùn)行情況如下:1267max=67min=1213對3個變量按由小到大順序排序,要求使用變量的引用?!窘狻?可以編寫出以下程序:#include <iostream>using namespace std;int main( )void sort(int &,int &,int &); int a,b,c,a1,b1,c1; cout<<" Please enter 3 integers:" cin>>a>>b>>c; a1=a;b1=
22、b;c1=c; sort(a1,b1,c1); cout<<a<<" "<<b<<" "<<c<<" in sorted order is " cout<<a1<<" "<<b1<<" "<<c1<<endl; return 0;void sort(int &i,int &j,int &k) void change(int &am
23、p;,int &); if (i>j) change(i, j); if (i>k) change(i, k); if (j>k) change(j, k);void change(int &x,int &y) int temp; temp=x; x=y; y=temp;運(yùn)行情況如下:Please enter 3 integers:23 67 -5523 67 55 in sorted order is 55 23 67這個程序很容易理解,不易出錯。由于在調(diào)用sort函數(shù)時虛實(shí)結(jié)合使形參i,j,k成為實(shí)參a1,b1,c1的引用(別名),因此通過調(diào)用函數(shù)
24、sort(a1,b1,c1)既實(shí)現(xiàn)了對i,j,k排序,也就同時實(shí)現(xiàn)了對a1,b1,c1排序。同樣,執(zhí)行change(i,j)函數(shù),可以實(shí)現(xiàn)對實(shí)參i和j的互換。14編一程序,將兩個字符串連接起來,結(jié)果取代第一個字符串。要求用string方法?!窘狻?可以編寫出以下程序:#include <iostream>#include <string> /程序中若使用字符串變量,必須包含頭文件stringusing namespace std;int main( ) string s1= " week ",s2= " end " cout &l
25、t;< " s1= " << s1 << endl; cout << "s2=" << s2 << endl; s1=s1+s2; cout<<" The new string is: "<<s1<<endl; return 0;運(yùn)行情況如下:s1=weeks2=endThe new string is: weekend15輸入一個字符串,把其中的字符按逆序輸出。如輸入LIGHT,輸出THGIL。要求用string方法。【解】 可以編
26、寫出以下程序:#include <iostream>#include <string>using namespace std;int main( ) string str; /定義字符串變量str int i,n;char temp; /定義字符變量temp cout<<" please input a string: " cin>>str; /輸入一個字符串賦給字符串變量str n=str.size( ); /測量str的長度n for(i=0;i<n/2;i+) /使str中的字符對稱互換temp=stri;stri
27、=strn-i-1;strn-i-1=temp; cout << str << endl; return 0;運(yùn)行情況如下:please input a string:LIGHTTHGIL注意:輸入的字符串中不能含有空格。16有5個字符串,要求將它們按由小到大的順序排列,用string方法?!窘狻?可以編寫出以下程序:#include <iostream>#include <string>using namespace std;int main( ) int i; string str5=" BASIC"," C&q
28、uot;," FORTRAN"," C+","PASCAL" void sort(string ); sort(str); /對字符串排序 cout<<" the sorted strings : "<<endl; for(i=0;i<5;i+) cout<<stri<<" " /按已排好的順序輸出字符串 cout<<endl; return 0;void sort(string s )int i, j; string t; fo
29、r (j=0; j<5; j+) for(i=0; i<5-j; i+) if (si>si+1) t=si;si=si+1;si+1=t; 運(yùn)行結(jié)果如下:the sorted strings :BASIC C C+ FORTRAN PASCAL17編一個程序,用同一個函數(shù)名對n個數(shù)據(jù)進(jìn)行從小到大排序,數(shù)據(jù)類型可以是整型、單精度型、雙精度型。用重載函數(shù)實(shí)現(xiàn)?!窘狻?可以編寫出以下兩個程序:(1)建立3個函數(shù),分別用于處理整型、單精度型、雙精度型數(shù)據(jù)的排序,在3個函數(shù)中都采用選擇法排序方法。#include <iostream>#include <string
30、>using namespace std;int main( ) long a5=10100,-123567, 1198783,-165654, 3456; int b5=1,9,0,23,-45; float c5=2.4, 7.6, 5.5, 6.6, -2.3 ; void sort(long );void sort(int ); void sort(float ); sort(a); sort(b); sort(c); return 0;void sort(long a )int i, j; long t; for (j=0; j<5; j+) for(i=0;i<5
31、-j;i+) if (ai>ai+1) t=ai;ai=ai+1;ai+1=t; cout<<" the sorted numbers : "<<endl; for(i=0;i<5;i+) cout<<ai<< " " cout<<endl<<endl;void sort(int a )int i, j, t; for (j=0; j<5; j+) for(i=0;i<5-j;i+) if (ai>ai+1) t=ai;ai=ai+1;ai+1=t; c
32、out<<" the sorted numbers : "<<endl; for(i=0;i<5;i+) cout<<ai<< " " cout<<endl<<endl; void sort(float a )int i, j; float t; for (j=0;j<5;j+) for(i=0;i<5-j;i+) if (ai>ai+1) t=ai;ai=ai+1;ai+1=t; cout<<" the sorted numbers :
33、 "<<endl; for(i=0;i<5;i+) cout<<ai<< " " cout<<endl<<endl;運(yùn)行結(jié)果如下:the sorted numbers :-123567 -165654 10100 3456 1198783 (長整型數(shù)據(jù)排序)the sorted numbers : (整型數(shù)據(jù)排序)-45 0 1 9 23the sorted numbers :-2.3 2.4 5.5 6.6 7.6 (單精度型數(shù)據(jù)排序)(2)在第1種方法中,3個函數(shù)的函數(shù)體基本上是相同的,都是采用
34、選擇法排序,在下面的程序中,3個函數(shù)的函數(shù)體不全相同,前兩個函數(shù)采用選擇法排序,最后一個函數(shù)采用起泡法排序。#include <iostream>#include <string>using namespace std;int main( ) long a5= 10100,-123567, 1198783,-165654, 3456;int b5=1,9,0,23,-45; float c5=2.4, 7.6, 5.5, 6.6, -2.3 ; void sort(int ); void sort(float ); void sort(long );sort(a); /
35、對長整型數(shù)據(jù)排序 sort(b); /對整型數(shù)據(jù)排序 sort(c); /對單精度型數(shù)據(jù)排序 return 0;void sort(long a ) /對長整型數(shù)據(jù)用選擇法排序的函數(shù)int i,j,min; long t; for(i=0;i<5;i+) min=i; for (j=i+1;j<5;j+) if(amin>aj) min=j; t=ai; ai=amin;amin=t; cout<<" the sorted numbers : "<<endl; for(i=0;i<5;i+)cout<<ai<
36、< " " cout<<endl<<endl;void sort(int a ) /對整型數(shù)據(jù)用選擇法排序的函數(shù)int i, j, t; for (j=0; j<5; j+) for(i=0;i<5-j;i+) if (ai>ai+1)t=ai;ai=ai+1;ai+1=t; cout<<" the sorted numbers : "<<endl; for(i=0;i<5;i+)cout<<ai<< " " cout<<endl<<endl; void sort(float a ) /對單精度型數(shù)據(jù)用起泡法排序的函數(shù)int i, j; float t; for (j=0;j<5;j+) for(i=0;i<5-j;i+) if (ai>ai+1) t=ai;ai=ai+1;ai+1=t; cout&l
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥物作用信號通路-第1篇-洞察及研究
- 供銷大廈全員培訓(xùn)班開學(xué)典禮上的講話稿
- 量子信息與量子通信技術(shù)-洞察及研究
- 子宮糜爛的護(hù)理課件
- 副溶血弧菌腸炎的護(hù)理
- 四胎妊娠的健康宣教
- 尿道脫垂的護(hù)理查房
- 事業(yè)單位招考面試試題及答案
- 河北省石家莊市行唐縣三中2025年高一物理第二學(xué)期期末調(diào)研試題含解析
- 子宮內(nèi)膜惡性腫瘤護(hù)理
- 人工智能算法的倫理規(guī)制研究
- 變電所設(shè)備更換申請報告
- 學(xué)習(xí)2025年全國教育工作會議精神解讀
- 福建省寧德市2024-2025學(xué)年八年級上學(xué)期期末考試數(shù)學(xué)試題
- 初級中式面點(diǎn)師培訓(xùn)教學(xué)大綱和教學(xué)計劃
- 銀行外包人員培訓(xùn)課件
- 數(shù)控銑床編程與操作項目教程 第4版 課件 項目三 孔加工 任務(wù)四 鏜孔
- 《公路工程預(yù)算定額》(JTGT3832-2018)
- 純電動汽車高壓上電流程與故障分析
- 三方比價合同協(xié)議書范文范本
- 安徽省亳州市(2024年-2025年小學(xué)四年級語文)統(tǒng)編版開學(xué)考試(上學(xué)期)試卷及答案
評論
0/150
提交評論