计算机二级C语言上机真题(31)【附详解】
【真题1】 请补充函数fun,该函数的功能是比较字符串str1 和str2 的大小,并返
回比较的结果。
例如: 当str1=“cdef”,str2=“cde”时,函数fun()返回“ >”。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编
写的若干表达式或语句。
试题程序:
#include< stdio.h >#include< conio.h >#define N 80
char *fun(char *str1,char *str2)
{ char *p1=str1,*p2=str2;
while(*p1&&*p2)
{
if(【1】)
return "< ";
if(【2】)
return " >";
p1++;
p2++;
}
if(*p1==*p2)
return "==";
if(*p1==【3】)
return "< ";
else
return " >";
}
main()
{ char str1[N],str2[N];
clrscr();
printf("Input str1:\n");
gets(str1);
printf("Input str2:\n");
gets(str2);
printf("\n*****the result*****\n");
printf("\nstr1 %s str2",fun(str1,str2));
}
(2011年2月)
解析: 填空1:比较两个字符串的大小,是从第一个字符开始比较,如果两字
符不相等,则由字符的大小决定字符串的大小;如果两字符相等,则继续比较
下一个字符,如果所有字符都相等,则两字符串相等。指针P1 指向字符串
str1,指针P2指向字符串str2,如果p1 所指的字符小于p2 所指的字符,则
字符串str1 小于字符串str2。填空2:如果p1 所指的字符大于p2 所指的字
符,则字符串str1 大于字符串str2。填空3:如果str1是str2 的前一部分,
则str1 的所有字符都等于str2 中的对应字符,而字符串结束标记符‘\0'小于其
他字符,所以,这里如果p1 所指的字符等于'\0',则表示字符串str1 小于字符
串str2。
答案:【1】*p1< *p2 【2】*p1 >*p2 【3】′\0′
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据以下公式求π 值,并作
为函数值返回。
π 1 1 2 1 2 3 1 2 3 4
─ = 1 + ─ + ─×─ + ─×─×─ + ─×─×─×─ +……
2 3 3 5 3 5 7 3 5 7 9
例如,给指定精度的变量eps 输入0.0005 时,应当输出Pi=3.140578。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < math.h >#include < stdio.h >double
fun(double eps)
{ double s,t; int n=1;
s=0.0;
/************found************/
t=0;
while (t >eps)
{s+=t;
t=t*n/(2*n+1);
n++;
}
/************found************/
return(s);
}
main()
{double x;
printf("\nPlease enter a precision:");scanf("%lf",&x);
printf("\neps=%lf,Pi=%lf\n\n",x,fun(x));
}
(2011年2月)
解析: 本题的考核点是根据公式求π 值。
本题中的第一个错误:变量t是用来累计表达式的乘积,它的初值应为1,所以
程序中的语句"t=0;"应改为"t=1;";
本题中的第二个错误:由程序可知,变量s 中存放的是π/2 的值,而不是π的
值,所以程序中的语句"return(s);"应改为"return(s*2);"或相同作用的语
句。
本评析仅作参考。
【真题3】 请编写一个函数fun,它的功能是:找出一维整型数组元素中最大的值和
它所在的下标, 最大的值和它所在的下标通过形参传回。数组元素中的值已在主函
数中赋予。主函数中x是数组名, n 是x中的数据个数,max 存放最大值,index
存放最大值所在元素的下标。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdlib.h >#include < stdio.h >void fun(int a[], int n , int
*max, int *d )
{……}
main()
{ int i, x[20], max , index, n = 10;
randomize() ;
for (i=0;i < n;i++) {x[i] = rand()%50; printf("%4d", x[i]) ; }
printf("\n");
fun( x, n , &max, &index);
printf("Max =%5d , Index =%4d\n",max, index );
}
(2011年2月)
解析: 本题的考核点是数组、循环语句和比较算法。
提示思路:先取出数组中的第一个元素,然后通过循环语句依次用数组中的其
他元素与其作比较,如果大于第一个元素则交换两者的值,并记录此数组元素
的下标,直到数组中的元素都比较完为止。
#include < stdlib.h >
#include < stdio.h >
void fun(int a[], int n , int *max, int *d )
{ int i,base,subscript;
base=a[0]; /*假定第一个元素的值最大*/
subscript=0; /*subscript 用于存放数组下标*/
for(i=1;i< n;i++) {
if(a[i] >base) { /*将数组中的其他元素与变量base作比较,如果大于它则
交换两者的值*/
subscript=i;
base=a[i];
}
}
*max=base; /*将最大值元素的值赋给*max*/
*d=subscript; /*将最大值元素的下标赋给*d*/
}
回比较的结果。
例如: 当str1=“cdef”,str2=“cde”时,函数fun()返回“ >”。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编
写的若干表达式或语句。
试题程序:
#include< stdio.h >#include< conio.h >#define N 80
char *fun(char *str1,char *str2)
{ char *p1=str1,*p2=str2;
while(*p1&&*p2)
{
if(【1】)
return "< ";
if(【2】)
return " >";
p1++;
p2++;
}
if(*p1==*p2)
return "==";
if(*p1==【3】)
return "< ";
else
return " >";
}
main()
{ char str1[N],str2[N];
clrscr();
printf("Input str1:\n");
gets(str1);
printf("Input str2:\n");
gets(str2);
printf("\n*****the result*****\n");
printf("\nstr1 %s str2",fun(str1,str2));
}
(2011年2月)
解析: 填空1:比较两个字符串的大小,是从第一个字符开始比较,如果两字
符不相等,则由字符的大小决定字符串的大小;如果两字符相等,则继续比较
下一个字符,如果所有字符都相等,则两字符串相等。指针P1 指向字符串
str1,指针P2指向字符串str2,如果p1 所指的字符小于p2 所指的字符,则
字符串str1 小于字符串str2。填空2:如果p1 所指的字符大于p2 所指的字
符,则字符串str1 大于字符串str2。填空3:如果str1是str2 的前一部分,
则str1 的所有字符都等于str2 中的对应字符,而字符串结束标记符‘\0'小于其
他字符,所以,这里如果p1 所指的字符等于'\0',则表示字符串str1 小于字符
串str2。
答案:【1】*p1< *p2 【2】*p1 >*p2 【3】′\0′
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据以下公式求π 值,并作
为函数值返回。
π 1 1 2 1 2 3 1 2 3 4
─ = 1 + ─ + ─×─ + ─×─×─ + ─×─×─×─ +……
2 3 3 5 3 5 7 3 5 7 9
例如,给指定精度的变量eps 输入0.0005 时,应当输出Pi=3.140578。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < math.h >#include < stdio.h >double
fun(double eps)
{ double s,t; int n=1;
s=0.0;
/************found************/
t=0;
while (t >eps)
{s+=t;
t=t*n/(2*n+1);
n++;
}
/************found************/
return(s);
}
main()
{double x;
printf("\nPlease enter a precision:");scanf("%lf",&x);
printf("\neps=%lf,Pi=%lf\n\n",x,fun(x));
}
(2011年2月)
解析: 本题的考核点是根据公式求π 值。
本题中的第一个错误:变量t是用来累计表达式的乘积,它的初值应为1,所以
程序中的语句"t=0;"应改为"t=1;";
本题中的第二个错误:由程序可知,变量s 中存放的是π/2 的值,而不是π的
值,所以程序中的语句"return(s);"应改为"return(s*2);"或相同作用的语
句。
本评析仅作参考。
【真题3】 请编写一个函数fun,它的功能是:找出一维整型数组元素中最大的值和
它所在的下标, 最大的值和它所在的下标通过形参传回。数组元素中的值已在主函
数中赋予。主函数中x是数组名, n 是x中的数据个数,max 存放最大值,index
存放最大值所在元素的下标。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdlib.h >#include < stdio.h >void fun(int a[], int n , int
*max, int *d )
{……}
main()
{ int i, x[20], max , index, n = 10;
randomize() ;
for (i=0;i < n;i++) {x[i] = rand()%50; printf("%4d", x[i]) ; }
printf("\n");
fun( x, n , &max, &index);
printf("Max =%5d , Index =%4d\n",max, index );
}
(2011年2月)
解析: 本题的考核点是数组、循环语句和比较算法。
提示思路:先取出数组中的第一个元素,然后通过循环语句依次用数组中的其
他元素与其作比较,如果大于第一个元素则交换两者的值,并记录此数组元素
的下标,直到数组中的元素都比较完为止。
#include < stdlib.h >
#include < stdio.h >
void fun(int a[], int n , int *max, int *d )
{ int i,base,subscript;
base=a[0]; /*假定第一个元素的值最大*/
subscript=0; /*subscript 用于存放数组下标*/
for(i=1;i< n;i++) {
if(a[i] >base) { /*将数组中的其他元素与变量base作比较,如果大于它则
交换两者的值*/
subscript=i;
base=a[i];
}
}
*max=base; /*将最大值元素的值赋给*max*/
*d=subscript; /*将最大值元素的下标赋给*d*/
}