【真题1】 下列给定的程序中,函数fun()的功能是:为一个偶数寻找两个素数,这 两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 试题程序: #include < stdio.h >#include < math.h >void fun(int a, int *b, int *c) { int i,j,d,y; for (i=3;i< =a/2;i=i+2) {__1__; for (j=2;j< =sqrt((double)i );j++) if (__2__==0) y=0; if (y==1) {d=a-i; for (j=2;j< =sqrt((double)d );j++) if (d%j==0) y=0; if (y==1) {*b=i; *c=d;} } } } main() { int a,b,c; do { printf("\nInput a: "); scanf("%d",&a);} while(__3__); fun(a,&b,&c); printf("\n\n%d=%d+%d\n",a,b,c); } (2011年2月) 解析: 填空1:根据题目的意思,这里应该是对于变量y赋初值,由下面的程 序可以看出来,y是作为标志变量使用的,所以初值应该为1。 填空2:根据题目的意思,此处是验证j是否为i的因子,这道题是历年的考题 经典,也就是验证哥德巴赫猜想之变体,原来的思路是(任意一个大于等于6 的偶数都可以分解为两个素数之和)n为大于等于6的任一偶数,可分解为n1 和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1 不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2 (n2=N-n1)是否素数。然后使n1+2 再检验n1,n2是否素数,…,直到 n1=n/2 为止,考生应主要了解思路。 填空3:根据题目的意思,此处是判断输入的数字a是否为偶数,如果不是则 为死循环,考生在编写这样的程序时应该避免使用这种死循环的方法。 答案:【1】y=1 【2】i%j 【3】a%2 【真题2】 给定程序modi.c 中函数fun的功能是:从3 个红球,5 个白球,6 个 黑球中任意取出8 个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红 球和白球。组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红 球数,j 的值代表白球数,k 的值代表黑球数。 请改正函数fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < stdio.h >int fun() { int i,j,k,sum=0; printf("\nThe result :\n\n"); /**************found**************/ for(i=0; i< =3; i++) { for(j=1; j< =5; j++) { k=8-i-j; /**************found**************/ if(k >=1 && k< =6) { sum=sum+1; printf("red:%4d white:%4d black:%4d\n",i,j,k); } } } return sum; } main() { int sum; sum=fun(); printf("sum =%4d\n\n",sum); } (2011年2月) 解析: 本题的考核点是数组的使用。 解题思路:因为抽出的球必须要有红球和白球,所以可以通过循环使红球和白 球先抽,然后不足的补上黑球。 程序中的第一个错误:因为抽出的球必须要有红球和白球,所以i 的值应至少为 1,从1 开始循环;将'for(i=0; i< =3; i++)'改为'for(i=1;i< =3;i++)'; 程序中的第二个错误:因为在每组中,可以没有黑球,即黑球数可以为0,所以 黑球数在0-8之间,将'if(k >=1 && k< =6)'改为'if(k >=0&&k< =6)'。 【真题3】 函数fun 的功能是:将s 所指字符串中下标为偶数同时ASCII值也为偶 数的字符删除, s 中剩余的字符形成一个新串放在t 所指的数组中。 例如,若s 所指字符串中的内容为"ABCDEFG12345",其中字符B 的ASCII码值 虽为偶数,但在数组中的下标为奇数, 因此不能删除;而字符2 的ASCII码值为偶 数, 在数组中的下标也为偶数,因此应当删除,其它依此类推。 最后t 所指的数组中的内容应是"ABCDEFG135"。 注意: 部分源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < conio.h >#include < stdio.h >#include < string.h >void fun(char *s, char t[]) {……} main() { char s[100], t[100]; clrscr(); printf("\nPlease enter string S:"); scanf("%s", s); fun(s, t); printf("\nThe result is: %s\n", t); 解析: 本题的考核点是数组、循环语句。 解题思路:使用循环语句,将除数组下标为偶数的元素且其值的ASCII码值为 偶数之外元素的值存入另外一个数组中。 void fun(char *s, char t[]) { int i,slenth,n=0; slenth=strlen(s); /*通过strlen 函数求字符串s的长度*/ for(i=0;i< slenth;i++) { if(s[i]%2==0 && i%2==0) ; /*判断s 所指字符串中字符的下标为是否为偶 数、同时其ASCII值是否为偶数*/ else t[n++]=s[i]; /*将除数组下标为偶数且其值的ASCII码值为偶数之外元素的 值存入数组t中*/ } t[n]='\0'; } |