函数
1.实现某种特定功能的指令序列
2.作用:
a)模块化的设计
b)代码的复用 printf/gets
3.函数的设计
需求分析:
a)明确实现的功能
b)需要的资源
c)算法思路
d)完成情况的结果
ex.求整型数组中的最大值 ex1.统计字符串中有几个字母?
资源:数组、数组长度 资源:字符串、字符串的长度
思路:max 思路:('a'<=a[i]&&a[i]<='z')||('A'<=a[i]&&a[i]<='A')
结果:max 结果:几个字母
4.函数实现
4.1格式:
返回值类型 函数名(参数列表)
{
声明语句;
实现语句;
return;
}
“返回值类型”:必须单值类型,可以返回指针类型
“函数名” :只要是合法的标识符即可
“参数列表” :(数据类型1 变量名1,数据类型2 变量名2)
return 返回值:
1.结束函数
2.返回一个与返回值类型一致的值(假设返回值类型是void ,直接用return;)
/* /*
功能:求数组的最大值 ex.写一个函数,求2个数的最大值
*/ */
int maxFun(int a[],int length)
{
int max=a[0];
int i;
for(i=0;i<length;i++)
{
if(max<a[i])
{
max=a[i];
}
}
return max;
}
4.2函数的调用
1.直接调用,作为一个单独的语句调用
函数名(参数列表);
"函数名":调用的函数名字
"参数列表":(变量名1,变量名2):变量名的类型与函数定义的类型一致
参数列表:里面可以是常量,变量,表达式,只要类型一致即可
maxFun(a,b);
2.作为一个表达式出现在另一个表达式中
int c=maxFun(a,10);
3.作为另一个函数的实参调用
maxFun(maxFun(a,b),10);
4.3基础概念
主调函数:主动调用别的函数的函数
被调函数:被别的函数调用的函数
形 参:定义函数时参数列表的参数
实 参:调用函数时传入的参数
☆4.4函数的调用过程
.函数只有在被调用的时候才会分配空间。
1.把实参的值赋值给形参
2.执行函数体内的内容
3.使用return返回,函数执行结束,所有形参以函数里定义的变量都会被释放
4.最后把返回值返回给主调调函数。
4.5
主调函数--->被调函数 通过实参
被调函数--->主调函数 通过返回值
主调函数<---->被调函数 全局变量
ex1.写一个函数求3个数的和,在main中调用。
main中输入数据
main中输出结果
ps:1)函数名不能与变量名相同
2)函数名不能使用关键字(int double long if/while static extern)
5.递归函数
函数自己直接或者间接的调用自己
a)问题模型要符合递推
b)问题模型的解到一定层次是显而易见的
c)明确功能与需求的关系
ex.要用递归来实现菲波那切数列
功能:求菲波那切数列的第n项的值
参数:
结果:第n项的值
ex1.
a1=10
An=A(n-1)+2
a)使用递归求第n项的值。
功 能:求第n项的值
输入参数:n项
结 果:第n项的值
int A(int n)
{
if(n==1)
{
return 20;
}
else
{
return A(n-1)+2;
}
}
b)求前n项的和
s1=10;
S(n)=S(n-1)+A(n);
hanoi问题:
有ABC三座塔,有64从小到大个盘子放在塔A上,要把塔A上的盘子移到塔C上
1.每一次只能移到一个盘子
2.盘子只能按照上面是小的下面是大来放置。
5.变量的存储类别
1.从作用范围内来讲
1.全局变量
在函数外定义,一开始就会分配内存空间,并在整个程序/或者说整个工程内都有效
extern int a;//告诉编译器,我文件后面定义了一个变量
static修饰全局变量:该全局变量仅能在定义它的文件中使用
2.局部变量
在函数体内部定义,它的作用范围从定义开始,到第一个{}结束
static 局部变量:一直存在,并且初始化只执行一次
1.同名问题:只要作用域不同,就可以同名,名字相同,就近原则输出
2.static作用:
static修饰全局变量,函数:只能在当前文件中使用
static修饰局部变量:只初始化一次,并且变量一致存在
3.生存期:从定义开始到最后被释放(消失)
全局变量:从定义开始,整个工程;
局部变量:从定义开始,到第一个{}
static修饰的局部变量:程序运行开始就存在,直到程序结束。