版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《全國計算機等級考試二級教程——C語言程序設計》習題分析與解答第一章程序設計基本概念習題分析與解答1.1
【參考答案】
.EXE1.2
【參考答案】
[1].C
[2].OBJ
[3].EXE1.3
【參考答案】
[1]順序結構
[2]選擇結構
[3]循環(huán)結構第二章
C程序設計的初步知識習題分析與解答一、選擇題2.1
【參考答案】
B)2.2
【參考答案】
D)2.3
【參考答案】
B)2.4
【參考答案】
A)2.5
【參考答案】
C)2.6
【參考答案】
A)2.7
【參考答案】
B)2.8
【參考答案】
B)2.9
【參考答案】
D)2.10
【參考答案】
C)2.11
【參考答案】
B)2.12
【參考答案】
B)2.13
【參考答案】
A)二、填空題2.14
【參考答案】
[1]11
[2]122.16
【參考答案】
[1]{
[2]}
[3]定義
[4]執(zhí)行2.17
【參考答案】
[1]關鍵字
[2]用戶標識符2.18
【參考答案】
[1]int
[2]float
[3]double2.19
【參考答案】
float
a1=1.0,a2=1.0;或float
a1=1,a2=1;(系統(tǒng)將自動把1轉換為1.0)2.20
【參考答案】
存儲單元2.22
【參考答案】
[1]a*b/c
[2]a/c*b
[3]b/c*a2.23
【參考答案】
把10賦給變量s2.24
【參考答案】
[1]位
[2]1位二進制數(shù)據(jù)(0或1)2.25
【參考答案】
[1]8
[2]127
[3]01111111[4]-128
[5]100000002.27
【參考答案】
[1]十
[2]八
[3]十六三、上機改錯題2.28
【分析與解答】第1行的錯誤:(1)include是一個程序行,因此在此行的最后不應當有分號(;)。第2行的錯誤:(1)main()是主函數(shù)的起始行,不是語句,因此最后不應當有分號(;)。(2)在同一行上的/
*
mainfunction
*
/顯然是注釋;C語言規(guī)定:注釋由/*開頭,由*/結束,但在*號和/之間不得插入任何空格,而在此處“/
*”和“*
/”之間存在空格,因此,/
*
mainfunction
*
/的寫法是錯誤的,而應寫成:/*
mainfunction
*/。第3行的錯誤:(1)在主函數(shù)的起始行main()的后面是函數(shù)體,函數(shù)體由左花括號({}開始。但在函數(shù)體的第一行:float的前面缺少了左花括號({}。(2)在同一行上的/*/*risradius*/,/*sisareaofcircular*/*/顯然是注釋;C語言規(guī)定:注釋由/*開頭,由*/結束,并且開頭的/*將去找最近的*/去配對,因此在/*/*risradius*/中,第一個/*與radius后的那個*/配上了對,結果緊跟在后面的那個逗號(,)落在了注釋的外面,而構成了一個多余符號,為此,在編譯時將報告“語法錯”。/*sisareaofcircular*/*/中第一個*/就結束了注釋,第一個*/就成了多余的了。第6行的錯誤:(1)printf(″%f\n″,s)應當是一條輸出語句,但在最后缺少了一個分號。(2)printf(″%f\n″,s);是程序的最后一條語句,程序應當結束;但缺少了程序體結束所需的右花括號());此右花括號可以放在printf(″%f\n″,s);的后面,也可以放在printf(″%f\n″,s);的下一行上。2.27
【分析與解答】第2行的錯誤:在main的后面缺少一對圓括號。第4行的錯誤:在c=4.0的后面缺少分號。第6行的錯誤:在printf(″%f\n″,v)的后面缺少分號。第三章順序結構習題分析與解答一、選擇題
(單選題)3.1
【參考答案】
C)3.2
【參考答案】
C)3.3
【參考答案】
D)3.4
【參考答案】
C)3.5
【參考答案】
D)3.6
【參考答案】
B)3.7
【參考答案】
C)3.8
【參考答案】
D)3.9
【參考答案】
A)3.10【參考答案】
B)3.11【參考答案】
C)3.12【參考答案】
D)3.13【參考答案】
D)3.14【參考答案】
A)3.15【參考答案】
C)3.16【參考答案】
C)3.17【參考答案】
C)3.18【參考答案】
D)把D的答案修改為:scanf(“?”,&c);3.19【參考答案】
C)3.20【參考答案】
B)二、填空題3.21
【參考答案】(1)-200,2500(2)i=-200,j=2500(3)i=-200j=25003.22
【參考答案】
[1]12
[2]0
[3]03.23
【參考答案】
[1]一條語句
[2]分號(或;)3.24
【參考答案】
分號(;)3.25
【參考答案】[2]:100<CR>25.81<CR>1.89234<CR>3.26
【參考答案】
x=127,x=
127,x=
177,x=
7f,x=
1273.27
【參考答案】
x=127,x=127
,x=$127
,x=$000127,x=d三、編程題和改錯題3.29
【分析與解答】(1)主函數(shù)名main后應有一對圓括號。(2)第三行的printf語句用以提示輸入,但是原樣輸出的字符串沒有用雙引號括起來;另外,從輸入的形式看,輸入的數(shù)據(jù)緊跟在提示之后,因此,printf格式串中最后不應該有換行符——\n。(3)因為輸入項a、b、c從定義和計算結果來看都是double類型,因此,第四行scanf語句格式串中的格式說明不應當用%d而應當用%lf;且每一個變量之前應該加地址運算符&。(4)第七行的printf語句中應當把%d都改成%lf或%f;按輸出要求在格式串中應添加相應的原樣輸出的字符;因為下一個printf的輸出從新的一行開始,因此在本輸出語句的格式串的最后應當加換行符——\n。(5)第八行的printf語句中應當把格式串整理合并放在輸出項的前面,輸出項放在后面,%d都改成%lf或%f;中間的\n刪去。(6)請同學們自己寫出修改后的程序,并上機調試。3.30【分析與解答】(1)分析:可用算術式560÷60把分鐘換算成小時和分鐘,商數(shù)就是小時數(shù),余數(shù)就是分鐘數(shù)。(2)確定變量的名字和定義變量的類型:在程序中把小時數(shù)放在變量h中,把分鐘數(shù)放在變量m中。這兩個變量的類型可以是整型(本題中采用整型),也可以是實型。(3)確定所用算法:求560÷60的商數(shù),在C語言中可以用整除的算法,語句是h=560/60;。求余數(shù)可用求余運算符%:560`,其值放入變量m中的語句是:m=560`;。(4)設計輸出格式。若輸出的形式定為:小時:分鐘,則按此形式設計輸出語句。(5)把以上內容放在主函數(shù)的一對花括號中。(6)編寫程序如下:main(){
int
h,m;h=560/60;m=560`;printf(″Theresult:
=:=\n″,h,m);}運行結果是:Theresult:
9:
203.31
【分析與解答】(1)確定變量的名字和定義變量的類型。若用a存放1500,用b存放350;用q存放商數(shù),用r存放余數(shù),所有變量應定義成int類型。(2)設計輸入語句從終端輸入1500和350;在輸入語句之前,應當設計一個輸出語句,用以提示輸入。(3)可用整除求商數(shù),結果放在變量q中??捎们笥噙\算符%求兩數(shù)之余數(shù),結果放在變量r中。(4)設計輸出語句。輸出a、b、q、r。(5)把以上內容放在主函數(shù)的一對花括號中。本題的程序與3.30相似,請大家參考上題并根據(jù)本題的解釋自己編程,并上機調試。3.32
【分析與解答】(1)定義4個雙精度變量a、b、c和ave,變量a、b、c分別存放讀入的3個雙精度數(shù),ave存放它們的平均值。(2)設計輸入語句,以及在此之前用于提示輸入的(printf)語句。(3)設計求平均值的算法,把所求得的平均值放入變量ave中。(4)設計把變量ave中的數(shù),從小數(shù)點后第二位數(shù)進行四舍五入的算法?,F(xiàn)舉例說明:若ave中的數(shù)為123.4644,為了保留此值小數(shù)點后一位,可用表達式:(int)(123.4644*10)/10.0;依次推算,為了保留此值小數(shù)點后二位,可用表達式:(int)(123.4644*100)/100.0;其他依此類推。(5)若要求對小數(shù)點后第二位數(shù)進行四舍五入,則可對原數(shù)加0.05后再進行以上運算。如要求保留123.4644小數(shù)點后一位且對第二位數(shù)進行四舍五入,可用表達式:(int)((123.4670.05)*10)/10.0。注意:分母一定要用實數(shù)10.0而不能用整數(shù)10,否則就變成整除了;若要求保留123.4644小數(shù)點后兩位且對第三位數(shù)進行四舍五入,可用表達式:(int)((123.4670.005)*100)/100.0;其他依此類推。(6)設計輸出語句。輸出a、b、c和ave。(7)把以上內容放在主函數(shù)的一對花括號中。(8)編寫程序如下:main(){
double
a,b,c,ave;printf(″Entera,b,c:″);scanf(″%lf%lf%lf″,&a,&b,&c);ave=(abc)/3;printf(″ave=%f\n″,ave);
/*用以比較四舍五入前后的數(shù)據(jù)*/ave=(int)((ave0.05)*10)/10.0;/*上句也可寫成ave=(int)(ave*100.5)/10.0;*/printf(″a=%f,b=%f,c=%f,ave=%f\n″,a,b,c,ave);}3.33
【分析與解答】(1)關于對變量中的數(shù)進行交換的算法請參考3.7題中的解釋和《教程》中有關的例題。(2)定義4個整型變量a、b、c和t,變量a、b、c分別存放讀入的3個整數(shù),t用作臨時存儲單元。(3)設計輸入語句,以及在此之前用于提示輸入的(printf)語句。(4)輸出a、b、c中的值,以便于比較。(5)交換的步驟如下:①把c中的值賦給t。②把b中的值賦給c。③把a中的值賦給b。④把t中的值賦給a。經過以上步驟,已按要求進行了交換。(6)輸出a、b、c中的值。(7)編寫程序如下:main(){
int
a,b,c,t;printf(″Enter
a,b,c:\n″);scanf(″%d%d%d″,&a,&b,&c);printf(″(1)a=%d,b=%d,c=%d\n″,a,b,c);t=c;c=b;b=a;a=t;printf(″(2)a=%d,b=%d,c=%d\n″,a,b,c);}第四章選擇結構習題分析與解答一、選擇題4.1
【參考答案】
A)4.2
【參考答案】
B)4.3
【參考答案】
A)4.4
【參考答案】
D)4.5
【參考答案】
C)4.6
【參考答案】
A)4.7
【參考答案】
B)4.8
【參考答案】
C)4.9
【參考答案】
D)4.10【參考答案】
D)二、填空題4.11【參考答案】
[1]非零
[2]零4.12【參考答案】
<、>、<=、>=、==、![KG-*2]=4.13【參考答案】
[1]!
[2]&&
[3][JB>1|][JB>1|]4.14【參考答案】
[1]:![KG-*2](邏輯非)[2]:<、>、<=、>=(小于、大于、小于等于、大于等于)[3]:==、![KG-*2]=(等于、不等)[4]:&&(邏輯與)
[5]:[JB>1|][JB>1|](邏輯或)。4.15【參考答案】
!4.16【參考答案】[1]a=b或a<c[2][JB>1|]x[JB>1|]>44.17【參考答案】
14.18【參考答案】
[1]x<=0
[2]14.19【參考答案】
[1]3
[2]2
[3]24.20【參考答案】
*#三、編程題4.21【分析與解答】
相關內容請參考《教程》4.2節(jié)和4.4節(jié)。(1)改寫如下:switch(a/10){
default
:m=5;
break;case
0:case
1:case
2:m=1;break;case
3:
m=2;break;case
4:
m=3;break;case
5:
m=4;break;};(2)本題中對a的判斷條件有一定的規(guī)律可尋;關鍵是,在switch語句后的表達式中利用了a/10,從而簡化了case標號。4.22【分析與解答】編寫本題的程序,首先要解決如何計算學生當前的年齡(設存放實足年齡的變量是age)。(1)如果當前的月份大于生日的月份,則學生的實足年齡age=y1-y0。(2)如果當前的月份等于生日的月份,就要看日數(shù),當前的日數(shù)大于或等于生日的日數(shù),則學生的實足年齡age=y1-y0。(3)如果不滿足以上的條件,就可斷定當前的日期沒有超過生日日期,就是說學生的年齡應當是age=y1-y0-1。以上3條,用C語言可以描述如下:if((m1>m0)[JB>1|][JB>1|](m1==m0&&d1>=d0))
age=y1-y0;else
age=y1-y0-1;讀者可以參考以上語句寫出程序,也可以根據(jù)分析寫出與此形式不同的語句和程序。4.23【分析與解答】(1)若輸入的整數(shù)a是奇數(shù),輸出:oddnumber,是偶數(shù)輸出:evennumber。(2)若一個a是偶數(shù),它就能被2除盡,即a%2==0,輸出evennumber;若是奇數(shù),它就不能被2除盡,即a%2!〖KG-*2〗=0,輸出oddnumber。讀者可以參考以上給出的算法,寫出相應的C語句,并編寫出完整的程序。4.24【分析與解答】本題的主要算法是從3個數(shù)中找出最大的那個數(shù)。假定始終把最大的數(shù)放在變量max中。(1)假定a中的數(shù)最大,把a賦給max。(2)用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也不做。(3)用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。(4)經過以上操作,max中已放入了a、b、c三個數(shù)中的最大數(shù),輸出max即可。讀者可以參考以上給出的算法,寫出相應的C語句,并編寫出完整的程序。4.25【分析與解答】(1)本題已給出了非常明確的條件,只要寫出正確的條件判斷語句就可基本完成程序的編寫。(2)由給出的函數(shù)可知,只有x的值在規(guī)定的范圍內時,才求出y的值,因此程序應當對輸入的x進行判斷,若超過范圍就不求y的值。(3)現(xiàn)以使用if[CD#*2]else語句為例寫出程序供參考。main(){
int
x,y;printf(″Enter
x:″);
scanf(″%d″,&x);if(x>-5&&x<10){
if(x==0)
y=x-1;elseif(x<10&&x>0)
y=x1;elseif(x<0
&&x>-5)
y=x;printf(″x=%d
y=%d\n″,x,y);}printf(″***END***\n\n″);}第五章循環(huán)結構習題分析與解答一、選擇題
(單選題)5.1【參考答案】
D)5.2【參考答案】
C)5.3【參考答案】
B)5.4【參考答案】
C)5.5【參考答案】
C)5.6【參考答案】
B)5.7【參考答案】
D)5.8【參考答案】
A)5.9【參考答案】
D)5.10【參考答案】
D)二、填空題5.11【參考答案】
[1]5
[2]4
[3]65.12【參考答案】
程序段無限循環(huán),沒有輸出結果5.13【參考答案】
-15.14【參考答案】
115.15【參考答案】
[1]d=1.0
[2]k
[3]k<=n5.16【參考答案】
[1]x>=0
[2]x<amin三、編程題5.17【分析與解答】(1)本題的基本算法是求累加值。累加項的值有規(guī)律的遞增,每一項的絕對值比前一項增2,因此可以利用循環(huán)的控制變量的遞增來得到累加項的絕對值。例如:for(i=1;i<=101;i=2)…(2)按所給的算式可以看到,累加項的符號是在交叉改變的,為此應當在循環(huán)體內設置一個變量,使它的符號按此規(guī)律交叉改變,這可用:s=-s;來實現(xiàn),s的初值為1;當s的值為1時,賦值后s中新的值為-1,當s的值為-1時,賦值后s中新的值為1。用s去乘累加項,將使累加項的符號也隨之有規(guī)律地改變。(3)若累加和放在變量sum中,累加項放在變量t中,按照以上敘述,for循環(huán)體內的語句可以設計如下:s=-s;
t=s*i;
sum=sumt;(4)sum的值是51。(5)請讀者自己對變量做出正確的定義并賦初值,設計輸出語句,完善程序。5.18【分析與解答】(1)本題的基本算法是求累加值。累加項的分子部分都是1;分母的值有規(guī)律的遞增,依次為1!、2!、…、n!,即,若第i-1項的累加項為t(i-1),則第i項的累加項是t(i-1)*i,在程序中可用表達式:t=t/i(i從1變化到n)來表示。(2)根據(jù)以上分析,若用變量t來存放累加項,當i的值從1變化到n時,可用以下語句來實現(xiàn)累加:t=t/i;
e=t;(3)為了實現(xiàn)累加過程,以上語句應當放在循環(huán)內,循環(huán)控制變量從1變化到n。(4)若用for循環(huán),按題目要求已指定n的值是50。若用while循環(huán),并沒有指定n的值,但已指定了循環(huán)結束的條件,當t的值小于10-4結束循環(huán)。(5)現(xiàn)例示用while循環(huán)來求e值的部分程序:i=1;e=1.0;t=1.0;while(t>=1e-4){
t=t/i;e=t;i;}(6)請讀者自己對變量做出正確的定義,設計輸出語句,完善程序;也可以參考此程序段,按照自己的思路獨立地完成程序。(7)e的值應當是:2.71828。(8)根據(jù)以上分析,讀者已不難用for循環(huán)來實現(xiàn)求e值的計算。(9)注意:在完成此程序時,不要對分母中的階乘值進行單獨計算,因為17!的值已超過long類型的最大值,更無法求到50!。5.19【分析與解答】(1)從1880年至2000年的年數(shù)可用一個for循環(huán)來取得。(2)對每一年,用以上指定的條件來進行判斷,若滿足條件即為閏年,進行輸出。(3)按輸出的要求,需要設一個變量用于統(tǒng)計一行中輸出的個數(shù),若在一行上已連續(xù)輸出了5個年數(shù),就需輸出一個換行符,使下一個輸出項在新的一行上開始;若用變量n來做此統(tǒng)計,則當表達式n%5==0時就應輸出一個換行符,同時使n重新置0值。(4)若變量y代表年數(shù),if語句的邏輯表達式可以寫成如下:(y%4==0&&y0!=0[JB>1|][JB>1|]y@0==0)(5)以下程序段供參考:for
(y=1880;y<=2000;y)if(y%4==0&&y0![KG-*2]=0[JB>1|][JB>1|]y@0==0){
printf(″%d
″,y);n;if(n%5==0){
printf(″\n″);
n=0;
}}(6)請讀者自己對變量做出正確的定義并賦初值,完善程序;也可以參考此程序段,按照自己的思路獨立地完成程序。從1880年至2000年有30個閏年。5.20【分析與解答】(1)不難理解利用以下的for循環(huán)可以在一行上連續(xù)輸出n個*號:for(i=1;i<=n;i)
printf(″*″);printf(″\n″);若n的值是6,則連續(xù)輸出6個*號。(2)以上圖形是在各行上輸出數(shù)目不等的*號,只是*號的數(shù)目依次有規(guī)律地變化。在上半部分各行依次是1、3、5、7個,因此可以用以下的程序段來實現(xiàn)這樣的輸出:for(k=1;k<=7;k,k){
for(i=1;i<=k;i)printf(″*″);printf(″\n″);}在下半部依次是5、3、1個;因此可以用以下的程序段來實現(xiàn)這樣的輸出:for(k=5;k>=1;k--,k--){
for(i=1;i<=k;i)printf(″*″);printf(″\n″);}以上程序段從第一列起輸出的結果如下:*************************現(xiàn)在我們已完成了在每行輸出指定數(shù)目的*號。(3)輸出結果與題目要求不同,它們的區(qū)別是:按題目每一行之前有不同的空格,而這里則是所有的行都在第一列上開始輸出*號;所以接著就應當解決這一問題。(4)分析題目要求,每行第一個*號位置的縮進是有規(guī)律的,假定中間這一行第一個*號位置是在第一列,則可看出,第一至第三行的縮進分別是3、2、1個空格;而圖形下半部的縮進數(shù)則剛好相反。這可在以上循環(huán)中添加輸出連續(xù)空格的for循環(huán)來實現(xiàn),對于上半部程序如下:b=3;for(k=1;k<=7;k,k){
for(j=1;j<=b;j)printf(″″);b--;for(i=1;i<=k;i)printf(″*″);printf(″\n″);}(5)請讀者在理解以上給出的示例的基礎上,自己添加下半部空格的輸出。第六章字符型數(shù)據(jù)習題分析與解答一、選擇題6.1【參考答案】
B)6.2【參考答案】
D)6.3【參考答案】
A)6.4【參考答案】
A)6.5【參考答案】
B)6.6【參考答案】
D)6.7【參考答案】
D)6.8【參考答案】
B)6.9【參考答案】
A)6.10【參考答案】
A)6.11【參考答案】
C)二、填空題6.12【參考答案】
-16.13【參考答案】
16.15【參考答案】
06.16【參考答案】
10A
20B
30C
40D<CR>或:
10A<CR>20B<CR>30C<CR>40D<CR>6.17【參考答案】
7.29
101.298AB<CR>或:
7.29<CR>101.29AB<CR>6.18【參考答案】A
7.29B
101.298<CR>6.19【參考答案】A<CR>B<CR>C<CR>三、編程題6.20【分析與解答】(1)在進行字符輸入時,即使一次輸入了一行字符(最后用回車結束輸入),字符也只能一個一個地讀入。若ch已定義為char型變量,可以用以下的程序段來完成操作:
ch=getchar();while(ch![KG-*2]=′\n′){
……ch=getchar();}當讀入的是一個回車符時,循環(huán)就結束。循環(huán)體內的“……”符號表示需要在循環(huán)體內完成的其他操作。(2)在循環(huán)內要求進行的操作之一是:輸出每個字符以及與之對應的ASCII代碼值。因此可用以下語句來實現(xiàn)。printf(″%c:%d
″,ch,ch);(3)在循環(huán)內要求進行的另一個操作是:每行只能輸出3對字符和與之對應的ASCII代碼值。若n已定義為int型變量,則可用來作計數(shù)器;使n的初值為0,每輸出一次,n的值增1,當n的值為3的整數(shù)倍時,額外輸出一個換行符。例如:n;if(n%3==0)putchar(′\n′);(4)把(2)和(3)中給出的語句放在循環(huán)體內,并按要求給出正確的定義和初值,就可完成題目所要求的操作。(5)也可以在while后的一對括號中來完成字符的讀入,如while((ch=getchar())![KG-*2]=′\n′)。這時,循環(huán)內、外的“ch=getchar();”語句應當去掉。6.21【分析與解答】(1)一行字符的讀入,請參照題6.20(1)和(5)中的解釋。循環(huán)體內的“……”符號表示需要在循環(huán)體內完成的其他操作。ch=getchar();while(ch![KG-*2]=′\n′){
……ch=getchar();}(2)在本題中循環(huán)體內需要把讀入的所有數(shù)字字符轉換成一個整數(shù)。若用變量n來存放這個整數(shù),為了保證有效的存放,應當把它定義成long類型。(3)要把輸入的一串數(shù)字字符轉換成一個整數(shù),首先需要判斷當前讀入的字符是否是數(shù)字字符,若不是則什么也不做;若是,則進行以下操作:①把當前讀入的一個字符轉換成一個一位整數(shù),這可由語句“d=ch-′0′;”來實現(xiàn),在這里d是一個整型變量;②把d中的一位數(shù)歸并到n的低位中,這可用語句“n=n*10d;”來實現(xiàn)。這里所述的操作可由以下語句來完成:if(ch>=′0′&&ch<=′9′){d=ch-′0′;n=n*10d;}if語句后一對括號中的判斷表達式可以調用字符函數(shù)isdigit來實現(xiàn):if(isdigit(ch)){d=ch-′0′;n=n*10d;}if子句的兩個語句可以合并成:n=n*10ch-′0′;。(4)把(3)中的語句放入循環(huán)中:ch=getchar();while(ch![KG-*2]=′\n′){
if(ch>=′0′&&ch<=′9′)n=n*10ch-′0′;ch=getchar();}(5)請自己寫出定義語句并賦初值。注意,最后輸出n時,應當使用格式說明%ld,而不能使用%d。6.22【分析與解答】(1)行數(shù)的統(tǒng)計可通過統(tǒng)計輸入的′\n′符的個數(shù)來完成。(2)統(tǒng)計的過程應當放在一個while循環(huán)體中;判斷循環(huán)是否進行的條件可以用:((ch=getchar())==EOF)。若用整型變量n作為計數(shù)器對′\n′符進行統(tǒng)計,只要讀入的字符是′\n′,則n增1。如:while((ch=getchar())![KG-*2]=EOF)if(ch==′\n′)n;(3)EOF是在stdio.h中預定義了的標識符,在TURBOC的環(huán)境下,鍵入CtrlZ(即按住鍵盤上的Ctrl鍵,同時按字母Z鍵)后,敲Enter鍵,即輸入了EOF。6.23【分析與解答】(1)本題要求的操作同樣可在while循環(huán)中完成:while((ch=getchar())!=′\n′){
……
}(2)若用整型變量n作為計數(shù)器對小寫字母進行統(tǒng)計,只要讀入的字符是小寫字母,則n增1。如:if(ch>=′a′&&ch<=′z′)n;(3)在退出循環(huán)后,輸出n的值。(4)請自己完善程序。6.24【分析與解答】(1)若圖案的行數(shù)輸入到變量L中。(2)按要求L決定了圖形的行數(shù),因此可通過循環(huán)來實現(xiàn)L行的輸出:for(i=1;i<=L;i){
……
}循環(huán)體中的“……”號,代表輸出L行的操作。(3)假定ch中存放了一個字符,我們知道,通過以下循環(huán)可以在一行上輸出n個字符:for(j=1;j<=n;j)putchar(ch);putchar(′\n′);注意,在循環(huán)后putchar(′\n′);語句不可少,它用以換行。(4)現(xiàn)在應當解決如何按要求給出每行輸出的字符。由圖分析,行數(shù)(或行號)為1時輸出字符A,行數(shù)為2時輸出字母B……若輸出的字母放在變量ch中,行號取決于外循環(huán)的控制變量i,則輸出的字母和行號的關系可用表達式:ch=′A′i-1來表示。當i為1時ch中被賦予字母A,當i為2時ch中被賦予了字母B,其他依此類推。因此,在此表達式后,利用(3)中的循環(huán)就解決了各行上輸出的字母。(5)按要求每行輸出的字母的個數(shù)不同,第二行輸出3個字母,第三行輸出5個字母,第四行輸出7個字母……(3)中for循環(huán)體的執(zhí)行次數(shù)取決于n的值,也就是說n的值決定了每行輸出字母的個數(shù)。其實,n的值與行號有著密切的關系:n=2*i-1,當i為1時n的值是1、當i的2時n的值是3、當i的3時n的值是5、當i的4時n的值是7。因此在(3)中for循環(huán)之前可用此表達式求出n的值。(6)總結以上分析,我們可得到以下的程序段:for(i=1;i<=L;i){
ch=′A′i-1;n=2*i-1;for(j=1;j<=n;j)putchar(ch);putchar(′\n′);}若所用的變量都已正確定義,通過輸入L的值為5,則程序段在第一列起有以下的輸出結果:ABBBCCCCCDDDDDDDEEEEEEEEE和題目的要求比較已趨接近,不同的是在每行沒有適當?shù)目s進。(7)現(xiàn)在來解決每行的縮進問題。由題中給出的圖形可知,若指定輸出5行,第一行縮進5個空格,第二行則縮進4個空格,第三行則縮進3個空格,第四行則縮進2個空格,第五行則縮進1個空格。這同樣可以由以下的for循環(huán)來實現(xiàn):for(k=L;k>=i;k--)putchar(′′);把此循環(huán)放在i控制的循環(huán)體內、輸出每行字符的循環(huán)之前即可。(8)請讀者自己補充有關的include行、語句和變量的定義,以完成整個程序。注意,如果有能力可在某些地方作些簡化。第七章函數(shù)習題分析與解答一、選擇題7.1【參考答案】
C)7.2【參考答案】
C)7.3【參考答案】
B)7.4【參考答案】
C)7.5【參考答案】
A)7.6【參考答案】
D)7.7【參考答案】
A)二、填空題7.8【參考答案】
127.9【參考答案】
9.0(或9.000000)7.10【參考答案】
47.11【參考答案】
[1]n=1
[2]s7.12【參考答案】
[1]<=y
[2]z*x7.13【參考答案】
[1]1
[2]s*i
[3]0
[4]f(k)三、程序調試和編程題7.14
【分析與解答】(1)fun函數(shù)判斷傳給形參n的數(shù)是否為素數(shù),若是函數(shù)返回1,否則返回0。(2)函數(shù)的原意是用變量yes作為判斷n是否為素數(shù)的標志,是素數(shù),其值為1,否則為0。而所給函數(shù)的實際流程卻不能實現(xiàn)這一功能,例如,若n的值為15(明顯不是素數(shù))時,在for循環(huán)中,當k的值為3時,就會執(zhí)行if子句,yes得0,但for循環(huán)并沒有終止,接著k為4時就會執(zhí)行else子句,又使yes得1,由此可見此程序段并不能準確地判斷一個數(shù)是否為素數(shù);最后確定yes為何值的是for循環(huán)的終止值n/2,當n為15時,k的值為n/2等于7,在循環(huán)體內將又一次執(zhí)行else子句,使yes得1,這時循環(huán)結束,函數(shù)返回1。由此可見所給fun函數(shù)不能起到預想的作用。(3)由上分析可知,對于n的值為15時而言,問題是在一旦yes的值為0,已判斷n中的值不是素數(shù)時,沒有及時退出循環(huán),返回0;因此,若在if子句中添加一條語句:break;就能解決這一問題,把if語句改寫如下:if(n%k==0){yes=0;break;}else
yes=1;(4)在所給fun函數(shù)中,當n的值為2、3時(都是素數(shù)),因為n/2的值為1(大于k中的2),所以不會進入for循環(huán),而直接執(zhí)行return語句,細心的讀者應該可以發(fā)現(xiàn),這時yes沒有賦過值,也就是說,返回的是一個不確定的值,這將會導致錯誤;因此,應當在定義語句中給yes賦初值1:int
k,yes=1;至此fun函數(shù)能正確運行。(5)總結:因為一旦if語句中的表達式:n%k==0的值為1(即可被某數(shù)整除),則可以確定n不是素數(shù),因此即可返回,不必再執(zhí)行函數(shù)其他部分,if子句可改成:if(n%k==0){yes=0;returnyes;}else
yes=1;也可簡化成:if(n%k==0)return
0;else
yes=1;又可進一步不用變量yes,并去掉else,簡化成(請參考例7.4):for(
k=2;k<=n/2;k)if(n%k==0)return
0;return
1;7.15【分析與解答】(1)若用整型變量c存放余數(shù),則求a被b除后的余數(shù)可用表達式:c=a%b。(2)本題要求編寫函數(shù)mymod用以求a被b除后的余數(shù)即:c=mymod(a,b);(3)只要把a%b作為函數(shù)值返回即可完成操作(請參考例7.1):int
mymod(int
a,int
b){
return
a%b;
}(4)總結:本題在算法上十分簡單,只是要求讀者能夠掌握編寫函數(shù)的基本知識。7.16【分析與解答】(1)本題所要采用的算法是累加。分析可見,所有累加項的分子都是1,而分母部分逐項增1;只是累加項的符號交叉變化。因此處理好符號的變化是完成操作的關鍵之一。(2)若函數(shù)名為funa,傳送到函數(shù)的參數(shù)是整型值,假定形參命名為n;函數(shù)的返回值應當是浮點型,為此函數(shù)的首部可以是:double
funa(int
n)(3)接著寫函數(shù)體。累加放在一個for循環(huán)中來完成,若循環(huán)控制變量為k,可利用循環(huán)控制變量作為累加項t的分母,累加值放在add中:for(k=1;k<=n;k){
……t=s*1.0/k;add=addt;}此處,s用作符號變量,在1和-1之間交叉變化,乘以1.0/k后,t的值也將按要求變化符號。注意,表達式1.0/k不可以寫成1/k,因為每一項的絕對值必定是小于1的小數(shù)。(4)現(xiàn)在需要確定s的值。最簡單的可用表達式:s=-s來實現(xiàn)(請參考例5.2),若賦值號右邊s中的值為-1,則賦值號左邊s中的值就得1;若賦值號右邊s中的值為1,則賦值號左邊s中的值就會得-1;則每循環(huán)一次就使s改變了一次符號。當然還可有多種方法。把以上表達式添加到循環(huán)體中:for(k=1;k<=n;k){
s=-s;t=s*1.0/k;add=addt;}(5)最后注意應當給各變量賦以適當?shù)某踔?,并返回函?shù)值。(6)請編寫主函數(shù)。當傳給形參的值為10時,函數(shù)的返回值應當是:0.645635。(7)總結:本題的算法并不復雜,但是需要讀者掌握編寫函數(shù)的基本知識。掌握需要傳入函。數(shù)的參數(shù)及其類型,掌握需要返回的值及其類型。在此基礎上,其他方面與先前在主函數(shù)中編寫的程序沒有什么區(qū)別。7.17
【分析與解答】(1)此題與7.18相似。函數(shù)的返回值為浮點型,函數(shù)只有一個形參,為整型。(2)函數(shù)的基本算法是累加,只是除第一項外其余各項都用減法;每一項的分子都是1,分母部分為k2,k的值逐項增1,由2變化到m。因此,算法可以用一個循環(huán)來實現(xiàn)。(3)當m的值為12時,函數(shù)值應是:0.435023。7.18【分析與解答】(1)若函數(shù)取名為fun,按題意,x作為形參,由調用函數(shù)傳入,其類型不應當用整型;表達式x2-5x4的值作為函數(shù)值返回,函數(shù)值的類型應為浮點型。因此,很容易寫出函數(shù):double
fun(double
x){
return
x*x-5*x4;
}(2)若在調用函數(shù)時,x和y2已正確定義,且x已有確定的值,則可用以下函數(shù)調用語句得到y(tǒng)2的值:y2=fun(x15);(3)同樣,若在調用函數(shù)時,x和y3已正確定義,且x已有確定的值,則可用以下函數(shù)調用語句得到y(tǒng)3的值:y3=fun(sin(x));注意,因為在程序中調用了C語言提供的庫函數(shù)sin,因此應當在程序的最前面包含以下命令行:#include
″″(4)參考(2)和(3)應不難寫出求y1的語句,請讀者自己完成。(5)y1的值應是:-2.0。當x的值為5時,y2的值應是:304.0。當x的值為0.5時,y3的值應是:1.832721。(6)總結:①本題已給出了函數(shù)需要求值的表達式,讀者只需確定函數(shù)的類型和形參的類型,就可以寫出函數(shù),就像例7.1中求兩數(shù)之和的函數(shù)一樣簡單。②在給定了函數(shù)之后,調用函數(shù)時,函數(shù)的實參應當是一個與形參類型一致的任意合法的表達式。例如,可以是常量、算術表達式,也可以是函數(shù)等。就像例7.1中求兩數(shù)之和的add函數(shù)一樣,可以用add(3,4);來求34;當x、y有確定值時,可以用add(x*x,y*y);來求x2y2;當x、y有確定值時,可以用add(sin(xy),cos(xy));來求sin(xy)cos(xy),這同樣可以通過add(sin(add(x,y)),cos((add(x,y)));來求得。第八章指針習題分析與解答一、選擇題8.1【參考答案】
A)8.2【參考答案】
B)8.3【參考答案】
B)8.4【參考答案】
C)8.5【參考答案】
B)8.6【參考答案】
B)8.7【參考答案】
C)8.8【參考答案】
D)8.9【參考答案】
B)8.10【參考答案】
C)8.11【參考答案】
C)8.12【參考答案】
C)二、填空題8.13【參考答案】
1108.14【參考答案】
7
18.15【參考答案】
char*p,*p=ch,
p=&ch;scanf(“%c/n”p,);ch=*p;p=&ch;printf(“%c/n”,*p);8.16【參考答案】
*s=*(p3),*(s-2),50,*s=*(a1),2,10,20,30,40三、編程題8.17【分析與解答】(1)若函數(shù)名為fun,按題意,函數(shù)不返回函數(shù)值;函數(shù)的形參需要接受傳送過來的兩個浮點數(shù),因此需要有兩個double類型的形參;另外要把它們的和值與差值,通過形參傳送回去,這就要求有兩個double類型的形參指針,接受傳送過來的地址,以便通過指針把和值與差值傳送給所指的主函數(shù)中的變量。因此函數(shù)的首部應當是:voidfun(double
a,double
b,double
*p1,double
*p2)這里,a、b、p1、p2是自己取的名。(2)假設把a、b的和值傳送給p1所指的存儲單元,可用語句:*p1=ab;把a、b的差值傳送給p2所指的存儲單元,可用語句:*p2=a-b;。(3)因此函數(shù)可寫成:voidfun(double
a,double
b,double
*p1,double
*p2){
*p1=ab;
*p2=a-b;
}(4)在主函數(shù)中,若有定義語句:double
x,y,z1,z2;,且x、y已賦值,則調用fun函數(shù)的語句可以是:fun(x,y,&z1,&z2);。(5)總結:本題所要求的算法極簡單,但它要求有兩個值返回,用return語句就不可能返回兩個函數(shù)值。要求讀者能利用形參指針把要求的值間接地傳回調用函數(shù)。8.18【參考答案】(1)若函數(shù)名為maxandmin,按題意,函數(shù)不返回函數(shù)值;函數(shù)將接受3個數(shù)(假定為int類型),并需要通過指針指向主函數(shù)中的兩個int型變量,以便把最大值和最小值放入指針所指的存儲單元中。因此函數(shù)的首部應當是:voidmaxandmin(int
a,int
b,int
c,int
*pmax,int
*pmin)(2)函數(shù)體中需要實現(xiàn)求3個數(shù)的最大值和最小值的算法,此算法應當在學習第四章時已經掌握(可參考例4.2和習題4.24)。如果把a、b、c中的最大值暫時放在max中,把最小值放在min中,可用以下算法找到最大值:①假定a中的數(shù)最大,把a賦給max。②用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也不做。③用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。④經過以上操作,max中已放入了a、b、c三個數(shù)中的最大數(shù)。⑤可模仿以上算法找到最小值:min=a;if(b<min)min=b;if(c<min)min=c;(3)若最大值已放入max中,最小值已放入min中,則可用以下語句把最大和最小值放入指針pmax和pmin所指的存儲單元中:*pmax=max;
*pmin=min;(4)若主函數(shù)中已把3個數(shù)放入x、y、z中,要求把最大值放入m中,把最小值放在n中,則調用語句應當是:maxandmin(x,y,x,&m,&n);(5)總結:本題要求的算法在第四章應當已掌握,本題的主要目的是要求讀者掌握如何通過指針把函數(shù)中的多個結果傳回主函數(shù)。第九章數(shù)組習題分析與解答一、選擇題9.1【參考答案】
D)9.2【參考答案】
A)9.3【參考答案】
A)9.4【參考答案】
A)9.5【參考答案】
C)9.6【參考答案】
A)9.7【參考答案】
B)9.8【參考答案】
D)9.9【參考答案】
C)9.10【參考答案】
C)9.11【參考答案】
C)9.12【參考答案】
D)9.13【參考答案】
D)9.14【參考答案】
A)9.15【參考答案】
A)9.16【參考答案】
A)9.17【參考答案】
C)9.18【參考答案】
C)二、填空題9.19【參考答案】
[1]9
[2]09.20【參考答案】
69.21【參考答案】
129.22【參考答案】
39.23【參考答案】
27219.24【參考答案】
-850,2,09.25【參考答案】
[1]k=p
[2]k9.26【參考答案】
[1](c=getchar())
[2]c-′A′三、上機題9.27【分析與解答】(1)對于字符的輸入可參考教材例6.3和習題9.26中的while循環(huán),只是要注意,循環(huán)的終止條件是:等于′\[KG-*3]n′。(2)在while循環(huán)體中,用if條件來判斷是否為數(shù)字字符,若是,就使對應的元素增1;if中的條件表達式可用C的庫函數(shù):isdigit(ch),這時要在程序前加:#include
<ctype.h>行;也可用:ch>[KG-*3]=′0′&&ch<[KG-*3]=′9′。(3)若用num數(shù)組元素來進行統(tǒng)計,當ch中是數(shù)字“0”時,使num[0]增1、當ch中是數(shù)字“1”時,使num[1]增1……num的下標表達式可用:ch-′0′。(4)注意,在定義數(shù)組時,數(shù)組的大小應符合使用的要求。在利用數(shù)組元素作為計數(shù)器時,不要忘記首先應該給數(shù)組元素賦0值。(5)總結:通過本題的編程,要求掌握利用數(shù)組元素作為計數(shù)器的基本算法。9.28【分析與解答】
本題的編程請參考例9.8。(1)若有以下10個整數(shù):0
1
2
3
4
5
6
7
8
9要求從第5個元素依次向前移,則移動之后的數(shù)列應該是:0
1
2
4
5
6
7
8
9第5個元素不是指下標為5的元素,而是指排列的順序,對此數(shù)列而言是指數(shù)值為4的那個。(2)完成移動后,數(shù)列中的數(shù)據(jù)個數(shù)減1。(3)若進行指定操作的函數(shù)名為moves,則函數(shù)的首部可如下:void
moves(int*a,intn,int*m)這里a用以指向一維數(shù)組的首地址,n接受開始移動的元素的位置,m指向主函數(shù)中存放元素個數(shù)的變量,因為沒有函數(shù)值返回,因此函數(shù)的類型定義為void。(4)可用以下for循環(huán)完成指定的移動:for(i=n-1;i<*m;i[KG-*3][KG-*3])a[i-1]=a[i];注意,應當先把第n個元素(下標為n-1)移到第n-1個元素(下標為n-2)的位置上,依次從前到后向前移動。(5)完成移動之后,應使m所指變量中的值減1,表示數(shù)列中的數(shù)據(jù)少了一個;這可由于句:*m=*m-1;來完成。(6)可設計一個輸出函數(shù),在移動前、后調用此函數(shù)輸出數(shù)組中的數(shù)據(jù),以便驗證操作是否正確。若輸出函數(shù)名為:outarr,則函數(shù)首部可寫成:void
outarr(inta[],intnum)形參a指向待輸出的數(shù)組,num接受數(shù)組中元素的個數(shù)。輸出操作可由一個for循環(huán)來完成:for(i=0;i<num;i[KG-*3][KG-*3])
printf(″%d″,a[i]);printf(″\[KG-*3]n\[KG-*3]n″);退出循環(huán)后的printf語句使上面的輸出行結束。(7)在主函數(shù)中定義所需的數(shù)組和變量。數(shù)組中的值可以在主函數(shù)中輸入,也可定義一個函數(shù)用于輸入數(shù)據(jù)。n的值在主函數(shù)中輸入,然后調用以上函數(shù)。需要注意的是,給n輸入的值不能是1,因為第一個元素(下標為0)再向前移,下標就越界了,同時,n的值也不可大于10,因為已指定只有10個元素。(8)總結:①對于需要進行多次的操作,如本程序中輸出數(shù)組元素中的值,應當編寫一個獨立的函數(shù)多次調用,而不應重復地編寫代碼。雖然該函數(shù)中只是一個for循環(huán),似乎在主函數(shù)中書寫兩次也不麻煩,但養(yǎng)成良好的模塊化程序設計的風格卻是十分重要的。②分析以上例子可見,所規(guī)定的操作,實際上刪除了數(shù)列中的第n-1個元素,因此可見刪除操作是由移動操作來完成的。9.29【分析與解答】(1)程序要求定義兩個數(shù)組以便存放原始數(shù)據(jù)和從中選出的所有奇數(shù)。(2)若把函數(shù)命名為oods,則函數(shù)首部可寫成:void
odds(int*a,intan,int*b,int*bn)形參a指向存放原始數(shù)據(jù)的數(shù)組,an存放此數(shù)組中數(shù)據(jù)的個數(shù);b指向另一個數(shù)組,此數(shù)組中將存放將選出的所有奇數(shù),指針bn指向存放奇數(shù)個數(shù)的存儲單元,因為將通過此指針,把奇數(shù)的個數(shù)傳回主函數(shù)。(3)在odds函數(shù)中,可通過一個for循環(huán)選出所有的奇數(shù):for(i=0;i<an;i[KG-*3][KG-*3])if(a[i]%2){b[j]=a[i];j[KG-*3][KG-*3];}在for循環(huán)中逐個引用原始的數(shù)組元素,若元素中的值不能被2除盡(不為0),則把它放入b所指的數(shù)組中;j用作b的下標,每放入一個奇數(shù)后,j的值加1;注意,j的初值應該置0。(4)當完成以上操作退出循環(huán)時,因為在循環(huán)內最后進行了一次j[KG-*3][KG-*3]的操作,所以j的值就是奇數(shù)的個數(shù),最后應當把它賦給*bn,以便通過指針bn把奇數(shù)的個數(shù)傳回主函數(shù)。(5)程序需要兩次輸出數(shù)組中元素的值,一次是輸出原始數(shù)組中的值,一次是輸出奇數(shù)數(shù)組中的值。因此可以使用題9.28中的outarr函數(shù),進行兩次調用。(6)在主函數(shù)中應當定義所需的數(shù)組和變量,可以在主函數(shù)中給數(shù)組元素輸入數(shù)據(jù)。(7)總結:本題的算法很簡單,要求讀者能夠編寫獨立的模塊,并在函數(shù)之間熟練地傳送數(shù)據(jù)。9.30【分析與解答】(1)例9.9完成了對整數(shù)由小到大的排序,而本題是對字符數(shù)組中的元素進行由大到小的排序;兩者之間并無大的區(qū)別,只是數(shù)組的類型不同,字符數(shù)組中每個元素存放一個字符,字符的大小依據(jù)每個字符的ASCII碼值的大小。(2)若函數(shù)形參a指向主函數(shù)中待排序的數(shù)組,由大到小的排序只需改變內循環(huán)中if語句的條件表達式即可:if(a[p]<a[i])p=i;此處i是內循環(huán)的控制變量。(3)排序前后可以調用一個輸出函數(shù),輸出原始數(shù)據(jù)和排序后的數(shù)據(jù),可參考習題9.28的outarr函數(shù),但注意,這里是對字符數(shù)組進行輸出。(4)總結:讀者可以參考例9.9,程序基本相同,但在掌握排序算法的基礎上,必須獨立完成此程序,不要照抄。9.31【分析與解答】(1)我們把插入操作命名為函數(shù)insert,若待插入的數(shù)據(jù)放在形參x中,指針a指向主函數(shù)中的數(shù)組,指針n指向存放數(shù)組中元素的個數(shù)變量,因為插入后,數(shù)組中的數(shù)據(jù)會增加。函數(shù)的首部如下:void
insert(int*a,intx,int*n)(2)若數(shù)組中原有的有序數(shù)列按由小到大排列如下,共12個數(shù):11
14
17
18
19
20
22
24
26
29
30
33若x中的數(shù)為21,我們立刻知道應插在何處,插入后數(shù)列如下,則插入后變成有13個數(shù):11
14
17
18
19
20
21
22
24
26
29
30
33因此,對于程序來說應當做以下4件事:①能根據(jù)待插的數(shù)據(jù),按“仍然有序的要求”判斷出插入的位置。②把位置騰出來,以便放入插入的數(shù)據(jù),但原有的數(shù)據(jù)不能缺少。③把x中的數(shù)放入騰出來的位置中。④使原有數(shù)組中的數(shù)據(jù)個數(shù)增1。(3)現(xiàn)在來做第一個步驟:確定插入的位置。用變量j來放置該位置在數(shù)組中的下標,以下while循環(huán)將完成此任務:j=0;while(j<*n&&a[j]<x)
j[KG-*3][KG-*3];因為已經假定數(shù)列按由小到大排列,當x的值大于當前的元素a[j]時,應當接著與下一個元素比較(執(zhí)行j[KG-*3][KG-*3]),直到x的值小于或等于當前的元素a[j]時,x就應當插入到下標為j的元素中,在此之前的所有值都比x小。當x的值小于a[0]時,不進入while循環(huán),j的值為0。x就應當插入到下標為0的元素中。當x的值大于數(shù)組中所有的元素時,由條件:j<*n可知,這時j的值將等于*n并退出循環(huán)。x就應當插入到下標為j的元素中。(4)第二個步驟是要把下標為j的元素后原有的數(shù)據(jù)移走,但不能改變原來的順序。那么只能把下標為j至下標為*n-1中的數(shù)據(jù)依次向后平移;這種平移,應當先把最后的、下標為*n-1的元素中的數(shù)據(jù)移到下標為*n的元素中,其他依次后移一個單元,直到把a[j]中的值放入a[j1]中。這可由以下for循環(huán)來完成:for(i=*n-1;i>[KG-*3]=j;i--)
a[i1]=a[i];(5)第三個步驟是把x放入a[j]中:a[j]=x;(6)第四步是使存放數(shù)據(jù)個數(shù)的變量中的數(shù)增1:*n=*n1;插入過程到此結束。(7)可利用習題9.28中的outarr函數(shù),在插入前和插入后兩次輸出數(shù)組元素,以判斷操作是否正確。(8)請編寫主函數(shù),定義所需的數(shù)組和變量,給數(shù)組輸入一組有序數(shù),正確調用函數(shù)。(9)請按題目要求至少對程序運行3次,判斷程序是否在各種情況下都能得到正確的結果。(10)總結:插入算法是程序設計中的一種最基本的算法,希望讀者在理解的基礎上編寫程序。9.32【分析與解答】(1)若函數(shù)名為change,函數(shù)首部如下:void
change(intx,int*a,int*n)形參x中存放一個待轉換的十進制數(shù),指針a指向一個一維數(shù)組,數(shù)組中每一個元素中存放一個0或1代表一位二進制數(shù),指針變量n指向一個整型變量,其中存放在一維數(shù)組中二進制位的個數(shù)。(2)函數(shù)中定義一個指針變量s,并把a所指的數(shù)組的首地址賦給它以便保留。把x每次被2除后的余數(shù)放在a當前所指的數(shù)組元素中,然后移動指針a指向下一個元素,并使x的值除2;重復此過程,直到x的值為0??捎靡韵碌膚hile循環(huán)來進行轉換:s=a;while(x){
*a=x%2;
a[KG-*3];
x=x/2;
}退出循環(huán)時,已把轉換后的二進制數(shù)的每一位上的數(shù)放入主函數(shù)的數(shù)組元素中,但是應當注意,在a[0]中放的是二進制數(shù)的最低位,最后放入的是最高位。例如,整數(shù)8轉換成的二進制數(shù)為100,則在a[0]、a[1]中存放的是0,而a[2]中存放的是1。(3)函數(shù)中最后用:*n=a-s;把存放在一維數(shù)組中二進制位的個數(shù)放入n所指的變量中。因為s已指向主函數(shù)中數(shù)組的第一個元素(下標為0);在循環(huán)中,指針a不斷后移,最后指向存放二進制數(shù)最高位的元素;所以a-s的值就是已存入數(shù)據(jù)的元素的個數(shù)。(4)在主函數(shù)中輸入待轉換的十進制數(shù),調用change函數(shù)后輸出數(shù)組元素中的值,注意,因為在a[0]中放的是二進制數(shù)的最低位,因此輸出的順序應該從a[n]到a[0]。9.33【分析與解答】(1)若函數(shù)名為getone,形參指針a指向主函數(shù)中存放指定數(shù)據(jù)的數(shù)組。函數(shù)的首部如下:void
getone(int
a[])(2)函數(shù)中變量x用來存放得到的一個隨機數(shù),變量n用來存放數(shù)組中已放入的不同的隨機數(shù)的個數(shù),變量i用作下標變量。(3)所有的工作在一個while循環(huán)中完成:while(n<15){……}當不同的隨機數(shù)的個數(shù)n的值等于15時退出循環(huán)。(4)在以上while循環(huán)中需要進行以下4項步驟:①x=rand();得到一個小于20的隨機整數(shù)。②i=0;準備從下標為0的元素開始去查找數(shù)組中是否有與x相同的數(shù),若沒有,就把x中的數(shù)加入到數(shù)組中(放在最后),若有,就什么也不做。③用以下while循環(huán)從頭到尾去檢查數(shù)組中是否有與x值相同的元素:while(i<n&&x!=a[i])i[KG-*3][KG-*3];在兩種情況下,退出循環(huán):a.當x不等于a[i]時,i[KG-*3][KG-*3],x再去與下一個元素進行比較,當遇到x等于a[i]時,說明在數(shù)組中已經有此數(shù),因此不必再去比較,應當退出循環(huán)。b.當x不等于a[i]時,i的值不斷增1;當i的值等于n時,說明x已與數(shù)組中所有元素都比較過且都不相同,這時也應退出循環(huán)。④如果i的值等于n時,數(shù)組中沒有與x相同的元素,因此需要把新的值放入數(shù)組中,可用以下語句來實現(xiàn):if(i==n){a[n]=x;n[KG-*3][KG-*3];}因為已有的數(shù)據(jù)放在下標為0到n-1的元素中,因此新的數(shù)放在a[n]中,然后n[KG-*3][KG-*3];即數(shù)組中不同數(shù)據(jù)的個數(shù)增1。(5)接著重新循環(huán),再去產生一個新的隨機數(shù),重復以上過程,直到n的值等于15時退出外循環(huán)。這時在數(shù)組中已放入了15個不同的隨機整數(shù)。(6)請在主函數(shù)中定義所需的數(shù)組和變量。調用getone函數(shù)后,可在主函數(shù)中輸出所得的數(shù)據(jù)。(7)總結:①getone函數(shù)的主要部分是查找,沒有找到才進行下一步操作。②C語言提供的庫函數(shù)rand()每調用一次產生一個0到32767的隨機整數(shù),因此rand()將得到一個0到19的隨機整數(shù)。9.34【分析與解答】(1)本題可參考例9.11。(2)本題可用define命令行定義N來代表一個常量(參考2.2.3節(jié))??啥x4個獨立的函數(shù)來實現(xiàn)所要求的操作。第一個函數(shù):voidgetm(int(*[KG-*3]p)[N])用于給二維數(shù)組元素賦隨機數(shù)。形參p是一個行指針,N是二維數(shù)組的列數(shù)。第二個函數(shù):voidsum(inta[][N],int*rows,int*[KG-*3]cols)用于求出二維數(shù)組每一行元素的和值放在形參指針rows所指的一維數(shù)組中,求出二維數(shù)組每一列元素的和值放在形參指針cols所指的一維數(shù)組中。形參a是一個行指針,N是二維數(shù)組的列數(shù)。第三個函數(shù):voiddiagsum(inta[][N],int*dg1,int*dg2)用于求出方陣的兩個對角線上元素的和值,分別放在形參指針dg1和dg2所指的變量中。形參a是一個行指針,N是二維數(shù)組的列數(shù)。第四個函數(shù)用于必要的輸出,請讀者自己設計。(3)在getm函數(shù)中,利用一個雙重循環(huán),調用rand函數(shù)給二維數(shù)組賦值:for(i=0;i<N;i[KG-*3][KG-*3])for(j=0;j<N;j[KG-*3][KG-*3])p[i][j]=rand()0;(4)在sum函數(shù)中,利用一個雙重循環(huán),分別求出每行的和值放入rows所指數(shù)組中,每列的和值放入cols所指數(shù)組中:for(i=0;i<N;i[KG-*3][KG-*3])for(j=0;j<N;j[KG-*3][KG-*3]){
rows[i][KG-*3]=a[i][j];
cols[i][KG-*3]=a[j][i];
}當i=0時,rows[i][KG-*3]=a[i][j];通過內循環(huán)控制變量j從0到N-1的變化,把下標為0行上的每一個元素的值累加,放入rows所指的、下標為0的數(shù)組元素中;而cols[i][KG-*3]=a[j][i];通過內循環(huán)控制變量j從0到N-1的變化,把下標為0列上的每一個元素的值累加,放入cols所指的、下標為0的數(shù)組元素中。其他依次類推。因為進行累加運算,注意要給每個一維數(shù)組置初值0。(5)在diagsum函數(shù)中,通過一個for循環(huán)來求得兩對角線上元素之和:for(i=0;i<N;i[KG-*3][KG-*3]){dg1[KG-*3]=a[i][i];
dg2[KG-*3]=a[i][N-i-1];}在主對角線上的元素行下標和列下標相同。而在從右到左對角線上的元素,行下標從0變化到N-1;對于列下標,當行下標為0時,列下標為N-i-1,當行下標為1時,列下標也可用表達式N-i-1求得,其他依此類推。(6)請參考例9.11的outdata函數(shù)對二維數(shù)組和有關數(shù)據(jù)的輸出。(7)總結:對二維數(shù)組的操作,一般可利用一個雙重循環(huán)來進行。本題雖然有多個任務,但可用函數(shù),每個函數(shù)完成一個任務,每個函數(shù)都很簡單,且都很容易讀懂;一定要避免把所有的任務混在一起。9.35【分析與解答】(1)要進行相加的兩個矩陣(假定為a和b)的行數(shù)應當相等,列數(shù)應當相等。兩個矩陣相加就是把兩個矩陣中下標相同的兩個元素相加,相加的和值放在第三個矩陣(假定為c)、相同下標的元素中。即:c[i][j]=a[i][j]b[i][j]。(2)可以定義一個函數(shù)getms(參考題9.34),利用rand()函數(shù)給兩個矩陣賦值。(3)定義addm函數(shù),對兩個矩陣相加:voidaddm(int(*a)[M],int(*b)[M],int(*[KG-*3]c)[M])這里a、b、c是行指針,分別指向三個二維數(shù)組(N行M列),要求這三個數(shù)組的行和列數(shù)相同。和值放在c所指數(shù)組中。矩陣相加的操作放在一個雙重循環(huán)中:for(i=0;i<N;i[KG-*3][KG-*3])for(j=0;j<M;j[KG-*3][KG-*3])c[i][j]=a[i][j]b[i][j];(4)定義output函數(shù)用以輸出矩陣:voidoutput(int(*a)[M])用雙重循環(huán)來實現(xiàn)for(i=0;i<N;i[KG-*3][KG-*3]){
for(j=0;j<M;j[KG-*3][KG-*3])printf(″M″,a[i][j]);printf(″\[KG-*3]n″);}可調用三次分別輸出a、b、c三個矩陣。(5)請在主函數(shù)中定義數(shù)組和所需的變量。調用getms函數(shù)得到原始數(shù)據(jù),調用addm函數(shù)實現(xiàn)矩陣相加,調用輸出函數(shù)輸出三個矩陣。9.36【分析與解答】(1)為了輸出以上表格,需要定義一個9×9的二維數(shù)組。在其中存入九九表中的數(shù)據(jù)。(2)定義函數(shù)gettab,在二維數(shù)組中存入九九表中的數(shù)據(jù):voidgettab(int
a[][N])形參a是一個指向9×9二維數(shù)組的行指針。(3)在gettab函數(shù)中,可用以下for循環(huán)把九九表中的數(shù)據(jù)放入數(shù)組中:for(i=0;i<N;i[KG-*3][KG-*3])for(j=0;j<N;j[KG-*3][KG-*3])a[i][j]=(i1)*(j1);(4)請讀者參照前面的習題,設計output函數(shù),輸出九九表。表格的第二行:(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)可用以下語句輸出:for(i=1;i<[KG-*3]=9;i[KG-*3][KG-*3])
printf(″(%d)
″,i);printf(″\[KG-*3]n″);在二維數(shù)組每一行輸出前(即內循環(huán)之前)加語句:printf(″(%d)″,i1);就可得到每一行最前面的(1)、(2)、…、(9)。(5)輸出的格式不可能在第一次調試時就合適,一般需運行幾次進行調整。(6)請讀者自己完成主函數(shù),定義所需的數(shù)組和變量,調用以上的函數(shù)。(7)總結:本題的算法很簡單,只包含給二維數(shù)組的賦值和表格的輸出,對于表格的格式,可以通過對程序的運行,逐步進行調整。9.37【分析與解答】(1)假定程序定義了M行N列的二維數(shù)組??捎胐efine命令行定義N和M來分別代表兩個常量(參考2.2.3節(jié))。(2)程序的功能可由幾個獨立的函數(shù)來實現(xiàn)。①voidgetm(int
(*[KG-*3]p)[N])形參p是一個行指針,指向M×N的數(shù)組首地址。getm函數(shù)的功能是通過調用rand函數(shù)給二維數(shù)組賦值。請參考習題9.34中的同名函數(shù)。②voidsuml(inta[][N],int*rows)形參a是一個行指針,指向M×N的數(shù)組首地址,指針rows指向一個一維數(shù)組,在此數(shù)組元素中將存放每行元素之和。suml函數(shù)的功能是求出a所指二維數(shù)組中每一行元素之和并依次放在rows所指數(shù)組中。請參考習題9.34中的sum函數(shù)。③intgetmax(int
*rows)形參指針rows指向存放每行元素之和的一維數(shù)組,在此函數(shù)中將求出最大值所在的下標作為函數(shù)值返回。請參考習題9.25。④voidchange(inta[][N],intk)形參行指針a,指向M×N的數(shù)組首地址,k接受一維數(shù)組中最大值所在的下標。此函數(shù)的功能是把二維數(shù)組中下標為k的那一行、與下標為0的行的所有元素進行對調。對調可用一個for循環(huán)來實現(xiàn):for(i=0;i<N;i[KG-*3][KG-*3]){
t=a[0][i];a[0][i]=a[k][i];a[k][i]=t;}⑤voidoutput(inta[][N])此函數(shù)的功能是輸出a所指的二維數(shù)組。可在數(shù)組改變前后分別調用它,以判斷程序的操作是否正確。請參考習題9.35中的同名函數(shù)。(4)請在主函數(shù)中定義所需的數(shù)據(jù)結構:如數(shù)組、變量,并調用各函數(shù)。(5)總結:交換數(shù)據(jù)的算法應當已很熟悉,本題只是交換兩行中的數(shù)據(jù),這時被交換的兩個元素的行下標不同,而列下標相同。讀者不妨對兩列中的數(shù)據(jù)進行交換。本題中,除對二維數(shù)組中的兩行進行對調外,其他的算法在此之前都已介紹過,由此可知,應當積累一些基本的算法知識,程序的完成都是由一些基本算法來實現(xiàn)的。9.38【分析與解答】(1)在定義數(shù)組時應該注意,進行逆置操作的矩陣必須是一個方陣,行、列數(shù)相同。(2)在本題中給二維數(shù)組置數(shù)以及對二維數(shù)組進行輸出,請參考習題9.37,在此不再重復。(3)對矩陣進行逆置的操作可由以下函數(shù)完成:voidtranspose(int
p[][N])形參p指向一個二維數(shù)組。逆置的過程可由雙重循環(huán)來完成:for(i=0;i<N;i[KG-*3][KG-*3])for(j=0;j<i;j[KG-*3][KG-*3]){
t=p[i][j];p[i][j]=p[j][i];p[j][i]=t;
}內循環(huán)的控制變量j的變化范圍從0到i,以對角線為界,把對稱位置上的元素值進行對調。(4)請編寫主函數(shù),定義所需的數(shù)據(jù)結構,并調用函數(shù)來實現(xiàn)規(guī)定的操作。(5)總結:本題主要的算法也是交換算法,關鍵是需要正確確定交換的范圍。第十章字符串習題分析與解答一、選擇題10.1【參考答案】
B)10.2【參考答案】
B)10.3【參考答案】
C)10.4【參考答案】
B)10.5【參考答案】
C)10.6【參考答案】
A)10.7【參考答案】
D)10.8【參考答案】
A)10.9【參考答案】
C)10.10【參考答案】
C)二、填空題10.11【參考答案】
GFEDCB書上(-chp)改為(--chp)10.12【參考答案】
XYZA10.13
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年油田工程技術服務項目融資計劃書
- 2024秋新滬科版物理八年級上冊教學課件 第五章 質量 第三節(jié) 密度
- 機械原理考試題
- 養(yǎng)老院老人生活娛樂活動組織人員職業(yè)道德制度
- 養(yǎng)老院老人健康管理制度
- 《就業(yè)中國演講》課件
- 《金地格林世界提案》課件
- 提前預支工資合同
- 2024事業(yè)單位保密協(xié)議范本與保密工作考核3篇
- 2024年度離婚協(xié)議書詳述財產分配與子女撫養(yǎng)細節(jié)及責任2篇
- 做自己的心理壓力調節(jié)師智慧樹知到期末考試答案2024年
- ASME材料-設計許用應力
- 財務報表公式模板
- 員工信息安全入職培訓
- 項目現(xiàn)場協(xié)調配合措施
- (2024年)課堂教學與信息技術融合ppt課件pptx
- 制作紙杯蛋糕(課件)全國通用六年級下冊綜合實踐活動
- 事業(yè)單位會計講解
- 巨量直播電商運營認證考試64題
- 2021年10月自考00058市場營銷學試題及答案含解析
- 精準醫(yī)學演講課件
評論
0/150
提交評論