计算机二级C语言上机真题(34)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:首先把b 所指字符串中的字符
按逆序存放,然后将a 所指字符串中的字符和b 所指字符串中的字符,按排列的顺
序交叉合并到c 所指数组中,过长的剩余字符接在c 所指数组的尾部。例如,当a 所
指字符串中的内容为abcdefg,b 所指字符串中的内容为1234 时,c 所指数组中的
内容应该为a4b3c2d1efg;而当a 所指字符串中的内容为1234,b 所指字符串中
的内容为abcdefg 时,c 所指数组中的内容应该为1g2f3e4dcba。
试题程序:
#include < conio.h >#include < stdio.h >#include < string.h >void
fun(char *a, char *b, char *c)
{ int i, j; char ch;
i=0; j=strlen(b)-1;
while (i< j)
{ch=b[i]; b[i]=b[j]; b[j]=ch;
i++; __1__;
}
while (__2__)
{ if (*a){*c=*a; c++; a++;}
if(*b){*c=*b; c++; b++;}
}
__3__='\0' ;
}
main()
{
char s1[100],s2[100],t[200];
printf("\nEnter s1 string: "); scanf("%s",s1);
printf("\nEnter s2 string: "); scanf("%s",s2);
fun(s1,s2,t);
printf("\nThe result is :%s\n",t);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对于字符串b进行逆序排列,将
字符串倒序存放的方法一般是以字符串中央为中心,将两边对称位置的字符互
相交换,此处的变量j就是从结尾开始计录下标的。
填空2:根据题目的意思,此处是字符串a和b交叉向c 赋值,结束循环的条
件应该是两个字符串都已经到达末尾,所以应该使用逻辑或运算符。
填空3:由算法可以看出,此处是在字符串后面加入结束标志,这是不可缺少的
操作。
答案:【1】j-- 【2】*a||*b 【3】*c
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据整型形参m 的值,计算
如下公式的值。
1 1 1
t=1- ── - ── - …… - ──
2×2 3×3 m×m
例如:若m 中的值为:5,则应输出: 0.536389。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >double fun(int m)
{double y=1.0;
int i;
/************found************/
for (i=2;i< m;i++)
/************found************/
y-=1/(i*i);
return(y);
}
main()
{int n=5;
clrscr();
printf("\nThe result is %lf\n",fun(n));
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、函数fun()的功能是根据一个整型形参计算题目中的数学公式;
2、由于公式中运用了除法,所以公式的最终值必须使用double型,以保持最
终值的精确性。
题中的第一个错误出现在函数fun()中的语句"for(i = 2 ; i < m ; i++)"中,
请注意这个循环的条件部分,仔细看看,就可以知道,如果这么写,公式中的
最后一项将被丢掉。正确语句如下:" for(i = 2 ; i < = m ; i++)";
题中的第二个错误是在for 循环的循环体中,即计算公式的那条语句"y -= 1 /
(i * i) ;",前面分析过,公式的最终值为一个double型,题中除数位置使用了
整数,这样的话,会造成不匹配错误,所以,正确语句如下:"y -= 1.0 / (i *
i) ;"。
【真题3】 请编写一个函数fun (int *a,int n,int *odd,int *even),函数的功能
是分别求出数组a 中所有奇数之和以及所有偶数之和。形参n 给出数组元素的个
数,整型指针odd 返回偶数之和,even 返回奇数之和。
例如:a 数组中各数组元素的值依次为:1,9,2,3,11,6,则调用函数fun
后,指针odd 返回偶数之和8,even 返回奇数之和24。
注意:部分源程序保存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >#define N 20
fun ( int *a, int n, int *odd, int *even )
{……}
main( )
{ int a[N]={1,9,2,3,11,6}, i, n=6, odd, even;
clrscr( );
printf ( "The original data is : \n" );
for ( i = 0; i < n; i ++ ) printf ( "%5d", *(a+i) );
printf("\n\n");
fun ( a, n, &odd, &even );
printf ( "The sum of odd numbers: %d\n", odd );
printf ( "The sum of even numbers: %d\n", even );
}
(2011年2月)
解析: 本题的考核点是c 语言中的指针和for 循环语句的使用。
解题思路:用for 循环语句依次判断整型数组中的每一个数组元素是偶数还是奇
数,判断偶数和奇数只需将数组元素与2 取模,结果为0 的数是偶数,为1的
是奇数。如果是偶数,则把该数加到*odd中;是奇数,加到*even中。
/*注:该题的算法是:用for()循环一步一步地找元素,用if(a[i]%2==0)来
判断是否是偶数,%运算是求余运算,当对2 求余为0 时表示原数为偶数,否
则为奇数*/
fun ( int *a, int n, int *odd, int *even )
{int i;
*odd = * even = 0;
for ( i = 0; i < n;i ++ )
if (a[i] % 2 == 0) /*用if(a[i]%2==0)来判断是否是偶数*/
*odd += a[i]; /*计算所有偶数之和并将计算后的结果赋给*odd*/
else
*even += a[i]; /*计算所有奇数之和并将计算后的结果赋给*even*/
}
按逆序存放,然后将a 所指字符串中的字符和b 所指字符串中的字符,按排列的顺
序交叉合并到c 所指数组中,过长的剩余字符接在c 所指数组的尾部。例如,当a 所
指字符串中的内容为abcdefg,b 所指字符串中的内容为1234 时,c 所指数组中的
内容应该为a4b3c2d1efg;而当a 所指字符串中的内容为1234,b 所指字符串中
的内容为abcdefg 时,c 所指数组中的内容应该为1g2f3e4dcba。
试题程序:
#include < conio.h >#include < stdio.h >#include < string.h >void
fun(char *a, char *b, char *c)
{ int i, j; char ch;
i=0; j=strlen(b)-1;
while (i< j)
{ch=b[i]; b[i]=b[j]; b[j]=ch;
i++; __1__;
}
while (__2__)
{ if (*a){*c=*a; c++; a++;}
if(*b){*c=*b; c++; b++;}
}
__3__='\0' ;
}
main()
{
char s1[100],s2[100],t[200];
printf("\nEnter s1 string: "); scanf("%s",s1);
printf("\nEnter s2 string: "); scanf("%s",s2);
fun(s1,s2,t);
printf("\nThe result is :%s\n",t);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对于字符串b进行逆序排列,将
字符串倒序存放的方法一般是以字符串中央为中心,将两边对称位置的字符互
相交换,此处的变量j就是从结尾开始计录下标的。
填空2:根据题目的意思,此处是字符串a和b交叉向c 赋值,结束循环的条
件应该是两个字符串都已经到达末尾,所以应该使用逻辑或运算符。
填空3:由算法可以看出,此处是在字符串后面加入结束标志,这是不可缺少的
操作。
答案:【1】j-- 【2】*a||*b 【3】*c
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据整型形参m 的值,计算
如下公式的值。
1 1 1
t=1- ── - ── - …… - ──
2×2 3×3 m×m
例如:若m 中的值为:5,则应输出: 0.536389。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >double fun(int m)
{double y=1.0;
int i;
/************found************/
for (i=2;i< m;i++)
/************found************/
y-=1/(i*i);
return(y);
}
main()
{int n=5;
clrscr();
printf("\nThe result is %lf\n",fun(n));
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、函数fun()的功能是根据一个整型形参计算题目中的数学公式;
2、由于公式中运用了除法,所以公式的最终值必须使用double型,以保持最
终值的精确性。
题中的第一个错误出现在函数fun()中的语句"for(i = 2 ; i < m ; i++)"中,
请注意这个循环的条件部分,仔细看看,就可以知道,如果这么写,公式中的
最后一项将被丢掉。正确语句如下:" for(i = 2 ; i < = m ; i++)";
题中的第二个错误是在for 循环的循环体中,即计算公式的那条语句"y -= 1 /
(i * i) ;",前面分析过,公式的最终值为一个double型,题中除数位置使用了
整数,这样的话,会造成不匹配错误,所以,正确语句如下:"y -= 1.0 / (i *
i) ;"。
【真题3】 请编写一个函数fun (int *a,int n,int *odd,int *even),函数的功能
是分别求出数组a 中所有奇数之和以及所有偶数之和。形参n 给出数组元素的个
数,整型指针odd 返回偶数之和,even 返回奇数之和。
例如:a 数组中各数组元素的值依次为:1,9,2,3,11,6,则调用函数fun
后,指针odd 返回偶数之和8,even 返回奇数之和24。
注意:部分源程序保存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >#define N 20
fun ( int *a, int n, int *odd, int *even )
{……}
main( )
{ int a[N]={1,9,2,3,11,6}, i, n=6, odd, even;
clrscr( );
printf ( "The original data is : \n" );
for ( i = 0; i < n; i ++ ) printf ( "%5d", *(a+i) );
printf("\n\n");
fun ( a, n, &odd, &even );
printf ( "The sum of odd numbers: %d\n", odd );
printf ( "The sum of even numbers: %d\n", even );
}
(2011年2月)
解析: 本题的考核点是c 语言中的指针和for 循环语句的使用。
解题思路:用for 循环语句依次判断整型数组中的每一个数组元素是偶数还是奇
数,判断偶数和奇数只需将数组元素与2 取模,结果为0 的数是偶数,为1的
是奇数。如果是偶数,则把该数加到*odd中;是奇数,加到*even中。
/*注:该题的算法是:用for()循环一步一步地找元素,用if(a[i]%2==0)来
判断是否是偶数,%运算是求余运算,当对2 求余为0 时表示原数为偶数,否
则为奇数*/
fun ( int *a, int n, int *odd, int *even )
{int i;
*odd = * even = 0;
for ( i = 0; i < n;i ++ )
if (a[i] % 2 == 0) /*用if(a[i]%2==0)来判断是否是偶数*/
*odd += a[i]; /*计算所有偶数之和并将计算后的结果赋给*odd*/
else
*even += a[i]; /*计算所有奇数之和并将计算后的结果赋给*even*/
}