【真题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*/ } |