第六章c语言解析

第六章 函数与编译预处理
-习题答案

1
★写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。


main()
{
unsigned int m,n,p,q;
for(;;)
{
printf("m,n=");scanf("%d,%d",&m,&n);
if(m<0||n<0){printf("The end.\n");break;}
p=funp(m,n);
q=funq(m,n);
printf("p(%d,%d)=%d\nq(%d,%d)=%d\n",m,n,p,m,n,q);
}
}
int funp(int m,int n)
{
int i;
if(m>n){i=m;m=n;n=i;}
for(i=m;i>0;i--)if(m%i==0&&n%i==0)return(i);
}
int funq(int m,int n)
{
int i;
if(mfor(i=m;i<=m*n;i+=m)if(i%n==0)return(i);
}

2
★编写一个函数,由参数传入一个字符串,统计此字串中字母、数字和其他字符的个数,在主函数中输入字符串并显示统计结果。


未制作函数,主要利用了选择语句结构:

#include"stdio.h"
main()
{
int i,c,zm=0,sz=0,kg=0,qt=0;
printf("Input a string:");
while((c=getchar())!='\n')
if(c==' ')kg++;
else if(c>47&&c<58)sz++;
else if(c>='A'&&c<='Z'||c>='a'&&c<='z')zm++;
else qt++;
printf("am=%d,sz=%d,kg=%d,qt=%d\n",zm,sz,kg,qt);
}

制作函数,利用函数调用:
#include"stdio.h"
int analys(char ch);
main( )
{
int i,zm=0,sz=0,qt=0,c;
printf("Input a string:");
while((c=getchar())!='\n')
{
i=analys(c);
switch(i)
{
case 1: zm++; break;
case 2: sz++; break;
case 3: qt++;
}
}
printf("zm=%d,sz=%d,qt=%d\n",zm,sz,qt);
}

int analys(char ch)
{
if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')return 1;
if(ch>47&&ch<58)return 2;
return 3;
}

3
★按照第5章第8题的要求编写判断水仙花数的函数,从主函数输入正整数n,在主函数中调用判断水仙花数的函数,找出n以内所有的水仙花数。

【输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位数字的立方和等于这个3位数本身。例如,153=1*1*1+5*5*5+3*3*3】


main()
{
int x,i,f;
printf("Input number:");
scanf("%d",&x);
for(i=0;i<=x;i++)
{
f=0;
f=fun(i);
if(f==1)printf("%d\t",i);
}
getch();
}
int fun(int x)
{
int a,b,c;
a=x/100;
b=x/10%10;
c=x%10;
if(a*a*a+b*b*b+c*c*c==x)return 1;
else return 0;
}

4
★定义一个宏,实现将两个数互换,并写出程序,输入两个数作为使用参数,并显示结果。


#define f(a,b) (a=a+b,b=a-b,a=a-b)
main()
{
int x,y;
printf("Input x,y:");
scanf("%d,%d",&x,&y);
printf("%d,%d",x,y);
f(x,y);
printf("<-->%d,%d\n",x,y);
getch();
}

5
已知二阶Fibonacci数列:
0 若n=0
Fib(n)= 1

若n=1
Fib(n-1)+Fib(n-2) 其它情况
定义递归函数求Fib(n)。


main()
{
int i,n;
printf("Input n:");
scanf("%d",&n);
for(i=0;i<=n;i++)
printf("%d\t",fib(i));
getch();
}
int fib(int n)
{
if(n==0)return 0;
else if(n==1)return 1;
else return (fib(n-1)+fib(n-2));
}

6
定义函数求F=(n+m)!+n!,m、n均为任意正整数。要求使用递归调用。


long int f(int x);
main()
{
int i,m,n;
long int sum;
printf("Input m,n:");
scanf("%d,%d",&m,&n);
sum=f(n+m)+f(n);
printf("%ld",sum);
getch();
}
long int f(int x)
{
int i,j;
if(x==0||x==1)return 1;
else return(x*f(x-1));
}

7
★定义一个函数完成第5章第11题的功能。
【输出九九乘法表。】


main()
{
fun();
getch();
}
fun()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%-3d",j,i,i*j);
printf("\n");
}
}

8
如果有两个数,每一个数的所有约数(除了它本身以外)的和正好等于对方,则称这两个数为互满数,求出30000以内所有的互满数,并显示输出,求一个数它的所有约数(除了它本身以处)的和,用函数实现。


main()
{
int x,y;
for(x=1;x<30000;x++)
{
for(y=1;y{
if(facsum(x)==y&&facsum(y)==x){printf("(%d,%d)\t",x,y);}
}
}
getch();
}
facsum(int n)
{
int i,sum=0;
for(i=1;i{
if(n%i==0)sum+=i;
}
return sum;
}

9
编写以下函数:①输入职工的姓名和职工号;②按职工号由小到大排序,姓名顺序也随之调整;③输入一个职工号,找出该职工的姓名。在主函数中调用这些函数。



10
★设计程序完成下列计算。
已经:y=f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3))

其中:f(x,n)=1-x2/2!+x4/4-...+(-1)n·x2n/(2n)! (n≥0)

当: x=5.6, n=7时,求:y

要求通过嵌套调用完成计算。


#include
float f(float x,int n);
float f1(float x,int m);
float f2(int m);

main()
{
float x=5.6,y;
int n=7,i;
y=1+f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3));
printf("y=%f\n\n",y);
}

float f(float x,int n)
{
float sum=0.0;
int i;
for(i=1;i<=n;i++)
{
sum+=f1(-1,i)*f1(x,2*i)/f2(2*i);
}
return sum;
}

float f1(float x,int m)
{
int i;
float y=1.0;
for (i=1;i<=m;i++)
{
y*=x;
}
return y;
}

float f2(int m)
{
int i;
float y=1;
for (i=1;i<=m;i++)
{
y*=i;
}
return y;
}
 


相关主题
相关文档
最新文档