1.函数的概念:
函数是可以完成特定功能的代码段,也是组成c语言源程序的基本单位。
优点:
1)提高程序的可读性
2)可以提高开发效率
3)提高代码重用性
2.函数的定义
格式:
返回值 函数名(形参列表){
函数体;
// retern
}
3.函数的参数
形式参数,简称形参:在函数定义中,函数名后面小括号中的参数。
注意:
1)形参定义后,并不会立即分配存储空间,在函数调用的时候才会分配存储空间。
2)如果有多个形参,用逗号分隔。
3)形参的类型可以不同。
4)函数中不能定义和形参同名的变量。
5) 形参的作用域:只能在本函数中使用。
实际参数,简称实参:在函数调用的时候,函数名后面小括号中的参数。
注意:
1)实参可以是变量,也可以是常量,也可以是表达式。
2)实参的数据类型要和形参保持一致。
实参和形参之间的值的传递过程
1)调用函数的时候,实参的值是一个已经确定的值
2)把实参的值赋值给形参
3)实参和形参的个数、类型要一致,如果类型不一致,会造成精度丢失
4)形参的值在函数内部可以修改,但是不会影响主调函数中实参的数据
5.函数的返回值及注意事项
主调函数和被调函数:A B两个函数,如果在A中调用了B,则A叫主调函数,B叫被调函数。
函数的返回值:被调函数返回给主调函数的值。
使用注意:
1)函数的返回值要用到关键字return。
2)return后面可跟常量、变量,表达式,可以加上括号,也可以省略:return (常量/变量/表达式)
3)如果return的值和函数定义的返回值类型不一致,以函数的返回值类型为准。
6.函数的声明
函数的使用流程:先声明,再定义,再调用。
函数的声明:告诉编译器这个函数已经存在了,告诉编译器被调函数的返回值类型,以便在主调函数中处理被调函数返回的数据。
函数声明的格式:把被调函数的头部拷贝一份并加上一个分号。
函数声明的注意事项:
1)如果被调函数的返回值是int类型,此时可以不用声明(只会出现警告)。
2)如果被调函数写在主调函数之前,可以不用声明。
1)数学计算
#include <stdio.h>
// 计算三个数的和
int sum(int a,int b, int c){
return a + b + c;
}
// 计算三个数的平均值
double avg(int a,int b, int c){
return (a + b + c)/3.0;
}
int main(int argc,const char * argv[]) {
int s = sum(23,6, 89);
double a = avg(34,5,77);
printf("s = %d, a = %f",s,a);
return 0;
}
1.递归函数:如果在一个函数的内部存在调用当前函数本身的语句,那么这个函数就是递归函数。
2.递归调用:递归函数中,调用自己的操作。
注意:1)主调函数就是被调函数。
2)在递归函数中应该存在能够让递归结束的条件。
3.构成递归的条件:
1)存在自己调用自己。
2)存在一个条件,能够让递归结束(否则,死循环)。
3)能够找到一个规律,让要解决的问题的规模缩小。
4.递归函数的执行有两个阶段:
1)递推阶段:问题规模缩小的过程。
2)回归迭代:迭代计算的过程
5.递归的优点和缺点:
优点是:遇到问题规模能够缩小,而且有规律的问题的时候,代码比较简洁。
缺点:消耗内存。
建议:在程序中不能用太多
6.应用举例:
1)5个人做在一起,第5个人比第4个人大两岁,第4个人比第3个人大两岁,第三个人比比2个人大两岁,第二个人比第1个人大两岁,第1个人10岁,问第5个人多大(用递归函数)
#include <stdio.h>
int getage(int n){
int age = 0;
if (n == 1) {// 第1个人
age = 10; // 年龄是10岁
} else {
//如果不是第1个人,当前这个人的年龄等于前一个人年龄+2
age = getage (n - 1) + 2;
}
return age;
}
int main(int argc,const char * argv[]) {
int a = getage(5);
printf("第5个人的年龄为:%d", a);
return 0;
}
#include <stdio.h>
// 用递归法求n的阶乘
int jc(int n){
int j = 0;
if (n ==1) { // 如果n==1,阶乘的结果等于1
j = 1;
} else {// 如果n!=1,阶乘的结果等于前一个数的阶乘乘以n
j = jc(n - 1) * n;
}
return j;
}
// 用递归法实现x的y次方
int chengFang(int x,int y){
int cf = 0;
if (y == 0) {// 如果y==0,乘方等于1
cf = 1;
} else {// 如果y不等于0,则x的y次方等于x的y-1次方乘以x
cf = chengFang(x, y - 1) * x;
}
return cf;
}
int main(int argc,const char * argv[]) {
int j = jc(4);
printf("4的阶乘是%d\n",j);
int c = chengFang(3,4);
printf("3的4次方是%d", c);
return 0;
}