计算机二级C语言上机真题(89)【附详解】
【真题1】 给定程序的功能是根据公式求P 的值,结果由函数值带回。m 与n 为两
个整数且要求m >n。 m! P = ───── n!(m-n)! 例如:m=11,n=4 时,运行结果为330.000000。 请在程序的下划线处填入正确的内容并把下划线删除,使
程序得出正确结果。
#include < stdio.h >
long jc(int m)
{ long s=1;
int i ;
/**************found**************/
for(i=1;i< =m;i++) s=___1___ ;
return s;
}
float fun(int m, int n)
{ float p;
/**************found**************/
p=1.0*jc(m)/jc(n)/jc(___2___) ;
/**************found**************/
___3___;
}
main()
{ printf("p=%f\n", fun (11,4));
}
(2011年2月)
解析: 本题的考核点是求阶乘的算法。
提示思路:分别通过for 循环来求得m的阶乘,n 的阶乘,(m-n)的阶乘。求
m 阶乘的方法是:从1 到m 累计乘积。
答案:1、s*m 2、m-n 3、return p
【真题2】 给定程序modi.c 中,函数fun 的功能是:求两数平方根之和,作为函
数值返回。 例如,输入12 和20,输出结果是:y=7.936238。 请改正程序中的
错误,使它能得出正确结果。 注意:不要改动main 函数,
#include < conio.h >
#include < math.h >
/************found************/
double fun(double *a,*b)
{ double c;
/************found************/
c=sqr(a)+sqr(b);
return c;
}
main()
{ double a,b,y;
clrscr();
printf("Enter a&b :");scanf("%lf%lf",&a,&b);
y=fun(&a,&b); printf("y=%f\n",y);
}
(2011年2月)
解析: 本题的考核点是C语言中函数的入口参数的用法。
本题中的第一个错误:函数的参数表是由逗号分隔的变量表,变量表由变量类
型和变量名组成,与普通的变量说明不同,函数参数必须同时具有变量类型和
变量名,程序中"double fun(double *a,*b)"语句第二个函数参数没有变量类
型,是错误的,应该改为"double fun(double *a,double *b)"或相同作用的
语句。
本题中的第二个错误:a、b为指针地址,应引用它们的值*a、*b,所以程序中
语句"c=sqr(a)+sqr(b);"应改为"c=sqrt(*a)+sqrt(*b);"或相同作用的语
句。
【真题3】 请编写一个函数unsigned fun(unsigned w),w 是一个大于10 的无
符号整数,若w 是n(n≥2)位的整数,函数求出w 的后n-1 位的数作为函数值返
回。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中
的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。
#include < conio.h >
#include < stdio.h >
unsigned fun(unsigned w)
{……}
main()
{ unsigned x;
clrscr();
printf("Enter a unsigned integer number:
");scanf("%u",&x);
printf("The original data is :%u\n",x);
if (x< 10) printf("Data error!");
else printf("The result:%u\n",fun(x));
}
(2011年2月)
解析: 本题的考核点是c 语言中循环语句的使用和对数组的操作。 提示思路:
先把w 由无符号的整型数转换为字符串,然后再把w 的后n - 1 位转换为无符
号的整型数,并将结果返回。我们给出的参考函数中,第一个for循环将整型数
转换为字符串,并把整型数的每一位按照从低位到高位的顺序分别存放在字符
串str 中;第二个for 循环将字符串中的每一位取出,从低位到高位(去除最高
位)分别与该位的权相乘并加到变量result中,最后将result返回。
unsigned fun ( unsigned w )
{int i, j, sqr = 1;
unsigned result;
char * str,ch[5];
str=ch;
for (i = 1; (i < 6) && (w >= 1); i++)
{ str[i - 1] = '0' + w % 10; /*将无符号整数w 中的每一位转换
成字符并按照从低位到高位的顺序分别存放在字符串str 中*/
w /= 10;
}
str[i - 1] = 0;
result = str[0] - '0'; /求出无符号整数w 中的个位数的整数值
*/
for (j = 1; j < i - 2; j++ )
{
sqr *= 10;
result += (str[j] - '0') * sqr; /*从低位到高位(除最高位
外)分别与该位的权值相乘并加到变量result 中*/
}
return result;
}
个整数且要求m >n。 m! P = ───── n!(m-n)! 例如:m=11,n=4 时,运行结果为330.000000。 请在程序的下划线处填入正确的内容并把下划线删除,使
程序得出正确结果。
#include < stdio.h >
long jc(int m)
{ long s=1;
int i ;
/**************found**************/
for(i=1;i< =m;i++) s=___1___ ;
return s;
}
float fun(int m, int n)
{ float p;
/**************found**************/
p=1.0*jc(m)/jc(n)/jc(___2___) ;
/**************found**************/
___3___;
}
main()
{ printf("p=%f\n", fun (11,4));
}
(2011年2月)
解析: 本题的考核点是求阶乘的算法。
提示思路:分别通过for 循环来求得m的阶乘,n 的阶乘,(m-n)的阶乘。求
m 阶乘的方法是:从1 到m 累计乘积。
答案:1、s*m 2、m-n 3、return p
【真题2】 给定程序modi.c 中,函数fun 的功能是:求两数平方根之和,作为函
数值返回。 例如,输入12 和20,输出结果是:y=7.936238。 请改正程序中的
错误,使它能得出正确结果。 注意:不要改动main 函数,
#include < conio.h >
#include < math.h >
/************found************/
double fun(double *a,*b)
{ double c;
/************found************/
c=sqr(a)+sqr(b);
return c;
}
main()
{ double a,b,y;
clrscr();
printf("Enter a&b :");scanf("%lf%lf",&a,&b);
y=fun(&a,&b); printf("y=%f\n",y);
}
(2011年2月)
解析: 本题的考核点是C语言中函数的入口参数的用法。
本题中的第一个错误:函数的参数表是由逗号分隔的变量表,变量表由变量类
型和变量名组成,与普通的变量说明不同,函数参数必须同时具有变量类型和
变量名,程序中"double fun(double *a,*b)"语句第二个函数参数没有变量类
型,是错误的,应该改为"double fun(double *a,double *b)"或相同作用的
语句。
本题中的第二个错误:a、b为指针地址,应引用它们的值*a、*b,所以程序中
语句"c=sqr(a)+sqr(b);"应改为"c=sqrt(*a)+sqrt(*b);"或相同作用的语
句。
【真题3】 请编写一个函数unsigned fun(unsigned w),w 是一个大于10 的无
符号整数,若w 是n(n≥2)位的整数,函数求出w 的后n-1 位的数作为函数值返
回。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中
的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。
#include < conio.h >
#include < stdio.h >
unsigned fun(unsigned w)
{……}
main()
{ unsigned x;
clrscr();
printf("Enter a unsigned integer number:
");scanf("%u",&x);
printf("The original data is :%u\n",x);
if (x< 10) printf("Data error!");
else printf("The result:%u\n",fun(x));
}
(2011年2月)
解析: 本题的考核点是c 语言中循环语句的使用和对数组的操作。 提示思路:
先把w 由无符号的整型数转换为字符串,然后再把w 的后n - 1 位转换为无符
号的整型数,并将结果返回。我们给出的参考函数中,第一个for循环将整型数
转换为字符串,并把整型数的每一位按照从低位到高位的顺序分别存放在字符
串str 中;第二个for 循环将字符串中的每一位取出,从低位到高位(去除最高
位)分别与该位的权相乘并加到变量result中,最后将result返回。
unsigned fun ( unsigned w )
{int i, j, sqr = 1;
unsigned result;
char * str,ch[5];
str=ch;
for (i = 1; (i < 6) && (w >= 1); i++)
{ str[i - 1] = '0' + w % 10; /*将无符号整数w 中的每一位转换
成字符并按照从低位到高位的顺序分别存放在字符串str 中*/
w /= 10;
}
str[i - 1] = 0;
result = str[0] - '0'; /求出无符号整数w 中的个位数的整数值
*/
for (j = 1; j < i - 2; j++ )
{
sqr *= 10;
result += (str[j] - '0') * sqr; /*从低位到高位(除最高位
外)分别与该位的权值相乘并加到变量result 中*/
}
return result;
}