计算机二级C语言上机真题(73)【附详解】
【真题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';
}
两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
试题程序:
#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';
}