c语言程序设计第五版习题答案解析 下载本文

完美WORD格式

The num equal:2

The internal block num equal:3 2.下列程序运行的运行结果为 。 #include \int a,b,c; void add() {extern int a; c=a+b; }

void main() { a=b=4; add();

printf(\}

【分析与提示】注意xternal的用法。 【解答】The value of c is equal to 8 3.下列程序运行的运行结果为 。 void swap(int *a,int *b) {int *t; t=a;a=b;b=t; }

main()

{int x=3,y=5,*p=&x,*q=&y; swap(p,q);

printf(\}

【分析与提示】指针作参数时,形参指针的改变不会影响实参。 【解答】 3 5 三.改错题

1.下列给定程序中,函数fun的功能是计算正整数num的各位上的数字之平方和。 例如,输入352,则输出应该是38;若输入328,则输出应该是77。 请改正程序中的错误,使它能得出正确的结果。

注意,不要改动main函数,不得增行或删行,也不得更改程序的结构。两处错误分别在/**********found************/的下一行。 程序代码:

#include #include long fun(long num) {

/**********found************/ long k=1; do {

k+=(num)*(num) ;

专业整理 知识分享

完美WORD格式

num/=10;

/***********found***********/ }while(num) return(k) ; }

main() {

long n; clrscr( );

printf(\Please enter a number:\scanf (\

printf(\%ld\\n\}

【分析】错误1:k用来存放各位数字的平方和,初值应为0。错误2:语法错误。 【解答】(1) long k=0; (2) while(num);

2.下列给定程序中,函数fun的功能是:在字符串str中找出ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。

例如,调用fun函数之前给字符串输入:ABCDeFGH,调用后字符串中的内容为:eABCDFGH 请改正程序中的错误,使它能得出正确的结果。

注意,不要改动main函数,不得增行或删行,也不得更改程序的结构。两处错误分别在/**********found************/的下一行。 参考代码:

#include void fun(char *p) {

char max,*q; int i=0; max=p[i];

while(p[i]!=0) {

if(max

max=p[i];

/**********found************/ p=q+i; } i++; }

/***********found***********/ while(q

*q=*(q-1); q--; }

专业整理 知识分享

完美WORD格式

p[0]=max; }

void main() {

char str[80];

printf(\gets(str);

printf(\puts(str); fun(str);

printf(\puts(str); }

【分析与提示】本例考查指针指向字符串的操作。第一个错误出在p=q+i;这一行,经过观察发现,q是没有赋初值的指针,这样的指针指向不明确,是野指针,所以必须给q赋初值,这一语句更改为q=p+i;就对了,作用是把q定位在字符e所在的位置。因此在程序中,q的作用总是指向当前最大的字符。第二个错误比较隐蔽,单从语法上检查不出来,但是分析程序的作用后可发现p是数组的首地址,所以它总是小于或等于q的,而第二个while循环的作用是把e前面的字符顺次往后挪动,所以,这里的循环条件应该是q>p。

【解答】(1)q=p+i; (2)while(q>p) 四.编程题

1.已知e=1+1/1!+1/2!+1/3!+…+1/n!,试用公式求e的近似值,要求累加所有不小于-6

10的项值。用函数fun完成任何数的阶乘。

-6

【分析与提示】用主函数完成1与1/1!到1/n!的相加,直到1/n!的值小于10,通过形参传递给子函数fun,用1×2×3×…×n求n的阶乘。

参考代码:

#include int fun(); main() {

int i;

float e ,n; e=1.0; i=1; n=1.0;

while (n>1.0e-6) {n=1.0/fun(i); i++; e=e+n ; }

printf (\}

int fun( int i) { int j,k;

专业整理 知识分享

完美WORD格式

k=1;

for (j=1;j<=i ;j++) k=k*j; return(k); }

输出结果:2.718215

2.请编写函数fun(),该函数的功能是:将两个两位的正整数a,b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次放在c数的百位和个位上。

例如,当a=45,b=12时,调用到该函数后,c=5142。

注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中添入所编写的若干语句。

部分源程序:

#include #include

void fun(int a,int b,long *c) {

*c=a*1000+b/10*100+a/10*10+b; } main() {int a,b; long c; clrscr();

printf(\scanf(\fun(a,b,&c);

printf(\}

3.请编写函数fun(),该函数的功能是:将s所指字符串中ASCII码值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中

例如,若s所指字符串中的内容为ABCDEFG12345,最后t所指的数组中的内容应是ACEG135。

注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中添入所编写的若干语句。

部分源程序:

#include #include #include

void fun(char *s,char t[]) {

……… }

main() {

专业整理 知识分享

完美WORD格式

char s[100],t[100]; clrscr();

printf(\scanf(\fun(s,t);

printf(\}

参考代码: int i=0;

for(;*s!='\\0';s++) if(*s%2==1) t[i++]=*s; t[i]='\\0';

4. Hanoi 汉诺塔问题。

【分析】这是一个典型的用递归方法解决的问题。问题是这样的:有三根针A、B、C,A针上有64个盘子,盘子大小不等,大的在下,小的在上。要求把这64个盘子从A针移到C针,在移动的过程中可以借助B针,每次只允许移动一个盘子,而且在移动过程中三根针上都保持大盘在下,小盘在上。编写程序并打印出移动的步骤。

将n个盘子从A 针移到C针可以分解为以下三个步骤: ①将A 上n-1个盘子借助C针先移到B针上。 ②把A针上剩余的一个盘子移到C针上。

③将n-1 个盘子从B针借助A针移到C盘上。

例如:要想将A针上的3个盘子移到C针上,可以分解为以下三步: ①将A针上的2个盘子移到B针上(借助C针)。 ②将A针上的一个盘子移到C针上。

③将B针上的2个盘子移到C针上(借助A针)。 其中第②步可直接实现。

第①步又可以用递归方法分解为: a、将A上一个盘子从A移到C。 b、将A上一个盘子从A移到B。 c、将C上一个盘子从C移到B。 第③步可以分解为:

a、将B上一个盘子从B移到A上。

b、将B上一个盘子从B移到C上。 c、将A上一个盘子从A移到C上。

将以上综合起来,可以得到移动的步骤为:

A C, A B,C B,A C,B A, B C,A C 上面第①步和第③步,都是把n-1个盘子从一个针移到另一个针上,采用的方法是一样的,只是针的名字不同而已。为使之一般化,可以将①步和③步表示为:

将“one:”针上的n-1个盘子移到“two”针上,借助“three”针。

只是在①步和第③步中,one、two、three和A、B、C的对应关系不同。对于第①步,对应关系是:one ---A,two---B,three---C。对于第③步,对应关系是:one----B、two---C、three---A。因此,可以将上面三个步骤分成两类操作:

第一类:将n-1个盘子从一个针移到另一个针上(n>1)。这是一个递归过程。

专业整理 知识分享