函数分类
从用户使用的角度看,函数有两种:
(1) 系统函数,即库函数。这是由编译系统提供的,用户
不必自己定义这些函数,可以直接使用它们。
(2) 用户自己定义的函数。用以解决用户的专门需要。
用户在设计程序时,可以将完成某一相对独立功能的程序定义为一
个函数。用户在程序中,根据应用的需要,由用户自己定义函数,
这类函数称为用户自定义的函数。
库函数是C++编译系统已预定义的函数,用户根据需要可以
直接使用这类函数。库函数也称为标准函数。
•C++把一些常用函数作为库函数提供给用户,用户可以直
接使用系统提供的库函数:
•数学计算函数(如sqrt()、pow(),fabs(),exp()等, cmath)
•字符串处理函数(string)
•标准输入输出函数等(iostream),
•用户使用任一库函数时,直接使用,不用定义,但在程序
中必须包含相应的头文件。
如 #include等。
标准函数/库函数
定义有参函数的一般形式
类型标识符函数名(形式参数表列)
{声明部分
语句
}
int max(int x,int y)
{int z;
z=x>y?x:y;
return (z);
}
C++要求在定义函数时必须指定函数的类型。
函数参数和函数的值
.1 形式参数和实际参数 在定义函数时函数名后面括号中的变量名称为形式参数(formal parameter,简称形参)。
形参是被调函数中的变量;
在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为实际参数
(actual parameter,简称实参)。
实参是主调函数赋给被调函数的特定值。
实参可以是常量、变量或复杂的表达式,不管是哪种情况,在调用时实参必须是一个确定的值。
例:比较两个数并输出大者
#include <iostream>
using namespace std;
int max(int x,int y)
{int z;
z=x>y?x:y;
return(z);
}
int main( )
{int a,b,c; cin>>a>>b;
c=max(a,b);
cout<<"max="<<c<<endl;
return 0;
}
```
***说明:***
1、在函数调用前,形参并不占内存的存储单元,只有在函
数开始调用时,形参才被分配内存单元。调用结束后,形
参所占用的内存单元被释放。
2、实参可以是常量、变量或表达式,但要求有确定的值。

3、实参变量对形参变量的数据传递是"值传递",即单向传
递,只由实参传给形参,而不能由形参传回来给实参。在
内存中实参、形参分占不同的单元。
实参与形参一一对应,类型应相同或赋值兼容。
4、不同的函数中可以使用相同的变量名和形参名,他们是
不同的变量。
### 函数的返回值
函数的返回值通过return语句获得。函数只能有唯一的返回值。
函数返回值的类型就是函数的类型。
return语句可以是一个表达式,函数先计算表达式后再返回值。
return语句还可以终止函数,并将控制返回到主调函数。
return 语句之后的代码是不能执行的代码。
一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。

不带返回值的函数可说明为void型。
函数的类型与函数参数的类型没有关系。
double blink ( int a, int b)
如果函数的类型和return表达式中的类型不一致,则以函数的类型为准。函数的类型决定返回值的类型。对数值
型数据,可以自动进行类型转换。
既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。
int max (float a, float b) // 函数值为整型
函数返回值的类型,也是函数的类型。
## 函数的调用
##### 函数调用的方式
按函数在语句中的作用来分,可以有以下3种函数调用方式:
1. 函数语句
把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定的操作。printstar();
2. 函数表达式
函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如c=2*max(a,b);
3. 函数参数
函数调用作为一个函数的实参。如
m=max(a,max(b,c));
对被调用函数的声明和函数原型
##### 在一个函数中调用另一个函数需要具备条件:
(1) 首先被调用的函数必须是已经存在的函数。
(2) 如果使用库函数,应用#include命令将有关头文件
"包含"到本文件中来。
(3) 如果使用用户自定义的函数,函数调用遵循先定义、
后调用的原则,即
被调函数应出现在主调函数之前;
如果被调用函数出现在主调函数之后,则函数必须在主调函数
之前进行声明。
如果使用用户自己定义的函数,而该函数与调用它的函数
(即主调函数)在同一个程序单位中且位置在主调函数之后
则必须在调用此函数之前对被调用的函数作声明。
float add(float a,float b );
函数声明的一般形式(又称为函数原型):
函数类型 函数名(参数类型1,参数类型2…);
函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2…);
float add(float ,float );
函数声明的位置可以在调用函数所在的函数中,也可以在函数之外。

***函数的嵌套调用***
C语言中,所有函数都是平行独立的,无主次、相互包含之分。
函数可以嵌套调用,不可嵌套定义。
***函数的递归调用***

例: 有5个人坐在一起,
问第5个人多少岁,他说比第4个人大2岁。
问第4个人多少岁,他说比第3个人大2岁。
问第3个人多少岁,他说比第2个人大2岁。
问第2个人多少岁,他说比第1个人大2岁。
问第1个人多少岁,他说是10岁。
请问第5个人多大?
用式子表述:
age(n)=10 (n=1)
age(n)=age(n-1)+2 (n>1)

猴子吃桃问题。猴子第1天摘下N个桃子,当时就吃了一半,还 不过瘾,就又吃了一个。第2天又将剩下的桃子吃掉一半,又多 吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天 再想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?
分析:
设f(m)第m天吃桃前桃子数
f(10)=1;
f(9)=(f(10)+1)*2=4
f(8)=(f(9)+1)*2=10
f(7)=(f(8)+1)*2=22
……
f(1)=(f(2)+1)*2=?
用式子表述:
f(n)=1 (n=10)
f(n)=(f(n+1)+1)*2 (n>=1)
f(n)=1 (n=10)
f(n)=(f(n+1)+1)*2 (n<10)
#include
using namespace std;
int f(int n)
{ int c;
if (n==10) c=1;
else
c=(f(n+1)+1)*2;
return c;
}
void main(void)
{ int f(int);
cout<<f(1)<<endl;
}
### 局部变量全局变量
在函数内定义的变量是局部变量
在函数之外定义的变量是外部变量,称为全局变
量(global variable,也称全程变量)。
全局变量的有效范围为从定义变量的位置
开始到本源文件结束。
***说明:***
(1) 设全局变量的作用是增加函数间数据联系的渠道。
(2) 建议不在必要时不要使用全局变量,因为:
① 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
② 它使函数的通用性降低了
③ 使用全局变量过多,会降低程序的清晰性。
(3) 如果在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽,即它不起作用。