同,分析其处理方法。
解题思路:如果函数返回值的类型与指定的函数类型不同,按照赋值规则处理。
#include
{ int max(float x,float y); float a,b; int c; scanf(\ c=max(a,b);
printf(\ return 0; }
int max(float x,float y)
{ float z; z=x>y?x:y; return( z ) ; }
7.4对被调用函数的声明和函数原型 在一个函数中调用另一个函数需要具备如下条件:
(1) 被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数) (2) 如果使用库函数,应该在本文件开头加相应的#include指令
(3) 如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该声明 例7.4 输入两个实数,用一个函数求出它们之和。
解题思路:用add函数实现。首先要定义add函数,它为float型,它应有两个参数,也应为float型。特
别要注意的是:要对add函数进行声明。
#include
{ float add(float x, float y);
float a,b,c;
printf(\ scanf(\ c=add(a,b); printf(\ return 0; }
float add(float x,float y)
{ float z; z=x+y;
return(z); }
函数原型的一般形式有两种:
如 float add(float x, float y); float add(float, float);
原型说明可以放在文件的开头,这时所有函数都可以使用此函数
7.5 函数的嵌套调用 C语言的函数定义是互相平行、独立的,即函数不能嵌套定义,但可以嵌套调用函数,即调用一个函数的过程中,又可以调用另一个函数。
main函数 a函数 b函数 ① ② ③ ④ 调用a函数 调用b函数 ⑤ ⑨ ⑦
⑧ ⑥ 结束
例7.5 输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。 解题思路:main中调用max4函数,找4个数中最大者 max4中再调用max2,找两个数中的大者
max4中多次调用max2,可找4个数中的大者,然后把它作为函数值返回main函数 main函数中输出结果 主函数
#include
{ int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf(“4 interger numbers:\
scanf(\ max=max4(a,b,c,d);
printf(\ return 0; }
max4函数 max2函数
int max4(int a,int b,int c,int d) int max2(int a,int b) { int max2(int a,int b); { if(a>=b)
int m; return a; m=max2(a,b); else
m=max2(m,c); return b; m=max2(m,d); } return(m); }
int max2(int a,int b) { return(a>b?a:b); }
7.6 函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 C语言的特点之一就在于允许函数的递归调用。
例7.6 有5个学生坐在一起。问第5个学生多少岁?他说比第4个学生大2岁;问第4个学生岁数,他说比第3个学生大2岁;问第3个学生,又说比第2个学生大2岁;问第2个学生,说比第1个学生大2岁;最后问第1个学生,他说是10岁。请问第5个学生多大? #include
{ int age(int n);
printf(\ return 0; }
int age(int n)
{ int c; if(n==1) c=10;
else c=age(n-1)+2; return(c); }
例7.7 用递归方法求n!。
解题思路:求n!可以用递推方法:即从1开始,乘2,再乘3……一直乘到n。
递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推出下一个事实(如2!=1!*2),
再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3*2!)。n!=n*(n-1)!。
求n!也可以用递归方法,即5!等于4!×5,而4!=3!×4…,1!=1 可用下面的递归公式表示:
#include
{int fac(int n); int f; int n; int y; if(n<0)
printf(\ printf(\ scanf(\ else if(n==0 | | n==1) y=fac(n); f=1;
printf(\ else f=fac(n-1)*n; return 0; return(f); } }
例7.8 Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动一盘子的步骤。
#include
{ void hanoi(int n,char one,char two,char three); int m;
printf(“the number of diskes:\ scanf(\
printf(\ hanoi(m,'A','B','C'); }
void hanoi(int n,char one,char two,char three) { void move(char x,char y); if(n==1)
move(one,three); else
{ hanoi(n-1,one,three,two); move(one,three);
hanoi(n-1,two,one,three); } }
void move(char x,char y) {
(n?0,1)?n!?1n!???n?(n?1)(n?1) printf(\ }
7.7.1数组元素作函数实参 例7.9 输入10个数,要求输出其中值最大的元素和该数是第几个数。
#include
{ int max(int x,int y); int max(int x,int y) int a[10],m,n,i; { return(x>y?x:y); } printf(“10 integer numbers:\\n\ for(i=0;i<10;i++)
scanf(\
printf(\
for(i=1,m=a[0],n=0;i<10;i++) { if (max(m,a[i])>m) { m=max(m,a[i]); n=i; } }
printf(“largest number is %d\\n\ printf(“%dth number.\\n“,n+1); }
7.7.2数组名作函数参数 除了可以用数组元素作为函数参数外,还可以用数组名作函数参数(包括实参和形参)。用数组元素作实参时,向形参变量传递的是数组元素的值;用数组名作函数实参时,向形参传递的是数组首元素的地址。 例7.10 有一个一维数组score,内放10个学生成绩,求平均成绩。 #include
{ float average(float array[10]); float score[10],aver; int i; printf(\ for(i=0;i<10;i++)
scanf(\ printf(\
aver=average(score); printf(\ return 0; }
float average(float array[10]) { int i;
float aver,sum=array[0]; for(i=1;i<10;i++)
sum=sum+array[i]; aver=sum/10; return(aver);