计算机二级C语言上机真题(45)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:用下面的公式求π 的近似值,
直到最后一项的绝对值小于指定的数(参数num)为止。
π/4≈1-1/3+1/5-1/7+…
例如,程序运行后,输入0.0001,则程序输出3.1414。
试题程序:
#include < math.h >#include < stdio.h >float fun(float num)
{ int s;
float n,t, pi;
t=1;pi=0;n=1;s=1;
while(__1__ >=num)
{
pi=pi+t;
n=n+2;
s=-s;
t=__2__;
}
pi=pi*4;
__3__;
}
main()
{ float n1, n2;
printf("Enter a float number: ");
scanf("%f",&n1);
n2=fun(n1);
printf("%6.4f\n ",n2);
}
(2011年2月)
解析: 填空1:函数fun()中while语句的含义是:当新的一项大于给定参数
时,循环累计,计算s的值。而题目要求是最后一项的绝对值小于给定参数,
因此循环条件应当为while(fabs(t) >=num),而非while(t >=num) 。
填空2:由函数可知,t是作为级数的每一项的值的变量来定义的,s 是分子变
量,n 是分母变量。
填空3:很明显,这是一个实型函数,应该返回一个实型值,由题意可知应返回
pi。
答案:【1】fabs(t) 【2】s/n; 【3】return pi
【真题2】 给定程序modi.c 中,函数fun 的功能是:从n 个学生的成绩中统计出
低于平均分的学生人数,此人数由函数值返回。平均分存放在形参aver 所指的存储
单元中。
例如,若输入8 名学生的成绩,输入形式如下:
80.5 60 72 90.5 98 51.5 88 64
则低于平均分的学生人数为4(平均分为:75.5625)。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >#define N 20
int fun(float *s,int n ,float *aver)
{float ave,t=0.0;
int count=0,k,i;
for (k=0;k< n;k++)
/************found************/
t=s[k];
ave=t/n;
for (i=0;i< n;i++)
if(s[i]< ave) count++;
/************found************/
*aver=&ave;
return count;
}
main()
{float s[30],aver;
int m,i;
clrscr();
printf("\nPlease enter m:");scanf("%d",&m);
printf("\nPlease enter %d mark :\n",m);
for(i=0;i< m;i++) scanf("%f",s+i);
printf("\nThe number of strudents : %d \n",fun(s,m,&aver));
printf("Ave=%f\n",aver);
}
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、要注意存放学生分数的数组是一个float型的数组,故总分和平均分都应当
是float型的;
2、函数fun()中的第三个形参是一个指针,这表示在未来赋值时的方法是特殊
的。
本题的第一个错误:在函数fun()第一个for 循环体中,语句"t = s[k] ;"只是
将t的值不断用不同学生的分数替代,这与计算总分的初衷相逆,这条语句应当
书写为"t=t+s[k];",实现学生分数的不断累加;
本题的第二个错误:语句"*aver = &ave ;"是不正确的,*aver 代表的是一个
float型的变量,而&aver 则是函数中存放平均数的那个变量的内存地址,两者
不匹配,应当改为"*aver = ave;",这样才可以实现通过aver 返回平均分的
目的。
【真题3】 请编写一个函数 void fun(int m, int k, int xx[]),该函数的功能是:
将大于整数 m 且紧靠 m 的 k 个素数存入数组 xx 传回。 运行时输入17, 5,则应
输出:19, 23, 29, 31, 37。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >void fun(int m, int k, int xx[])
{……}
main()
{ int m, n, zz[1000] ;
clrscr() ;
printf( "\nPlease enter two integers:") ;
scanf("%d%d", &m, &n ) ;
fun( m, n, zz) ;
for( m = 0 ; m < n ; m++ )
printf("%d ", zz[m]) ;
printf("\n") ;
}
(2011年2月)
解析: 本题的考核点是统计素数的数目。
解题思路:
1、建立循环,鉴别大于整数m 且紧靠m 的整数是否为素数(素数是指只能被
1 和它自身整除的数),如果是,通过变量p将该素数存入数组xx[];
2、在通过循环寻找素数的同时,变量j不断记录查找到的素数的数目,一旦发
现找到的素数的数目已经与用户要求的一致,便停止查找新的素数。
#include < conio.h >
#include < stdio.h >
/*本题中的for()循环用来判断一个数是否为素数,由于个数只能是k个所以用
do-while循环来控制。*/
void fun(int m, int k, int xx[])
{ int i,j=0,p=m+1;
do
{for( i=2; i< p; i++)
if(p%i==0) break; /*判断p是否为素数*/
if(i >=p) /*如果p为素数,则将p的值存入数组xx[]中*/
xx[j++]=p;
p++;
}while(j< k);
}
直到最后一项的绝对值小于指定的数(参数num)为止。
π/4≈1-1/3+1/5-1/7+…
例如,程序运行后,输入0.0001,则程序输出3.1414。
试题程序:
#include < math.h >#include < stdio.h >float fun(float num)
{ int s;
float n,t, pi;
t=1;pi=0;n=1;s=1;
while(__1__ >=num)
{
pi=pi+t;
n=n+2;
s=-s;
t=__2__;
}
pi=pi*4;
__3__;
}
main()
{ float n1, n2;
printf("Enter a float number: ");
scanf("%f",&n1);
n2=fun(n1);
printf("%6.4f\n ",n2);
}
(2011年2月)
解析: 填空1:函数fun()中while语句的含义是:当新的一项大于给定参数
时,循环累计,计算s的值。而题目要求是最后一项的绝对值小于给定参数,
因此循环条件应当为while(fabs(t) >=num),而非while(t >=num) 。
填空2:由函数可知,t是作为级数的每一项的值的变量来定义的,s 是分子变
量,n 是分母变量。
填空3:很明显,这是一个实型函数,应该返回一个实型值,由题意可知应返回
pi。
答案:【1】fabs(t) 【2】s/n; 【3】return pi
【真题2】 给定程序modi.c 中,函数fun 的功能是:从n 个学生的成绩中统计出
低于平均分的学生人数,此人数由函数值返回。平均分存放在形参aver 所指的存储
单元中。
例如,若输入8 名学生的成绩,输入形式如下:
80.5 60 72 90.5 98 51.5 88 64
则低于平均分的学生人数为4(平均分为:75.5625)。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >#define N 20
int fun(float *s,int n ,float *aver)
{float ave,t=0.0;
int count=0,k,i;
for (k=0;k< n;k++)
/************found************/
t=s[k];
ave=t/n;
for (i=0;i< n;i++)
if(s[i]< ave) count++;
/************found************/
*aver=&ave;
return count;
}
main()
{float s[30],aver;
int m,i;
clrscr();
printf("\nPlease enter m:");scanf("%d",&m);
printf("\nPlease enter %d mark :\n",m);
for(i=0;i< m;i++) scanf("%f",s+i);
printf("\nThe number of strudents : %d \n",fun(s,m,&aver));
printf("Ave=%f\n",aver);
}
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、要注意存放学生分数的数组是一个float型的数组,故总分和平均分都应当
是float型的;
2、函数fun()中的第三个形参是一个指针,这表示在未来赋值时的方法是特殊
的。
本题的第一个错误:在函数fun()第一个for 循环体中,语句"t = s[k] ;"只是
将t的值不断用不同学生的分数替代,这与计算总分的初衷相逆,这条语句应当
书写为"t=t+s[k];",实现学生分数的不断累加;
本题的第二个错误:语句"*aver = &ave ;"是不正确的,*aver 代表的是一个
float型的变量,而&aver 则是函数中存放平均数的那个变量的内存地址,两者
不匹配,应当改为"*aver = ave;",这样才可以实现通过aver 返回平均分的
目的。
【真题3】 请编写一个函数 void fun(int m, int k, int xx[]),该函数的功能是:
将大于整数 m 且紧靠 m 的 k 个素数存入数组 xx 传回。 运行时输入17, 5,则应
输出:19, 23, 29, 31, 37。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >void fun(int m, int k, int xx[])
{……}
main()
{ int m, n, zz[1000] ;
clrscr() ;
printf( "\nPlease enter two integers:") ;
scanf("%d%d", &m, &n ) ;
fun( m, n, zz) ;
for( m = 0 ; m < n ; m++ )
printf("%d ", zz[m]) ;
printf("\n") ;
}
(2011年2月)
解析: 本题的考核点是统计素数的数目。
解题思路:
1、建立循环,鉴别大于整数m 且紧靠m 的整数是否为素数(素数是指只能被
1 和它自身整除的数),如果是,通过变量p将该素数存入数组xx[];
2、在通过循环寻找素数的同时,变量j不断记录查找到的素数的数目,一旦发
现找到的素数的数目已经与用户要求的一致,便停止查找新的素数。
#include < conio.h >
#include < stdio.h >
/*本题中的for()循环用来判断一个数是否为素数,由于个数只能是k个所以用
do-while循环来控制。*/
void fun(int m, int k, int xx[])
{ int i,j=0,p=m+1;
do
{for( i=2; i< p; i++)
if(p%i==0) break; /*判断p是否为素数*/
if(i >=p) /*如果p为素数,则将p的值存入数组xx[]中*/
xx[j++]=p;
p++;
}while(j< k);
}