学习目的:
1.掌握函数的嵌套与递归调用的全过程。
2.理解函数的定义及函数的调用过程(函数的调用格式、调用方式及被调用函数的使用说明)。
学习内容:
1.输入三个整数,用函数实现比较三个数的最大数,并输出显示到屏幕上。假设函数原型如下 int Func(int a,int b ,int c)
2.求出两个正整数的最大公约数(提示:能够整除这两个整数的最大整数)。
假设2个正整数a,b,函数实现原型为 int Gcd(int a,int b)
解题思路:
(1)穷极法:由于a,b的最大公约数不可能比a、b中的较小者还大,否则一定不能整除它,因此先找到a和b中的较小者t,然后从t开始逐渐减1,尝试每一种可能,即检验t到1之间的所有整数,第一个满足公约数条件的t就是a和b的最大公约数。
(2)递归法:对正整数a和b,
当a>b时,则a和b与a-b和b的最大公约数相同.
当b>a时,则a和b与a和b-a的最大公约数相同。
当a=b时,则a和b的最大公约数与a值和b值相同
3.使用函数的嵌套功能求1!+2!+3!+4!+……+n!的值?
4.有5个人坐在一起,问第五个多大年纪,他说比第四个人大2岁,问第四个人,他说比第三个人大2岁,问第三个人,他说比第二个人大2岁,问第二个人,他说比第一个人大2岁。第一个说自己10岁,请利用递归法编程并并计算出第5个人的年龄。
程序实现:
#include<stdio.h>
//
int Func(int a,int b,int c)
{
int t;
t=(a>b?a:b)>c?(a>b?a:b):c;
return t;
}
//
int Gcd(int a,int b)
{
int t;
t=a<b?a:b;
for(;t>=1;t--)
{
if(a%t==0&&b%t==0)
break;
}
return t;
}
//
int Fact(int n)
{
int i;
int sum=1;
for(i=1;i<=n;i++)
{
sum=sum*i;
}
return sum;
}
//
int SumFact(int n)
{
int i;
int sumValue=0;
for(i=1;i<=n;i++)
{
printf("Fact(%d)=%d\n",i,Fact(i));
sumValue+=Fact(i);
}
printf("1!+2!+3!+……+%d!=%d\n",n,sumValue);
return sumValue;
}
//
int Age(int n)
{
if(n<=0)
return -1;
if(n==1)
return 10;
else if(n>1)
return Age(n-1)+2;
}
//
main()
{
int iSelect;
//
int i1,i2,i3;
//
int a,b;
//
int n;
printf("函数使用程序集:\n");
printf("1,输入三个整数,用函数实现比较三个数的最大数,并输出显示到屏幕上.\n");
printf("2,求出两个整数的最大公约数.\n");
printf("3,使用函数的嵌套功能求:1!+2!+3!+4!+……+n!的值\n");
printf("4,求第五个人的年龄.\n");
printf("5,退出.\n");
printf("-----------------------------------------------\n");
printf("说明:请您从上述列表中选择相应的数字编号进行查看相应程序.\n");
do
{
printf("请输入您的选择:\t");
scanf("%d",&iSelect);
switch(iSelect)
{
case 1:
printf("请您输入三个正整数:\t");
scanf("%d%d%d",&i1,&i2,&i3);
printf("您输入三个正整数是%d,%d,%d\n",i1,i2,i3);
printf("最大数是:%d\n",Func(i1,i2,i3));
break;
case 2:
printf("请您输入两个正整数:\t");
scanf("%d%d",&a,&b);
printf("%d和%d的最大公约数是:%d\n",a,b,Gcd(a,b));
break;
case 3:
printf("请您输入n的值:(1<n<=10)\n");
scanf("%d",&n);
SumFact(n);
break;
case 4:
printf("第五个人的年龄为:%d\n",Age(5));
break;
case 5:
printf("程序即将关闭,下次再见!!!!!!!!!!\n");
break;
default:
printf("您的输入有错误,请您检查后重新输入……\n");
break;
}
}while(iSelect!=5);
}