全国二级c语言100套上机真题.docx
001请补充函数fun,函数fun的功能是求n的阶乘。注意:部分源程序给出如卜。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表 达式或语句。试题程序:#include <stdio.h> long fun(int n)if( 1)retum(n*fun( 2);return 3;void main()printf(" 10!=%ldnfun(l 0);1 n>l 或 l<n 2 n-1 3 1【解析】填空1:求阶乘时采用递归的算法,n>l和n=l这两种情况的处理方法不同,需 要分开考虑。填空2:阶乘的算法是,当n>l时,n! =n*(n-l)!,即:fun(n)=n*fun(n-l)。填空 3: n=l是递归的终止条件,返回值为E下列给定程序中,函数fun的功能是:分别统计字符串中大写字母和小写字母的个数。例如, 给字符串 s 输入:AaaaBBb 123CCccccd,则应输出结果:upper=5, lower=9» 请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include<conio.h>#include<stdio.h>/*found*/ void fun(char *s,int a,ini b)while(*s)/* 亭 found */if(*s>='A, && *s<=T)a+;/* *found * */if(*s>='a' && *sv='z')b+;s+;)main()(chars100;int upper=0,lower=0;printf("npiease a string :H);gets(s);fun(s,&upper,&lower);printf("n upper=%d lower=%dnH,upper,lower);(1)错误:void fun( char *s, int a, int b)正确:void fun(char *s, int *a, int *b)(2)错误:a+;正确:(*a)+;(3)错误:b+;正确:(*b)+;【解析】(1)根据题中程序可以看出,函数fun传递的是地址,那么在函数中就应该出现指 针,所以改为void fun (char *s ,int *a, int *b)。(2)和(3)很明显,这里是要累加数值,因 为a、b是指针变量,所以是错误的。请编写一个函数void fun(charpp),统计在tt字符串中”a“到“ z"26个字母各自出现的次数,并依次放在pp所指数组中。例如:当输入字符串abcdefghabcdeabc后,程序的输出结果应该是:333221 11000000 0000000000000注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干 语句。试题程序:#include <conio.h>#include <stdio.h>#include <stdlib.h>void fun(char pp) void main()(FILE *wf;char aa1000;int bb26, k;system(MCLS");printf("nPlease enter a char string : "); scanf(n%sn,aa);fun(aa,bb);for (k=0 ;k<26 ; k+)printf(H%d M,bbk);printf(Mn ");wf=fopen("out.dat,"wM);fun (nabcdefgabcdeabcM,bb);for (k=0 ;k<26 ; k+)fprinlf(wf,"d ”,bbk);fclose(wf); void fun(char*tt,int pp)(int i;for(i=0;i<26;i+)ppi=O;/*初始化pp数组各元素为0*/for(;*tt!='0'H+)if(*tt>=,a,&&*tt<=,z,)pp*tt-'a'+;/*将tt字符串中H到N26个字母各自出现的次数,依次放在pp数组中,任一个小写字母减去宜后所得结果正好是它对应的下标*/【解析】第1个循环的作用是初始化数组pp,未经赋值变量的量为一个不确定数字。由于 它要将'a到Z '26个字母的个数依次放到数组pp中。即丁的个数存于pp0中,'b,的个数存 于ppl中,的个数存于pp中,依次类推。而葭-0,的值正好为0,的值为1,'ca,的值为2,,依此类推。即任一个小写字母减去T后所得结果正好是它对应的下标, 所以就有了 pp*tta+。但*tt必须是小写字母,即if()不应省略。002请补充函数fun,它的功能是:计算并输出n(包括n)以内所有能被3或7整除的自然数的倒 数之和。例如,在主函数中从键盘给n输入30后,输出为:s= 1.226323。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表 达式或语句。试题程序:#include<stdio.h>double fun(int n)int i;double sum=0.0;for (i= 1 1 ; i+) if(i%3=0_ 2 _i%7=0) sum+=_ 3 _/i;return sum;)main()(int n;double s;printf(HnInput n: "); scanf("d”,&n);s=fun(n);printf("nns=%fnu, s);1 i<=n 2 II 【3】1.0 或(double) 1【解析】填空1:本题要求找出n(包括n)以内满足条件的自然数,所以,i的取值范围是从 1到n,填空2: i能被3整除,也就是指,i除以3的余数为0,题中的条件是能被3或7 整除,所以使用逻辑或运算符"11"。填空3:需要注意,如果71运算符两边都是整型数,则结 果也是整型数。因为i为整型数,如果将i的倒数写为1/i,则结果为0,所以在求倒数时, 要使用1。,而不是1,或者将变量i强制类型转化为double型。下列给定程序中,函数fun()的功能是:根据整型形参m的值,计算如下公式的值。t=l-l/(2x2)-l/(3x3)-.-l/(mxm)请改正函数fun()中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include <stdlib.h> #include <conio.h>#include <stdio.h> double fun(int m) double y=1.0;int I;/¥*found*/ for(I=2;I<m;I+)/*found*/y-=l/(I*I);retum(y);void main() int n=5;system("CLS");printf("nThe result is %lfn", fun(n);(1)错误:for(I=2; I<m; I+) 正确:for(I=2; I<=m; I+)(2)错误:y-=l/(l*I);正确:y-=1.0/(I*I);【解析】该题是一道简单的计算题,循环条件for(I=2;km;I+)中忽略了 i=m时的一种情况, 因为题目中I是从2到m的一个计算公式。y-=l/(l*);的错误很明显,是语法错误,由定义 double y= 1.0 可知,应该是 y-=L0/(I*I);,而非 y-=l/(I*I);。请编写一个函数void fun(int m, int k, int xx),该函数的功能是:将大于整数m且紧靠m的 k个素数存入所指的数组中。例如,若输入17, 5,则应输出19, 23, 29, 31, 37。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干 语句。试题程序:#include <stdlib.h>#include <conio.h>#include <stdio.h>void fun(int m, int k, int xx) void main()(int m,n,zz1000;system(,'CLS,');printf("nPlease enter two integers:");scanf(,'%d%dM,&m,&n);fun(m, n, zz);for(m=0;m<n;m+)printf(M%d M,zzm);printf(Hn "); void fun(int m, int k, int xx)(int i,j,n;for(i=m+1 ,n=0;n<k;i+)/*找大于 m 的素数,循环 k 次,即找出紧靠m的k个素数*/for(j=2;j<i;j+)/*判断一个数是否为素数,如果不是,跳出此循环,判断下一个数*/if(i%j=O) break;if(j>=i)/*如果是素数,放入数组xx中*/ xxn+=i;【解析】本题只要掌握了判断素数的算法就不难完成了,其实程序缺少部分也正是这部分。003给定程序的功能是:求二分之一的圆面积,函数通过形参得到圆的半径,函数返回二分之一 的圆面积(注:圆面积公式为:S=nr2,在程序中定义的变量名要与公式的变量相同)。例如,输入圆的半径值:19.527,输出为:s=598.949991。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仪在横线上填入所编写的若干表达式或语句。 试题程序:#include <stdio.h>double fun(double r)(return 3.14159*_ 1 _/2.0;Imain()(double x;printf("Enter x:");scanf("%ir,_ 2 J;printf("S=%lfn",fun(_ 3 _);1 r*r 2 &x 3 x【解析】填空1:计算圆的面积,面积公式:S=FIr*r。填空2: scanf一般形式为scanf (格 式控制,地址表列),因此填入&x。填空3:送入函数的参数是圆的半径X。下列给定程序中,fun函数的功能是:根据形参m,计算下列公式的值。t=l + l/2+l/3+l/4+.+ l/m例如,若输入5,则应输出2.283333。请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include <stdlib.h>#include <conio.h>#include <stdio.h>double fun(int m)double t=1.0;int I;for(I=2;I<=m;I+)/* *found */ t+=l.O/k;/* * *fou nd */ return I;void main()int m;system(nCLSu);printf(HnPlease enter 1 integer number:");scanf(”d”,&m);printf(MnThe result is %lfnu, fun(m);(1)错误:t+=LO/k;正确:t+=1.0/I;(2)错误:return I; 正确:return t;【解析】该题目考查分母成等差数列递增的一个数学公式,我们先看循环条件 for(I=2;I<=m;I+), i从2开始递增到m,所以t的值应该是由1.0/1的值逐步循环叠加后的 结果,而不是t+=1.0/k;。return I;考查对程序的解读能力,当循环结束后(由输入m的值决 定),函数返回当前t的值。编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过形参 传入。S=l+l/(l+2)+l/(l+2+3)+.+ l/(l+2+3+.+n)例如:若n的值为11时,函数的值为1.833333。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干 语句。试题程序:#include <stdlib.h>#include <conio.h>#include <stdio.h>#include <string.h>float fun(int n) void main()(int n;float s;system(“CLS”);printf(MnPlease enter N: ");scanf(H%dn,&n);s=fun(n);printf("The result is:%fn ",s);float fun(int n)(int i,sl=0;float s=0.0;fbr(i=l;i<=n;i+)sl=sl+i;/*求每一一项的分母*/ s=s+1.0/sl;/*求多项式的值*/return s;【解析】本题中si用来表示式中每一项的分母,而每一项的分母都是由前一项分母加项数。注意:由于si定义成一个整型,所以在s=s+1.0/sl中不能把1.0写成1。004给定程序的功能是:计算并输出下列级数的前N项之和SN,直到SN大于q为止,q的值 通过形参传入。例如,若q的值为50.0,则函数值为50.416687。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表 达式或语句。试题程序:#include<stdio.h>double fun(double q)(int n;double s;n=2;s=2.0;while (s 1 q)s = s + (double)(n+ l)/n;2;)printf(',n=%dn,n);【3】;main() printf(M%fnn,fun(50);1 <= 2 n+或 n+=l 或 n=n+1 3 return s 或 return (s)【解析】填空1:根据题意,相加直到Sn大于q为止,因此为<=。填空2:计算前N项的 和,增加n的值。填空3:计算完Sn的和后,返回函数的值,以便于输出。下列给定的程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除 的自然数之和。K的值由主函数传入,若k的值为500,则函数的值为4622。请改正程序中的错误,使它能得出正确的结果。也不得更改程序的结构。注意:不要改动main函数,不得增行或删行, 试题程序:#include <stdio.h>#include <conio.h>#include <stdlib.h>int fun(int k) int m=0,mc=0, j;while(k>=2)&&(mc< 10) /*found*/if(k%13=0)ll(k%17=0) m=m+k;mc+;k-;/* * fou nd */return m;void main()system(MCLSM);printf(n%dn ",fun(500);(1)错误:if(k%13=0)ll(k%17=0)(2)错误:缺少大括号正确:if(k%13=0)H(k%17=0)正确:加【解析】x能被y整除的表示方法是x%y=0,而并非像题目中所表示的x%y=0,所以, if(k%13=0)ll(k%17=0)修改后的结果应该是答案所示信息。(2)中缺少程序完整所需的 此类信息在做题时一定要注意,我们可以在做题前先运行一下程序,这样明显的错误一般都 会有错误信息显示出来,比如丢失""的错误信息是"Compound statement missing in function fun”,并在当前错误处停止光标,我们只要按回车健进行编辑就可以了。编写函数fun,它的功能是:根据以下公式求p的值,结果由函数值带回。m与n为两个正 数且要求 m>n。P=m!/(n!(mn)!),例如:m=12, n=8 时,运行结果为 495.000000。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干 语句。试题程序:#include <conio.h>#include <stdio.h>#include <stdlib.h>float fun(int m, int n) void main()system(nCLS");printf(Mp=%fnM,fun(12,8);float fun (int m, int n)(int i;double p=1.0;for(i= 1 ;i<=m;i+)p=p*i;/*求 m!*/for(i= 1 ;i<=n;i+)p=p/i;/*求 m!/n!*/fbr(i= 1 ;i<=m-n;i+) p=p/i;/*求 m!/(n!(m-n)!)*/return p;)【解析】本题中,欲求P的值,需要先求m、n和m-n的阶乘值,可用循环语句实现。注意 阶乘值应当是double类型,若定义x, y, z为整型变量,则p=x/(y*z)中的除法为整数除 法。005请补充函数fun,该函数的功能求能是:整除x且是偶数的数,把这些数保存在数组bb中, 并按从大到小的顺序输出。例如当x=20时,依次输出:20 10 4 2。注意:部分源程序给出如卜。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表 达式或语句。试题程序:#include <stdlib.h>#include <conio.h>#include <stdio.h> void fun(int k,int bb)int I;intj=O;for( I ;I<=k;I+) if( 2) bbj+=I;) printf(nnnH); for(I= 3 ;I>=0;I-) printf(H%d M,bbI);void main()(int k=l;int bb100;system(HCLSn);printf(MnPlease input X=M); scanf(H%dM,&k);fun(k,bb);11 1=1 2 k%I=0&&I%2=03 _j 或 j或 j=j-l 或 j=l【解析】填空1:为了求出能整除k,且是偶数的数,寻找范围是从1到匕 填空2:如果I 能整除匕则k对I求余为0,如果I为偶数,贝UI对2求余为0,由于这两个条件要同时满 足,所以要使用“与“运算符“&&”。填空3:由于数组bb中的数是按从小到大的顺序排列的, 而题目要求按从大到小输出,所以从数组的最后一个元素开始,依次输出。因为在for循环 中,变量j多加了一次,所以这里要将j减1,得到数组最后一个元素的下标。下列给定程序中,函数fun的功能是:根据整型形参m,计算如下公式的值。例如,若m中的值为5,则应输出:1.463611。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include <conio.h>#include <stdio.h>double fun(int m) double y= 1.0;int i;/*found*/for (i=2; i<m; i+)/*found*/y+=l/(i*i);retum(y);main()(int n=5;printf(nnThe result is%lfn",fun(n);(1)错误:for (i=2;i<m;i+) 正确:fbr(i=2;i<=m;i+)(2)错误:y+=l/(i*i)正确:y+=1.0/(i*i)【解析】(1) for (i=2;ivm;i+)中是一个基础的分析错误,应该包括m。(2) y是一个double 型变量,题中得出的结果是一个整数,所以改为y+=1.0/(i*i)。编写函数fun,它的功能是:利用以下所示的简单迭代方法求方程cos(x)x=0的一个实根。 xn+l=cos(xn)迭代步骤如下:(1)取xl初值为0.0;(2) x0=xl,把xl的值赋给x0;(3) xl=cos(x0),求出一个新的 xl;(4)若x0xl,的绝对值小于0.000001,则执行步骤(5),否则执行步骤(2);(5)所求xl就是方程cos(x)x=0的一个实根,作为函数值返回。程序将输出结果Root=0.739085o注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仪在函数fun的花括号中填入所编写的若干 语句。试题程序:#include <conio.h>#include <math.h>#include <stdio.h>float fun () main()(float f=fun ();printf(MRoot=%fnM,f); float fun() ( float xl=0.0,x0;do ( xO=xl; xl=cos(xO); ) while (fabs(xO-x 1 )>= 1 e-6); return xl;【解析】函数fun的功能是用迭代方法求方程的一个实根,结果由函数值返回。题目已经给 出了算法,只要按照算法用合适的程序表达,就可以解题了。006程序的功能是计算s=! !.注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在横线上填入所编写的若干表达式或语句。 试题程序:#include <stdio.h>long fun(int n)int i;long s;s= 1 _;for(i=l; i<=n; i+)s= 2;return s;)main()(long s;int k, n;scanf(M%dH,&n);s= 3;for (k=0; k<=n; k+)s= 4;printf(n%idnu,s);1 1【2s*i 或 i*s 3 04 s+fun(k)【解析】函数fun的功能是计算n的阶乘。首先定义一个long型累计变量s,并初始化为1, 然后用一个for循环从1循环到n,累乘给s,循环结束时s的值即为n的阶乘。主函数中也 定义了一个累计变量s,通过for循环,累加从0到n的所有数的阶乘。下列给定程序中,函数fun的功能是:按如下递归公式求函数值。例如,当给n输入5时,函数值为18;当给n输入3时,函数值为14。 请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:#include <stdio.h>/* found* */int fun (n)(int c;/* * * found* */if(n=l)c=10;elsec=fun(n-l)+2;return (c);Imain ()(int n;printf("Enter n:");scanf(u%dM, &n);printf(MThe result: %dnn'fun(n);(1)错误:intfun(n)正确:int fun (int n)(2)错误:if(n=l) 正确:if(n=l)【解析】(1)主函数中已经定义了变量n的类型,在子函数中也要定义。(2) if后面应该紧 跟一个条件判断表达式,而n=l是付值表达式,表达式的值永远为真,也就是说这个条件 永远成立,没有递归执行。请编写函数fun,函数的功能是:求出二维数组周边元素之和,作为函数值返回。二维数组 中的值在主函数中赋予。例如:若二维数组中的值为13 5 7 92 9 9 9 46 9 9 9 813 5 7 0则函数值为61,注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include <stdlib.h>#include <conio.h>#include <stdio.h>#define M 4#define N 5 int fun( intaMN) void main()(int aaMN= 135,7,9),2,9,9,9,4), 6,9,9,9,8,1,3,57,0;int i, j, y;system(nCLSn);printf (nThe original data is :n ");for(i=0; i<M;i+)for (j=O;j<N;j+)printf("%6d n,aaij);printf("n ");y=fun(aa);printf("nThe sun: %dn n,y);printf(Hn "); int fun( int aMN)(int i,j,sum=0;for(i=0;i<M;i+)for(j=0;j<N;j+)if(i=0lli=M-lllj=0llj=N-l)/*只要下标中有一个为 0 或 M-l 或 N-1,则它一定是周边元素*/sum=sum+aijj;/*将周边元素相加*/return sum;)【解析】本题采用逐一判断的方式,周边元素的下标一定有一个是0或M-1或N-1,且只要 下标中有一个为。或M-1或N-1,则它一定是周边元素。请补充函数fun,该函数的功能是:求不超过给定自然数的所有偶数之和。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表 达式或语句。试题程序:#include <stdio.h>int fun(int x)(int i, s;s=_ 11 ;for(i=2; 2 ;i+=2)s+=i;return s;main()(int n;do(printf(nnPlease enter natural numbers n:");scanf("%d'&n); while (n <= 0);printf("n不超过给定自然数d的各偶数之和为dn”,n,fun(n);)1 02 i<=x【解析】填空1:根据题意,偶数当然要从0开始,所以40。填空2:不论给定的数是偶 数还是奇数,只要小于等于X,便应该计算在内。下列给定程序中函数fun的功能是:计算n!。例如,给n输入5,则输出定0.000000。 请改正程序中的错误,使程序能输出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:#include <stdio.h>#include<conio.h> double fun(int n) (double result = 1.0;/* * * found* */if n=0return 1.0;while (n>l && n<170)/* * * found* */result = n-;return result;main ()( int n;printf(nInput N: "); scanf("%dH, &n);printf(',nn%d!=%lfnn,',n,fun(n);(I)错误:ifn=O 正确:if(n=O)(2)错误:result =n;正确:result *=n;【解析】(1)这里是一个简单的格式错误,if条件应该加括号。(2)根据阶乘的概念,从n 开始,n!=n*(nl)!,直到1,所以应该为result *=n-;请编一个函数float fun(double h),函数的功能是:对变量h中的值保留两位小数,并对第 三位进行四舍五入(规定h中的值为正数)。例如:若h值为8.32433,则函数返回8.32;若h值为8.32533,则函数返回8.33。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干 语句。试题程序:#include <stdlib.h>#include <stdio.h>#include <conio.h>float fun (float h ) void main()(float a;system(nCLSn);printf("Enter a: ");scanf(M%f),&a);printf("The original data is : "); printf("%fnn", a);printf(MThe result: %fnM, fun(a);float fun (float h)(long t;t=(h*1000+5)/10;/*单精度数h乘以1000后再加5,相当于对h中 的第三位小数进行四舍五入除以10后将其赋给一个长整型数时就把第三位小数后的数全 部截去*/return (float)t/l 00;/*除以100,保留2位小数*/I【解析】注意本题要求h的值真正发生了四舍五入,而不是为了输出,即不能用 printf(, %7.2f” ,h)来直接得到结果。由于单精度数h乘以1000后再加5,此时相当于对h 中的第三位小数进行四舍五入,在将其赋给一个长整型数时就把第三位小数后的数全部截 去。注意在return中要将其中个数转成浮点型数。008请补充函数fun,该函数的功能是:求一维数组xN的平均值,并对所得结果进行四舍五入 (保留两位小数)。例如:当 x10= 15.6,19.9,16.7,15.2,18.3,12.1,15.5,11.0,10.0,16.0,结果为:avg=15.030000o注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表 达式或语句。试题程序:#include <stdlib.h>#include <stdio.h>#include <conio.h>double fun(double x10)(int I;long t;double avg=0.0;double sum=0.0;for(I=0;I<10;I+)1;avg=sum/10;avg= 2;t= 3;avg=(double)t/100;return avg;void main()(double avg,x 10=15.6,19.9,16.7,15.2,18.3,12.1,15.5,11.0,10.0,16.0);inti;system(nCLSM);printf("nThe original data is :n");for(i=0;i< 10;i+)printf(nnnn);avg=fun(x);printf(Haverage=%fnnn,avg);I sum+=xI 2 avg*10003 (avg+5)/10【解析】填空1:通过for循环求出10个数的累加和,存于变量sum中。填空2:为了实现 四舍五入保留两位小数的功能,应将平均值先扩大1000倍。填空3:将平均值加上5,再除 以10,实现四舍五入的功能。下列给定程序中函数fun的功能是:计算正整数num各位上的数字之积。例如,若输入252, 则输出应该是20。若输入202,则输出应该是0。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:#include <stdio.h>#include <conio.h>long fun(long num)/*tound*/long k;do ( k*=num%10;/*foun(j* */num =10; while (num);return (k);main ()(long n;printf("please enter a number:");scanf(n%ld", &n);printf(,'n%ldn,', fun(n);(1)错误:long k; 正确:long k=l;(2)错误:num=10;正确:num/=10;【解析】(1) k用来存放各位数字的积,初值应为lo (2)这里是一个符号错误,除号使用来表示的。请编写一个函数fun,它的功能是:根据以下公式求冗的值(要求满足精