




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Good is good, but better carries it.精益求精,善益求善。全國計(jì)算機(jī)等級(jí)考試二級(jí)教程C語言程序設(shè)計(jì)課后習(xí)題詳細(xì)答案-全國計(jì)算機(jī)等級(jí)考試二級(jí)教程C語言程序設(shè)計(jì)習(xí)題分析與詳細(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【參考答案
2、】C)211【參考答案】B)212【參考答案】B)213【參考答案】A)二、填空題214【參考答案】111212215【參考答案】14.224.2216【參考答案】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【參考答案】1821
3、273011111114-128510000000226【參考答案】1327672-3276831000000000000000227【參考答案】1十2八3十六三、上機(jī)改錯(cuò)題228【分析與解答】第1行的錯(cuò)誤:(1)include是一個(gè)程序行,因此在此行的最后不應(yīng)當(dāng)有分號(hào)(;)。第2行的錯(cuò)誤:(1)main()是主函數(shù)的起始行,不是語句,因此最后不應(yīng)當(dāng)有分號(hào)(;)。(2)在同一行上的/*mainfunction*/顯然是注釋;C語言規(guī)定:注釋由/*開頭,由*/結(jié)束,但在*號(hào)和/之間不得插入任何空格,而在此處“/*”和“*/”之間存在空格,因此,/*mainfunction*/的寫法是錯(cuò)誤的,而應(yīng)
4、寫成:/*mainfunction*/。第3行的錯(cuò)誤:(1)在主函數(shù)的起始行main()的后面是函數(shù)體,函數(shù)體由左花括號(hào)(開始。但在函數(shù)體的第一行:float的前面缺少了左花括號(hào)(。(2)在同一行上的/*/*risradius*/,/*sisareaofcircular*/*/顯然是注釋;C語言規(guī)定:注釋由/*開頭,由*/結(jié)束,并且開頭的/*將去找最近的*/去配對(duì),因此在/*/*risradius*/中,第一個(gè)/*與radius后的那個(gè)*/配上了對(duì),結(jié)果緊跟在后面的那個(gè)逗號(hào)(,)落在了注釋的外面,而構(gòu)成了一個(gè)多余符號(hào),為此,在編譯時(shí)將報(bào)告“語法錯(cuò)”。/*sisareaofcircular*/*
5、/中第一個(gè)*/就結(jié)束了注釋,第一個(gè)*/就成了多余的了。第6行的錯(cuò)誤:(1)printf(%fn,s)應(yīng)當(dāng)是一條輸出語句,但在最后缺少了一個(gè)分號(hào)。(2)printf(%fn,s);是程序的最后一條語句,程序應(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【
6、參考答案】C)3.3【參考答案】D)3.4【參考答案】C)3.5【參考答案】D)3.6【參考答案】B)3.7【參考答案】C)3.8【參考答案】D)3.9【參考答案】A)3.10【參考答案】B)3.11【參考答案】C)3.12【參考答案】D)3.13【參考答案】D)3.14【參考答案】A)3.15【參考答案】C)3.16【參考答案】C)3.17【參考答案】C)3.18【參考答案】D)把D的答案修改為:scanf(“%8f”,&c);3.19【參考答案】C)3.20【參考答案】B)二、填空題3.21【參考答案】(1)-200,2500(2)i=-200,j=2500(3)i=-200j=25003
7、.22【參考答案】11220303.23【參考答案】1一條語句2分號(hào)(或;)3.24【參考答案】分號(hào)(;)3.25【參考答案】1:10025.811.892342:10025.811.892343:10025.811.892343.26【參考答案】x=127,x=127,x=177,x=7f,x=1273.27【參考答案】x=127,x=127,x=127,x=000127,x=%06d3.28【參考答案】a=513.789215,a=513.79,a=513.78921500,a=513.78921500三、編程題和改錯(cuò)題3.29【分析與解答】(1)主函數(shù)名main后應(yīng)有一對(duì)圓括號(hào)。(2)第
8、三行的printf語句用以提示輸入,但是原樣輸出的字符串沒有用雙引號(hào)括起來;另外,從輸入的形式看,輸入的數(shù)據(jù)緊跟在提示之后,因此,printf格式串中最后不應(yīng)該有換行符n。(3)因?yàn)檩斎腠?xiàng)a、b、c從定義和計(jì)算結(jié)果來看都是double類型,因此,第四行scanf語句格式串中的格式說明不應(yīng)當(dāng)用%d而應(yīng)當(dāng)用%lf;且每一個(gè)變量之前應(yīng)該加地址運(yùn)算符&。(4)第七行的printf語句中應(yīng)當(dāng)把%d都改成%lf或%f;按輸出要求在格式串中應(yīng)添加相應(yīng)的原樣輸出的字符;因?yàn)橄乱粋€(gè)printf的輸出從新的一行開始,因此在本輸出語句的格式串的最后應(yīng)當(dāng)加換行符n。(5)第八行的printf語句中應(yīng)當(dāng)把格式串整理合并
9、放在輸出項(xiàng)的前面,輸出項(xiàng)放在后面,%d都改成%lf或%f;中間的n刪去。(6)請(qǐng)同學(xué)們自己寫出修改后的程序,并上機(jī)調(diào)試。3.30【分析與解答】(1)分析:可用算術(shù)式56060把分鐘換算成小時(shí)和分鐘,商數(shù)就是小時(shí)數(shù),余數(shù)就是分鐘數(shù)。(2)確定變量的名字和定義變量的類型:在程序中把小時(shí)數(shù)放在變量h中,把分鐘數(shù)放在變量m中。這兩個(gè)變量的類型可以是整型(本題中采用整型),也可以是實(shí)型。(3)確定所用算法:求56060的商數(shù),在C語言中可以用整除的算法,語句是h=560/60;。求余數(shù)可用求余運(yùn)算符%:560%60,其值放入變量m中的語句是:m=560%60;。(4)設(shè)計(jì)輸出格式。若輸出的形式定為:小時(shí)
10、:分鐘,則按此形式設(shè)計(jì)輸出語句。(5)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。(6)編寫程序如下:main()inth,m;h=560/60;m=560%60;printf(Theresult:%3d:%3dn,h,m);運(yùn)行結(jié)果是:Theresult:9:203.31【分析與解答】(1)確定變量的名字和定義變量的類型。若用a存放1500,用b存放350;用q存放商數(shù),用r存放余數(shù),所有變量應(yīng)定義成int類型。(2)設(shè)計(jì)輸入語句從終端輸入1500和350;在輸入語句之前,應(yīng)當(dāng)設(shè)計(jì)一個(gè)輸出語句,用以提示輸入。(3)可用整除求商數(shù),結(jié)果放在變量q中??捎们笥噙\(yùn)算符%求兩數(shù)之余數(shù),結(jié)果放在變量r中。(4
11、)設(shè)計(jì)輸出語句。輸出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ì)輸入語句,以及在此之前用于提示輸入的(printf)語句。(3)設(shè)計(jì)求平均值的算法,把所求得的平均值放入變量ave中。(4)設(shè)計(jì)把變量ave中的數(shù),從小數(shù)點(diǎn)后第二位數(shù)進(jìn)行四舍五入的算法?,F(xiàn)舉例說明:若ave中的數(shù)為123.4644,為了保留此值小數(shù)點(diǎn)后一位,可用表達(dá)式:(int)(123.4644*1
12、0)/10.0;依次推算,為了保留此值小數(shù)點(diǎn)后二位,可用表達(dá)式:(int)(123.4644*100)/100.0;其他依此類推。(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;其他依此類推。(6)設(shè)計(jì)輸出語句。輸出a、b、c
13、和ave。(7)把以上內(nèi)容放在主函數(shù)的一對(duì)花括號(hào)中。(8)編寫程序如下:main()doublea,b,c,ave;printf(Entera,b,c:);scanf(%lf%lf%lf,&a,&b,&c);ave=(a+b+c)/3;printf(ave=%fn,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=%fn,a,b,c,ave);3.33【分析與解答】(1)關(guān)于對(duì)變量中的數(shù)進(jìn)行交換的算法請(qǐng)參考3.7題中的
14、解釋和教程中有關(guān)的例題。(2)定義4個(gè)整型變量a、b、c和t,變量a、b、c分別存放讀入的3個(gè)整數(shù),t用作臨時(shí)存儲(chǔ)單元。(3)設(shè)計(jì)輸入語句,以及在此之前用于提示輸入的(printf)語句。(4)輸出a、b、c中的值,以便于比較。(5)交換的步驟如下:把c中的值賦給t。把b中的值賦給c。把a(bǔ)中的值賦給b。把t中的值賦給a。經(jīng)過以上步驟,已按要求進(jìn)行了交換。(6)輸出a、b、c中的值。(7)編寫程序如下: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
15、=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【參考答案】、=、=、!KG-*2=4.13【參考答案】1!2&3JB1|JB1|4.14【參考答案】1:!KG-*2(邏輯非)2:、=(小于、大于、小于等于、大于等于)3:=、!KG-*2=(等于、不等)
16、4:&(邏輯與)5:JB1|JB1|(邏輯或)。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;讀者可以參考以上語句寫出程序,也可以根據(jù)分析寫出與此形式不同的語句和程序。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,輸出oddnumbe
17、r。讀者可以參考以上給出的算法,寫出相應(yīng)的C語句,并編寫出完整的程序。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)過以上操作,max中已放入了a、b、c三個(gè)數(shù)中的最大數(shù),輸出max即可。讀者可以參考以上給出的算法,寫出相應(yīng)的C語句,并編寫出完整的程序。4.25【分析與解答】(1)本題已給出了非常明確的條件,只要寫
18、出正確的條件判斷語句就可基本完成程序的編寫。(2)由給出的函數(shù)可知,只有x的值在規(guī)定的范圍內(nèi)時(shí),才求出y的值,因此程序應(yīng)當(dāng)對(duì)輸入的x進(jìn)行判斷,若超過范圍就不求y的值。(3)現(xiàn)以使用ifCD#*2else語句為例寫出程序供參考。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,x,y);printf(*END*nn);第五章循環(huán)結(jié)構(gòu)習(xí)題分析與解答一、選擇題(單選題)5.1【參考答案】D)5.2【參考答案】C)5.3【參考
19、答案】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【參考答案】程序段無限循環(huán),沒有輸出結(jié)果5.13【參考答案】-15.14【參考答案】115.15【參考答案】1d=1.02k+3k=02xamin三、編程題5.17【分析與解答】(1)本題的基本算法是求累加值。累加項(xiàng)的值有規(guī)律的遞增,每一項(xiàng)的絕對(duì)值比前一項(xiàng)增2,因此可以利用循環(huán)的控制變量的遞增來得到累加項(xiàng)的絕對(duì)值。例如:for(i=1;i=1e-4)t=t/i;e+=t;i+;(6
20、)請(qǐng)讀者自己對(duì)變量做出正確的定義,設(shè)計(jì)輸出語句,完善程序;也可以參考此程序段,按照自己的思路獨(dú)立地完成程序。(7)e的值應(yīng)當(dāng)是:2.71828。(8)根據(jù)以上分析,讀者已不難用for循環(huán)來實(shí)現(xiàn)求e值的計(jì)算。(9)注意:在完成此程序時(shí),不要對(duì)分母中的階乘值進(jìn)行單獨(dú)計(jì)算,因?yàn)?7!的值已超過long類型的最大值,更無法求到50!。5.19【分析與解答】(1)從1880年至2000年的年數(shù)可用一個(gè)for循環(huán)來取得。(2)對(duì)每一年,用以上指定的條件來進(jìn)行判斷,若滿足條件即為閏年,進(jìn)行輸出。(3)按輸出的要求,需要設(shè)一個(gè)變量用于統(tǒng)計(jì)一行中輸出的個(gè)數(shù),若在一行上已連續(xù)輸出了5個(gè)年數(shù),就需輸出一個(gè)換行符,使
21、下一個(gè)輸出項(xiàng)在新的一行上開始;若用變量n來做此統(tǒng)計(jì),則當(dāng)表達(dá)式n%5=0時(shí)就應(yīng)輸出一個(gè)換行符,同時(shí)使n重新置0值。(4)若變量y代表年數(shù),if語句的邏輯表達(dá)式可以寫成如下:(y%4=0&y%100!=0JB1|JB1|y%400=0)(5)以下程序段供參考:for(y=1880;y1|JB1|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)可以在一行上
22、連續(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è),因此可以用以下的程序段來實(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é)果如下:*現(xiàn)在我們已完成了在每行輸出指定數(shù)目的*號(hào)。(3)輸出結(jié)果與題目要求不同,它們的區(qū)別是:按題目每一行之前有不同的空格,而這里則是所有的行都在第一列
23、上開始輸出*號(hào);所以接著就應(yīng)當(dāng)解決這一問題。(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)來實(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
24、【參考答案】D)6.3【參考答案】A)6.4【參考答案】A)6.5【參考答案】B)6.6【參考答案】D)6.7【參考答案】D)6.8【參考答案】B)6.9【參考答案】A)6.10【參考答案】A)6.11【參考答案】C)二、填空題6.12【參考答案】-16.13【參考答案】16.14【參考答案】ctype.h6.15【參考答案】06.16【參考答案】10A20B30C40D或:10A20B30C40D6.17【參考答案】7.29101.298AB或:7.29101.29AB6.18【參考答案】A7.29B101.2986.19【參考答案】ABC三、編程題6.20【分析與解答】(1)在進(jìn)行字符輸入
25、時(shí),即使一次輸入了一行字符(最后用回車結(jié)束輸入),字符也只能一個(gè)一個(gè)地讀入。若ch已定義為char型變量,可以用以下的程序段來完成操作:ch=getchar();while(ch!KG-*2=n)ch=getchar();當(dāng)讀入的是一個(gè)回車符時(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代碼值。因此可用以下語句來實(shí)現(xiàn)。printf(%c:%d,ch,ch);(3)在循環(huán)內(nèi)要求進(jìn)行的另一個(gè)操作是:每行只能輸出3對(duì)字符和與之對(duì)應(yīng)的ASCII代碼值。若n已定義為int型變量,則可用來作計(jì)數(shù)器;使n的初值為0
26、,每輸出一次,n的值增1,當(dāng)n的值為3的整數(shù)倍時(shí),額外輸出一個(gè)換行符。例如:n+;if(n%3=0)putchar(n);(4)把(2)和(3)中給出的語句放在循環(huán)體內(nèi),并按要求給出正確的定義和初值,就可完成題目所要求的操作。(5)也可以在while后的一對(duì)括號(hào)中來完成字符的讀入,如while(ch=getchar()!KG-*2=n)。這時(shí),循環(huán)內(nèi)、外的“ch=getchar();”語句應(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)c
27、h=getchar();(2)在本題中循環(huán)體內(nèi)需要把讀入的所有數(shù)字字符轉(zhuǎn)換成一個(gè)整數(shù)。若用變量n來存放這個(gè)整數(shù),為了保證有效的存放,應(yīng)當(dāng)把它定義成long類型。(3)要把輸入的一串?dāng)?shù)字字符轉(zhuǎn)換成一個(gè)整數(shù),首先需要判斷當(dāng)前讀入的字符是否是數(shù)字字符,若不是則什么也不做;若是,則進(jìn)行以下操作:把當(dāng)前讀入的一個(gè)字符轉(zhuǎn)換成一個(gè)一位整數(shù),這可由語句“d=ch-0;”來實(shí)現(xiàn),在這里d是一個(gè)整型變量;把d中的一位數(shù)歸并到n的低位中,這可用語句“n=n*10+d;”來實(shí)現(xiàn)。這里所述的操作可由以下語句來完成:if(ch=0&ch=0&ch=a&ch=z)n+;(3)在退出循環(huán)后,輸出n的值。(4)請(qǐng)自己完善程序。
28、6.24【分析與解答】(1)若圖案的行數(shù)輸入到變量L中。(2)按要求L決定了圖形的行數(shù),因此可通過循環(huán)來實(shí)現(xiàn)L行的輸出:for(i=1;i=L;i+)循環(huán)體中的“”號(hào),代表輸出L行的操作。(3)假定ch中存放了一個(gè)字符,我們知道,通過以下循環(huán)可以在一行上輸出n個(gè)字符:for(j=1;j=n;j+)putchar(ch);putchar(n);注意,在循環(huán)后putchar(n);語句不可少,它用以換行。(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)系可用
29、表達(dá)式:ch=A+i-1來表示。當(dāng)i為1時(shí)ch中被賦予字母A,當(dāng)i為2時(shí)ch中被賦予了字母B,其他依此類推。因此,在此表達(dá)式后,利用(3)中的循環(huán)就解決了各行上輸出的字母。(5)按要求每行輸出的字母的個(gè)數(shù)不同,第二行輸出3個(gè)字母,第三行輸出5個(gè)字母,第四行輸出7個(gè)字母(3)中for循環(huán)體的執(zhí)行次數(shù)取決于n的值,也就是說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
30、;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)之前即可。(8)請(qǐng)讀者自己補(bǔ)充有關(guān)的include行、語句和變量的定義,以完成整個(gè)程序。注意,如果有能力可在某些地方作些簡(jiǎn)化。第七章函數(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【參考答案】127.9【參考答案】9.0(或9.000000)7.10【參考答案】47.11【參考答案】1n=12s7.1
31、2【參考答案】1=y2z*x7.13【參考答案】112s*i304f(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)并沒有終止,接著k為4時(shí)就會(huì)執(zhí)行else子句,又使yes得1,由此可見此程序段并不能準(zhǔn)確地判斷一個(gè)數(shù)是否為素?cái)?shù);最后確定yes為何值的是for循環(huán)的終止值n/2,當(dāng)n為1
32、5時(shí),k的值為n/2等于7,在循環(huán)體內(nèi)將又一次執(zhí)行else子句,使yes得1,這時(shí)循環(huán)結(jié)束,函數(shù)返回1。由此可見所給fun函數(shù)不能起到預(yù)想的作用。(3)由上分析可知,對(duì)于n的值為15時(shí)而言,問題是在一旦yes的值為0,已判斷n中的值不是素?cái)?shù)時(shí),沒有及時(shí)退出循環(huán),返回0;因此,若在if子句中添加一條語句:break;就能解決這一問題,把if語句改寫如下: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語句,細(xì)心的讀者應(yīng)該可以發(fā)現(xiàn),這時(shí)yes沒有
33、賦過值,也就是說,返回的是一個(gè)不確定的值,這將會(huì)導(dǎo)致錯(cuò)誤;因此,應(yīng)當(dāng)在定義語句中給yes賦初值1:intk,yes=1;至此fun函數(shù)能正確運(yùn)行。(5)總結(jié):因?yàn)橐坏﹊f語句中的表達(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【分
34、析與解答】(1)若用整型變量c存放余數(shù),則求a被b除后的余數(shù)可用表達(dá)式:c=a%b。(2)本題要求編寫函數(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)單,只是要求讀者能夠掌握編寫函數(shù)的基本知識(shí)。7.16【分析與解答】(1)本題所要采用的算法是累加。分析可見,所有累加項(xiàng)的分子都是1,而分母部分逐項(xiàng)增1;只是累加項(xiàng)的符號(hào)交叉變化。因此處理好符號(hào)的變化是完成操作的關(guān)鍵之一。(2)若函數(shù)名為funa,傳送到函數(shù)的參數(shù)是整型值,假定形參
35、命名為n;函數(shù)的返回值應(yīng)當(dāng)是浮點(diǎn)型,為此函數(shù)的首部可以是:doublefuna(intn)(3)接著寫函數(shù)體。累加放在一個(gè)for循環(huán)中來完成,若循環(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不可以寫成1/k,因?yàn)槊恳豁?xiàng)的絕對(duì)值必定是小于1的小數(shù)。(4)現(xiàn)在需要確定s的值。最簡(jiǎn)單的可用表達(dá)式:s=-s來實(shí)現(xiàn)(請(qǐng)參考例5.2),若賦值號(hào)右邊s中的值為-1,則賦值號(hào)左邊s中的值就得1;若賦值
36、號(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)編寫主函數(shù)。當(dāng)傳給形參的值為10時(shí),函數(shù)的返回值應(yīng)當(dāng)是:0.645635。(7)總結(jié):本題的算法并不復(fù)雜,但是需要讀者掌握編寫函數(shù)的基本知識(shí)。掌握需要傳入函。數(shù)的參數(shù)及其類型,掌握需要返回的值及其類型。在此基礎(chǔ)上,其他方面與先前在主函數(shù)中編寫的程序沒有什么區(qū)別。7.17【分析與解答】(1)此題與7.18相似。函數(shù)的返回值
37、為浮點(diǎn)型,函數(shù)只有一個(gè)形參,為整型。(2)函數(shù)的基本算法是累加,只是除第一項(xiàng)外其余各項(xiàng)都用減法;每一項(xiàng)的分子都是1,分母部分為k2,k的值逐項(xiàng)增1,由2變化到m。因此,算法可以用一個(gè)循環(huán)來實(shí)現(xiàn)。(3)當(dāng)m的值為12時(shí),函數(shù)值應(yīng)是:0.435023。7.18【分析與解答】(1)若函數(shù)取名為fun,按題意,x作為形參,由調(diào)用函數(shù)傳入,其類型不應(yīng)當(dāng)用整型;表達(dá)式x2-5x+4的值作為函數(shù)值返回,函數(shù)值的類型應(yīng)為浮點(diǎn)型。因此,很容易寫出函數(shù):doublefun(doublex)returnx*x-5*x+4;(2)若在調(diào)用函數(shù)時(shí),x和y2已正確定義,且x已有確定的值,則可用以下函數(shù)調(diào)用語句得到y(tǒng)2的值
38、:y2=fun(x+15);(3)同樣,若在調(diào)用函數(shù)時(shí),x和y3已正確定義,且x已有確定的值,則可用以下函數(shù)調(diào)用語句得到y(tǒng)3的值:y3=fun(sin(x);注意,因?yàn)樵诔绦蛑姓{(diào)用了C語言提供的庫函數(shù)sin,因此應(yīng)當(dāng)在程序的最前面包含以下命令行:#includemath.h(4)參考(2)和(3)應(yīng)不難寫出求y1的語句,請(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ù)的類型和形參的類型,就可以寫出函數(shù),就像例7.1中求兩數(shù)之和的函數(shù)一樣簡(jiǎn)單。
39、在給定了函數(shù)之后,調(diào)用函數(shù)時(shí),函數(shù)的實(shí)參應(yīng)當(dāng)是一個(gè)與形參類型一致的任意合法的表達(dá)式。例如,可以是常量、算術(shù)表達(dá)式,也可以是函數(shù)等。就像例7.1中求兩數(shù)之和的add函數(shù)一樣,可以用add(3,4);來求3+4;當(dāng)x、y有確定值時(shí),可以用add(x*x,y*y);來求x2+y2;當(dāng)x、y有確定值時(shí),可以用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【參
40、考答案】B)8.6【參考答案】B)8.7【參考答案】C)8.8【參考答案】D)8.9【參考答案】B)8.10【參考答案】C)8.11【參考答案】C)8.12【參考答案】C)二、填空題8.13【參考答案】1108.14【參考答案】718.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ù)的形參需要接受傳送過來的兩
41、個(gè)浮點(diǎn)數(shù),因此需要有兩個(gè)double類型的形參;另外要把它們的和值與差值,通過形參傳送回去,這就要求有兩個(gè)double類型的形參指針,接受傳送過來的地址,以便通過指針把和值與差值傳送給所指的主函數(shù)中的變量。因此函數(shù)的首部應(yīng)當(dāng)是:voidfun(doublea,doubleb,double*p1,double*p2)這里,a、b、p1、p2是自己取的名。(2)假設(shè)把a(bǔ)、b的和值傳送給p1所指的存儲(chǔ)單元,可用語句:*p1=a+b;把a(bǔ)、b的差值傳送給p2所指的存儲(chǔ)單元,可用語句:*p2=a-b;。(3)因此函數(shù)可寫成:voidfun(doublea,doubleb,double*p1,double
42、*p2)*p1=a+b;*p2=a-b;(4)在主函數(shù)中,若有定義語句:doublex,y,z1,z2;,且x、y已賦值,則調(diào)用fun函數(shù)的語句可以是:fun(x,y,&z1,&z2);。(5)總結(jié):本題所要求的算法極簡(jiǎn)單,但它要求有兩個(gè)值返回,用return語句就不可能返回兩個(gè)函數(shù)值。要求讀者能利用形參指針把要求的值間接地傳回調(diào)用函數(shù)。8.18【參考答案】(1)若函數(shù)名為maxandmin,按題意,函數(shù)不返回函數(shù)值;函數(shù)將接受3個(gè)數(shù)(假定為int類型),并需要通過指針指向主函數(shù)中的兩個(gè)int型變量,以便把最大值和最小值放入指針?biāo)傅拇鎯?chǔ)單元中。因此函數(shù)的首部應(yīng)當(dāng)是:voidmaxandmin
43、(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)過以上操作,max中已放入了a、b、c三個(gè)數(shù)中的最大數(shù)??赡7乱陨纤惴ㄕ业阶钚≈担簃in=a;if(bmin)min=
44、b;if(cmin)min=c;(3)若最大值已放入max中,最小值已放入min中,則可用以下語句把最大和最小值放入指針pmax和pmin所指的存儲(chǔ)單元中:*pmax=max;*pmin=min;(4)若主函數(shù)中已把3個(gè)數(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ù)中的多個(gè)結(jié)果傳回主函數(shù)。第九章數(shù)組習(xí)題分析與解答一、選擇題9.1【參考答案】D)9.2【參考答案】A)9.3【參考答案】A)9.4【參考答案】A)9.5【參考答案】
45、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【參考答案】909.20【參考答案】69.21【參考答案】129.22【參考答案】39.23【參考答案】27219.24【參考答案】-850,2,09.25【參考答案】1k=p2k9.26【參考答案】1(c=getchar()2c-A三、上機(jī)題9.27【分析與解答】(1)對(duì)
46、于字符的輸入可參考教材例6.3和習(xí)題9.26中的while循環(huán),只是要注意,循環(huán)的終止條件是:等于KG-*3n。(2)在while循環(huán)體中,用if條件來判斷是否為數(shù)字字符,若是,就使對(duì)應(yīng)的元素增1;if中的條件表達(dá)式可用C的庫函數(shù):isdigit(ch),這時(shí)要在程序前加:#include行;也可用:chKG-*3=0&chKG-*3=9。(3)若用num數(shù)組元素來進(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。(4)注意,在定義數(shù)組時(shí),數(shù)組的大小應(yīng)符合使用的要求。在利用數(shù)組元素作為計(jì)數(shù)器時(shí),不要忘記首先應(yīng)該給數(shù)組元素賦
47、0值。(5)總結(jié):通過本題的編程,要求掌握利用數(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接受開始移動(dòng)的元素的位置,m指向主函數(shù)中存放元素個(gè)數(shù)的變量,因?yàn)闆]有函數(shù)值返回,因此函數(shù)
48、的類型定義為void。(4)可用以下for循環(huán)完成指定的移動(dòng):for(i=n-1;i*m;iKG-*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)。(5)完成移動(dòng)之后,應(yīng)使m所指變量中的值減1,表示數(shù)列中的數(shù)據(jù)少了一個(gè);這可由于句:*m=*m-1;來完成。(6)可設(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è)f
49、or循環(huán)來完成:for(i=0;inum;iKG-*3+KG-*3+)printf(%d,ai);printf(KG-*3nKG-*3n);退出循環(huán)后的printf語句使上面的輸出行結(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)編寫一個(gè)獨(dú)立的函數(shù)多次調(diào)用,而不應(yīng)重復(fù)地編寫代碼。雖然該函數(shù)中只
50、是一個(gè)for循環(huán),似乎在主函數(shù)中書寫兩次也不麻煩,但養(yǎng)成良好的模塊化程序設(shè)計(jì)的風(fēng)格卻是十分重要的。分析以上例子可見,所規(guī)定的操作,實(shí)際上刪除了數(shù)列中的第n-1個(gè)元素,因此可見刪除操作是由移動(dòng)操作來完成的。9.29【分析與解答】(1)程序要求定義兩個(gè)數(shù)組以便存放原始數(shù)據(jù)和從中選出的所有奇數(shù)。(2)若把函數(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)閷⑼ㄟ^此指針,把奇數(shù)的個(gè)數(shù)傳回主函數(shù)。(3)在
51、odds函數(shù)中,可通過一個(gè)for循環(huán)選出所有的奇數(shù):for(i=0;ian;iKG-*3+KG-*3+)if(ai%2)bj=ai;jKG-*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)行了一次jKG-*3+KG-*3+的操作,所以j的值就是奇數(shù)的個(gè)數(shù),最后應(yīng)當(dāng)把它賦給*bn,以便通過指針bn把奇數(shù)的個(gè)數(shù)傳回主函數(shù)。(5)程序需要兩次輸出數(shù)組中元素的值,一次是輸出原始數(shù)組中的值,一次是輸出奇數(shù)數(shù)組中的值
52、。因此可以使用題9.28中的outarr函數(shù),進(jìn)行兩次調(diào)用。(6)在主函數(shù)中應(yīng)當(dāng)定義所需的數(shù)組和變量,可以在主函數(shù)中給數(shù)組元素輸入數(shù)據(jù)。(7)總結(jié):本題的算法很簡(jiǎn)單,要求讀者能夠編寫?yīng)毩⒌哪K,并在函數(shù)之間熟練地傳送數(shù)據(jù)。9.30【分析與解答】(1)例9.9完成了對(duì)整數(shù)由小到大的排序,而本題是對(duì)字符數(shù)組中的元素進(jìn)行由大到小的排序;兩者之間并無大的區(qū)別,只是數(shù)組的類型不同,字符數(shù)組中每個(gè)元素存放一個(gè)字符,字符的大小依據(jù)每個(gè)字符的ASCII碼值的大小。(2)若函數(shù)形參a指向主函數(shù)中待排序的數(shù)組,由大到小的排序只需改變內(nèi)循環(huán)中if語句的條件表達(dá)式即可:if(apai)p=i;此處i是內(nèi)循環(huán)的控制變量
53、。(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ù):1114171819202224262
54、93033若x中的數(shù)為21,我們立刻知道應(yīng)插在何處,插入后數(shù)列如下,則插入后變成有13個(gè)數(shù):11141718192021222426293033因此,對(duì)于程序來說應(yīng)當(dāng)做以下4件事:能根據(jù)待插的數(shù)據(jù),按“仍然有序的要求”判斷出插入的位置。把位置騰出來,以便放入插入的數(shù)據(jù),但原有的數(shù)據(jù)不能缺少。把x中的數(shù)放入騰出來的位置中。使原有數(shù)組中的數(shù)據(jù)個(gè)數(shù)增1。(3)現(xiàn)在來做第一個(gè)步驟:確定插入的位置。用變量j來放置該位置在數(shù)組中的下標(biāo),以下while循環(huán)將完成此任務(wù):j=0;while(j*n&ajx)jKG-*3+KG-*3+;因?yàn)橐呀?jīng)假定數(shù)列按由小到大排列,當(dāng)x的值大于當(dāng)前的元素aj時(shí),應(yīng)當(dāng)接著與下一
55、個(gè)元素比較(執(zhí)行jKG-*3+KG-*3+),直到x的值小于或等于當(dāng)前的元素aj時(shí),x就應(yīng)當(dāng)插入到下標(biāo)為j的元素中,在此之前的所有值都比x小。當(dāng)x的值小于a0時(shí),不進(jìn)入while循環(huán),j的值為0。x就應(yīng)當(dāng)插入到下標(biāo)為0的元素中。當(dāng)x的值大于數(shù)組中所有的元素時(shí),由條件:jKG-*3=j;i-)ai+1=ai;(5)第三個(gè)步驟是把x放入aj中:aj=x;(6)第四步是使存放數(shù)據(jù)個(gè)數(shù)的變量中的數(shù)增1:*n=*n+1;插入過程到此結(jié)束。(7)可利用習(xí)題9.28中的outarr函數(shù),在插入前和插入后兩次輸出數(shù)組元素,以判斷操作是否正確。(8)請(qǐng)編寫主函數(shù),定義所需的數(shù)組和變量,給數(shù)組輸入一組有序數(shù),正確
56、調(diào)用函數(shù)。(9)請(qǐng)按題目要求至少對(duì)程序運(yùn)行3次,判斷程序是否在各種情況下都能得到正確的結(jié)果。(10)總結(jié):插入算法是程序設(shè)計(jì)中的一種最基本的算法,希望讀者在理解的基礎(chǔ)上編寫程序。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ù)組元素中,然后移
57、動(dòng)指針a指向下一個(gè)元素,并使x的值除2;重復(fù)此過程,直到x的值為0??捎靡韵碌膚hile循環(huán)來進(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)注意,在a0中放的是二進(jìn)制數(shù)的最低位,最后放入的是最高位。例如,整數(shù)8轉(zhuǎn)換成的二進(jìn)制數(shù)為100,則在a0、a1中存放的是0,而a2中存放的是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
58、的值就是已存入數(shù)據(jù)的元素的個(gè)數(shù)。(4)在主函數(shù)中輸入待轉(zhuǎn)換的十進(jìn)制數(shù),調(diào)用change函數(shù)后輸出數(shù)組元素中的值,注意,因?yàn)樵赼0中放的是二進(jìn)制數(shù)的最低位,因此輸出的順序應(yīng)該從an到a0。9.33【分析與解答】(1)若函數(shù)名為getone,形參指針a指向主函數(shù)中存放指定數(shù)據(jù)的數(shù)組。函數(shù)的首部如下:voidgetone(inta)(2)函數(shù)中變量x用來存放得到的一個(gè)隨機(jī)數(shù),變量n用來存放數(shù)組中已放入的不同的隨機(jī)數(shù)的個(gè)數(shù),變量i用作下標(biāo)變量。(3)所有的工作在一個(gè)while循環(huán)中完成:while(n15)當(dāng)不同的隨機(jī)數(shù)的個(gè)數(shù)n的值等于15時(shí)退出循環(huán)。(4)在以上while循環(huán)中需要進(jìn)行以下4項(xiàng)步驟:
59、x=rand()%20;得到一個(gè)小于20的隨機(jī)整數(shù)。i=0;準(zhǔn)備從下標(biāo)為0的元素開始去查找數(shù)組中是否有與x相同的數(shù),若沒有,就把x中的數(shù)加入到數(shù)組中(放在最后),若有,就什么也不做。用以下while循環(huán)從頭到尾去檢查數(shù)組中是否有與x值相同的元素:while(in&x!=ai)iKG-*3+KG-*3+;在兩種情況下,退出循環(huán):a.當(dāng)x不等于ai時(shí),iKG-*3+KG-*3+,x再去與下一個(gè)元素進(jìn)行比較,當(dāng)遇到x等于ai時(shí),說明在數(shù)組中已經(jīng)有此數(shù),因此不必再去比較,應(yīng)當(dāng)退出循環(huán)。b.當(dāng)x不等于ai時(shí),i的值不斷增1;當(dāng)i的值等于n時(shí),說明x已與數(shù)組中所有元素都比較過且都不相同,這時(shí)也應(yīng)退出循環(huán)。
60、如果i的值等于n時(shí),數(shù)組中沒有與x相同的元素,因此需要把新的值放入數(shù)組中,可用以下語句來實(shí)現(xiàn):if(i=n)an=x;nKG-*3+KG-*3+;因?yàn)橐延械臄?shù)據(jù)放在下標(biāo)為0到n-1的元素中,因此新的數(shù)放在an中,然后nKG-*3+KG-*3+;即數(shù)組中不同數(shù)據(jù)的個(gè)數(shù)增1。(5)接著重新循環(huán),再去產(chǎn)生一個(gè)新的隨機(jī)數(shù),重復(fù)以上過程,直到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ù)的主要部分是查找,沒有找到才進(jìn)行下一步操作。C語言提供的庫函數(shù)rand()每
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 美麗鄉(xiāng)村項(xiàng)目可行性研究報(bào)告
- 家居智能語音
- 農(nóng)業(yè)產(chǎn)業(yè)鏈管理手冊(cè)
- 市場(chǎng)調(diào)研報(bào)告細(xì)分行業(yè)統(tǒng)計(jì)表
- 能源產(chǎn)業(yè)項(xiàng)目進(jìn)度跟蹤表
- 腫瘤內(nèi)科胃癌練習(xí)試題及答案
- 智能安防設(shè)備技術(shù)及應(yīng)用場(chǎng)景探索
- 會(huì)展業(yè)活動(dòng)策劃與執(zhí)行指南
- 主管護(hù)師內(nèi)科護(hù)理復(fù)習(xí)測(cè)試附答案
- 財(cái)務(wù)會(huì)計(jì)實(shí)操指南
- 《流程基本知識(shí)》考核試題(答案)
- 【知識(shí)解析】南昌起義主題圖集
- 中班安全活動(dòng) 保護(hù)鼻子
- 板卡錯(cuò)誤代碼對(duì)應(yīng)的錯(cuò)誤信息及解決方案
- 重大事故后果分析
- 武漢理工大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)試題及答案
- 先學(xué)后教當(dāng)堂訓(xùn)練簡(jiǎn)介
- “順豐杯”第三屆全國大學(xué)生物流設(shè)計(jì)大賽案例
- 灌區(qū)工程施工方案與技術(shù)措施
- 幼兒園繪本:《小蛇散步》 課件
- 華中師大版七年級(jí)心理 2走近老師 課件(共15張PPT)
評(píng)論
0/150
提交評(píng)論