函数是指将一组能完成一个功能或多个功能的语句放在一起的代码结构。在C语言程序中,至少会包含一个函数,及主函数main()。本章将详细讲解关于函数的相关内容。

一.函数概述

C语言重要组成部分。本质是将一个语句块通过命名的方式独立出来。通过调用函数,可以实现对部分代码的反复使用,。

函数类似于循环结构,可以节约大量代码。不同的是,函数在使用时不用被连续使用,而循环结构必须被连续使用。

二.使用函数

1.定义函数

定义函数由函数首部与函数体组成。其中,函数首部由void、函数名和小括号组成;函数体由大括号和语句块组成。

void函数名(){ 语句块;}

由于函数名属于标识符,所以函数名必须符合标识符的命名规则。命名的函数名要有较好的可读性。

2.调用函数

调用函数是通过语句实现的。函数名、小括号与分号组成调用函数语句。

函数名();

3.函数说明

在使用函数时,默认为先定义函数、后调用函数。
由于计算机执行程序是顺序执行。所以在调用函数时,将定义函数放在主函数之前

三.使用参数

最基本的函数形式相当于一个封闭空间,该函数的功能不受外界影响。如果函数的功能需要外部传递一些值进入函数,并参与函数的运算,这种函数在C语言中被称为带参函数。

1.参数声明

对参数进行声明

void 函数名(类型 形式参数)

其中,类型为形式参数的类型。形式参数简称形参,其本质为一个变量。声明形参后等于为函数声明了变量,可以在函数体内进行使用。
形参的个数可以为一个也可以为多个。如果要声明多个形参,它们之间用逗号隔开即可。

void(类型形参1,类型形参2,……){}

形参的作用就是一个接受站台,用于接收数据。在函数中,声明几个形参等于建立了个接收站。

2.参数传递

指将数据通过参数传递到函数的形参中。参数传递方式为通过调用函数语句,将值传递到函数中。

函数名(实际参数)

实际参数简称实参,表示实际传递的数值。实参可以为常数,也可以为变量。
实参的个数、数据类型及顺序要与形参的一致。如果传递多个实参,咋要用逗号将其分隔,

函数名(实参1;实参2;实参3;……);

实参的类型与形参的类型要一致;当实参与形参类型不同时,如果实参的类型可以被自动转换为形参的类型,也是可以进行参数传递的。

四.返回值

返回值是指函数在被执行完后返回的值。通过返回值,我们可以确定函数执行的情况,还可以得到函数的运行结束。

1.声明函数类型

声明函数类型是指声明函数返回值的类型。

类型 函数名(){}

其中,类型是指函数返回值的类型。函数返回值可以为一个常数或一个变量。无论是带参函数还是无参函数都可以声明函数类型。

void 函数名(){}

这里的void表示该函数没有返回值。没有返回值就是没有反馈信息。

2.传递返回值

传递返回值要使用return语句。通过return语句可以将函数返回值进行传递

return 返回值;

其中,return语句可以有多个;返回值为表达式,其类型必须和声明函数类型一致或兼容。这里的兼容也可以指可以自动转换。
变量或常量也属于表达式

类型 函数名(形参1,形参2,形参3,……){ …… return 0;}

五.局部变量

局部变量是指在一定范围内有效的变量。一定范围即有效范围,具体是指局部变量所属的函数范围。在这个范围中,局部变量是有效的。在函数内定义的变量及形参都属于局部变量。

a.作用域

作用域是指变量可以使用的范围。局部变量的作用域是从声明该变量开始一直到所有语句块的结束

局部变量的有效范围与局部变量的作用域是不同的,在局部变量的有效范围中,该局部变量是有效的,但不一定可以被使用。

b.生命周期

生命周期是指变量处于“存活”状态的时间长短。局部变量只有在被当次调用期间存在,而在没有被调用期间处于“死亡”状态。

可以让当前没有使用的变量处于“休眠状态“,以减轻硬件的加载负担。

六.全局变量

全局变量又称外部变量,是指在整个程序内都有效的变量。全局变量在函数外部进行声明。全局变量的作用域是从声明该变量开始一直到所有程序结束。

七.递归

在C语言中,使用递归编写程序可以大量减少程序中的代码。

1.什么是递归

递归来源于英文单词recursion,其意思为递推、递归。递归就是按照特定规律将复杂的问题逐步简化的一个过程。递归由递推、终止条件、回溯及递归方式 4个部分组成。 程序调用自身的编程技巧称为递归(recursion)。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义域说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。递归主要思考方式在于:把大事化小
递推:是将复杂数据进行简化的过程。
终止条件:是递推过程的中止界限
回溯:是将简化的所有数据进行回推的过程。
递归方式:是在递推与回溯过程中都要遵循的简化数据和回推数据的规律

2.递归的两个必要条件

存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。

八.库函数

将大量常用的相关函数放在一起,形成一个库(仓库)。其中,将库中的所有函数称为库函数,将仓库称为系统库文件,又称头文件,其文件名后缀为.h。

1.使用库函数

不同的头文件中包含了不同类型的库函数。如果想要使用库函数,就要将对应的头文件引入程序中,引入头文件等于将头文件所包含的所有库函数导入程序中,这时就可以直接调用库函数。

#include

其中 可以用英文双引号代替

#include"文件名"

在引入头文件时,结尾不能加分号

2.常见头文件

C语言提供了很多头文件,不同的编译器支持的头文件不同。下面我们将常用的几个头文件进行展示。

头文件包含的库函数
math.h数字库函数
ctyph.h字符函数与字符串函数
stdio.h输入/输出函数
stdlib.h动态分配函数与随机函数

3.库函数printf()和scanf()

在C语言中,我们常调用的库函数就是stdio.h头文件提供函数printf()与库函数scanf()。

printf("格式化字符串",参量表);

其中格式化字符串包括正常字符与格式化规定字符。正常字符会被原样输出,而格式化规定字符为”%“开头的占位符由斜杠” \ “组成的转义字符,如%d、%c、\n等
参量表是指要输出的一系列参数。参量由表达式组成。参数必须与格式化字符串中的占位符的个数、类型及顺序相符,且每个参数之间用逗号分开。
如果一个格式化字符串中没有占位符,此时参量表可以被省略。

库函数scanf()为输入函数

scanf("格式化字符",参量表);

其中格式化字符由“%”开头的占位符组成。格式化字符规定了用户输入的数据类型,如“%d”表示用户输入的数据类型必须是整型。
如果格式化字符中由多个占位符,他们之间可以用空格或其它符号作为分隔符。
参量表由“&”与参数组成,如&a。参数必须与占位符的个数、类型及顺序相符,每个参数之间用逗号分开。

九.数值运算函数

math.h头文件中的库函数

1.绝对值运算函数

绝对值是指一个数在数轴上所对应点到原点的距离。

函数功能
abs(x)求整数的绝对值
cabs(znum)求复数的绝对值
fabs(s)求双精度的绝对值
labs(x)求长整形的绝对值

2.三角函数运算函数

函数功能
sin(x)求正弦值
cos(x)求余弦值
asin(x)求反正弦值
acos(x)求反余弦值
sinh(x)求双曲正弦值
cosh(x)求双曲余弦值
tan(x)求x的正切值,其中x的单位是弧度
tanh(x)求x的双曲正切值
atan(x)求x的反正切值,其中x的单位是弧度
atan2(y,x)求y/x的反正切
ceil()求出不小于指定值的最小整数(取上整)
floor()求出不大于指定值的最大整数(取下整)
fmod()返回两参数相除的余数,该余数符号与被除数的相同
modf(val,&iptr)把双精度val分解为整数部分和小数部分,把整数部分存到iptr指向的单元
frexp(val,&iptr)把双精度数val分解为位数x和以2为底的指数n,及val=x*2n,将n存放在eqtr指向的变量中。
srand()初始化随机数发生器
rand()产生-90到32767之间的随机整数
ldexp(x,exp)返回x乘以2的exp次幂
log(x)返回x的自然对数
log10(x)返回x的常用对数(底数为10的对数)
sqrt(x)返回x的平方根
exp(x)返回e的x次幂的值
pow(x,y)返回x的y次方的值