/*
* 函数的定义和使用
* 定义:调用其他函数的函数叫做主调函数,被调用的函数称为被调函数,函数既可以被调用也可以调用其他函数
* 语法形式
* 类型说明符 函数名(形参)
* {
* 语句序列
}
* 形参:实现调用函数与被调函数之间的联系,将函数所处理的数据、影响函数参数的因素或者函数预处理的结果作为形参
* 函数返回值和返回值类型:
* 函数可以有一个返回值,函数的返回值需要返回给主调函数的处理结果,类型说明符规定了返回值的类型
* return 表达式;(return语句两个作用,返回值和结束函数的执行)
* 函数的调用:
* 函数的调用形式:
* 类型说明符 函数名(形参列表)
* 在所有函数之前声明函数,那么就可以在程序的任何地方调用这个函数
(声明函数,形参列表只需要包含完整的类型信息,形参名可以省略)
* 回文:各位数字左右对称。
* 镶嵌套用:函数一表用函数2,函数2调用函数3,就形成了镶嵌调用。
* 递归调用,直接或者间接的调用本身
* 函数的参数传递
* 值传递:实参初始化形参,实参的值无法发生改变
* 引用传递:引用是一种特殊的变量,可以被认为是另一个变量的别名
*
* 内联函数:功能简单、规模较小、使用频繁
* 不是在调用时发生控制转移,在编译时将函数嵌入在每一个调用处
* inline 类型说明符 函数名(含有类型说明的形参)
* { 语句序列 }
* 带默认形参值的函数:
* 函数定义可以预先声明默认的形参值,调用时,如果给出实参,则用给定的形参值,否则用默认的形参值
* 相同作用域内,不允许对同一个函数的多个声明对同一个参数的默认值重复定义,即使前后的值相同也不行
* 有默认值的形参必须在形参列表的最后
* 函数重载:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型以及个数的最佳匹配,自动确定调用哪一个函数
* int add(int i,int j)
* float add(float i,float j)形参类型不同
* int add(int i,int j int y)形参个数不同
* 不要将不同功能的函数定义撑重载函数,以免出现对于调用结果的误解混淆
* 使用默认参数值重载时要注意,防止不知道调用哪一个函数
*c++系统函数:c++中提供了几百个函数供程序员使用
* 编译环境提供的系统函数分为两类,一类是标准的c++函数一类是不标准的c++函数,是当前操作系统或编译环境中所特有的系统函数
* 优先使用标准的c++函数
* 深度探索
* 运行栈与函数调用的执行:
* 运行栈的工作原理:
* c++变量在运行时依靠地址加以区分为全局变量和局部变量
* 全局变量在程序中用于唯一确定的地址,但是局部没有
* 原因:1、局部变量只有在调用他所在的函数的时候才会生效,函数返回便失效
* 2、递归时,必然有函数值没有返回,对他的再次调用发生,相同名称的局部变量会拥有不同的值,他们同时存在,相互不影响,他们必然有不同的地址
* 函数形参与局部变量相类似,没有固定地址,需要存储在一个特殊结构中,就是栈
* 栈:一种数据结构,是一种能容纳很多数据的容器,数据进入和推出需要满足一定条件
* 后进先出,先进后出
* 运行栈:函数的形参和局部变量可以用栈存储叫运行栈(一段区域的内存空间,与全局变量的存储一样,只是寻址方式不同)
* 运行栈中的数据分为一个一个的栈帧,每一个对应一个函数调用,栈帧中包括函数调用的形参值、控制信息、局部变量值、临时数据
* 每次函数调用就会有一个栈帧被压入栈中,结束调用,栈帧就会弹出来
* 函数执行过程中可以随机访问他所对用栈帧中的数据(执行中的函数所处栈帧总在最顶端
* 函数调用的执行过程:
* esp寄存器就是来记录栈顶地址的,它称为栈指针
* ebp寄存器(帧指针):因为函数的栈帧大小不确定,函数返回时,恢复指针就比较的麻烦,就需要另一个寄存器保存被调用时,栈指针的位置
*/
#include<stdio.h>
#include <iostream>
using namespace std;
//编写一个求x的n次方的函数
double cifang(double x, int y)
{
double j = 1;
for (int i = 1; i <= y; i++)
{
j *= x;
}
return j;
}
//输入一个8为二进制,将其转化为10进制输出
int jinzhi(int x)
{
int tmp=0;
int tmp1 = 0;
for (int i = 0;i<8; i++)
{
int j;
j = x % 10;
x /= 10;
if (j = 1)
{
tmp+=cifang(2, i);
}
}
return tmp;
}
//递归求阶乘
int digui(int x)
{
int a;
if (x == 0)
{
a = 1;
}
else
{
a = digui(x - 1) * x;
}
return a;
}
//递归计算n个人选择K个组成一个组委会的个数
int geshu(int n, int k)
{
if (k > n)
{
return 0;
}
if (n==k||k==0)
{
return 1;
}
else
return geshu(n-1, k) + geshu(n - 1, k - 1);
}
//通过引用传递改变值
void gaibian(int& a, int& b)
{
int t = a;
a = b;
b = t;
}
//主函数
int main()
{
int x=cifang(5, 2);
std::cout << x <<std:: endl;
std::cout << jinzhi(01101001) << std::endl;
std::cout << digui(8)<< std::endl;
std::cout << geshu(18,5) << std::endl;
int a = 1;
int c = 2;
gaibian(a, c);
std::cout << a<<c<< std::endl;
}