计算机二级C语言上机真题(36)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:计算s 所指字符串中含有t 所指
字符串的数目,并作为函数值返回。
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >#define N
80
int fun(char *s,char *t)
{ int n;
char *p, *r;
n=0;
while(*s)
{ p=s;
r=t;
while(*r)
if(*r==*p) {r++; ___1__;}
else break;
if(*r==__2___)
n++;
__3___;
}
return n;
}
main()
{char a[N],b[N]; int m;
printf("\nPlease enter string a: ");gets(a);
printf("\nPlease enter substring b: "); gets(b);
m=fun(a,b);
printf("\nThe result is :m=%d\n",m);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是把要比较的字符串和原字符串的
一部分进行逐个字符的比较,所以指向原字符串的指针p也应该进行每步加一
的操作。
填空2:根据题目的意思,此处是判断上一步的比较是否与r 指向的完整的字符
串相等,如果完全相同,则r应该指向字符串的末尾,即'\0'。
填空3:由算法可以看出,这里应该是进行的整个while循环,即应该控制s
指针不停的向后移动直到字符串结尾。
答案:【1】p++ 【2】'\0' 【3】s++
【真题2】 给定程序modi.c 中,函数fun 的功能是:求出以下分数序列的前n 项
之和。
1 2 3 5 8 13
─,─,─,─,─,─,……
2 3 5 8 13 21
和值通过函数值返回main 函数。
例如,若n 的值为:5,则应输出:3.007051。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >double fun(int n)
{ int i;
double t,s,a,b,c;
/************found************/
s=1;
a=1;b=2;
for(i=0;i< n;i++)
{ t=a/b;
s=s+t;
/************found************/
______;
a=b;
b=c;
}
return s;
}
main()
{ int n;
printf("Enter n: ");scanf("%d",&n);
printf("\nThe result: %f \n",fun(n));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
本题中的第一个错误:程序中的变量s是用来统计分式和的,它的初始值应为
0,所以程序中语句"s=1;"应改为"s=0;"或相同作用的语句。
本题中的第二个错误:由题意可知,变量c 是用来求前一分式的分子与分母的
和,所以在横线处应填入"c=a+b;"或相同作用的语句。
【真题3】 给定程序prog.c 中,在主函数中从键盘输入若干个数放入数组中,用0
结束输入并放在最后一个元素中。下列程序中,函数fun 的功能是:计算数组元素中
值为正数的平均值(不包括0)。
例如:数组中元素中的值依次为:39,-47,21,2,-8,15,0,则程序的运行结
果为:19.250000。
#include < conio.h >#include < stdio.h >double fun(int x[])
{……}
main()
{ int x[1000];int i=0;
clrscr();
printf("\nPlease enter some data (end with 0):");
do
{ scanf("%d",&x[i]);}
while (x[i++]!=0);
printf("%f\n",fun(x));
}
(2011年2月)
解析: 本题的考核点是C语言中不同数据类型的使用以及运算符的使用。
答案:double fun(int x[])
{double sum=0.0;
int c=0,i=0;
while (x[i]!=0)
{ if (x[i] >0) {
sum+=x[i];c++;}
i++;
}
sum/=c;
return sum;
}
字符串的数目,并作为函数值返回。
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >#define N
80
int fun(char *s,char *t)
{ int n;
char *p, *r;
n=0;
while(*s)
{ p=s;
r=t;
while(*r)
if(*r==*p) {r++; ___1__;}
else break;
if(*r==__2___)
n++;
__3___;
}
return n;
}
main()
{char a[N],b[N]; int m;
printf("\nPlease enter string a: ");gets(a);
printf("\nPlease enter substring b: "); gets(b);
m=fun(a,b);
printf("\nThe result is :m=%d\n",m);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是把要比较的字符串和原字符串的
一部分进行逐个字符的比较,所以指向原字符串的指针p也应该进行每步加一
的操作。
填空2:根据题目的意思,此处是判断上一步的比较是否与r 指向的完整的字符
串相等,如果完全相同,则r应该指向字符串的末尾,即'\0'。
填空3:由算法可以看出,这里应该是进行的整个while循环,即应该控制s
指针不停的向后移动直到字符串结尾。
答案:【1】p++ 【2】'\0' 【3】s++
【真题2】 给定程序modi.c 中,函数fun 的功能是:求出以下分数序列的前n 项
之和。
1 2 3 5 8 13
─,─,─,─,─,─,……
2 3 5 8 13 21
和值通过函数值返回main 函数。
例如,若n 的值为:5,则应输出:3.007051。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >double fun(int n)
{ int i;
double t,s,a,b,c;
/************found************/
s=1;
a=1;b=2;
for(i=0;i< n;i++)
{ t=a/b;
s=s+t;
/************found************/
______;
a=b;
b=c;
}
return s;
}
main()
{ int n;
printf("Enter n: ");scanf("%d",&n);
printf("\nThe result: %f \n",fun(n));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
本题中的第一个错误:程序中的变量s是用来统计分式和的,它的初始值应为
0,所以程序中语句"s=1;"应改为"s=0;"或相同作用的语句。
本题中的第二个错误:由题意可知,变量c 是用来求前一分式的分子与分母的
和,所以在横线处应填入"c=a+b;"或相同作用的语句。
【真题3】 给定程序prog.c 中,在主函数中从键盘输入若干个数放入数组中,用0
结束输入并放在最后一个元素中。下列程序中,函数fun 的功能是:计算数组元素中
值为正数的平均值(不包括0)。
例如:数组中元素中的值依次为:39,-47,21,2,-8,15,0,则程序的运行结
果为:19.250000。
#include < conio.h >#include < stdio.h >double fun(int x[])
{……}
main()
{ int x[1000];int i=0;
clrscr();
printf("\nPlease enter some data (end with 0):");
do
{ scanf("%d",&x[i]);}
while (x[i++]!=0);
printf("%f\n",fun(x));
}
(2011年2月)
解析: 本题的考核点是C语言中不同数据类型的使用以及运算符的使用。
答案:double fun(int x[])
{double sum=0.0;
int c=0,i=0;
while (x[i]!=0)
{ if (x[i] >0) {
sum+=x[i];c++;}
i++;
}
sum/=c;
return sum;
}