试题77-80

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第77套

请补充main函数,该函数的功能是:输入两个正整数m和n,求这两个数的最大公约和最小公倍数。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。

试题程序:

#include

main()

{

int a, b, n, m, t;

clrscr();

printf("\nInput two numbers:\n");

scanf ("%d,%d",&n,&m);

if(n

{

a=m;

b=n;

}

else

{

a=n;

b=m;

}

while(【1】)

{

t=【2】

a=b;

b=t;

}

printf("greatest common divisor:

%d\n",a);

printf("least common multiple:

%d\n",【3】);

}

【1】b!=0 【2】a%b; 【3】n*m/a

【解析】填空1:本题考查求最大公约数和最小公倍数的方法。变量a保存两数中较大着,变量b保存较小者,采用循环的方法求解最大公约数,循环结束条件是b等于0。填空2:求解最大公约数的思路是,将a 对b求余,如果余数为0,则b即为两数的最大公约数,如果余数不为0,则将b赋给a,余数赋给b,继续将a 对b求余,如此循环,直到余数为0。

填空3:最小公倍数等于两数的乘积除以最大公倍数。

2. 改错题

下列给定程序中函数fun() 的功能是:计算n!。例如,给n输入5,则输出120.000000。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include

#include

double fun (int n)

{ double result=1.0;

/**********************found***********************/

if n==0

return 1.0;

while(n>1&&n<170)

/**********************found***********************/

result *=n--

return result;

}

main()

{ int n;

printf ("Input N: ");

scanf("%d",&n);

printf ("\n\n%d!=%lf\n\n",n,fun(n));

}

(1)错误:if n= =0

正确:if (n= =0)

(2)错误:result*=n- -

正确:result*=n- - ;

【解析】在做这道题之前,我们首先应该明白一个数学上的概念,一般判卷人员先要执行程序,如果结果正确,得满分,否则错一个扣分,再错再扣,本题考查5!即5!=5×4×3×2×1=120,要求输出double 型结果。

3. 编程题

请编写函数fun(),该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中。要求函数把0至9岁年龄段的人数在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,依次类推,把100岁(含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include

# define N 50

# define M 11

void fun(int *a, int *b)

{

}

double rnd()

{

static t=29,c=217,m=1024,r=0;

r=(r*t+c)%m;

return((double)r/m);

}

main()

{

int age[N], i,d[M];

for(i=0; i

age[i]=(int)(115*rnd()); /*产生一个随机的年龄数组*/

printf("The original data :\n");

for(i=0; i

printf((i+1)%10= =0? "%4d\n":"%4d",age[i]); /*每行输出10个数*/

printf("\n\n");

fun(age,d);

for(i=0; i<10; i++)

printf("%4d---%4d :%4d\n", i*10, i*10+9,d[i]);

printf("Over 100 : %4d\n",d[10]);

}

【解析】本题又是一个分段函数的问题,还是用两个循环来完成。第1个循环的作用是使b的所有元素值都为0。这个循环不能省略,因为若未对b元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]大于等于100时,按题意要将其统计到b[10]中,else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0至9时,a[i]/10的值为0,且0至9岁的人数正好要存入b[0]中。若a[i]为10至19岁时a[i]/10的值为1,且10至19岁的人数正好要存入b[1]中,依次类推。

void fun(int *a, int *b)

{

int i,j;

for(j=0;j

b[j]=0; /*数组b初始化为0*/

for(i=0;i

if(a[i]>=100)

b[10]++; /*如果年龄大于等于100,b[10]自增1*/

else

b[a[i]/10]++; /*如果年龄小于100,则将其分别统计到b[a[i]/10]中

*/

}

相关文档
最新文档