2011年全国计算机等级C考试二级填空题

举报
资源描述
题目:请补充fun函数,fun函数的功能是求10的阶乘。注意:部分源程序如blank.c给出。请勿改动主函数main和其他函数中的任何内容,仅 在 fun函数的横线上填入所编写的若干表达式或语句。#include long fun(int n)(if(一 1一)return(n*fun(_2_);else if(3)return 1;)main()(int k=10;printf(,%d!=%ldn,k,fun(k);分析:整个程序是计算10的阶乘,而 n 的阶乘是这样计算的:n!=n*(n-l)*(n-2)*(n-3)*.*3*2*1其中n0并且n 为自然数。所以,10的阶乘就是计算10*9*8*7*6*5*4*3*2*1的结果,换句话说就是计算1 至 10之间所有自然数的乘积。从程序来看,fun函数就是计算阶乘的函数,但是在fun函数中又调用了自己,即第五行return(n*fun(2);中 fun函数又调用了 fun函数,这种函数自己调用自身的现象在程序设计中称为递归,使用递归这种程序设计方法对设计人员的程序设计能力有较高的要求。计算阶乘是递归程序设计的 个经典示例。计算某个数的阶乘就是用那个数去乘包括1在内的所有比它小的数。例如,fun(5)等 价 于 5*4*3*2*1,而 fun 等 价 于 3*2*1。阶乘的个有趣特性是,某个数的阶乘等于起始数(starting num ber)乘以比它小的数的阶乘。例如,fun(5)V 5*fun(4)相同。您很可能会像这样编写阶乘函数fun:int fun(int n)(return n*fun(n-1);)不过,这个函数的问题是,它会永远运行下去,因为它没有终止的地方。函数会连续不断地 调 用 fun。当计算到零时,没有条件来停止它,所以它会继续调用零和负数的阶乘。因此,我们的函数需要一个条件,告诉它何时停止。由于 小 于 1 的数的阶乘没有任何意义,所以我们在计算到数字1 的时候停止,并 返 回 1的 阶 乘(即 1)。因此,真正的递归函数类似于:int fun(int n)(if(n=1)return 1;)else(return n*fun(n-1);题目:请在函数fun的横线上填写若干表达式,使从键盘上输入一个整数n,输出斐波纳契数列.斐波纳契数列是一种整数数列,其中每数等于前面两数之和,如 0 1 1 2 3 5 8 1 3 注意:部分源程序如blank.c给出。请勿改动主函数main和其他函数中的任何内容,仅 在 fun函数的横线上填入所编写的若干表达式或语句。#include int fun(int n);main()(int i,n=0;scanf(d”,&n);for(i=0;i 1当 n 等于0 的时候,即计算斐波纳契数列的第 个数字,根据题目知道该数列的第一个数字为0。当 n 等 于 1 的时候,即计算斐波纳契数列的第二个数字,字 为 1 O当 n 等于2 的时候,即计算斐波纳契数列的第三个数字,之和,所以 fun(2)=fun(l)+fun(0)。当 n 等于3 的时候,即计算斐波纳契数列的第四个数字,之和,所以 fun(3)=fun(2)+fun(I)。根据题目知道该数列的第二个数山于该数列中每数等于前面两数由于该数列111 每数等于前面两数所以当 n 大于 1 的时候,fun(n)=fun(n-1 )+fun(n-2)o这里存在函数调用本身的现象,这种现象在程序设计中称为递归。题目:请补充函数fun(char*s),该函数的功能是把字符串中的内容逆置。例如:字符串中原有的字符串为abcde,则调用该函数后,串中的内容为edcba。注意:部分源程序如blank.c给出。请勿改动主函数main和其他函数中的任何内容,仅 在 fun函数的横线上填入所编写的若干表达式或语句。#include#include#include#defineN81void fun(char*s)int i=O,t,n=strlen(s);for(;1;i+)t=*(s+i);2:3main()char aNJ;clrscr();printf(nEnter a string:);gets(a);printf(The original string is:);puts(a);fun(a);printf(nn);printf(MThe string after modified:*);puts(a);3分析:将字符串中的内容逆置主要思路分析如下:(1)在字符串第一个字母位置和最后一个字母位置各自设置一个指示器A 和 B,它们分别指向第一个字母和最后一个字母,然后A 位置的字母和B 位置的字母进行互换。(2)互换结束之后指示器A 移动到第二个字母,而指示器B 移动到倒数第二个字母,即指示器A 往后移动一个字母位置,而指示器B 往前移动一个字母位置,然后A 位置的字母和 B 位置的字母进行互换。(3)互换结束之后指示器A 往后再次移动一个字母位置,而指示器B 再次往前移动一个字母位置,然后A 位置的字母和B 位置的字母进行互换。(4)以上过程反复进行,只有指示器B 的位置小于指示器A 的位置,即指示器B 指向的位置在指示器A 指向的位置的左边的情况下才结束,所以以上过程可以使用循环语句实现,循环终止条件可以判断指示器B 的位置是否小于指示器A 的位置。为了实现以上思路,我们观察fun函数。fun函数的功能就是将传入的s 参数作为字符串进行内容逆置,它的逆置方法和我们分析的思路是一致的。它使用了 for循环语句进行循环,循环体中使用指针-s+i作为指示器A,而指示器B 使用s+n-1-i表示。其中i 每次循环加一,而 n=strlen(s),为传入的字符串的长度。strlen函数可以得到s 参数的字符串中包含的字母个数。为什么指针s+i可以作为指示器A 呢?由于指针s 对 应 main函数传入的a 数组,而 C 语言中数组名称就是一个指向数组第一个元素的指针,所以数组a 的名称a 就是一个char类型的指针,即为char*a;。所以指针s 指向传入的字符串的第一个字母,所以可以使用s 作为指示器A 的初始值。而每次循环i 都加一,在 C 语言语法中,一个指针加上一个整数表示一个新指针,该指针指向原指针向后移动所加上整数个数的位置,所以s+1指向字母b”,s+2指向字母 c ,依次类推。那为什么s+n-1-i可以作为指示器B 呢?如果传入的字符串为abcde,s 指针指向字母a”,n 为字符串为abcde”的长度,即字符串abcde”的字母个数,即为5。一个指针加上一个整数表示,个新指针,该指针指向原指针向后移动所加上整数个数的位置,所以s+5表示指向从字母 a”向后移动5 个位置的新指针,即字母 e”后面一个位置,而我们希望指示器B 指向字母e,所 以 s+n-1才是指示器B 的初始值。每次循环i 都加一,在 C 语言语法中,一个指针减去一个整数表示一个新指针,该指针指向原指针向前移动所减去整数个数的位置。例如s+n-1指向字母e,s+n-1-l指向字母d,s+n-1-2指向字母上,依次类推。进行逆置的for循环终止条件是判断指示器A 的位置是否在指示器B 的位置的右边,那么循环继续的条件就是指示器A 的位置应该在指示器B 的位置的左边。根据C 语言的语法,指 针 P1在指针P 2 的左边可以使用PK P2表示。所以fun函数第一个填空处应该填写指示器 A指示器 B,即 s+is+n-l-io分析到这里,fun函数剩下的两个填空应该填写什么呢?for循环体中应该进行指示器A 和指示器B 两个位置的字母互换。t=*(s+i);语句先把指示器A 位置的字母保存在t 变量中,然后将指示器B 位置的字母覆盖指示器A 位置的字母,然后将预先保留在t 变量中的指示器A位置的字母覆盖指示器B 位置的字母,这样即完成两个位置的字母互换。根据C 语言的语法,取得指针指向位置的值应该使用*运算符。所以指示器A 位置的字母使用*(s+i)表示,而指示器B 位置的字母使用*(s+n-l-i)表示,所以第二处填空处应该填写*(s+i)=*(s+n-l-i),而第三处填空处应该填写*(s+n-l-i)=t。程序注解如下:#include#include#include#define N 81/*fun函数的功能是把字符串中的内容逆置*/void fun(char*s)(/*定义存放要逆置的字符串的字符数组*/int i=O,t,n=strlen(s);for(;s+is+n-1 -i;i+)t=*(s+i);*(s+i)=*(s+n-l-i);*(s+n-l-i)=t;)main()(/*定义存放要逆置的字符串的字符数组*/char aN;/*clrscr函数定义在conio.h头文件中,所以需要#m41110 */*clrscr函数的作用是进行清屏*/*所谓清屏是指将已经显示在DOS窗口的所有内容清除*/clrscr();/*在一经进行清屏的DOS窗口中显示 Enter a string:的提示信息*/printf(Enter a string:1);/*gets函数定义在stdio.h头文件中,所以需要#吊9 11(1 */*gets函数的作用是接收用户从键盘上输入字符串,然后放入参数a 数 组 中*/gets(a);/*在 DOS窗中显示The original string is:的提示信息*/printf(uThe original string is:);/*puts函数定义在stdio.h头文件中,所以需Hnclude */*puts函数的作用是将参数a 数组中的内容输出到DOS窗口*/puts(a);/*fun函数的作用是将a 数组中的字符串进行逆置*/fun(a);/*输出换行符,可以使DOS窗口输出信息的位置移动到下 一 行*/printf(n);/*在新的一行输出The string after modified:提示信息*/printf(nThe string after modified:);/*输出参数a 数组中的内容,即进行逆置之后的结果*/puts(a);题目:请补充函数fu n,它的功能是:计算并输出n(包括n)以内能被3 或 7 整除的所有自然数的倒数之和。例如,在主函数中从键盘给n 输入30后,输出为:s=1.226323。注意:部分源程序如blank.c给出。请勿改动主函数main和其他函数中的任何内容,仅 在 fun函数的横线上填入所编写的若干表达式或语句。#include double fun(int n)(inti;double sum=0.0;if(n0&n=100)(for(i=l;-1;i+)if(2)sum+=_3_;)return sum;main()(int n;double s;printf(nlnput n:);scanf(n%dM,&n);s=fun(n);pri ntf(nns=%fn,s);)4分析:要计算并输出n(包括n)以内能被3 或 7 整除的所有自然数的倒数之和,可以设计总体思路如下:由于计算n(包括n)以内能被3 或 7 整除的所有自然数的倒数之和,所以我们可以使用循环一个一个地检查从1 到 n 范围中的这些数字是否能被3 或者7 整除,如果可以整除,则计算当前循环检查的数字i 的倒数,i 的倒数计算方法如下:1.0/i。由于计算的是倒数之和,所以程序中需要使用一个变量sum保存倒数之和,这一个变量初始值应该为0.0,然后每次循环的时候一旦发现当前检查的数字i 能被3 或 者 7 整除,就将sum变量的值加上数字i 的倒数,然后将得到的和覆盖sum变量,即 sum变量始终保存当前循环为止检查的能被3 或 7 整除的数字的倒数之和。当循环结束的时候,sum变量的值就是结果。判断数字i 能被3 或者7 整除可以使用取模运算()。根据C 语言语法,取模运算就是取余数,例如5%2=3,因为5 除以2 得到的商为1,余数为3。i
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号