计算机二级C语言上机真题(32)【附详解】
【真题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 的功能是:求S 的值。设
1^2 4^2 6^2 (2k)^2
S = ── * ── * ── * …… * ───────
1*3 3*5 5*7 (2k-1)*(2k+1)
例如,当k 为10 时,函数值应为:1.533852。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >#include < math.h
>/************found************/
fun(int k)
{ int n;float s,w,p,q;
n=1;
s=1.0;
while(n< =k)
{w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
/************found************/
return s
}
main()
{clrscr();
printf("%f\n",fun(10));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中函数定义、引用及参数传递的掌握情况。
本题中的第一个错误:由于函数返回的值应为float型或double型,所以程序
中的语句"fun(int k)"应改为"float fun(int k)"或相同作用的语句。
本题中的第二个错误:在C 语言中,语句以分号作为分隔符,所以程序中语句
"return s"应改为"return s;"或相同作用的语句。
【真题3】 请补充main 函数,该函数的功能是:如果数组aa 的前一个元素比后一
个元素小,则把它保存在数组bb 中并输出。
例如,输入“40,51,62,33,35,52,48,95,66,73”,则结果输出“40,
51,33,35,48,66”。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在main 函数的横线处填入所编
写的若干表达式或语句。
试题程序:
#include < stdio.h >#define N 10
main()
{ int i,n=0;
int aa[N]={40,51,62,33,35,52,48,95,
66,73};
int bb[N];
clrscr(); ____________________
}
(2011年2月)
解析: 在以上横线处编写代码如下:
for(i=0;i< N-1;i++)
if(aa[i]< aa[i+1])
bb[n++]=aa[i];
printf("\n*** display bb ***\n");
for(i=0;i< n;i++)
printf("bb[%d]=%2d ", i,bb[i]);
字符串的数目,并作为函数值返回。
试题程序:
#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 的功能是:求S 的值。设
1^2 4^2 6^2 (2k)^2
S = ── * ── * ── * …… * ───────
1*3 3*5 5*7 (2k-1)*(2k+1)
例如,当k 为10 时,函数值应为:1.533852。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >#include < math.h
>/************found************/
fun(int k)
{ int n;float s,w,p,q;
n=1;
s=1.0;
while(n< =k)
{w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
/************found************/
return s
}
main()
{clrscr();
printf("%f\n",fun(10));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中函数定义、引用及参数传递的掌握情况。
本题中的第一个错误:由于函数返回的值应为float型或double型,所以程序
中的语句"fun(int k)"应改为"float fun(int k)"或相同作用的语句。
本题中的第二个错误:在C 语言中,语句以分号作为分隔符,所以程序中语句
"return s"应改为"return s;"或相同作用的语句。
【真题3】 请补充main 函数,该函数的功能是:如果数组aa 的前一个元素比后一
个元素小,则把它保存在数组bb 中并输出。
例如,输入“40,51,62,33,35,52,48,95,66,73”,则结果输出“40,
51,33,35,48,66”。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在main 函数的横线处填入所编
写的若干表达式或语句。
试题程序:
#include < stdio.h >#define N 10
main()
{ int i,n=0;
int aa[N]={40,51,62,33,35,52,48,95,
66,73};
int bb[N];
clrscr(); ____________________
}
(2011年2月)
解析: 在以上横线处编写代码如下:
for(i=0;i< N-1;i++)
if(aa[i]< aa[i+1])
bb[n++]=aa[i];
printf("\n*** display bb ***\n");
for(i=0;i< n;i++)
printf("bb[%d]=%2d ", i,bb[i]);