计算机二级C语言上机题库(一)
改错题
数字题:
1、根据整型形参m,计算如下公式的值。
y=1+1/(2*2)+1/(3*3)+1/(4*4)+…+1/(m*m)的值。例如,若m=5,则应输出:1.463611。
double fun(int m)
{double y=1.0;int i;for(i=2;i<=m;i++)y+=1.0/(i*i);return(y);}
2、根据形参m,计算列公式的值。T=1-1/2+1/3-1/4+……+(-1)(m+1)/m 例如,若输入5,则应输出0.783333
double fun(int m)
{double t=1.0,j=1.0;int I;for(i=2;i<=m;i++){j= -1*j;t+=j/i;}return t;}
3.根据整型参数m,计算如下公式的值,y=1/(100*100)+1/(200*200)+1/(300*300)+…+1/(m*m).例如,若m=2000,则应输出0.000160.
double fun (int m)
{double y=0, d;int i;
for(i=100;i<=m;i+=100)
{d=(double) i*( double)i;y+=1.0/d;}
return(y);}
4.根据以下公式求n的值。例如 ,给eps输入0.0005时,应当输出
Pi=3.140578.
Pai/2=1+1/3+1/3*2/5+1/3*2/5*3/7+…
double fun(double eps)
{double s,t;int n=1;s=0.0;t=1.0;while(t>=eps){s+=t;t=t*n/(2*n+1);
n++;}return (s*2);}
5.根据形参m,计算下列公式的值。t=1+1/2+1/3+1/4+…1/m.。例如,若输入5,则应输出2.283333.
double fun (int m)
{double t=1.0;int i;
for(i=2;i<=m;i++)t+=1.0/i;return t;}
6.根据整型形参m,计算如下公式的值。
y=1+1/根号(2)+1/根号(3)+……1/根号(n)例如,若m中的值为:5,则应输出:3.231671
#include<math.h>
double fun (int m)
{int i;double t,y=0;
for(i=1;i<=m;i++){t=1/sprt(i);y=y+t;}return y;}
7. 根据整型形参m的值,计算如下公式的值。t=1-1/(2*2)-(3*3)-…-1/(m*m)例如m=5,则应输出0.536389.
double fun (int m)
{double y=1.0;int i;
for (i=2;i<=m;i++)
y-=1.0/(i*i);return(y);}
8. 根据整型形参m,计算如下公式的值.y=1-1/(2*2)+1/(3*3)-1/(4*4)+…+(-1)(m+1)/(m*m)例如:m中的值为5,则应输出0.838611.
double fun (int m)
{double y=1.0;double j=1.0;int i;
for(i=2;i<=m;i++){j=-1*j;y+=j/(i*i);}return(y);}
9.根据整型形参n,计算如下公式的值。A1=1.A2=1/(1+A1),A3=1/(1+A2),An=1/(1+A(n-1)).例如,若n=10,则应输出0.617977.
float fun (int n)
{float A=1;int i;for(i=2;i<=n;i++)A=1.0/(1+A);returnA;}
10.求s=aa…aa-…aaa-aa-a(此处aa…aa表示n个a,a和n的值在1至9之间)。如a=3.n=6,则以上表达式为:s=333333-33333-3333-333-33-3.其值是296298.
long fun (int a,int n)
{int j;long s=0,t=0;
for (j=0;j<n;j++)
t=t*10+a;s=t;
for(j=1;j<n;j++){t=t/10;s=s-t;}return(s);}
11.用下面的公式求∏的近似值,直到最后一项的绝对值小于指定的数(参数num)为止。
∏/4≈1-1/3+1/5-1/7+…例如,输入0.0001,则程序输出3.1414.
float fun(float num)
{int s;float n,t,pi;t=1;
pi=0;n=1;s=1;
while(fabs(t)>=num)
{pi=pi+t;n=n+2;s=-s;t=s/n;}
pi=pi*4;return pi;}
12.计算并输出下列级数的前N项之和SN,直到SN+1大于q为止,q的值通过形参传入。
SA=2/1+3/2+4/3+(N+1)/N。例如,若q的值为50.0,则函数值为49.394948.
double fun(int q)
{int n;double s,t;n=2;s=2.0;
while(s<=q){t=s;s=s+(double)(n+1)/n;n++;}printf(“n=%d\ n”,n);return t;}
13.求S的值。设S=(22/(1*3))*(42/(3*5))*(62/(5*7)*…*(2k2/(2k-1)*(2k+1)).例如,当k为10时,函数的值应为1.533852.
float fun(int k)
{int n;float s,w,p,q;n=1;s=1.0;
while(n<=k){w=2.0*n;p=w-1.0;q=w+1.0;s=s*w*w/p/q;n++;}return s;}
14.计算S=f(f(-1.0)+f(5.0))的值。结果为2488.000000.f(x)函数定义如下:(公式省略)
double f(double x)
{double y;if (x<=2.0)y=2.0*x*x+3.0*x+4.0;else y=-2.0*x*x+3.0*x-4.0;
return y;}
15.计算S=给f(-n)+f(-n+1)+…+f(0)+f(1)+f(2)+…+f(n)的值。例如,当n为5时,函数值应为10.407143.f(x)函数定义如下;(函数省略)
double f(double x)
{if(x= =0.0||x= =2.0)
return0.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;}
16.按以下递归公式求函数值。函数省略。
例如,当给n输入5时,函数值为18.
fun(int n){int c;if(n==1)c=10;else c=fun(n-1)+2;return(c);}
17.计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的 值。其中x和y不相等,z和y不等。例如,当x的值为9,y的值为11,z的值为15时,函数值为-3.50.
#define FU(m,n)(m)/(n)
float fun(float a.float b,float c)
{float value;
value=FU(a+b,a-b)+FU(c+b,c-b);return(value);}
18.用二分法求方程2x3 -4x2+3x-6=0的一个根,并要求绝对误差不超过0.001.例如,若给m输入-100,给n输入90,则函数求得的一个根值为2.000.
double funx(double x)
{return (2*x*x*x-4*x*x*+3*x-6);}
double fun(double m,double n)
{double r;r=(m+n)/2;
while(fabs(n-m)>0.001)
{if(funx(r)*funx(n)<0) m=r;
else n=r;r=(m+n)/2;}return r;}
19.传入一个整数m,计算如下公式的值,t=1/2-1/3-…-1/m.例如,若输入5,则应输出-0.283333.
double fun (int m)
{double t=1.0;int i;
for(i=2;i<=m;i++)t=t-1.0/i;return t;}
20.求出以下分数序列的前n项之和;1/2,2/3,3/5,5/8,8/13,13/21…和值通过函数值返回main函数。例如,若n的值为:5,则应输出:3.007051.
double fun(int n)
{int i;double t,s,a,b,c;
s=0;a=1;b=2;for(i=0;i<n;i++){t=a/b;s=s+t;c=a+b;a=b;b=c;}return s;}
21.求出以下分数序列的前n项之和。2/1,3/2,5/3,8/5,13/8,21/13,……和值通过函数值返回主函数。例如,若输入5,则应输出8.391667.
double fun (int n)
{int a=2,b=1,c,k;double s=0.0;for(k=1;k<=n;k++){s=s+1.0*a/b;c=a;a+=b;b=c;}return(s);}
22.计算1+2+3+……+n的和值。
float fun (int n)
{double t;if (n==1)return(1);else t=fun(n-1)+n;return t;}
23.应用递归算法求某数a的平方根。求平方根的迭代公式如下:x1=(x0+a/x0)/a.例如,2的平方根为1.414214.
doube fun(double a,double x0)
{double x1,y;
x1=(x0=a/x0)/2.0;if(fabs (x1 -x0)>=0.00001)
y=fun (a,x1);
else y=x1;return y; }
24.求k!(k<13),例如,若k =10,则应输出3628800.
long fun (int k)
{if(k>0)return(k*fun(k-1));else if (k==0) return 1;}
25.计算整数n 阶乘。
double fun (int n)
{double result=1.0;
If(n==1||n==0)return 1;
While (n>1&&n<170)result*=n--;return result;}
26.计算正整数num 的各位上的数字之积,例如,若输入:252,则输出应该是:20.
long fun(long num)
{long k=1;
do {k*=num%10;num/=10;}while (num);return(k); }
27.计算正整数num的各位之平方和。例如,输入352,则输出应该是38;若输入328,则输出应该是77.
long fun (long num)
{long k=0;do {k+=(num%10)* (num%10);num/=10;}while (num);return(k);}
28.计算并输出high 以内的素数之和。high由主函数传给fun函数。若high的值为100,则函数的值为1060.
int fun (int high)
{int sum=0,n=0,j,yes;while (high>=2){yes=1;for(j=2;j<=high/2;j++)
if (high%j==0){yes=0;break;}if(yes){sum+=high;n++;}high--;}return sum;}
29.计算并输出k以内最大的6个能被7或11整除的自然数之和。若k的值为500,则函数的值为2925.
int fun (int k)
{intm=0,mc=0,j;
while((k>=2)&&(mc<6))
{if ((k%7==0)||
(k%11==0)){m+=k;mc++;}k--;}return m;}
30.数列中,第一项为3,后一项都比前一项的值增5.下列给定程序中,函数的功能是:计算前n(4≤n≤50)项的累积和。在累加过程中把那些被4除后余2的当前累加值放入数组中,符合此条件的累加值的个数作为函数值返回主函数里。如,当n的值为20时,该数列为3,8,13,18,23,28,…,93,98.符合此条件的累加值应为42,126,366,570,1010.
int fun (int n,int *a)
{int i,j=0,k,sum;sum=0;for (k=3,i=0;i<n;i++,k+=5)
{sum=sum+k;if (sum%4==2)a[j++]=sum;}return j++;}
31.读入一个整数k(2≤k≤10000),打印它的所有质因子(即所有为素数的因子)。例如,若输入整数理化2310.则应输出:2、3、7、11.
isPrime (int n)
{int i,m;m=1;for (i=2;i<n;i++)if (!(n%i)){m=0;break;}return(m);}
32.将长整型数中每一位上为偶数的数依次逆向取出,构成一个新数放在t中。高位在低位,低位在高位。当s中的数为25846513时,t中的数为6482.
void fun(long s,long *t)
{int d;long s1=1.i=1;*t=0;
while(s/i>0) i=i*10;i=i/10;
while (s>0)
{d=s/i;if(d%2==0){*t=d*s1+*t;s1*=10;}s=s%i;i=i/10;}}
33.已知一个数列从0项开始的前3项:0,0,1,以后的各项都是其相邻的前3项之和。函数fun的功能是:计算并输出该数列前n项的和sum。N的值通过形参传入。例如,当n=10时,程序输出结果应为96.000000.
double fun (int n)
{double sum,s0,s1,s2,s;int k;sum=1.0;
if(n<=2)sum=0.0;s0=0.0;s1=0.0;s2=1.0;
for (k=4;k<=n;k++){s=s0+s1+s2;sum+=s;s0=s1;s1=s2;s2=s;}return sum;}
34.计算并输出k以内最大的10个能被13或17整除的自然数之和。例如,若k的值为500,则函数的值为4622.
int fun (int k)
{int m=0,mc=0,j;while ((k>=2)&&(mc<10)){if((k%13==0)||(k%17==0))
{m=m+k;mc++;}k--;}return m;}
35.通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。例如,变量a中的值原为8,b中的值原为3,b中的值为8.
int fun (int *x,int y){int t;t=*x;*x=*y;;return (t);}
36.实现两个整数的交换。例如给a和b分别输入60和65,输出为:a=65 b=60.
void fun (int *a,int *b){int t;t=*b;*b=*a;*a=t;}
37.将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。当s中的数为87653142时,t中数为8642.
void fun (long s,long *t){int d;long s1=1;*t=0;
while(s>0){d=s%10;if(d%2==0){*t=d*s1+*t;s1*=10;}s/=10;}}
38.从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。例如,当s中的数为7654321时,t中的数为642.
void fun (long s,long *t)
{long s1=10;s/=10;*t=
s%10;while (s>0)
{s=s/100;*t=s%10*s1+*t;s1=s1*10;}}
39. 从低位开始取出长整型变量s中奇数上的数,依次构成一个新数放在t中。例如,当s中的数为7654321时,t中的数为7531.
void fun (long s,long *t)
{long s1=10;*t=s%10;while (s>10)
{s=s/100;*t=s%10*s1+*t;s1=s1*10;}}
40. 将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。当s中的数为87653142时,t中数为7531.
void fun (long s,long *t){int d;long s1=1;*t=0;
while(s>0){d=s%10;if(d%2!=0){*t=d*s1+*t;s1*=10
;}s/=10;}}
41.求出两个数的最大公约数,并作为函数值返回。例如,若给num1和num2输入49和21,则输出最大公约数为27.
int fun (int a,int b)
{int r,t;if(a<b){t=a;a=b;b=t;}r=a%b;
while (r!=0){a=b;b=r;r=a%b;}return (b);}
42.求三个数的最小公倍数。例如,给变量x1、x2、x3分别输入15,11,2,则输出结果应当是330.
fun (int x,int y,int z)
{int j,t,n,m;j=1;t=j%x;m=j%y;n=j%z;
while (t!=0||m!=0||n!=0)
{j=j+1;t=j%x;m=j%y;n=j%z;}return j;}
43.求广义斐波那契数的第n项。1,1,1,3,5,9,17,31,……项值通过函数值返回main函数。例如,若n=15,则应输出:2209.
long fun (int n)
{long a=1,b=1,c=1,
d=1,k;for (k=4;k<=n;k++)
{d=a+b+c;a=b;b=c;c=d;}return d;}
44.用递归算法斐波那契级数列中第n项的值从第1项起,斐波那契级数序列为1,1,1,2,3,5,8,13,21…例如,若给n输入7,该项的斐波那契级数值为13.
long fun (int g)
{switch (g){case 0:return 0;switch(g) case1:case 2:return1;}return (fun (g-1)+fun (g-2));}
45.统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数;并把该整数中各位上最大的数值作为函数值返回。例如,若输入无符号整数30800,则数字值为零的数为3,各位上数字值最大的是8.
int fun (unsigned n,int *zero)
{int count=0,max=0,t;
do {t=t%10;if(t==0)
count++;if(max<t)max =t;n=n/10;}while (n);*zero=count;return max;}
46.从3个红球,5个白球,6个黑球中任意取出8个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红球和白球。组合数作为函数值返回。正确的组合数应该是15.程序中i的值代表红球数,j的值代表白球数,k的值代表黑球数。
int fun()
{int i,j,k,sum=0;
printf(“\nTheresult :\n\n”);for (i=1;i<=3;i++)
{for (j=1;j<=5;j++)
{k=8-i-j;if ((k>=1&&k<=6}&&(i!=0)&&(j!=0)|| (k==0)){sum=sum+1;
Printf (“red:%4d white:%4d black:%4d\n”,I,j,k);}}} return sum;}
47.求整数x的y次方的低3位值。例如,整数5的6次方为15625,此值的低3为值为625.
long fun (int x,int y,long *p)
{int i; long t=1;for (i=1;i<=y;i++)t=t*x;*p=t;t=t%1000;return t;}
48.根据输入的3个边长(整数值),判断能否构成三角形:若能构成三角形则返回l,若不能,则返回0。
int fun(int a,int b,int c)
{if (a+b>c&&b+c>a&&
a+c>b){if (a==b&&b==c)
return 3;else if (a==b||b==c||a==c)return 2;else return1; }else return 0;}
49.为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
void fun (int a,int *b,int*c)
{inti,j,d,y;for (i=3;i<=a/2;i=i+2){y=1;for(j=2;j<=sprt ((double)i);j++)
if (i%j==0)y=0;if(y==1){d=a-i;for (j=2;j<=sprt
((double)d);j++)
if(d%j==0)y=0;if (y==1){*b=i;*c=d;}}}}
50.找到一个大于给定整数m且紧随m的素数,并作为函数值返回。
int fun(int m)
{int i,k;for (i=m+1;;i++)
{for(k=2;k<i;k++)if (i%k==0)break;if (k>=i)return (i);}}
51.求输入的两个数中较小的数。例如:输入5 10,结果为min is 5.
int fun(int x,int y)
{int z;z=x<y?x:y;return 0;}
52.判断一个整数m是否是素数,若是返回1,否则返回0.
int fun (int m)
{intk=2;while (k<=m&&(m%k)) k++;
if(m==k)return1;else return 0;}
53.将十进制正整数m转换成k(2≤k≤9)进制数,并按位输出。例如,若输入8和2,则应输出1000。
fun (int m,int k)
{int aa[20],i;
for (i=0;m;i++)
{aa[i]=m%k;m/=k;}
for (;i;i--)
printf(“%d”,aa[i-1]);}
54.把输入的十进制数以十六进制数的形式输出。
main ()
{charb[17]={“0123456789ABCDEF”};
int c[64] ,d,i=0,base=16;long n;
printf(“Enter a number:\n”);scanf(“%ld”,&n);do{c[i]=n%base;i++;n=n/base;}
while (n!=0);printf (“Transmite new base:\n”) for (--i;i>=0;--i)
{d=c[i];printf(“%c”,b[d]);}printf(“\n”);}
55.将一个由八进制数字字符组成的字符串转换为与其面值相等的十进制整数。若输入77777,则输入出是32767.
int fun(char *p)
{int n;n=*p-‘0’;p++;
while(*p!=0){n=n*8+*p-‘0’;p++;}return (n);}
56.计算证整数num的各位上的数字之积。例如,若输入253,则输出应该是20.
long fun (long num)
{long k=1;do {k*=num%10;mum/=10;}while (num);return (k);}
57.计算并输出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;}
58.从整数1到55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。
fun (int *b)
{intk,a1,a2,i=0;for(k=10;k<55;k++){a2=k/10;a1=k-a2*10;
if ((k%3==0&&a2==5)||
(k%3==0&&a1==5)){b[i]=k;i++;}}return i;}
59.把主函数中输入的3个数,最大的放在a中,最小的放在c中。例如,输入的数为:55 12 34,输出结果应当是:a=55.0,b=34.0,c=12.0.
void fun (float *p,float *q,float *s)
{float *k;if (*p>*q){*k=*p;*p=*q;*q=*k;}if (*s>*p){*k=*s;
*s=*p;*p=*k;}if(*q>*p)
{*k=*q;*q=*p;*p=*k;}}
60.计算n的5次方的值,通过形参指针传回主函数;计算该值的个位、十位、百位上数字之和作为函数值返回。如,7的5次方是16807,其低3位数的和值是15.
int fun(int n,int *value)
{intd,s,i;d=1;s=0;for (i=1;i<=5;i++)d=d*n;*value=d;
for (i=1;i<=5;i++)
{s=s+d%10;d=d/10;}return s;}
61.求两个形参的乘积和商数,并通过形参返回调用程序。例如输入:61.82和12.65,输出为:c=782.023000,d=4.886957.
void fun (double a,double b,double *x,double *y){*x=a*b;*y=a/b;}
62.输入两个双精度数,函数返回它们的平方和的平方根值。例如:输入:22.936和14.121,输出为:y=26.934415.
double fun (double *a,double *b)
{double c;
c=sqrt((*a)*(*a)+(*b)*
(*b));return c;}
63.求二分之一的圆面积,函数通过形参得到圆的半径,函数返回二分之一的圆面积。例如输入圆的半径值:19.527 输出为:s=598.950017.
float fun (float r){return 3.14159*r*r/2;}
64.判断两个指针所指存储单元中的值的符号是否相同;若相同函数返回1,否则返回0.这两个存储单元中的值都不为0.
fun (double *a,double *b)
{if(*a**b>0.0)return 1;else return 0;}
65.求两数平方根之和,作为函数值返回。例如,输入12和20,输出结果是:y=7.936238.
double fun (double *a,double *b)
{double c;c=sqrt(*a)+sqrt (*b);return c;}
66.判断两个整数m和n是否互质(既是否有公共的因子)(m≠1,n≠1).方法是:用2到t(t取m和n中较小的那个数)之间的数分别去除m和n,若m和n能同时被某个数除尽,则m和n不互质;否则它们互质。例如,若输入187和85,则应输出N0(表示它们不互质,它们有公因子17)。若输入89和187,则应输出Yes(表示它们互质)。
int IsThat(int m,int n)
{int k,t,mk=1;t=m;if (m>n)t=n;for (k=2;k<=t;k++)
if (m%k==0&&n%k==0)
{mk=0;break;}return (mk);}
main ()
{int m,n;clrscr();printf (“\nPlease enter 2 number:\n”)scanf (“^%d %d”,&m,&n);
if (IsThat(m,n)) printf (“Yes\n”);else printf (“No\n”);}
67.判断一个整数m是否是素数,若是返回1,否则返回0.
int fun (int m)
{intk=2;while (k<=m&&(m%k))k++;if (m==k)return 1;else return 0;}
68.求两个形参的乘积和商数,并通过形参返回调用程序。例如输入:61.82和12.65,输出为:c=782.023,d=4.886957.
void fun (double a,double b,double*x,double*y){*x=a*b;*y=a/b;

