計算機二級C語言上機題庫(三)
填空題:
數(shù)字題:
1、?用函數(shù)指針指向要調(diào)用的函數(shù),規(guī)定在2處指向函數(shù)f1,在3處使f指向函數(shù)f2,當調(diào)用正確時,程序輸出:
?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用函數(shù)指針指向要調(diào)用的函數(shù),規(guī)定在2處指向函數(shù)f1,在3處使f指向函數(shù)f2,當調(diào)用正確時,程序輸出:
?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所指變量中各位上為偶數(shù)的數(shù)去除,剩余的數(shù)按原來從高位到低位的順序組成一個新的數(shù),并通過形參指針n傳回所指變量,例如,輸入一個數(shù):27638496,新的數(shù):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所指變量中各位上為偶數(shù)的數(shù)取出,并按原來從高位到低位相反的順序組成一個新的數(shù),并作為函數(shù)值返回。例如,輸入一個數(shù):27638496,新的數(shù):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所指變量中各位上為偶數(shù)的數(shù)取出,并按原來從高位到低位的順序組成一個新的數(shù),并作為函數(shù)值返回。例如,輸入一個數(shù):27638496,新的數(shù):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的一組正整數(shù)解。結(jié)果是: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的兩個實數(shù)根。例如,當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、?判斷一個數(shù)的個位數(shù)字和百位數(shù)字之和是否等于其十位上的數(shù)字,是則返回“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、輸入一個長整數(shù),如果這個數(shù)是負數(shù),則取它的絕對數(shù),并顯示出來。例如:輸入:-3847652,結(jié)果為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、計算并輸出下列數(shù)的前N項之和SN,直到SN+1大于q為止。SN=2/1+3/2+4/3+------N+1/N例如,q的值為50.0,則函數(shù)的值為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(函數(shù)省略)。
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時,輸出的結(jié)果是: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,并把計算的結(jié)果作為函數(shù)值返回。例如:若E的值為1E-3,函數(shù)值為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時,運算結(jié)果為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時,函數(shù)的返回值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時,函數(shù)的返回值-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個整數(shù),然后找出最大的數(shù)并輸出。例如,輸入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、從鍵盤輸入一個整數(shù)n,輸出n對應的裴波那契數(shù)列。
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)之間各位上的數(shù)字之和為15的所有整數(shù),然后輸出;符合條件的整數(shù)個數(shù)作為函數(shù)值返回。
當n值為500時,各位數(shù)字之和為15的整數(shù)有: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)各位上的數(shù)字之和為X(X為一個正整數(shù))的整數(shù),然后輸出。符合條件的整數(shù)個數(shù)作為函數(shù)值返回。當x值為5時,滿足條件的數(shù)為: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中滿足:個位數(shù)字的立方等于其本身所有數(shù)。本題結(jié)果為: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、打印出滿足個位的數(shù)字,十位上的數(shù)字和百位上的數(shù)字都相等的所有三位數(shù)。本題的打印結(jié)果為: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、求兩個正整數(shù)m和n的最大公約和最小公倍數(shù)
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、從鍵盤輸入只有兩個整數(shù)參與運算的一個四則運算式,然后計算出它的值。注意數(shù)字全部為正整數(shù)。例如:輸入
308*28,結(jié)果為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、計算兩個自然數(shù)n和m(m<10000)之間所有數(shù)的和(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)并通過函數(shù)名傳回主函數(shù)。例如:若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個整數(shù)按從小到大輸出,若輸入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、將十進制正整數(shù)m轉(zhuǎn)換成k進制(2≤k≥9)數(shù)的數(shù)字輸出,例如:若輸入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、讀入一個整數(shù)k(2≤k≥10000)打印它們所有質(zhì)因子,若輸入的整數(shù)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)以內(nèi)能被3或7整除的所有自然數(shù)的倒數(shù)之和,例如當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之內(nèi)能被7或11整除但不能同時被7和11整除的所有整數(shù)放在數(shù)組a中,通過n返回這些數(shù)的個數(shù)
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、統(tǒng)計長整數(shù)n的各個位上出現(xiàn)數(shù)字1,2,3,的次數(shù),并通過外部(全局)變量c1,c2,c3返回主函數(shù),當n=123114350,結(jié)果應該: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以內(nèi)最大的10個素數(shù)之和,若high的值為100,則函數(shù)的值為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、統(tǒng)計所有小于等于n(n>2)的素數(shù)的個數(shù),素數(shù)的個數(shù)作為函數(shù)值返回。
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)以內(nèi)所有素數(shù)的平均數(shù)。最后結(jié)果為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)之間所有素數(shù),方法是:首先從素數(shù)2開始,將所有2的倍數(shù)的數(shù)從數(shù)表中刪去
( 把數(shù)表中相應位置的值置成0);接著從數(shù)表中找下一個非0數(shù),并從數(shù)表中刪去該數(shù)的所有倍數(shù),以此類推,直到所找的下一個數(shù)等于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、判斷一個數(shù)是否為素數(shù),該數(shù)是素數(shù)時,函數(shù)返回字符串:”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、尋找兩個整數(shù)之間的所有素數(shù)(包括這兩個整數(shù)),把結(jié)果保存在數(shù)組bb中,函數(shù)返回素數(shù)的個數(shù)。例如,輸入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次。函數(shù)fun的功能根據(jù)形參提供的值,求出總共聽到多少次鞭炮聲作為函數(shù)值返回。注意,當幾個鞭炮同時炸響只算一次響聲,第一次響聲是在第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中找出中間的那個數(shù),作為函數(shù)值返回。例如,當a=3,b=5,c=4時中數(shù)為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;}