计算机二级C语言上机真题(97)【附详解】
【真题1】 给定程序中,函数fun()的功能是:求输入的两个数中较小的数。 例
如:输入5 10,结果为min is 5。 请改正fun()程序中的错误,使它能得出正确的
结果。 试题程序:
#include < stdio.h >
#include< conio.h >
int fun(int x,___1___)
{ int z;
z=x< y__2__x:y;
return(z);
}
main()
{int a,b,c;
scanf("%d,%d\n",__3___);
c=fun(a,b);
printf("min is %d",c);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是子函数的参数声明部分,C语言
中规定,在函数的形参中不允许出现int x,y 之类的语句,必须指定每一个参
数的类型,所以不能直接写y。
填空2:根据题目的意思,此处是使用三目运算符"?"比较两个数的大小,使用
规则是如果运算符前面的表达式中哪个变量成立,则整个式子就取运算符后面
的哪个变量。
填空3:由算法可以看出,此处是输入变量a和b的值,因为使用了scanf函
数,所以应该使用符号"&",注意两个变量之间的","不能省略。
答案:【1】int y 【2】? 【3】&a,&b
【真题2】 下列给定程序中函数fun()的功能是计算1/n!的值。 例如:给n 输入
5,则输出0.008333。 请改正程序中的错误,使它能得到正确结果。 注意:不要
改动main 函数,不得增行或删行,也不得更改程序的结构。 试题程序:
#include < stdio.h >
#include < conio.h >
/**********************found***********************/
int fun(int n)
{ double result =1.0;
if(n==0)
return 1.0;
while(n >1 && n < 170)
/**********************found***********************/
result *=n++ ;
result=1/result;
return result;
}
main()
{
int n;
printf("Input N:");
scanf("%d",&n);
printf("\n1/%d!=%lf\n",n,fun(n));
}
(2011年2月)
解析: (1)错误:int fun(int n) 正确:double fun(int n)
(2)错误:result *=n++ ; 正确:result *=n-- ;
错误1:函数的返回值为实型数据,所以函数的返回类型应为double。
错误2:根据阶乘的概念,从n 开始,每递减1的数相乘,直到1,因此此处n
递减,而不是递增。
【真题3】 请编写一个函数int fun(int x),它的功能是:判断整数x 是否是同构
数。若是同构数,函数返回1;否则返回0。所谓“同构数”是指这样的数,它出现在
它的平方数的右边。 例如:输入整数5,5的平方数是25,5 是25 中右侧的数,
所以5 是同构数。x 的值由主函数从键盘读入,要求不大于100。 注意:部分源程
序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数
fun 的花括号中填入你编写的若干语句。
#include < conio.h >
#include < stdio.h >
int fun(int x)
{……}
main()
{ int x,y;
clrscr();
printf("\nPlease enter a integer
numbers:");scanf("%d",&x);
if(x >100){printf("data error !\n");exit(0);}
y=fun(x);
if (y) printf("%d YES\n",x);
else printf("%d NO!\n",x);
}
(2011年2月)
解析: 本题的考核点是C语言中的数字运算。 根据同构数的定义,小于10 的
同构数的平方减同构数本身与10 取模结果一定为0,同样位于10 和100之间
的同构数 的平方减同构数本身与100 取模结果也一定为0。我们只需将取模的
结果取反,就可以在是同构数时返回1,在非同构数时返回0。
int fun ( int x )
{ if (x < 10)
return !((x * x - x) % 10);/*假如x 的平方减去x 除10
的余数为0 时,则函数返回1*/
else
return !((x * x - x) % 100); }
【真题1】 下列给定程序中,函数fun()的功能是:通过某种方式实现两个变量值的
交换,规定不允许增加语句和表达式。例如变量a初值为8,b 初值为3,程序运行
后a 中的值为3,b 中的值为8。 试题程序:
#include < conio.h >
#include < stdio.h >
int fun(int *x,int y)
{ __1___ t;
t=*x;*x=y;
return(t)__2__
}
main()
{int a=3,b=8;
printf("%d %d\n ",a,b);
b=fun(__3__,b);
printf("%d %d\n ",a,b);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是声名一个新的变量t,由后面的赋
值语句以及返回语句可以明白这个变量应该是整型的(因为函数的返回值类型
是int)。
填空2:根据题目的意思,此处是子函数的返回语句,由C 语言的知识,每个
语句的结尾都应该使用";" 。
填空3:fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该
把变量的地址作为参数传递(符号"&"是取地址操作)。
答案:【1】int 【2】; 【3】&a
【真题2】 给定程序modi.c 中函数fun的功能是:求两个形参的乘积和商数,并
通过形参返回调用程序。 例如输入:61.82 和 12.65,输出为: c =
782.023000 d = 4.886957。 请改正 fun 函数中的错误,使它能得出正确的结
果。 注意:不要改动 main 函数,
#include < stdio.h >
#include < conio.h >
/**********found**********/
void fun ( double a, b, double x,y )
{/**********found**********/
x = a * b; y = a / b;
}
main ( )
{ double a, b, c, d;
clrscr( );
printf ( "Enter a , b : ");
scanf ( "%lf%lf", &a, &b );
fun ( a , b, &c, &d ) ;
printf (" c = %f d = %f\n ", c, d );
}
解析: 本题的考核点是C语言中函数的入口参数和指针的使用。
函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普
通的变量说明不同,函数参数必须同时具有变量类型和变量名,因此应该把程
序中"void fun ( double a, b, double x,y )"语句改为"void fun ( double a,
double b, double *x, double *y )"或相同作用的语句。
从主函数里的" fun ( a , b, &c, &d ) ; "语句可以看出,fun 函数后两个参数
应为长浮点型数据的指针,因此应该把程序中"x = a * b; y = a / b;"语句改
为"*x = a * b; *y = a / b;"或相同作用的语句。
【真题3】 请编一个函数float fun(double h),函数的功能是对变量h中的值保留
2 位小数,并对第三位进行四舍五入(规定h 中的值为正数)。 例如:h 值为
8.32433,则函数返回8.32; h 值为8.32533,则函数返回8.33。 注意:部分
源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在
函数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
float fun(float h)
{……}
main()
{ float a;
clrscr();
printf("Enter a: ");scanf("%f",&a);
printf("The original data is: ");
printf("%f \n\n",a);
printf("The result: %f\n",fun(a));}
解析: 本题的考核点是类型转换与小数四舍五入的算法。 提示思路:先将原数
值加上要保留位上的位权值的一半,再除以要保留位上的位权值,通过类型的
转换将要舍去部分去掉,最后再通过类型转换将其转换为最终结果。
float fun ( float h )
{ long num;
h=h+0.005;
h=h*100;
num=h; /*对h 求整*/
h=num;
h=h/100;
return h; }
如:输入5 10,结果为min is 5。 请改正fun()程序中的错误,使它能得出正确的
结果。 试题程序:
#include < stdio.h >
#include< conio.h >
int fun(int x,___1___)
{ int z;
z=x< y__2__x:y;
return(z);
}
main()
{int a,b,c;
scanf("%d,%d\n",__3___);
c=fun(a,b);
printf("min is %d",c);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是子函数的参数声明部分,C语言
中规定,在函数的形参中不允许出现int x,y 之类的语句,必须指定每一个参
数的类型,所以不能直接写y。
填空2:根据题目的意思,此处是使用三目运算符"?"比较两个数的大小,使用
规则是如果运算符前面的表达式中哪个变量成立,则整个式子就取运算符后面
的哪个变量。
填空3:由算法可以看出,此处是输入变量a和b的值,因为使用了scanf函
数,所以应该使用符号"&",注意两个变量之间的","不能省略。
答案:【1】int y 【2】? 【3】&a,&b
【真题2】 下列给定程序中函数fun()的功能是计算1/n!的值。 例如:给n 输入
5,则输出0.008333。 请改正程序中的错误,使它能得到正确结果。 注意:不要
改动main 函数,不得增行或删行,也不得更改程序的结构。 试题程序:
#include < stdio.h >
#include < conio.h >
/**********************found***********************/
int fun(int n)
{ double result =1.0;
if(n==0)
return 1.0;
while(n >1 && n < 170)
/**********************found***********************/
result *=n++ ;
result=1/result;
return result;
}
main()
{
int n;
printf("Input N:");
scanf("%d",&n);
printf("\n1/%d!=%lf\n",n,fun(n));
}
(2011年2月)
解析: (1)错误:int fun(int n) 正确:double fun(int n)
(2)错误:result *=n++ ; 正确:result *=n-- ;
错误1:函数的返回值为实型数据,所以函数的返回类型应为double。
错误2:根据阶乘的概念,从n 开始,每递减1的数相乘,直到1,因此此处n
递减,而不是递增。
【真题3】 请编写一个函数int fun(int x),它的功能是:判断整数x 是否是同构
数。若是同构数,函数返回1;否则返回0。所谓“同构数”是指这样的数,它出现在
它的平方数的右边。 例如:输入整数5,5的平方数是25,5 是25 中右侧的数,
所以5 是同构数。x 的值由主函数从键盘读入,要求不大于100。 注意:部分源程
序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数
fun 的花括号中填入你编写的若干语句。
#include < conio.h >
#include < stdio.h >
int fun(int x)
{……}
main()
{ int x,y;
clrscr();
printf("\nPlease enter a integer
numbers:");scanf("%d",&x);
if(x >100){printf("data error !\n");exit(0);}
y=fun(x);
if (y) printf("%d YES\n",x);
else printf("%d NO!\n",x);
}
(2011年2月)
解析: 本题的考核点是C语言中的数字运算。 根据同构数的定义,小于10 的
同构数的平方减同构数本身与10 取模结果一定为0,同样位于10 和100之间
的同构数 的平方减同构数本身与100 取模结果也一定为0。我们只需将取模的
结果取反,就可以在是同构数时返回1,在非同构数时返回0。
int fun ( int x )
{ if (x < 10)
return !((x * x - x) % 10);/*假如x 的平方减去x 除10
的余数为0 时,则函数返回1*/
else
return !((x * x - x) % 100); }
【真题1】 下列给定程序中,函数fun()的功能是:通过某种方式实现两个变量值的
交换,规定不允许增加语句和表达式。例如变量a初值为8,b 初值为3,程序运行
后a 中的值为3,b 中的值为8。 试题程序:
#include < conio.h >
#include < stdio.h >
int fun(int *x,int y)
{ __1___ t;
t=*x;*x=y;
return(t)__2__
}
main()
{int a=3,b=8;
printf("%d %d\n ",a,b);
b=fun(__3__,b);
printf("%d %d\n ",a,b);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是声名一个新的变量t,由后面的赋
值语句以及返回语句可以明白这个变量应该是整型的(因为函数的返回值类型
是int)。
填空2:根据题目的意思,此处是子函数的返回语句,由C 语言的知识,每个
语句的结尾都应该使用";" 。
填空3:fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该
把变量的地址作为参数传递(符号"&"是取地址操作)。
答案:【1】int 【2】; 【3】&a
【真题2】 给定程序modi.c 中函数fun的功能是:求两个形参的乘积和商数,并
通过形参返回调用程序。 例如输入:61.82 和 12.65,输出为: c =
782.023000 d = 4.886957。 请改正 fun 函数中的错误,使它能得出正确的结
果。 注意:不要改动 main 函数,
#include < stdio.h >
#include < conio.h >
/**********found**********/
void fun ( double a, b, double x,y )
{/**********found**********/
x = a * b; y = a / b;
}
main ( )
{ double a, b, c, d;
clrscr( );
printf ( "Enter a , b : ");
scanf ( "%lf%lf", &a, &b );
fun ( a , b, &c, &d ) ;
printf (" c = %f d = %f\n ", c, d );
}
解析: 本题的考核点是C语言中函数的入口参数和指针的使用。
函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普
通的变量说明不同,函数参数必须同时具有变量类型和变量名,因此应该把程
序中"void fun ( double a, b, double x,y )"语句改为"void fun ( double a,
double b, double *x, double *y )"或相同作用的语句。
从主函数里的" fun ( a , b, &c, &d ) ; "语句可以看出,fun 函数后两个参数
应为长浮点型数据的指针,因此应该把程序中"x = a * b; y = a / b;"语句改
为"*x = a * b; *y = a / b;"或相同作用的语句。
【真题3】 请编一个函数float fun(double h),函数的功能是对变量h中的值保留
2 位小数,并对第三位进行四舍五入(规定h 中的值为正数)。 例如:h 值为
8.32433,则函数返回8.32; h 值为8.32533,则函数返回8.33。 注意:部分
源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在
函数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
float fun(float h)
{……}
main()
{ float a;
clrscr();
printf("Enter a: ");scanf("%f",&a);
printf("The original data is: ");
printf("%f \n\n",a);
printf("The result: %f\n",fun(a));}
解析: 本题的考核点是类型转换与小数四舍五入的算法。 提示思路:先将原数
值加上要保留位上的位权值的一半,再除以要保留位上的位权值,通过类型的
转换将要舍去部分去掉,最后再通过类型转换将其转换为最终结果。
float fun ( float h )
{ long num;
h=h+0.005;
h=h*100;
num=h; /*对h 求整*/
h=num;
h=h/100;
return h; }