c语言程序设计教程(第2版) 杨路明 课后习题答案_第1页
c语言程序设计教程(第2版) 杨路明 课后习题答案_第2页
c语言程序设计教程(第2版) 杨路明 课后习题答案_第3页
c语言程序设计教程(第2版) 杨路明 课后习题答案_第4页
c语言程序设计教程(第2版) 杨路明 课后习题答案_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第一章C语言程序设计概述

一习题答案

1

算法的描述有哪些基本方法?

1、自然语言

2、专用工具

2

C语言程序的基本结构是怎样的?举一个例子说明。

1、C语言程序由函数构成;

2、“/*”与“*/”之间的内容构成C语言程序的注释部分;

3、用预处理命令#include、#define可以包含有关文件或预定义信息;

4、大小写字母在C语言中是有区别的;

5、除main。函数和标准库函数外,用户也可以自己编写函数,应用程序一般由

多个函数组成,这些函数指定实际所需要做的工作。

3

C语言有什么特点?

;、具有结构语言的特点,程序之间很容易实现段的共享;

2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编

译代码,以实现程序的模块化;

3、运算符丰富,包含的范围很广;

4、数据类型丰富;

5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分

功能;

6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;

7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性

好。

4

★指出合法与不合法的标识符命名。

AB12—V

leed_3—a*b2—X8stu—XD.K.Jon—XEF3_3—VPAS—Vif—X

XYZ43K2—VAVE#XY—X_762—V#_DT5—XC.D—X

5

说明下列TurboC热键的功能。

F2:源文件存盘F10:调用主菜单F4:程序运行到光标所在行(用于调试程

序)Ctrl+F9:编译并链接成可执行文件Alt+F5:将窗口切换到DOS下,查看

程序运行结果。

6

说明下列TurboC方式下输入并运行下列程序,记录下运行结果。

①main()

{printf(〃********************\n〃);

printfCwelcomeyou\n〃);

printf(,zverygood\n);

printf(〃********************\n〃);

②main。

{inta,b,c,t;

printf(z,pleaseinputthreenumbers;");

scanf(〃%d,%d,%d",&a,&b,&c);/*教材S是错误的*/

t=max(max(a,b),c);

printf(z,maxnumberis:%d\nz,,t);

}

intmax(intx,inty)

{intz;

if(x>y)z=x;

elsez=y;

return(z);

)

运行结果:

welcomeyou

verygood

运行结果:

pleaseinputthreenumbers;3,1,4/*左侧下划线内容为键盘输入*/

maxnumberis:4

7

一个C程序是由若干个函数构成的,其中有且只能有一个_____函数。

main()

8

在TurboC环境下进行程序调试时,可以使用Run下拉菜单的命令或按

键转到用户屏幕查看程序运行结果。

1、Userscreen

2、Alt+F5

9

★C语言对标识符与关键字有些什么规定?

1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,

但必须用字母或下划线开头。

2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名

来使用,用户只能根据系统的规定使用它们。

10

C源程序输入后是如何进行保存的?

是以C为扩展名保存的纯文本文件。

第二章C语言程序的基本数据类型与表达式

一习题答案

1

★指出下列常数中哪些是符合C语法规定的。

,\,一X'101'-X"\"-Xe3—X019—VOxle—V

"ab\n”-J1.e5—X(2+3)e(4-2)—X5.2e2.5—X

2

请找出下列程序中的错误,改正后写出程序运行结果。

©voidmainO

{intx,y=z=5,aver;

x=7

AVER=(x+y+z)/3

printf(〃AVER=%d\n〃,aver);

)

②voidmainO

{charcl='a,;c2='b';c3=,c;

inta=3.5,b=,N

printf(/,a=%db=\,\〃end\n〃,a,b);

printf(,,a%cb%c\bc%c\tabc\n,/,cl,c2,c3);

mainO

{intx,y=5,z=5,aver;

x=7;

aver=(x+y+z)/3;

printf(,,AVER=%d\n,/,aver);

)

运行结果:AVER=5

②main()

{charcl='a',c2='b',c3=,c;

inta=3,b=,A';

printf(〃a=%d,b=\'%c\'\〃end\〃\n〃,a,b);

printf(,,a%cb%c\bc%c\tabc\n,/,cl,c2,c3);

)

运行结果:a=3,b='A'〃end〃

aabccabc

3

写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所

有的空格填上赋值后的数据(实数保留到小数点后两位)。

int

99

-1

char

h'

unsignedint

66

float

55.78

longint

68

int

99

104

66

55

68

-1

char

c

h'

B'

7'

D'

unsignedint

99

104

66

55

68

65535

float

99.00

104.00

66.00

55.78

68.00

-1.00

longint

99

104

66

55

68

-1

★写出程序运行结果。

①voidmain()

{inti,j;

i=8,j=10;

printf(〃%d,%d,%d,%d\n〃,i,j,++i,j++);

)

②main。

{inta=l,b=2,c=30;;

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

)

注意:a=b=c,a=b==c之间应为逗号,教材有误

运行结果:

9,11,9,10

运行结果:

30,1,0,0

③voidmain()

{inta=10,b=20,c=30,d;

d=++a<=10||b—>=20||c++;

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

)

飞行结果:

11,19,30,1

5

★写出下面表达式的值(设a=10,b=4,c=5,d=l,x=2.5,y=3.5)。

(l)a%=(b%=3)

⑵n++,a+=a-=a*=a

(3)(float)(a+c)/2+(int)x%(int)y

⑷a*=b+c

(5)++a-c+b++

(6)++a-c+++b

⑺a<b?x:'A'

(8)b++==c

(9)a+b,18+(b=4)*3,(a/b,a%b)

(10)x+a%3*(int)(x+y)%2/4+sizeof(int)

(ll)a<b?a:c<d?c:d

⑫b++==c

⑬a*=b=c=2

(14)a=b==c

(DO(2)0(3)9.500000(4)90(5)10(6)10⑺'A'(8)2(9)4.5(10)1(11)0⑫20(13)0

6

下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值

的整型变量)?

①m=(a=4,4*5)与m=a=4,4*5

(5)(float)(a/b)(float)a/b

③(int)a+b与(int)(a+b)

④m%=2+a*3与m=m%2+a*3

⑤m=l+(a=2)+(b=3)与a=2,b=3,m=l+a+b

①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同;

②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后

强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保

证了精度,所以不同。

③因为a、b均为整数,其前后两个表达式的计算结果是一致的。

④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,

前一表达式的m只被赋过一次值,后一•表达式中的m曾两次被赋值,第一次赋值

时与第一表达式中的值一致,第二次赋值后即不再相同。

⑤前后表达式的计算结果应该是一致的:a=2,b=3,m=6

7

条件表达式x>0?x:-x的功能是什么?

Z口果X的值是一正数,则表达式的值为X值;如果X的值是一非正数,则表达

式的值为-X。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)

即可完成此功能,该函数包含在math,h头文件中。

8

用一个条件表达式描述从a、b、c中找出最大都赋给max.

max=a>(b>c?b:c)?a:(b>c?b:c);

9

★若x为int型变量,则执行以下语句后x的值为()。

x=6;

x+=x-=x*x;

A.36B.-60C.60D.-24

B.

10

★若有以下类型说明语句:

charw;intx;floaty;doublez;

则表达式w*x+z-y的结果为()类型。

A.floatB.charC.intD.double

D.

第三章顺序结构程序设计

一习题答案

1

变量k为float类型,调用函数scanf("%d”,&k),不能使变量k得到正确数值

的原因是o

格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而

&k为占用4个字节的float类型变量的地址。

2

★a=1234,b=12,c=34,则执行“printf(1%3d%3d%-3d|\n”,a,b,c);”后的输

出是o

112341234|

分析如下:

①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实

际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,

不受限制。

②汩3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端

补空格,否则按实际输出。

3

★设有"inta=255,b=8;",则"printf("%x,%o\n”,a,b);”输出是。

ff,10

①如果"printf("%X,%o\n”,a,b);”则输出为FF,10。说明在输出十六进制字

母时,其大小写受格式修饰符的限制,如果是“外x”则输出小写,如果是“%X”

则输出大写。

②如果希望在输出十六进制时输出前导符Ox或0X,则以上输出语句应改

"printf("%#x,%o\n”,a,b);"为或"printf("%#X,%o\n”,a,b);"。本条解释不

必须掌握。

4

★以下程序输出的结果是。

main()

{

intal=l,a2=0,a3=2;

printf("96d,%d,%d\n”,al,al+a2+a3,a3-al);

1,3,1

5

printf函数中用到格式符%5s,其中5表示输出字符占用5歹!J。如果字符串长

度大于5,则按输出;如果字符串长度小于5,则按输出。

①实际②左端补空格

6

★已定义变量如下:

intal,a2;

charcl,c2;

若要求输入al、a2、cl和c2的值,正确的输入函数调用语句是。

scanf("%d,%d,%c,枇",&al,&a2,&cl,&c2);

7

输入两个整型变量a、b的值,输出下列算式以及运算结果0

a+b、a-b>a*b>a/b>(float)a/b,a%b

每个算式占一行。如a=10,b=5,a+b输出为:10+5=15

设inta=10,b=5;以下为输出语句及结果:

①printf(//%d+%d=%d\n,z,a,b,a+b);10+5=15

②printf(//%d-%d=%d\n,/,a,b,a-b);10-5=5

③printfC%d*%d=%d\n,,,a,b,a*b);10*5=50

④printf("%d/%d=%d\n”,a,b,a/b);10/5=2

⑤printf("%(float)d/%d=%f\n”,a,b,(float)a/b);(float)10/5=2.00000

0

⑥printf(/z%d%%%d=%d\nz/,a,b,a%b);10%5=0

★输入一个非负数,计算以这个数为半径的圆周长和面积。

#definePI3.1415926

mainO

{

floatr,1,area;

printf(z,Inputapositive/7);

scanf(〃%f〃,&r);

l=2*PI*r;

area=PI*r*r;

printf(z,l=%f\tarea=%f\nz,,1,area);

)

输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。

mainO

(

intx,y;

printf(z,Inputanumber(100-999):,z);

scanf(〃%d〃,&x);

y=100*(x%10)+10*(x/10%10)+x/100;/*注意分析此处算法*/

printf("%d—>%d\n〃,x,y);

10

★输入任意大小的3个整数,判断其中是否有两个奇数一个偶数。若是则输出

YES,不是则输出NOT(要求用条件表达式进行判断,不使用if语句)。

mainO

{

intx,y,z,oddcount=0;/*奇数数计数变量*/

printf("Inputx,y,z:〃);

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

x%2==l?oddcount++:0;

y%2==1?oddcount++:0;

z%2==l?oddcount++:0;

oddcount==2?printf("YES"):printfCNOD;

)

11

求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并按

ASCII码值,按从大到小的顺序输出这3个字符及其对应的ASCII码值。

本题考查同学们对字符类型数据的认识,如果在ASCH范围内则即可以显示为

字符,又可以显示为整数值;无论是否能够显示为字符,字符类型数据是可能参

与数值运算的,切记。

main()

(

charc;

printf(/zInputcharacter/');

scanf(〃%c〃,&c);

printf(z,%c----->%d\n,z,c-1,c-1);

printf(〃%c----->%d\n〃,c,c);

printf("%c----->%d\n/z,c+1,c+1);

getchO;/*为便于调试程序,运行至此程序停顿,此时可以看到运行结果,

按任意键程序真难得结束并返回到编辑环境*/

12

★输入三角形的边长,求三角形面积(面积=

sqrt(s(s-a)(s-b)(s-c)),s=(a+b+c)/2)0

#includez/math.h〃/*由于程序中使用了开平方函数sqrt(),所以需要包含

数学头文件*/

mainO

{

floata,b,c,s,area;

intok=0;

printf("Inputa,b,c:/z);

scanf(〃%f,%f,%f〃,&a,&b,&c);

a+b>c?ok++:0;/*以下3条语句为判断是否输入的数据是否构成封闭三角

形*/

a+c>b?ok++:0;

b+c>a?ok++:0;

ok==3?(s=(a+b+c)/2,area=sqrt(s*(s-a)*(s-b)*(s-c)),printf(,,area=%f/,

,area)):printf("error");

getchO;

第四章选择结构程序设计

一习题答案

1

★设X、t均为int型变量,则执行语句“x=10;t=x&&x>10;”后,t的值为

0

2

★假定所有变量均已正确定义,则程序段:

inta=0,y=10;

if(a=0)y-elseif(a>0)y++;

elsey+=y;

运行后y的值是;

20

3

★能表述20<x<30或x<-100的C语言表达式是o

x>20&&x<30||+x<-100

4

★若有定义语句“inta=25,b=14,c=19;",则以下语句执行结果是

if(a<=25&&b<=2&&c)

printf(,z***a+b=%d,a-b=%d***\n,/,a+b,a-b);

elseprintf(,z***a=%d,b=%d,c=%d***\n,/,a,b,c);

***a=25,b=14,c=19***

5

★假定i和j为int型变量,则执行以下语句后i的值是o

inti=l;

switch(i)

{

case1:{for(j=0;j<9;j++)i+=j;break;}

case2:{for(j=l;j<10;j++)i+=j;break;}

case3:i++;

)

37

分析:执行了case1:和case3:中的代码。同时case1:语句中的{}是

可以取消的。

6

★以下两条if语句可合并成一条if语句,即o

if(a<=b)x=l;

elsey=2;

/,,,

if(a>b)printf(***y=%d\n.y);

elseprintf("***x=%d\rT,x);

if(a<=b)printf('***x=%d\n",x=l);

elseprintf(〃***y=%d\rT,y=2);

7

★输入两个字符,若这两个字符的序号(ASCH码)之差为偶数,则输出它们

的后继字符,否则输出它们的前驱字符。

main()

(

chara,b;

printf(/zInputtwochatactera,b:');

scanf(zz%c,%c",&a,&b);

if((a-b)/2==0)

printfC%c,%c”,a+1,b+1);

elseprintf("%c,%c”,aT,bT);

)

8

★输入整数a和b,如果a能被b整除,就输出算式和商,否则输出算式、

整数商和余数。

main()

inta,b;

printf(Z/Inputtwointegernumbersa,b:');

scanf(zz%d,%d”,&a,&b);

if(b!=O&&a%b==O)

printf(zz%d/%d=%d/z,a,b,a/b);

else

printf(z,%d/%d=%d.%d〃,a,b,a/b,a%b);

)

9

输入某个点A的平面坐标(x,y),判断(输出)A点是在圆内、圆外还是在圆

周上,其中圆心坐标为(2,2),半径为lo

include^math.h〃

main()

{

floatx,y,d;

printf(zzInputx,y:〃);

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

d=sqrt((x-2)*(x-2)+(y-2)*(y-2));

if(d>l)printf("outside");

elseif(d〈l)printf("inside");

elseprintf("inside");

★输入年号和月份,输出这一年该月的天数(一个年份,先判断是否闰年)。

main()

(

inty,m,d,f;

printf("'Inputyearandmonthy-m:〃);

scanf(〃%d-%d〃,&y,&m);

f=(y%4==0&&y/100!=0:|y/400==0);

if(m==2)

d=28+f;/*依据是否闰年决定2月份的实际天数,若是闰年,则f=l,d

即为29天*/

else

d=31-(m==4)+(m==6)+(m==9)+(m==l1);/*m=4时其值为1,则本月为30

天,典型算法,重要啊*/

printf(zz%d-%dis%ddays.\n〃,y,m,d);

)

11

★请将以下语句改写成switch语句(a>0)。

if(a<30)m=l

elseif(a<40)m=2

elseif(a<50)m=3

elseif(a<60)m=4

elsem=5

switch(a/10)

(

case1:

case2:

case3:m=l;break;

case4:m=2;break;

case5:m=3;break;

case6:m=4;break;

default:m=5;

)

12

有一函数

x-l-5<x<0

y=xx=0

x+10<x<8

编写一程序,要求输入X的值,输出y的值。分别用不嵌套的if语句,嵌套

的if语句,switch语句编写。

使用不嵌套的if语句程序如下:

main()

(

floatx,y;

printf("Inputx:");

scanf(级f”,&x);

if(x>-5&&x<0)y=x-l;

if(x==0)y=0;

if(x>0&&x<8)y=x+l;

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

}

使用嵌套的if语句程序如下:

main()

floatx,y;

scanf(〃%f〃,&x);

if(x>-5&&x<8)

if(x<0)y=x-l;

elseif(x==0)y=0:

elsey=x+l;

printfC/y=%f\n,/,y);

)

mainO

floatx,y;

scanf&x);

if(x<8)

if(x>0)y=x+l;

elseif(x==0)y=0;

elseif(x>-5)y=x-l;

printfCy=%f\n,,,y);

)

使用多分支语句程序如下:

mainO

(

floatx,y;

intm;

printf(zzInputx:〃);

scanf(〃%f〃,&x);

if(x>-5&&x<8)

if(x<0)m=-l;

elseif(x==0)m=0:

elsem=l;

switch(m)

(

case-1:y=x-l;break;

case0:y=0;break;

case1:y=x+l;break;

)

printfCy=%f\n,,,y);

)

以下为假设对int类型的变量进行处理,但毕竟不算完美

mainO

intx,y;

printf(zzInputx:");

scanf(〃%d〃,&x);

switch(x)

case-4

case-3

case-2

case-1y=x-l;break;

case0y=0;break;

case1

case2

case3

case4

case5

case6

case7y=x+l;break;

)

printf(z,y=96d\n〃,y);

第五章循环结构程序设计

一习题答案

★输入n个整数,求这n个数之中的偶数平均值,并输出。

main()

(

intn,i,x,sum=0,count=0;

printf(zzInputn:〃);

scanf(〃%d〃,&n);

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

{

printf(zzInput[%d]:〃,i+1);

scanf(〃%d〃,&x);

if(x%2==0){sum+=x;count++;}

)

printf(z,Averageis:%f\n,z,(float)sum/count);

getchO;

★输入一串字符,直到输入一个星号(*)为止,统计(输出)其中的字母个

数和数字字符个数。

#include"stdio.h"

main()

(

charch;

intcharcnt=O,numcnt=O;

while((ch=getchar())!-*')

(

if(ch>=,a&&ch<=,z'||ch>=,A'&&ch<-Z')charcnt++;

if(ch>=,0'&&ch<=,9')numcnt++;

)

printf("Charactersnumber:%d\nDigitsnumber:%d\n/z,charcnt,numcnt);

getchO;

}

3

★从键盘输入一个正整数n,计算该数的各位数字之和并输出。例如,输入数

是5246,则计算5+2+4+6=17并输出。

#includez/stdio.h"

main()

(

intn,i,sum=0,count=0;

printf(Z/Inputn:");

scanf&n);

while((n/10)!=0)

(

count++;

sum+=n%10;

printfC%d+*,n%10);

n/=10;

)

printf(//=%dz/,sum+n);

getchO;

)

4

★输入一个字符串,将其中的大写字母改为小写字母,小写字母改为大写字母,

然后输出。

#include"stdio.h"

mainO

(

charch;

printf(Z/Inputstring:zz);

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

{

if(ch>=,a'&&ch<=,z')printf(〃祝〃,ch-32);

if(ch>=,A,&&ch<=,Z')printf("%c〃,ch+32);

)

getchO;

)

5

设某县2000年工业总产值为200亿元,如果该县预计平均年工业总产值增长率

为4.5%,那么多少年后该县年工业总产值将超500亿元。

main()

(

floatx=200;

intn=0;

do

(

x*=(l+0.045);

n++;

}while(x<500);

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

getchO;

6

★输出1〜999中能被3整除,而且至少有一位数字是5的所有数字。

mainO

(

intx,y,flag;

for(x=l;x<1000;x++)

(

flag=0;

y二x;

if(y%3==0)/*余数为0说明该数能够被3整除*/

while(y%10!=0)

if(y%10==5)flag=l;/*依个位、十位、百位顺序判断是否余

数为5*/

y/=10;

)

if(flag==l)printf("%d\t",x);

)

)

getchO;

)

7

求爱因斯坦数学题。有一条长阶,若每步跨2阶,则最后剩1阶,若每步跨3

阶,则最后剩2阶,若每步跨5阶,则最后剩4阶每步跨6阶,则最后剩5阶每

步跨7阶,最后正好1阶。

main()

(

intx=0,flag=0;

while(1)

(

x++;

if(x%2==l)

if(x%3==2)

if(x%5==4)

if(x%6==5)

if(x%7==0)

{

printfx);

break;

)

)

getchO;

8

输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位

数字的立方和等于这个3位数本身。例如,153=1*1*1+5*5*5+3*3*3

main()

intx,a,b,c;

printf("Inputnumber:");

scanf("%d",&x);

a=x/100;/*变量a中记录x的百位数字*/

b=x/10%10;/*变量b中记录x的十位数字*/

c=x%10;/*变量c中记录x的个位数字*/

if(a*a*a+b*b*b+c*c*c==x)

(

printf(z,%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\nz/,x,a,a,a,b,b,b,c,c,c);

printf("YES");

}

else

printf("NOT");

getchO;

)

★计算斐波那契分数序列前n项之和(n是某个常数,波那契分数序列为2/1,

3/2,5/3,8/5,...)o

main()

(

inti,n=10;

floatf1=1,f2=2,f,sum=0;

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

(

sum+=f2/fl;

f=fl+f2;

fl=f2;

f2=f;

)

printf(zztotal=%d\nsum=%fz/,n,sum);

getchO;

}

10

输入一个正整数,各输出n行的正(倒)三角形宝塔图案。

main()

intn,i,j;

printf(Z/Inputn:");

scanf&n);

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

(

for(j=i+l;j<n;j++)printf");

for(j=0;j<2*i+l;j++)printf("*");

printf("\n");

)

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

(

for(j=0;j〈i+l;j++)printf;

for(j=2*i-l;j<n+l;j++)printf("*");

printf('\n");

)

getchO;

)

11

★输出九九乘法表。

main()

(

inti,j;

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

(

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

,/,,

printf(%d*%d=%-3d(j,i,i*j);

printf('\n");

)

getchO;

)

12

输入一串字符,直到输入一个星号为止,统计(输出)其中的正整数和负整数

个数以及所有正整数的平均值和所有负整数的平均值。

#include"stdio.h"

#include"math.h"

main()

(

charch;

intx=0,y=l,f=0,pcnt=0,ncnt=0;

floatpsum=0,nsum=0;

while((ch=getchar())!='*')

if(ch==')

{

if(x!=O)

(

if(f==l)

(

x=-x;

nsum+=x;

ncnt++;

)

else

{

psum+=x;

pcnt++;

)

printf(级d\n〃,x);

)

f=l;x=O;y=l;

continue;

}

elseif(ch>='O'&&ch〈二'9')

(

x=10*x+ch-'O';

y=10*y;

if(x!=0&&10*x<y)f=0;

continue;

)

else

{

if(x!=O)

{

if(f==l)

{

x=-x;

nsum+=x;

ncnt++;

)

else

(

psum+=x;

pcnt++;

}

printf("%d\n〃,x);

f=O;x=O;y=l;

continue;

)

)

if(x!=0)

(

if(f==l)

(

X=-X;

nsum+=x;

ncnt++;

)

else

(

psum+=x;

pcnt++;

)

printf(袋d\n”,x);

)

printf("\n--------'n");

printf("Plus:\n");

printf("Count=%d\n”,pent);

printf("Average=%f\rT,psum/pent);

printf("------\n");

printf("Negative:\n");

printf(/zCount=%d\n/z,pent);

printf("Average=%f\n”,nsum/nent);

getchO;

)

13

一个整数等于该数所有因子之和,则称该数是一个完数。例如,6和28都是完

数。因为6=1+2+3,28=1+2+4+7+14。输出3位数中所有的完数。

main()

(

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

inti,a,n,s;

for(a=100;a<=999;a++)

(

n=0;/*n累计因子的个数*/

s=a;/*s存放未求出的因子之和,初值为被测数本身*/

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

if(a%i==0)/*由i到a循环检测i是否为a的因子*/

{

n++;/*找到一个因子*/

s=s-i;/*减去已找到的因子*/

switch(n)/*将找到的因子赋绐kl,k2,...*/

case1kl=ibreak;

case2k2=ibreak;

case3k3=ibreak;

case4k4=ibreak;

case5k5=ibreak;

case6k6=ibreak;

case7k7=ibreak;

case8k8=ibreak;

case9k9=ibreak;

case10:klO=i;break;

if(s==0)/*已经找到全部因子*/

printf(,/%dItsfactorsare”,a);

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

个因子*/

if(n>2)printf(",%d",k3);/*注意以下if的用法,追加的

方法*/

,,

if(n>3)printf(",%d,k4);

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

if(n>5)printfk6);

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

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

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

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

printf("\n");

getchO;

14

★编写程序按下列公式计算e的值(精度为le-6)。

e=l+l/l!+l/2!+l/3!...+l/n!

main()

{

inti;

doublee=0,t=l;

for(i=l;t>0.000001;i++)

(

for(j=l;j<=i;j++)t*=j;

t=l/t;

e+=t;

}

printf("e=M'n",e);

getch();

)

15

用二分法求方程2x3-4x2+3x=0在(TO,10)附近的根(二分法:先找到a、b,使

f(a)、f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假

设f(a)<0,f(b>0,a<b,如果f[(a+b)2]=0,该点就是零点,如果f[(a+b)/2"0,

则在区间((a+b)/2,b)内有零点,按上述方法再求该区间中点的函数值,通过每

次把f(x)的零点所有小区间收缩一半的方法,使区间的两个端点逐步迫近函数

的零点,以求得零点的近似值,该值即是方程的根)。

#include"math.h"

main()

{

doublex,fx,fa,fb,a=-10,b=10,z=0.0001;

fa=2*a*a*a-4*a*a+3*a;

fb=2*b*b*b-4*b*b+3*b;

if(fa*fb<0)

(

do

{

x=(a+b)/2;

fx=2*x*x*x-4*x*x+3*x;

if(fx<0)

(

a=x;

fa=2*a*a*a-4*a*a+3*a;

)

else

b=x;

fb=2*b*b*b-4*b*b+3*b;

}while(fabs(fa-fb)>z);

printf(Z/Therootisx);

)

getchO;

)

第六章函数与编译预处理

一习题答案

★写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这

两个函数,并输出结果。两个整数由键盘输入。

main()

(

unsignedintm,n,p,q;

for(;;)

(

printf("m,n=");scanf("%d,%d",&m,&n);

if(m<0|ln<0){printf(/zTheend.\n");break;}

p=funp(m,n);

q=funq(m,n);

printfCp(%d,%d)=%d\nq(%d,%d)=%d\n”,m,n,p,m,n,q);

)

)

intfunp(intm,intn)

{

inti;

if(m>n){i=m;m=n;n=i;}

for(i=m;i>0;i-)if(m%i==0&&n%i==0)return(i);

)

intfunq(intm,intn)

{

inti;

if(m<n){i=m;m=n;n=i;}

for(i=m;i<=m*n;i+=m)if(i%n==0)return(i);

)

2

★编写一个函数,由参数传入一个字符串,统计此字串中字母、数字和其他字

符的个数,在主函数中输入字符串并显示统计结果。

’臬制作函数,主要利用了选择语句结构:

#include/zstdio.h〃

mainO

(

inti,c,zm=O,sz=O,kg=O,qt=O;

printf(zzInputastring:");

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

if(c=-,)kg++;

elseif(c>47&&c<58)sz++;

elseif(c>='A'&&c〈='Z'||c>='a'&&c〈二'z')zm++;

elseqt++;

printf(z,am=%d,sz=%d,kg=%d,qt=%d\n,z,zm,sz,kg,qt);

)

制作函数,利用函数调用:

#include〃stdio.h〃

intanalys(charch);

main()

(

inti,zm=0,sz=O,qt=O,c;

printf("Inputastring:");

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

(

i=analys(c);

switch(i)

(

case1:zm++;break;

case2:sz++;break;

case3:qt++;

)

}

printf(/Zzm=%d,sz=%d,qt二%d\n〃,zm,sz,qt);

)

intanalys(charch)

(

if(ch>='A'&&ch<=,Z'||ch>=,a'&&ch<=,z')return1;

if(ch>47&&ch<58)return2;

return3;

3

★按照第5章第8题的要求编写判断水仙花数的函数,从主函数输入正整数n,

在主函数中调用判断水仙花数的函数,找出n以内所有的水仙花数。

【输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位

数字的立方和等于这个3位数本身。例如,153=1*1*1+5*5*5+3*3*3]

main()

(

intx,i,f;

printf("Inputnumber:");

scanf&x);

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

(

f=0;

f=fun(i);

if(f==l)printf(级d\t〃,i);

)

getchO;

)

intfun(intx)

(

inta,b,c;

a=x/100;

b=x/10%10;

c=x%10;

if(a*a*a+b*b*b+c*c*c==x)return1;

elsereturn0;

4

★定义一个宏,实现将两个数互换,并写出程序,输入两个数作为使用参数,

并显示结果。

ttdefinef(a,b)(a=a+b,b=a-b,a=a-b)

main()

(

intx,y;

printf("Inputx,y:");

scanf(/z%d,%d",&x,&y);

printf("%d,%d//,x,y);

f(x,y);

printf(<—>%d,%d\n,x,y);

getch();

5

已知二阶Fibonacci数列:

若no

0

若1

Fib(n)=1n

Fib(n-l)+Fib(n-2)情

定义递归函数求Fib(n)。

main()

(

inti,n;

printf(z,Inputn:〃);

scanf(〃%d〃,&n);

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

printfC%d\t,,,fib(i));

getch();

)

intfib(intn)

(

if(n==0)return0;

elseif(n==l)return1;

elsereturn(fib(n-l)+fib(n-2));

)

6

定义函数求F=(n+m)!+n!,m、n均为任意正整数。要求使用递归调用。

longintf(intx);

main()

(

inti,m,n;

longintsum;

printf(zzInputm,n:〃);

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

sum=f(n+m)+f(n);

printf(〃961d〃,sum);

getchO;

)

longintf(intx)

inti,j;

if(x==O||x==l)return1;

elsereturn(x*f(x-1));

)

7

★定义一个函数完成第5章第11题的功能。

【输出九九乘法表。】

main()

{

fun();

getchO;

}

fun()

{

inti,j;

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

(

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

printfC%d*%d=%-3d,/,j,i,i*j);

printf("\n");

)

)

8

如果有两个数,每一个数的所有约数(除了它本身以外)的和正好等于对方,

则称这两个数为互满数,求出30000以内所有的互满数,并显示输出,求一个数

它的所有约数(除了它本身以处)的和,用函数实现。

main()

(

intx,y;

for(x=l;x<30000;x++)

(

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

{

if(facsum(x)==y&&facsum(y)==x){printf(,z(%d,x,y);}

getchO;

)

facsum(intn)

{

inti,sum=O;

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

(

if(n%i==0)sum+=i;

)

returnsum;

9

编写以下函数:①输入职工的姓名和职工号;②按职工号由小到大排序,姓名

顺序也随之调整;③输入一个职工号,找出该职工的姓名。在主函数中调用这些

函数。

10

★设计程序完成下列计算。

已经:y=f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3))

其中:f(x,n)=l-x2/2!+x4/4~...+(T)n•x2n/(2n)!(n20)

当:x=5.6,n=7时,求:y

要求通过嵌套调用完成计算。

ttinclude<stdio.h>

floatf(floatx,intn);

floatfl(floatx,intm);

floatf2(intm);

main()

(

floatx=5.6,y;

intn=7,i;

y=l+f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3));

printfCy=%f\n\n,/,y);

)

floatf(floatx,intn)

floatsum=0.0;

inti;

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

(

sum+=f1(-1,i)*fl(x,2*i)/f2(2*i);

}

returnsum;

}

floatfl(floatx,intm)

(

inti;

floaty=l.0;

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

(

y*二x;

)

returny;

)

floatf2(intm)

(

inti;

floaty=l;

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

(

y*二i;

)

returny;

第七章数组

一习题答案

1

★以下各题中,选择一个正确的答案。

1、能正确对一维数组a中所有元素进行初始化的是()o

A.inta[5]={}B.inta[]={0}

C.inta[5]=0,0,0,0,0D.int

a[5]={0}

2

温馨提示

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

评论

0/150

提交评论