二级C语言上机考题.doc
填空题:一、数字题:1用函数指针指向要调用的函数,规定在_2_处使f指向函数f1,在_3_处使f指向函数f2。当调用正确时,程序输出:x1=5.,x2=3.,x1*x1+x1*x2=40.double fun(double a, double b)double (*f)();double r1,r2;f=f1;r1=f(a);f=f2;r2 = (*f)(a,b);return r1+r2;2用函数指针指向要调用的函数,规定在_2_处使f指向函数f1,在_3_处使f指向函数f2。当调用正确时,程序输出:x1=5.,x2=3.,x1*x1+x1*x2=40.double fun(double x, double y)if(i=1)return f1(x);else return f2(x,y); 3将形参n所指变量中各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。例如,输入一个数:,新的数:为739。void fun(unsigned long *n)unsigned long x=0,i;int t;i=1;while(*n)t=*n%10;if(t%2!=0)x=x+t*i;i=i*10;*n=*n/10;*n=x;4将形参n所指变量中各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。例如,输入一个数:,新的数为64862。unsigned long fun(unsigned long n)unsigned long x=0;int t;while(n)t=t%10;if(i%2=0)x=10*x+t;n=n/10;return x;5将形参n所指变量中各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。例如,输入一个数:,新的数为26846。unsigned long fun(unsigned long n)unsigned long x=0,s,i;int t;s=n;i=1;while(s)t=s%10;if(i%2=0)x=x+t*i;i=i*10;s=s/10;return x;6求方程ax2+bx+c=0的根。例如,当a=1,b=2,c=1时,方程的两个根分别是:x1=-1.00,x2=-1.00。main()float a,b,c,disc,x1,x2,p,q;scanf("%f,%f,%f",&a,&b,&c);disc=b*b-4*a*c;clrscr();printf("*the result *n");if(disc>=0)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf("x1=%6.2f,x2=%6.2fn",x1,x2);elsep=-b/(2*a);q=sqrt(fabs(disc)/(2*a);printf("x1=%6.2f+%6.2f in",p,q);printf("x2=%6.2f-%6.2f in",p,q);7输出方程组A+B=56,A+2B=72的一组正整数解。结果是:A=40,B=16。main()int i,j;clrscr();for(i=0;i<100; i+)for(j=0;j<100; j+)if(i+j=56&&i+2*j=72)printf("A=%2d,B=%2d",i,j);8求方程ax2+bx+c=0的两个实数根。例如,当a=1,b=2,c=1时,方程的两个根分别是x1=-1.00, x2=-1.00。main()float a,b,c,disc,x1,x2;clrscr();doprintf("Input a,b,c:");scanf("%f,%f,%f",&a,&b,&c);disc=b*b-4*a*c;if(disc<0)printf("disc=%fn Input again!n",disc);while(disc<0);printf("*the result*n");x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf("nx1=%6.2fnx2=%6.2fn",x1,x2);9判断一个数的个位数字和百位数字之和是否等于其十位上的数字,是则返回“yes!”,否则返回“no!”。char *fun(int n)int g,s,b;g=n%10;s=n/10%10;b=n/100%10;if(g+b)=s)returnyes!;else returnno!;10输入一个长整数,如果这个数是负数,则取它的绝对值,并显示出来。例如,输入:-,结果为:。main()long int n;clrscr();printf("Enter the data;n");scanf(%ld,&n);printf("* the absolute value *n");if(n<0)n=-n;printf("nn ");printf(%ld, n);11计算如下公式的值。A1=1,A2=1/(1+A1),A3=1/(1+A2),AN=1/(1+AN+1)若n=10,则应输出:0.。float fun(int n)float A=1;int i;for(i=1;i<=n;i+)A=1.0/(1+A);return A;12计算并输出下列级数的前N项之和SN,直到SN+1大于q为止。SN=2/1+3/2+4/3+N+1/N例如,若q的值为50.0,则函数值为50.。double fun(double q)int n;double s;n=2;s = 2.0;while(s<=q)s=s+(double)(n+1)/n;n+;printf("n=%dn",n);return s;13计算S=f(-n)+f(-n+1)+f(0)+f(1)+f(2)+f(n)的值。当n为5时,S的值为:10.。 (x+1)/(x-2) x>0f(x) =0 x=0 或 x=2 (x-1)/(x-2) x<0float f(double x)if(x=0.0|x=2.0)return 0.0;else if(x<0.0)return(x -1)/(x-2);else return (x +1)/(x-2);double fun(int n)int i;double s=0.0,y;for(i=-n;i<=n;i+)y=f(1.0*i);s+=y;return s;14求1+2!+3!+.+N!的和。若N=6则和为873。main()int i,n;long s=0,t=1;clrscr();printf("nInput n:n");scanf("%d",&n);for(i=1;i<=n;i+)t=t*i;s=s+t;printf("1!+2!+3!.+%d!=%ldn",n,s);15计算Sn=1/1-1/3+1/5-1/7+1/(2n+1)的值。若n的值为15时,输出的结果是:S=0.,N=15。void fun(float *sn,int n)int i,j=1;float s=0.0;for(i=0;i<=n;i+)s=s+j*1.0/(2*i+1);j*=-1;*sn=s;main()int n=15;float s;fun(&s,n);printf("S=%f N=%dn",s,n);16计算SN的值:SN=1/1+3/1+5/4+(2N-1)/(SN-1)当N50时,SN71.。double fun(int n)double s=1.0,s1=0.0;int k;for(k=2;k<=n;k+)s1=s;s+=(2*k-1)/s1;return s;17计算S的值:s=13/31*35/53*57/75*(2k-1)2k+1/(2k+1)2k-1当k=5时,s=338.。double fun(int n)double s=1;double f=0.0;double p=0.0;int i=0;int k;for(k=1; k<=n;k+)f=2*k-1;p=2*k+1;for(i=1;i<2*k+1;i+)f*=2*k-1;for(i=1;i<2*k-1;i+)p*=2*k+1;s*=f/p;return s;18计算下式:S=3/22-5/42+7/62-+(-1)n-1*(2n+1)/(2n)2,直到(2n+1)/2n2的绝对值小于等于10-3,并把计算结果作为函数值返回。例如,若E的值为1E-3,函数值为0.。double fun(double e)int i,k;double s,t,x;s=0;k=1;i=2;x=3/4;while(x>e)s=s+k*x;k=k*(-1);t=2*i;x=(2*i+1)/(t*t);i+;return s;19求P的值p=m!/(n!*(m-n)!)例如:m=11,n=4时,运行结果为330.。long jc(int m)long s=1;int i;for(i=1;i<=m;i+)s=s*i;return s;float fun(int m,int n)float p;p=1.0*jc(m)/jc(n)/jc(m-n);return p;20计算S的值:s=(1*3)/22+(3*5)/42+(5*7)/62+(2*n-1)*(2*n+1)/(2+n)2例如,当形参N的值为10时,函数返回9.。double fun(int n)int i;double s,t;s=0;for(i=1;i<=n;i+)t=2.0*i;s=s+(2.0*i-1)*(2.0*i+1)/(t*t);return s;21计算S的值:s=(1*3)/22-(3*5)/42+(5*7)/62-+(-1)n-1(2*n-1)*(2*n+1)/(2+n)2例如,当形参N的值为10时,函数返回-0.。double fun(int n)int i,k;double s,t;s=0;k=1;for(i=1;i<=n;i+)t=2*i;s=s+k*(2*i-1)*(2*i+1)/(t*t);k=k*(-1);return s;22计算下式:S=1/22+3/42+5/62+(2N-1)/(2N)2double fun(double e)int i;double s,x;s=0;i=0;x=1.0;while(x>e)i+;x=(2.0*i)/(2.0*i)*(2.0*i);s=s+x;return s;23判断某一个年份是否为闰年。例如,1900年不是闰年,2004是闰年。int fun(int n)int flag=0;if(n%4=0)if(n%100!=0)flag=1;if(n%400=0)flag=1;return flag;24从键盘输入3个整数,然后找出最大的数并输出。例如,输入12,45,43,最大值为45。main()int a,b,c,max;clrscr();printf("nInput three numbers:n");scanf("%d,%d,%d",&a,&b,&c);printf("%d,%d,%dn",a,b,c);if(a>b)max=a;else max=b;if(max<c) max=c;printf("max=%dn",max);25使从键盘上输入一个整数n,输出n对应的斐波那契数列。main()int i,n=0;scanf("%d",&n);for(i=0;i<n;i+)printf("%d ",fun(i);int fun(int n)if(n=0) return 0;else if(n=1)return 1;else return fun(n-1)+fun(n-2);26找出100至x(x999)之间各位上的数字之和为15的所有整数,然后输出;符合条件的整数个数作为函数值返回。当n值为500时,各位数字之和为15的整数有:159、168、177共有26个。fun(int x)int n,s1,s2,s3,t;n=0;t=100;while(t<=x)s1=t%10;s2=(t/10)%10;s3=t/100;if(s1+s2+s3=15)printf("%d",t);n+;+t;return n;27找出100-999之间(含100和999)所有整数中各位上数字之和为X(X为一个正整数)的整数,然后输出。符合条件的整数个数作为函数值返回。例如:当X值为5时,满足条件的数为:104、113、122、131、140、203、212、221、230、302、311、320、401、410、500共有15个。int fun(int x)int n,s1,s2,s3,t;n=0;t=100;while(t<=999)s1=t%10;s2=(t/10)%10;s3=t/100;if(s1+s2+s3=x)printf(“%d”,t);n+;t+;return n;28打印出11000中满足:个位数字的立方等于其本身所有数。本题的结果为:1,64,125,216,729main()int i,g;clrscr();for(i=1;i<1000;i+)g=i%10;if(g*g*g=i)printf("%4d",i);29打印出满足个位的数字、十位上的数字和百位上的数字都相等的所有三位数。本题的打印结果为:111,222,333,444,555,666,777,888,999。main()int g,s,b;clrscr();for(g=1;g<10;g+)for (s=1;s<10;s+)for(b=1;b<10;b+)if(g=s&&s=b)printf("%5d",g+s*10+b*100);30求两个正整数m和n的最大公约和最小公倍数。main()int a,b,n,m,t;clrscr();printf("nInput two numbers:n");scanf("%d,%d",&n,&m);if(n<m)a=m;b=n;elsea=n;b=m;while(b!=0)t=a%b;a=b;b=t;printf("greatest common divisor:%dn",a);printf("least common multiple:%dn",n*m/a);31从键盘输入只有两个整数参与运算的一个四则运算式,然后计算出它的值。注意数字全部为正整数。例如,输入308*28,结果为8624.。main()int a=0,b=0,flag=1,fg=1;float result;char *p,ch;char str10;clrscr();printf("n Input a string n");gets(str);p=str;while(*p)if(*p>='0'&&*p<='9'&&flag=1)a=a*10+*p-'0'else if(fg)ch=*p;flag=2;fg=0;if(*p>='0'&&*p<='9'&&flag=2)b=b*10+*p-0;p+;switch(ch)case '+':result=a+b;break;case '-':result=a-b;break;case '*':result=a*b;break;case '/':result=(float)a/b;break;printf("nresult=%f",result);32计算两个自然数n和m(m<10000)之间所有数的和(n和m从键盘输入)。例如:当n=1,m=100时,sum=5050main()int n,m;long sum;sum=0;printf("nInput n,mn");scanf("%d,%d",&n,&m);while(n<=m)sum+=n;n+;printf("sum=%ldn",sum);33求k!(k<13)并通过函数名传回主函数。例如:若k = 10,则应输出:。long fun(int k)if(k>0)return(k*fun(k-1);else if(k=0)return 1L;34求n!。例如7!=5040。main()int i,n;long f=1;printf("Input n:");scanf("%d",&n);for(i=1;i<=n;i+)f*=i;printf("%d!=%ldn",n,f);35把从键盘输入的3个整数按从小到大输出。若输入33,78,25.则输出25,33,78。main()int x,y,z,t;clrscr();printf("Input x,y,zn");scanf("%d%d%d",&x,&y,&z);if(x>y)t=x;x=y;y=t;if(x>z)t=z;z=x;x=t;if(y>z)t=y;y=z;z=t;printf("*the result*n");printf("from small to big:%d %d %dn",x,y,z);36将十进制正整数m转换成k进制(2k9)数的数字输出。例如,若输入8和2,则应输出1000void fun( int m, int k )int aa20,i;for(i=0;m;i+ )aai=m%k;m/=k;for(;i;i-)printf("%d",aai-1);37求二分之一的圆面积,若圆的半径为19.527则输出为:s=598.。float fun ( float r )return 3.14159 * r * r /2.0;main( )float x;printf("Enter x:");scanf("%f",&x);printf("s=%fn ",fun(x);38读入一个整数k(2k10000),打印它的所有质因子若输入整数:3410,则应输出:2、5、11、31。IsPrime(int n)int i,m;m = 1;for(i=2;i<n;i+)if(!(n%i)m=0;break;return m ;main( )int j,k;printf( );scanf("%d",&k);printf();for( j = 2; j <= k; j+ )if(!(k%j)&&(IsPrime(j)printf("n %4d",j );printf("n");39计算并输出n(包括n)以内能被3或7整除的所有自然数的倒数之和。如当n为32后,输出为:s=1.。double fun(int n)int i;double sum=0.0;if(n>0&&n<=100)for(i=1;i<=n;i+)if(i%3=0|i%7=0)sum+=1.0/i;return sum;40求出1到1000之内能被7或11整除但不能同时被7和11整除的所有整数放在数组a中,通过n返回这些数的个数。void fun(int *a, int *n)int i,j=0;for(i=1;i<=1000;i+)if(i%7=0)|(i%11=0)&&i%77!=0)aj+=i;*n=j;main()int aa1000,n,k;fun(aa, &n );for(k=0;k<n;k+)if(k+1)%10=0)printf("n");else printf("%5d",aak);41统计长整数n的各个位上出现数字1、2、3的次数,并通过外部(全局)变量c1、c2、c3返回主函数。当n=时,结果应该为:c1=3、c2=1、c3=2。void fun(long n)c1=c2=c3=0;while(n)switch(n%10)case 1:c1+;break;case 2:c2+;break;case 3:c3+;n/=10;42计算并输出high以内最大的10个素数之和。若high的值为100,则函数的值为732。int fun(int high)int sum=0,n=0,j,yes;whil(high>= 2)&&(n<10)yes=1;for(j=2;j<=high/2;j+ )if(high%j=0)yes=0;break;if(yes)sum+=high;n+;high-;return sum;43统计所有小于等于n(n>2)的素数的个数,素数的个数作为函数值返回。int fun(int n)int i,j,count=0;printf();for(i=3;i<=n;i+)for(j=2;j<i;j+)if(i%j=0)break;if(j>=i)count+;printf();return count;44求1100(不包括100)以内所有素数的平均值。最后结果为42.40。main()int i,j,n=0,flag;float aver=0;for(j=2;j<100; j+)flag=1;for(i=2;i<j; i+)if(j%i=0)flag=0;break;if(flag=1)n+;aver+=j;printf("nn average=%4.2f",aver/n);45用筛选法可得到2n(n<10000)之间的所有素数,方法是:首先从素数2开始,将所有2的倍数的数从数表中删去(把数表中相应位置的值置成0);接着从数表中找下一个非0数,并从数表中删去该数的所有倍数;依此类推,直到所找的下一个数等于n为止。这样会得到一个序列:2,3,5,7,11,13,17,19,23,int fun(int n)int a10000,i,j,count=0;for(i=2;i<=n;i+)ai=i;i=2;while(i<n)for(j=ai*2;j<=n;j+=ai)aj=0;i+;while(ai=0)i+;printf();for(i=2;i<=n;i+)if(ai!=0)count+;printf();return count;46判断一个数是否为素数。该数是素数时,函数返回字符串:yes!,否则函数返回字符串:no!char *fun(int n)int i,m;m=1;for(i=2;i<n; i+)if(n%i=0)m=0;break;if(m=1&&n>1)return("yes!");else return("no!");47寻找两个整数之间的的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。例如,输入6和21,则输出为:7,11,13,17 19,21。int fun(int n,int m,int bbN)int i,j,k=0,flag;for(j=n;j<=m;j+)flag=1;for(i=2;i<j;i+)if(j%i=0)flag=0;break;if(flag=1)bbk+=j;return k;48甲乙丙丁四人同时开始放鞭炮,甲每隔t1秒放一次,乙每隔t2秒放一次,丙每隔t3秒放一次,丁每隔t4秒放一次,每人各放n次。函数fun的功能是根据形参提供的值,求出总共听到多少次鞭炮声作为函数值返回。注意,当几个鞭炮同时炸响,只算一次响声,第一次响声是在第0秒。例如,若t1=7,t2=5,t3=6,t4=4,n=10,则总共可听到28次鞭炮声。#define OK(i,t,n) (i%t=0)&&(i/t<n)int fun(int t1,int t2,int t3,int t4,int n)int count,t,maxt=t1;if(maxt<t2)maxt=t2;if(maxt<t3)maxt=t3;if(maxt<t4)maxt=t4;count=1;for(t=1;t<maxt*(n-1);t+)if(OK(t,t1,n)|OK(t,t2,n)|OK(t,t3,n)|OK(t,t4,n)count+;return count;49从三个形参a,b,c中找出中间的那个数,作为函数值返回。例如,当a=3,b=5,c=4时,中数为4。int fun(int a, int b,int c)int t;t=(a>b)?(b>c?b:(a>c?c:a):(a>c)?a:(b>c)?c:b);return t;二、数组题:50删除w数组中下标为k的元素中的值。arrout(int *w,int m)int k;for(k=0;k<m;k+)printf("%d",wk);printf("n");arrdel(int *w,int n,int k)int i;for(i=k;i<n-1;i+)wi=wi+1;n-;return n;getindex(int n)int i;doprintf("nEnter the index0<=i<%d:",n);scanf("%d",&i);while(i<0|i>n-1);return i;51从数组xx中找出个位和百位的数字相等的所有无符号整数,结果保存在数组yy中,其个数由函数fun返回。当xx8=135,78,72,32,222,424,333,141,541时,bb6=787,232,222,424,333,141。int fun(int xx,int bb,int num)int i,n=0;int g,b;for(i=0;i<num;i+)g=xxi%10;b=xxi/100;if(g=b) bbn+=xxi;return n;52从键盘输入一组无符号整数并保存在数组xxN中,以整数结束输入,要求这些数的最大位数不超过位,编写函数从数组xx中找出个位和十位的数字之和大于的所有无符号整数,结果保存在数组yy中,个数由函数fun返回。当xx8=123,11,25,222,42,333,14,5451时,bb4=25,42,333,5451。int fun(int xx,int bb,int num)int i,n=0;int g, s;for(i=0;i<num;i+)g=xxi%10;s=xxi/10%10;if(g+s)>5)bbn+=xxi;return n;53求一维数组xN的平均值,并对所得结果进行四舍五入(保留两位小数)。例如:当x10=15.6,19.9,16.7,15.2,18.3,12.1,15.5,11.0,10.0,16.0,结果为:avg=15.。double fun(double x10)int i;long t;double avg=0.0;double sum=0.0;for(i=0;i<10;i+)sum+=xi;avg=sum/10;avg=avg*1000;t=(avg+5)/10;avg=(double)t/100;return avg;54求出能整除x且不是偶数的各整数,并放在数组pp中,这些除数的个数由n返回。例如,若x的值为30,则有4个数符合要求,它们是1,3,5,15。void fun(int x, int pp, int *n)int i,j=0;for(i=1;i<=x;i+=2)if(x%i)=0)ppj+=i;*n=j;main()int x,aa1000,n,i;printf();scanf("%d",&x);fun(x, aa, &n );for(i=0;i<n;i+)printf("%d",aai);printf("n");55求能整除x且是偶数的数,把这些数保存在数组bb中,并按从大到小的顺序输出。当x=20时,依次输出:20,10,4,2。void fun(int k,int bb)int i;int j=0;for(i=1;i<=k;i+)if(k%i=0&&i%2=0)bbj+=i;printf("nn");for(i=-j;i>=0;i-)printf("%d ",bbi);56在主函数中,从键盘输入若干个数放入数组x中,用0结束输入但不计入数组。编写函数:输出数组元素中小于平均值的元素。例如:数组中元素的值依次为1,2,2,12,5,15,则程序的运行结果为1,2,2,5。void fun(int x,int n)double sum=0.0;double average=0.0;int i=0;for(i=0;i<n;i+)sum+=xi;average=sum/n;for(i=0;i<n;i+)if(xi<average)if(i%5=0)printf("n");printf("%d,",xi);57将n个人员的考试成绩进行分段统计,考试成绩放在a数组中,各分段的人数存到b数组中:成绩为60到69的人数存到b0中,成绩为70到79的人数存到b1,成绩为80到89的人数存到b2,成绩为90到99的人数存到b3,成绩为100的人数存到b4,成绩为60分以下的人数存到b5中。当a数组中的数据是:93、85、77、68、59、43、94、75、98。调用该函数后,b数组中存放的数据应是:1、2、1、3、0、2。void fun(int a,int b,int n)int i;for(i=0;i<6;i+)bi=0;for(i=0;i<n;i+)if(ai<60)b5+;else b(ai- 60)/10+;main()int i,a100=,b6;fun(a,b,9);printf("the result is: ");for(i=0;i<6;i+)printf("%d ",bi);printf("n");58对a数组中n个人员的工资进行分段统计,各段的人数存到b数组中:工资为1000元以下的人数存到b0中,工资为1000到1999元的人数存到b1,工资为2000到2999元的人数存到b2,工资为3000到3999元的人数存到b3,工资为4000到4999元的人数存到b4,工资为5000到5999元的人数存到b5中。例如,当a数组中的数据为:900、1800、2700、3800、5900、3300、2400、7500、3800,调用该函数后,b中存放的数据应是:1、1、2、3、0、2。void fun(int a, int b, int n)int i;for(i=0;i<6;i+)bi=0;for(i=0;i<n;i+)if(ai>=5000)b5+;else bai/1000+;main()int i,a100=,b6;fun(a, b, 9);printf("The result is: ");for(i=0;i<6;i+)printf("%d ",bi);printf("n");59从键盘输入学生的成绩,统计各分数段学生的人数。A类为90100分,B类为8089分,C类为7079分,D类为6069分,59分以下的为E类。当成绩为0时结束成绩的输入。例如,输入89,99,45,64,56,78,88,74,66,55,0。结果为A:1,B:2,C:2,D:2,E:3main()float scoreN;int bb5;int grade,i=-1,n=0;char ch='A'printf("Input a score(0100);n");doi+;n+;printf("score%d=",i);scanf (”%f”,&scorei);while (scorei!=0);for(i=0;i<5;i+)bbi=0;for(i=0;i<n-1;i+)grade=scorei/10;switch(grade)case 10:case 9:bb0+;break;case 8:bb1+;break;case 7:bb2+;break;case 6:bb3+;break;default:bb4+;for(i=0;i<5;i+)printf("n%c:%d",ch+i,bbi);60删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。例如,若一维数组中的数据是:1,