函数
定义
eg1 add函数
int add(int a,int b);//返回值类型:int整型 输入值:两个整数
{
return a + b;//做点什么:不做 返回值:两个整数的和
}
调用
- 函数需要被另一个函数调用才能执行
#include <stdio.h>
int add(int a,int b)//函数定义
{
return a + b;
}
int main()
{
int result;
result = add(2, 3);//函数调用
printf("%d", result);
return 0;
}
封装
- 封装后可多次调用 可增加复用性
eg2 不封装 用海伦公式计算三角形面积
#include <stdio.h>
#include<math.h>//sqrt需要头文件#include<math.h>
int main()
{
//输入abc
double a, b, c, p, s;
scanf("%lf" "%lf" "%lf", &a,&b,&c);
//判断是否构成三角形
if (a + b > c && a + c > b && b + c > a)
printf("it's a traingle\n");
else
{
printf("not a traingle\n");
return 0;//无法构成三角形 程序结束
}
//求三角形面积
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
//输出结果
printf("s=%f", s);
return 0;
}
eg3 封装 用海伦公式计算三角形面积
#include <stdio.h>
#include<math.h>//sqrt需要包含math.h
//判断能否构成三角形
int yes(double a, double b, double c)
{
if (a + b > c && a + c > b && b + c > a)
return 1;
else
return 0;
}
//定义求面积函数
double area(double a, double b, double c)
{
double p, s;
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
return s;
}
int main()
{
//输入abc
double a, b, c;
scanf("%lf" "%lf" "%lf", &a, &b, &c);
//能否构成三角形
if (yes(a, b, c) == 0)
{
printf("no");
return 0;
}
//求面积
double s;
s = area(a, b, c);
printf("area is %f", s);
return 0;
}
返回
- void为空类型 无需输入和返回函数
- return会停止函数的执行 返回主调函数
- int main()需要返回值0 当函数正常执行后会返回0 用来检查函数是否正常执行
声明(原型)
- 函数定义应放在调用前
- 若调用前没有定义 可使用函数声明通知编辑器有这个函数存在
- 声明格式:函数体;
- 函数声明时可省略或修改变量名
eg4 声明
#include <stdio.h>
#include<math.h>
//调用前加函数声明
int yes(double, double, double);
double area(double, double, double);
int main()
{
double a, b, c;
scanf("%lf" "%lf" "%lf", &a, &b, &c);
if (yes(a, b, c) == 0)
{
printf("no");
return 0;
}
double s;
s = area(a, b, c);
printf("area is %f", s);
return 0;
}
//函数定义
int yes(double a, double b, double c)
{
if (a + b > c && a + c > b && b + c > a)
return 1;
else
return 0;
}
double area(double a, double b, double c)
{
double p, s;
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
return s;
}
形参与实参
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main()
{
int result;
result = add(2, 3);//函数调用
printf("%d", result);
return 0;
}
- 形式参数:a,b 指代函数参数的类型 是函数需经历的处理步骤 无确定值 只能是变量
- 实际参数:2,3 确定函数参数的具体值
- 形参实参相互独立
- 函数内声明的变量为局部变量 不同函数内的局部变量相互独立 即使变量名相同
函数递归
定义
- 函数内部调用自己 先递推再回归 放在递归调用前的语句将在递推过程中执行 而放在递归调用后的语句将在回归过程中执行
条件
- 递推规则
- 递推结束条件
#include <stdio.h>
void func(int n)
{
if (n == 5)//n为5时结束递推
return;
printf("%d\n", n);
func(n + 1);
}
int main()
{
func(0);
return 0;
}
回归
#include <stdio.h>
void func(int n)
{
if (n == 5)//n为5时结束递推
return;
printf("after %d\n", n);//递归前的语句 递归时执行
func(n + 1);
printf("before %d\n", n);//递归后的语句 回归时执行
}
int main()
{
func(0);
return 0;
}
实例
- 阶乘
n为0或1时 f(n)返回1
n大于1时 f(n)=n*f(n-1)
#include <stdio.h>
int f(int n)
{
if (n == 0 || n == 1)
return 1;
return n *f (n - 1);
}
int main()
{
int result = f(4);
printf("%d", result);
return 0;
}
- 斐波那契数列
n为1或2时 f(n)返回1
n大于2时 f(n)=f(n-1)+f(n-2)
#include <stdio.h>
int f(int n)
{
if (n == 1 || n == 2)
return 1;
return f(n-1) + f(n - 2);
}
int main()
{
int result = f(4);
printf("%d", result);
return 0;
}
调试
见课件25 懒得贴图了