《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程-C語(yǔ)言程序設(shè)計(jì)》_第1頁(yè)
《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程-C語(yǔ)言程序設(shè)計(jì)》_第2頁(yè)
《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程-C語(yǔ)言程序設(shè)計(jì)》_第3頁(yè)
《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程-C語(yǔ)言程序設(shè)計(jì)》_第4頁(yè)
《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程-C語(yǔ)言程序設(shè)計(jì)》_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程語(yǔ)言程序設(shè)計(jì) # 習(xí)題分析與解答第一章程序設(shè)計(jì)基本概念習(xí)題分析與解答11【參考答案】.EXE12【參考答案】1.C2.OBJ3.EXE13【參考答案】1順序結(jié)構(gòu)2選擇結(jié)構(gòu)3循環(huán)結(jié)構(gòu)第二章C程序設(shè)計(jì)的初步知識(shí)習(xí)題分析與解答一、選擇題21【參考答案】B)22【參考答案】D)23【參考答案】B)24【參考答案】A)25【參考答案】C)26【參考答案】A)27【參考答案】B)28【參考答案】B)29【參考答案】D)210【參考答案】C)211【參考答案】B)212【參考答案】B)213【參考答案】A)二、填空題214【參考答案】111212215【參考答案】14.224.2

2、216【參考答案】123定義4執(zhí)行217【參考答案】1關(guān)鍵字2用戶標(biāo)識(shí)符218【參考答案】1int2float3double219【參考答案】floata1=1.0,a2=1.0;或floata1=1,a2=1;(系統(tǒng)將自動(dòng)把1轉(zhuǎn)換為1.0)220【參考答案】存儲(chǔ)單元221【參考答案】3.5222【參考答案】1a*b/c2a/c*b3b/c*a223【參考答案】把10賦給變量s224【參考答案】1位21位二進(jìn)制數(shù)據(jù)(0或1)225【參考答案】1821273011111114-128510000000226【參考答案】1327672-3276831000000000000000227【參考答案】

3、1十2八3十六三、上機(jī)改錯(cuò)題228【分析與解答】第1行的錯(cuò)誤:(1)include是一個(gè)程序行,因此在此行的最后不應(yīng)當(dāng)有分號(hào)(;)。第2行的錯(cuò)誤:(1)main()是主函數(shù)的起始行,不是語(yǔ)句,因此最后不應(yīng)當(dāng)有分號(hào)(;)。在同一行上的/*mainfunction*/顯然是注釋;C語(yǔ)言規(guī)定:注釋由/*開頭,由*/結(jié)束,但在*號(hào)和/之間不得插入任何空格,而在此處“/*”和“*/”之間存在空格,因此,/*mainfunction*/的寫法是錯(cuò)誤的,而應(yīng)寫成:/*mainfunction*/。第3行的錯(cuò)誤:(1)在主函數(shù)的起始行main()的后面是函數(shù)體,函數(shù)體由左花括號(hào)(開始。但在函數(shù)體的第一行:fl

4、oat的前面缺少了左花括號(hào)(。(2)在同一行上的/*/*risradius*/,/*sisareaofcircular*/*/顯然是注釋;C語(yǔ)言規(guī)定:注釋由/*開頭,由*/結(jié)束,并且開頭的/*將去找最近的*/去配對(duì),因此在/*/*risradius*/中,第一個(gè)/*與radius后的那個(gè)*/配上了對(duì),結(jié)果緊跟在后面的那個(gè)逗號(hào)(,)落在了注釋的外面,而構(gòu)成了一個(gè)多余符號(hào),為此,在編譯時(shí)將報(bào)告“語(yǔ)法錯(cuò)”。/*sisareaofcircular*/*/中第一個(gè)*/就結(jié)束了注釋,第一個(gè)*/就成了多余的了。第6行的錯(cuò)誤:(1)printf(fn,s)應(yīng)當(dāng)是一條輸出語(yǔ)句,但在最后缺少了一個(gè)分號(hào)。print

5、f(%fn,s);是程序的最后一條語(yǔ)句,程序應(yīng)當(dāng)結(jié)束;但缺少了程序體結(jié)束所需的右花括號(hào)();此右花括號(hào)可以放在printf(%fn,s);的后面,也可以放在printf(%fn,s);的下一行上。227【分析與解答】第2行的錯(cuò)誤:在main的后面缺少一對(duì)圓括號(hào)。第4行的錯(cuò)誤:在c=4.0的后面缺少分號(hào)。第6行的錯(cuò)誤:在printf(%fn,v)的后面缺少分號(hào)。第三章順序結(jié)構(gòu)習(xí)題分析與解答一、選擇題(單選題)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【參考答

6、案】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(“8f”,&c);3.19【參考答案】C)3.20【參考答案】B)二、填空題3.21【參考答案】(3)i=-200j=25003.22【參考答案】3.23【參考答案】3.24【參考答案】3.25【參考答案】1:10025.812:100(1)-200,2500(2)i=-200,j=250011220301.89234一條語(yǔ)句2分號(hào)(或;)分號(hào)

7、(;)25.811.892343:10025.811.89234【參考答案】x=127,x=127,x=177,x=7f,x=127【參考答案】x=127,x=127,x=127,x=000127,x=%06d【參考答案】a=513.789215,a=513.79,a=513.78921500,a=513.78921500三、編程題和改錯(cuò)題3.29【分析與解答】(1)主函數(shù)名main后應(yīng)有一對(duì)圓括號(hào)。第三行的printf語(yǔ)句用以提示輸入,但是原樣輸出的字符串沒(méi)有用雙引號(hào)括起來(lái);另外,從輸入的形式看,輸入的數(shù)據(jù)緊跟在提示之后,因此,printf格式串中最后不應(yīng)該有換行符一n。因?yàn)檩斎腠?xiàng)a、b、c

8、從定義和計(jì)算結(jié)果來(lái)看都是double類型,因此,第四行scanf語(yǔ)句格式串中的格式說(shuō)明不應(yīng)當(dāng)用d而應(yīng)當(dāng)用厲且每一個(gè)變量之前應(yīng)該加地址運(yùn)算符&。第七行的printf語(yǔ)句中應(yīng)當(dāng)把%d都改成%lf或按輸出要求在格式串中應(yīng)添加相應(yīng)的原樣輸出的字符;因?yàn)橄乱粋€(gè)printf的輸出從新的一行開始,因此在本輸出語(yǔ)句的格式串的最后應(yīng)當(dāng)加換行符n。第八行的printf語(yǔ)句中應(yīng)當(dāng)把格式串整理合并放在輸出項(xiàng)的前面,輸出項(xiàng)放在后面,%d都改成%lf或2中間的n刪去。請(qǐng)同學(xué)們自己寫出修改后的程序,并上機(jī)調(diào)試。3.30【分析與解答】分析:可用算術(shù)式560三60把分鐘換算成小時(shí)和分鐘,商數(shù)就是小時(shí)數(shù),余數(shù)就是分鐘數(shù)。確定變量

9、的名字和定義變量的類型:在程序中把小時(shí)數(shù)放在變量h中,把分鐘數(shù)放在變量m中。這兩個(gè)變量的類型可以是整型(本題中采用整型),也可以是實(shí)型。確定所用算法:求560三60的商數(shù),在C語(yǔ)言中可以用整除的算法,語(yǔ)句是h=560/60;。求余數(shù)可用求余運(yùn)算符%:560%60,其值放入變量m中的語(yǔ)句是:m=560%60;。(4)設(shè)計(jì)輸出格式。若輸出的形式定為:小時(shí):分鐘,則按此形式設(shè)計(jì)輸出語(yǔ)句。把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。編寫程序如下:main()inth,m;h=560/60;m=560%60;printf(Theresult:%3d:%3dn,h,m);運(yùn)行結(jié)果是:Theresult:9:20【

10、分析與解答】確定變量的名字和定義變量的類型。若用a存放1500,用b存放350;用q存放商數(shù),用r存放余數(shù),所有變量應(yīng)定義成int類型。設(shè)計(jì)輸入語(yǔ)句從終端輸入1500和350;在輸入語(yǔ)句之前,應(yīng)當(dāng)設(shè)計(jì)一個(gè)輸出語(yǔ)句,用以提示輸入??捎谜笊虜?shù),結(jié)果放在變量q中??捎们笥噙\(yùn)算符求兩數(shù)之余數(shù),結(jié)果放在變量r中。設(shè)計(jì)輸出語(yǔ)句。輸出a、b、q、r。把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。本題的程序與3.30相似,請(qǐng)大家參考上題并根據(jù)本題的解釋自己編程,并上機(jī)調(diào)試?!痉治雠c解答】(1)定義4個(gè)雙精度變量a、b、c和ave,變量a、b、c分別存放讀入的3個(gè)雙精度數(shù),ave存放它們的平均值。設(shè)計(jì)輸入語(yǔ)句,以及在

11、此之前用于提示輸入的(printf)語(yǔ)句。設(shè)計(jì)求平均值的算法,把所求得的平均值放入變量ave中。設(shè)計(jì)把變量ave中的數(shù),從小數(shù)點(diǎn)后第二位數(shù)進(jìn)行四舍五入的算法?,F(xiàn)舉例說(shuō)明:若ave中的數(shù)為123.4644,為了保留此值小數(shù)點(diǎn)后一位,可用表達(dá)式:(int)(123.4644*10)/10.0;依次推算,為了保留此值小數(shù)點(diǎn)后二位,可用表達(dá)式:(int)(123.4644*100)/100.0;其他依此類推。若要求對(duì)小數(shù)點(diǎn)后第二位數(shù)進(jìn)行四舍五入,則可對(duì)原數(shù)加0.05后再進(jìn)行以上運(yùn)算。如要求保留123.4644小數(shù)點(diǎn)后一位且對(duì)第二位數(shù)進(jìn)行四舍五入,可用表達(dá)式:(int)(123.467+0.05)*10

12、)/10.0。注意:分母一定要用實(shí)數(shù)10.0而不能用整數(shù)10,否則就變成整除了;若要求保留123.4644小數(shù)點(diǎn)后兩位且對(duì)第三位數(shù)進(jìn)行四舍五入,可用表達(dá)式:(int)(123.467+0.005)*100)/100.0;其他依此類推。設(shè)計(jì)輸出語(yǔ)句。輸出a、b、c和ave。把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。編寫程序如下:main()doublea,b,c,ave;printf(Entera,b,c:);scanf(“l(fā)f%lf%lf,&a,&b,&c);ave=(a+b+c)/3;printf(ave=%fn,ave);/*用以比較四舍五入前后的數(shù)據(jù)*/ave=(int)(ave+0.05)*

13、10)/10.0;/*上句也可寫成ave=(int)(ave*10+0.5)/10.0;*/printf(a=%f,b=%f,c=%f,ave=%fn,a,b,c,ave);【分析與解答】關(guān)于對(duì)變量中的數(shù)進(jìn)行交換的算法請(qǐng)參考3.7題中的解釋和教程中有關(guān)的例題。定義4個(gè)整型變量a、b、c和t,變量a、b、c分別存放讀入的3個(gè)整數(shù),t用作臨時(shí)存儲(chǔ)單元。(3)設(shè)計(jì)輸入語(yǔ)句,以及在此之前用于提示輸入的(printf)語(yǔ)句。輸出a、b、c中的值,以便于比較。交換的步驟如下:把c中的值賦給t。把b中的值賦給c。把a(bǔ)中的值賦給b。把t中的值賦給a。經(jīng)過(guò)以上步驟,已按要求進(jìn)行了交換。輸出a、b、c中的值。編寫

14、程序如下:main()inta,b,c,t;printf(Entera,b,c:n);scanf(“d%d%d,&a,&b,&c);printf(1)a=%d,b=%d,c=%dn,a,b,c);t=c;c=b;b=a;a=t;printf(2)a=%d,b=%d,c=%dn,a,b,c);第四章選擇結(jié)構(gòu)習(xí)題分析與解答一、選擇題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

15、【參考答案】、=、=、!KG-*2=4.13【參考答案】1!2&3JB1|JB1|4.14【參考答案】1:!KG-*2(邏輯非)2:、=(小于、大于、小于等于、大于等于)3:=、!KG-*2=(等于、不等)4:&(邏輯與)5:JB1IJB1I(邏輯或)。4.15【參考答案】!4.16【參考答案】1a=b或a1|xJB1|44.17【參考答案】14.18【參考答案】1xm0)JB1|JB1|(m1=m0&d1=d0)age=y1-y0;elseage=y1-y0-1;讀者可以參考以上語(yǔ)句寫出程序,也可以根據(jù)分析寫出與此形式不同的語(yǔ)句和程序。4.23【分析與解答】(1)若輸入的整數(shù)a是奇數(shù),輸出:

16、oddnumber,是偶數(shù)輸出:evennumber。若一個(gè)a是偶數(shù),它就能被2除盡,即a%2=0,輸出evennumber;若是奇數(shù),它就不能被2除盡,即a%2!KG-*2=0,輸出oddnumber。讀者可以參考以上給出的算法,寫出相應(yīng)的C語(yǔ)句,并編寫出完整的程序?!痉治雠c解答】本題的主要算法是從3個(gè)數(shù)中找出最大的那個(gè)數(shù)。假定始終把最大的數(shù)放在變量max中。(1)假定a中的數(shù)最大,把a(bǔ)賦給max。用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也不做。用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。經(jīng)過(guò)以上操作,max中已放入

17、了a、b、c三個(gè)數(shù)中的最大數(shù),輸出max即可。讀者可以參考以上給出的算法,寫出相應(yīng)的C語(yǔ)句,并編寫出完整的程序。【分析與解答】本題已給出了非常明確的條件,只要寫出正確的條件判斷語(yǔ)句就可基本完成程序的編寫。由給出的函數(shù)可知,只有x的值在規(guī)定的范圍內(nèi)時(shí),才求出y的值,因此程序應(yīng)當(dāng)對(duì)輸入的x進(jìn)行判斷,若超過(guò)范圍就不求y的值?,F(xiàn)以使用ifCD#*2else語(yǔ)句為例寫出程序供參考。main()intx,y;printf(Enterx:);scanf(“d,&x);if(x-5&x10)if(x=0)y=x-1;elseif(x0)y=x+1;elseif(x-5)y=x;printf(x=%dy=%dn

18、,x,y);printf(*END*nn);循環(huán)結(jié)構(gòu)習(xí)題分析與解答第五章一、選擇題(單選題)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【參考答案】1524365.12【參考答案】程序段無(wú)限循環(huán),沒(méi)有輸出結(jié)果5.13【參考答案】-15.14【參考答案】115.15【參考答案】1d=1.02k+3k=02xamin三、編程題5.17【分析與解答】本題的基本算法是求累加值。累加項(xiàng)的值有規(guī)律的遞增,每一項(xiàng)的

19、絕對(duì)值比前一項(xiàng)增2,因此可以利用循環(huán)的控制變量的遞增來(lái)得到累加項(xiàng)的絕對(duì)值。例如:for(i=1;i=1e-4)t=t/i;e+=t;i+;請(qǐng)讀者自己對(duì)變量做出正確的定義,設(shè)計(jì)輸出語(yǔ)句,完善程序;也可以參考此程序段,按照自己的思路獨(dú)立地完成程序。e的值應(yīng)當(dāng)是:2.71828。根據(jù)以上分析,讀者已不難用for循環(huán)來(lái)實(shí)現(xiàn)求e值的計(jì)算。注意:在完成此程序時(shí),不要對(duì)分母中的階乘值進(jìn)行單獨(dú)計(jì)算,因?yàn)?7!的值已超過(guò)long類型的最大值,更無(wú)法求到50!。5.19【分析與解答】從1880年至2000年的年數(shù)可用一個(gè)for循環(huán)來(lái)取得。對(duì)每一年,用以上指定的條件來(lái)進(jìn)行判斷,若滿足條件即為閏年,進(jìn)行輸出。按輸出的

20、要求,需要設(shè)一個(gè)變量用于統(tǒng)計(jì)一行中輸出的個(gè)數(shù),若在一行上已連續(xù)輸出了5個(gè)年數(shù),就需輸出一個(gè)換行符,使下一個(gè)輸出項(xiàng)在新的一行上開始;若用變量n來(lái)做此統(tǒng)計(jì),則當(dāng)表達(dá)式n%5=0時(shí)就應(yīng)輸出一個(gè)換行符,同時(shí)使n重新置0值。若變量y代表年數(shù),訐語(yǔ)句的邏輯表達(dá)式可以寫成如下:(y%4=0&y%100!=0JB1|JB1|y%400=0)以下程序段供參考:for(y=1880;y1|JB1|y%400=0)printf(“d,y);n+;if(n%5=0)printf(n);n=0;請(qǐng)讀者自己對(duì)變量做出正確的定義并賦初值,完善程序;也可以參考此程序段,按照自己的思路獨(dú)立地完成程序。從1880年至2000年有

21、30個(gè)閏年。5.20【分析與解答】不難理解利用以下的for循環(huán)可以在一行上連續(xù)輸出n個(gè)*號(hào):for(i=1;i=n;i+)printf(“*“);printf(n);若n的值是6,則連續(xù)輸出6個(gè)*號(hào)。以上圖形是在各行上輸出數(shù)目不等的*號(hào),只是*號(hào)的數(shù)目依次有規(guī)律地變化。在上半部分各行依次是1、3、5、7個(gè),因此可以用以下的程序段來(lái)實(shí)現(xiàn)這樣的輸出:for(k=1;k=7;k+,k+)for(i=1;i=1;k-,k-)for(i=1;i=k;i+)printf(*);printf(n);以上程序段從第一列起輸出的結(jié)果如下:*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*

22、現(xiàn)在我們已完成了在每行輸出指定數(shù)目的*號(hào)。輸出結(jié)果與題目要求不同,它們的區(qū)別是:按題目每一行之前有不同的空格,而這里則是所有的行都在第一列上開始輸出*號(hào);所以接著就應(yīng)當(dāng)解決這一問(wèn)題。分析題目要求,每行第一個(gè)*號(hào)位置的縮進(jìn)是有規(guī)律的,假定中間這一行第一個(gè)*號(hào)位置是在第一列,則可看出,第一至第三行的縮進(jìn)分別是3、2、1個(gè)空格;而圖形下半部的縮進(jìn)數(shù)則剛好相反。這可在以上循環(huán)中添加輸出連續(xù)空格的for循環(huán)來(lái)實(shí)現(xiàn),對(duì)于上半部程序如下: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);請(qǐng)讀

23、者在理解以上給出的示例的基礎(chǔ)上,自己添加下半部空格的輸出。第六章字符型數(shù)據(jù)習(xí)題分析與解答一、選擇題6.1【參考答案】6.2【參考答案】B)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【參考答案】6.13【參考答案】6.14【參考答案】6.15【參考答案】6.16【參考答案】或:10A20B30C40D6.17【參考答案】或:7.29101.29AB6.18【參考答案】-11ctype.h010A20B30C40D7.

24、29101.298ABA7.29B101.2986.19【參考答案】ABC三、編程題6.20【分析與解答】在進(jìn)行字符輸入時(shí),即使一次輸入了一行字符(最后用回車結(jié)束輸入),字符也只能一個(gè)一個(gè)地讀入。若ch已定義為char型變量,可以用以下的程序段來(lái)完成操作:ch=getchar();while(ch!KG-*2=nz)ch=getchar();當(dāng)讀入的是一個(gè)回車符時(shí),循環(huán)就結(jié)束。循環(huán)體內(nèi)的“”符號(hào)表示需要在循環(huán)體內(nèi)完成的其他操作。在循環(huán)內(nèi)要求進(jìn)行的操作之一是:輸出每個(gè)字符以及與之對(duì)應(yīng)的ASCII代碼值。因此可用以下語(yǔ)句來(lái)實(shí)現(xiàn)。printf(%c:%d,ch,ch);在循環(huán)內(nèi)要求進(jìn)行的另一個(gè)操作是

25、:每行只能輸出3對(duì)字符和與之對(duì)應(yīng)的ASCII代碼值。若n已定義為int型變量,則可用來(lái)作計(jì)數(shù)器;使n的初值為0,每輸出一次,n的值增1,當(dāng)n的值為3的整數(shù)倍時(shí),額外輸出一個(gè)換行符。例如:n+;if(n%3=0)putchar(nz);把(2)和(3)中給出的語(yǔ)句放在循環(huán)體內(nèi),并按要求給出正確的定義和初值,就可完成題目所要求的操作。也可以在while后的一對(duì)括號(hào)中來(lái)完成字符的讀入,如while(ch=getchar()!KG-*2=n)。這時(shí),循環(huán)內(nèi)、外的“ch=getchar();”語(yǔ)句應(yīng)當(dāng)去掉。6.21【分析與解答】一行字符的讀入,請(qǐng)參照題6.20(1)和(5)中的解釋。循環(huán)體內(nèi)的“”符號(hào)表

26、示需要在循環(huán)體內(nèi)完成的其他操作。ch=getchar();while(ch!KG-*2=nz)ch=getchar();在本題中循環(huán)體內(nèi)需要把讀入的所有數(shù)字字符轉(zhuǎn)換成一個(gè)整數(shù)。若用變量n來(lái)存放這個(gè)整數(shù),為了保證有效的存放,應(yīng)當(dāng)把它定義成long類型。要把輸入的一串?dāng)?shù)字字符轉(zhuǎn)換成一個(gè)整數(shù),首先需要判斷當(dāng)前讀入的字符是否是數(shù)字字符,若不是則什么也不做;若是,則進(jìn)行以下操作:把當(dāng)前讀入的一個(gè)字符轉(zhuǎn)換成一個(gè)一位整數(shù),這可由語(yǔ)句“d=ch-0,;”來(lái)實(shí)現(xiàn),在這里d是-一個(gè)整型變量;把d中的一位數(shù)歸并到n的低位中,這可用語(yǔ)句“n=n*10+d;”來(lái)實(shí)現(xiàn)。這里所述的操作可由以下語(yǔ)句來(lái)完成:if(ch=0,&

27、chv=9,)d=ch-z0,;n=n*10+d;if語(yǔ)句后一對(duì)括號(hào)中的判斷表達(dá)式可以調(diào)用字符函數(shù)isdigit來(lái)實(shí)現(xiàn):if(isdigit(ch)d=ch-,0,;n=n*10+d;if子句的兩個(gè)語(yǔ)句可以合并成:n=n*10+ch-,0,;。把(3)中的語(yǔ)句放入循環(huán)中:ch=getchar();while(ch!KG-*2=,n,)if(ch=,0,&ch=a&ch=z)n+;在退出循環(huán)后,輸出n的值。請(qǐng)自己完善程序。6.24【分析與解答】若圖案的行數(shù)輸入到變量L中。按要求L決定了圖形的行數(shù),因此可通過(guò)循環(huán)來(lái)實(shí)現(xiàn)L行的輸出:for(i=1;i=L;i+)循環(huán)體中的“”號(hào),代表輸出L行的操作。

28、假定ch中存放了一個(gè)字符,我們知道,通過(guò)以下循環(huán)可以在一行上輸出n個(gè)字符:for(j=1;j=n;j+)putchar(ch);putchar(/nz);注意,在循環(huán)后putchar(nz);語(yǔ)句不可少,它用以換行。現(xiàn)在應(yīng)當(dāng)解決如何按要求給出每行輸出的字符。由圖分析,行數(shù)(或行號(hào))為1時(shí)輸出字符A,行數(shù)為2時(shí)輸出字母B若輸出的字母放在變量ch中,行號(hào)取決于外循環(huán)的控制變量i,則輸出的字母和行號(hào)的關(guān)系可用表達(dá)式:ch=A+i-l來(lái)表示。當(dāng)i為1時(shí)ch中被賦予字母A,當(dāng)i為2時(shí)ch中被賦予了字母B,其他依此類推。因此,在此表達(dá)式后,利用(3)中的循環(huán)就解決了各行上輸出的字母。按要求每行輸出的字母的

29、個(gè)數(shù)不同,第二行輸出3個(gè)字母,第三行輸出5個(gè)字母,第四行輸出7個(gè)字母中for循環(huán)體的執(zhí)行次數(shù)取決于n的值,也就是說(shuō)n的值決定了每行輸出字母的個(gè)數(shù)。其實(shí),n的值與行號(hào)有著密切的關(guān)系:n=2*i-1,當(dāng)i為1時(shí)n的值是1、當(dāng)i的2時(shí)n的值是3、當(dāng)i的3時(shí)n的值是5、當(dāng)i的4時(shí)n的值是7。因此在(3)中for循環(huán)之前可用此表達(dá)式求出n的值??偨Y(jié)以上分析,我們可得到以下的程序段:for(i=1;i=L;i+)ch=A+i-1;n=2*i-1;for(j=1;j=i;k-)putchar();把此循環(huán)放在i控制的循環(huán)體內(nèi)、輸出每行字符的循環(huán)之前即可。請(qǐng)讀者自己補(bǔ)充有關(guān)的include行、語(yǔ)句和變量的定義

30、,以完成整個(gè)程序。注意,如果有能力可在某些地方作些簡(jiǎn)化。第七章函數(shù)習(xí)題分析與解答一、選擇題7.1【參考答案】C)7.2【參考答案】C)7.3【參考答案】B)7.4【參考答案】C)7.5【參考答案】A)TOC o 1-5 h z7.6【參考答案】D)7.7【參考答案】A)二、填空題7.8【參考答案】129.0(或9.000000)7.10【參考答案】47.11【參考答案】1n=12s7.12【參考答案】1=y2z*x7.13【參考答案】112s*i30三、程序調(diào)試和編程題7.14【分析與解答】7.9【參考答案】(1)fun函數(shù)判斷傳給形參n的數(shù)是否為素?cái)?shù),若是函數(shù)返回1,否則返回0。4f(k)函

31、數(shù)的原意是用變量yes作為判斷n是否為素?cái)?shù)的標(biāo)志,是素?cái)?shù),其值為1,否則為0。而所給函數(shù)的實(shí)際流程卻不能實(shí)現(xiàn)這一功能,例如,若n的值為15(明顯不是素?cái)?shù))時(shí),在for循環(huán)中,當(dāng)k的值為3時(shí),就會(huì)執(zhí)行訐子句,yes得0,但for循環(huán)并沒(méi)有終止,接著k為4時(shí)就會(huì)執(zhí)行else子句,又使yes得1,由此可見(jiàn)此程序段并不能準(zhǔn)確地判斷一個(gè)數(shù)是否為素?cái)?shù);最后確定yes為何值的是for循環(huán)的終止值n/2,當(dāng)n為15時(shí),k的值為n/2等于7,在循環(huán)體內(nèi)將又一次執(zhí)行else子句,使yes得1,這時(shí)循環(huán)結(jié)束,函數(shù)返回1。由此可見(jiàn)所給fun函數(shù)不能起到預(yù)想的作用。由上分析可知,對(duì)于n的值為15時(shí)而言,問(wèn)題是在一旦ye

32、s的值為0,已判斷n中的值不是素?cái)?shù)時(shí),沒(méi)有及時(shí)退出循環(huán),返回0;因此,若在訐子句中添加一條語(yǔ)句:break;就能解決這一問(wèn)題,把訐語(yǔ)句改寫如下:if(n%k=0)yes=0;break;elseyes=1;在所給fun函數(shù)中,當(dāng)n的值為2、3時(shí)(都是素?cái)?shù)),因?yàn)閚/2的值為1(大于k中的2),所以不會(huì)進(jìn)入for循環(huán),而直接執(zhí)行return語(yǔ)句,細(xì)心的讀者應(yīng)該可以發(fā)現(xiàn),這時(shí)yes沒(méi)有賦過(guò)值,也就是說(shuō),返回的是一個(gè)不確定的值,這將會(huì)導(dǎo)致錯(cuò)誤;因此,應(yīng)當(dāng)在定義語(yǔ)句中給yes賦初值1:intk,yes=1;至此fun函數(shù)能正確運(yùn)行??偨Y(jié):因?yàn)橐坏┯撜Z(yǔ)句中的表達(dá)式:n%k=0的值為1(即可被某數(shù)整除),

33、則可以確定n不是素?cái)?shù),因此即可返回,不必再執(zhí)行函數(shù)其他部分,if子句可改成:if(n%k=0)yes=0;returnyes;elseyes=1;也可簡(jiǎn)化成:if(n%k=0)return0;elseyes=1;又可進(jìn)一步不用變量yes,并去掉else,簡(jiǎn)化成(請(qǐng)參考例7.4):for(k=2;k=n/2;k+)if(n%k=0)return0;return1;7.15【分析與解答】若用整型變量c存放余數(shù),則求a被b除后的余數(shù)可用表達(dá)式:c=a%b。本題要求編寫函數(shù)mymod用以求a被b除后的余數(shù)即:c=mymod(a,b);只要把a(bǔ)%b作為函數(shù)值返回即可完成操作(請(qǐng)參考例7.1):intmy

34、mod(inta,intb)returna%b;總結(jié):本題在算法上十分簡(jiǎn)單,只是要求讀者能夠掌握編寫函數(shù)的基本知識(shí)。7.16【分析與解答】本題所要采用的算法是累加。分析可見(jiàn),所有累加項(xiàng)的分子都是1,而分母部分逐項(xiàng)增1;只是累加項(xiàng)的符號(hào)交叉變化。因此處理好符號(hào)的變化是完成操作的關(guān)鍵之一。若函數(shù)名為funa,傳送到函數(shù)的參數(shù)是整型值,假定形參命名為n;函數(shù)的返回值應(yīng)當(dāng)是浮點(diǎn)型,為此函數(shù)的首部可以是:doublefuna(intn)接著寫函數(shù)體。累加放在一個(gè)for循環(huán)中來(lái)完成,若循環(huán)控制變量為k,可利用循環(huán)控制變量作為累加項(xiàng)t的分母,累加值放在add中:for(k=1;k=n;k+)t=s*1.0/

35、k;add=add+t;此處,s用作符號(hào)變量,在1和-1之間交叉變化,乘以1.0/k后,t的值也將按要求變化符號(hào)。注意,表達(dá)式1.0/k不可以寫成1/k,因?yàn)槊恳豁?xiàng)的絕對(duì)值必定是小于1的小數(shù)?,F(xiàn)在需要確定s的值。最簡(jiǎn)單的可用表達(dá)式:s=-s來(lái)實(shí)現(xiàn)(請(qǐng)參考例5.2),若賦值號(hào)右邊s中的值為-1,則賦值號(hào)左邊s中的值就得1;若賦值號(hào)右邊s中的值為1,則賦值號(hào)左邊s中的值就會(huì)得-1;則每循環(huán)一次就使s改變了一次符號(hào)。當(dāng)然還可有多種方法。把以上表達(dá)式添加到循環(huán)體中:for(k=1;k=n;k+)s=-s;t=s*1.0/k;add=add+t;最后注意應(yīng)當(dāng)給各變量賦以適當(dāng)?shù)某踔?,并返回函?shù)值。請(qǐng)編寫主

36、函數(shù)。當(dāng)傳給形參的值為10時(shí),函數(shù)的返回值應(yīng)當(dāng)是:0.645635??偨Y(jié):本題的算法并不復(fù)雜,但是需要讀者掌握編寫函數(shù)的基本知識(shí)。掌握需要傳入函。數(shù)的參數(shù)及其類型,掌握需要返回的值及其類型。在此基礎(chǔ)上,其他方面與先前在主函數(shù)中編寫的程序沒(méi)有什么區(qū)別。7.17【分析與解答】此題與7.18相似。函數(shù)的返回值為浮點(diǎn)型,函數(shù)只有一個(gè)形參,為整型。函數(shù)的基本算法是累加,只是除第一項(xiàng)外其余各項(xiàng)都用減法;每一項(xiàng)的分子都是1,分母部分為k2,k的值逐項(xiàng)增1,由2變化到m。因此,算法可以用一個(gè)循環(huán)來(lái)實(shí)現(xiàn)。當(dāng)m的值為12時(shí),函數(shù)值應(yīng)是:0.435023。7.18【分析與解答】若函數(shù)取名為fun,按題意,x作為形參

37、,由調(diào)用函數(shù)傳入,其類型不應(yīng)當(dāng)用整型;表達(dá)式x?2-5x+4的值作為函數(shù)值返回,函數(shù)值的類型應(yīng)為浮點(diǎn)型。因此,很容易寫出函數(shù):doublefun(doublex)returnx*x-5*x+4;若在調(diào)用函數(shù)時(shí),x和y2已正確定義,且x已有確定的值,則可用以下函數(shù)調(diào)用語(yǔ)句得到y(tǒng)2的值:y2=fun(x+15);同樣,若在調(diào)用函數(shù)時(shí),x和y3已正確定義,且x已有確定的值,則可用以下函數(shù)調(diào)用語(yǔ)句得到y(tǒng)3的值:y3=fun(sin(x);注意,因?yàn)樵诔绦蛑姓{(diào)用了C語(yǔ)言提供的庫(kù)函數(shù)sin,因此應(yīng)當(dāng)在程序的最前面包含以下命令行:#includemath.h參考(2)和應(yīng)不難寫出求y1的語(yǔ)句,請(qǐng)讀者自己完成

38、。y1的值應(yīng)是:-2.0。當(dāng)x的值為5時(shí),y2的值應(yīng)是:304.0。當(dāng)x的值為0.5時(shí),y3的值應(yīng)是:1.832721??偨Y(jié):本題已給出了函數(shù)需要求值的表達(dá)式,讀者只需確定函數(shù)的類型和形參的類型,就可以寫出函數(shù),就像例7.1中求兩數(shù)之和的函數(shù)一樣簡(jiǎn)單。在給定了函數(shù)之后,調(diào)用函數(shù)時(shí),函數(shù)的實(shí)參應(yīng)當(dāng)是一個(gè)與形參類型一致的任意合法的表達(dá)式。例如,可以是常量、算術(shù)表達(dá)式,也可以是函數(shù)等。就像例7.1中求兩數(shù)之和的add函數(shù)一樣,可以用add(3,4);來(lái)求3+4;當(dāng)x、y有確定值時(shí),可以用add(x*x,y*y);來(lái)求x2+y2;當(dāng)x、y有確定值時(shí),可以用add(sin(x+y),cos(x+y);來(lái)

39、求sin(x+y)+cos(x+y),這同樣可以通過(guò)add(sin(add(x,y),cos(add(x,y);來(lái)求得。第八章指針習(xí)題分析與解答一、選擇題8.1【參考答案】8.2【參考答案】8.3【參考答案】8.4【參考答案】8.5【參考答案】8.6【參考答案】8.7【參考答案】8.8【參考答案】8.9【參考答案】8.10【參考答案】8.11【參考答案】8.12【參考答案】二、填空題8.13【參考答案】8.14【參考答案】8.15【參考答案】8.16【參考答案】三、編程題A)B)B)C)B)B)C)D)B)C)C)C)11071char*p,*p=ch,p=&ch;scanf(“%c/n”p,

40、);ch=*p;p=&ch;printf“(%c/n”,*p);*s=*(p+3),*(s-2),50,*s=*(a+1),2,10,20,30,408.17【分析與解答】若函數(shù)名為fun,按題意,函數(shù)不返回函數(shù)值;函數(shù)的形參需要接受傳送過(guò)來(lái)的兩個(gè)浮點(diǎn)數(shù),因此需要有兩個(gè)double類型的形參;另外要把它們的和值與差值,通過(guò)形參傳送回去,這就要求有兩個(gè)double類型的形參指針,接受傳送過(guò)來(lái)的地址,以便通過(guò)指針把和值與差值傳送給所指的主函數(shù)中的變量。因此函數(shù)的首部應(yīng)當(dāng)是:voidfun(doublea,doubleb,double*p1,double*p2)這里,a、b、pl、p2是自己取的名。

41、假設(shè)把a(bǔ)、b的和值傳送給pl所指的存儲(chǔ)單元,可用語(yǔ)句:*p1=a+b;把a(bǔ)、b的差值傳送給p2所指的存儲(chǔ)單元,可用語(yǔ)句:*p2=a-b;。因此函數(shù)可寫成:voidfun(doublea,doubleb,double*p1,double*p2)*p1=a+b;*p2=a-b;在主函數(shù)中,若有定義語(yǔ)句:doublex,y,z1,z2;,且x、y已賦值,則調(diào)用fun函數(shù)的語(yǔ)句可以是:fun(x,y,&z1,&z2);??偨Y(jié):本題所要求的算法極簡(jiǎn)單,但它要求有兩個(gè)值返回,用return語(yǔ)句就不可能返回兩個(gè)函數(shù)值。要求讀者能利用形參指針把要求的值間接地傳回調(diào)用函數(shù)。8.18【參考答案】若函數(shù)名為maxa

42、ndmin,按題意,函數(shù)不返回函數(shù)值;函數(shù)將接受3個(gè)數(shù)(假定為int類型),并需要通過(guò)指針指向主函數(shù)中的兩個(gè)int型變量,以便把最大值和最小值放入指針?biāo)傅拇鎯?chǔ)單元中。因此函數(shù)的首部應(yīng)當(dāng)是:voidmaxandmin(inta,intb,intc,int*pmax,int*pmin)函數(shù)體中需要實(shí)現(xiàn)求3個(gè)數(shù)的最大值和最小值的算法,此算法應(yīng)當(dāng)在學(xué)習(xí)第四章時(shí)已經(jīng)掌握(可參考例4.2和習(xí)題4.24)。如果把a(bǔ)、b、c中的最大值暫時(shí)放在max中,把最小值放在min中,可用以下算法找到最大值:假定a中的數(shù)最大,把a(bǔ)賦給max。用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也

43、不做。用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。經(jīng)過(guò)以上操作,max中已放入了a、b、c三個(gè)數(shù)中的最大數(shù)??赡7乱陨纤惴ㄕ业阶钚≈担簃in=a;if(bmin)min=b;if(c行;也可用:chKG-*3=z0Z&chKG-*3=9。若用num數(shù)組元素來(lái)進(jìn)行統(tǒng)計(jì),當(dāng)ch中是數(shù)字“0”時(shí),使num0增1、當(dāng)ch中是數(shù)字“1”時(shí),使num1增1num的下標(biāo)表達(dá)式可用:ch-0。注意,在定義數(shù)組時(shí),數(shù)組的大小應(yīng)符合使用的要求。在利用數(shù)組元素作為計(jì)數(shù)器時(shí),不要忘記首先應(yīng)該給數(shù)組元素賦0值。總結(jié):通過(guò)本題的編程,要求掌握利用數(shù)組元素作為計(jì)數(shù)器的基本算法。9.2

44、8【分析與解答】本題的編程請(qǐng)參考例9.8。(1)若有以下10個(gè)整數(shù):0123456789要求從第5個(gè)元素依次向前移,則移動(dòng)之后的數(shù)列應(yīng)該是:012456789第5個(gè)元素不是指下標(biāo)為5的元素,而是指排列的順序,對(duì)此數(shù)列而言是指數(shù)值為4的那個(gè)完成移動(dòng)后,數(shù)列中的數(shù)據(jù)個(gè)數(shù)減1。若進(jìn)行指定操作的函數(shù)名為moves,則函數(shù)的首部可如下:voidmoves(int*a,intn,int*m)這里a用以指向一維數(shù)組的首地址,n接受開始移動(dòng)的元素的位置,m指向主函數(shù)中存放元素個(gè)數(shù)的變量,因?yàn)闆](méi)有函數(shù)值返回,因此函數(shù)的類型定義為void??捎靡韵耭or循環(huán)完成指定的移動(dòng):for(i=n-1;iv*m;iKG-*

45、3+KG-*3+)ai-1=ai;注意,應(yīng)當(dāng)先把第n個(gè)元素(下標(biāo)為n-1)移到第n-1個(gè)元素(下標(biāo)為n-2)的位置上,依次從前到后向前移動(dòng)。完成移動(dòng)之后,應(yīng)使m所指變量中的值減1,表示數(shù)列中的數(shù)據(jù)少了一個(gè);這可由于句:*m=*m-l;來(lái)完成??稍O(shè)計(jì)一個(gè)輸出函數(shù),在移動(dòng)前、后調(diào)用此函數(shù)輸出數(shù)組中的數(shù)據(jù),以便驗(yàn)證操作是否正確。若輸出函數(shù)名為:outarr,則函數(shù)首部可寫成:voidoutarr(inta,intnum)形參a指向待輸出的數(shù)組,num接受數(shù)組中元素的個(gè)數(shù)。輸出操作可由一個(gè)for循環(huán)來(lái)完成:for(i=0;ivnum;iKG-*3+KG-*3+)printf(“d,ai);printf

46、(KG-*3nKG-*3n);退出循環(huán)后的printf語(yǔ)句使上面的輸出行結(jié)束。在主函數(shù)中定義所需的數(shù)組和變量。數(shù)組中的值可以在主函數(shù)中輸入,也可定義一個(gè)函數(shù)用于輸入數(shù)據(jù)。n的值在主函數(shù)中輸入,然后調(diào)用以上函數(shù)。需要注意的是,給n輸入的值不能是1,因?yàn)榈谝粋€(gè)元素(下標(biāo)為0)再向前移,下標(biāo)就越界了,同時(shí),n的值也不可大于10,因?yàn)橐阎付ㄖ挥?0個(gè)元素??偨Y(jié):對(duì)于需要進(jìn)行多次的操作,如本程序中輸出數(shù)組元素中的值,應(yīng)當(dāng)編寫一個(gè)獨(dú)立的函數(shù)多次調(diào)用,而不應(yīng)重復(fù)地編寫代碼。雖然該函數(shù)中只是一個(gè)for循環(huán),似乎在主函數(shù)中書寫兩次也不麻煩,但養(yǎng)成良好的模塊化程序設(shè)計(jì)的風(fēng)格卻是十分重要的。分析以上例子可見(jiàn),所規(guī)定

47、的操作,實(shí)際上刪除了數(shù)列中的第n-1個(gè)元素,因此可見(jiàn)刪除操作是由移動(dòng)操作來(lái)完成的。9.29【分析與解答】程序要求定義兩個(gè)數(shù)組以便存放原始數(shù)據(jù)和從中選出的所有奇數(shù)。若把函數(shù)命名為oods,則函數(shù)首部可寫成:voidodds(int*a,intan,int*b,int*bn)形參a指向存放原始數(shù)據(jù)的數(shù)組,an存放此數(shù)組中數(shù)據(jù)的個(gè)數(shù);b指向另一個(gè)數(shù)組,此數(shù)組中將存放將選出的所有奇數(shù),指針bn指向存放奇數(shù)個(gè)數(shù)的存儲(chǔ)單元,因?yàn)閷⑼ㄟ^(guò)此指針,把奇數(shù)的個(gè)數(shù)傳回主函數(shù)。在odds函數(shù)中,可通過(guò)一個(gè)for循環(huán)選出所有的奇數(shù):for(i=0;ian;iKG-*3+KG-*3+)if(ai%2)bj=ai;jKG-

48、*3+KG-*3+;在for循環(huán)中逐個(gè)引用原始的數(shù)組元素,若元素中的值不能被2除盡(不為0),則把它放入b所指的數(shù)組中;j用作b的下標(biāo),每放入一個(gè)奇數(shù)后,j的值加1;注意,j的初值應(yīng)該置0。當(dāng)完成以上操作退出循環(huán)時(shí),因?yàn)樵谘h(huán)內(nèi)最后進(jìn)行了一次jKG-*3+KG-*3+的操作,所以j的值就是奇數(shù)的個(gè)數(shù),最后應(yīng)當(dāng)把它賦給*bn,以便通過(guò)指針bn把奇數(shù)的個(gè)數(shù)傳回主函數(shù)。程序需要兩次輸出數(shù)組中元素的值,一次是輸出原始數(shù)組中的值,一次是輸出奇數(shù)數(shù)組中的值。因此可以使用題9.28中的outarr函數(shù),進(jìn)行兩次調(diào)用。在主函數(shù)中應(yīng)當(dāng)定義所需的數(shù)組和變量,可以在主函數(shù)中給數(shù)組元素輸入數(shù)據(jù)。總結(jié):本題的算法很簡(jiǎn)單,要求讀者能夠編寫?yīng)毩⒌哪K,并在函數(shù)之間熟練地傳送數(shù)據(jù)。9.30【分析與解答】例9.9完成了對(duì)整數(shù)由小到大的排序,而本題是對(duì)字符數(shù)組中的元素進(jìn)行由大到小的排序;兩者之間并無(wú)大的區(qū)別,只是數(shù)組的類型不同,字符數(shù)組中每個(gè)元素存放一個(gè)字符,字符的大小依據(jù)每個(gè)字符的ASCII碼值的大小。若函數(shù)形參a指向主函數(shù)中待排序的數(shù)組,由大到小的排序只需改變內(nèi)循環(huán)中if語(yǔ)句的條件表達(dá)式即可:if(apai)p=i;此處i是內(nèi)循環(huán)的控制變量。排序前后可以調(diào)用一個(gè)輸出函數(shù),輸出原始數(shù)據(jù)和排序后的數(shù)據(jù),可參考習(xí)題9.28的outarr函數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論