《C語言程序設(shè)計》課后習(xí)題詳細答案_第1頁
《C語言程序設(shè)計》課后習(xí)題詳細答案_第2頁
《C語言程序設(shè)計》課后習(xí)題詳細答案_第3頁
《C語言程序設(shè)計》課后習(xí)題詳細答案_第4頁
《C語言程序設(shè)計》課后習(xí)題詳細答案_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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【參考答案】[門:![KG-*2](邏輯非)

[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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論