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

下载本文档

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

文档简介

C语言程序设计课后习题答案(主编:胡宏智)

习题参考答案

习题一参考答案:

【习题IT】ABCD

【习题1-2]C

【习题1-31B

【习题1-4】B

【习题1-5]略

习题二参考答案:

一、单项选择题

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

二、简答题

【习题2-7】:

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

数据类型包括基本类型、构造类型、指针类型、空类型等。其中基本类型包括整型、字符

型、实型(浮点型)等。

【习题2-8】:

C中整常数的表示

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

1十进制整数;O

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

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

数123«

【习题2-9】:

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

(1)便于纠错;

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

(3)运算合法性检查。

【习题2701:

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

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

(2).函数调用语句;

(3)表达式语句;

(4)空语句;

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

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

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

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

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

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

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

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

附录第1页共36页(7)switch(多分支选择语句)

(8)goto(转向语句)

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

【习题2-11】:

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

个分号,就变成表达式语句,如

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

i=i+l;(是语句)

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

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

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

句),所以有人把C语言称作“表达式语言”。

【习题2-12]:

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

组合而成,用双引号括起来,存贮时自动在后面加“\0”,即使同样是一个字符,字符串

常量后面还要加一个“\0”。

【习题2-13]:

(1)12,a;(2)40,20;(3)113,4b;(4)176627,fd97;(5)177621,ff91;(6)4663,9b3;(7)1100

22,9012;(8)51013,520b。

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

【习题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,ffff,-1

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页共36页【习题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(〃C1二%.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(〃摄氏度

为:为・2f\n〃,c);

)

【习题2-25]

#include〃stdio.h〃

main()

{charcl,c2;

printf("请输入两个字符cl,c2:\n");

cl=getchar();

c2=getchar();

printf(“用putchar语句输出结果为:\n〃);

putchar(cl);

putchar;

putchar(c2);

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

printf(z,\n%c%c\n”,cl,c2);

(1)都可以;

⑵用printf()函数;

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

一样。

【习题2-26】:

#include<stdio.h>

ftdefinePI3.14159

main()

附录第3页共36页{

floatr,h,cl,cs,cvz;

printf("Inputr,h:〃);

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

cl=2*PI*r;

cs=PI*r*r;

cvz=cs*h;

printf(,zThelengthofthecircumference:%6.2f\n/z,cl);

printf("areaofthecircle:%6.2f\ncs);

printf(^volumeofthecolumn:%6,2f\n〃,cvz);

)

【习题2-27】:

#include<stdio.h>

main()

charch;

printf("\nlnputaletter:z,);

scanf&ch);

printf(z/\nASCIItheletter:%d”,ch);

)

习题三参考答案:

一、单项选择题

【习题3T】~【习题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)循环结构,由需要反复执行的一段代码或者结构组成。任何算法功能都可以通过

以上三种基本程序结构的组合来实现。

附录第4页共36页【习题3-11]:非0为真,0为假。

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

【习题3T2】~【习题3T9]:如下图3-12~3-19所示。

开始输入a、b、cY

N

a>b

a与b互换

开始A-CB-ACfB结束

Y

a<c

Y

N

N

a>b

打印c>b、a

打印a、c、b打印a、b、c

(结束)

结束

3-123-133-14

其中的符号“一”表示“倒给”,例如“A-C”“将A瓶中的液体倒给C瓶”

附录第5页共36页

开始输入n

n被3整除

Yn被5整除打印:n能被3、5整除

N打印:n不能被3、5整除

3-153-163-17

开始a、b^cd=b2-4acY

N

deON

Y

xl,x2=-b/(2a)

d=0

xl=(-b+d)/(2a)xl=(-b-d)/(2a)p=-b/(2a)q=/(2a)

打印xl,x2

打Ep:xl=p+qix2=p-qi

结束

3-183-19

四、编写程序题【习题3-20]:

tfinclude<stdio.h>

附录第6页共36页

main()

{intx,y;

printf("输入x:");

scanf&x);

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

{y=x;

printf("x=%3d,y=x=%d\n”,x,y);

)

elseif(x<10)/*IWxTO*/

{y=2*xT;

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

)

else/*x,10*/

{y=3*x-ll;

printfCx=%3d,y=3*x-ll=%d\n”,x,y);

)

)

【习题3-21]:

ttinclude<stdio.h>

main()

{longintnum;

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

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

printf("请输入一个整数(0~99999):”);

scanf(绘ld〃,&num);

if(num>9999)place=5;

elseif(num>999)place=4;

elseif(num>99)place=3;

elseif(num>9)place=2;

elseplace=l;

printf("place=%d\n〃,place);

ten_thousandz:num/10000;

thousand二num/1000/10;

hundred=num/100%10;

ten=num%100/10;

indiv=num%10;

switch(place)

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

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

printf(z,%d%d%d%d%d\nz,,indiv,ten,hundred,thousand,ten_thousand);break;

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

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

printfC/%d%d%d%d\n,z,indiv,ten,hundred,thousand);

附录第7页共36页break;

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

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

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

break;

case2:printf(〃%d,%d〃,ten,indiv);

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

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

break;

case1:printf(,z%dz,,indiv);

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

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

break;

}

)

【习题3-22】:

(1)用if语句编程序。

ttinclude<stdio.h>

main()

{longi;

floatbonus,bonl,bon2,bon4,bon6,bonlO;

bonl=l00000*0.1;/*利润为10万元时的奖金*/

bon2=bonl+100000*0.075;/*利润为20万元时的奖金*/

bon4=bon2+200000*0.05;/*利润为40万元时的奖金*/

bon6=bon4+200000*0.03;/*利润为60万元时的奖金*/

bonl0=bon6+400000*0.015;/*利润为100万元时的奖金*/

printf("请输入利润i:");

scanf(绘ld〃,&i);

if(i<=100000)

bonus二i*0.1;/*利润在10万元以内按0.1提成奖金*/elseif(i<=200000)

bonus=bonl+(i-100000)*0.075;/*利润在10万至20万元时的奖金*/else

if(i<=400000)

bonus=bon2+(i-200000)*0.05;/*利润在20万至40万元时的奖金*/else

if(i<=600000)

bonus=bon4+(i-400000)*0.03;/*利润在40万至60万元时的奖金*/else

if(i<=1000000)

bonus=bon6+(i-600000)*0.015;/*利润在60万至100万元时的奖金*/else

bonus=bonl0+(iT000000)*0.01;/*利润在100万元以上时的奖金*/printf(〃奖金

是%10.2f\n〃,bonus);

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

页共36页20万时,奖金应由两部分组成:①利润为10万元时应得的奖金。即

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

万这个区间的奖金也应由两部分组成:①利润为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,bonlO;

intc;

bonl=l00000*0.1;

bon2=bonl+100000*0.075;

bon4=bon2+200000*0.05;

bon6=bon4+200000*0.03;

bonl0=bon6+400000*0.015;

printf(〃请输入利润i:〃);

scanf&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+(iT000000)*0.01;

)

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

【习题3-23】:

#include<stdio.h>

main()

{intt,a,b,c,d;

printf(〃请输入4个整数:〃);

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

附录第9页共36页printfC\na=%d,b=%d,c=%d,d=%d\n〃,a,b,c,d);

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

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

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

if(b>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(〃排序结果如下:\n〃);

printf(z/%d,%d,%d,%d\n〃,a,b,c,d);

)

【习题3-24]:

#include<stdio.h>

main()

{intp,r,n,m,temp;

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

scanf(〃%d,%d〃,&n,&m);

if(n<m)

{tempon;n=m;m=temp;}/*把大数放在n中,小数放在m中*/p=n*m;/*先将n和m

的乘积保存在P中,以便求最小公倍数时用*/while(m!=O)/*求n和m的最大公约数*/

{r=n%m;

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

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

【习题3-25】:

#include<stdio.h>

main()

{charc;

intletter=O,space=0,digit=0,other=0;

printf(〃请输入一行字符:\n〃);

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

{if(c>='a'&&c〈='z'||c>='A'&&c<='z')letter++;

elseif(c==,')space++;

elseif(c>='O'&&c〈二'9')digit++;

elseother++;

)

printf(〃字母数=%d,空格数或d,数字数二%d,其他字符数'

二%d\n〃,letter,space,digit,other);

【习题3-26]:

#include<stdio.h>

附录第10页共36页main。

(

inta,b,x,y;

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

x=a*a+b*b;

if(x>100){y=x/100;printfy);}elseprintf(〃%d〃,a*a+b*b);

}

【习题3-27]:

#include<stdio.h>

main()

(

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)printf(,z%r,y);

elseprintf("Error!\n〃);

)

【习题3-29]:

#include<stdio.h>

main()

(

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

printfC'%dcanbedividedby3,5,\n〃,x);

附录第11页共36页elseif((x%3==0)&&(x%7==0))

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

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

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

elseif(x%3==0)

printf(〃%dcanbedividedby3\rT,x);

elseif(x%5=0)

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

elseif(x%7==0)

printf(〃%dcanbedividedby7\nz,,x);

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

3-30]:

#include<stdio.h>

main()

(

floatx;

inty;

printf(z,\ninputx:");

scanf("%f",&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>

main()

(

intscore,temp,log;chargrade;

log=l;

while(log)

(

printf("enterscore:");

scanf(级d〃,&score);

if(score>100||score<0)

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

elselog=0;

)

附录第12页共36页【习题【习题if(score==100)temp=9;

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

switch(temp)

(

case0:

case1:

case2:

case3:

case4:

case5:grade='E';break;

case6:grade=,DJ;break;

case7:grade=,C,;break;

case8:grade='B';break;

case9:grade='A';break;

)

printf("score二%d,gradezz%c\nz,,score,grade);

)

【习题3-32]:

#include<stdio.h>

main()

(

inta,b;

charsymbol;

printfCpleaseenter/');

scanf(z/%d%c%di",&a,fesymbol,&b);

,,

printf(''Originalvalue:%d%c%di\n,a,symbol,b);if(symbol*-')

symbol='+,;

elsesymbol=';

printf(,zNewvalue:%d%c%di/z,a,symbol,b);

【习题3-33]:

ttinclude<stdio.h>

main()

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

printf(〃a,n二:〃);

scanf("%d,%dz,,&a,&n);

while(i<=n)

{tn=tn+a;/*赋值后的tn为i个a组成数的值*/sn=sn+tn;/*赋值后的sn为多项式

前i项之和*/a=a*10;

++i;

)

printf(〃a+aa+aaa+…=%d\n〃,sn);

附录第13页共36页}

【习题3-34]:

ttinclude<stdio.h>

main()

{floats=0,t=l;

intn;

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

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

s=s+t;/*将各项累加*/

printf("1!+2!+...+20!=%e\n”,s);

【习题3-35]:

#include<stdio.h>

main()

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

floatk;

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

for(k=l;k<=nl;k++)/*计算1到100的和*/sl=sl+k;

for(k=l;k<=n2;k++)/*计算1到50各数的平方和*/s2=s2+k*k;

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

printf(〃总和=%8.2f\n”,sl+s2+s3);

)

【习题3-36】:

#include<stdio.h>

main()

{inti,j,k,n;

printf(〃“水仙花”数是:〃);

for(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("%4d”,n);

printfCV);

【习题3-37]:

#include<stdio.h>

main()

(

附录第14页共36页intday=O,num=2;

floatsum=O.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>

main()

(

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=1;

printf("Inputx,y:〃);

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

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

last=last*x%1000;

printf(/zThe3digits:ld\nz,,last);

)

【习题3~40):

方法一:程序如下

ttdefineM1000/*定义寻找范围*/

itinclude<stdio.h>

main()

{intkl,k2,k3,k4,k5,k6,k7,k8,k9,klO;

inti,a,n,s;

for(a=2;a<=M;a++)/*a是2〜1000之间的整数.检查它是否完数*/{n=0;/*n用来累

计a的因子的个数*/

s=a;/*s用来存放尚未求出的因子之和,开始时等于a*/for(i=l;i<a;i++)/*检查i

是否a的因子*/

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

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

附录第15页共36页s=s-i;/*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==0)/*s=0表示全部因子都已找到*/

{printf(,z%dItsfactorsare〃,a);

if(n>l)printf(,z%d,%d〃,kl,k2);/*n>l表示a至少有2个因子*/

if(n>2)printf(z,,%d,z,k3);/*n>2至少有3个因子,故应再输出1因子*/

if(n>3)printfC,%dz,,k4);/*以下类似*/

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

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

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

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

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

if(n>9)printf%d”,klO);

printfC\nz,);

方法二:程序如下

#include<stdio.h>

main()

{intm,s,i;

for(m=2;m<l000;m++)

{s=0;

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

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

if(s==m)

{printf(/z%dItsfactorsare〃,m);

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

if(m%i==0)printf(,z%d,,z,i);

printf(〃\b\n〃);

附录第16页共36页}

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

#include<stdio.h>

main()

{intk[100];

inti,a,n,s;

for(a=2;a<1000;a++)

{n=0;

s=a;

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

if((a%i)==0)

{n++;

s=s-i;

k[n]=i;/*将找到的因子赋给,k[10]*/

)

if(s==0)

{printf(z,%dItsfactorsare〃,a);

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

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

printf(级d\n〃,k[n]);

【习题3-41]:

#include<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]:

ftinclude<stdio.h>

main()

{floatsn=100,hn=sn/2;

intn;

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

{sn=sn+2*hn;/*第n次落地时共经过的米数*/

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

附录第17页共36页}

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(z,total=%d\n/z,xl);

)

【习题3-44]:

#include<stdio.h>

main()

{inti,j,k;

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

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

printf(〃〃);

for(k=0;k<=2*i;k++)/*输出*号*/

printf(〃*〃);

printf("\n");/*输出完一行*号后换行*/

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

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

printf("〃);/*输出*号前面的空格*/

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-xnI

<10-5

附录第18页共36页为了便于程序处理,今只用变量xO和xl,先令x的初值

x0=a/2(也可以是另外的值),求出xl;如果此时Ixl-xO|210-5,则使xlfxO,然后

用这个新的xO求出下一个xl,如此反复,直到Ixl-xO|<10-5为止。

^include<stdio.h>

#include<math.h>

mainO

{floata,xO,xl;

printf(Z/Enterapositivenumber:");

scanf(绘f",&a);/*输入a的值*/

x0=a/2;

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

do

{xO=xl;

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

}

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

printf(,zThesquarerootof%5.2fis%8.5f\n”,a,xl);

)

【习题3-46]:牛顿迭代法又称牛顿切线法。它采用以下的方法求根:先任意设定一个

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

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

的切线,交x轴于x2,求出f(x2);再作切线……如此继续下去,直到足够接近真正的根

x*为止,,见图3.1»

图3.1

从图3.1可以看出,

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

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

这就是牛顿迭代公式。可以利用它由xO求出xl,然后再由x2求出x3,,,,设f(x)=2x3-

4x2+3x~6

附录第19页共36页可以写成以下形式:f(x)=[(2x-4)x+3]x-6

同样,f'(x)可写成:f'(x)=6x2-8x+3=(6x-8)x+3

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

次加法,而原来的表达式要经过多次指数运算、对数运算和乘法、加法运算,花费时间较

多。现在由于计算机的运算速度愈来愈快,这点时间开销是微不足道的,这是以前计算机

的运算速度较慢时所提出的问题。由于过去编写的程序往往采用这种形式,所以我们在此

也顺便介绍一下,以便在阅读别人所写的程序时知道其所以然。

ttinclude<stdio.h>

Sinclude<math.h>

main()

{floatx,xO,f,fl;

x=l.5;

do

{xO=x;

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

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

x=xO-f/fl;

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

printf(〃Therootofequationis%5.2f\n/z,x);

)

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

似根。求出一个x后,把它的值赋给xO,然后用它求下一个xO由于第一次执行循环体

时,需要对xO赋值,故在开始时应先对x赋一个初值(今为

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

【习题3-47]:

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

ABCABC

XYZX

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

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

只能与Z比赛,见图3.3。

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

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

图3.2图3.3

附录第20页共36页YZ开始设计程序时,并不知道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。

FORi='X'TO'Z'

FORj='X'TO'Z'

T

FORk=X*TO'Z'

i声kANDj#k

T

T

打印'A'-

'C'-kiW'X',kW'X'kW'Z'i'B'-jFFiWjF

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

对每•组i、j的值,找符合条件的k值。k同样也可能是‘X'、'Y'、‘Z'之」但k也不

应与i或j相等。在iWjWk的条件下,把iW'x'和IW'X'以及K'Z'的i、j、k的值输

出即可。

Sinclude<stdio.h>

main()

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

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

for(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(Z/A一%c\tB一%c\tC一%c\nz/,i,j,k);

)

说明:

(1)整个执行部分只有一个语句,所以只在语句的最后有一个分号。请读者弄清楚循环

和选择结构的嵌套关系。

(2)分析最下面一个if语句中的条件:iW'X',kW'X','k'W'Z',因为我们已事先假

定A-i,B-j,C-k,由于题目规定A不与X对抗,因此i不能等于'X';同理,C不与

X、Z对抗,因此k不应等于‘X'和'Z'。

(3)题目给的是A、B、C、X、Y、Z,而程序中用了加撇号的字符常量‘X'、‘Y'、'Z',这

是为什么?这是为了在运行时能直接打印出字符‘A'、‘B'、’C'、’X'、’Y'、’Z',以表示

三组对抗的情况。

附录第21页共36页图3.4习题四参考答案:

一、单项选择题

【习题4-1】~【习题4-7】ACDBBBD

二、判断题(正确用义错误用J标记)

【习题4-8】~【习题4T3】XVXVVV

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

【习题4T4】s=10,t=25

【习题4T5】1:resultis4

2:resultis6

3:resultis8

【习题4T6】s=16

【习题4-17】10

【习题4-18】7

【习题4T9】x=9

【习题4-20】12

【习题4-21]static

【习题4-22】51

【习题4-2313

四、程序设计题

【习题4-24】

doublefunc(intn,floatx)

{if(n==0)return1;

elsereturnfunc(nT,x)+n*pow(x,n);

【习题4-25]

PRTStar(charc,intn)

{if(n>0){printfc);PRTStar(c,n-1);}}

main()

{inti,n;

scanf&n);

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

{PRTStar('/*输出每行左端空格*/PRTStar2*iT);/*输出每行的*号

*/printf(*\n");

)

)

【习题4-26]

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

⑴笫N行有N+1个值(设起始行为第0行);⑵对于第N行的第J个值:(N>=2)

附录第22页共36页当J=1或J=N+1时:其值为1

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

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

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

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

程序如下:

intc(intx,inty)

{if((y-l)|(y==x+D)return(l);

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

main()

{inti,j,n=13;

printf("N=");

while(n>12)scanf&n);

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

{for(j=0;j<n-i;j++)printf("");

for(j=l;j<i+2;j++)printf("%6d”,c(i,j));

printf("\n");

}

}

4-27]

main()

{longk=2,N=1;

floatf=l,S=0;

while(N<=1E6)

{S+=f/N;

f=-f;

N=N*k++;

)

printf("S=%f\n”,S);

)

4-28]

intIsPrime(intx)

{intk;

for(k=2;k<=x/2;k++)

if(x%k==0)break;

if(k>x/2)return1;

elsereturn0;

}

main()

{intk;

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

if(IsPrime(k))printf(绘d,",k);

}

附录/*每行开始3*(n-i)个空格*//*每行输出i+1个数*/第23页共36页【习

题【习题习题五参考答案:

一、单项选择题

【习题5-1】"【习题5-8】DCABBDCA

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

【习题5-9】~⑴二⑵4⑶'B'

【习题5-10】5

【习题5-11[a[k][k]

【习题5T2[⑴a[0]⑵a[k]⑶t

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

【习题5-141运行结果为:

【习题5T5】I11

【习题5-16]

三、编写程序题

【习题5-17]:

#include<stdio.h>

mainO

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

inti,j,k,m;

for(m=0;m<10;ni++)scanf(〃%d〃,;for(m=0;m<6;m++)scanf(〃%d〃,;

printf(,z\nz,);

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++;

)

*

y^_r

12345678900987654321234806

a[0]=3

a[l]=2

a[2]=3

a[3]=3

a[4]=3

a[5]=2

for(m=0;m<k;m++)printf(〃%3d〃,c[m]);

附录第24页共36页}

【习题5-18]:

#include<stdio.h>

main()

(

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

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

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

printf(〃\n〃);

for(m=0;m〈3;m++)

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

for(n=l;n〈3;n++)

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

printf(//s=%d\nz/,s);

)

【习题5-19]:

#include<stdio.h>

#include<string.h>

mainO

(

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=0;

elseif(a[k]<b[kj)f=-l;

elsef=l;

printf(〃%d\n”,f);

)

【习题5-20】:

ttinclude<stdio.h>

#include<string.h>

main()

(

chars[20],t;

intk,n=0;

gets(s);

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

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

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

)

【习题5-21]:

附录第25页共36页#include<stdio.h>

main()

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

for(j=0;j<10;j++)scanf(〃%d〃,&a[j]);

printf("inputk:〃);

scanf(,z%dz,,&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);

printf(z,\nnewarray:\n,?);

for(j=0;j<n;j++)printf("%4d〃,a[j]);

printf(〃\n〃);

)

习题六参考答案:

一、单项选择题【习题6-1】~【习题6-10】BDACBDACCD

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

【习题6T1]num=*b,num=*c

【习题6T2[*pl++,*p2

【习题6-13】*(a+j),a+j

【习题6T4】87654321

【习题6T5】2,3,4,5,6.

【习题6T6】1711717

【习题6-17]ga

三、编写程序程题

【习题6-18]

Sinclude"stdio.h"voidmain(){inta[10]={3,42,6,12,33,55,25,45,76,93);

inti,j,k,x,*p;scanf&k);p=a;if(k>0&&k<10){for(i=0;i<k;i++)

附录第26页共36页{x=*(p+9);for(j=9;j>0;j—)

}*p=x;*(p+j)=*(p+jT);

}

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

}printf(/z%d",a[i]);

【习题6-19]

#include"stdio.h“#include"alloc.h"voidmainO{int

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

inti,j,*sum;

sum=(int*)malloc(3*sizeof(int));for(i=0;i<3;i++)

(

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

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

for(i=0;i<3;i++)printf(z/%d",*(sum+i));

【习题}6-20]

#include〃stdio.h〃ttinclude"alloc.h〃voidmain(){int

a[3][3]={l,2,5,4,3,6,9,8,7};inti,j,(*p)[3],max;

intr,c,flag=l;

P=a;

for(i=0;i<3;i++){flag=l;max=*(*(p+i));

r=i;c=0;for(j=l;j<3;j++)

{if(max<*(*(p+i)+j)){max=*(*(p+i)+j);

r二i;c二j;}

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

{if(max>*(*(p+j)+c))flag=0;

if(flag)}

}printf(/,%d,%d,%d\n,z,r,c,max);}

【习题6-21]

itinclude"stdio.h"#include"string.h〃main()

附录第27页共36页{charstr[50],*pl,*p2;printf("pleaseinputtwo

strings\n〃);gets(str);

pl=str;p2=str;while(*p2!=,\0,){p2++;}

p2--;while(*p1==*p2&&p1<p2){pl++;

p2—;}

if(pl=p2)printf(〃yes〃);

}elseprintf("no");6-22]

#include"string,h“#include"stdio.h〃voidmain()replace(char*str,char

ch,charch2);{charstr[50];cha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论