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個數字:\n"); 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",n,y); 21 return 0; 22 }
例4:漢諾塔問題。
1 void move(char x,char y) 2 { 3 printf("%c->%c\n",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塊。\n",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個數字:\n"); 9 for(i=0;i<10;i++) 10 { 11 scanf("%d",&a[i]); 12 } 13 printf("\n"); 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個數字。\n",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\n",average(score1,5)); 17 printf("第2個小組的成績是:%6.2f\n",average(score2,7)); 18 return 0; 19 }
4.內部函數和外部函數
內部函數只能被本文件中其他函數所調用;static 類型名 函數名(參數列表);
外部函數可以在其他文件中被調用:extern 類型名 函數名(參數列表);
C語言中規定,若省略extern則默認為外部函數。