计算机二级C语言上机题库(三)
填空题:
数字题:
1、 用函数指针指向要调用的函数,规定在2处指向函数f1,在3处使f指向函数f2,当调用正确时,程序输出:
X1=5.000000,x2=3.000000,x1*x1+x1*x2=40.000000
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用函数指针指向要调用的函数,规定在2处指向函数f1,在3处使f指向函数f2,当调用正确时,程序输出:
X1=5.000000,x2=3.000000,x1*x1+x1*x2=40.000000
double fun(double x , double y)
{if(i= =1) return f1(x);
else return f2(x,y);}
3、 将形参n所指变量中各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量,例如,输入一个数:27638496,新的数: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所指变量中各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。例如,输入一个数:27638496,新的数: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所指变量中各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。例如,输入一个数:27638496,新的数: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); x1=(-b-sqrt(disc))/(2*a);printf(“x1=%6.2f,x2=%6.2f\n”,x1,x2);}
else{p=-b/(2*a);q=sqrt(fabs(disc))/(2*a);
printf(“x1=%6.2f+%6.2f i\n”,p,q);
printf(“x2=%6.2f-%6.2f i\n”,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();
do{printf(“input a,b,c:”);scanf(“%f,%f,%f”,&a,&b,&c);disc=b*b-4*a*c;
if(disc<0)printf(“disc=%f\ninput 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.2f\nx2=%6.2f”,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)retrun “yes!”;else return “no!”;}
10、输入一个长整数,如果这个数是负数,则取它的绝对数,并显示出来。例如:输入:-3847652,结果为3847652
main()
{long int n;clrscr();pritntf(“enter the data;\n”);scanf(“%ld”,&n);printf(“***the absolute value***\n”);
if(n<0)n= -n;printf(“\n\n”);printf(“%d”,n);}
11、计算如下公式的值。A1=1,A2=1/(1+A1),A3=1/(1+A2)-------AN=1/(1+AN+1)若n=10,则应输出:0.618056
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.416687。
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=%d\n”,n);return s;}
13、计算s=f(-n)+f(-n+1)+------+f(0)+f(1)+f(2)+------+f(n)的值,当n为5时,S的值为:10.407143(函数省略)。
float fun(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 j,n;long s=0,t=1;
clrscr();
printf(“\n input n:\n”);scanf(“%d”,&n);
for(i=1;i<=n;i++){t=t*i;s=s+t;}printf(“1!+2!+3!+-------+%d!=%ld\n”,n,s);}
15、计算Sn=1/1-1/3+1/5-1/7+-------1/(2n+1)的值,当n的值为15时,输出的结果是:s=0.769788,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);}
16、计算SN的值:SN=1/1+3/1+5/4+------+(2N-1)/(SN-1),当N=50时,SN=71.433699
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、计算SN的值:s=13/31*35/53*57/75*-----*(2k-1)(2k+1)/ (2k+1) (2k-1) 当k=5时,S=338.215158
double fun(int n)
{ double s=1.0;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/23-5/42+7/62+-----+(-1)n-1*(2*n+1)/(2n)2,直到(2*n+1)/(2n)2的绝对值小于等于10-3,并把计算的结果作为函数值返回。例如:若E的值为1E-3,函数值为0.551690.
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,m=4时,运算结果为330.000000.
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的值为10时,函数的返回值9.612558
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------(2*n-1)/(2*n+1)2,当形参N的值为10时,函数的返回值-0.204491
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)2
double 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,%d”,a,b,c);
if(a>b)max=a;else max=b;if(max<c)max=c; printf(“max=%d\n”,max);}
25、从键盘输入一个整数n,输出n对应的裴波那契数列。
main()
{inti,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(x<999)之间各位上的数字之和为15的所有整数,然后输出;符合条件的整数个数作为函数值返回。
当n值为500时,各位数字之和为15的整数有:159,168,177----共有26个。
fun(int x)
{intn,s1,s2,s3,t;n=0;t=100while(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、打印出1~1000中满足:个位数字的立方等于其本身所有数。本题结果为:1,64,125,216,729
main()
{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(“\n input two numbers:\n”);scanf(“%d,%d”,&n,&m);if(n<m){a=m;b=n;}else{a=n;b=m;}
While(b!=0){t=a%b;a=b;b=t}printf(“greatest common divisor:%d\n”,a);printf(“leas common multiple:%d\n”,n*m/a);}
31、从键盘输入只有两个整数参与运算的一个四则运算式,然后计算出它的值。注意数字全部为正整数。例如:输入
308*28,结果为8624.000000
main()
{int a=0,b=0,flag=1,fg=1;
float result;char *p,ch;
char str[10];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;}
Print (“\n result=%f”,result);}
32、计算两个自然数n和m(m<10000)之间所有数的和(n和m从键盘输入),例如:n=1,m=100时,sum=5050
main()
{int n,m;long sum;sum=0;printf(“\n input n,m\n”);
scanf(“%d,%d”,&n,&m);
while(n<=m){sum+=n;n++;}printf(“sum=%ld\n”,sum);}
33、求k!(k<13)并通过函数名传回主函数。例如:若k=0,输出3628800.
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!=%ld\n”,n,f);}
35、把从键盘输入的3个整数按从小到大输出,若输入33,78,25则输出25,33,78
main()
{int x,y,z,t;clrscr();
printf(“input x,y,z\n”);
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%d\n”,x,y,z);}
36、将十进制正整数m转换成k进制(2≤k≥9)数的数字输出,例如:若输入8和2,则应输出1000
Void fun(int m,int k)
{int aa[20],i;for(i=0; m;i++){aa[i]=m%k;m/=k;}for(;i;i--;i++)printf(“%d”,aa[i-1]);}
37、求二分之一圆的面积,若圆的半径为19.527,则输出为:s=598.950017。
float fun(float r)
{return 3.14159*r*r/2.0;}
main()
{float x;printf(“enter x:”);scanf(“%f”,&x);printf(“s=%f\n”,fun(x));}
38、读入一个整数k(2≤k≥10000)打印它们所有质因子,若输入的整数3410,则应输出:2,5,11,31
Isprime(int n)
{int i,m;m=1;for(i=0;
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.226323
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)a[j++]=i;*n=j;}
Main()
{int aa[1000],n,k;fun(aa,&n);for(k=0;k<n;k++)if((k+1)%10= =0)printf(“\n”);else printf(“%5d’,aa[k]);}
41、统计长整数n的各个位上出现数字1,2,3,的次数,并通过外部(全局)变量c1,c2,c3返回主函数,当n=123114350,结果应该: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;
while((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、求1~100(不包含100)以内所有素数的平均数。最后结果为42.40.
Main()
{int i,j,n=0,flag,float aver=0;j=2;
for(j=;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(“\n\n average=%4.2f”,aver/n);}
45 、用筛选法可得到2~n(n<10000)之间所有素数,方法是:首先从素数2开始,将所有2的倍数的数从数表中删去
( 把数表中相应位置的值置成0);接着从数表中找下一个非0数,并从数表中删去该数的所有倍数,以此类推,直到所找的下一个数等于n为止,这样会得到一个序列:2,3,5,7,11,13,17,19,23-----
Int fun(int n)
{int a[10000],i,j,count=0;
for(i=2;i<=n;i++)a[i]=i;i=2;
While(i<n){for(j=a[i]*2;j<=n;j+=a[i])a[j]=0;i++;while(a[i]= =0)i++;}printf(“”);
For(i=2;i<=n;i++)if(a[i]!=0){count++;printf(---);}
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)1)return (“yes!”);else return (“no!’);}
47、寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。例如,输入6和21,则输出为:7,11,13,17,19,21.
Int fun(int n,int m,int bb[N])
(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)bb[k++]=j;}return k;)
48、甲乙丙丁四人同时开始放鞭炮,甲每隔t1秒放一次,乙每隔t2秒放一次,丙每隔t3秒放一次,丁每隔t4秒放一次,每人各放n次。函数fun的功能根据形参提供的值,求出总共听到多少次鞭炮声作为函数值返回。注意,当几个鞭炮同时炸响只算一次响声,第一次响声是在第0秒。例如,若t1=7,t2=5,t3=6,t4=4,n=10,则总共可听到28次鞭炮声。
#difine 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))|| if(ok(t,t2,n))|| if(ok(t,t3,n))|| if(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;}