计算机二级C语言上机真题(39)【附详解】
【真题1】 请补充main 函数,该函数的功能是求方程ax2+bx+c=0 的两个实数
根。方程的系数a、b、c 从键盘输入,如果判别式(disc=b2-4ac)小于0,则要
求重新输入a、b、c 的值。
例如,当a=1,b=2,c=1时,方程的两个根分别是x1=-1.00, x2=-1.00。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编
写的若干表达式或语句。
试题程序:
#include "math.h"
#include < stdio.h >main()
{ float a,b,c, disc,x1,x2;
clrscr();
do
{ printf("Input a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);
disc=b*b-4*a*c;
if(disc< 0)
printf("disc=%f\n Input again!\n",disc);
}while(【1】);
printf("*******the result*******\n");
x1=【2】;
x2=【3】;
printf("\nx1=%6.2f\nx2=%6.2f\n",x1,x2);
}
(2011年2月)
答案:【1】disc< 0 【2】(-b+sqrt(disc))/(2*a) 【3】(-b-sqrt(disc))/(2*a)
【真题2】 下列给定程序中,fun()函数的功能是:根据形参m,计算下列公式的
值。
t=1-1/2+1/3-1/4+…+(-1)(m+1)/m
例如,若输入5,则应输出0.783333。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
#include < conio.h >#include < stdio.h
>/**********************found***********************/
int fun(int m)
{
double t=1.0,j=1.0;
int i;
/**********************found***********************/
for(i=1;i< m;i++)
{j=-1*j;t+=j/i;}
return t;
}
main()
{
int m;
clrscr();
printf("\nPlease enter 1 integer number: ");
scanf("%d",&m);
printf("\nThe result is %lf\n", fun(m));
}
(2011年2月)
解析: (1)错误:int fun(int m) 正确:double fun(int m)
(2)错误:for(i=1;i< m;i++) 正确:for(i=2;i< =m;i++)
错误:函数的返回值为实型数,所以应定义为double类型。
错误2:根据题目的公式,参加运算的数应从2到m,包括m。
疑难解答 → http://www.51pass.org/jxqzsl
【真题3】 请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n
个整数,要求把下标从0 到p(含p,p 小于等于n-1)的数组元素平移到数组的最
后。
例如,一维数组中的原始内容为: 1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一
维数组中的内容应为: 5,6,7,8,9,10,1,2,3,4。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 80
void fun(int *w, int p, int n)
{……}
main()
{ int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i,p,n=15;
printf("The original data:\n");
for(i=0; i< n; i++)printf("%3d",a[i]);
printf("\n\nEnter p: ");scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; i< n; i++)printf("%3d",a[i]);
printf("\n\n");
}
解析: 本题的考核点是一维数组的应用。
解题思路:本题要求把下标从0到p(含p,p小于等于n-1)的数组元素平移
到数组的最后,可以根据输入的p值,通过for 循环语句,将p+1 到n-1(含
n-1)之间的数组元素依次向前移动p+1个存储单元,即w[j-1]=w[j];,同
时将0 到p个数组元素逐一赋给数组w[n-1],也就是通过语句w[n-1]=ch;
来实现此操作的。
void fun(int *w, int p, int n)
{int x,j,ch;
for(x=0;x< =p;x++)
{ch=w[0];
for(j=1;j< n;j++) /*通过for 循环语句,将p+1到n-1(含n-1)之间的
数组元素依次向前移动p+1 个存储单元*/
{
w[j-1]=w[j];
}
w[n-1]=ch; /*将0到p个数组元素逐一赋给数组w[n-1]*/
}
}
根。方程的系数a、b、c 从键盘输入,如果判别式(disc=b2-4ac)小于0,则要
求重新输入a、b、c 的值。
例如,当a=1,b=2,c=1时,方程的两个根分别是x1=-1.00, x2=-1.00。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编
写的若干表达式或语句。
试题程序:
#include "math.h"
#include < stdio.h >main()
{ float a,b,c, disc,x1,x2;
clrscr();
do
{ printf("Input a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);
disc=b*b-4*a*c;
if(disc< 0)
printf("disc=%f\n Input again!\n",disc);
}while(【1】);
printf("*******the result*******\n");
x1=【2】;
x2=【3】;
printf("\nx1=%6.2f\nx2=%6.2f\n",x1,x2);
}
(2011年2月)
答案:【1】disc< 0 【2】(-b+sqrt(disc))/(2*a) 【3】(-b-sqrt(disc))/(2*a)
【真题2】 下列给定程序中,fun()函数的功能是:根据形参m,计算下列公式的
值。
t=1-1/2+1/3-1/4+…+(-1)(m+1)/m
例如,若输入5,则应输出0.783333。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
#include < conio.h >#include < stdio.h
>/**********************found***********************/
int fun(int m)
{
double t=1.0,j=1.0;
int i;
/**********************found***********************/
for(i=1;i< m;i++)
{j=-1*j;t+=j/i;}
return t;
}
main()
{
int m;
clrscr();
printf("\nPlease enter 1 integer number: ");
scanf("%d",&m);
printf("\nThe result is %lf\n", fun(m));
}
(2011年2月)
解析: (1)错误:int fun(int m) 正确:double fun(int m)
(2)错误:for(i=1;i< m;i++) 正确:for(i=2;i< =m;i++)
错误:函数的返回值为实型数,所以应定义为double类型。
错误2:根据题目的公式,参加运算的数应从2到m,包括m。
疑难解答 → http://www.51pass.org/jxqzsl
【真题3】 请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n
个整数,要求把下标从0 到p(含p,p 小于等于n-1)的数组元素平移到数组的最
后。
例如,一维数组中的原始内容为: 1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一
维数组中的内容应为: 5,6,7,8,9,10,1,2,3,4。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 80
void fun(int *w, int p, int n)
{……}
main()
{ int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i,p,n=15;
printf("The original data:\n");
for(i=0; i< n; i++)printf("%3d",a[i]);
printf("\n\nEnter p: ");scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; i< n; i++)printf("%3d",a[i]);
printf("\n\n");
}
解析: 本题的考核点是一维数组的应用。
解题思路:本题要求把下标从0到p(含p,p小于等于n-1)的数组元素平移
到数组的最后,可以根据输入的p值,通过for 循环语句,将p+1 到n-1(含
n-1)之间的数组元素依次向前移动p+1个存储单元,即w[j-1]=w[j];,同
时将0 到p个数组元素逐一赋给数组w[n-1],也就是通过语句w[n-1]=ch;
来实现此操作的。
void fun(int *w, int p, int n)
{int x,j,ch;
for(x=0;x< =p;x++)
{ch=w[0];
for(j=1;j< n;j++) /*通过for 循环语句,将p+1到n-1(含n-1)之间的
数组元素依次向前移动p+1 个存储单元*/
{
w[j-1]=w[j];
}
w[n-1]=ch; /*将0到p个数组元素逐一赋给数组w[n-1]*/
}
}