计算机二级C语言上机真题(3)【附详解】
【真题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';
}
}
中第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';
}
}