函数的介绍
为什么要用函数
通过前面几章的学习,大家已经可以编写一些简单的C语言程序了,但是如果程序的功能比较多,规模比较大,或者程序多次调用某个功能,把所有的程序代码都写在一个主函数(main函数)中,就会使得主函数变得头绪不清,阅读和维护程序也变得很困难。
所以,应该采用模块化程序设计的思路。一个C语言程序可由一个主函数(必须有)和若干个其他函数(可以无)构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。
样例程序1
输出以下结果:
无函数版本:
#include <stdio.h>
int main()
{
printf("*****************\n");
printf(" Hello world!\n");
printf("*****************\n");
return 0;
}
函数版本:
#include <stdio.h>
void print_star()
{
printf("*****************\n");
}
void print_message()
{
printf(" Hello world!\n");
}
int main()
{
print_star();
print_message();
print_star();
return 0;
}
函数的定义
函数是一个大型程序中的某部分代码,由一个或多个语句块组成,负责完成某项特定功能,而且相较于其他代码,具备相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。
函数的分类
C语言中函数分为 库函数 和 自定义函数。
-
库函数:
由系统提供,用户不必自己定义,可直接使用。例如:我们常用的 printf()函数 就是 stdio 库中的一个函数。所以调用库函数的时候需要包含该函数所在的库的头文件。常用库函数即头文件 #include <stdio.h> //IO(输入输出)函数 #include <string.h> // 字符或字符串操作函数 #include <math.h> //数学函数 #include <time.h> //时间、日期函数 #include <stdlib.h> //内存操作函数
-
自定义函数
程序员根据不同的功能需求,自己编写的函数。
自定义函数的使用
函数的组成
- 函数名,最好与函数的功能有关,方便以后按函数名调用函数
- 参数名字即类型,以便在调用函数的时候向他们传入数据。对无参函数不需要此项
- 函数体,也就是这个函数是做什么的,函数的功能。这是函数最核心的部分。
- 函数类型,即函数返回值的类型。如果没有要返回的数据,那么就是 void;如果有返回值,则需要在函数体最后加上:return 返回值变量名
// 返回值类型 函数名 (参数类型 参数名,参数类型 参数名,...)
ret_type fun_name (type para1,type para2,...) // 形参
{
statement; // 函数体
}
定义函数的方法
-
定义无参函数
无参函数,就是函数名后面的括号里面是空的,没有任何参数。例如样例1中的 print_star() 函数和 print_message() 函数。
定义无参函数的一般形式:类型名 函数名() { 函数体 }
-
定义有参函数
有参函数,即函数名后面的括号里面不为空。例如:int Max(int a,int b) { int c; c=a>b?a:b; return c; }
函数功能:求出两个数的较大值;
函数名:Max
参数:两个 int 类型的形式参数 a,b ,即需要比较的两个数
返回值:c,即两个传入参数的较大值,因为 c 的类型是 int ,所以函数的返回类型是 int定义有参函数的一般形式:
类型名 函数名(形式参数表列) { 函数体 }
调用函数
定义函数就是为了要调用函数,所以我们来说说怎么调用已经定义好的函数
注意:调用函数前,一定要先声明定义函数!
调用函数的一般形式:
函数名(实参表列)
例如:
print_star();
c=max(a,b);
是不是很简单!
如果是调用无参函数,则“实参表列”可以没有,但是括号不可以省!
如果实参表列包含多个参数,则各参数之间用逗号隔开!
样例程序2
输入两个整数,要求输出其中较大者的值,如下图:
代码:
#include <stdio.h>
int Max(int a,int b)//自定义函数
{
int c;
c=a>b?a:b;//函数体
return c;//返回值
}
int main()
{
int a,b; //变量声明
printf("请输入两个整数:(以空格隔开)\n"); //提示输入
scanf("%d %d",&a,&b); //输入数据
int c=Max(a,b); //调用Max函数,传入两个实参a,b,将返回值赋值给变量c
printf("%d 和 %d 中较大者是 %d\n",a,b,c); //输出
//上面两行也可以简化为下面的一行
//printf("%d 和 %d 中较大者是 %d\n",a,b,Max(a,b)); //输出
return 0;
}
函数递归
- 递归的定义:
如果没明白递归是什么意思,参见“递归” - 实际上,递归的意思就是,一个函数在执行时再次调用函数“本身”。
- 解决递归问题三步走:
1:确定递归函数功能
2:找出递归结束的条件,很重要!!!
3:找出函数的等价关系式
例子
有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁;问第4个学生多少岁,他说比第3个学生大2岁;问第3个学生多少岁,他说比第2个学生大2岁;问第2个学生多少岁,他说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第五个学生多少岁?
解题思路
假设第 i 个学生的岁数为 age(i)
由题意:
a
g
e
(
5
)
=
a
g
e
(
4
)
+
2
age(5) = age(4) + 2
age(5)=age(4)+2
a
g
e
(
4
)
=
a
g
e
(
3
)
+
2
age(4) = age(3) + 2
age(4)=age(3)+2
a
g
e
(
3
)
=
a
g
e
(
2
)
+
2
age(3) = age(2) + 2
age(3)=age(2)+2
a
g
e
(
2
)
=
a
g
e
(
1
)
+
2
age(2) = age(1) + 2
age(2)=age(1)+2
a
g
e
(
1
)
=
10
age(1) = 10
age(1)=10
由数学表达式表述如下:
a
g
e
(
n
)
=
10
(
n
=
1
)
age(n) = 10 \quad (n=1)
age(n)=10(n=1)
a
g
e
(
n
)
=
a
g
e
(
n
−
1
)
+
2
(
n
>
1
)
age(n) = age(n-1) +2 \quad(n>1)
age(n)=age(n−1)+2(n>1)
代码
#include <stdio.h>
int age(int n)
{
if(n==1)//递归结束条件
return 10;
else
return age(n-1)+2;//递归等价关系式
}
int main()
{
int ans=age(5);
printf("%d\n",ans); //输出
return 0;
}
函数调用过程
递归经典问题
汉诺塔,斐波那契数列…有兴趣的同学可以自己了解