黑马程序员——C语言基础05—函数

时间:2020-12-24 00:22:29

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、什么是函数?

1)任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”。
所以,你可以说C语言程序是由函数构成的
2)每一个函数用来实现一个特定的功能。
3)一个C程序由一个main函数和若干其他函数构成。由主函数调用他函数,其他函数也可以相互调用。同一函数可以被一个函数或多个函数调用多次。

二、怎样定义函数?

  1. 在程序中的所有函数必须先定义,后使用。通过函数函数,可以看出C语言是一门面向过程的语言。通过不同功能的函数来实现最终结果的实现。
 1)指定函数的名字,以便以后按名调用;
2)指定函数的类型,即函数返回值的类型;
3)指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项;
4)指定函数应当完成什么操作,也就是函数时做什么的,即函数的功能。这是最重要的,是在函数体重解决的。
/*类型名 函数名(参数类型 参数)

函数体
}*/

2. 函数分类

1)无参无返回值函数
void 函数名()
{
函数体
}
2)无参有返回值函数

类型名 函数名()
{
函数体
return 返回值;
}
3)有参无返回值函数
void 函数名(参数类型 参数)
{
函数体
}
4)有参有返回值函数
类型名 函数名(参数类型 参数)
{
函数体
return 返回值;
}

三、函数的声明与调用

1.一个函数调用另一个函数需要具备以下条件:

1)被调用的函数已经是定义的函数(是库函数或者用户自定义的函数);
2)如果使用库函数,应该在文件头文件用#include指令将调用有关函数是所需要的信息。
3)如果用户自定义函数,而该函数的位置在于调用他的函数的后面(同一个文件),应该在主调函数中对被调用打函数进行声明。

2.那么如何声明一个自定义函数呢?

1)函数类型 函数名(参数类型1 参数1, 参数类型2 参数2…);
2) 函数类型 函数名 (参数类型1,参数类型2…);
注意:如果被调函数在主函数的后面则需要声明。

3.函数的调用过程就是值传递或者址传递的过程。(址传递是指后面的指针)

1)调用函数时,实参值确定;实际参数和形式参数的个数 类型完全一致,如果不一致会造成精度丢失。
2)定义函数后并不会真正的给形式参数分配内存空间,而是当函数的调用时才会分配。
3)通过return语句将函数值带到主调函数。例如下个实例,求两个数值的最大值,将max函数的z值return到主调函数中。
4)如果函数不需要返回值,则函数不需要return语句,即void函数类型。

5)行参的值在函数内部可以被修改,但不会影响主调函数中实际参数的数据。

四、函数实例

1)求x、y两值的最大值

#include<stdio.h>
//先编写max函数
int max(int x,int y)//定义max函数,有两个参数
{
int z;//定义临时变量z
z=x>y?x:y;//把x和y大者赋给z
return z;//把z作为max函数的值返回main函数
}
//再写主函数
int main()
{
int max(int x,int y);//对max函数的声明
int a,b,c;
printf("请输入两个整数:");//提示输入数据
scanf("%d,%d",&a,&b);//输入两个整数
c=max(a,b);//调用max函数,有两个实参,大数赋给变量c
printf("最大的数是 %d",c);//输出大数c
return 0;



2)输入两个数,打印(printf)这两个数的和、差、积、商、以及余数。

#include <stdio.h>

int sum(int x,int y)
{
return x+y;//定义求和函数
}
int minus(int x,int y)
{
return x-y;//定义相减函数
}
int multiply(int x,int y)
{
return x*y; //定义相乘函数
}
int Shang(int x,int y)
{
return x/y; //定义相除求商
}

int Yushu(int x,int y)
{
return x%y; //定义相除求余
}

int main()
{
int a,b,t1,t2,t3,t4,t5;
printf("请输入两个整数a和b,并以空格隔开:");
scanf("%d%d",&a,&b);
t1=sum(a,b);
t2=minus(a,b);
t3=multiply(a, b);
t4=Shang(a, b);
t5=Yushu(a, b);
printf("a与b的和是%d,差是%d,积是%d,商是%d,余数是%d\n",t1,t2,t3,t4,t5);


return 0;
}

五、函数的嵌套调用与递归调用

1、定义函数时,一个函数内不能再定义另一个函数,也就是不能嵌套定义,但可以嵌套调用函数。

2、如果在调用一个函数的过程中又出现直接或间接的调用函数本身,则称为函数的递归调用。
例如:

`int f(int x)
{
int y, z;
z=f(y); //在执行f函数时候又调用了f函数时
return (2*z);
}
`

注意:递归函数不建议经常使用,因为极其的消耗内存。

如果想要递归,必须满足三个条件:
a 自己能够调用自己
b 存在一个能让递归结束(否则将会是一个死循环)
c 能够找到一个规律能让规模缩小

3、递归 分为递推阶段 和回归迭代阶段

int getAge(int n)
{
int age;
if (n==1){
age=10
} else {
age = getAge(n-1)+2; //回调自己的函数
}
return age;
}