函数
关键词:function name 函数名 param 参数 return 返回值
优点:代码重用(软件的可维护性。高内聚,低耦合)
软件的可维护性:易发现问题好改。
强内聚:一个软件的模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一原则。
低耦合:一个完整的系统,模块与模块之间,尽可能的使其独立存在。
缺点:降低运行速度,性能换内存。
为了避免多次使用和修改,所以定义函数方便存取。
Void 自定义函数名 (自定义函数类型和数量) //比如 void hs(int i,int j)
{
主结构
}
调用时: 文件前声明
Void 自定义函数名(void)
然后使用: 自定义函数名();
Void 自定义函数名 (自定义函数类型和数量)中的 自定义函数类型和数量 叫做形参
自定义函数名(); 括号里的常数为 实参
返回值
return 的作用是结束正在运行的函数,并返回函数值。return后面可以跟一个常量,变量,或是表达式。
比如:
float area (float r)
{
return 3.14 * r * r ;
}
调用时 : result = area(2); //结果就是圆的面积
函数的调用约定
栈:数据暂时储存的地方。
内存放一段空间,函数的参数会被传递给被调用的函数。
类型:
_cdecl : 参数入栈,函数调用者释放空间
_stdcall : 参数入栈,函数释放空间
_fast : 参数入寄存器
备注:一般有寄存空间先放寄存器中 如果不写,系统默认_cdecl调用约定。
递归
一般用来写规律的问题,很容易使栈爆炸。
写递归函数必须先想好出口在哪里,就是返回条件 否则会进入死循环 栈爆炸
比如:
int add(int n1 , int n2) {
return add (n1 , n2);
} //系统栈爆炸直接处理
比如:
斐波那锲数列:每一项等于前两项之和。
递归过程
Sum(5)————————————————— 15
Sum(4)————————————— 10 + 5 = 15
Sum(3)—————————— 6 + 4 = 10
Sum(2)——————— 3 + 3 = 6
Sum(1)+2——— 1 + 2 = 3
Sum(1)== 1
1 1 2 3 5 8 13 21 ...........斐波那锲数列
项数越大后一项和前一项的比越接近0.618034 黄金分割线比例
int fib(int n) { if(n=1||n=2) { return 1; } return fib(n-1)+fib(n-1); }
线性问题优先用循环
非线性问题可以考虑用递归
如果用一般的程序必须写
int num =0 , n1 =1 ,n2 =1 ,count; scanf(“%d”,num); for(i = 0;i<=j:i++) { count = n1 + n2; n2 = n1 ; n1 = count ; }
数组
数组:用来处理大规模数据
常量折叠:编译亲戚间直接将常量表达式变为常量值
数组的特性:连续性 不留空,不重叠
一致性 数组元素类型一致
数组有两个参数 数组名和整型 ary[3] 或者3[ary]都可以 但是要用ary[]标准
type ary[] ....; //定义一个数组
Int n= ......; //设置下标
ary[n] address //求数组地址
(int)ary + sizeof(type)*n //数组首地址+下标 x 类型
将第一个数组下标做为0计算机在取地址的值时少做一层运算。所以数组下标从0 开始
%p &ary[n] 等价于 %p (int)ary +size(type)*n
声明数组 : 数据类型 数组名称[长度];
数组初始化三种方式
1. int boss_blood[100] = {100,100,100,100};
//数组前三个值为100 后面没声明的全为0
2. int boss_blood[100] = {0};
//数组值全为0
3. int boss_blood[]={100,100,100,100}
//未声明数组长度则自动识别后面数组长度,所以相当于int boss_blood[4]
数组里面的数据是从0开始的比如数组blood[2]里面有blood[0]和blood[1]
所以要给数组的第几个值赋值下标减一
index 下标
小标为负数或者超过最大值称作下标越界。
如果:
int i = 1 ;
char j [2] = { 2 , 3 };
int k=4 ;
我们可以通过下标越界来找出前面或者后面定义变量值来进行加密或者访问
for( a = 0 ; a < 1000 ; a++ )
{
if ( j [1+a] == 1 || j [1+a] == 4 )
{
printf(“%d”,a);
break;
}
}
二维数组
写法:
char poke [2][3]={ 1 , 2 , 3 , 4 , 5 , 6 };
char poke [2][3]={ {1,2,3}, {4,5,6} }; //{}行, 列
char poke [2][3]={
{1,2,3},
{4,5,6}
};
char poke [ 2 ][ 3 ] 等价于 char poke [ 6 ]
一般最多用三维数组,每多一维数组可读性直线下降。
三维数组写法:
char poke [2][2][2]={1,2,3,4,5,6,7,8}
多维数组每一维下标都不能越界,越界就会取其他数。
比如:char poke [ 0 ][ 0 ][ 0 ]=1;
char poke [ 0 ][ 0 ][ 2 ] =3;