




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
《全國計算機等級考試二級教程—C語言程序設(shè)計》
習(xí)題分析與詳細斛答
第一章程序設(shè)計基本概念習(xí)題分析與解答
1.1【參考答案】EXE
1.2【參考答案】[1].C[2].OBJ[3].EXE
1.3【參考答案】[1]順序結(jié)構(gòu)[2]選擇結(jié)構(gòu)[3]循環(huán)結(jié)構(gòu)
第二章C程序設(shè)計的初步知識習(xí)題分析與解答
一、選擇題
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【參考答案】口]11[2]12
2.15【參考答案】[1]4.2[2]4.2
2.16【參考答案】口]{⑵}[3]定義[4]執(zhí)行
2.17【參考答案】[1]關(guān)鍵字[2]用戶標(biāo)識符
2.18【參考答案】[1]int[2]float[3]double
2.19【參考答案】floatal=1.0,a2=1.0;
或floatal=l,a2=l;(系統(tǒng)將自動把1轉(zhuǎn)換為1.0)
2.20【參考答案】存儲單元
2.21【參考答案】3.5
2.22【參考答案】[1]a*b/c[2]a/c*b[3]b/c*a
2.23【參考答案】把10賦給變量s
2.24【參考答案】El]位[2]1位二進制數(shù)據(jù)(0或1)
2.25【參考答案】[1]8[2]127[3]01111111[4]-128[5]10000000
2.26【參考答案】[1132767[2]-32768[3]1000000000000000
2.27【參考答案】口]十⑵八[3]十六
三、上機改錯題
2.28【分析與解答】
第1行的錯誤:
(1)include是一個程序行,因此在此行的最后不應(yīng)當(dāng)有分號(;)。
第2行的錯誤:
(l)main()是主函數(shù)的起始行,不是語句,因此最后不應(yīng)當(dāng)有分號⑴。
(2)在同一行上的/*mainfunction*/顯然是注釋;C語言規(guī)定:注釋由/*開頭,由*/
結(jié)束,但在*號和/之間不得插入任何空格,而在此處“/*”和“*/”之間存在空格,因此,
/*mainfunction*/的寫法是錯誤的,而應(yīng)寫成:/*mainfunction*/。
第3行的錯誤:
(1)在主函數(shù)的起始行main。的后面是函數(shù)體,函數(shù)體由左花括號({}開始。但在函數(shù)體的第
一行:float的前面缺少了左花括號({}。
(2)在同一?行上的/*/*risradius*/,/*sisareaofcircular*/*/顯然是注釋;C語言規(guī)定:注釋由
/*開頭,由*/結(jié)束,并且開頭的/*將去找最近的*/去配對,因此在/*/*risradius*/中,第一個/*
與radius后的那個*/配上了對,結(jié)果緊跟在后面的那個逗號(,)落在了注釋的外面,而構(gòu)成了
一個多余符號,為此,在編譯時將報告"語法錯"。/*sisareaofcircular*/*/中第一個*/就結(jié)
束了注釋,第一個*/就成了多余的了。
第6行的錯誤:
(l)printf(,z%f'n",s)應(yīng)當(dāng)是一條輸出語句,但在最后缺少了,個分號。
⑵printf("%f'n",s);是程序的最后一條語句,程序應(yīng)當(dāng)結(jié)束;但缺少了程序體結(jié)束所需的
右花括號());此右花括號可以放在printf("%f'n",s);的后面,也可以放在printf(,/%f\
n",s);的下一行上。
2.27【分析與解答】
第2行的錯誤:在main的后面缺少一對圓括號。
第4行的錯誤:在c=4.0的后面缺少分號。
第6行的錯誤:在printf("%f\n",v)的后面缺少分號。
第三章順序結(jié)構(gòu)習(xí)題分析與解答
一、選擇題(單選題)
C\
3.1【參考答案】/J
C\
3.2【參考答案】z)
D\
3.3【參考答案】zl
C\
3.4【參考答案】zl
D\
3.5【參考答案】z)
BX
3.6【參考答案】ZJ
C\
3.7【參考答案】/J
D\
【參考答案】/!
3.8A
1\
3.9【參考答案】/
BX
/)
3.10【參考答案】C
)X
3.11【參考答案】D/
!\
3.12【參考答案】D/
3.13【參考答案】A
!\
3.14【參考答案】C/
1\
3.15【參考答案】C/
)\
3.16【參考答案】Cz
)\
3.17【參考答案】Dz
J\
3.18【參考答案】CZ
X
3.19【參考答案】B/)
\
3.20【參考答案】7
二、填空題
3.21【參考答案】
(1)-200,2500(2)i=-200,j=2500
(3)i=-200
j=2500
3.22【參考答案】[1]12⑵0[3]0
3.23【參考答案】[1]--條語句[2]分號(或;)
3.24【參考答案】分號(;)
3.25【參考答案】
E1]:10025.811.89234
[2]:100<CR>
25.81<CR>
1.89234<CR>
[3]:100<Tab>25.81<Tab>1.89234
3.26【參考答案】x=127,x=127,x=177,x=7f,x=127
3.27【參考答案】x=127,x=127,x=$127,x=$000127,x=%06d
3.28【參考答案】a=513.789215,a=513.79,a=513.78921500,a=513.78921500
三、編程題和改錯題
3.29【分析與解答】
(1)主函數(shù)名main后應(yīng)有一1對圓括號。
(2)第三行的printf語句用以提示輸入,但是原樣輸出的字符串沒有用雙引號括起來;另外,
從輸入的形式看,輸入的數(shù)據(jù)緊跟在提示之后,因此,printf格式串中最后不應(yīng)該有換行符一
一\n。
(3)因為輸入項a、b、c從定義和計算結(jié)果來看都是double類型,因此,第四行scanf語句格
式串中的格式說明不應(yīng)當(dāng)用%d而應(yīng)當(dāng)用%If;且每一個變量之前應(yīng)該加地址運算符
(4)第七行的printf語句中應(yīng)當(dāng)把%d都改成%If或%f;按輸出要求在格式串中應(yīng)添加相應(yīng)的原
樣輸出的字符;因為下一個printf的輸出從新的一行開始,因此在本輸出語句的格式串的最
后應(yīng)當(dāng)加換行符——\no
(5)第八行的printf語句中應(yīng)當(dāng)把格式串整理合并放在輸出項的前面,輸出項放在后面,%d
都改成%If或%f;中間的\n刪去。
(6)請同學(xué)們自己寫出修改后的程序,并上機調(diào)試。
3.30【分析與解答】
(1)分析:可用算術(shù)式560960把分鐘換算成小時和分鐘,商數(shù)就是小時數(shù),余數(shù)就是分鐘
數(shù)O
(2)確定變量的名字和定義變量的類型:在程序中把小時數(shù)放在變量h中,把分鐘數(shù)放在變
量m中。這兩個變量的類型可以是整型(本題中采用整型),也可以是實型。
(3)確定所用算法:求560?60的商數(shù),在C語言中可以用整除的算法,語句是h=560/60;。
求余數(shù)可用求余運算符%:560%60,其值放入變量m中的語句是:m=560%60;o(4)設(shè)計輸
出格式。若輸出的形式定為:小時:分鐘,則按此形式設(shè)計輸出語句。
(5)把以上內(nèi)容放在主函數(shù)的一對花括號中。
(6)編寫程序如下:
main()
{inth,m;
h=560/60;
m=560%60;
printf("Theresult:%3d:%3d\n",h,m);
)
運行結(jié)果是:
Theresult:9:20
3.31【分析與解答】
(1)確定變量的名字和定義變量的類型。若用a存放1500,用b存放350;用q存放商數(shù),用
r存放余數(shù),所有變量應(yīng)定義成int類型。
(2)設(shè)計輸入語句從終端輸入1500和350;在輸入語句之前,應(yīng)當(dāng)設(shè)計一個輸出語句,用以
提示輸入。
(3)可用整除求商數(shù),結(jié)果放在變量q中??捎们笥噙\算符%求兩數(shù)之余數(shù),結(jié)果放在變量r
中。
(4)設(shè)計輸出語句。輸出a、b、q、r0
(5)把以上內(nèi)容放在主函數(shù)的一對花括號中。
本題的程序與3.30相似,請大家參考上題并根據(jù)本題的解釋自己編程,并上機調(diào)試。
3.32【分析與解答】
(1)定義4個雙精度變量a、b、c和ave,變量a、b、c分別存放讀入的3個雙精度數(shù),ave
存放它們的平均值。
(2)設(shè)計輸入語句,以及在此之前用于提示輸入的(print。語句。
(3)設(shè)計求平均值的算法,把所求得的平均值放入變量ave中。
(4)設(shè)計把變量ave中的數(shù),從小數(shù)點后第二位數(shù)進行四舍五入的算法?,F(xiàn)舉例說明:若ave
中的數(shù)為123.4644,為了保留此值小數(shù)點后一位,可用表達式:(int)(123.4644*10)此0.0;依
次推算,為了保留此值小數(shù)點后二位,可用表達式:(int)(123.4644*100)/100.0;其他依此類
推。
(5)若要求對小數(shù)點后第二位數(shù)進行四舍五入,則可對原數(shù)加0.05后再進行以上運算。如要
求保留1234644小數(shù)點后一位且對第二位數(shù)進行四舍五入,可用表達式:
(int)((123.467+0.05)*10)/10.Oo注意:分母一定要用實數(shù)10.0而不能用整數(shù)10,否則就變成整
除了;若要求保留123.4644小數(shù)點后兩位且對第三位數(shù)進行四舍五入,可用表達式:
(int)((123.467+0.005)*100)/100.0;其他依此類推。
(6)設(shè)計輸出語句。輸出a、b、c和ave。
(7)把以上內(nèi)容放在主函數(shù)的一對花括號中。
(8)編寫程序如下:
main()
{doublea,b,c,ave;
printf("Entera,b,c:");
scanf("%lf%lf%lf,&a,&b,&c);
ave=(a+b+c)/3;
printf(z/ave=%f\n",ave);/*用以比較四舍五入前后的數(shù)據(jù)*/
ave=(int)((ave+0.05)*10)/10.0;
/*上句也可寫成ave=(int)(ave*10+0.5)/10.0;*/
printf("a=%f,b=%f,c=%f,ave=%f\n,z,a,b,c,ave);
)
3.33【分析與解答】
(1)關(guān)于對變量中的數(shù)進行交換的算法請參考3.7題中的解釋和《教程》中有關(guān)的例題。
(2)定義4個整型變量a、b、c和t,變量a、b、c分別存放讀入的3個整數(shù),t用作臨時存儲
單元。
(3)設(shè)計輸入語句,以及在此之前用于提示輸入的(printf)語句。
(4)輸出a、b、c中的值,以便于比較。
(5)交換的步驟如下:
①把c中的值賦給t。
②把b中的值賦給c。
③把a中的值賦給b。
④把t中的值賦給a。
經(jīng)過以上步驟,已按要求進行了交換。
(6)輸出a、b、c中的值。
(7)編寫程序如下:
main()
{inta,b,c,t;
printfEntera,b,c:'n");
scanf(〃%d%d%d,/,&a,&b,&c);
printfC,(1)a=%d,b=%d,c=%d\n'/,a,b,c);
t=c;c=b;b=a;a=t;
printf("⑵a=%d,b=%d,c=%d\n,f,a,b,c);
第四章選擇結(jié)構(gòu)習(xí)題分析與解答
一、選擇題
x
A)
4.1【參考答案】z
BX
)
4.2【參考答案】/
A\
J
4.3【參考答案】D/
4.4【參考答案】
C\
J
4.5【參考答案】A/
\
J
4.6【參考答案】BZ
\
l
4.7【參考答案】Cz
\
!
4.8【參考答案】D/
4.9【參考答案】D
4.10【參考答案】
二、填空題
4.11【參考答案】[1]非零[2]零
4.12【參考答案】<>>、<=、>=>==、![KG-*2]=
4.13【參考答案】L1]![2]&&[3][JB>1I][JB>1I]
4.14【參考答案】[門:
[2]:<、>、<=、>=(小于、大于、小于等于、大于等于)
[3]:==、![KG-*2]=(等于、不等)
[4]:&&(邏輯與)[5]:(邏輯或)。
4.15【參考答案】
4.16【參考答案】El]a=b或a<c[2][JB>ll]x[JB>ll]>4
4.17【參考答案】1
4.18【參考答案】El]x<=0[2]1
4.19【參考答案】El]3[2]2[3]2
4.20【參考答案】*#
三、編程題
4.21【分析與解答】相關(guān)內(nèi)容請參考《教程》4.2節(jié)和4.4節(jié)。
(1)改寫如下:
switch(a/10)
{default:m=5;break;
case0:case1:case2:m=l;break;
case3:m=2;break;
case4:m=3;break;
case5:m=4;break;
);
(2)本題中對a的判斷條件有一定的規(guī)律可尋;關(guān)鍵是,在switch語句后的表達式中利用了
a/10,從而簡化了case標(biāo)號。
4.22【分析與解答】
編寫本題的程序,首先要解決如何計算學(xué)生當(dāng)前的年齡(設(shè)存放實足年齡的變量是age)0
(1)如果當(dāng)前的月份大于生日的月份,則學(xué)生的實足年齡age=yl-yO。
(2)如果當(dāng)前的月份等于生日的月份,就要看日數(shù),當(dāng)前的日數(shù)大于或等于生日的日數(shù),則
學(xué)生的實足年齡age=yl-yOo
(3)如果不滿足以上的條件,就可斷定當(dāng)前的日期沒有超過生日日期,就是說學(xué)生的年齡應(yīng)
當(dāng)是age=yl-yO-lo
以上3條,用C語言可以描述如下:
if((ml>mO)[JB>ll][JB>ll](ml==mO&&d1>=dO))age=y1-yO;
elseage=yl-yO-l;
讀者可以參考以上語句寫出程序,也可以根據(jù)分析寫出與此形式不同的語句和程序。
4.23【分析與解答】
(1)若輸入的整數(shù)a是奇數(shù),輸出:oddnumber,是偶數(shù)輸出:evennumbero
⑵若一個a是偶數(shù),它就能被2除盡,即a%2==0,輸出evennumber;若是奇數(shù),
它就不能被2除盡,即a%2!KKG-*2》=0,輸出oddnumbero
讀者可以參考以上給出的算法,寫出相應(yīng)的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)經(jīng)過以上操作,max中已放入了a、b、c三個數(shù)中的最大數(shù),輸出max即可。
讀者可以參考以上給出的算法,寫出相應(yīng)的C語句,并編寫出完整的程序。
4.25【分析與解答】
(1)本題已給出了非常明確的條件,只要寫出正確的條件判斷語句就可基本完成程序的編寫。
(2)由給出的函數(shù)可知,只有x的值在規(guī)定的范圍內(nèi)時,才求出y的值,因此程序應(yīng)當(dāng)對輸
入的x進行判斷,若超過范圍就不求y的值。
⑶現(xiàn)以使用if[CD#*2]else語句為例寫出程序供參考。
main()
{intx,y;
printf("Enterx:");scanf("%d",&x);
if(x>-5&&x<10)
{if(x==0)y=x-1;
elseif(x<10&&x>0)y=x+l;
elseif(x<0&&x>-5)y=x;
printf(,fx=%dy=%d\n",x,y);
)
printf("***END***\n\n");
第五章循環(huán)結(jié)構(gòu)習(xí)題分析與解答
、選擇題(單選題)
5.1【參考答案】
5.2【參考答案】
5.3【參考答案】
5.4【參考答案】
5.5【參考答案】
5.6【參考答案】
D\
!
5.7【參考答案】7
A
5.8【參考答案】D
\
|
7
5.9【參考答案】D
\
1
5.10【參考答案】7
二、填空題
5.11【參考答案】[1]5[2]4[3]6
5.12【參考答案】程序段無限循環(huán),沒有輸出結(jié)果
5.13【參考答案】-1
5.14【參考答案】11
5.15【參考答案】[1]d=1.0[2]k++[3]k<=n
5.16【參考答案】[1]x>=0[2]x<amin
三、編程題
5.17【分析與解答】
(1)本題的基本算法是求累加值。累加項的值有規(guī)律的遞增,每一項的絕對值比前一項增2,
因此可以利用循環(huán)的控制變量的遞增來得到累加項的絕對值。例如:
for(i=l;i<=101;i+=2)...
(2)按所給的算式可以看到,累加項的符號是在交叉改變的,為此應(yīng)當(dāng)在循環(huán)體內(nèi)設(shè)
置一個變量,使它的符號按此規(guī)律交叉改變,這可用:s=-s;來實現(xiàn),s的初值為1;當(dāng)s的值
為1時,賦值后s中新的值為-1,當(dāng)s的值為-1時,賦值后s中新的值為1。用s去乘累加項,
將使累加項的符號也隨之有規(guī)律地改變。
(3)若累加和放在變量sum中,累加項放在變量t中,按照以上敘述,for循環(huán)體內(nèi)的語句可
以設(shè)計如下:
s=-s;t=s*i;sum=sum+t;
(4)sum的值是51o
(5)請讀者自己對變量做出正確的定義并賦初值,設(shè)計輸出語句,完善程序。
5.18【分析與解答】
(1)本題的基本算法是求累加值。累加項的分子部分都是1;分母的值有規(guī)律的遞增,依次為
1!、2!、…、n!,即,若第i-1項的累加項為
t(i-l),則第i項的累加項是t(i-l)*i,在程序中可用表達式:t=t/i(i從1變化到n)來表示。
(2)根據(jù)以上分析,若用變量t來存放累加項,當(dāng)i的值從1變化到n時,可用以下語句來實
現(xiàn)累加:
t=t/i;e+=t;
(3)為了實現(xiàn)累加過程,以上語句應(yīng)當(dāng)放在循環(huán)內(nèi),循環(huán)控制變量從1變化到n。
(4)若用for循環(huán),按題目要求已指定n的值是50。若用while循環(huán),并沒有指定n的值,但
已指定了循環(huán)結(jié)束的條件,當(dāng)t的值小于10-4結(jié)束循環(huán)。
(5)現(xiàn)例示用while循環(huán)來求e值的部分程序:
i=l;e=1.0;t=1.0;
while(t>=le-4)
{t=t/i;
e+=t;
i++;
)
(6)請讀者自己對變量做出正確的定義,設(shè)計輸出語句,完善程序;也可以參考此程序段,
按照自己的思路獨立地完成程序。
(7)e的值應(yīng)當(dāng)是:2.71828o
(8)根據(jù)以上分析,讀者已不難用for循環(huán)來實現(xiàn)求e值的計算。
(9)注意:在完成此程序時,不要對分母中的階乘值進行單獨計算,因為17!的值已超過long
類型的最大值,更無法求到50!。
5.19【分析與解答】
(1)從1880年至2000年的年數(shù)可用一個for循環(huán)來取得。
(2)對每一年,用以上指定的條件來進行判斷,若滿足條件即為閏年,進行輸出。
(3)按輸出的要求,需要設(shè)一個變量用于統(tǒng)計一行中輸出的個數(shù),若在一行上已連續(xù)輸出了5
個年數(shù),就需輸出一個換行符,使下一個輸出項在新的一行上開始;若用變量n來做此統(tǒng)計,
則當(dāng)表達式n%5==0時就應(yīng)輸出一個換行符,同時使n重新置0值。
(4)若變量y代表年數(shù),if語句的邏輯表達式可以寫成如下:
(y%4==0&&y%100!=0[JB>11][JB>11]y%400==0)
(5)以下程序段供參考:
for(y=1880;y<=2000;y++)
if(y%4==0&&y%100![KG-*2]=0[JB>11][JB>1l]y%400==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=l;i<=n;i++)printf("*"
printf("\n");
若n的值是6,則連續(xù)輸出6個*號。
(2)以上圖形是在各行上輸出數(shù)目不等的*號,只是*號的數(shù)目依次有規(guī)律地變化。在上半部
分各行依次是1、3、5、7個,因此可以用以下的程序段來實現(xiàn)這樣的輸出:
for(k=l;k<=7;k++,k++)
{for(i=l;i<=k;i++)printf(");
printf("\n");
在下半部依次是5、3、1個;因此可以用以下的程序段來實現(xiàn)這樣的輸出:
for(k=5;k>=1;k—,k—)
{for(i=l;i<=k;i++)printf(z/*");
printf("\n");
)
以上程序段從第一列起輸出的結(jié)果如下:
***
***
*
現(xiàn)在我們已完成了在每行輸出指定數(shù)目的*號。
(3)輸出結(jié)果與題目要求不同,它們的區(qū)別是:按題目每一行之前有不同的空格,而這里則
是所有的行都在第一列上開始輸出*號;所以接著就應(yīng)當(dāng)解決這一問題。
(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=l;i<=k;i++)printf(,z*");
printf("\n/z);
)
(5)請讀者在理解以上給出的示例的基礎(chǔ)上,自己添加下半部空格的輸出。
第六章字符型數(shù)據(jù)習(xí)題分析與解答
一、選擇題
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【參考答案】-1
6.13【參考答案】1
6.14【參考答案】ctype.h
6.15【參考答案】0
6.16【參考答案】10A20B30C40D<CR>
或.10A<CR>
20B<CR>
3OC<CR>
40D<CR>
6.17【參考答案】7.29101.298AB<CR>
或:7.29<CR〉
101.29AB<CR>
6.18【參考答案】
A7.29B101.298<CR>
6.19【參考答案】
A<CR>
B<CR>
C<CR>
三、編程題
6.20【分析與解答】
(1)在進行字符輸入時,即使一次輸入了一行字符(最后用回車結(jié)束輸入),字符也只能一個一
個地讀入。若ch已定義為char型變量,可以用以下的程序段來完成操作:ch=getchar();
while(ch![KG-*2]='\n')
ch=getchar();
)
當(dāng)讀入的是一個回車符時,循環(huán)就結(jié)束。循環(huán)體內(nèi)的“……”符號表示需要在循環(huán)體內(nèi)完成
的其他操作。
(2)在循環(huán)內(nèi)要求進行的操作之一是:輸出每個字符以及與之對應(yīng)的ASCII代碼值。因此可
用以下語句來實現(xiàn)。
printf("%c:%d,ch,ch);
(3)在循環(huán)內(nèi)要求進行的另一個操作是:每行只能輸出3對字符和與之對應(yīng)的ASCII代碼值。
若n已定義為int型變量,則可用來作計數(shù)器;使n的初值為0,每輸出一次,n的值增1,
當(dāng)n的值為3的整數(shù)倍時,額外輸出一個換行符。例如:
n++;
if(n%3==0)putchar('\nz);
(4)把(2)和(3)中給出的語句放在循環(huán)體內(nèi),并按要求給出正確的定義和初值,就可完成題目
所要求的操作。
(5)也可以在while后的一對括號中來完成字符的讀入,如while((ch=getchar())![KG-*2]='\
n')o這時,循環(huán)內(nèi)、外的"ch=getchar();”語句應(yīng)當(dāng)去掉。
6.21【分析與解答】
(1)一行字符的讀入,請參照題6.20(1)和(5)中的解釋。循環(huán)體內(nèi)的“……”符號表示需要在
循環(huán)體內(nèi)完成的其他操作。
ch=getchar();
while(ch![KG-*2]=z\n')
ch=getchar();
(2)在本題中循環(huán)體內(nèi)需要把讀入的所有數(shù)字字符轉(zhuǎn)換成一個整數(shù)。若用變量n來存放這個
整數(shù),為了保證有效的存放,應(yīng)當(dāng)把它定義成long類型。
(3)要把輸入的一串?dāng)?shù)字字符轉(zhuǎn)換成一個整數(shù),首先需要判斷當(dāng)前讀入的字符是否是數(shù)字字
符,若不是則什么也不做;若是,則進行以下操作:
①把當(dāng)前讀入的一個字符轉(zhuǎn)換成一個一位整數(shù),這可由語句“d=ch」0';”來實現(xiàn),在這里
d是一個整型變量;
②把d中的一位數(shù)歸并到n的低位中,這可用語句“n=n*10+d;”來實現(xiàn)。這里所述的操作
可由以下語句來完成:
if(ch>=zO'&&ch<=z9'){d=ch-zO';n=n*10+d;}
if語句后一對括號中的判斷表達式可以調(diào)用字符函數(shù)isdigit來實現(xiàn):
if(isdigit(ch)){d=ch-'O';n=n*10+d;}
if子句的兩個語句可以合并成:n=n*10+ch-'0'
(4)把(3)中的語句放入循環(huán)中:
ch=getchar();
while(ch![KG-*2]=/\nz)
{if(ch>='O'&&ch<=z9Z)n=n*10+ch-'O';
ch=getchar();
)
(5)請自己寫出定義語句并賦初值。注意,最后輸出n時,應(yīng)當(dāng)使用格式說明%Id,而不能使
用%d。
6.22【分析與解答】
(1)行數(shù)的統(tǒng)計可通過統(tǒng)計輸入的'\n'符的個數(shù)來完成。
⑵統(tǒng)計的過程應(yīng)當(dāng)放在一個while循環(huán)體中;判斷循環(huán)是否進行的條件可以用:
((ch=getchar())==EOF)o若用整型變量n作為計數(shù)器對''n'符進行統(tǒng)計,只要讀入的字符
是'\nz,則n增1。如:
while((ch=getchar())![KG-*2]=E0F)
if(ch=='\n')n++;
(3)EOF是在stdio.h中預(yù)定義了的標(biāo)識符,在TURBOC的環(huán)境下,鍵入Ctrl+Z(即按住鍵盤
上的Ctrl鍵,同時按字母Z鍵)后,敲Enter鍵,即輸入了EOF。
6.23【分析與解答】
(1)本題要求的操作同樣可在while循環(huán)中完成:
while((ch=getchar())!='\n')
(2)若用整型變量n作為計數(shù)器對小寫字母進行統(tǒng)計,只要讀入的字符是小寫字母,則n增1。
如:
if(ch>=za'&&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=l;j<=n;j++)putchar(ch);
putchar('\n');
注意,在循環(huán)后putchar('\n');語句不可少,它用以換行。
(4)現(xiàn)在應(yīng)當(dāng)解決如何按要求給出每行輸出的字符。由圖分析,行數(shù)(或行號)為1時輸出字符
A,行數(shù)為2時輸出字母B……若輸出的字母放在變量ch中,行號取決于外循環(huán)的控制變量
i,則輸出的字母和行號的關(guān)系可用表達式:ch='A'+i-l來表示。當(dāng)i為1時ch中被賦予字
母A,當(dāng)i為2時ch中被賦予了字母B,其他依此類推。因此,在此表達式后,利用(3)中的
循環(huán)就解決了各行上輸出的字母。
(5)按要求每行輸出的字母的個數(shù)不同,第二行輸出3個字母,第三行輸出5個字母,第四
行輸出7個字母……(3)中for循環(huán)體的執(zhí)行次數(shù)取決于n的值,也就是說n的值決定了每行
輸出字母的個數(shù)。其實,n的值與行號有著密切的關(guān)系:n=2*i-l,當(dāng)i為1時n的值是1、當(dāng)
i的2時n的值是3、當(dāng)i的3時n的值是5、當(dāng)i的4時n的值是7。因此在(3)中for循環(huán)
之前可用此表達式求出n的值。
(6)總結(jié)以上分析,我們可得到以下的程序段:
for(i=l;i<=L;i++)
{ch='A'+i-l;
n=2*i-l;
for(j=1;j<=n;j++)putchar(ch);
putchar(''n');
)
若所用的變量都已正確定義,通過輸入L的值為5,則程序段在第一列起有以下的輸出結(jié)果:
A
BBB
CCCCC
DDDDDDD
EEEEEEEEE
和題目的要求比較已趨接近,不同的是在每行沒有適當(dāng)?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)體內(nèi)、輸出每行字符的循環(huán)之前即可。
(8)請讀者自己補充有關(guān)的include行、語句和變量的定義,以完成整個程序。注意,如果有
能力可在某些地方作些簡化。
第七章函數(shù)習(xí)題分析與解答
一、選擇題
7.1【參考答案】C)
7.2【參考答案】C)
7.3【參考答案】B)
7.4【參考答案】C)
7.5【參考答案】A)
7.6【參考答案】D)
7.7【參考答案】A)
二、填空題
7.8【參考答案】12
7.9【參考答案】9.0(或9.000000)
7.10【參考答案】4
7.11【參考答案】[1]n=l[2]s
7.12【參考答案】[1]<=y[2]z*x
7.13【參考答案】[1]1[2]s*i[3]0[4]f(k)
三、程序調(diào)試和編程題
7.14【分析與解答】
(1)fun函數(shù)判斷傳給形參n的數(shù)是否為素數(shù),若是函數(shù)返回1,否則返回0。
(2)函數(shù)的原意是用變量yes作為判斷n是否為素數(shù)的標(biāo)志,是素數(shù),其值為1,否則為0。
而所給函數(shù)的實際流程卻不能實現(xiàn)這一功能,例如,若n的值為15(明顯不是素數(shù))時,在for
循環(huán)中,當(dāng)k的值為3時,就會執(zhí)行if子句,yes得0,但for循環(huán)并沒有終止,接著k為4
時就會執(zhí)行else子句,又使yes得1,由此可見此程序段并不能準(zhǔn)確地判斷一個數(shù)是否為素數(shù);
最后確定yes為何值的是for循環(huán)的終止值n/2,當(dāng)n為15時,k的值為n/2等于7,在循環(huán)
體內(nèi)將又一次執(zhí)行else子句,使yes得1,這時循環(huán)結(jié)束,函數(shù)返回1。由此可見所給fun函
數(shù)不能起到預(yù)想的作用。
(3)由上分析可知,對于n的值為15時而言,問題是在一旦yes的值為0,已判斷n中的值
不是素數(shù)時,沒有及時退出循環(huán),返回0;因此,若在if子句中添加一條語句:break;就能解
決這一問題,把if語句改寫如下:
if(n%k==0){yes=0;break;}
elseyes=l;
(4)在所給fun函數(shù)中,當(dāng)n的值為2、3時(都是素數(shù)),因為n/2的值為1(大于k中的2),所
以不會進入for循環(huán),而直接執(zhí)行return語句,細心的讀者應(yīng)該可以發(fā)現(xiàn),這時yes沒有賦過
值,也就是說,返回的是一個不確定的值,這將會導(dǎo)致錯誤;因此,應(yīng)當(dāng)在定義語句中給yes
賦初值1:
intk,yes=l;
至此fun函數(shù)能正確運行。
(5)總結(jié):因為一旦if語句中的表達式:n%k==0的值為1(即可被某數(shù)整除),則可以確定n
不是素數(shù),因此即可返回,不必再執(zhí)行函數(shù)其他部分,if子句可改成:
if(n%k==0){yes=0;returnyes;}
elseyes=l;
也可簡化成:
if(n%k==0)return0;
elseyes=l;
又可進一步不用變量yes,并去掉else,簡化成(請參考例7.4):
for(k=2;k<=n/2;k++)
if(n%k==0)return0;
return1;
7.15【分析與解答】
(1)若用整型變量c存放余數(shù),則求a被b除后的余數(shù)可用表達式:
c=a%bo
(2)本題要求編寫函數(shù)mymod用以求a被b除后的余數(shù)即:
c=mymod(a,b);
(3)只要把a%b作為函數(shù)值返回即可完成操作(請參考例7.1):
intmymod(inta,intb)
{returna%b;}
(4)總結(jié):本題在算法上十分簡單,只是要求讀者能夠掌握編寫函數(shù)的基本知識。
7.16【分析與解答】
(1)本題所要采用的算法是累加。分析可見,所有累加項的分子都是L而分母部分逐項增1;
只是累加項的符號交叉變化。因此處理好符號的變化是完成操作的關(guān)鍵之一。
(2)若函數(shù)名為funa,傳送到函數(shù)的參數(shù)是整型值,假定形參命名為n;函數(shù)的返回值應(yīng)當(dāng)是
浮點型,為此函數(shù)的首部可以是:
doublefuna(intn)
(3)接著寫函數(shù)體。累加放在一個for循環(huán)中來完成,若循環(huán)控制變量為k,可利用循環(huán)控制
變量作為累加項t的分母,累加值放在add中:
for(k=l;k<=n;k++)
t=s*1.0/k;
add=add+t;
)
此處,s用作符號變量,在1和-1之間交叉變化,乘以LO/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改變了一次符號。當(dāng)然還可有多種方法。把以
上表達式添加到循環(huán)體中:
for(k=1;k<=n;k++)
{s=-s;
t=s*1.0/k;
add=add+t;
)
(5)最后注意應(yīng)當(dāng)給各變量賦以適當(dāng)?shù)某踔?,并返回函?shù)值。
(6)請編寫主函數(shù)。當(dāng)傳給形參的值為10時,函數(shù)的返回值應(yīng)當(dāng)是:0.645635。
(7)總結(jié):本題的算法并不復(fù)雜,但是需要讀者掌握編寫函數(shù)的基本知識。掌握需要傳入函。
數(shù)的參數(shù)及其類型,掌握需要返回的值及其類型。在此基礎(chǔ)上,其他方面與先前在主函數(shù)中
編寫的程序沒有什么區(qū)別。
7.17【分析與解答】
(1)此題與7.18相似。函數(shù)的返回值為浮點型,函數(shù)只有一個形參,為整型。
(2)函數(shù)的基本算法是累加,只是除第一項外其余各項都用減法;每一項的分子都是1,分母
部分為k2,k的值逐項增1,由2變化到m。因此,算法可以用一個循環(huán)來實現(xiàn)。
(3)當(dāng)m的值為12時,函數(shù)值應(yīng)是:0.435023o
7.181分析與解答】
(1)若函數(shù)取名為fun,按題意,x作為形參,由調(diào)用函數(shù)傳入,其類型不應(yīng)當(dāng)用整型;表達
式x2-5X+4的值作為函數(shù)值返回,函數(shù)值的類型應(yīng)為浮點型。因此,很容易寫出函數(shù):
doublefun(doublex)
{returnx*x-5*x+4;}
(2)若在調(diào)用函數(shù)時,x和y2已正確定義,且x已有確定的值,則可用以下函數(shù)調(diào)用語句得
到y(tǒng)2的值:
y2=fun(x+15);
(3)同樣,若在調(diào)用函數(shù)時,x和y3已正確定義,且x已有確定的值,則可用以下函數(shù)調(diào)用
語句得到y(tǒng)3的值:
y3=fun(sin(x));
注意,因為在程序中調(diào)用了C語言提供的庫函數(shù)sin,因此應(yīng)當(dāng)在程序的最前面包含以下命令
行:
#include"math.h"
(4)參考Q)和(3)應(yīng)不難寫出求yl的語句,請讀者自己完成。
(5)yl的值應(yīng)是:-2.0。當(dāng)x的值為5時,y2的值應(yīng)是:304.00當(dāng)x的值為0.5時,y3的值
應(yīng)是:1.832721。
(6)總結(jié):
①本題已給出了函數(shù)需要求值的表達式,讀者只需確定函數(shù)的類型和形參的類型,就可以寫
出函數(shù),就像例7.1中求兩數(shù)之和的函數(shù)一樣簡單。
②在給定了函數(shù)之后,調(diào)用函數(shù)時,函數(shù)的實參應(yīng)當(dāng)是一個與形參類型一致的任意合法的
表達式。例如,可以是常量、算術(shù)表達式,也可以是函數(shù)等。就像例7.1中求兩數(shù)之和的add
函數(shù)一樣,可以用add(3,4);來求3+4;當(dāng)x、y有確定值時,可以用add(x*x,y*y);來求x2+y2;
當(dāng)x、y有確定值時,可以用add(sin(x+y),cos(x+y));來求sin(x+y)+cos(x+y),這同樣可以通過
add(sin(add(x,y)),cos((add(x,y)));來求得。
第八章指針習(xí)題分析與解答
一、選擇題
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【參考答案】110
8.14【參考答案】71
8.15【參考答案】char*p,*p=ch,p=&ch;scanf("%c/n''p,);ch=*p;p=&ch;printf("%c/n'',*p);
8.16【參考答案】*s=*(p+3),*(s-2),50,*s=*(a+l),2,10,20,30,40
三、編程題
8.17【分析與解答】
(1)若函數(shù)名為fun,按題意,函數(shù)不返回函數(shù)值;函數(shù)的形參需要接受傳送過來的兩個浮點
數(shù),因此需要有兩個double類型的形參;另外要把它們的和值與差值,通過形參傳送回去,
這就要求有兩個double類型的形參指針,接受傳送過來的地址,以便通過指針把和值與差值
傳送給所指的主函數(shù)中的變量。因此函數(shù)的首部應(yīng)當(dāng)是:
voidfun(doublea,doubleb,double*pl,double*p2)
這里,a、b、pl、p2是自己取的名。
⑵假設(shè)把a、b的和值傳送給pl所指的存儲單元,可用語句:*pl=a+b;把a、b的差值傳送
給p2所指的存儲單元,可用語句:*p2=a-b;。
(3)因此函數(shù)可寫成:
voidfun(doublea,doubleb,double*pl,double*p2)
{*pl=a+b;*p2=a-b;}
(4)在主函數(shù)中,若有定義語句:doublex,y,zl,z2;,且x、y已賦值,則調(diào)用fun函數(shù)的語句
可以是:fun(x,y,&z1,&z2);0
⑸總結(jié):本題所要求的算法極簡單,但它要求有兩個值返回,用return語句就不可能返回兩
個函數(shù)值。要求讀者能利用形參指針把要求的值間接地傳回調(diào)用函數(shù)。
8.18【參考答案】
(1)若函數(shù)名為maxandmin,按題意,函數(shù)不返回函數(shù)值;函數(shù)將接受3個數(shù)(假定為int類型),
并需要通過指針指向主函數(shù)中的兩個int型變量,以便把最大值和最小值放入指針?biāo)傅拇鎯?/p>
單元中。因此函數(shù)的首部應(yīng)當(dāng)是:
voidmaxandmin(inta,intb,intc,int*pmax,int*pmin)
(2)函數(shù)體中需要實現(xiàn)求3個數(shù)的最大值和最小值的算法,此算法應(yīng)當(dāng)在學(xué)習(xí)第四章時已經(jīng)
掌握(可參考例4.2和習(xí)題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,則什么也不做。
@經(jīng)過以上操作,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中,則
調(diào)用語句應(yīng)當(dāng)是:
maxandmin(x,y,x,&m,&n);
(5)總結(jié):本題要求的算法在第四章應(yīng)當(dāng)已掌握,本題的主要目的是要求讀者掌握如何通過
指針把函數(shù)中的多個結(jié)果傳回主函數(shù)。
第九章數(shù)組習(xí)題分析與解答
一、選擇題
DX
1
9.1【參考答案】7
Ax
)
9.2【參考答案】z
A\
)
9.3【參考答案】z
Ax
)
9.4【參考答案】z
c\
J
9.5【參考答案】Z
AX
I
9.6【參考答案】/
BX
9.7【參考答案】)
9.8【參考答案】D)
O
9.9【參考答案】
x
Cl
9.10【參考答案】z
Cx
9.11【參考答案】7—
Dx
)
9.12【參考答案】z
D\
J
9.13【參考答案】Z
A\
l
9.14【參考答案】Az
\
l
9.15【參考答案】Az
\
J
9.16【參考答案】CZ
\
l
9.17【參考答案】C7
9.18【參考答案】
二、填空題
9.19【參考答案】L1]9[2]0
9.20【參考答案】6
9.21【參考答案】12
9.22【參考答案】3
9.23
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB31/T 1349-2022機關(guān)會議服務(wù)管理規(guī)范
- DB31/T 1169-2019知識產(chǎn)權(quán)評議技術(shù)導(dǎo)則
- DB31/T 1142-2019燃氣工業(yè)鍋爐能效在線監(jiān)測技術(shù)規(guī)范
- DB31/T 1124-2018電梯應(yīng)急處置公共服務(wù)平臺功能要求
- 硬件設(shè)計中的節(jié)能技術(shù)與綠色標(biāo)準(zhǔn)考核試卷
- 2024年可降解聚烯烴專用料項目資金申請報告代可行性研究報告
- 2025年中國壁掛式浴室柜行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 環(huán)保設(shè)施改造補充協(xié)議
- 網(wǎng)紅奶茶店區(qū)域代理加盟經(jīng)營合同
- 跨國醫(yī)療援助物資運輸與配送合同
- 如何提高自身的網(wǎng)絡(luò)安全意識
- 中醫(yī)學(xué)理論體系的形成和發(fā)展
- 中醫(yī)養(yǎng)生五臟
- 山東省高考志愿規(guī)劃
- 籃球研究報告
- 機械通氣基礎(chǔ)知識與常見模式
- 家具借款借條模板
- 預(yù)防肥胖幼兒園
- 淚道置管的護理課件
- 造影劑腦病護理查房課件
- 電力鐵塔制造培訓(xùn)資料
評論
0/150
提交評論