计算机二级C语言上机真题(33)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:将m(1≤m≤10)个字符串连接
起来,组成一个新串,放入pt所指字符串中,例如:把3 个串abc,CD,EF串联
起来,结果是abcCDEF。
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >void
fun(char __1___,int m, char *pt)
{ int k,q,i,j=0;
for(k=0;k< m;k++)
{ q=strlen(str[k]);
j+=q;
for(i=0;i< q;i++)
pt[i]=str[k][i];
pt+=q;
pt[0]=__2__;
}
pt-=___3___;
}
main()
{ int m, h;
char s[10][10],p[120];
printf("\nPlease enter m: ");
scanf("%d",&m); gets(s[0]);
printf("\nPlease enter %d string:\n ",m);
for(h=0;h< m;h++) gets(s[h]);
fun(s,m,p);
printf("\nThe result is :%s\n ",p);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对子函数参数的声明,根据主函
数的调用可以看出,这个参数应该是一个二维数组,在C 语言中二维或多维数
组作参数都是第一维空,其余照写,考生要牢记。
填空2:根据题目的意思,此处是每次连接一个新的字符串之后,加入一个字符
串结束标志,由上一步把pt指针向后移动了字符串长度那么大就可以看出来,
这个题目较难,考生注重理解。
填空3:由算法可以看出,指向新的字符串的指针pt在函数的运行过程中被不
断的后移,为了跳出函数之后pt仍然指向新的字符串,必须把它启动到字符串
开头,由前面变量j的使用可以知道,j存储整个字符串长度。
答案:【1】str[][10] 或 (*str)[10] 【2】0 【3】j
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据整型形参m,计算如下
公式的值。
1 1 1 1
y = ──── + ──── + ──── + …… + ───
100×100 200×200 300×300 m×m
例如,若m=2000,则应输出:0.000160。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h
>/************found************/
fun (int m)
{ double y=0,d;
int i;
/************found************/
for (i=100,i< =m,i+=100)
{ d=(double)i*(double)i;
y+=1.0/d;
}
return(y);
}
main()
{ int n=2000;
clrscr();
printf("\nThe result is %lf\n",fun(n));
}
(2011年2月)
解析: 本题的考核点是C语言中的函数的入口参数和for 循环控制的格式。
函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普
通的变量说明不同,函数参数必须同时具有变量类型和变量名;另外,当函数
前面的返回数据类型省略时,C 语言默认函数返回整型,本题中n 是整型数
据,由"printf ("\nThe result is %lf\n ",fun ( n ) );"可以看出fun 函数应
该返回浮点型数据,所以fun 函数的返回数据类型不能省略。综上所述,应该
把程序中的"fun ( int m)"语句改为"float fun(int m)"或相同作用的语句。
for 循环语句的一般形式为: for(表达式1;表达式2;表达式3)语句 各表达
式之间用分号间隔。所以,应该把语句"for(i=100,i< =m,i+=100)", 改为
"for(i=100;i< =m;i+=100)"。
【真题3】 请编写函数fun,其功能是:计算并输出给定数组(长度为9)中每相邻
两个元素之平均值的平方根之和。
例如,给定数组中的9个元素依次为12.0、34.0、4.0、23.0、34.0、45.0、
18.0、3.0、11.0,输出应为:s=35.951014。
注意:部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < math.h >double fun(double x[9])
{……}
main()
{ double s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};
int i;
printf("\nThe original data is :\n");
for(i=0;i< 9;i++)printf("%6.1f",a[i]); printf("\n\n");
s=fun(a);
printf("s=%f\n\n",s);
}
(2011年2月)
解析: 本题的考核点是c 语言中的基本算法和for 循环语句的使用。
解题思路:本题要求计算并输出给定数组中每相邻两个元素之平均值的平方根
之和,并作为函数值返回。在给出的参考程序中,由于函数要求的返回值为双
精度型,所以先将变量avg、sum定义为双精度型,初值为0.0,然后通过for
循环分别求出相邻两个元素的平均值放入变量avg中,再使用求平方根函数
sqrt()对各平均值开方求和,最终结果输出到变量sum 中并返回。
double fun(double x[9])
{int i ;
double avg=0.0,sum=0.0; /*将变量avg、sum定义为双精度型,并给其
赋初值为0.0*/
for (i=0;i< 8;i++)
{avg=(x[i]+x[i+1])/2; /*通过for 循环分别求出相邻两个元素的平均值放入
变量avg中*/
sum+=sqrt(avg); /*使用求平方根函数sqrt()对各平均值开方求和,最终结
果输出到变量sum*/
}
return sum; /*返回计算结果*/
}
起来,组成一个新串,放入pt所指字符串中,例如:把3 个串abc,CD,EF串联
起来,结果是abcCDEF。
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >void
fun(char __1___,int m, char *pt)
{ int k,q,i,j=0;
for(k=0;k< m;k++)
{ q=strlen(str[k]);
j+=q;
for(i=0;i< q;i++)
pt[i]=str[k][i];
pt+=q;
pt[0]=__2__;
}
pt-=___3___;
}
main()
{ int m, h;
char s[10][10],p[120];
printf("\nPlease enter m: ");
scanf("%d",&m); gets(s[0]);
printf("\nPlease enter %d string:\n ",m);
for(h=0;h< m;h++) gets(s[h]);
fun(s,m,p);
printf("\nThe result is :%s\n ",p);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对子函数参数的声明,根据主函
数的调用可以看出,这个参数应该是一个二维数组,在C 语言中二维或多维数
组作参数都是第一维空,其余照写,考生要牢记。
填空2:根据题目的意思,此处是每次连接一个新的字符串之后,加入一个字符
串结束标志,由上一步把pt指针向后移动了字符串长度那么大就可以看出来,
这个题目较难,考生注重理解。
填空3:由算法可以看出,指向新的字符串的指针pt在函数的运行过程中被不
断的后移,为了跳出函数之后pt仍然指向新的字符串,必须把它启动到字符串
开头,由前面变量j的使用可以知道,j存储整个字符串长度。
答案:【1】str[][10] 或 (*str)[10] 【2】0 【3】j
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据整型形参m,计算如下
公式的值。
1 1 1 1
y = ──── + ──── + ──── + …… + ───
100×100 200×200 300×300 m×m
例如,若m=2000,则应输出:0.000160。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h
>/************found************/
fun (int m)
{ double y=0,d;
int i;
/************found************/
for (i=100,i< =m,i+=100)
{ d=(double)i*(double)i;
y+=1.0/d;
}
return(y);
}
main()
{ int n=2000;
clrscr();
printf("\nThe result is %lf\n",fun(n));
}
(2011年2月)
解析: 本题的考核点是C语言中的函数的入口参数和for 循环控制的格式。
函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普
通的变量说明不同,函数参数必须同时具有变量类型和变量名;另外,当函数
前面的返回数据类型省略时,C 语言默认函数返回整型,本题中n 是整型数
据,由"printf ("\nThe result is %lf\n ",fun ( n ) );"可以看出fun 函数应
该返回浮点型数据,所以fun 函数的返回数据类型不能省略。综上所述,应该
把程序中的"fun ( int m)"语句改为"float fun(int m)"或相同作用的语句。
for 循环语句的一般形式为: for(表达式1;表达式2;表达式3)语句 各表达
式之间用分号间隔。所以,应该把语句"for(i=100,i< =m,i+=100)", 改为
"for(i=100;i< =m;i+=100)"。
【真题3】 请编写函数fun,其功能是:计算并输出给定数组(长度为9)中每相邻
两个元素之平均值的平方根之和。
例如,给定数组中的9个元素依次为12.0、34.0、4.0、23.0、34.0、45.0、
18.0、3.0、11.0,输出应为:s=35.951014。
注意:部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < math.h >double fun(double x[9])
{……}
main()
{ double s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};
int i;
printf("\nThe original data is :\n");
for(i=0;i< 9;i++)printf("%6.1f",a[i]); printf("\n\n");
s=fun(a);
printf("s=%f\n\n",s);
}
(2011年2月)
解析: 本题的考核点是c 语言中的基本算法和for 循环语句的使用。
解题思路:本题要求计算并输出给定数组中每相邻两个元素之平均值的平方根
之和,并作为函数值返回。在给出的参考程序中,由于函数要求的返回值为双
精度型,所以先将变量avg、sum定义为双精度型,初值为0.0,然后通过for
循环分别求出相邻两个元素的平均值放入变量avg中,再使用求平方根函数
sqrt()对各平均值开方求和,最终结果输出到变量sum 中并返回。
double fun(double x[9])
{int i ;
double avg=0.0,sum=0.0; /*将变量avg、sum定义为双精度型,并给其
赋初值为0.0*/
for (i=0;i< 8;i++)
{avg=(x[i]+x[i+1])/2; /*通过for 循环分别求出相邻两个元素的平均值放入
变量avg中*/
sum+=sqrt(avg); /*使用求平方根函数sqrt()对各平均值开方求和,最终结
果输出到变量sum*/
}
return sum; /*返回计算结果*/
}