计算机二级C语言上机真题(43)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:求S 的值。设
S=(22/(1*3))*(42/(3*5))*(62/(5*7))* …*(2k)2/((2k-1)*(2k+1))
例如,当k 为10 时,函数的值应为1.533852。
试题程序:
#include < conio.h >#include < stdio.h >#include < math.h >double
fun(int k)
{ int n;
double s, w, p, q;
__1__;
s=1.0;
while(n< =k)
{ w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
__2__
}
main()
{
printf("%f\n ",fun(10)__3__;
}
(2011年2月)
解析: 填空1:在这个空之前我们可以看到定义了整型变量n,下面紧接着对
n 的值进行了比较,可见该语句应该是对n 进行赋值,由下面的语句我们可以
看到n 作为级数的项数应该从1开始,所以这里对n 赋初值1。
填空2:这是一个double型的函数,而且在函数末尾,因而必定要在这里填返
回值语句。
填空3:这是一个语法错误,它提醒我们在写程序时一定要注意这些小的语法错
误。
答案:【1】n=1 【2】return s ; 【3】)
【真题2】 给定程序modi.c 中,在主函数中从键盘输入若干个数放入数组中,用0
结束输入并放在最后一个元素中。下列程序中,函数fun 的功能是:计算数组元素中
值为正数的平均值(不包括0)。
例如:数组中元素中的值依次为:39,-47,21,2,-8,15,0,则程序的运行结
果为:19.250000。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >double fun(int x[])
{************found************/
int sum=0.0;
int c=0,i=0;
while (x[i]!=0)
{ if (x[i] >0) {
sum+=x[i];c++;}
i++;
}
/************found************/
sum\=c;
return sum;
}
main()
{ int x[1000];int i=0;
clrscr();
printf("\nPlease enter some data (end with 0):");
do
{ scanf("%d",&x[i]);}
while (x[i++]!=0);
printf("%f\n",fun(x));
}
(2011年2月)
解析: 本题的考核点是C语言中不同数据类型的使用以及运算符的使用。
观察题目可知,sum 是一个实数型,且已赋值sum=0.0,所以,应定义
double sum=0.0;
"\"不是一个运算符, 除法运算符的正确表示应该是"/",所以,求平均值的写
法应为: sum=sum/c;或sum/=c;
【真题3】 请编写函数fun,函数的功能是:统计一行字符串中单词的个数作为函数
值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若
干个空格隔开,一行的开始没有空格。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < string.h >#define N 80
int fun( char *s)
{……}
main()
{ char line[N]; int num=0;
printf("Enter a string :\n"); gets(line);
num=fun( line );
printf("The number of word is : %d\n\n",num);
}
(2011年2月)
解析: 本题的考核点是统计字符串中单词个数的算法。
提示思路:本题要求统计一行字符串中单词的个数,并作为函数值返回。在给
出的参考程序中,若判断出当前字符为非空格,而它前面的字符是空格,则单
词数累加1;若当前字符为非空格,而其前面的字符也为非空格,则单词数不累
加1,程序细节可以参考程序的注释部分。
int fun( char *s)
{int i=1,j=0;/*i用来记录是否遇到过了空格,j用来记录单词数*/
while(*s){
if((i==1) && (*s!=32))
{j++;i=0;} /*当i==1且当前s 所指向的是字符,则j自增加1,同时将i设
为0*/
if(*s==32)
i=1; /*用i来判断是否遇到了空格,假如遇到了空格则i=1*/
s++; /*检测是否是空格,如果是空格则指针变量s向后移动一位*/
}
return j; /*返回统计结果*/
}
S=(22/(1*3))*(42/(3*5))*(62/(5*7))* …*(2k)2/((2k-1)*(2k+1))
例如,当k 为10 时,函数的值应为1.533852。
试题程序:
#include < conio.h >#include < stdio.h >#include < math.h >double
fun(int k)
{ int n;
double s, w, p, q;
__1__;
s=1.0;
while(n< =k)
{ w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
__2__
}
main()
{
printf("%f\n ",fun(10)__3__;
}
(2011年2月)
解析: 填空1:在这个空之前我们可以看到定义了整型变量n,下面紧接着对
n 的值进行了比较,可见该语句应该是对n 进行赋值,由下面的语句我们可以
看到n 作为级数的项数应该从1开始,所以这里对n 赋初值1。
填空2:这是一个double型的函数,而且在函数末尾,因而必定要在这里填返
回值语句。
填空3:这是一个语法错误,它提醒我们在写程序时一定要注意这些小的语法错
误。
答案:【1】n=1 【2】return s ; 【3】)
【真题2】 给定程序modi.c 中,在主函数中从键盘输入若干个数放入数组中,用0
结束输入并放在最后一个元素中。下列程序中,函数fun 的功能是:计算数组元素中
值为正数的平均值(不包括0)。
例如:数组中元素中的值依次为:39,-47,21,2,-8,15,0,则程序的运行结
果为:19.250000。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >double fun(int x[])
{************found************/
int sum=0.0;
int c=0,i=0;
while (x[i]!=0)
{ if (x[i] >0) {
sum+=x[i];c++;}
i++;
}
/************found************/
sum\=c;
return sum;
}
main()
{ int x[1000];int i=0;
clrscr();
printf("\nPlease enter some data (end with 0):");
do
{ scanf("%d",&x[i]);}
while (x[i++]!=0);
printf("%f\n",fun(x));
}
(2011年2月)
解析: 本题的考核点是C语言中不同数据类型的使用以及运算符的使用。
观察题目可知,sum 是一个实数型,且已赋值sum=0.0,所以,应定义
double sum=0.0;
"\"不是一个运算符, 除法运算符的正确表示应该是"/",所以,求平均值的写
法应为: sum=sum/c;或sum/=c;
【真题3】 请编写函数fun,函数的功能是:统计一行字符串中单词的个数作为函数
值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若
干个空格隔开,一行的开始没有空格。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < string.h >#define N 80
int fun( char *s)
{……}
main()
{ char line[N]; int num=0;
printf("Enter a string :\n"); gets(line);
num=fun( line );
printf("The number of word is : %d\n\n",num);
}
(2011年2月)
解析: 本题的考核点是统计字符串中单词个数的算法。
提示思路:本题要求统计一行字符串中单词的个数,并作为函数值返回。在给
出的参考程序中,若判断出当前字符为非空格,而它前面的字符是空格,则单
词数累加1;若当前字符为非空格,而其前面的字符也为非空格,则单词数不累
加1,程序细节可以参考程序的注释部分。
int fun( char *s)
{int i=1,j=0;/*i用来记录是否遇到过了空格,j用来记录单词数*/
while(*s){
if((i==1) && (*s!=32))
{j++;i=0;} /*当i==1且当前s 所指向的是字符,则j自增加1,同时将i设
为0*/
if(*s==32)
i=1; /*用i来判断是否遇到了空格,假如遇到了空格则i=1*/
s++; /*检测是否是空格,如果是空格则指针变量s向后移动一位*/
}
return j; /*返回统计结果*/
}