讲义
首先引用y总的一句话:函数让代码变得更加简洁。——闫学灿
1.函数基础
一个典型的函数定义包括以下部分:返回类型、函数名字、由0个或多个形参组成的列表以及函数体。
返回值类型 函数名(参数列表){
函数体语句
return 表达式;
}
函数的声明和定义:
1.函数的声明:相当于变量的声明;
2.函数的定义:相当于变量声明并且初始化;
形参与实参
实参是形参的初始值。第一个实参初始化第一个形参,第二个实参初始化第二个形参,依次类推。形参和实参的类型和个数必须匹配。
函数的形参列表
函数的形参列表可以为空,但是不能省略。
void f1();
void f1(void);
形参列表中的形参通常用逗号隔开,其中每个形参都是含有一个声明符的声明。即使两个形参的类型一样,也必须把两个类型都写出来:
int f3(int v1, v2);//错误
int f4(int v1, int v2);//正确
局部变量、全局变量与静态变量
局部变量只可以在函数内部使用,全局变量可以在所有函数内使用。当局部变量与全局变量重名时,会优先使用局部变量。(举个例子,具体看演示)
编写一个最基础的函数
只有输出的函数,不需要任何返回值。
void ouput()
{
printf("Hello World!");
return ;
}
调用函数
在主函数当中直接写上函数名加上括号即可调用。(具体看演示)
函数的调用完成两项工作:一是用实参初始化函数对应的形参,二是将控制权转移给被调用函数。此时,主调函数的执行被暂时中断,被调函数开始执行。
函数当中return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方并返回对应的值。
相当于在顺序执行的结构上有了一个突发状况。
int main()
{
output();
return 0;
}
需要有返回值的函数
int fact()
{
int res = 1;
for(int i=1;i<=5;i++)
{
res=res*i;
}
return res;
}
以上是返回5的阶乘的函数。
怎么运用函数的返回值,设定一个变量,将函数的值赋予它即可。
int main()
{
int t;
t=fact();
printf("%d",t);
}
需要传入参数的函数
int fact(int n)
{
int res = 1;
for(int i=1;i<=n;i++)
{
res=res*i;
}
return res;
}
以上是返回n的阶乘的函数。
默认参数
传递参数时可以有默认值,没传入参数会用默认值,但是必须在后面几个参数。(具体看演示)
变量的别名
声明一个变量的别名,相当于你有了一个分身,你们两个任意一个改变,另一个都会受其影响。(具体看演示)
函数的引用
就是相当于形参是实参的别名,形参做出的改变会同时影响到实参。
需要修改实参的函数
由于函数只能返回一个值,在需要得到多个改变结果的时候,往往就会用到引用。
void swap(int &x,int &y)
{
int t;
t=x;
x=y;
y=t;
}
无返回值需要中间结束的函数
由于有些函数需要在中间就结束,往往需要用到return语句。
void swap(int &x,int &y)
{
if(x==y)
return ;
int t;
t=x;
x=y;
y=t;
}
有返回值需要中间结束的函数
int max(int x, int y)
{
if(x>y)
return x;
return y;
}
需要传入数组的函数
在函数中对数组中的值的修改,会影响函数外面的数组。
一维数组形参的写法:
void print(int *a)//指针写法有兴趣的同学可以学过指针后了解一下,在这就先不讲了
void print(int a[])
void print(int a[10])
(具体看演示)
多维数组形参的写法: 多维数组中,除了第一维之外,其余维度的大小必须指定
void print(int (*a)[10])//指针写法有兴趣的同学可以学过指针后了解一下,在这就先不讲了
void print(int a[][10])
(具体看演示)
函数的嵌套
有时候在函数当中也是需要调用函数的。(具体看演示)
函数嵌套时的执行顺序。(具体看演示)
函数的递归
相当于嵌套自己,就是在函数当中调用自己。 递归调用的执行顺序。(具体看演示)
int fact(int n)
{
if (n <= 1) return 1;
return n * fact(n - 1);
}
课上练手题目
1033(函数调用)
1043(函数嵌套)
1074(函数传数组)
走台阶(函数递归)
练习题目
1100(函数调用)
1103(函数调用)
1101(函数嵌套)
1106(函数递归)
思考题
1110(函数递归)(思考题)