1.C语言中不允许函数的嵌套定义,但可以使用函数的嵌套调用。
例1:输入4个整数,找出其中最大的数。
1 #include <stdio.h> 2 #include <stdlib.h> 3 int max1(int a,int b) 4 { 5 if(a>=b) 6 return a; 7 else 8 return b; 9 } 10 int max2(int a,int b,int c,int d) 11 { 12 int m; 13 m=max1(a,b); 14 m=max1(m,c); 15 m=max1(m,d); 16 return m; 17 } 18 int main() 19 { 20 int a,b,c,d,max; 21 printf("请输入4个数字: "); 22 scanf("%d %d %d %d",&a,&b,&c,&d); 23 max=max2(a,b,c,d); 24 printf("The max is %d",max); 25 return 0; 26 }
其中红色部分语句可更改为:m=max1(max1(max1(a,b),c),d);//更加精炼
2.函数的递归调用
例2:5个学生坐在一起,上一个学生比下一个学生分别小2岁,已知第1个学生今年10岁,那么求第5个学生的年龄。
1 int age(int n) 2 { 3 int c; 4 if(n==1) 5 c=10; 6 else 7 c=age(n-1)+2; 8 return c; 9 } 10 int main() 11 { 12 printf("第5个学生的年龄是%d",age(5)); 13 return 0; 14 }
例3:用递归方法求n!。
1 int fac(int n) 2 { 3 int f; 4 if(n<0) 5 { 6 printf("n<0,输入错误!"); 7 }else if(n==0||n==1){ 8 f=1; 9 }else{ 10 f=fac(n-1)*n; 11 } 12 return f; 13 } 14 int main() 15 { 16 int n,y; 17 printf("请输入要求阶乘的整数:"); 18 scanf("%d",&n); 19 y=fac(n); 20 printf("%d!=%d ",n,y); 21 return 0; 22 }
例4:汉诺塔问题。
1 void move(char x,char y) 2 { 3 printf("%c->%c ",x,y); 4 } 5 void hanoi(int n,char one,char two,char three) 6 { 7 if(n==1) 8 move(one,three); 9 else{ 10 hanoi(n-1,one,three,two); 11 move(one,three); 12 hanoi(n-1,two,one,three); 13 } 14 } 15 int main() 16 { 17 int m; 18 printf("请输入块数:"); 19 scanf("%d",&m); 20 printf("需要移动%d块。 ",m); 21 hanoi(m,'A','B','C'); 22 }
3.数组作为函数参数
例5:输入10个数,要求输出其中值最大的元素和该数是第几个数。
1 int max(int x,int y) 2 { 3 return(x>y?x:y); 4 } 5 int main() 6 { 7 int a[10],m,n,i; 8 printf("请输入10个数字: "); 9 for(i=0;i<10;i++) 10 { 11 scanf("%d",&a[i]); 12 } 13 printf(" "); 14 for(i=1,m=a[0],n=0;i<10;i++) 15 { 16 if(max(m,a[i])>m) 17 { 18 m=max(m,a[i]); 19 n=i; 20 } 21 } 22 printf("最大的数是%d,它是第%d个数字。 ",m,n+1); 23 }
例6:有两个小组,分别有5人和7人,调用average函数,分别求这两个组的学生的平均成绩。
1 float average(float array[],int n) 2 { 3 int i; 4 float aver,sum=array[0]; 5 for(i=1;i<n;i++) 6 { 7 sum=sum+array[i]; 8 } 9 aver=sum/n; 10 return aver; 11 } 12 int main() 13 { 14 float score1[5]={88,98,97.5,84.5,86}; 15 float score2[7]={78.5,98,97.5,84.5,86,77,94.5}; 16 printf("第1个小组的成绩是:%6.2f ",average(score1,5)); 17 printf("第2个小组的成绩是:%6.2f ",average(score2,7)); 18 return 0; 19 }
4.内部函数和外部函数
内部函数只能被本文件中其他函数所调用;static 类型名 函数名(参数列表);
外部函数可以在其他文件中被调用:extern 类型名 函数名(参数列表);
C语言中规定,若省略extern则默认为外部函数。