12009年4月上机100套题71-80第七十一套请补充函数fun,该函数的功能是:寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。例如,输入6和21,则输出为:711131719。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。试题程序:#includestdlib.h#includeconio.h#includestdio.h#defineN1000intfun(intn,intm,intbb[N]){intI,j,k=0,flag;for(j=n;j=m;j++){【1】;for(I=2;Ij;I++)if(【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;im-n;i++)bb[i]=0;k=fun(n,m,bb);for(i=0;ik;i++)printf(%4d,bb[i]);2}【参考答案】(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,计算如下公式的值。y=1/(100100)+1/(200200)+1/(300300)+...+1/(mm)例如,若m=2000,则应输出0.000160。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#includestdlib.h#includeconio.h#includestdio.h/*************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(t3)的最小数,结果由函数返回。其中Fibonacci数列F(n)的定义为:3F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2)假如:当t=1000时,函数值为1597。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#includeconio.h#includemath.h#includestdio.hintfun(intt){}voidmain(){intn;FILE*out;n=1000;printf(n=%d,f=%d\n,n,fun(n));/******************************/out=fopen(out.dat,w);for(n=500;n3000;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(ct)/*如果求得的数c比指定比较的数大时,退出循环*/{c=a+b;a=b;b=c;}elsebreak;}returnc;}【解题思路】4根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和,而a始终代表第n-2项,b代表第n-1项。退出循环时得到的数c,就是大于指定数的最小的数。第七十二套请补充函数fun,该函数的功能是:统计所有小于等于n(n2)的素数的个数,并作为函数值返回。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。试题程序:#includestdio.hintfun(intn){intI,j,count=0;printf(\nTheprimenumberbetween2to%d\n,n);for(I=2;I=n;I++){for(【1】;jI;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的值通过形参传入。N234N+1S=++++123N5例如,若q的值为50.0,则函数值为49.394948。请改正程序中的错误,使程序能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#includeconio.h#includestdio.hdoublefun(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,它的功能是:计算和输出下列级数的和。S=1/(12)+1/(23)+...+1/(n(1))n例如,当n=10时,函数值为0.909091。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#includeconio.h6#includestdio.h#includestdlib.hdoublefun(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的横线上填入所编写的若干表达式或语句。试题程序:#includestdio.hlongfun(intx){intI,s;s=【1】;for(I=2;【2】;I+=2)s+=I;returns;}7main(){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函数,不得增行或删行,也不得更改程序的结构。试题程序:#includestdio.h/*************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++)8正确:for(i=0;str[i];i++)【解题思路