版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程——C語(yǔ)言程序設(shè)計(jì)》習(xí)題分析與詳細(xì)解答第一章程序設(shè)計(jì)基本概念習(xí)題分析與解答1.1【參考答案】EXE1.2【參考答案】[1].C[2].OBJ[3].EXE1.3【參考答案】[1]順序結(jié)構(gòu)[2]選擇結(jié)構(gòu)[3]循環(huán)結(jié)構(gòu)第二章C程序設(shè)計(jì)的初步知識(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【參考答案】[1]112.15【參考答案】[1]4.2[2]12[2]4.22.16【參考答案】[1]{[3]定義[4]執(zhí)行2.17【參考答案】[1]關(guān)鍵字[2]用戶標(biāo)識(shí)符2.18【參考答案】[1]int[2]float[3]double[2]}2.19【參考答案】floata1=1.0,a2=1.0;或floata1=1,a2=1;(系統(tǒng)將自動(dòng)把1轉(zhuǎn)換為1.0)2.20【參考答案】存儲(chǔ)單元2.21【參考答案】3.52.22【參考答案】[1]a*b/c[2]a/c*b[3]b/c*a2.23【參考答案】把10賦給變量s2.24【參考答案】[1]位[2]1位二進(jìn)制數(shù)據(jù)(0或1)2.25【參考答案】[1]8[2]127[3]01111111[4]-128[5]100000002.26【參考答案】[1]32767[2]-32768[3]10000000000000002.27【參考答案】[1]十[2]八[3]十六三、上機(jī)改錯(cuò)題2.28【分析與解答】第1行的錯(cuò)誤:(1)include是一個(gè)程序行,因此在此行的最后不應(yīng)當(dāng)有分號(hào)(;)。第2行的錯(cuò)誤:(1)main()是主函數(shù)的起始行,不是語(yǔ)句,因此最后不應(yīng)當(dāng)有分號(hào)(;)。(2)在同一行上的/*mainfunction*/顯然是注釋?zhuān)籆語(yǔ)言規(guī)定:注釋由/*開(kāi)頭,由*/結(jié)束,但在*號(hào)和/之間不得插入任何空格,而在此處“/*”和“*/”之間存在空格,因此,/*mainfunction*/的寫(xiě)法是錯(cuò)誤的,而應(yīng)寫(xiě)成:/*mainfunction*/。第3行的錯(cuò)誤:(1)在主函數(shù)的起始行main()的后面是函數(shù)體,函數(shù)體由左花括號(hào)({}開(kāi)始。但在函數(shù)體的第一行:float的前面缺少了左花括號(hào)({}。(2)在同一行上的/*/*risradius*/,/*sisareaofcircular*/*/顯然是注釋?zhuān)籆語(yǔ)言規(guī)定:注釋由/*開(kāi)頭,由*/結(jié)束,并且開(kāi)頭的/*將去找最近的*/去配對(duì),因此在/*/*risradius*/中,第一個(gè)/*與radius后的那個(gè)*/配上了對(duì),結(jié)果緊跟在后面的那個(gè)逗號(hào)(,)落在了注釋的外面,而構(gòu)成了一個(gè)多余符號(hào),為此,在編譯時(shí)將報(bào)告“語(yǔ)法錯(cuò)”。/*sisareaofcircular*/*/中第一個(gè)*/就結(jié)束了注釋?zhuān)谝粋€(gè)*/就成了多余的了。第6行的錯(cuò)誤:(1)printf(″%f\n″,s)應(yīng)當(dāng)是一條輸出語(yǔ)句,但在最后缺少了一個(gè)分號(hào)。(2)printf(″%f\n″,s);是程序的最后一條語(yǔ)句,程序應(yīng)當(dāng)結(jié)束;但缺少了程序體結(jié)束所需的右花括號(hào)());此右花括號(hào)可以放在printf(″%f\n″,s);的后面,也可以放在printf(″%f\n″,s);的下一行上。2.27【分析與解答】第2行的錯(cuò)誤:在main的后面缺少一對(duì)圓括號(hào)。第4行的錯(cuò)誤:在c=4.0的后面缺少分號(hào)。第6行的錯(cuò)誤:在printf(″%f\n″,v)的后面缺少分號(hào)。第三章順序結(jié)構(gòu)習(xí)題分析與解答一、選擇題(單選題)3.1【參考答案】3.2【參考答案】3.3【參考答案】3.4【參考答案】3.5【參考答案】3.6【參考答案】3.7【參考答案】3.8【參考答案】3.9【參考答案】3.10【參考答案】3.11【參考答案】C)C)D)C)D)B)C)D)A)B)C)3.12【參考答案】3.13【參考答案】3.14【參考答案】3.15【參考答案】3.16【參考答案】3.17【參考答案】3.18【參考答案】3.19【參考答案】3.20【參考答案】二、填空題D)D)A)C)C)C)D)把D的答案修改為:scanf(“%8f”,&c);C)B)3.21【參考答案】(1)-200,2500(2)i=-200,j=2500(3)i=-200j=25003.22【參考答案】3.23【參考答案】3.24【參考答案】[1]12[2]0[3]0[1]一條語(yǔ)句[2]分號(hào)(或;)分號(hào)(;)3.25【參考答案】[1]:10025.811.89234[2]:100<CR>25.81<CR>1.89234<CR>[3]:100<Tab>25.81<Tab>1.892343.26【參考答案】x=127,x=127,x=177,x=7f,x=1273.27【參考答案】3.28【參考答案】三、編程題和改錯(cuò)題3.29【分析與解答】x=127,x=127,x=$127,x=$000127,x=%06da=513.789215,a=513.79,a=513.78921500,a=513.78921500(1)主函數(shù)名main后應(yīng)有一對(duì)圓括號(hào)。(2)第三行的printf語(yǔ)句用以提示輸入,但是原樣輸出的字符串沒(méi)有用雙引號(hào)括起來(lái);另外,從輸入的形式看,輸入的數(shù)據(jù)緊跟在提示之后,因此,printf格式串中最后不應(yīng)該有換行符——\n。(3)因?yàn)檩斎腠?xiàng)a、b、c從定義和計(jì)算結(jié)果來(lái)看都是double類(lèi)型,因此,第四行scanf語(yǔ)句格式串中的格式說(shuō)明不應(yīng)當(dāng)用%d而應(yīng)當(dāng)用%lf;且每一個(gè)變量之前應(yīng)該加地址運(yùn)算符&。(4)第七行的printf語(yǔ)句中應(yīng)當(dāng)把%d都改成%lf或%f;按輸出要求在格式串中應(yīng)添加相應(yīng)的原樣輸出的字符;因?yàn)橄乱粋€(gè)printf的輸出從新的一行開(kāi)始,因此在本輸出語(yǔ)句的格式串的最后應(yīng)當(dāng)加換行符——\n。(5)第八行的printf語(yǔ)句中應(yīng)當(dāng)把格式串整理合并放在輸出項(xiàng)的前面,輸出項(xiàng)放在后面,%d都改成%lf或%f;中間的\n刪去。(6)請(qǐng)同學(xué)們自己寫(xiě)出修改后的程序,并上機(jī)調(diào)試。3.30【分析與解答】(1)分析:可用算術(shù)式560÷60把分鐘換算成小時(shí)和分鐘,商數(shù)就是小時(shí)數(shù),余數(shù)就是分鐘數(shù)。(2)確定變量的名字和定義變量的類(lèi)型:在程序中把小時(shí)數(shù)放在變量h中,把分鐘數(shù)放在變量m中。這兩個(gè)變量的類(lèi)型可以是整型(本題中采用整型),也可以是實(shí)型。(3)確定所用算法:求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ǔ)句。(5)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。(6)編寫(xiě)程序如下:main(){inth,m;h=560/60;m=560%60;printf(″Theresult:%3d:%3d\n″,h,m);}運(yùn)行結(jié)果是:Theresult:9:203.31【分析與解答】(1)確定變量的名字和定義變量的類(lèi)型。若用a存放1500,用b存放350;用q存放商數(shù),用r存放余數(shù),所有變量應(yīng)定義成int類(lèi)型。(2)設(shè)計(jì)輸入語(yǔ)句從終端輸入1500和350;在輸入語(yǔ)句之前,應(yīng)當(dāng)設(shè)計(jì)一個(gè)輸出語(yǔ)句,用以提示輸入。(3)可用整除求商數(shù),結(jié)果放在變量q中??捎们笥噙\(yùn)算符%求兩數(shù)之余數(shù),結(jié)果放在變量r中。(4)設(shè)計(jì)輸出語(yǔ)句。輸出a、b、q、r。(5)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。本題的程序與3.30相似,請(qǐng)大家參考上題并根據(jù)本題的解釋自己編程,并上機(jī)調(diào)試。3.32【分析與解答】(1)定義4個(gè)雙精度變量a、b、c和ave,變量a、b、c分別存放讀入的3個(gè)雙精度數(shù),ave存放它們的平均值。(2)設(shè)計(jì)輸入語(yǔ)句,以及在此之前用于提示輸入的(printf)語(yǔ)句。(3)設(shè)計(jì)求平均值的算法,把所求得的平均值放入變量ave中。(4)設(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;其他依此類(lèi)推。(5)若要求對(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)/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;其他依此類(lèi)推。(6)設(shè)計(jì)輸出語(yǔ)句。輸出a、b、c和ave。(7)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。(8)編寫(xiě)程序如下:main(){doublea,b,c,ave;printf(″Entera,b,c:″);scanf(″%lf%lf%lf″,&a,&b,&c);ave=(a+b+c)/3;printf(″ave=%f\n″,ave);/*用以比較四舍五入前后的數(shù)據(jù)*/ave=(int)((ave+0.05)*10)/10.0;/*上句也可寫(xiě)成ave=(int)(ave*10+0.5)/10.0;*/printf(″a=%f,b=%f,c=%f,ave=%f\n″,a,b,c,ave);}3.33【分析與解答】(1)關(guān)于對(duì)變量中的數(shù)進(jìn)行交換的算法請(qǐng)參考3.7題中的解釋和《教程》中有關(guān)的例題。(2)定義4個(gè)整型變量a、b、c和t,變量a、b、c分別存放讀入的3個(gè)整數(shù),t用作臨時(shí)存儲(chǔ)單元。(3)設(shè)計(jì)輸入語(yǔ)句,以及在此之前用于提示輸入的(printf)語(yǔ)句。(4)輸出a、b、c中的值,以便于比較。(5)交換的步驟如下:①把c中的值賦給t。②把b中的值賦給c。③把a(bǔ)中的值賦給b。④把t中的值賦給a。經(jīng)過(guò)以上步驟,已按要求進(jìn)行了交換。(6)輸出a、b、c中的值。(7)編寫(xiě)程序如下:main(){inta,b,c,t;printf(″Entera,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);}第四章選擇結(jié)構(gòu)習(xí)題分析與解答一、選擇題4.1【參考答案】4.2【參考答案】4.3【參考答案】4.4【參考答案】4.5【參考答案】4.6【參考答案】4.7【參考答案】4.8【參考答案】4.9【參考答案】4.10【參考答案】二、填空題A)B)A)D)C)A)B)C)D)D)4.11【參考答案】4.12【參考答案】4.13【參考答案】[1]非零[2]零<、>、<=、>=、==、![KG-*2]=[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【參考答案】4.18【參考答案】4.19【參考答案】4.20【參考答案】三、編程題1[1]x<=0[2]1[1]3[2]2[3]2*#4.21【分析與解答】相關(guān)內(nèi)容請(qǐng)參考《教程》4.2節(jié)和4.4節(jié)。(1)改寫(xiě)如下:switch(a/10){default:m=5;break;case0:case1:case2:m=1;break;case3:m=2;break;case4:m=3;break;case5:m=4;break;};(2)本題中對(duì)a的判斷條件有一定的規(guī)律可尋;關(guān)鍵是,在switch語(yǔ)句后的表達(dá)式中利用了a/10,從而簡(jiǎn)化了case標(biāo)號(hào)。4.22【分析與解答】編寫(xiě)本題的程序,首先要解決如何計(jì)算學(xué)生當(dāng)前的年齡(設(shè)存放實(shí)足年齡的變量是age)。(1)如果當(dāng)前的月份大于生日的月份,則學(xué)生的實(shí)足年齡age=y1-y0。(2)如果當(dāng)前的月份等于生日的月份,就要看日數(shù),當(dāng)前的日數(shù)大于或等于生日的日數(shù),則學(xué)生的實(shí)足年齡age=y1-y0。(3)如果不滿足以上的條件,就可斷定當(dāng)前的日期沒(méi)有超過(guò)生日日期,就是說(shuō)學(xué)生的年齡應(yīng)當(dāng)是age=y1-y0-1。以上3條,用C語(yǔ)言可以描述如下:if((m1>m0)[JB>1|][JB>1|](m1==m0&&d1>=d0))age=y1-y0;elseage=y1-y0-1;讀者可以參考以上語(yǔ)句寫(xiě)出程序,也可以根據(jù)分析寫(xiě)出與此形式不同的語(yǔ)句和程序。4.23【分析與解答】(1)若輸入的整數(shù)a是奇數(shù),輸出:oddnumber,是偶數(shù)輸出:evennumber。(2)若一個(gè)a是偶數(shù),它就能被2除盡,即a%2==0,輸出evennumber;若是奇數(shù),它就不能被2除盡,即a%2!〖KG-*2〗=0,輸出oddnumber。讀者可以參考以上給出的算法,寫(xiě)出相應(yīng)的C語(yǔ)句,并編寫(xiě)出完整的程序。4.24【分析與解答】本題的主要算法是從3個(gè)數(shù)中找出最大的那個(gè)數(shù)。假定始終把最大的數(shù)放在變量max中。(1)假定a中的數(shù)最大,把a(bǔ)賦給max。(2)用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也不做。(3)用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。(4)經(jīng)過(guò)以上操作,max中已放入了a、b、c三個(gè)數(shù)中的最大數(shù),輸出max即可。讀者可以參考以上給出的算法,寫(xiě)出相應(yīng)的C語(yǔ)句,并編寫(xiě)出完整的程序。4.25【分析與解答】(1)本題已給出了非常明確的條件,只要寫(xiě)出正確的條件判斷語(yǔ)句就可基本完成程序的編寫(xiě)。(2)由給出的函數(shù)可知,只有x的值在規(guī)定的范圍內(nèi)時(shí),才求出y的值,因此程序應(yīng)當(dāng)對(duì)輸入的x進(jìn)行判斷,若超過(guò)范圍就不求y的值。(3)現(xiàn)以使用if[CD#*2]else語(yǔ)句為例寫(xiě)出程序供參考。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+1;elseif(x<0&&x>-5)y=x;printf(″x=%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【參考答案】5.7【參考答案】5.8【參考答案】5.9【參考答案】5.10【參考答案】二、填空題D)C)B)C)C)B)D)A)D)D)5.11【參考答案】5.12【參考答案】5.13【參考答案】5.14【參考答案】5.15【參考答案】[1]5[2]4[3]6程序段無(wú)限循環(huán),沒(méi)有輸出結(jié)果-111[1]d=1.0[2]k++[3]k<=n5.16【參考答案】三、編程題[1]x>=0[2]x<amin5.17【分析與解答】(1)本題的基本算法是求累加值。累加項(xiàng)的值有規(guī)律的遞增,每一項(xiàng)的絕對(duì)值比前一項(xiàng)增2,因此可以利用循環(huán)的控制變量的遞增來(lái)得到累加項(xiàng)的絕對(duì)值。例如:for(i=1;i<=101;i+=2)…(2)按所給的算式可以看到,累加項(xiàng)的符號(hào)是在交叉改變的,為此應(yīng)當(dāng)在循環(huán)體內(nèi)設(shè)置一個(gè)變量,使它的符號(hào)按此規(guī)律交叉改變,這可用:s=-s;來(lái)實(shí)現(xiàn),s的初值為1;當(dāng)s的值為1時(shí),賦值后s中新的值為-1,當(dāng)s的值為-1時(shí),賦值后s中新的值為1。用s去乘累加項(xiàng),將使累加項(xiàng)的符號(hào)也隨之有規(guī)律地改變。(3)若累加和放在變量sum中,累加項(xiàng)放在變量t中,按照以上敘述,for循環(huán)體內(nèi)的語(yǔ)句可以設(shè)計(jì)如下:s=-s;t=s*i;sum=sum+t;(4)sum的值是51。(5)請(qǐng)讀者自己對(duì)變量做出正確的定義并賦初值,設(shè)計(jì)輸出語(yǔ)句,完善程序。5.18【分析與解答】(1)本題的基本算法是求累加值。累加項(xiàng)的分子部分都是1;分母的值有規(guī)律的遞增,依次為1!、2!、…、n!,即,若第i-1項(xiàng)的累加項(xiàng)為t(i-1),則第i項(xiàng)的累加項(xiàng)是t(i-1)*i,在程序中可用表達(dá)式:t=t/i(i從1變化到n)來(lái)表示。(2)根據(jù)以上分析,若用變量t來(lái)存放累加項(xiàng),當(dāng)i的值從1變化到n時(shí),可用以下語(yǔ)句來(lái)實(shí)現(xiàn)累加:t=t/i;e+=t;(3)為了實(shí)現(xiàn)累加過(guò)程,以上語(yǔ)句應(yīng)當(dāng)放在循環(huán)內(nèi),循環(huán)控制變量從1變化到n。(4)若用for循環(huán),按題目要求已指定n的值是50。若用while循環(huán),并沒(méi)有指定n的值,但已指定了循環(huán)結(jié)束的條件,當(dāng)t的值小于10-4結(jié)束循環(huán)。(5)現(xiàn)例示用while循環(huán)來(lái)求e值的部分程序:i=1;e=1.0;t=1.0;while(t>=1e-4){t=t/i;e+=t;i++;}(6)請(qǐng)讀者自己對(duì)變量做出正確的定義,設(shè)計(jì)輸出語(yǔ)句,完善程序;也可以參考此程序段,按照自己的思路獨(dú)立地完成程序。(7)e的值應(yīng)當(dāng)是:2.71828。(8)根據(jù)以上分析,讀者已不難用for循環(huán)來(lái)實(shí)現(xiàn)求e值的計(jì)算。(9)注意:在完成此程序時(shí),不要對(duì)分母中的階乘值進(jìn)行單獨(dú)計(jì)算,因?yàn)?7!的值已超過(guò)long類(lèi)型的最大值,更無(wú)法求到50!。5.19【分析與解答】(1)從1880年至2000年的年數(shù)可用一個(gè)for循環(huán)來(lái)取得。(2)對(duì)每一年,用以上指定的條件來(lái)進(jìn)行判斷,若滿足條件即為閏年,進(jìn)行輸出。(3)按輸出的要求,需要設(shè)一個(gè)變量用于統(tǒng)計(jì)一行中輸出的個(gè)數(shù),若在一行上已連續(xù)輸出了5個(gè)年數(shù),就需輸出一個(gè)換行符,使下一個(gè)輸出項(xiàng)在新的一行上開(kāi)始;若用變量n來(lái)做此統(tǒng)計(jì),則當(dāng)表達(dá)式n%5==0時(shí)就應(yīng)輸出一個(gè)換行符,同時(shí)使n重新置0值。(4)若變量y代表年數(shù),if語(yǔ)句的邏輯表達(dá)式可以寫(xiě)成如下:(y%4==0&&y%100!=0[JB>1|][JB>1|]y%400==0)(5)以下程序段供參考:for(y=1880;y<=2000;y++)if(y%4==0&&y%100![KG-*2]=0[JB>1|][JB>1|]y%400==0){printf(″%d″,y);n++;if(n%5==0){printf(″\n″);n=0;}}(6)請(qǐng)讀者自己對(duì)變量做出正確的定義并賦初值,完善程序;也可以參考此程序段,按照自己的思路獨(dú)立地完成程序。從1880年至2000年有30個(gè)閏年。5.20【分析與解答】(1)不難理解利用以下的for循環(huán)可以在一行上連續(xù)輸出n個(gè)*號(hào):for(i=1;i<=n;i++)printf(″*″);printf(″\n″);若n的值是6,則連續(xù)輸出6個(gè)*號(hào)。(2)以上圖形是在各行上輸出數(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<=k;i++)printf(″*″);printf(″\n″);}在下半部依次是5、3、1個(gè);因此可以用以下的程序段來(lái)實(shí)現(xiàn)這樣的輸出:for(k=5;k>=1;k--,k--){for(i=1;i<=k;i++)printf(″*″);printf(″\n″);}以上程序段從第一列起輸出的結(jié)果如下:*************************現(xiàn)在我們已完成了在每行輸出指定數(shù)目的*號(hào)。(3)輸出結(jié)果與題目要求不同,它們的區(qū)別是:按題目每一行之前有不同的空格,而這里則是所有的行都在第一列上開(kāi)始輸出*號(hào);所以接著就應(yīng)當(dāng)解決這一問(wèn)題。(4)分析題目要求,每行第一個(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″);}(5)請(qǐng)讀者在理解以上給出的示例的基礎(chǔ)上,自己添加下半部空格的輸出。第六章字符型數(shù)據(jù)習(xí)題分析與解答一、選擇題6.1【參考答案】B)6.2【參考答案】6.3【參考答案】6.4【參考答案】6.5【參考答案】6.6【參考答案】6.7【參考答案】6.8【參考答案】6.9【參考答案】6.10【參考答案】6.11【參考答案】二、填空題D)A)A)B)D)D)B)A)A)C)6.12【參考答案】6.13【參考答案】6.14【參考答案】6.15【參考答案】6.16【參考答案】或:10A<CR>20B<CR>-11ctype.h010A20B30C40D<CR>30C<CR>40D<CR>6.17【參考答案】或:7.29<CR>101.29AB<CR>6.18【參考答案】7.29101.298AB<CR>A7.29B101.298<CR>6.19【參考答案】A<CR>B<CR>C<CR>三、編程題6.20【分析與解答】(1)在進(jìn)行字符輸入時(shí),即使一次輸入了一行字符(最后用回車(chē)結(jié)束輸入),字符也只能一個(gè)一個(gè)地讀入。若ch已定義為char型變量,可以用以下的程序段來(lái)完成操作:ch=getchar();while(ch![KG-*2]=′\n′){……ch=getchar();}當(dāng)讀入的是一個(gè)回車(chē)符時(shí),循環(huán)就結(jié)束。循環(huán)體內(nèi)的“……”符號(hào)表示需要在循環(huán)體內(nèi)完成的其他操作。(2)在循環(huán)內(nèi)要求進(jìn)行的操作之一是:輸出每個(gè)字符以及與之對(duì)應(yīng)的ASCII代碼值。因此可用以下語(yǔ)句來(lái)實(shí)現(xiàn)。printf(″%c:%d″,ch,ch);(3)在循環(huán)內(nèi)要求進(jìn)行的另一個(gè)操作是:每行只能輸出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(′\n′);(4)把(2)和(3)中給出的語(yǔ)句放在循環(huán)體內(nèi),并按要求給出正確的定義和初值,就可完成題目所要求的操作。(5)也可以在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【分析與解答】(1)一行字符的讀入,請(qǐng)參照題6.20(1)和(5)中的解釋。循環(huán)體內(nèi)的“……”符號(hào)表示需要在循環(huán)體內(nèi)完成的其他操作。ch=getchar();while(ch![KG-*2]=′\n′){……ch=getchar();}(2)在本題中循環(huán)體內(nèi)需要把讀入的所有數(shù)字字符轉(zhuǎn)換成一個(gè)整數(shù)。若用變量n來(lái)存放這個(gè)整數(shù),為了保證有效的存放,應(yīng)當(dāng)把它定義成long類(lèi)型。(3)要把輸入的一串?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′&&ch<=′9′){d=ch-′0′;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′;。(4)把(3)中的語(yǔ)句放入循環(huán)中:ch=getchar();while(ch![KG-*2]=′\n′){if(ch>=′0′&&ch<=′9′)n=n*10+ch-′0′;ch=getchar();}(5)請(qǐng)自己寫(xiě)出定義語(yǔ)句并賦初值。注意,最后輸出n時(shí),應(yīng)當(dāng)使用格式說(shuō)明%ld,而不能使用%d。6.22【分析與解答】(1)行數(shù)的統(tǒng)計(jì)可通過(guò)統(tǒng)計(jì)輸入的′\n′符的個(gè)數(shù)來(lái)完成。(2)統(tǒng)計(jì)的過(guò)程應(yīng)當(dāng)放在一個(gè)while循環(huán)體中;判斷循環(huán)是否進(jìn)行的條件可以用:((ch=getchar())==EOF)。若用整型變量n作為計(jì)數(shù)器對(duì)′\n′符進(jìn)行統(tǒng)計(jì),只要讀入的字符是′\n′,則n增1。如:while((ch=getchar())![KG-*2]=EOF)if(ch==′\n′)n++;(3)EOF是在stdio.h中預(yù)定義了的標(biāo)識(shí)符,在TURBOC的環(huán)境下,鍵入Ctrl+Z(即按住鍵盤(pán)上的Ctrl鍵,同時(shí)按字母Z鍵)后,敲Enter鍵,即輸入了EOF。6.23【分析與解答】(1)本題要求的操作同樣可在while循環(huán)中完成:while((ch=getchar())!=′\n′){……}(2)若用整型變量n作為計(jì)數(shù)器對(duì)小寫(xiě)字母進(jìn)行統(tǒng)計(jì),只要讀入的字符是小寫(xiě)字母,則n增1。如:if(ch>=′a′&&ch<=′z′)n++;(3)在退出循環(huán)后,輸出n的值。(4)請(qǐng)自己完善程序。6.24【分析與解答】(1)若圖案的行數(shù)輸入到變量L中。(2)按要求L決定了圖形的行數(shù),因此可通過(guò)循環(huán)來(lái)實(shí)現(xiàn)L行的輸出:for(i=1;i<=L;i++){……}循環(huán)體中的“……”號(hào),代表輸出L行的操作。(3)假定ch中存放了一個(gè)字符,我們知道,通過(guò)以下循環(huán)可以在一行上輸出n個(gè)字符:for(j=1;j<=n;j++)putchar(ch);putchar(′\n′);注意,在循環(huán)后putchar(′\n′);語(yǔ)句不可少,它用以換行。(4)現(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-1來(lái)表示。當(dāng)i為1時(shí)ch中被賦予字母A,當(dāng)i為2時(shí)ch中被賦予了字母B,其他依此類(lèi)推。因此,在此表達(dá)式后,利用(3)中的循環(huán)就解決了各行上輸出的字母。(5)按要求每行輸出的字母的個(gè)數(shù)不同,第二行輸出3個(gè)字母,第三行輸出5個(gè)字母,第四行輸出7個(gè)字母……(3)中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的值。(6)總結(jié)以上分析,我們可得到以下的程序段:for(i=1;i<=L;i++){ch=′A′+i-1;n=2*i-1;for(j=1;j<=n;j++)putchar(ch);putchar(′\n′);}若所用的變量都已正確定義,通過(guò)輸入L的值為5,則程序段在第一列起有以下的輸出結(jié)果:ABBBCCCCCDDDDDDDEEEEEEEEE和題目的要求比較已趨接近,不同的是在每行沒(méi)有適當(dāng)?shù)目s進(jìn)。(7)現(xiàn)在來(lái)解決每行的縮進(jìn)問(wèn)題。由題中給出的圖形可知,若指定輸出5行,第一行縮進(jìn)5個(gè)空格,第二行則縮進(jìn)4個(gè)空格,第三行則縮進(jìn)3個(gè)空格,第四行則縮進(jìn)2個(gè)空格,第五行則縮進(jìn)1個(gè)空格。這同樣可以由以下的for循環(huán)來(lái)實(shí)現(xiàn):for(k=L;k>=i;k--)putchar(′′);把此循環(huán)放在i控制的循環(huán)體內(nèi)、輸出每行字符的循環(huán)之前即可。(8)請(qǐng)讀者自己補(bǔ)充有關(guān)的include行、語(yǔ)句和變量的定義,以完成整個(gè)程序。注意,如果有能力可在某些地方作些簡(jiǎn)化。第七章函數(shù)習(xí)題分析與解答一、選擇題7.1【參考答案】7.2【參考答案】7.3【參考答案】7.4【參考答案】7.5【參考答案】7.6【參考答案】7.7【參考答案】二、填空題C)C)B)C)A)D)A)7.8【參考答案】7.9【參考答案】7.10【參考答案】7.11【參考答案】7.12【參考答案】7.13【參考答案】129.0(或9.000000)4[1]n=1[2]s[1]<=y[2]z*x[1]1[2]s*i[3]0[4]f(k)三、程序調(diào)試和編程題7.14【分析與解答】(1)fun函數(shù)判斷傳給形參n的數(shù)是否為素?cái)?shù),若是函數(shù)返回1,否則返回0。(2)函數(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í)行if子句,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ù)想的作用。(3)由上分析可知,對(duì)于n的值為15時(shí)而言,問(wèn)題是在一旦yes的值為0,已判斷n中的值不是素?cái)?shù)時(shí),沒(méi)有及時(shí)退出循環(huán),返回0;因此,若在if子句中添加一條語(yǔ)句:break;就能解決這一問(wèn)題,把if語(yǔ)句改寫(xiě)如下:if(n%k==0){yes=0;break;}elseyes=1;(4)在所給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)行。(5)總結(jié):因?yàn)橐坏﹊f語(yǔ)句中的表達(dá)式:n%k==0的值為1(即可被某數(shù)整除),則可以確定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【分析與解答】(1)若用整型變量c存放余數(shù),則求a被b除后的余數(shù)可用表達(dá)式:c=a%b。(2)本題要求編寫(xiě)函數(shù)mymod用以求a被b除后的余數(shù)即:c=mymod(a,b);(3)只要把a(bǔ)%b作為函數(shù)值返回即可完成操作(請(qǐng)參考例7.1):intmymod(inta,intb){returna%b;}(4)總結(jié):本題在算法上十分簡(jiǎn)單,只是要求讀者能夠掌握編寫(xiě)函數(shù)的基本知識(shí)。7.16【分析與解答】(1)本題所要采用的算法是累加。分析可見(jiàn),所有累加項(xiàng)的分子都是1,而分母部分逐項(xiàng)增1;只是累加項(xiàng)的符號(hào)交叉變化。因此處理好符號(hào)的變化是完成操作的關(guān)鍵之一。(2)若函數(shù)名為funa,傳送到函數(shù)的參數(shù)是整型值,假定形參命名為n;函數(shù)的返回值應(yīng)當(dāng)是浮點(diǎn)型,為此函數(shù)的首部可以是:doublefuna(intn)(3)接著寫(xiě)函數(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/k;add=add+t;}此處,s用作符號(hào)變量,在1和-1之間交叉變化,乘以1.0/k后,t的值也將按要求變化符號(hào)。注意,表達(dá)式1.0/k不可以寫(xiě)成1/k,因?yàn)槊恳豁?xiàng)的絕對(duì)值必定是小于1的小數(shù)。(4)現(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;}(5)最后注意應(yīng)當(dāng)給各變量賦以適當(dāng)?shù)某踔担⒎祷睾瘮?shù)值。(6)請(qǐng)編寫(xiě)主函數(shù)。當(dāng)傳給形參的值為10時(shí),函數(shù)的返回值應(yīng)當(dāng)是:0.645635。(7)總結(jié):本題的算法并不復(fù)雜,但是需要讀者掌握編寫(xiě)函數(shù)的基本知識(shí)。掌握需要傳入函。數(shù)的參數(shù)及其類(lèi)型,掌握需要返回的值及其類(lèi)型。在此基礎(chǔ)上,其他方面與先前在主函數(shù)中編寫(xiě)的程序沒(méi)有什么區(qū)別。7.17【分析與解答】(1)此題與7.18相似。函數(shù)的返回值為浮點(diǎn)型,函數(shù)只有一個(gè)形參,為整型。(2)函數(shù)的基本算法是累加,只是除第一項(xiàng)外其余各項(xiàng)都用減法;每一項(xiàng)的分子都是1,分母部分為k2,k的值逐項(xiàng)增1,由2變化到m。因此,算法可以用一個(gè)循環(huán)來(lái)實(shí)現(xiàn)。(3)當(dāng)m的值為12時(shí),函數(shù)值應(yīng)是:0.435023。7.18【分析與解答】(1)若函數(shù)取名為fun,按題意,x作為形參,由調(diào)用函數(shù)傳入,其類(lèi)型不應(yīng)當(dāng)用整型;表達(dá)式x2-5x+4的值作為函數(shù)值返回,函數(shù)值的類(lèi)型應(yīng)為浮點(diǎn)型。因此,很容易寫(xiě)出函數(shù):doublefun(doublex){returnx*x-5*x+4;}(2)若在調(diào)用函數(shù)時(shí),x和y2已正確定義,且x已有確定的值,則可用以下函數(shù)調(diào)用語(yǔ)句得到y(tǒng)2的值:y2=fun(x+15);(3)同樣,若在調(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)在程序的最前面包含以下命令行:#include″math.h″(4)參考(2)和(3)應(yīng)不難寫(xiě)出求y1的語(yǔ)句,請(qǐng)讀者自己完成。(5)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。(6)總結(jié):①本題已給出了函數(shù)需要求值的表達(dá)式,讀者只需確定函數(shù)的類(lèi)型和形參的類(lèi)型,就可以寫(xiě)出函數(shù),就像例7.1中求兩數(shù)之和的函數(shù)一樣簡(jiǎn)單。②在給定了函數(shù)之后,調(diào)用函數(shù)時(shí),函數(shù)的實(shí)參應(yīng)當(dāng)是一個(gè)與形參類(lèi)型一致的任意合法的表達(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)求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【參考答案】A)B)B)C)B)B)C)D)B)C)C)8.12【參考答案】二、填空題C)8.13【參考答案】8.14【參考答案】110718.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+1),2,10,20,30,40三、編程題8.17【分析與解答】(1)若函數(shù)名為fun,按題意,函數(shù)不返回函數(shù)值;函數(shù)的形參需要接受傳送過(guò)來(lái)的兩個(gè)浮點(diǎn)數(shù),因此需要有兩個(gè)double類(lèi)型的形參;另外要把它們的和值與差值,通過(guò)形參傳送回去,這就要求有兩個(gè)double類(lèi)型的形參指針,接受傳送過(guò)來(lái)的地址,以便通過(guò)指針把和值與差值傳送給所指的主函數(shù)中的變量。因此函數(shù)的首部應(yīng)當(dāng)是:voidfun(doublea,doubleb,double*p1,double*p2)這里,a、b、p1、p2是自己取的名。(2)假設(shè)把a(bǔ)、b的和值傳送給p1所指的存儲(chǔ)單元,可用語(yǔ)句:*p1=a+b;把a(bǔ)、b的差值傳送給p2所指的存儲(chǔ)單元,可用語(yǔ)句:*p2=a-b;。(3)因此函數(shù)可寫(xiě)成:voidfun(doublea,doubleb,double*p1,double*p2){*p1=a+b;*p2=a-b;}(4)在主函數(shù)中,若有定義語(yǔ)句:doublex,y,z1,z2;,且x、y已賦值,則調(diào)用fun函數(shù)的語(yǔ)句可以是:fun(x,y,&z1,&z2);。(5)總結(jié):本題所要求的算法極簡(jiǎn)單,但它要求有兩個(gè)值返回,用return語(yǔ)句就不可能返回兩個(gè)函數(shù)值。要求讀者能利用形參指針把要求的值間接地傳回調(diào)用函數(shù)。8.18【參考答案】(1)若函數(shù)名為maxandmin,按題意,函數(shù)不返回函數(shù)值;函數(shù)將接受3個(gè)數(shù)(假定為int類(lèi)型),并需要通過(guò)指針指向主函數(shù)中的兩個(gè)int型變量,以便把最大值和最小值放入指針?biāo)傅拇鎯?chǔ)單元中。因此函數(shù)的首部應(yīng)當(dāng)是:voidmaxandmin(inta,intb,intc,int*pmax,int*pmin)(2)函數(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,則什么也不做。③用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。④經(jīng)過(guò)以上操作,max中已放入了a、b、c三個(gè)數(shù)中的最大數(shù)。⑤可模仿以上算法找到最小值:min=a;if(b<min)min=b;if(c<min)min=c;(3)若最大值已放入max中,最小值已放入min中,則可用以下語(yǔ)句把最大和最小值放入指針pmax和pmin所指的存儲(chǔ)單元中:*pmax=max;*pmin=min;(4)若主函數(shù)中已把3個(gè)數(shù)放入x、y、z中,要求把最大值放入m中,把最小值放在n中,則調(diào)用語(yǔ)句應(yīng)當(dāng)是:maxandmin(x,y,x,&m,&n);(5)總結(jié):本題要求的算法在第四章應(yīng)當(dāng)已掌握,本題的主要目的是要求讀者掌握如何通過(guò)指針把函數(shù)中的多個(gè)結(jié)果傳回主函數(shù)。第九章數(shù)組習(xí)題分析與解答一、選擇題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′三、上機(jī)題9.27【分析與解答】(1)對(duì)于字符的輸入可參考教材例6.3和習(xí)題9.26中的while循環(huán),只是要注意,循環(huán)的終止條件是:等于′\[KG-*3]n′。(2)在while循環(huán)體中,用if條件來(lái)判斷是否為數(shù)字字符,若是,就使對(duì)應(yīng)的元素增1;if中的條件表達(dá)式可用C的庫(kù)函數(shù):isdigit(ch),這時(shí)要在程序前加:#include<ctype.h>行;也可用:ch>[KG-*3]=′0′&&ch<[KG-*3]=′9′。(3)若用num數(shù)組元素來(lái)進(jìn)行統(tǒng)計(jì),當(dāng)ch中是數(shù)字“0”時(shí),使num[0]增1、當(dāng)ch中是數(shù)字“1”時(shí),使num[1]增1……num的下標(biāo)表達(dá)式可用:ch-′0′。(4)注意,在定義數(shù)組時(shí),數(shù)組的大小應(yīng)符合使用的要求。在利用數(shù)組元素作為計(jì)數(shù)器時(shí),不要忘記首先應(yīng)該給數(shù)組元素賦0值。(5)總結(jié):通過(guò)本題的編程,要求掌握利用數(shù)組元素作為計(jì)數(shù)器的基本算法。9.28【分析與解答】本題的編程請(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è)。(2)完成移動(dòng)后,數(shù)列中的數(shù)據(jù)個(gè)數(shù)減1。(3)若進(jìn)行指定操作的函數(shù)名為moves,則函數(shù)的首部可如下:voidmoves(int*a,intn,int*m)這里a用以指向一維數(shù)組的首地址,n接受開(kāi)始移動(dòng)的元素的位置,m指向主函數(shù)中存放元素個(gè)數(shù)的變量,因?yàn)闆](méi)有函數(shù)值返回,因此函數(shù)的類(lèi)型定義為void。(4)可用以下for循環(huán)完成指定的移動(dòng):for(i=n-1;i<*m;i[KG-*3]+[KG-*3]+)a[i-1]=a[i];注意,應(yīng)當(dāng)先把第n個(gè)元素(下標(biāo)為n-1)移到第n-1個(gè)元素(下標(biāo)為n-2)的位置上,依次從前到后向前移動(dòng)。(5)完成移動(dòng)之后,應(yīng)使m所指變量中的值減1,表示數(shù)列中的數(shù)據(jù)少了一個(gè);這可由于句:*m=*m-1;來(lái)完成。(6)可設(shè)計(jì)一個(gè)輸出函數(shù),在移動(dòng)前、后調(diào)用此函數(shù)輸出數(shù)組中的數(shù)據(jù),以便驗(yàn)證操作是否正確。若輸出函數(shù)名為:outarr,則函數(shù)首部可寫(xiě)成:voidoutarr(inta[],intnum)形參a指向待輸出的數(shù)組,num接受數(shù)組中元素的個(gè)數(shù)。輸出操作可由一個(gè)for循環(huán)來(lái)完成:for(i=0;i<num;i[KG-*3]+[KG-*3]+)printf(″%d″,a[i]);printf(″\[KG-*3]n\[KG-*3]n″);退出循環(huán)后的printf語(yǔ)句使上面的輸出行結(jié)束。(7)在主函數(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è)元素。(8)總結(jié):①對(duì)于需要進(jìn)行多次的操作,如本程序中輸出數(shù)組元素中的值,應(yīng)當(dāng)編寫(xiě)一個(gè)獨(dú)立的函數(shù)多次調(diào)用,而不應(yīng)重復(fù)地編寫(xiě)代碼。雖然該函數(shù)中只是一個(gè)for循環(huán),似乎在主函數(shù)中書(shū)寫(xiě)兩次也不麻煩,但養(yǎng)成良好的模塊化程序設(shè)計(jì)的風(fēng)格卻是十分重要的。②分析以上例子可見(jiàn),所規(guī)定的操作,實(shí)際上刪除了數(shù)列中的第n-1個(gè)元素,因此可見(jiàn)刪除操作是由移動(dòng)操作來(lái)完成的。9.29【分析與解答】(1)程序要求定義兩個(gè)數(shù)組以便存放原始數(shù)據(jù)和從中選出的所有奇數(shù)。(2)若把函數(shù)命名為oods,則函數(shù)首部可寫(xiě)成: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ù)。(3)在odds函數(shù)中,可通過(guò)一個(gè)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)中逐個(gè)引用原始的數(shù)組元素,若元素中的值不能被2除盡(不為0),則把它放入b所指的數(shù)組中;j用作b的下標(biāo),每放入一個(gè)奇數(shù)后,j的值加1;注意,j的初值應(yīng)該置0。(4)當(dāng)完成以上操作退出循環(huán)時(shí),因?yàn)樵谘h(huán)內(nèi)最后進(jìn)行了一次j[KG-*3]+[KG-*3]+的操作,所以j的值就是奇數(shù)的個(gè)數(shù),最后應(yīng)當(dāng)把它賦給*bn,以便通過(guò)指針bn把奇數(shù)的個(gè)數(shù)傳回主函數(shù)。(5)程序需要兩次輸出數(shù)組中元素的值,一次是輸出原始數(shù)組中的值,一次是輸出奇數(shù)數(shù)組中的值。因此可以使用題9.28中的outarr函數(shù),進(jìn)行兩次調(diào)用。(6)在主函數(shù)中應(yīng)當(dāng)定義所需的數(shù)組和變量,可以在主函數(shù)中給數(shù)組元素輸入數(shù)據(jù)。(7)總結(jié):本題的算法很簡(jiǎn)單,要求讀者能夠編寫(xiě)?yīng)毩⒌哪K,并在函數(shù)之間熟練地傳送數(shù)據(jù)。9.30【分析與解答】(1)例9.9完成了對(duì)整數(shù)由小到大的排序,而本題是對(duì)字符數(shù)組中的元素進(jìn)行由大到小的排序;兩者之間并無(wú)大的區(qū)別,只是數(shù)組的類(lèi)型不同,字符數(shù)組中每個(gè)元素存放一個(gè)字符,字符的大小依據(jù)每個(gè)字符的ASCII碼值的大小。(2)若函數(shù)形參a指向主函數(shù)中待排序的數(shù)組,由大到小的排序只需改變內(nèi)循環(huán)中if語(yǔ)句的條件表達(dá)式即可:if(a[p]<a[i])p=i;此處i是內(nèi)循環(huán)的控制變量。(3)排序前后可以調(diào)用一個(gè)輸出函數(shù),輸出原始數(shù)據(jù)和排序后的數(shù)據(jù),可參考習(xí)題9.28的outarr函數(shù),但注意,這里是對(duì)字符數(shù)組進(jìn)行輸出。(4)總結(jié):讀者可以參考例9.9,程序基本相同,但在掌握排序算法的基礎(chǔ)上,必須獨(dú)立完成此程序,不要照抄。9.31【分析與解答】(1)我們把插入操作命名為函數(shù)insert,若待插入的數(shù)據(jù)放在形參x中,指針a指向主函數(shù)中的數(shù)組,指針n指向存放數(shù)組中元素的個(gè)數(shù)變量,因?yàn)椴迦牒?,?shù)組中的數(shù)據(jù)會(huì)增加。函數(shù)的首部如下:voidinsert(int*a,intx,int*n)(2)若數(shù)組中原有的有序數(shù)列按由小到大排列如下,共12個(gè)數(shù):111417181920222426293033若x中的數(shù)為21,我們立刻知道應(yīng)插在何處,插入后數(shù)列如下,則插入后變成有13個(gè)數(shù):11141718192021222426293033因此,對(duì)于程序來(lái)說(shuō)應(yīng)當(dāng)做以下4件事:①能根據(jù)待插的數(shù)據(jù),按“仍然有序的要求”判斷出插入的位置。②把位置騰出來(lái),以便放入插入的數(shù)據(jù),但原有的數(shù)據(jù)不能缺少。③把x中的數(shù)放入騰出來(lái)的位置中。④使原有數(shù)組中的數(shù)據(jù)個(gè)數(shù)增1。(3)現(xiàn)在來(lái)做第一個(gè)步驟:確定插入的位置。用變量j來(lái)放置該位置在數(shù)組中的下標(biāo),以下while循環(huán)將完成此任務(wù):j=0;while(j<*n&&a[j]<x)j[KG-*3]+[KG-*3]+;因?yàn)橐呀?jīng)假定數(shù)列按由小到大排列,當(dāng)x的值大于當(dāng)前的元素a[j]時(shí),應(yīng)當(dāng)接著與下一個(gè)元素比較(執(zhí)行j[KG-*3]+[KG-*3]+),直到x的值小于或等于當(dāng)前的元素a[j]時(shí),x就應(yīng)當(dāng)插入到下標(biāo)為j的元素中,在此之前的所有值都比x小。當(dāng)x的值小于a[0]時(shí),不進(jìn)入while循環(huán),j的值為0。x就應(yīng)當(dāng)插入到下標(biāo)為0的元素中。當(dāng)x的值大于數(shù)組中所有的元素時(shí),由條件:j<*n可知,這時(shí)j的值將等于*n并退出循環(huán)。x就應(yīng)當(dāng)插入到下標(biāo)為j的元素中。(4)第二個(gè)步驟是要把下標(biāo)為j的元素后原有的數(shù)據(jù)移走,但不能改變?cè)瓉?lái)的順序。那么只能把下標(biāo)為j至下標(biāo)為*n-1中的數(shù)據(jù)依次向后平移;這種平移,應(yīng)當(dāng)先把最后的、下標(biāo)為*n-1的元素中的數(shù)據(jù)移到下標(biāo)為*n的元素中,其他依次后移一個(gè)單元,直到把a(bǔ)[j]中的值放入a[j+1]中。這可由以下for循環(huán)來(lái)完成:for(i=*n-1;i>[KG-*3]=j;i--)a[i+1]=a[i];(5)第三個(gè)步驟是把x放入a[j]中:a[j]=x;(6)第四步是使存放數(shù)據(jù)個(gè)數(shù)的變量中的數(shù)增1:*n=*n+1;插入過(guò)程到此結(jié)束。(7)可利用習(xí)題9.28中的outarr函數(shù),在插入前和插入后兩次輸出數(shù)組元素,以判斷操作是否正確。(8)請(qǐng)編寫(xiě)主函數(shù),定義所需的數(shù)組和變量,給數(shù)組輸入一組有序數(shù),正確調(diào)用函數(shù)。(9)請(qǐng)按題目要求至少對(duì)程序運(yùn)行3次,判斷程序是否在各種情況下都能得到正確的結(jié)果。(10)總結(jié):插入算法是程序設(shè)計(jì)中的一種最基本的算法,希望讀者在理解的基礎(chǔ)上編寫(xiě)程序。9.32【分析與解答】(1)若函數(shù)名為change,函數(shù)首部如下:voidchange(intx,int*a,int*n)形參x中存放一個(gè)待轉(zhuǎn)換的十進(jìn)制數(shù),指針a指向一個(gè)一維數(shù)組,數(shù)組中每一個(gè)元素中存放一個(gè)0或1代表一位二進(jìn)制數(shù),指針變量n指向一個(gè)整型變量,其中存放在一維數(shù)組中二進(jìn)制位的個(gè)數(shù)。(2)函數(shù)中定義一個(gè)指針變量s,并把a(bǔ)所指的數(shù)組的首地址賦給它以便保留。把x每次被2除后的余數(shù)放在a當(dāng)前所指的數(shù)組元素中,然后移動(dòng)指針a指向下一個(gè)元素,并使x的值除2;重復(fù)此過(guò)程,直到x的值為0??捎靡韵碌膚hile循環(huán)來(lái)進(jìn)行轉(zhuǎn)換:s=a;while(x){*a=x%2;a+[KG-*3]+;x=x/2;}退出循環(huán)時(shí),已把轉(zhuǎn)換后的二進(jìn)制數(shù)的每一位上的數(shù)放入主函數(shù)的數(shù)組元素中,但是應(yīng)當(dāng)注意,在a[0]中放的是二進(jìn)制數(shù)的最低位,最后放入的是最高位。例如,整數(shù)8轉(zhuǎn)換成的二進(jìn)制數(shù)為100,則在a[0]、a[1]中存放的是0,而a[2]中存放的是1。(3)函數(shù)中最后用:*n=a-s;把存放在一維數(shù)組中二進(jìn)制位的個(gè)數(shù)放入n所指的變量中。因?yàn)閟已指向主函數(shù)中數(shù)組的第一個(gè)元素(下標(biāo)為0);在循環(huán)中,指針a不斷后移,最后指向存放二進(jìn)制數(shù)最高位的元素;所以a-s的值就是已存入數(shù)據(jù)的元素的個(gè)數(shù)。(4)在主函數(shù)中輸入待轉(zhuǎn)換的十進(jìn)制數(shù),調(diào)用change函數(shù)后輸出數(shù)組元素中的值,注意,因?yàn)樵赼[0]中放的是二進(jìn)制數(shù)的最低位,因此輸出的順序應(yīng)該從a[n]到a[0]。9.33【分析與解答】(1)若函數(shù)名為getone,形參指針a指向主函數(shù)中存放指定數(shù)據(jù)的數(shù)組。函數(shù)的首部如下:voidgetone(inta[])(2)函數(shù)中變量x用來(lái)存放得到的一個(gè)隨機(jī)數(shù),變量n用來(lái)存放數(shù)組中已放入的不同的隨機(jī)數(shù)的個(gè)數(shù),變量i用作下標(biāo)變量。(3)所有的工作在一個(gè)while循環(huán)中完成:while(n<15){……}當(dāng)不同的隨機(jī)數(shù)的個(gè)數(shù)n的值等于15時(shí)退出循環(huán)。(4)在以上while循環(huán)中需要進(jìn)行以下4項(xiàng)步驟:①x=rand()%20;得到一個(gè)小于20的隨機(jī)整數(shù)。②i=0;準(zhǔn)備從下標(biāo)為0的元素開(kāi)始去查找數(shù)組中是否有與x相同的數(shù),若沒(méi)有,就把x中的數(shù)加入到數(shù)組中(放在最后),若有,就什么也不做。③用以下while循環(huán)從頭到尾去檢查數(shù)組中是否有與x值相同的元素:while(i<n&&x!=a[i])i[KG-*3]+[KG-*3]+;在兩種情況下,退出循環(huán):a.當(dāng)x不等于a[i]時(shí),i[KG-*3]+[KG-*3]+,x再去與下一個(gè)元素進(jìn)行比較,當(dāng)遇到x等于a[i]時(shí),說(shuō)明在數(shù)組中已經(jīng)有此數(shù),因此不必再去比較,應(yīng)當(dāng)退出循環(huán)。b.當(dāng)x不等于a[i]時(shí),i的值不斷增1;當(dāng)i的值等于n時(shí),說(shuō)明x已與數(shù)組中所有元素都比較過(guò)且都不相同,這時(shí)也應(yīng)退出循環(huán)。④如果i的值等于n時(shí),數(shù)組中沒(méi)有與x相同的元素,因此需要把新的值放入數(shù)組中,可用以下語(yǔ)句來(lái)實(shí)現(xiàn):if(i==n){a[n]=x;n[KG-*3]+[KG-*3]+;}因?yàn)橐延械臄?shù)據(jù)放在下標(biāo)為0到n-1的元素中,因此新的數(shù)放在a[n]中,然后n[KG-*3]+[KG-*3]+;即數(shù)組中不同數(shù)據(jù)的個(gè)數(shù)增1。(5)接著重新循環(huán),再去產(chǎn)生一個(gè)新的隨機(jī)數(shù),重復(fù)以上過(guò)程,直到n的值等于15時(shí)退出外循環(huán)。這時(shí)在數(shù)組中已放入了15個(gè)不同的隨機(jī)整數(shù)。(6)請(qǐng)?jiān)谥骱瘮?shù)中定義所需的數(shù)組和變量。調(diào)用getone函數(shù)后,可在主函數(shù)中輸出所得的數(shù)據(jù)。(7)總結(jié):①getone函數(shù)的主要部分是查找,沒(méi)有找到才進(jìn)行下一步操作。②C語(yǔ)言提供的庫(kù)函數(shù)rand()每調(diào)用一次產(chǎn)生一個(gè)0到32767的隨機(jī)整數(shù),因此rand()%20將得到一個(gè)0到19的隨機(jī)整數(shù)。9.34【分析與解答】(1)本題可參考例9.11。(2)本題可用define命令行定義N來(lái)代表一個(gè)常量(參考2.2.3節(jié))??啥x4個(gè)獨(dú)立的函數(shù)來(lái)實(shí)現(xiàn)所要求的操作。第一個(gè)函數(shù):voidgetm(int(*[KG-*3]p)[N])用于給二維數(shù)組元素賦隨機(jī)數(shù)。形參p是一個(gè)行指針,N是二維數(shù)組的列數(shù)。第二個(gè)函數(shù):voidsum(inta[][N],int*rows,int*[KG-*3]cols)用于求出二維數(shù)組每一行元素的和值放在形參指針rows所指的一維數(shù)組中,求出二維數(shù)組每一列元素的和值放在形參指針cols所指的一維數(shù)組中。形參a是一個(gè)行指針,N是二維數(shù)組的列數(shù)。第三個(gè)函數(shù):voiddiagsum(inta[][N],int*dg1,int*dg2)用于求出方陣的兩個(gè)對(duì)角線上元素的和值,分別放在形參指針dg1和dg2所指的變量中。形參a是一個(gè)行指針,N是二維數(shù)組的列數(shù)。第四個(gè)函數(shù)用于必要的輸出,請(qǐng)讀者自己設(shè)計(jì)。(3)在getm函數(shù)中,利用一個(gè)雙重循環(huán),調(diào)用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()%30;(4)在sum函數(shù)中,利用一個(gè)雙重循環(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];}當(dāng)i=0時(shí),rows[i]+[KG-*3]=a[i][j];通過(guò)內(nèi)循環(huán)控制變量j從0到N-1的變化,把下標(biāo)為0行上的每一個(gè)元素的值累加,放入rows所指的、下標(biāo)為0的數(shù)組元素中;而cols[i]+[KG-*3]=a[j][i];通過(guò)內(nèi)循環(huán)控制變量j從0到N-1的變化,把下標(biāo)為0列上的每一個(gè)元素的值累加,放入cols所指的、下標(biāo)為0的數(shù)組元素中。其他依次類(lèi)推。因?yàn)檫M(jìn)行累加運(yùn)算,注意要給每個(gè)一維數(shù)組置初值0。(5)在diagsum函數(shù)中,通過(guò)一個(gè)for循環(huán)來(lái)求得兩對(duì)角線上元素之和:for(i=0;i<N;i[KG-*3]+[KG-*3]+){dg1+[KG-*3]=a[i][i];dg2+[KG-*3]=a[i][N-i-1];}在主對(duì)角線上的元素行下標(biāo)和列下標(biāo)相同。而在從右到左對(duì)角線上的元素,行下標(biāo)從0變化到N-1;對(duì)于列下標(biāo),當(dāng)行下標(biāo)為0時(shí),列下標(biāo)為N-i-1,當(dāng)行下標(biāo)為1時(shí),列下標(biāo)也可用表達(dá)式N-i-1求得,其他依此類(lèi)推。(6)請(qǐng)參考例9.11的outdata函數(shù)對(duì)二維數(shù)組和有關(guān)數(shù)據(jù)的輸出。(7)總結(jié):對(duì)二維數(shù)組的操作,一般可利用一個(gè)雙重循環(huán)來(lái)進(jìn)行。本題雖然有多個(gè)任務(wù),但可用函數(shù),每個(gè)函數(shù)完成一個(gè)任務(wù),每個(gè)函數(shù)都很簡(jiǎn)單,且都很容易讀懂;一定要避免把所有的任務(wù)混在一起。9.35【分析與解答】(1)要進(jìn)行相加的兩個(gè)矩陣(假定為a和b)的行數(shù)應(yīng)當(dāng)相等,列數(shù)應(yīng)當(dāng)相等。兩個(gè)矩陣相加就是把兩個(gè)矩陣中下標(biāo)相同的兩個(gè)元素相加,相加的和值放在第三個(gè)矩陣(假定為c)、相同下標(biāo)的元素中。即:c[i][j]=a[i][j]+b[i][j]。(2)可以定義一個(gè)函數(shù)getms(參考題9.34),利用rand()函數(shù)給兩個(gè)矩陣賦值。(3)定義addm函數(shù),對(duì)兩個(gè)矩陣相加:voidaddm(int(*a)[M],int(*b)[M],int(*[KG-*3]c)[M])這里a、b、c是行指針,分別指向三個(gè)二維數(shù)組(N行M列),要求這三個(gè)數(shù)組的行和列數(shù)相同。和值放在c所指數(shù)組中。矩陣相加的操作放在一個(gè)雙重循環(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)來(lái)實(shí)現(xiàn)for(i=0;i<N;i[KG-*3]+[KG-*3]+){for(j=0;j<M;j[KG-*3]+[KG-*3]+)printf(″%4d″,a[i][j]);printf(″\[KG-*3]n″);}可調(diào)用三次分別輸出a、b、c三個(gè)矩陣。(5)請(qǐng)?jiān)谥骱瘮?shù)中定義數(shù)組和所需的變量。調(diào)用getms函數(shù)得到原始數(shù)據(jù),調(diào)用addm函數(shù)實(shí)現(xiàn)矩陣相加,調(diào)用輸出函數(shù)輸出三個(gè)矩陣。9.36【分析與解答】(1)為了輸出以上表格,需要定義一個(gè)9×9的二維數(shù)組。在其中存入九九表中的數(shù)據(jù)。(2)定義函數(shù)gettab,在二維數(shù)組中存入九九表中的數(shù)據(jù):voidgettab(inta[][N])形參a是一個(gè)指向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]=(i+1)*(j+1);(4)請(qǐng)讀者參照前面的習(xí)題,設(shè)計(jì)output函數(shù),輸出九九表。表格的第二行:(1)(2)(3)(4)(5)(6)(7)(8)(9)可用以下語(yǔ)句輸出:for(i=1;i<[KG-*3]=9;i[KG-*3]+[KG-*3]+)printf(″(%d)″,i);printf(″\[KG-*3]n″);在二維數(shù)組每一行輸出前(即內(nèi)循環(huán)之前)加語(yǔ)句:printf(″(%d)″,i+1);就可得到每一行最前面的(1)、(2)、…、(9)。(5)輸出的格式不可能在第一次調(diào)試時(shí)就合適,一般需運(yùn)行幾次進(jìn)行調(diào)整。(6)請(qǐng)讀者自己完成主函數(shù),定義所需的數(shù)組和變量,調(diào)用以上的函數(shù)。(7)總結(jié):本題的算法很簡(jiǎn)單,只包含給二維數(shù)組的賦值和表格的輸出,對(duì)于表格的格式,可以通過(guò)對(duì)程序的運(yùn)行,逐步進(jìn)行調(diào)整。9.37【分析與解答】(1)假定程序定義了M行N列的二維數(shù)組??捎胐efine命令行定義N和M來(lái)分別代表兩個(gè)常量(參考2.2.3節(jié))。(2)程序的功能可由幾個(gè)獨(dú)立的函數(shù)來(lái)實(shí)現(xiàn)。①voidgetm(int(*[KG-*3]p)[N])形參p是一個(gè)行指針,指向M×N的數(shù)組首地址。getm函數(shù)的功能是通過(guò)調(diào)用rand函數(shù)給二維數(shù)組賦值。請(qǐng)參考習(xí)題9.34中的同名函數(shù)。②voidsuml(inta[][N],int*rows)形參a是一個(gè)行指針,指向M×N的數(shù)組首地址,指針rows指向一個(gè)一維數(shù)組,在此數(shù)組元素中將存放每行元素之和。suml函數(shù)的功能是求出a所指二維數(shù)組中每一行元素之和并依次放在rows所指數(shù)組中。請(qǐng)參考習(xí)題9.34中的sum函數(shù)。③intgetmax(int*rows)形參指針rows指向存放每行元素之和的一維數(shù)組,在此函數(shù)中將求出最大值所在的下標(biāo)作為函數(shù)值返回。請(qǐng)參考習(xí)題9.25。④voidchange(inta[][N],intk)形參行指針a,指向M×N的數(shù)組首地址,k接受一維數(shù)組中最大值所在的下標(biāo)。此函數(shù)的功能是把二維數(shù)組中下標(biāo)為k的那一行、與下標(biāo)為0的行的所有元素進(jìn)行對(duì)調(diào)。對(duì)調(diào)可用一個(gè)for循環(huán)來(lái)實(shí)現(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ù)組改變前后分別調(diào)用它,以判斷程序的操作是否正確。請(qǐng)參考習(xí)題9.35中的同名函數(shù)。(4)請(qǐng)?jiān)谥骱瘮?shù)中定義所需的數(shù)據(jù)結(jié)構(gòu):如數(shù)組、變量,并調(diào)用各函數(shù)。(5)總結(jié):交換數(shù)據(jù)的算法應(yīng)當(dāng)已很熟悉,本題只是交換兩行中的數(shù)據(jù),這時(shí)被交換的兩個(gè)元素的行下標(biāo)不同,而列下標(biāo)相同。讀者不妨對(duì)兩列中的數(shù)據(jù)進(jìn)行交換。本題中,除對(duì)二維數(shù)組中的兩行進(jìn)行對(duì)調(diào)外,其他的算法在此之前都已介紹過(guò),由此可知,應(yīng)當(dāng)積累一些基本的算法知識(shí),程序的完成都是由一些基本算法來(lái)實(shí)現(xiàn)的。9.38【分析與解答】(1)在定義數(shù)組時(shí)應(yīng)該注意,進(jìn)行逆置操作的矩陣必須是一個(gè)方陣,行、列數(shù)相同。(2)在本題中給二維數(shù)組置數(shù)以及對(duì)二維數(shù)組進(jìn)行輸出,請(qǐng)參考習(xí)題9.37,在此不再重復(fù)。(3)對(duì)矩陣進(jìn)行逆置的操作可由以下函數(shù)完成:voidtranspose(intp[][N])形參p指向一個(gè)二維數(shù)組。逆置的過(guò)程可由雙重循環(huán)來(lái)完成: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;}內(nèi)循環(huán)的控制變量j的變化范圍從0到i,以對(duì)角線為界,把對(duì)稱(chēng)位置上的元素值進(jìn)行對(duì)調(diào)。(4)請(qǐng)編寫(xiě)主函數(shù),定義所需的數(shù)據(jù)結(jié)構(gòu),并調(diào)用函數(shù)來(lái)實(shí)現(xiàn)規(guī)定的操作。(5)總結(jié):本題主要的算法也是交換算法,關(guān)鍵是需要正確確定交換的范圍。第十章字符串習(xí)題分析與解答一、選擇題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書(shū)上(-chp)改為(--chp)10.12【參考答案】XYZA10.13【參考答案】SO10.14【參考答案】1010.15【參考答案】Itis10.16【參考答案】[1]strlen(str)-1;[2]j--(或--j)10.17【參考答案】310.18【參考答案】goodgood!三、編程題10.19【分析與解答】(1)已知gets函數(shù)的調(diào)用形式為:gets(str),str是存放所讀入字符串的起始地址,可以是字符數(shù)組名、已指向一串固定存儲(chǔ)單元的字符指針或數(shù)組元素的地址。gets函數(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年債務(wù)轉(zhuǎn)讓與資產(chǎn)評(píng)估服務(wù)合同3篇
- 采購(gòu)法務(wù)與合同的合同糾紛解決3篇
- 采購(gòu)合同條款的合同解除條款3篇
- 采購(gòu)合同評(píng)審表評(píng)分技巧3篇
- 采購(gòu)戰(zhàn)略合同的物聯(lián)網(wǎng)應(yīng)用3篇
- 采購(gòu)合同風(fēng)險(xiǎn)問(wèn)題探討與啟示3篇
- 采購(gòu)合同范本與詳細(xì)補(bǔ)充協(xié)議3篇
- 采購(gòu)合同模版編制指南3篇
- 采購(gòu)合同樣本的荷蘭語(yǔ)3篇
- 采購(gòu)合同皮草的保養(yǎng)與維護(hù)3篇
- 全國(guó)第三屆職業(yè)技能大賽(數(shù)字孿生應(yīng)用技術(shù))選拔賽理論考試題庫(kù)(含答案)
- 應(yīng)用數(shù)理統(tǒng)計(jì)知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋中國(guó)農(nóng)業(yè)大學(xué)
- 文藝復(fù)興史學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 創(chuàng)新轉(zhuǎn)化管理智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東大學(xué)
- 二級(jí)公立醫(yī)院績(jī)效考核三級(jí)手術(shù)目錄(2020版)
- 6人小品《沒(méi)有學(xué)習(xí)的人不傷心》臺(tái)詞完整版
- [理學(xué)]無(wú)機(jī)及其分析化學(xué) 課后答案
- 氯堿生產(chǎn)企業(yè)安全標(biāo)準(zhǔn)化實(shí)施培訓(xùn)指南
- 活套法蘭計(jì)算表
- 年產(chǎn)十萬(wàn)噸苯乙烯工藝設(shè)計(jì)
- 壓力容器耐壓試驗(yàn)
評(píng)論
0/150
提交評(píng)論