一. 函数
1.函数思想
ATM机
|
(拆) //拆功能 --拆需求
|
1.识别卡片 2.操作界面 3.存钱 4.取钱 5.查询 6.退出
|
(拆)
|
1.检测卡片
2.提示用户输入密码
3.验证信息
4.跳转到操作界面
函数 --- 实现某一个功能的程序模块
对于复杂工程,要有模块化的程序设计思想!
2. 函数的定义
形式:
返回值的类型标识符 函数名(形式参数) //函数头 --规定了函数的形式
{
函数体 //--实现函数具体功能代码
返回结果 //return 返回结果
}
(1).类型标识符 (返回值的类型标识符)
返回值 如果没有,返回值类型 一般写成void
返回的结果的类型 与 定义返回值类型 不一致 ,以定义的返回值类型为准 (发生了隐式类型转换)
返回值的类型如果不写,默认为int型
(2).函数名 --- 一般和函数功能对应 (见名知意)
(3).形式参数 --- 函数接收数据的入口 本身其实就是变量
形参 不是一定要有 看函数功能的需要
形参没有,一般写成 void
形参使用时:(这里指主函数要与被调用的函数 变量)
a.个数相同
b.类型匹配
c.形参 与 实参匹配顺序 -- 在ubunt18.04平台上 顺序是 从右向左
(4).函数体 --- 完成函数具体功能的代码
函数定义的位置:
1.main函数之前
2.main函数之后
函数的声明 (函数头 + 分号)函数声明可以放的极限位置,函数调用之前
函数调用的形式:
add(a,b); // 函数调用语句ret = add(a,b); //函数调用在表达式中
ret = add(a,b) + 3; //表达式的一部分
printf("sum = %d\n",add(a,b)); //函数调用作为某个函数的实际参数
练习:
实现函数,找出两个数中的最大值
准备数据:
int a,int b处理数据:
找最大值返回结果:
max
函数名: maxOfTwoNum
形参:
int a,int b
函数体:
a>b
返回值:
max -- int 返回值的类型 int
练习:
找三个数中的最大值
练习:
打印100以内的素数
总结:
1.函数实现
主要是 代码逻辑
2.流程图 --- 某一个功能块
3.main函数是主逻辑
针对 每个功能块 画一个流程图
4. 函数的嵌套调用
打印月份的天数
main -->printPrimeNumIn100-->isPrime //函数的嵌套调用main -->getMonthDays --> isLeapYear //函数调用的本质(内存中)
栈 --- 数据结构 --先进后出 (FILO)linux系统上 ,默认情况下栈默认 8M ,大小可以调整。
栈:
特点:先进后出 (FILO)
自动申请,自动释放
主要: 局部变量
堆:
特点: 大
手动申请,手动释放
函数的嵌套调用 --- 压栈
特殊的嵌套调用 --- 递归 (自己调用自己)不断压栈
递归 --就是循环直接递归
间接递归
循环的思路,实现代码eg:
1+...+100
int i = 0;
int sum = 0;
while (i <= 100)
{
sum += i;
}//1.初始条件
//2.结束条件
//3.趋于结束的操作
//4.循环体
sum()
递归来实现: //倒着来
递归的思路,实现代码 (如何写出递归以下二者是关键)
1.递推关系 //重复的动作
第n项 与 第n-1项之间的关系
2.结束条件sum(100) = sum(99)+100
sum(99) = sum(98) + 99sum(n) = sum(n-1) + n; //
sum(2) = sum(1)+2
sum(1) = 1
if (n==1) // 递归是否结束
{
return 1; //如果结束,返回结束时的值
}else
{
return sum(n-1)+n; //如果没结束,递归继续往下
}
}
练习:
1.n的阶乘