函数
一组一起执行一个任务的语句 是程序的基本单位
用函数的时候不需要考虑到具体的实现过程
程序的组成基本单位 函数(实现某个目的/功能/任务的语句)
调用函数的优点 1.简洁 2.用的时候不需要考虑函数内部的实现方式
库 封装一系列函数(工具箱 函数的仓库)
stdio.h 标准函数库
函数(单个单个的功能)---->相同/相似的函数放到头文件---->多个头文件 (库)
main函数 是主函数 是程序的入口
一个项目中只能有一个函数的入口
1.函数名 自己取 如果要用这个函数 就需要用这个函数名字找函数
函数名不能重复
函数的作用
封装代码 使用的用户不需要 知道函数如何实现 只需要知道函数功能就可以使用
节省代码行数 对于一些做药重复使用的代码段 用函数可以缩短代码 提高编程效率
函数组成
函数名
函数的名字
调用的时候知道函数名和参数即可调用
函数类型(返回值类型)
定义的时候写在函数面前的类型 函数后面return后面的类型一致
如果函数不返回值 返回类型写void return后面不写任何值(也可以省略return)
参数
函数括号中的内容称之为参数 调用的时候需要传递值进去
函数体
函数具体执行内容的语句
函数的定义和使用方式
函数定义 提供了函数的实际主体(必须有)
函数的使用 调用函数的方式 函数名(参数)
函数声明 函数如果在调用之后定义 需要加上函数名和参数类型
函数声明一般放在前面 包含函数类型 函数名和参数类型(参数名可以省略)
形参和实参
形参 函数在定义的时候括号中的参数称之为形参
实参 函数在调用的时候括号中的参数称之为实参
形参和实参可以同名 但是并不是同一个变量 不占同一块内存 修改形参并不会影响实参 形参不改变实参
通过指针可以修改地址修改调用函数中的变量
质数 素数 约数只能1和它本身的数字
6是2的倍数 也是3的倍数
5 1的倍数也是5的倍数
是不是质数判断能不能除尽(有没有余数)
需不需要计算结果?
这个函数有没有参数 需要判断这个数字是不是质数
void isPrime(int y)
{
//判断除了1和本身有没有其他能够除得尽的数字
int i;
if(y<=1)
{
printf("数字不合法");
}
for(i=2;i<y;++i)
{
if(y%i==0)
{
printf("不是质数");break;
}
}
}
{} 在{}里面定义的变量 {}内部就是变量的作用域(只能在{}起作用) 出了作用域自动销毁
变量 在内存中给变量分配空间(变量的诞生)
程序结束 回收内存(变量死亡) 这个变量不能继续使用
出生---->死亡
{} 里面定义的变量 一旦出了{} 就会死亡 (局部变量)
全局变量会在所有程序结束之前回收内存
通过函数传参 主函数的数据 传递给其他函数
其他函数 返回值 传递给主函数
可以全局变量互相传递数据
如果全局变量和局部变量重名 使用的时候就近原则
不同的变量 根据作用 取不同的名字 方便区分
递归
主函数调用其他函数
函数A 函数B
函数A可以调用函数B
函数B也可以调用函数A
主函数 只能主函数调用其他函数 但是其他函数不能调用主函数
一个函数 直接调用自己 或者间接调用自己 (递归)
嵌套问题
递归思路 一个问题拆分成若干个 相同类型但是规模更小的问题
优点 代码很简单
部分问题 用其他方式不好操作 牺牲时间和空间
缺点
可能存在重复计算 未必效率高
层次太多 会大量消耗内存
案例 斐波那契数列
int Faco(int n)
{
if(n<=2)
return 1;
else
{
return Faco(n-1)+Faco(n-2)
}
}