内容发布更新时间 : 2024/11/8 14:56:11星期一 下面是文章的全部内容请认真阅读。
完美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
/**********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
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 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
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
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)。这是一个递归过程。
专业整理 知识分享