久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

《全國計算機等級考試二級教程——C語言程序設計》課后習題詳細答案

時間:2019-05-12 17:53:14下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《《全國計算機等級考試二級教程——C語言程序設計》課后習題詳細答案》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《《全國計算機等級考試二級教程——C語言程序設計》課后習題詳細答案》。

第一篇:《全國計算機等級考試二級教程——C語言程序設計》課后習題詳細答案

《全國計算機等級考試二級教程——C語言程序設計》

習題分析與詳細解答

第一章

程序設計基本概念習題分析與解答

1.1

【參考答案】

EXE 1.2

【參考答案】

[1].C [2].OBJ [3].EXE 1.3

【參考答案】

[1] 順序結構

[2] 選擇結構

[3] 循環結構

第二章

C程序設計的初步知識習題分析與解答

一、選擇題

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] 11

[2] 12 2.15

【參考答案】

[1] 4.2

[2] 4.2 2.16

【參考答案】

[1] {

[2] }

[3] 定義

[4] 執行 2.17

【參考答案】

[1] 關鍵字

[2] 用戶標識符

2.18

【參考答案】

[1] int

[2] float

[3] double 2.19

【參考答案】

float a1=1.0, a2=1.0; 或float a1=1, a2=1;(系統將自動把1轉換為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

【參考答案】

[1] 位

[2] 1位二進制數據(0或1)2.25 【參考答案】 [1] 8 [2]127 [3]01111111 [4]-128 [ 5 ] 10000000 2.26 【參考答案】 [1] 32767 [2]-32768 [3] ***0 2.27

【參考答案】

[1] 十

[2] 八

[3] 十六

三、上機改錯題

2.28 【分析與解答】 第1行的錯誤:

(1)include是一個程序行,因此在此行的最后不應當有分號(;)。第2行的錯誤:

(1)main()是主函數的起始行,不是語句,因此最后不應當有分號(;)。

(2)在同一行上的/ * main function * / 顯然是注釋;C語言規定:注釋由/*開頭,由*/結束,但在*號和/之間不得插入任何空格,而在此處“/ *”和“* /”之間存在空格,因此,/ * main function * /的寫法是錯誤的,而應寫成:/* main function */。第3行的錯誤:

(1)在主函數的起始行main()的后面是函數體,函數體由左花括號({}開始。但在函數體的第一行:float的前面缺少了左花括號({}。

(2)在同一行上的/* /*r is radius*/, /* s is area of circular*/ */ 顯然是注釋;C語言規定:注釋由/*開頭,由*/結束,并且開頭的/*將去找最近的*/去配對,因此在/* /*r is radius*/中,第一個/*與radius后的那個*/配上了對,結果緊跟在后面的那個逗號(,)落在了注釋的外面,而構成了一個多余符號,為此,在編譯時將報告“語法錯”。/* s is area of circular*/ */中第一個*/就結束了注釋,第一個*/就成了多余的了。第6行的錯誤:

(1)printf(″%f \n″,s)應當是一條輸出語句,但在最后缺少了一個分號。

(2)printf(″%f \n″,s);是程序的最后一條語句,程序應當結束;但缺少了程序體結束所需的右花括號());此右花括號可以放在printf(″%f \n″,s);的后面,也可以放在printf(″%f \n″,s);的下一行上。2.27 【分析與解答】

第2行的錯誤:在main的后面缺少一對圓括號。第4行的錯誤:在c=4.0的后面缺少分號。

第6行的錯誤:在printf(″%f \n″,v)的后面缺少分號。

第三章

順序結構習題分析與解答

一、選擇題

(單選題)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 【參考答案】

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=-200 j=2500 3.22 【參考答案】

[1] 12 [2] 0 [3] 0 3.23 【參考答案】

[1] 一條語句

[2] 分號(或;)3.24 【參考答案】

分號(;)3.25 【參考答案】 [1]:100

25.81

1.89234 [2]: 100 25.81 1.89234 [3]:100 25.81 1.89234 3.26 【參考答案】

x=127, x=

127, x=

177,x=

7f, x=

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)主函數名main后應有一對圓括號。

(2)第三行的printf語句用以提示輸入,但是原樣輸出的字符串沒有用雙引號括起來;另外,從輸入的形式看,輸入的數據緊跟在提示之后,因此,printf格式串中最后不應該有換行符——\n。

(3)因為輸入項a、b、c從定義和計算結果來看都是double類型,因此,第四行scanf語句格式串中的格式說明不應當用%d而應當用%lf;且每一個變量之前應該加地址運算符&。

(4)第七行的printf語句中應當把%d都改成%lf或%f;按輸出要求在格式串中應添加相應的原樣輸出的字符;因為下一個printf的輸出從新的一行開始,因此在本輸出語句的格式串的最后應當加換行符——\n。

(5)第八行的printf語句中應當把格式串整理合并放在輸出項的前面,輸出項放在后面,%d都改成%lf或%f;中間的\n刪去。

(6)請同學們自己寫出修改后的程序,并上機調試。3.30 【分析與解答】

(1)分析:可用算術式560÷60把分鐘換算成小時和分鐘,商數就是小時數,余數就是分鐘數。

(2)確定變量的名字和定義變量的類型:在程序中把小時數放在變量h中,把分鐘數放在變量m中。這兩個變量的類型可以是整型(本題中采用整型),也可以是實型。

(3)確定所用算法:求560÷60的商數,在C語言中可以用整除的算法,語句是h=560/60。求余數可用求余運算符 %:560%60,其值放入變量m中的語句是:m=560%60。(4)設計輸出格式。若輸出的形式定為:小時:分鐘,則按此形式設計輸出語句。(5)把以上內容放在主函數的一對花括號中。(6)編寫程序如下: main(){

int

h, m;h=560/60;m=560%60;printf(″The result: %3d : %3d\n″, h,m);} 運行結果是:

The result:

: 20 3.31 【分析與解答】

(1)確定變量的名字和定義變量的類型。若用a存放1500,用b存放350;用q存放商數,用r存放余數,所有變量應定義成int類型。

(2)設計輸入語句從終端輸入1500和350;在輸入語句之前,應當設計一個輸出語句,用以提示輸入。

(3)可用整除求商數,結果放在變量q中。可用求余運算符%求兩數之余數,結果放在變量r中。

(4)設計輸出語句。輸出a、b、q、r。

(5)把以上內容放在主函數的一對花括號中。

本題的程序與3.30相似,請大家參考上題并根據本題的解釋自己編程,并上機調試。3.32 【分析與解答】

(1)定義4個雙精度變量a、b、c和ave,變量a、b、c分別存放讀入的3個雙精度數,ave存放它們的平均值。

(2)設計輸入語句,以及在此之前用于提示輸入的(printf)語句。(3)設計求平均值的算法,把所求得的平均值放入變量ave中。

(4)設計把變量ave中的數,從小數點后第二位數進行四舍五入的算法。現舉例說明:若ave中的數為123.4644,為了保留此值小數點后一位,可用表達式:(int)(123.4644*10)/10.0;依次推算,為了保留此值小數點后二位,可用表達式:(int)(123.4644*100)/100.0;其他依此類推。

(5)若要求對小數點后第二位數進行四舍五入,則可對原數加0.05后再進行以上運算。如要求保留123.4644小數點后一位且對第二位數進行四舍五入,可用表達式:(int)((123.467+0.05)*10)/10.0。注意:分母一定要用實數10.0而不能用整數10,否則就變成整除了;若要求保留123.4644小數點后兩位且對第三位數進行四舍五入,可用表達式:(int)((123.467+0.005)*100)/100.0;其他依此類推。(6)設計輸出語句。輸出a、b、c和ave。(7)把以上內容放在主函數的一對花括號中。(8)編寫程序如下: main(){

double a,b,c,ave;printf(″Enter a ,b ,c : ″);scanf(″%lf%lf%lf″, &a, &b, &c);ave=(a+b+c)/3;printf(″ave=%f\n″, ave);

/*用以比較四舍五入前后的數據*/ 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″, a,b,c,ave);} 3.33 【分析與解答】

(1)關于對變量中的數進行交換的算法請參考3.7題中的解釋和《教程》中有關的例題。(2)定義4個整型變量a、b、c和t,變量a、b、c分別存放讀入的3個整數,t用作臨時存儲單元。(3)設計輸入語句,以及在此之前用于提示輸入的(printf)語句。(4)輸出a、b、c中的值,以便于比較。(5)交換的步驟如下: ① 把c中的值賦給t。② 把b中的值賦給c。③ 把a中的值賦給b。④ 把t中的值賦給a。

經過以上步驟,已按要求進行了交換。(6)輸出a、b、c中的值。(7)編寫程序如下: main(){

int

a, b, c, t;printf(″Enter a, 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);} 第四章

選擇結構習題分析與解答

一、選擇題

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] && [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 或 a1|]x[JB>1|]>4 4.17【參考答案】4.18【參考答案】

[1] x<=0 [2] 1 4.19【參考答案】

[1] 3 [2] 2 [3] 2 4.20【參考答案】

*#

三、編程題

4.21【分析與解答】

相關內容請參考《教程》4.2節和4.4節。(1)改寫如下: switch(a/10){

default : m=5;break;case 0 : case 1 : case 2 : m=1;break;case 3 : m=2;break;case 4 : m=3;break;case 5 : m=4;break;};(2)本題中對a的判斷條件有一定的規律可尋;關鍵是,在switch語句后的表達式中利用了a/10,從而簡化了case標號。4.22【分析與解答】

編寫本題的程序,首先要解決如何計算學生當前的年齡(設存放實足年齡的變量是age)。(1)如果當前的月份大于生日的月份,則學生的實足年齡age=y1-y0。

(2)如果當前的月份等于生日的月份,就要看日數,當前的日數大于或等于生日的日數,則學生的實足年齡age=y1-y0。

(3)如果不滿足以上的條件,就可斷定當前的日期沒有超過生日日期,就是說學生的年齡應當是age=y1-y0-1。

以上3條,用C語言可以描述如下:

if((m1>m0)[JB>1|][JB>1|](m1==m0&&d1>=d0))age=y1-y0;else age=y1-y0-1;讀者可以參考以上語句寫出程序,也可以根據分析寫出與此形式不同的語句和程序。4.23【分析與解答】

(1)若輸入的整數a是奇數,輸出:odd number,是偶數輸出:even number。

(2)若一個a是偶數,它就能被2除盡,即a%2==0,輸出even number;若是奇數,它就不能被2除盡,即a%2!〖KG-*2〗=0,輸出odd number。

讀者可以參考以上給出的算法,寫出相應的C語句,并編寫出完整的程序。4.24 【分析與解答】

本題的主要算法是從3個數中找出最大的那個數。假定始終把最大的數放在變量max中。(1)假定a中的數最大,把a賦給max。

(2)用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也不做。(3)用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。(4)經過以上操作,max中已放入了a、b、c三個數中的最大數,輸出max即可。讀者可以參考以上給出的算法,寫出相應的C語句,并編寫出完整的程序。4.25 【分析與解答】

(1)本題已給出了非常明確的條件,只要寫出正確的條件判斷語句就可基本完成程序的編寫。(2)由給出的函數可知,只有x的值在規定的范圍內時,才求出y的值,因此程序應當對輸入的x進行判斷,若超過范圍就不求y的值。

(3)現以使用if[CD#*2]else語句為例寫出程序供參考。main(){

int x,y;printf(″Enter x : ″);scanf(″%d″, &x);if(x>-5&&x<10){

if(x==0)y=x-1;else if(x<10 && x>0)y=x+1;else if(x<0 && x>-5)y=x;printf(″x=%d y=%d\n″, x,y);} printf(″***END***\n\n″);} 第五章

循環結構習題分析與解答

一、選擇題

(單選題)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 【參考答案】

[1] 5 [2] 4 [3] 6 5.12 【參考答案】

程序段無限循環,沒有輸出結果 5.13 【參考答案】

-1 5.14 【參考答案】5.15 【參考答案】

[1] d=1.0 [2] k++ [3] k<=n 5.16 【參考答案】

[1] x>=0 [2] x

三、編程題

5.17【分析與解答】

(1)本題的基本算法是求累加值。累加項的值有規律的遞增,每一項的絕對值比前一項增2,因此可以利用循環的控制變量的遞增來得到累加項的絕對值。例如: for(i=1;i<=101;i+=2)…

(2)按所給的算式可以看到,累加項的符號是在交叉改變的,為此應當在循環體內設

置一個變量,使它的符號按此規律交叉改變,這可用:s=-s;來實現,s的初值為1;當s的值為1時,賦值后s中新的值為-1,當s的值為-1時,賦值后s中新的值為1。用s去乘累加項,將使累加項的符號也隨之有規律地改變。

(3)若累加和放在變量sum中,累加項放在變量t中,按照以上敘述,for循環體內的語句可以設計如下:

s=-s;t=s*i;sum=sum+t;(4)sum的值是51。

(5)請讀者自己對變量做出正確的定義并賦初值,設計輸出語句,完善程序。5.18【分析與解答】

(1)本題的基本算法是求累加值。累加項的分子部分都是1;分母的值有規律的遞增,依次為1!、2!、?、n!,即,若第i-1項的累加項為

t(i-1),則第i項的累加項是 t(i-1)*i,在程序中可用表達式:t=t/i(i從1變化到n)來表示。(2)根據以上分析,若用變量t來存放累加項,當i的值從1變化到n時,可用以下語句來實 現累加: t=t/i;e+=t;(3)為了實現累加過程,以上語句應當放在循環內,循環控制變量從1變化到n。

(4)若用for循環,按題目要求已指定n的值是50。若用while循環,并沒有指定n的值,但已指定了循環結束的條件,當t的值小于10-4結束循環。(5)現例示用while循環來求e值的部分程序: i=1;e=1.0;t=1.0;while(t>=1e-4){

t=t/i;e+=t;i++;}(6)請讀者自己對變量做出正確的定義,設計輸出語句,完善程序;也可以參考此程序段,按照自己的思路獨立地完成程序。(7)e的值應當是:2.71828。

(8)根據以上分析,讀者已不難用for循環來實現求e值的計算。

(9)注意:在完成此程序時,不要對分母中的階乘值進行單獨計算,因為17!的值已超過long類型的最大值,更無法求到50!。5.19【分析與解答】

(1)從1880年至2000年的年數可用一個for循環來取得。

(2)對每一年,用以上指定的條件來進行判斷,若滿足條件即為閏年,進行輸出。

(3)按輸出的要求,需要設一個變量用于統計一行中輸出的個數,若在一行上已連續輸出了5個年數,就需輸出一個換行符,使下一個輸出項在新的一行上開始;若用變量n來做此統計,則當表達式n%5==0時就應輸出一個換行符,同時使n重新置0值。(4)若變量y代表年數,if語句的邏輯表達式可以寫成如下:(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)請讀者自己對變量做出正確的定義并賦初值,完善程序;也可以參考此程序段,按照自己的思路獨立地完成程序。從1880年至2000年有30個閏年。5.20【分析與解答】

(1)不難理解利用以下的for循環可以在一行上連續輸出n個*號: for(i=1;i<=n;i++)printf(″*″);printf(″\n″);若n的值是6,則連續輸出6個*號。

(2)以上圖形是在各行上輸出數目不等的*號,只是*號的數目依次有規律地變化。在上半部分各行依次是1、3、5、7個,因此可以用以下的程序段來實現這樣的輸出: for(k=1;k<=7;k++,k++){

for(i=1;i<=k;i++)printf(″*″);printf(″\n″);} 在下半部依次是5、3、1個;因此可以用以下的程序段來實現這樣的輸出: for(k=5;k>=1;k--,k--){

for(i=1;i<=k;i++)printf(″*″);printf(″\n″);} 以上程序段從第一列起輸出的結果如下: * *** ***** ******* ***** *** * 現在我們已完成了在每行輸出指定數目的*號。

(3)輸出結果與題目要求不同,它們的區別是:按題目每一行之前有不同的空格,而這里則是所有的行都在第一列上開始輸出*號;所以接著就應當解決這一問題。

(4)分析題目要求,每行第一個*號位置的縮進是有規律的,假定中間這一行第一個*號位置是在第一列,則可看出,第一至第三行的縮進分別是3、2、1個空格;而圖形下半部的縮進數則剛好相反。這可在以上循環中添加輸出連續空格的for循環來實現,對于上半部程序如下: 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)請讀者在理解以上給出的示例的基礎上,自己添加下半部空格的輸出。

第六章

字符型數據習題分析與解答

一、選擇題

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【參考答案】6.14【參考答案】

ctype.h 6.15【參考答案】

0 6.16【參考答案】

10A 20B 30C 40D 或:

10A 20B 30C 40D 6.17【參考答案】

7.29

101.298AB 或:

7.29 101.29AB 6.18【參考答案】

A 7.29B 101.298 6.19【參考答案】 A B C

三、編程題

6.20【分析與解答】

(1)在進行字符輸入時,即使一次輸入了一行字符(最后用回車結束輸入),字符也只能一個一個地讀入。若ch已定義為char型變量,可以用以下的程序段來完成操作:

ch=getchar();while(ch![KG-*2]=′\n′){

…… ch=getchar();} 當讀入的是一個回車符時,循環就結束。循環體內的“??”符號表示需要在循環體內完成的其他操作。

(2)在循環內要求進行的操作之一是:輸出每個字符以及與之對應的ASCII代碼值。因此可用以下語句來實現。

printf(″%c : %d ″,ch,ch);(3)在循環內要求進行的另一個操作是:每行只能輸出3對字符和與之對應的ASCII代碼值。若n已定義為int型變量,則可用來作計數器;使n的初值為0,每輸出一次,n的值增1,當n的值為3的整數倍時,額外輸出一個換行符。例如: n++;if(n%3==0)putchar(′\n′);(4)把(2)和(3)中給出的語句放在循環體內,并按要求給出正確的定義和初值,就可完成題目所要求的操作。

(5)也可以在while后的一對括號中來完成字符的讀入,如while((ch=getchar())![KG-*2]=′\n′)。這時,循環內、外的“ch=getchar();”語句應當去掉。6.21【分析與解答】

(1)一行字符的讀入,請參照題6.20(1)和(5)中的解釋。循環體內的“??”符號表示需要在循環體內完成的其他操作。ch=getchar();while(ch![KG-*2]=′\n′){

…… ch=getchar();}(2)在本題中循環體內需要把讀入的所有數字字符轉換成一個整數。若用變量n來存放這個整數,為了保證有效的存放,應當把它定義成long類型。

(3)要把輸入的一串數字字符轉換成一個整數,首先需要判斷當前讀入的字符是否是數字字符,若不是則什么也不做;若是,則進行以下操作:

① 把當前讀入的一個字符轉換成一個一位整數,這可由語句“d=ch-′0′;”來實現,在這里d是一個整型變量;

② 把d中的一位數歸并到n的低位中,這可用語句“n=n*10+d;”來實現。這里所述的操作可由以下語句來完成:

if(ch>=′0′&&ch<=′9′){ d=ch-′0′;n=n*10+d;} if語句后一對括號中的判斷表達式可以調用字符函數isdigit來實現: if(isdigit(ch)){ d=ch-′0′;n=n*10+d;} if子句的兩個語句可以合并成:n=n*10+ch-′0′。(4)把(3)中的語句放入循環中: ch=getchar();while(ch![KG-*2]=′\n′){

if(ch>=′0′&&ch<=′9′)n=n*10+ ch-′0′;ch=getchar();}(5)請自己寫出定義語句并賦初值。注意,最后輸出n時,應當使用格式說明%ld,而不能使用%d。

6.22【分析與解答】

(1)行數的統計可通過統計輸入的′\n′符的個數來完成。

(2)統計的過程應當放在一個while循環體中;判斷循環是否進行的條件可以用:((ch=getchar())==EOF)。若用整型變量n作為計數器對′\n′符進行統計,只要讀入的字符是′\n′,則n增1。如:

while((ch=getchar())![KG-*2]=EOF)if(ch==′\n′)n++;(3)EOF是在stdio.h中預定義了的標識符,在TURBO C的環境下,鍵入Ctrl+Z(即按住鍵盤上的Ctrl鍵,同時按字母Z鍵)后,敲Enter鍵,即輸入了EOF。6.23【分析與解答】

(1)本題要求的操作同樣可在while循環中完成: while((ch=getchar())!=′\n′){

……

}

(2)若用整型變量n作為計數器對小寫字母進行統計,只要讀入的字符是小寫字母,則n增1。如:

if(ch>=′a′ && ch<=′z′)n++;(3)在退出循環后,輸出n的值。(4)請自己完善程序。6.24【分析與解答】

(1)若圖案的行數輸入到變量L中。

(2)按要求L決定了圖形的行數,因此可通過循環來實現L行的輸出: for(i=1;i<=L;i++){ …… }

循環體中的“??”號,代表輸出L行的操作。

(3)假定ch中存放了一個字符,我們知道,通過以下循環可以在一行上輸出n個字符: for(j=1;j<=n;j++)putchar(ch);putchar(′\n′);注意,在循環后putchar(′\n′);語句不可少,它用以換行。

(4)現在應當解決如何按要求給出每行輸出的字符。由圖分析,行數(或行號)為1時輸出字符A,行數為2時輸出字母B??若輸出的字母放在變量ch中,行號取決于外循環的控制變量i,則輸出的字母和行號的關系可用表達式:ch=′A′+i-1來表示。當i為1時ch中被賦予字母A,當i為2時ch中被賦予了字母B,其他依此類推。因此,在此表達式后,利用(3)中的循環就解決了各行上輸出的字母。

(5)按要求每行輸出的字母的個數不同,第二行輸出3個字母,第三行輸出5個字母,第四行輸出7個字母??(3)中for循環體的執行次數取決于n的值,也就是說n的值決定了每行輸出字母的個數。其實,n的值與行號有著密切的關系:n=2*i-1,當i為1時n的值是

1、當i的2時n的值是

3、當i的3時n的值是

5、當i的4時n的值是7。因此在(3)中for循環之前可用此表達式求出n的值。

(6)總結以上分析,我們可得到以下的程序段: for(i=1;i<=L;i++){

ch=′A′+i-1;n=2*i-1;for(j=1;j<=n;j++)putchar(ch);putchar(′\n′);} 若所用的變量都已正確定義,通過輸入L的值為5,則程序段在第一列起有以下的輸出結果: A BBB CCCCC DDDDDDD EEEEEEEEE 和題目的要求比較已趨接近,不同的是在每行沒有適當的縮進。

(7)現在來解決每行的縮進問題。由題中給出的圖形可知,若指定輸出5行,第一行縮進5個空格,第二行則縮進4個空格,第三行則縮進3個空格,第四行則縮進2個空格,第五行則縮進1個空格。這同樣可以由以下的for循環來實現: for(k=L;k>=i;k--)putchar(′ ′);把此循環放在i控制的循環體內、輸出每行字符的循環之前即可。

(8)請讀者自己補充有關的include行、語句和變量的定義,以完成整個程序。注意,如果有能力可在某些地方作些簡化。

第七章

函數習題分析與解答

一、選擇題

7.1 【參考答案】

C)7.2 【參考答案】

C)7.3 【參考答案】

B)7.4【參考答案】

C)7.5【參考答案】

A)7.6【參考答案】

D)7.7【參考答案】

A)

二、填空題

7.8【參考答案】7.9【參考答案】

9.0(或9.000000)7.10【參考答案】7.11【參考答案】

[1] n=1 [2] s 7.12【參考答案】

[1] <=y [2] z*x 7.13【參考答案】

[1] 1 [2] s*i [3] 0 [4] f(k)

三、程序調試和編程題 7.14 【分析與解答】

(1)fun函數判斷傳給形參n的數是否為素數,若是函數返回1,否則返回0。

(2)函數的原意是用變量yes作為判斷n是否為素數的標志,是素數,其值為1,否則為0。而所給函數的實際流程卻不能實現這一功能,例如,若n的值為15(明顯不是素數)時,在for循環中,當k的值為3時,就會執行if子句,yes得0,但for循環并沒有終止,接著k為4時就會執行else子句,又使yes得1,由此可見此程序段并不能準確地判斷一個數是否為素數;最后確定yes為何值的是for循環的終止值n/2,當n為15時,k的值為n/2等于7,在循環體內將又一次執行else子句,使yes得1,這時循環結束,函數返回1。由此可見所給fun函數不能起到預想的作用。

(3)由上分析可知,對于n的值為15時而言,問題是在一旦yes的值為0,已判斷n中的值不是素數時,沒有及時退出循環,返回0;因此,若在if子句中添加一條語句:break;就能解決這一問題,把if語句改寫如下: if(n%k==0){ yes=0;break;} else yes=1;(4)在所給fun函數中,當n的值為2、3時(都是素數),因為n/2的值為1(大于k中的2),所以不會進入for循環,而直接執行return語句,細心的讀者應該可以發現,這時yes沒有賦過值,也就是說,返回的是一個不確定的值,這將會導致錯誤;因此,應當在定義語句中給yes賦初值1:

int k,yes=1;至此fun函數能正確運行。

(5)總結:因為一旦if語句中的表達式:n%k==0的值為1(即可被某數整除),則可以確定n不是素數,因此即可返回,不必再執行函數其他部分,if子句可改成: if(n%k==0){ yes=0;return yes;} else yes=1;也可簡化成:

if(n%k==0)return 0;else yes=1;又可進一步不用變量yes,并去掉else,簡化成(請參考例7.4): for(k=2;k<=n/2;k++)if(n%k==0)return 0;return 1;7.15【分析與解答】

(1)若用整型變量c存放余數,則求a被b除后的余數可用表達式: c=a%b。

(2)本題要求編寫函數mymod用以求a被b除后的余數即: c=mymod(a,b);(3)只要把a%b作為函數值返回即可完成操作(請參考例7.1): int mymod(int a, int b){ return a%b;}(4)總結:本題在算法上十分簡單,只是要求讀者能夠掌握編寫函數的基本知識。7.16【分析與解答】

(1)本題所要采用的算法是累加。分析可見,所有累加項的分子都是1,而分母部分逐項增1;只是累加項的符號交叉變化。因此處理好符號的變化是完成操作的關鍵之一。

(2)若函數名為funa,傳送到函數的參數是整型值,假定形參命名為n;函數的返回值應當是浮點型,為此函數的首部可以是: double funa(int n)(3)接著寫函數體。累加放在一個for循環中來完成,若循環控制變量為k,可利用循環控制變量作為累加項t的分母,累加值放在add中: for(k=1;k<=n;k++){

…… t=s*1.0/k;add=add+t;} 此處,s用作符號變量,在1和-1之間交叉變化,乘以1.0/k后,t的值也將按要求變化符號。注意,表達式1.0/k不可以寫成1/k,因為每一項的絕對值必定是小于1的小數。(4)現在需要確定s的值。最簡單的可用表達式:s=-s來實現(請參考例5.2),若賦

值號右邊s中的值為-1,則賦值號左邊s中的值就得1;若賦值號右邊s中的值為1,則賦值號左邊s中的值就會得-1;則每循環一次就使s改變了一次符號。當然還可有多種方法。把以上表達式添加到循環體中: for(k=1;k<=n;k++){

s=-s;t=s*1.0/k;add=add+t;}(5)最后注意應當給各變量賦以適當的初值,并返回函數值。

(6)請編寫主函數。當傳給形參的值為10時,函數的返回值應當是:0.645635。

(7)總結:本題的算法并不復雜,但是需要讀者掌握編寫函數的基本知識。掌握需要傳入函。數的參數及其類型,掌握需要返回的值及其類型。在此基礎上,其他方面與先前在主函數中編寫的程序沒有什么區別。7.17 【分析與解答】

(1)此題與7.18相似。函數的返回值為浮點型,函數只有一個形參,為整型。

(2)函數的基本算法是累加,只是除第一項外其余各項都用減法;每一項的分子都是1,分母部分為k2,k的值逐項增1,由2變化到m。因此,算法可以用一個循環來實現。(3)當m的值為12時,函數值應是:0.435023。7.18【分析與解答】

(1)若函數取名為fun,按題意,x作為形參,由調用函數傳入,其類型不應當用整型;表達式x2-5x+4的值作為函數值返回,函數值的類型應為浮點型。因此,很容易寫出函數: double fun(double x){ return x*x-5*x+4;}(2)若在調用函數時,x和y2已正確定義,且x已有確定的值,則可用以下函數調用語句得 到y2的值: y2=fun(x+15);(3)同樣,若在調用函數時,x和y3已正確定義,且x已有確定的值,則可用以下函數調用語句得到y3的值: y3=fun(sin(x));注意,因為在程序中調用了C語言提供的庫函數sin,因此應當在程序的最前面包含以下命令行:

#include

″math.h″

(4)參考(2)和(3)應不難寫出求y1的語句,請讀者自己完成。

(5)y1的值應是:-2.0。當x的值為5時,y2的值應是:304.0。當x的值為0.5時,y3的值應是:1.832721。(6)總結:

① 本題已給出了函數需要求值的表達式,讀者只需確定函數的類型和形參的類型,就可以寫出函數,就像例7.1中求兩數之和的函數一樣簡單。

② 在給定了函數之后,調用函數時,函數的實參應當是一個與形參類型一致的任意合法的 表達式。例如,可以是常量、算術表達式,也可以是函數等。就像例7.1中求兩數之和的add函數一樣,可以用add(3,4);來求3+4;當x、y有確定值時,可以用add(x*x,y*y);來求x2+y2;當x、y有確定值時,可以用add(sin(x+y),cos(x+y));來求sin(x+y)+cos(x+y),這同樣可以通過add(sin(add(x,y)),cos((add(x,y)));來求得。

第八章

指針習題分析與解答

一、選擇題

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【參考答案】

8.14【參考答案】 1 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+1), 2, 10,20,30,40

三、編程題

8.17【分析與解答】

(1)若函數名為fun,按題意,函數不返回函數值;函數的形參需要接受傳送過來的兩個浮點數,因此需要有兩個double類型的形參;另外要把它們的和值與差值,通過形參傳送回去,這就要求有兩個double類型的形參指針,接受傳送過來的地址,以便通過指針把和值與差值傳送給所指的主函數中的變量。因此函數的首部應當是: void fun(double a, double b, double *p1, double *p2)這里,a、b、p1、p2是自己取的名。

(2)假設把a、b的和值傳送給p1所指的存儲單元,可用語句:*p1=a+b;把a、b的差值傳送給p2所指的存儲單元,可用語句:*p2=a-b。(3)因此函數可寫成:

void fun(double a,double b,double *p1,double *p2){ *p1=a+b;*p2=a-b;}(4)在主函數中,若有定義語句:double x,y,z1,z2;,且x、y已賦值,則調用fun函數的語句可以是:fun(x,y,&z1,&z2)。

(5)總結:本題所要求的算法極簡單,但它要求有兩個值返回,用return語句就不可能返回兩個函數值。要求讀者能利用形參指針把要求的值間接地傳回調用函數。8.18【參考答案】

(1)若函數名為maxandmin,按題意,函數不返回函數值;函數將接受3個數(假定為int類型),并需要通過指針指向主函數中的兩個int型變量,以便把最大值和最小值放入指針所指的存儲單元中。因此函數的首部應當是:

void maxandmin(int a,int b,int c,int *pmax,int *pmin)(2)函數體中需要實現求3個數的最大值和最小值的算法,此算法應當在學習第四章時已經掌握(可參考例4.2和習題4.24)。如果把a、b、c中的最大值暫時放在max中,把最小值放在min中,可用以下算法找到最大值: ① 假定a中的數最大,把a賦給max。

② 用b去和max比較,若b大于max,則把b賦給max;若不大于max,則什么也不做。③ 用c去和max比較,若c大于max,則把c賦給max;若不大于max,則什么也不做。④ 經過以上操作,max中已放入了a、b、c三個數中的最大數。⑤ 可模仿以上算法找到最小值: min=a;if(b

maxandmin(x,y,x,&m,&n);(5)總結:本題要求的算法在第四章應當已掌握,本題的主要目的是要求讀者掌握如何通過指針把函數中的多個結果傳回主函數。

第九章

數組習題分析與解答

一、選擇題

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]0 9.20【參考答案】9.21【參考答案】9.22【參考答案】9.23【參考答案】

2721 9.24【參考答案】

-850,2,0 9.25【參考答案】

[1]k=p [2]k 9.26【參考答案】

[1](c=getchar())[2] c-′A′

三、上機題

9.27【分析與解答】

(1)對于字符的輸入可參考教材例6.3和習題9.26中的while循環,只是要注意,循環的終止條件是:等于′\[KG-*3]n′。

(2)在while循環體中,用if條件來判斷是否為數字字符,若是,就使對應的元素增1;if中的條件表達式可用C的庫函數:isdigit(ch),這時要在程序前加:#include 行;也可用:ch>[KG-*3]=′0′&&ch<[KG-*3]=′9′。

(3)若用num數組元素來進行統計,當ch中是數字“0”時,使num[0]增

1、當ch中是數字 “1”時,使num[1]增1??num的下標表達式可用:ch-′0′。

(4)注意,在定義數組時,數組的大小應符合使用的要求。在利用數組元素作為計數器時,不要忘記首先應該給數組元素賦0值。

(5)總結:通過本題的編程,要求掌握利用數組元素作為計數器的基本算法。9.28【分析與解答】

本題的編程請參考例9.8。(1)若有以下10個整數:

0 1 2 3 4 5 6 7 8 9 要求從第5個元素依次向前移,則移動之后的數列應該是: 0 1 2 4 5 6 7 8 9 第5個元素不是指下標為5的元素,而是指排列的順序,對此數列而言是指數值為4的那個。(2)完成移動后,數列中的數據個數減1。

(3)若進行指定操作的函數名為moves,則函數的首部可如下: void moves(int *a,int n,int *m)這里a用以指向一維數組的首地址,n接受開始移動的元素的位置,m指向主函數中存放元素個數的變量,因為沒有函數值返回,因此函數的類型定義為void。(4)可用以下for循環完成指定的移動:

for(i=n-1;i<*m;i[KG-*3]+[KG-*3]+)a[i-1]=a[i];注意,應當先把第n個元素(下標為n-1)移到第n-1個元素(下標為n-2)的位置上,依次從前到后向前移動。

(5)完成移動之后,應使m所指變量中的值減1,表示數列中的數據少了一個;這可由于句: *m=*m-1;來完成。

(6)可設計一個輸出函數,在移動前、后調用此函數輸出數組中的數據,以便驗證操作是否正確。若輸出函數名為:outarr,則函數首部可寫成: void outarr(int a[], int num)形參a指向待輸出的數組,num接受數組中元素的個數。輸出操作可由一個for循環來完成: for(i=0;i

(7)在主函數中定義所需的數組和變量。數組中的值可以在主函數中輸入,也可定義一個函數用于輸入數據。n的值在主函數中輸入,然后調用以上函數。需要注意的是,給n輸入的值不能是1,因為第一個元素(下標為0)再向前移,下標就越界了,同時,n的值也不可大于10,因為已指定只有10個元素。(8)總結:

① 對于需要進行多次的操作,如本程序中輸出數組元素中的值,應當編寫一個獨立的函數多次調用,而不應重復地編寫代碼。雖然該函數中只是一個for循環,似乎在主函數中書寫兩次也不麻煩,但養成良好的模塊化程序設計的風格卻是十分重要的。

② 分析以上例子可見,所規定的操作,實際上刪除了數列中的第n-1個元素,因此可見刪除操作是由移動操作來完成的。9.29【分析與解答】

(1)程序要求定義兩個數組以便存放原始數據和從中選出的所有奇數。(2)若把函數命名為oods,則函數首部可寫成: void odds(int *a,int an,int *b,int *bn)形參a指向存放原始數據的數組,an存放此數組中數據的個數;b指向另一個數組,此數組中將存放將選出的所有奇數,指針bn指向存放奇數個數的存儲單元,因為將通過此指針,把奇數的個數傳回主函數。

(3)在odds函數中,可通過一個for循環選出所有的奇數: for(i=0;i

(5)程序需要兩次輸出數組中元素的值,一次是輸出原始數組中的值,一次是輸出奇數數組中的值。因此可以使用題9.28中的outarr函數,進行兩次調用。

(6)在主函數中應當定義所需的數組和變量,可以在主函數中給數組元素輸入數據。

(7)總結:本題的算法很簡單,要求讀者能夠編寫獨立的模塊,并在函數之間熟練地傳送數據。

9.30【分析與解答】

(1)例9.9完成了對整數由小到大的排序,而本題是對字符數組中的元素進行由大到小的排序;兩者之間并無大的區別,只是數組的類型不同,字符數組中每個元素存放一個字符,字符的大小依據每個字符的ASCII碼值的大小。(2)若函數形參a指向主函數中待排序的數組,由大到小的排序只需改變內循環中if語句的條件表達式即可: if(a[p]

(3)排序前后可以調用一個輸出函數,輸出原始數據和排序后的數據,可參考習題9.28的outarr函數,但注意,這里是對字符數組進行輸出。

(4)總結:讀者可以參考例9.9,程序基本相同,但在掌握排序算法的基礎上,必須獨立完成此程序,不要照抄。9.31【分析與解答】

(1)我們把插入操作命名為函數insert,若待插入的數據放在形參x中,指針a指向主函數中的數組,指針n指向存放數組中元素的個數變量,因為插入后,數組中的數據會增加。函數的首部如下:

void insert(int *a,int x,int *n)(2)若數組中原有的有序數列按由小到大排列如下,共12個數: 11 14 17 18 19 20 22 24 26 29 30 33 若x中的數為21,我們立刻知道應插在何處,插入后數列如下,則插入后變成有13個數: 11 14 17 18 19 20 21 22 24 26 29 30 33 因此,對于程序來說應當做以下4件事:

① 能根據待插的數據,按“仍然有序的要求”判斷出插入的位置。② 把位置騰出來,以便放入插入的數據,但原有的數據不能缺少。③ 把x中的數放入騰出來的位置中。④ 使原有數組中的數據個數增1。

(3)現在來做第一個步驟:確定插入的位置。用變量j來放置該位置在數組中的下標,以下while循環將完成此任務: j=0;while(j<*n && a[j]

(4)第二個步驟是要把下標為j的元素后原有的數據移走,但不能改變原來的順序。那么只能把下標為j至下標為*n-1中的數據依次向后平移;這種平移,應當先把最后的、下標為*n-1的元素中的數據移到下標為*n的元素中,其他依次后移一個單元,直到把a[j]中的值放入a[j+1]中。這可由以下for循環來完成: for(i=*n-1;i>[KG-*3]=j;i--)a[i+1]=a[i];(5)第三個步驟是把x放入a[j]中:a[j]=x;(6)第四步是使存放數據個數的變量中的數增1:*n=*n+1;插入過程到此結束。(7)可利用習題9.28中的outarr函數,在插入前和插入后兩次輸出數組元素,以判斷操作是否正確。

(8)請編寫主函數,定義所需的數組和變量,給數組輸入一組有序數,正確調用函數。

(9)請按題目要求至少對程序運行3次,判斷程序是否在各種情況下都能得到正確的結果。(10)總結:插入算法是程序設計中的一種最基本的算法,希望讀者在理解的基礎上編寫程序。9.32【分析與解答】(1)若函數名為change,函數首部如下: void change(int x,int *a, int *n)形參x中存放一個待轉換的十進制數,指針a指向一個一維數組,數組中每一個元素中存放一個0或1代表一位二進制數,指針變量n指向一個整型變量,其中存放在一維數組中二進制位的個數。

(2)函數中定義一個指針變量s,并把a所指的數組的首地址賦給它以便保留。把x每次被2除后的余數放在a當前所指的數組元素中,然后移動指針a指向下一個元素,并使x的值除2;重復此過程,直到x的值為0。可用以下的while循環來進行轉換: s=a;while(x){ *a=x%2;a+[KG-*3]+;x=x/2;} 退出循環時,已把轉換后的二進制數的每一位上的數放入主函數的數組元素中,但是應當注意,在a[0]中放的是二進制數的最低位,最后放入的是最高位。例如,整數8轉換成的二進制數為100,則在a[0]、a[1]中存放的是0,而a[2]中存放的是1。

(3)函數中最后用:*n=a-s;把存放在一維數組中二進制位的個數放入n所指的變量中。因為s已指向主函數中數組的第一個元素(下標為0);在循環中,指針a不斷后移,最后指向存放二進制數最高位的元素;所以a-s的值就是已存入數據的元素的個數。

(4)在主函數中輸入待轉換的十進制數,調用change函數后輸出數組元素中的值,注意,因為在a[0]中放的是二進制數的最低位,因此輸出的順序應該從a[n]到a[0]。9.33【分析與解答】

(1)若函數名為getone,形參指針a指向主函數中存放指定數據的數組。函數的首部如下: void getone(int a[])(2)函數中變量x用來存放得到的一個隨機數,變量n用來存放數組中已放入的不同的隨機數的個數,變量i用作下標變量。

(3)所有的工作在一個while循環中完成: while(n<15){……}

當不同的隨機數的個數n的值等于15時退出循環。(4)在以上while循環中需要進行以下4項步驟: ① x=rand()%20;得到一個小于20的隨機整數。

② i=0;準備從下標為0的元素開始去查找數組中是否有與x相同的數,若沒有,就把x中的數加入到數組中(放在最后),若有,就什么也不做。

③ 用以下while循環從頭到尾去檢查數組中是否有與x值相同的元素: while(i

a.當x不等于a[i]時,i[KG-*3]+[KG-*3]+,x再去與下一個元素進行比較,當遇到x等于a[i]時,說明在數組中已經有此數,因此不必再去比較,應當退出循環。

b.當x不等于a[i]時,i的值不斷增1;當i的值等于n時,說明x已與數組中所有元素都比較過且都不相同,這時也應退出循環。

④ 如果i的值等于n時,數組中沒有與x相同的元素,因此需要把新的值放入數組中,可用以下語句來實現:

if(i==n){ a[n]=x;n[KG-*3]+[KG-*3]+;} 因為已有的數據放在下標為0到n-1的元素中,因此新的數放在a[n]中,然后n[KG-*3]+[ KG-*3]+;即數組中不同數據的個數增1。

(5)接著重新循環,再去產生一個新的隨機數,重復以上過程,直到n的值等于15時退出外循環。這時在數組中已放入了15個不同的隨機整數。(6)請在主函數中定義所需的數組和變量。調用getone函數后,可在主函數中輸出所得的數據。

(7)總結:

① getone函數的主要部分是查找,沒有找到才進行下一步操作。

② C語言提供的庫函數rand()每調用一次產生一個0到32767的隨機整數,因此rand()%20將得到一個0到19的隨機整數。9.34【分析與解答】(1)本題可參考例9.11。

(2)本題可用define命令行定義N來代表一個常量(參考2.2.3節)。可定義4個獨立的函數來實現所要求的操作。第一個函數:

void getm(int(*[KG-*3]p)[N])用于給二維數組元素賦隨機數。形參p是一個行指針,N是二維數組的列數。第二個函數: void sum(int a[][N],int *rows,int *[KG-*3]cols)用于求出二維數組每一行元素的和值放在形參指針rows所指的一維數組中,求出二維數組每一列元素的和值放在形參指針cols所指的一維數組中。形參a是一個行指針,N是二維數組的列數。

第三個函數:

void diagsum(int a[][N],int *dg1, int *dg2)用于求出方陣的兩個對角線上元素的和值,分別放在形參指針dg1和dg2所指的變量中。形參a是一個行指針,N是二維數組的列數。

第四個函數用于必要的輸出,請讀者自己設計。

(3)在getm函數中,利用一個雙重循環,調用rand函數給二維數組賦值: for(i=0;i

for(i=0;i

(5)在diagsum函數中,通過一個for循環來求得兩對角線上元素之和: for(i=0;i

(6)請參考例9.11的outdata函數對二維數組和有關數據的輸出。

(7)總結:對二維數組的操作,一般可利用一個雙重循環來進行。本題雖然有多個任務,但 可用函數,每個函數完成一個任務,每個函數都很簡單,且都很容易讀懂;一定要避免把所有的任務混在一起。9.35【分析與解答】

(1)要進行相加的兩個矩陣(假定為a和b)的行數應當相等,列數應當相等。兩個矩陣相加就是把兩個矩陣中下標相同的兩個元素相加,相加的和值放在第三個矩陣(假定為c)、相同下標的元素中。即:c[i][j]=a[i][j]+b[i][j]。

(2)可以定義一個函數getms(參考題9.34),利用rand()函數給兩個矩陣賦值。(3)定義addm函數,對兩個矩陣相加:

void addm(int(*a)[M], int(*b)[M], int(*[KG-*3]c)[M])這里a、b、c是行指針,分別指向三個二維數組(N行M列),要求這三個數組的行和列數相同。和值放在c所指數組中。矩陣相加的操作放在一個雙重循環中: for(i=0;i

for(i=0;i

(5)請在主函數中定義數組和所需的變量。調用getms函數得到原始數據,調用addm函數實現矩陣相加,調用輸出函數輸出三個矩陣。9.36【分析與解答】

(1)為了輸出以上表格,需要定義一個9×9的二維數組。在其中存入九九表中的數據。(2)定義函數gettab,在二維數組中存入九九表中的數據: void gettab(int a[][N])形參a是一個指向9×9二維數組的行指針。

(3)在gettab函數中,可用以下for循環把九九表中的數據放入數組中: for(i=0;i

for(i=1;i<[KG-*3]=9;i[KG-*3]+[KG-*3]+)printf(″(%d)″,i);printf(″\[KG-*3]n″);在二維數組每一行輸出前(即內循環之前)加語句:printf(″(%d)″,i+1);就可得到每一行最前面的(1)、(2)、?、(9)。

(5)輸出的格式不可能在第一次調試時就合適,一般需運行幾次進行調整。(6)請讀者自己完成主函數,定義所需的數組和變量,調用以上的函數。

(7)總結:本題的算法很簡單,只包含給二維數組的賦值和表格的輸出,對于表格的格式,可以通過對程序的運行,逐步進行調整。9.37【分析與解答】

(1)假定程序定義了M行N列的二維數組。可用define命令行定義N和M來分別代表兩個 常量(參考2.2.3節)。

(2)程序的功能可由幾個獨立的函數來實現。① void getm(int(*[KG-*3]p)[N])形參p是一個行指針,指向M×N的數組首地址。getm函數的功能是通過調用rand函數給二維數組賦值。請參考習題9.34中的同名函數。② void suml(int a[][N],int *rows)形參a是一個行指針,指向M×N的數組首地址,指針rows指向一個一維數組,在此數組元素中將存放每行元素之和。suml函數的功能是求出a所指二維數組中每一行元素之和并依次放在rows所指數組中。請參考習題9.34中的sum函數。③ int getmax(int *rows)形參指針rows指向存放每行元素之和的一維數組,在此函數中將求出最大值所在的下標作為函數值返回。請參考習題9.25。④ void change(int a[][N],int k)形參行指針a,指向M×N的數組首地址,k接受一維數組中最大值所在的下標。此函數的功能是把二維數組中下標為k的那一行、與下標為0的行的所有元素進行對調。對調可用一個for循環來實現: for(i=0;i

(5)總結:交換數據的算法應當已很熟悉,本題只是交換兩行中的數據,這時被交換的兩個元素的行下標不同,而列下標相同。讀者不妨對兩列中的數據進行交換。本題中,除對二維數組中的兩行進行對調外,其他的算法在此之前都已介紹過,由此可知,應當積累一些基本的算法知識,程序的完成都是由一些基本算法來實現的。9.38【分析與解答】

(1)在定義數組時應該注意,進行逆置操作的矩陣必須是一個方陣,行、列數相同。

(2)在本題中給二維數組置數以及對二維數組進行輸出,請參考習題9.37,在此不再重復。(3)對矩陣進行逆置的操作可由以下函數完成: void transpose(int p[][N])形參p指向一個二維數組。逆置的過程可由雙重循環來完成: for(i=0;i

第十章

字符串習題分析與解答

一、選擇題

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書上(-chp)改為(--chp)10.12【參考答案】

XYZA 10.13【參考答案】

SO 10.14【參考答案】10.15【參考答案】

Itis 10.16【參考答案】

[1] strlen(str)-1;[2] j--(或--j)10.17【參考答案】10.18【參考答案】

goodgood!

三、編程題

10.19【分析與解答】

(1)已知gets函數的調用形式為:gets(str),str是存放所讀入字符串的起始地址,可以是字符數組名、已指向一串固定存儲單元的字符指針或數組元素的地址。gets函數從終端讀入一串字符,直到讀入一個回車換行符為止,字符串中不包括回車換行符,并在最后自動添加'

主站蜘蛛池模板: 国产在线不卡一区二区三区| 精品超清无码视频在线观看| 国产精品自在线一区| 精品无人区麻豆乱码1区2区| 性色a码一区二区三区天美传媒| 中文字幕无码乱人伦| 色婷婷五月综合激情中文字幕| 西西4444www大胆无码| 麻豆画精品传媒2021一二三区| 精品久久久久久久久久中文字幕| 亚洲午夜无码毛片av久久| 全球中文成人在线| 午夜福利国产成人无码gif动图| 久久综合九色综合欧美婷婷| 亚洲日本韩国欧美云霸高清| 男女免费观看在线爽爽爽视频| 国产免费的又黄又爽又色| 亚洲欧洲无码专区av| 久天啪天天久久99久孕妇| 重口sm一区二区三区视频| 人妻少妇熟女javhd| 东北妇女肥胖bbwbbwbbw| 中文字幕av一区二区三区人妻少妇| 中文字幕亚洲乱码熟女一区二区| 国产在线精品视频你懂的| 欧美s码亚洲码精品m码| 97人洗澡从澡人人爽人人模| 国产亚洲精品福利在线无卡一| 国产精品亚洲精品日韩已满十八小| 亚洲国产成人精品无码区软件| 国产 校园 另类 小说区| 欧美三级在线播放线观看| 精品国产第一国产综合精品| 亚洲日本一区二区三区在线播放| 亚洲精品自产拍在线观看动漫| 久久婷婷狠狠综合激情| 无套内谢孕妇毛片免费看看| 美女无遮挡免费视频网站| 大又大粗又爽又黄少妇毛片免费| 美女视频黄又黄又免费| 与子敌伦刺激对白播放|