【真题1】 下列给定程序中,函数fun()的功能是:用递归算法计算斐波拉契级数列 中第n 项的值。从第一项起,斐波拉契级数序列为1,1,2,3,5,8,13, 21,……,例如,若给n 输入7,该项的斐波拉契级数值为13。 #include < stdio.h > long fun(int g) { switch(g){ case 0: return 0; case 1: __【1】__: return 1; } return (__【2】__); } main() { long fib; int n; printf("Input n:"); scanf("%d",__【3】__); printf("n=%d\n",n); fib=fun(n); printf("fib=%d\n\n", fib); } (2011年2月) 解析: 填空1:根据题目的意思,这里应该是对于值为1 和2 的时候的处理, 注意case语句常量后应用的是冒号,而且不同的case对应同一个值可以连续 写(像题目中那样)。 填空2:根据题目的意思,此处是求值的递归部分,由递推公式可以很容易的得 到答案的形式,对于这种简单的递归考生一定要掌握。 填空3:由算法可以看出,此处是输入数列的项数n,使用了scanf函数,其参 数应该是变量的地址,即使用符号"&" 。 答案:【1】case 2 【2】fun(g-1)+fun(g-2) 【3】&n 【真题2】 给定程序modi.c 中,函数fun 的功能是:按以下递归公式求函数值 fun(n)=10 (n=1),fun(n)=fun(n-1)+2 (n>1) 例如,当给n 输入5 时,函数 值为18;当给n 输入3 时,函数值为14。 请改正程序中的错误,使它能得出正确 结果。 注意:不要改动main 函数。 #include < stdio.h > fun(n) { int c; /************found************/ if (n=1) c=10; else c=fun(n-1)+2; return(c); } main() { int n; printf("Enter n:"); scanf("%d",&n); printf("The result:%d\n\n", fun(n)); } 解析: 本题着重考察考生对递归算法的掌握情况。 在C 语言中,"="是指赋值号,要判断表达式相等,需用"==",所以程序中的 语句"if (n=1)"应改为"if (n==1)"或相同作用的语句。 【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是: 使字符串最前面连续的*号不得多于n个;若多于n 个,则删除多余的*号;若少于 或等于n 个,则什么也不做,字符串中间和尾部的*号不删除。例如,字符串中的内 容为:*******A*BC*DEF*G****,若n 的值为4,删除后,字符串中的内容应 当是:****A*BC*DEF*G****;若n 的值为8,则字符串中的内容仍为: *******A*BC*DEF*G****。n 的值在主函数中输入。在编写函数时,不得使用 C 语言提供的字符串函数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函 数main 和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语 句。 #include < stdio.h > #include < conio.h > void fun(char *a, int n) {……} main() { char s[81];int n; printf("Enter a string:\n"); gets(s); printf("Enter n:"); scanf("%d",&n); fun(s,n); printf("The string after deleted:\n"); puts(s); } (2011年2月) 解析: 本题的考核点是删除字符串中字符的算法。 解题思路:先统计字符串前 连续的*号个数,与指定的个数进行判断,若小于等于指定的数,什么也不做, 若大于指定的数,则删除多余的*,删除的方法是:用一个循环先生成指定个数 个*放入到一字符串中,再将从原串中非*字符开始至字符串尾的字符追加其 后,最后用新串覆盖原串。 本评析仅供参考。 void fun(char *a,int n) { char b[81]; int i=0, j=0, s=0, k; while (a[i]=='*') {s++;i++;} /*统计字符串前连续的*号个数 */ if (s>n) /*判断字符串前连续的*号个数是否大于n*/ { for (k=0; k<n; k++) {b[j]='*'; j++;} while (a[i]) /*这里的i 在前面*时已经移不是*字符的位置*/ {b[j]=a[i]; j++; i++;} b[j]='\0'; i=0; j=0; while (b[j]) /*将字符串b 中的所有字符复制到a 字符串中覆盖 原串*/ {a[i]=b[j]; i++; j++;} a[i]='\0'; } } |