上机100套题及答案7180.docx
《上机100套题及答案7180.docx》由会员分享,可在线阅读,更多相关《上机100套题及答案7180.docx(50页珍藏版)》请在冰点文库上搜索。
上机100套题及答案7180
2009年4月上机100套题71-80
第七十一套
请补充函数fun,该函数的功能是:
寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。
例如,输入6和21,则输出为:
711131719。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#include
#defineN1000
intfun(intn,intm,intbb[N])
{
intI,j,k=0,flag;
for(j=n;j<=m;j++)
{
【1】;
for(I=2;Iif(【2】)
{
flag=0;
break;
}
if(【3】)
bb[k++]=j;
}
returnk;
}
voidmain()
{
intn=0,m=0,i,k;
intbb[N];
system("CLS");
printf("Inputn\n");
scanf("%d",&n);
printf("Inputm\n");
scanf("%d",&m);
for(i=0;ibb[i]=0;
k=fun(n,m,bb);
for(i=0;iprintf("%4d",bb[i]);
}
【参考答案】
(1)flag=1
(2)j%i==0(3)flag==1
【解题思路】
填空1:
由flag决定当前判断的数是否为素数,先置flag为1,如果判断当前数不是素数,则将flag置0。
填空2:
如果一个数能被除了1和其自身之外的数整除(即余数为0),则这个数不是素数。
填空3:
如果flag等于1,则说明当前数是素数,并把它存入数组bb中。
下列给定程序中,函数fun的功能是:
根据整型参数m,计算如下公式的值。
例如,若m=2000,则应输出0.000160。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
/*************found**************/
fun(intm)
{doubley=0,d;
intI;
/*************found**************/
for(I=100,I<=m,I+=100)
{d=(double)I*(double)I;
y+=1.0/d;
}
return(y);
}
voidmain()
{intn=2000;
system("CLS");
printf("\nTheresultis%1f\n",fun(n));
}
【参考答案】
(1)错误:
fun(intm)
正确:
doublefun(intm)
(2)错误:
for(I=100,I<=m,I+=100)
正确:
for(i=100;i<=m;i+=100)
【解题思路】
题目要求在函数fun()中求级数前m项和,可用循环语句,每次计算级数中的一项,然后累加。
此题的难点在于定义fun(intm),由后面函数的应用,可以确定应该定义成doublefun(intm)。
for(i=100,i<=m,i+=100)是一个简单的语法错误。
请编写函数fun,它的功能是:
求Fibonacci数列中大于t(t>3)的最小数,结果由函数返回。
其中Fibonacci数列F(n)的定义为:
F(0)=0,F
(1)=1
F(n)=F(n-1)+F(n-2)
假如:
当t=1000时,函数值为1597。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
intfun(intt)
{
}
voidmain()
{
intn;
FILE*out;
n=1000;
printf("n=%d,f=%d\n",n,fun(n));
/******************************/
out=fopen("out.dat","w");
for(n=500;n<3000;n+=500)
fprintf(out,"%d\n",fun(n));
fclose(out);
/******************************/
}
【参考答案】
intfun(intt)
{
inta=1,b=1,c=0,i;
/*a代表第n-2项,b代表第n-1项,c代表第n项,*/
/*如果求得的数c比指定的数小,则计算下一个Fibonacci数,对a,b重新置数*/
for(i=4;i<=t;i++)
{
if(c/*如果求得的数c比指定比较的数大时,退出循环*/
{
c=a+b;a=b;b=c;
}
else
break;
}
returnc;
}
【解题思路】
根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和,而a始终代表第n-2项,b代表第n-1项。
退出循环时得到的数c,就是大于指定数的最小的数。
第七十二套
请补充函数fun,该函数的功能是:
统计所有小于等于n(n>2)的素数的个数,并作为函数值返回。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
intfun(intn)
{
intI,j,count=0;
printf("\nTheprimenumberbetween2to%d\n",n);
for(I=2;I<=n;I++)
{
for(【1】;j
if(【2】%j==0)
break;
if(【3】>=I)
{
count++;
printf(count%15?
"%5d":
"\n%5d",I);
}
}
returncount;
}
main()
{
intn=20,r;
r=fun(n);
printf("\nThenumberofprimeis:
%d\n",r);
}
【参考答案】
(1)j=2
(2)i(3)j
【解题思路】
填空1:
判断一个数是否为素数时,也就是判断这个数是否能被除了1和其自身之外的因子整除,所以for循环的变量从2开始。
填空2:
如果一个数能被除了1和其自身之外的数整除,则这个数不是素数。
填空3:
当运行到这段程序时,表示j只能被1和其自身整除,说明是素数。
下列给定程序中,函数fun的功能是:
计算并输出下列数的前N项之和SN,直到SN+1大于q为止,q的值通过形参传入。
例如,若q的值为50.0,则函数值为49.394948。
请改正程序中的错误,使程序能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
doublefun(doubleq)
{intn;doubles,t;
n=2;
s=2.0;
while(s<=q)
{
t=s;
/*************found**************/
s=s+(n+1)/n;
n++;
}
printf("n=%d\n",n);
/*************found**************/
returns;
}
voidmain()
{
printf("%f\n",fun(50));
}
【参考答案】
(11)错误:
s=s+(n+1)/n;
正确:
s=s+(double)(n+1)/n;
(22)错误:
returns;正确:
returnt;
【考点分析】
本题考查:
变量数据类型,根据题目要求需要进行强制转换;return语句,功能是计算表达式的值,并返回给主调函数。
【解题思路】
(1)在C语言中,整数除以整数得出的结果也是整数,题中是计算小数的,所以要转变类型。
(2)观察while循环,假如返回值是s,那么返回的是大于q的值,题中所要返回的是小于q的值,所以应该返回t。
编写函数fun,它的功能是:
计算和输出下列级数的和。
例如,当n=10时,函数值为0.909091。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
doublefun(intn)
{
}
voidmain()
{
FILE*wf;
system("CLS");
printf("%f\n",fun(10));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(10));
fclose(wf);
/*****************************/
}
【参考答案】
doublefun(intn)
{
inti;
doubles=0.0;
for(i=1;i<=n;i++)
s=s+1.0/(i*(i+1));/*求级数的和*/
returns;
}
【解题思路】
解决数学序列的问题,我们的思路依然是"数学先行",即先看清楚题目的数学逻辑,然后再用C语言"翻译"出来。
本题中,每一项的值都是n*(n+1)的倒数。
当输入n时,从1开始循环,注意,此处for(i=1;i<=n;i++)中的"="号必须要有,另外,表达式1.0/(i*(i+1))中的两对小括号一个都不能少。
若写成1.0/i*(i+1),则相当于(i+1)/i,结果就差之千里了。
第七十三套
请补充函数fun,该函数的功能是:
求不超过给定自然数的所有偶数之和。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
longfun(intx)
{
intI,s;
s=【1】;
for(I=2;【2】;I+=2)
s+=I;
returns;
}
main()
{
intn;
do
{
printf("\nPleaseenternaturalnumbersn:
");
scanf("%d",&n);
}while(n<=0);
printf("\n不超过给定自然数%d的各偶数只和为%d\n",n,fun(n));
}
【参考答案】
(1)0
(2)i<=x
【解题思路】填空1:
根据题意,偶数当然要从0开始,所以s=0。
填空2:
不论给定的数是偶数还是奇数,只要小于等于x,便应该计算在内。
下列给定程序中函数fun的功能是:
统计子字符串substr在字符串str中出现的次数。
例如,若字符串为aaaslkaaas,子字符串为as,则应输出2。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
/*************found**************/
intfun(char*str,*substr)
{
inti,j,k,num=0;
/*************found**************/
for(i=0,str[i],i++)
for(j=i,k=0;substr[k]==str[j];k++,j++)
if(substr[k+1]=='\0')
{
num++;
break;
}
returnnum;
}
voidmain()
{charstr[80],substr[80];
printf("Inputastring:
");
gets(str);
printf("Inputasubstring:
");
gets(substr);
printf("%d\n",fun(str,substr));
}
【参考答案】
(1)错误:
intfun(char*str,*substr)
正确:
intfun(char*str,char*substr)
(2)错误:
for(i=0,str[i],i++)
正确:
for(i=0;str[i];i++)
【解题思路】
从字符串s中找出子字符串的方法是:
从第1个字符开始,对字符串进行遍历;若s串的当前字符等于t串的第1个字符,两个字符串的指针自动加1,继续比较下一个字符;若比较至字符串的末尾,则跳出循环;若s串的字符和t串的字符不对应相同,则继续对s串的下一个字符进行处理。
本题都是简单的语法错误,不再阐述。
请编写函数fun,其功能是:
计算并输出下列多项式的值。
S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)
例如,若主函数从键盘给n输入50后,则输出为S=1.960784。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
doublefun(intn)
{
}
voidmain()
{
FILE*wf;
intn;
doubles;
printf("\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(50));
fclose(wf);
/*****************************/
}
【参考答案】
doublefun(intn)
{
inti;
doubles=0.0,s1=0.0;
for(i=1;i<=n;i++)
{
s1=s1+i;/*求每一项的分母*/
s=s+1.0/s1;
/*求S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)*/
}
returns;
}
【解题思路】
该程序的数学思路是:
在程序中输入n后,以前n项的和作为分母递加,由于s1是浮点类数据所以s=s+1.0/s1;,for循环的作用是每一次循环给总结果s加上一项1.0/s1。
第七十四套
给定程序功能是:
计算S=f(-n)+f(-n+1)+…+f(0)+f
(1)+f
(2)+…+f(n)的值。
例如,当n为5时,函数值应为:
10.407143。
注意:
部分源程序给出如下。
请勿改动main函数中的任何内容,仅在f函数和函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
doublef(doublex)
{
if(fabs(x-0.0)<0.000001||fabs(x-2.0)<0.000001)
return【1】;
elseif(x<0.0)
return(x-1)/(x-2);
else
return(x+1)/(x-2);
}
doublefun(intn)
{
intI;doubles=0.0,y;
for(I=-n;I<=【2】;I++)
{y=f(1.0*I);s+=y;}
return【3】;
}
voidmain()
{system("CLS");
printf("%lf\n",fun(5));
}
【参考答案】
(1)0.0或0或(double)0
(2)n(3)s
【解题思路】
填空1:
根据函数f(x)中的条件可以知道,当x=0或2时,返回值为0,所以填入0.0、0或(double)0。
填空2:
由题意可知,s要计算f(-n)到f(n)的和,所以for循环的范围为-n到n。
填空3:
计算的结果要返回输出,所以返回值是总和s。
下列给定程序中,函数fun实现的功能是:
统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数;并把该整数中各位上最大的数字值作为函数值返回。
例如,若输入无符号整数30800,则数字值为零的个数为3,各位上数字值最大的是8。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,
也不得更改程序的结构。
试题程序:
#include
intfun(unsignedn,int*zero)
{
intcount=0,max=0,t;
do
{
t=n%10;
/*************found**************/
if(t=0)
count++;
if(maxmax=t;
n=n/10;
}while(n);
/*************found**************/
zero=count;
returnmax;
}
main()
{
unsignedn;
intzero,max;
printf("\nInputn(unsigned):
");
scanf("%d",&n);
max=fun(n,&zero);
printf("\nTheresult:
max=%d\nzero=%d\n",max,zero);
}
【参考答案】
(1)错误:
if(t=0)正确:
if(t==0)
(2)错误:
zero=count;正确:
*zero=count;
【解题思路】
(1)根据题意,这里需要条件语句,不是赋值语句区别条件表达式中==和=的区别。
(2)这里是指针赋值的一个简单错误。
请编写函数fun,其功能是:
计算并输出当x<0.97时如下多项式的值,直到|Sn-Sn-1|<0.000001为止。
例如,若主函数从键盘给x输入0.21后,则输出为S=1.100000。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
doublefun(doublex)
{
}
voidmain()
{inti;
doublex,s;
FILE*out;
printf("Inputx:
");
scanf("%lf",&x);
s=fun(x);
printf("s=%f\n",s);
/******************************//*这里包含输出文件程序*/
out=fopen("out.dat","w");
for(i=20;i<30;i++)
fprintf(out,"%f\n",fun(i/100.0));
fclose(out);
/******************************/
}
【参考答案】
doublefun(doublex)
{
doubles1=1.0,p=1.0,sum=0.0,s0,t=1.0;
intn=1;
do
{
s0=s1;
sum+=s0;
t*=n;
p*=(0.5-n+1)*x;
s1=p/t;
n++;
}while(fabs(s1-s0)>=1e-6);
returnsum;
}
【解题思路】
函数fun的功能是计算并输出,当x<0.97时下列多项式的值。
解答这类题,首先应该分析多项式的特点。
由于从第二项开始的所有项都能把分子与分母用两个表达式进行迭代,因此可利用一个循环求和。
第七十五套
请补充函数fun,该函数的功能是:
求100(不包括100)以内能被2或5整除,但不能同时被2和5整除的自然数。
结果保存在数组bb中,函数fun返回数组bb元素的个数。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN100
intfun(intbb[])
{
intI,j;
for(【1】;I<100;I++)
if((I%2!
=0&&I%5==0)||(I%2==0&&I%5!
=0))
【2】;
【3】;
}
voidmain()
{
inti,n;
intbb[N];
system("CLS");
n=fun(bb);
for(i=0;i{
if(i%10==0)
printf("\n");
printf("%4d",bb[i]);
}
}
【参考答案】
(1)i=1,j=0
(2)bb[j++]=i(3)returnj
【解题思路】
填空1:
题目要求找100以内的自然数,而自然数是从1开始的,所以i的初始值为1。
变量j声明时没有初始化,所以在这里初始化为0,用来记录满足条件的自然数的个数。
填空2:
将满足条件的自然数存于数组bb中,下标加1是为下一次存储做