C语言程序设计课后习题答案(主编:胡宏智)_第1页
C语言程序设计课后习题答案(主编:胡宏智)_第2页
C语言程序设计课后习题答案(主编:胡宏智)_第3页
C语言程序设计课后习题答案(主编:胡宏智)_第4页
C语言程序设计课后习题答案(主编:胡宏智)_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题参考答案

习题一参考答案:

【习题1-1]ABCD

【习题1-2]C

【习题1-3]B

【习题1-4]B

【习题1-5]略

习题二参考答案:

一、单项选择题

【习题2-1】〜【习题2-6】:CCDBAA

二、简答题

【习题2-7】:

C语言提供了丰富的数据类型,可以根据这些数据类型构造出不同的数据结

构。C中的数据类型包括基本类型、构造类型、指针类型、空类型等。其中基本

类型包括整型、字符型、实型(浮点型)等。

【习题2-8】:

C中整常数的表示

整型常量即整常数。C整常数可用以下三种形式表示:

①十进制整数;

②八进制整数。以数字0开头的数是八进制数,如0123表示八进制数123;

③十六进制整数。以Ox开头的数是十六进制数。如0x123,代表十六进制

数123o

【习题2-9】:

C规定对所有的变量要“先定义,后使用”,这样规定有以下好处:

(1)便于纠错;

(2)便于编译系统为变量分配存储空间;

(3)运算合法性检查。

【习题2-10]:

C语句可以分为以下五类:

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

(2).函数调用语句;

(3)表达式语句;

(4)空语句;

(5)可以用{}把一些语句括起来成为复合语句。

C只有9种控制语句,它们是:

(1)if()〜else〜(条件语句)

(2)for()〜(转向语句)

(3)while()~(循环语句)

(4)do〜while()(循环语句)

(5)continue(结束本次循环语句)

(6)break(中止执行switch或循环语句)

(7)switch(多分支选择语句)

(8)goto(转向语句)

(9)return(从函数返回语句)

【习题2-11]:

表达式不是独立存在的,它存在于其它表达式、语句、函数参数里,表达式

后面加上一个分号,就变成表达式语句,如

i=i+l(是表达式,不是语句)

i=i+l;(是语句)

表达式能构成语句是C语言的一个特色。其实“函数调用语句”也是属于表达

式语句,因为函数调用也属于表达式的一种,只是为了便于理解和使用,我们把

“函数调用语句”和“表达式语句”分开来说明。由于C程序中大多数语句是

表达式语句(包括函数调用语句),所以有人把C语言称作“表达式语言”。

【习题2-12]:

字符常量就是一个字符,用单引号括起来,占一个字节;而字符串常量是由

若干个字符组合而成,用双引号括起来,存贮时自动在后面加“\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

三、阅读程序写结果或填空

【习题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语句输出结果为:\nn);

putchar(cl);

putchar(,,);

putchar(c2);

printf("用printf语句输出结果为:\n");

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

(1)都可以;

(2)用printf。函数;

(3)不是在任何情况下,因为char只有一个字节,而int有2个字节。能表示

的范围不一样。

【习题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】:

程序解决问题是按指定的次序执行一系列操作的结果,按照次序执行操作的

过程描述称为算法。

算法的特性:(1)有穷性;(2)确定性;(3)有零个或多个输入;(4)有一个或多

个输出;(5)有效性。

举例:菜谱操作步骤、乐谱、施工图纸等等。

【习题3-9】:

(1)自然语言,(2)伪代码,(3)流程图,(4)计算机语言。

自然语言通俗易懂,但有歧义性;伪代码方便实用,但没有流程图明晰,容

易犯逻辑错误;流程图明晰但绘制和修改时比较繁琐;计算机语言表示算法严谨,

但无法做到算法设计的第一步就使用计算机语言,读程序比看流程图要费神很

多。

【习题3-10]:

顺序结构,由顺序执行的一组语句或者结构组成。(2)分支结构,根据判断

条件,做出取舍,要么执行A分支要么执行B分支,必须执行其中的一个,

不可全执行也不可全不执行。(3)循环结构,由需要反复执行的一段代码或

者结构组成。任何算法功能都可以通过以上三种基本程序结构的组合来实

现。

【习题3-11]:非0为真,0为假。

三、用传统流程图表示求解以下问题的算法。

【习题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

(结束)

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;

/*分别代表个位、十位、百位、千位、万位和位数*/

printf(”请输入一个整数(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反序数字为;”);

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反序数字为:”);

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

break;

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

printf("\n反序数字为:");

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

break;

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

printf("\n反序数字为:");

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

break;

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

printf("\n反序数字为:");

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万元以内按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);

此题的关键在于正确写出每一区间的奖金计算公式。例如利润在10万元至

20万时,奖金应由两部分组成:①利润为10万元时应得的奖金。即100000*0.1;

②10万元以上部分应得的奖金。即(num-100000)*0.075。同理,20万〜40万这

个区间的奖金也应由两部分组成:JD利润为20万元时应得的奖金,即

100000*0.1*10万*0.075;②20万元以上部分应得的奖金,即(num-200000)*0.05。

程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即

bonl>bon2>bon4、bon6、honlO;然后再加上各区间附加部分的奖金。

(2)用switch语句编程序。

输入利润i,确定相应的提成等级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个整数:”);

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("排序结果如下:\nH);

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

)

【习题3-24]:

#include<stdio.h>

main()

{intp,r,n,m,temp;

printf("请输入两个正整数n,m:");

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

if(n<m)

{temp=n;n=m;m=temp;}/*把大数放在n中,小数放在m中*/

p=n*m;/*先将n和m的乘积保存在p中,以便求最小公倍数时用*/

while(m!=O)/*求n和m的最大公约数*/

{r=n%m;

n=m;

m=r;

)

printf("它们的最大公约数为:%d\n\n);

printf(”它们的最小公倍数为:%d\nu,p/n);/*P是原来两个整数的乘积*/

}

【习题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("字母数=%d,空格数=%d,数字数=%d,其他字符数'

=%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组成数的值*/

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各数的平方和*/

s2=s2+k*k;

fdr(k=1;k<=n3;k++)/*计算1到10各数的倒数和*/

s3=s3+l/k;

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

【习题3-36]:

#include<stdio.h>

main()

{inti,j,k,n;

printf("“水仙花"数是:");

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之间的整数.检查它是否完数*/

{n=0;/*n用来累计a的因子的个数*/

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个因子,故应再输出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");

)

方法三:此题用数组方法更为简单。程序如下

#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次落地时共经过的米数*/

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

printf("第10次落地时共经过%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天的桃子数是第2天桃子数加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)设定一个x的初值xO;

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

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

(4)如此继续下去,直到前后两次求出的x值(xn+1和xn)满足以下关系:

Ixn+l-xn|<10-5

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

另外的值),求出xl;如果此时Ixl-xOI>10-5,则使xl—xO,然后用这个新

的xO求出下一个xl,如此反复,直到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】:牛顿迭代法又称牛顿切线法。它采用以下的方法求根:先任意设

定一个与真实的根接近的值xO作为第一次近似根,由xO求出f(xO),过(xO,f(xO))

点做f(x)的切线,交x轴于xl,把它作为第二次近似根,再由xl求出f(xl),过

(xl,f(xl))点做f(x)的切线,交x轴于x2,求出f(x2);再作切线……如此继续下去,

直到足够接近真正的根x*为止,,见图3.1。

从图3.1可以看出,

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

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

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

设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

用这种方法表示的表达式,在运算时可节省时间。例如求f(x)只需要进行3

次乘法和3次加法,而原来的表达式要经过多次指数运算、对数运算和乘法、加

法运算,花费时间较多。现在由于计算机的运算速度愈来愈快,这点时间开销是

微不足道的,这是以前计算机的运算速度较慢时所提出的问题。由于过去编写的

程序往往采用这种形式,所以我们在此也顺便介绍一下,以便在阅读别人所写的

程序时知道其所以然。

#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);

)

为了便于循环处理,程序中只设了xO和x,xO代表前一次的近似根,x代

表后一次的近似根。求出一个x后,把它的值赋给xO,然后用它求下一个xO由

于第一次执行循环体时,需要对xO赋值,故在开始时应先对x赋一个初值(今为

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

【习题3-47]:

先分析题目。按题意,画出图3.2的示意图。

图中带“X”符号的虚线表示不允许的组合。从图中可以看到:①X既不

与A比赛,又不与C比赛,必然与B比赛;②C既不与X比赛,又不与Z比赛,

必然与y比赛;③A只能与Z比赛,见图3.3。

以上是经过逻辑推理得到的结论。用计算机程序处理此问题时,不可能立即

就得出此结论,而必须对所有组合一一检验,看它们是否符合条件。

开始设计程序时,并不知道A、B、C与X、Y、Z中的哪一个进行比赛,可以

假设: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。

其中,外循环使i由X变到Z,中循环使j由X变到9(但i不应与j相等)。

然后,对每一组i、j的值,找符合条件的k值。k同样也可能是,X、V、Z之一。

但k也不应与i或j相等。在由业的条件下,把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)整个执行部分只有一个语句,所以只在语句的最后有一个分号。请读者

弄清楚循环和选择结构的嵌套关系。

(2)分析最下面一个if语句中的条件:i#'x',k#'x','k'r'z',因为我

们已事先假定A—i,B-j,c—k,由于题目规定A不与X对抗,因此i不能等

于'X';同理,C不与X、Z对抗,因此k不应等于'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

三、阅读程序写结果或填空

【习题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

四、程序设计题

【习题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]

从杨辉三角形的特点出发,可以总结出:

⑴第N行有N+1个值(设起始行为第0行);

⑵对于第N行的第J个值:(N>=2)

当J=1或上附1时:其值为1

当J!=l且J!=N+1时:其值为第N-1行的第J-1个值与第N-1行第J个值之和。

将这些特点提炼成数学公式可表示为:

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个数*/

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

二、阅读程序写结果或填空题

【习题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】运行结果为:——--

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

二、阅读下列程序,填空或给出程序运行结果。

【习题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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论