C語言程序設(shè)計課后習題答案(主編:胡宏智)_第1頁
C語言程序設(shè)計課后習題答案(主編:胡宏智)_第2頁
C語言程序設(shè)計課后習題答案(主編:胡宏智)_第3頁
C語言程序設(shè)計課后習題答案(主編:胡宏智)_第4頁
C語言程序設(shè)計課后習題答案(主編:胡宏智)_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

習題參考答案

習題一參考答案:

【習題1-1]ABCD

【習題1-2]C

【習題1-3]B

【習題1-4]B

【習題1-5]略

習題二參考答案:

一、單項選擇題

【習題2-1】?【習題2-6】:CCDBAA

二、簡答題

【習題2-7】:

C語言提供了豐富的數(shù)據(jù)類型,可以根據(jù)這些數(shù)據(jù)類型構(gòu)造出不同的數(shù)據(jù)結(jié)

構(gòu)。C中的數(shù)據(jù)類型包括基本類型、構(gòu)造類型、指針類型、空類型等。其中基本

類型包括整型、字符型、實型(浮點型)等。

【習題2-8】:

C中整常數(shù)的表示

整型常量即整常數(shù)。C整常數(shù)可用以下三種形式表示:

①十進制整數(shù);

②八進制整數(shù)。以數(shù)字0開頭的數(shù)是八進制數(shù),如0123表示八進制數(shù)123;

③十六進制整數(shù)。以O(shè)x開頭的數(shù)是十六進制數(shù)。如0x123,代表十六進制

數(shù)123o

【習題2-9】:

C規(guī)定對所有的變量要“先定義,后使用”,這樣規(guī)定有以下好處:

(1)便于糾錯;

(2)便于編譯系統(tǒng)為變量分配存儲空間;

(3)運算合法性檢查。

【習題2-10]:

C語句可以分為以下五類:

(1).控制語句。完成一定的控制功能;

(2).函數(shù)調(diào)用語句;

(3)表達式語句;

(4)空語句;

(5)可以用{}把一些語句括起來成為復(fù)合語句。

C只有9種控制語句,它們是:

(1)if()?else?(條件語句)

(2)for()?(轉(zhuǎn)向語句)

(3)while()~(循環(huán)語句)

(4)do?while()(循環(huán)語句)

(5)continue(結(jié)束本次循環(huán)語句)

(6)break(中止執(zhí)行switch或循環(huán)語句)

(7)switch(多分支選擇語句)

(8)goto(轉(zhuǎn)向語句)

(9)return(從函數(shù)返回語句)

【習題2-11]:

表達式不是獨立存在的,它存在于其它表達式、語句、函數(shù)參數(shù)里,表達式

后面加上一個分號,就變成表達式語句,如

i=i+l(是表達式,不是語句)

i=i+l;(是語句)

表達式能構(gòu)成語句是C語言的一個特色。其實“函數(shù)調(diào)用語句”也是屬于表達

式語句,因為函數(shù)調(diào)用也屬于表達式的一種,只是為了便于理解和使用,我們把

“函數(shù)調(diào)用語句”和“表達式語句”分開來說明。由于C程序中大多數(shù)語句是

表達式語句(包括函數(shù)調(diào)用語句),所以有人把C語言稱作“表達式語言”。

【習題2-12]:

字符常量就是一個字符,用單引號括起來,占一個字節(jié);而字符串常量是由

若干個字符組合而成,用雙引號括起來,存貯時自動在后面加“\0”,即使同樣

是一個字符,字符串常量后面還要加一個“\0”。

【習題2-13]:

(l)12,a;(2)40,20;(3)l13,4b;(4)176627,fd97;(5)177621,ff91;(6)4663,9b3;(7)l10022,90

12;(8)51013,520bo

三、閱讀程序?qū)懡Y(jié)果或填空

【習題2-14]:

aabbccabc

AN

【習題2-15]:261

【習題2-16]:10

【習題2-17]:

57

57

67.856400,-789.124023

67.856400,-789.124023

67.86,-789.12,67.8564,-789.1240,67.856400,-789.124023

6.78564e+01,-7.9e+02

A,65,101,41

1234567,4553207,d687

65535,177777,

COMPUTER,COM

【習題2-18]:9,11,9,10

【習題2-19】:2.5

【習題2-20】:3.5

【習題2-21】:(1)14,(2)10,(3)60,(4)0,(5)0,(6)0

【習題2-22]:x>-5&&x<5

x>5||x<-5

四、編寫程序題

【習題2-23]

main()

(

floatr,h,Cl,Sa,Sb,Va,Vb;

scanf("%f,%f,,&r,&h);

Cl=2*3.14*r;

Sa=3.14*r*r;

Sb=4*Sa;

Va=4*3.14*r*r*r/3;

Vb=Sa*h;

printf("Cl=%.2f\n",Cl);

printf("Sa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\n",Sa,Sb,Va,Vb);

}

【習題2-24]

main()

{floatF,c;

printf("請輸入一個華氏溫度:\n");

scanf("%f',&F);

c=5.0/9.0*(F-32);/*注意5和9要實型表示,否則5/9的值為0*/

printf("攝氏度為:%5.2f\n",c);

)

【習題2-25]

#includenstdio.hH

main()

{charcl,c2;

printf("請輸入兩個字符cl,c2:\n");

cl=getchar();

c2=getchar();

printf("用putchar語句輸出結(jié)果為:\nn);

putchar(cl);

putchar(,,);

putchar(c2);

printf("用printf語句輸出結(jié)果為:\n");

printf("\n%c%c\n",cl,c2);

(1)都可以;

(2)用printf。函數(shù);

(3)不是在任何情況下,因為char只有一個字節(jié),而int有2個字節(jié)。能表示

的范圍不一樣。

【習題2-26]:

#include<stdio.h>

#definePI3.14159

main()

floatr,h,cl,cs,cvz;

printf(nInputr,h:n);

scanf(n%f,%f;&r,&h);

cl=2*PI*r;

cs=PI*r*r;

cvz=cs*h;

printffThelengthofthecircumference:%6.2f\nn,cl);

printf(Hareaofthecircle:%6.2f\nn,cs);

printfi(,!volumeofthecolumn:%6.2f\nH,cvz);

}

【習題2.27】:

#include<stdio.h>

main()

(

charch;

printf(n\nlnputaletter:0);

scanf(n%cn,&ch);

printf(n\nASCntheletter:%dH,ch);

)

習題三參考答案:

一、單項選擇題

【習題3-1】?【習題3-6】:DCADCBo

【習題3-7】:

(1)0,(2)1,(3)1,(4)0,(5)1o

二、簡單題

【習題3-8】:

程序解決問題是按指定的次序執(zhí)行一系列操作的結(jié)果,按照次序執(zhí)行操作的

過程描述稱為算法。

算法的特性:(1)有窮性;(2)確定性;(3)有零個或多個輸入;(4)有一個或多

個輸出;(5)有效性。

舉例:菜譜操作步驟、樂譜、施工圖紙等等。

【習題3-9】:

(1)自然語言,(2)偽代碼,(3)流程圖,(4)計算機語言。

自然語言通俗易懂,但有歧義性;偽代碼方便實用,但沒有流程圖明晰,容

易犯邏輯錯誤;流程圖明晰但繪制和修改時比較繁瑣;計算機語言表示算法嚴謹,

但無法做到算法設(shè)計的第一步就使用計算機語言,讀程序比看流程圖要費神很

多。

【習題3-10]:

順序結(jié)構(gòu),由順序執(zhí)行的一組語句或者結(jié)構(gòu)組成。(2)分支結(jié)構(gòu),根據(jù)判斷

條件,做出取舍,要么執(zhí)行A分支要么執(zhí)行B分支,必須執(zhí)行其中的一個,

不可全執(zhí)行也不可全不執(zhí)行。(3)循環(huán)結(jié)構(gòu),由需要反復(fù)執(zhí)行的一段代碼或

者結(jié)構(gòu)組成。任何算法功能都可以通過以上三種基本程序結(jié)構(gòu)的組合來實

現(xiàn)。

【習題3-11]:非0為真,0為假。

三、用傳統(tǒng)流程圖表示求解以下問題的算法。

【習題3-12]?【習題3-19]:如下圖3-12~3-19所示。

3-123-133-14

其中的符號”表示“倒給”,例如“A-C”“將A瓶中的液體倒給C

瓶”

A

2->i

i+1—*i|n—?i|

/打印n/

n+1—>n

(結(jié)束)

3-153-17

3-183-19

四、編寫程序題

【習題3-20]:

#include<stdio.h>

main()

{intx,y;

printf("輸入x:n);

scanf("%dn,&x);

if(x<1)/*x<l*/

{y=x;

printf(Hx=%3d,y=x=%d\nn,x,y);

)

elseif(x<10)/*l<x-10*/

{y=2*x-l;

printf(Mx=%3d,y=2*x-l=%d\n”,x,y);

)

else/*x>10*/

{y=3*x-l1;

printf(nx=%3d,y=3*x-ll=%d\nn,x,y);

)

}

【習題3-21]:

#include<stdio.h>

main()

{longintnum;

intindiv,ten,hundred,thousand,ten_thousand,place;

/*分別代表個位、十位、百位、千位、萬位和位數(shù)*/

printf(”請輸入一個整數(shù)(0-99999):)

scanf(n%ldH,&num);

if(num>9999)place=5;

elseif(num>999)place=4;

elseif(num>99)place=3;

elseif(num>9)place=2;

elseplace=l;

printf(Hplace=%d\nn,place);

ten_thousand=num/l0000;

thousand=num/l000%10;

hundred=num/l00%10;

ten=num%100/10;

indiv=num%10;

switch(place)

{case5:printf(n%d,%d,%d,%d,%dn,ten_thousand,thousand,hundred,ten,indiv);

printf("\n反序數(shù)字為;”);

printfifH%d%d%d%d%d\nn,indiv,ten,hundred,thousand,tenthousand);

break;

case4:printf(n%d,%d,%d,%dn,thousand,hundred,ten,indiv);

printf(”\n反序數(shù)字為:”);

printf(,,%d%d%d%d\nH,indiv,ten,hundred,thousand);

break;

case3:printf(n%d,%d,%dM,hundred,ten,indiv);

printf("\n反序數(shù)字為:");

printf(^,%d%d%d\n^^,indiv,ten,hundred);

break;

case2:printf(n%d,%dH,ten,indiv);

printf("\n反序數(shù)字為:");

printf("%d%d\n",indiv,ten);

break;

case1:printf(,,%dn,indiv);

printf("\n反序數(shù)字為:");

printf(H%d\ii,\indiv);

break;

}

【習題3-22]:

(1)用if語句編程序。

#include<stdio.h>

main()

{longi;

floatbonus,bon1,bon2,bon4,bon6,bon10;

bonl=100000*0.1;/*利潤為10萬元時的獎金*/

bon2=bon1+100000*0.075;/*利潤為20萬元時的獎金*/

bon4=bon2+200000*0.05;/*利潤為40萬元時的獎金*/

bon6=bon4+200000*0.03;/*利潤為60萬元時的獎金*/

bon10=bon6+400000*0.015;/*利潤為100萬元時的獎金*/

printf("請輸入利潤i:");

scanf("%ld",&i);

if(i<=100000)

bonus=i*0.1;/*利潤在10萬元以內(nèi)按0.1提成獎金*/

elseif(i<=200000)

bonus=bon1+(i-100000)*0.075;/*利潤在10萬至20萬元時的獎金*/

elseif(i<=400000)

bonus=bon2+(i-200000)*0.05;/*利潤在20萬至40萬元時的獎金*/

elseif(i<=600000)

bonus=bon4+(i-400000)*0.03;/*利潤在40萬至60萬元時的獎金*/

elseif(i<=1000000)

bonus=bon6+(i-600000)*0.015;/*利潤在60萬至100萬元時的獎金*/

else

bonus=bon10+(i-1000000)*0.01;/*利潤在100萬元以上時的獎金*/

printf("獎金是%10.2f\n",bonus);

此題的關(guān)鍵在于正確寫出每一區(qū)間的獎金計算公式。例如利潤在10萬元至

20萬時,獎金應(yīng)由兩部分組成:①利潤為10萬元時應(yīng)得的獎金。即100000*0.1;

②10萬元以上部分應(yīng)得的獎金。即(num-100000)*0.075。同理,20萬?40萬這

個區(qū)間的獎金也應(yīng)由兩部分組成:JD利潤為20萬元時應(yīng)得的獎金,即

100000*0.1*10萬*0.075;②20萬元以上部分應(yīng)得的獎金,即(num-200000)*0.05。

程序中先把10萬、20萬、40萬、60萬、100萬各關(guān)鍵點的獎金計算出來,即

bonl>bon2>bon4、bon6、honlO;然后再加上各區(qū)間附加部分的獎金。

(2)用switch語句編程序。

輸入利潤i,確定相應(yīng)的提成等級branch

#include<stdio.h>

main()

{longi;

floatbonus,bonl,bon2,bon4,bon6,bon10;

intc;

bonl=100000*0.1;

bon2=bon1+100000*0.075;

bon4=bon2+200000*0.05;

bon6=bon4+200000*0.03;

bon10=bon6+400000*0.015;

printf("請輸入利潤i:”);

scanf(n%ldH,&i);

c=i/100000;

if(c>10)c=10;

switch(c)

{case0:bonus=l*0.1;break;

case1:bonus=bon1+(i-100000)*0.075;break;

case2:

case3:bonus=bon2+(i-200000)*0.05;break;

case4:

case5:bonus=bon4+(i-400000)*0.03;break;

case6:

case7:

case8:

case9:bonus=bon6+(i-600000)*0.015;break;

case10:bonus=bon10+(i-1000000)*0.01;

)

printf("獎金是%10.2f,bonus);

)

【習題3-23]:

#include<stdio.h>

main()

{intt,a,b,c,d;

printf-請輸入4個整數(shù):”);

scanf(n%d,%d,%d,%dn,&a,&b,&c,&d);

printf(H\na=%d,b=%d,c=%d,d=%d\n,,,a,b,c,d);

ififa>b){t=a;a=b;b=t;}

if(a>c){t=a;a=c;c=t;}

ififa>d){t=a;a=d;d=t;}

ififb>c){t=a;b=c;c=t;}

if(b>d){t=b;b=d;d=t;}

if(c>d){t=c;c=d;d=t;}

printf("排序結(jié)果如下:\nH);

printf(H%d,%d,%d,%d\nn,a,b,c,d);

)

【習題3-24]:

#include<stdio.h>

main()

{intp,r,n,m,temp;

printf("請輸入兩個正整數(shù)n,m:");

scanf(,!%d,%dn,&n,&m);

if(n<m)

{temp=n;n=m;m=temp;}/*把大數(shù)放在n中,小數(shù)放在m中*/

p=n*m;/*先將n和m的乘積保存在p中,以便求最小公倍數(shù)時用*/

while(m!=O)/*求n和m的最大公約數(shù)*/

{r=n%m;

n=m;

m=r;

)

printf("它們的最大公約數(shù)為:%d\n\n);

printf(”它們的最小公倍數(shù)為:%d\nu,p/n);/*P是原來兩個整數(shù)的乘積*/

}

【習題3-25]:

#include<stdio.h>

main()

{charc;

intIetter=0,space=0,digit=0,other=0;

printff請輸入一行字符:\n)

while((c=getchar())!=,\n,)

{if(c>-a,&&c<-z,||c>-A^&^-z*)letter-H-;

else*)space";

elseif(c>=U&&cv=9)digit";

elseother-H-;

)

printf("字母數(shù)=%d,空格數(shù)=%d,數(shù)字數(shù)=%d,其他字符數(shù)'

=%d\nn,letter,space,digit,other);

)

【習題3-26]:

#include<stdio.h>

mainO

(

inta,b,x,y;

scanf(〃%d,%d〃,&a,&b);

x=a*a+b*b;

if(x>100){y=x/100;printfC%d,z,y);}

elseprintf(〃%d〃,a*a+b*b);

)

【習題3-27】:

#include<stdio.h>

mainO

(

intx;

scanf(〃%d,〃,&x);

if(x%5==0&&x%7==0)printf(〃Yes〃);

elseprintf(〃No.〃);

)

【習題3-28]:

#include<stdio.h>

mainO

(

intx;

floaty;

scanf(〃%d,",&x);

if(x<0)y=0;

elseif(x>0&&x<=10)y=x;

elseif(x>10&&x<=20)y=10;

elseif(x>20&&x<40)y=-0.5*x+20;

elsey=-l;

if(y!=-l)printfC%r,y);

elseprintf("Error!\n〃);

)

【習題3-29]:

#include<stdio.h>

mainO

(

intx;

scanf(〃%d,〃,&x);

if((x%3==0)&&(x%5==0)&&(x%7==0))

printf(z,%dcanbedividedby3,5,7\n〃,x);

elseif((x%3==0)&&(x%5==0))

printf(/z%dcanbedividedby3,5,\n〃,x);

elseif((x%3==0)&&(x%7==0))

printf(z/%dcanbedividedby3,7\n〃,x);

elseif((x%5==0)&&(x%7==0))

printf(z/%dcanbedividedby5,7\n〃,x);

elseif(x%3==0)

printf(zz%dcanbedividedby3\n〃,x);

elseif(x%5==0)

printf(zz%dcanbedividedby5\n〃,x);

elseif(x%7==0)

printf(zz%dcanbedividedby7\n〃,x);

elseprintf(〃%dcannotbedividedby3,5,7\n〃,x);

【習題3-30】:

#include<stdio.h>

mainO

(

floatx;

inty;

printf(〃\ninputx:〃);

scanf&x);

switch(x<0)

case1:y="l;break;

case0:switch(x==0)

{case1:y=0;break;

defaut:y=l;

)

)

printfC\ny=%d",y);

)

【習題3-31]:

#include<stdio.h>

mainO

{

intscore,temp,log;chargrade;

log=l;

while(log)

{

printf("enterscore:z,);

scanf(〃%d〃,&score);

if(score>1001|score<0)

printf(z/\nerror,tryagain!\n,z);

elselog=0;

if(score==100)temp=9;

elsetemp=(score-score%10)/IO;

switch(temp)

(

case0:

case1:

case2:

case3:

case4:

case5:grade='E';break;

case6:grade='D';break;

case7:grade='C';break;

case8:grade='B';break;

case9:grade='A';break;

)

printf(z/score=%d,grade=%c\nz,,score,grade);

}

【習題3?32】:

#include<stdio.h>

main()

(

inta,b;

charsymbol;

printfCpleaseenter:");

scanf(/z%d%c%di〃,&a,&symbol,&b);

printf("Originalvalue:%d%c%di\n,,,a,symbol,b);

if(symbol二二'」)

symbol=,+,;

elsesymbol='-';

z,,,

printf(Newvalue:%d%c%di)a,symbol,b);

)

【習題3?33]:

#include<stdio.h>

main()

{inta,n,i=l,sn=0,tn=0;

printf(ua,n=:");

scanf(M%d,%dn,&a,&n);

while(i<=n)

{tn=tn+a;/*賦值后的tn為i個a組成數(shù)的值*/

sn=sn+tn;/*賦值后的sn為多項式前i項之和*/

a=a*10;

++i;

}

printf(Ha+aa+aaa+...=%d\nn,sn);

【習題3-34]:

#include<stdio.h>

main()

{floats=O,t=l;

intn;

fdr(n=l;n<=20;n++)

{t=t*n;/*求n!*/

s=s+t;/*將各項累加*/

)

printfC'l!+2!+...+20!=%e\n",s);

)

【習題3-35]:

#include<stdio.h>

main()

{intnl=100,n2=50,n3=10;

floatk;

floatsl=0,s2=0,s3=0;

fbr(k=l;k<=n1;k++)/*計算1到100的和*/

sl=sl+k;

fbr(k=l;k<=n2;k++)/*計算1到50各數(shù)的平方和*/

s2=s2+k*k;

fdr(k=1;k<=n3;k++)/*計算1到10各數(shù)的倒數(shù)和*/

s3=s3+l/k;

printf("總和=%8.2血”上1+s2+s3);

【習題3-36]:

#include<stdio.h>

main()

{inti,j,k,n;

printf("“水仙花"數(shù)是:");

fdr(n=100;n<1000;n++)

{i=n/100;

j=n/10-i*10;

k=n%10;

if(n==i*i*i+j*j*j+k*k*k)

printf(n%4d,\n);

)

printf(n\nn);

)

【習題3-37】:

#include<stdio.h>

main()

intday=O,num=2;

floatsum=0.0,ave;

while(num〈二100)

(

sum+=0.8*num;

day++;num*=2;

)

ave=sum/day;

printf(/z\nave=%5.2f〃,ave);

)

【習題3-38]:

#include<stdio.h>

mainO

(

inti;

for(i=l;i<100;i++)

if(i*i%10==i||i*i%100==i)

printf(〃%3d〃,i);

}

【習題3?39]參考答案:

#include<stdio.h>

main()

(

inti,x,y;

longlast=l;

printf(z,Inputx,y:〃);

scanf(〃%d,%d〃,&x,&y);

for(i=l;i<=y;i++)

last=last*x%1000;

printf(Z/The3digits:ld\n,/,last);

)

【習題3-40]:

方法一:程序如下

SdefineM1000/*定義尋找范圍*/

Sinclude<stdio.h>

main()

{intk1,k2,k3,k4,k5,k6,k7,k8,k9,k10;

inti,a,n,s;

for(a=2;a<=M;a++)/*a是2-1000之間的整數(shù).檢查它是否完數(shù)*/

{n=0;/*n用來累計a的因子的個數(shù)*/

s=a;/*s用來存放尚未求出的因子之和,開始時等于a*/

fbr(i=l;i<a;i++)/*檢查i是否a的因子*/

if(a%i==0)/*如果i是a的因子*/

{n++;/*n加1,表示新找到一個因子*/

/*S減去已找到的因子,s的新值是尚未求出的因子之和*/

switch(n)/*將找到的因子賦給kl,...,klO*/

{case1:kl=i;break;/*找出的第1個因子賦給kl*/

case2:k2=i;break;/*找出的第2個因子賦給k2*/

case3:k3=i;break;/*找出的第3個因子賦給k2*/

case4:k4=i;break;/*找出的第4個因子賦給k4*/

case5:k5=i;break;/*找出的第5個因子賦給k5*/

case6:k6=i;break;/*找出的第6個因子賦給k6*/

case7:k7=i;break;/*找出的第7個因子賦給k7*/

case8:k8=i;break;/*找出的第8個因子賦給k8*/

case9:k9=i;break;/*找出的第9個因子賦給k9*/

case10:kl0=i;break;/*找出的第10個因子賦給klO*/

)

if(s==O)/*s=0表示全部因子都已找到*/

{printf("%dItsfactorsare",a);

if(n>1)printf("%d,%d",k1,k2);/*n>l表示a至少有2個因子*/

if(n>2)printf(",%d",k3);/*n>2至少有3個因子,故應(yīng)再輸出1因子*/

if(n>3)printf(",%d",k4);/*以下類似*/

if(n>4)printf(",%d",k5);

if(n>5)printf(",%d",k6);

if(n>6)printf(",%d",k7);

if(n>7)printf(",%d",k8);

if(n>8)printf(",%d",k9);

if(n>9)printf(",%d",kl0);

printf("\n");

方法二:程序如下

#include<stdio.h>

main()

{intm,s,i;

fbr(m=2;m<1000;m++)

{s=0;

fbr(i=l;i<m;i++)

if((m%i)==0)s=s+i;

if(s==m)

{printf("%dItsfactorsare",m);

fdr(i=l;i<m;i++)

if(m%i=O)printf("%d,",i);

printf("\b\n");

)

方法三:此題用數(shù)組方法更為簡單。程序如下

#include<stdio.h>

main()

{intk[100];

inti,a,n,s;

for(a=2;a<1000;a-H-)

{n=0;

s=a;

fbr(i=l;i<a;i++)

if((a%i)=O)

{n++;

s=s-i;

k[n]=i;/*將找到的因子賦給k[l]),...,k[10]*/

)

if(s==O)

{printf(,,%dItsfactorsareH,a);

fdr(i=l;i<n;i4-+)

HH

printf(%d,9k[i]);

printf(!,%d\nn,k[n]);

)

}

)

【習題3-41]:

ttinclude<stdio.h>

main()

{inti,t,n=20;

floata=2,b=l,s=0;

for(i=l;i<=n;i++)

{s=s+a/b;

t=a;

a=a+b;/*將前一項分子與分母之和作為下一項的分子*/

b=t;/*將前一項的分子作為下一項的分母*/

)

printf(//sum=%9.6f\n",s);

)

【習題3-42]:

Sinclude<stdio.h>

mainO

{floatsn=100,hn=sn/2;

intn;

for(n=2;n<=10;n++)

{sn=sn+2*hn;/*第n次落地時共經(jīng)過的米數(shù)*/

hn=hn/2;/*第n次反彈的高度*/

printf("第10次落地時共經(jīng)過%fm。\n",sn);

printf("第10次反彈%fm。\n",hn);

【習題3-43]:

#include<stdio.h>

main()

{intday,xl,x2;

day=9;

x2=l;

while(day>0)

{xl=(x2+l)*2;/*第1天的桃子數(shù)是第2天桃子數(shù)加1后的2倍*/

x2=xl;

day一;

)

printf("total=%d\n”,xl)

f

【習題3-44】:

Winclude<stdio.h>

main()

{inti,j,k;

for(i=0;i<=3;i++)/*輸出上面4行*號*/

{for(j=0;j<=2-i;j++)/*輸出*號前面的空格*/

printf(z/");

for(k=0;k<=2*i;k++)/*輸出*號*/

printf("*");

printf('\n");/*輸出完i彳丁*號后換行*/

)

for(i=0;i<=2;i++)/*輸出下面3行*號*/

{for(j=0;j<=i;j++)

printf(z/");/*輸出*號前面的空格*/

for(k=0;k<=4-2*i;k++)/*輸出*號*/

printf。*");

printf("\n");/*輸出完一行*號后換行*/

【習題3-451參考答案:

用迭代法求平方根的算法如下:

(1)設(shè)定一個x的初值xO;

(2)用上述公式求出x的下一個值xl;

(3)再將xl代人上述公式,求出x的下一個值x2;

(4)如此繼續(xù)下去,直到前后兩次求出的x值(xn+1和xn)滿足以下關(guān)系:

Ixn+l-xn|<10-5

為了便于程序處理,今只用變量xO和xl,先令x的初值x0=a/2(也可以是

另外的值),求出xl;如果此時Ixl-xOI>10-5,則使xl—xO,然后用這個新

的xO求出下一個xl,如此反復(fù),直到Ixl-xO|<10-5為止。

#include<stdio.h>

#include<math.h>

mainO

{floata,xO,xl;

printf("Enterapositivenumber:");

scanf(緝f”,&a);/*輸入a的值*/

x0=a/2;

xl=(xO+a/xO)/2;

do

{xO=xl;

xl=(xO+a/xO)/2;

)

while(fabs(xO-xl)>=le-5);

printf(z,Thesquarerootof%5.2fis%8.5f\nz,,a,xl);

【習題3-46】:牛頓迭代法又稱牛頓切線法。它采用以下的方法求根:先任意設(shè)

定一個與真實的根接近的值xO作為第一次近似根,由xO求出f(xO),過(xO,f(xO))

點做f(x)的切線,交x軸于xl,把它作為第二次近似根,再由xl求出f(xl),過

(xl,f(xl))點做f(x)的切線,交x軸于x2,求出f(x2);再作切線……如此繼續(xù)下去,

直到足夠接近真正的根x*為止,,見圖3.1。

從圖3.1可以看出,

f(xO)=f(xO)/(xl-xO)

因此:xl=xO-f(xO)/f,(xO)

這就是牛頓迭代公式。可以利用它由xO求出xl,然后再由x2求出x3

設(shè)f(x)=2x-4x+3x-6

可以寫成以下形式:f(x)=[(2x-4)x+3]x-6

同樣,f'(x)可寫成:f*(x)=6x--8x+3=(6x-8)x+3

用這種方法表示的表達式,在運算時可節(jié)省時間。例如求f(x)只需要進行3

次乘法和3次加法,而原來的表達式要經(jīng)過多次指數(shù)運算、對數(shù)運算和乘法、加

法運算,花費時間較多?,F(xiàn)在由于計算機的運算速度愈來愈快,這點時間開銷是

微不足道的,這是以前計算機的運算速度較慢時所提出的問題。由于過去編寫的

程序往往采用這種形式,所以我們在此也順便介紹一下,以便在閱讀別人所寫的

程序時知道其所以然。

#include<stdio.h>

Sinclude<math.h>

main()

{floatx,xO,f,fl;

x=l.5;

do

{xO=x;

f=((2*x0-4)*x0+3)*x0-6;

fl=(6*x0-8)*x0+3;

x=xO-f/fl;

}while(fabs(x-xO)>=le-5);

/?,,

printf(Therootofequationis%5.2f\nJx);

)

為了便于循環(huán)處理,程序中只設(shè)了xO和x,xO代表前一次的近似根,x代

表后一次的近似根。求出一個x后,把它的值賦給xO,然后用它求下一個xO由

于第一次執(zhí)行循環(huán)體時,需要對xO賦值,故在開始時應(yīng)先對x賦一個初值(今為

1.5,也可以是接近真實根的其他值)。

【習題3-47]:

先分析題目。按題意,畫出圖3.2的示意圖。

圖中帶“X”符號的虛線表示不允許的組合。從圖中可以看到:①X既不

與A比賽,又不與C比賽,必然與B比賽;②C既不與X比賽,又不與Z比賽,

必然與y比賽;③A只能與Z比賽,見圖3.3。

以上是經(jīng)過邏輯推理得到的結(jié)論。用計算機程序處理此問題時,不可能立即

就得出此結(jié)論,而必須對所有組合一一檢驗,看它們是否符合條件。

開始設(shè)計程序時,并不知道A、B、C與X、Y、Z中的哪一個進行比賽,可以

假設(shè):A與i比賽,B與j比賽,C與k比賽;即:

A—i

B-j

C-k

i、j、k分別是X、Y、Z之一,且i、j、k互不相等(一個隊員不能與對方的

兩個隊員比賽)。N-S圖見圖3.4。

其中,外循環(huán)使i由X變到Z,中循環(huán)使j由X變到9(但i不應(yīng)與j相等)。

然后,對每一組i、j的值,找符合條件的k值。k同樣也可能是,X、V、Z之一。

但k也不應(yīng)與i或j相等。在由業(yè)的條件下,把i/X,和印X似及KZ的i、j、k

的值輸出即可。

#include<stdio.h>

main()

{chari,j,k;/*i是a的對手;j是b的對手;k是c的對手*/

for(i='X';i<='Z';i-H-)

fbr(j='X';j<='Z';j++)

if(i!=j)

for(k='X';k<='Z';k++)

if(i!=k&&j!=k)

if(i!='X'&&k!='X'&&k!='Z')

printf("A—%c\tB—%c\tC—%c\n",i,j,k);

說明:

(1)整個執(zhí)行部分只有一個語句,所以只在語句的最后有一個分號。請讀者

弄清楚循環(huán)和選擇結(jié)構(gòu)的嵌套關(guān)系。

(2)分析最下面一個if語句中的條件:i#'x',k#'x','k'r'z',因為我

們已事先假定A—i,B-j,c—k,由于題目規(guī)定A不與X對抗,因此i不能等

于'X';同理,C不與X、Z對抗,因此k不應(yīng)等于'X'和'Z'。

⑶題目給的是A、B、C、X、Y、Z,而程序中用了加撇號的字符常量‘X'、'Y'、

'Z',這是為什么?這是為了在運行時能直接打印出字符'A'、'B'、'C'、'X'、

‘Y'、’Z',以表示三組對抗的情況。

習題四參考答案:

一、單項選擇題

【習題4-1】~【習題4-7】ACDBBBD

二、判斷題(正確用義錯誤用J標記)

【習題4-8]?【習題4-13】XVXVVV

三、閱讀程序?qū)懡Y(jié)果或填空

【習題4-14】s=10,t=25

【習題4-1511:resultis4

2:resultis6

3:resultis8

【習題4-16]s=16

【習題4-17】10

【習題4-1817

【習題4-19]x=9

【習題4-20】12

【習題4-21]static

【習題4-22】51

【習題4-23]3

四、程序設(shè)計題

【習題4-24]

doublefunc(intn,floatx)

{if(n==0)return1;

elsereturnfunc(n-l,x)+n*pow(x,n);

)

【習題4-25]

PRTStar(charc,intn)

{if(n>0){printf("%c",c);PRTStar(c,n-l);}

main()

{inti,n;

scanf("%d",&n);

for(i=l;i<=n;i++)

{PRTStarC',n-i);/*輸出每行左端空格*/

PRTStar('*',2*i-l);/*輸出每行的*號*/

printf("\n");

)

【習題4-26]

從楊輝三角形的特點出發(fā),可以總結(jié)出:

⑴第N行有N+1個值(設(shè)起始行為第0行);

⑵對于第N行的第J個值:(N>=2)

當J=1或上附1時:其值為1

當J!=l且J!=N+1時:其值為第N-1行的第J-1個值與第N-1行第J個值之和。

將這些特點提煉成數(shù)學公式可表示為:

c(x,y)=1當x=l或x=N+l

c(x,y)=c(x-l,y-l)+c(x-l,y)其它

程序如下:

intc(intx,inty)

{if((y==l)||(y==x+l))retum(l);

elsereturnc(x-l,y-l)+c(x-l,y);

}

main()

{inti,j,n=13;

printf(MN=n);

while(n>12)scanf(n%dn,&n);

fbr(i=O;i<=n;i++)

{for(j=0;jvn-i;j++)printf("");/*每行開始3*(n-i)個空格*/

fdr(j=ly<i+2;j+4-)printf(H%6dH,c(i,j));/*每行輸出i+1個數(shù)*/

printf(”\n");

)

【習題4-27】

main()

{longk=2,N=l;

floatf=l,S=O;

while(N<=lE6)

{S+=f7N;

自-f;

N=N*k-H-;

)

printffS=%f\n”,S);

【習題4-28]

intIsPrime(intx)

{intk;

fbr(k=2;k<=x/2;k-H-)

if(x%k=0)break;

if(k>x/2)return1;

elsereturn0;

}

main()

{intk;

for(k=99;k>=l;k-)

if(IsPrime(k))printf(n%d;\k);

習題五參考答案:

一、單項選擇題

【習題5-1】?【習題5-8】DCABBDCA

二、閱讀程序?qū)懡Y(jié)果或填空題

【習題5-9]?⑴二⑵4⑶'B'

【習題5-1015

【習題5-11]a[k][k]

【習題5-12[⑴a[0](2)a[k](3)t

【習題5-13]⑴b[j]⑵a[m]⑶k<12

【習題5-14】運行結(jié)果為:——--

KKKKKK

【習題5-151111

1234567890098T654321234806

a[0]=3

a[l]=2

【習題5-16]a[2]=3

a[3]=3

a[4]=3

a[5]=2

三、編寫程序題

【習題5-17】:

#include<stdio.h>

main()

(

inta[10],b[6],c[10];

intij,k,m;

fbr(m=0;m<10;m-H-)scanf(n%dn,&a[m]);

fbr(m=0;m<6;m-H-)scanf(n%dH,&b[m]);

printf(u\nn);

i=0;k=0;

while(i<10)

{for(j=0;j<6;j++)

if{a[i]==b[j])break;

if(j>=6){c[k]=a[i];k++;}

i++;

)

fbr(m=0;m<k;m++)printf(n%3dn,c[m]);

【習題5-18]:

#include<stdio.h>

main()

inta[3][4],s=0,m,n;

fbr(m=0;m<3;m++)

for(n=0;n<4;n++)scanf(,,%dn,&a[m][n]);

printf(n\nn);

fbr(m=0;m<3;m++)

s=s+a[m][O]+a[m][3];

fbr(n=l;n<3;n-H-)

s=s+a[0][n]+a[2][n];

printf(ns=%d\nM,s);

'【習題5/9】:

#include<stdio.h>

#include<string.h>

main()

(

chara[20],b[20];

intm,n,k,f;

gets(a);gets(b);

m=strlen(a);n=strlen(b);

k=0;

while((a[k]==b[k])&&k<m&&k<n)k++;

if(k==m&&k==n)f^O;

elseif(a[k]<b[k])f

elsef=l;

printf(n%d\nn,f);

習題5?20]:

#include<stdio.h>

#include<string.h>

main()

(

chars[20],t;

intk,n=0;

gets(s);

fbr(k=O;k<strlen(s);k++)

if((s[k]>-A,&&s[k]<-Z,)||(s[k]>=,a,&&s[k]<-z*))n++;

printf(,,\nn=%d\n,1,n);

【習題5-21]:

#include<stdio.h>

main()

(

inta[10],k,m,n,j;

for(j=0;j<10;j++)scanf(,,%dn,&a|j]);

printff'inputk:");

scanf(,,%d,,,&k);

n=9;

do{

for(j=0;j<n;j++)

if(a[j]==k)break;

if(j>=n)break;

else{

for(m=j;m<n-1;m++)

a[m]=a[m+l];

n=n-l;

)

}while(l);

printff'\nnewarray:\n,f);

for(j=0;j<n;j-H-)printf(,,%4d,,,a|j]);

printffW");

習題六參考答案:

一、單項選擇題【習題6-1】?【習題6-10]BDACBDACCD

二、閱讀下列程序,填空或給出程序運行結(jié)果。

【習題6-11]num=*b,num=*c

【習題6-12]*pl++,*p2

【習題6-13]*(a+j),a+j

【習題6-14]87654321

【習題6-15]2,3,4,5,6.

【習題6-16】1711717

【習題6-17]ga

三、編寫程序程題

【習題6-18]

#include"stdio.h"

voidmain()

{inta[10]={3,42,6,12,33,55,25,45,76,93);

inti,j,k,x,*p;

scanf("%d",&k);

p=a;

if(k>0&&k<10)

for(i=0;i<k;i++)

{x=*(p+9);

forG=9;j>0;j-)

*(p+j)=*(p+j-l);

*p=x;

fbr(i=0;i<10;i-H-)

printf(n%dH,a[i]);

}

【習題6-19]

#include"stdio.h"

#include,alloc.h"

voidmain()

{inta[3][3]={42,6,12,33,55,25,45,76,93};

intij,*sum;

sum=(int*)malloc(3*sizeof(int));

fbr(i=0;i<3;i++)

|

for(j=0;j<3;j++)

*(sum+i)+=a[i][j];

)

for(i=0;i<3;i+

溫馨提示

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

評論

0/150

提交評論