一、概要(函数--程序的功能模块)
1.函数的定义和调用
2.内联函数
3.constexpr函数(常量表达函数)
4.带默认参数值的函数
5.函数重载
6.c++系统函数
二、函数的定义
-函数名
-函数的参数
-函数的返回值(可以没有)
1.语法形式
类型标识符 函数名(形式参数表)
{
语句序列
}
--形参表:每个参数都可以为不同类型(只在函数体内部使用,相当于局部变量)
三、函数的调用
--调用前先声明函数原型:类型标识符 被调用函数名(含函数说明的形参表)
--函数调用形式:函数名(实参表)
--嵌套调用
--递归调用:函数自己调用自己
实例3.1:求x^n的函数
double power(double x, int n)
{
double vla = 1.0;
while (n--)
vla *= x;
return vla;
}
int main()
{
double pow;
pow = power(2.3541, 155);
cout << "2.3541 to the power 155 is " << pow << endl;
return 0;
}
实例3.2 编写程序求π的值。π的计算公式如下: π=16arctan(1/5)-4arctan(1/239)
其中arctan x=x-x^3/3+x^5/5-x^7/7+...
double power(double x, int n)
{
double vla = 1.0;
while (n--)
vla *= x;
return vla;
}
double arg(double x)
{
double vla = 0;
int i = 1,j;
while (1.0*power(x, i) / i >1e-15)
{
i++;
i++;
}
for (int s = 1; s < i; s = s + 2)
{
j = (s - 1) / 2;
vla +=power(-1,j)* power(x, s)/s;
}
return vla;
}
int main()
{
double pai;
pai = 16.0*arg(1.0 / 5.0) - 4.0*arg(1.0 / 239.0);
cout << "pai is " << pai << endl;
return 0;
}
实例3.3 寻找并输出11-999之间的数m,它满足m、m^2、m^3均为回文数(回文:各位数字左右对称的整数)
int huiwen(int checker)
{
int p, ch=0,yuan;
yuan = checker;
while (yuan)
{
p = yuan % 10;
yuan = yuan / 10;
ch = ch * 10 + p;
}
if (ch == checker) return 1;
else return 0;
}
int panduan(int cl)
{
if (huiwen(cl) && huiwen(cl*cl) && huiwen(cl*cl*cl)) return 1;
else return 0;
}
int main()
{
cout << "The huishu are " << endl;
for (int i = 11; i < 1000; i++)
if (panduan(i)) cout << i << " " << endl;
return 0;
}
四、函数的递归和嵌套调用
1.递归调用(调用本身)
2.嵌套调用
实例3.4 用递归法计算从n个人中选择k个人组成一个委员会的不同组合数
int zuheshu(int n, int k)
{
int s;
if (n == k || k == 0)s = 1;
else s = zuheshu(n - 1, k) + zuheshu(n - 1, k - 1);
return s;
}
int main()
{
cout << "The 30 people of 500 people is " << zuheshu(500, 30) << endl;
return 0;
}
实例3.5 有三根针 A、 B、 C。 A 针上有 N 个盘子,大的在下,小的在上,要求把这 N 个盘子从 A 针移到 C 针,在移动过程中可以借助 B 针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
将 n 个盘子从 A 针移到 C 针可以分解为三个步骤:
将 A 上 n-1 个盘子移到 B 针上(借助 C 针);
把 A 针上剩下的一个盘子移到 C 针上;
将 n-1 个盘子从 B 针移到 C 针上(借助 A 针)
程序略
五、函数的参数传递
--实参
--形参
六、引用类型(引用传递?)
引用类型(&)是标识符的别名(必须对引用进行初始化)
--一旦初始化,两者就直接进行了绑定,在之后的赋值中两者是一起发生变化的。
--引用可以作为形参
实例3.6 输入两个整数并进行交换(值传递)
void swap(int a, int b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int x = 5, y = 10;
cout << "x=" << x << "y=" << y << endl;
swap(x, y);
cout << "x=" << x << "y=" << y << endl;
return 0;
}
输出:
void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int x = 5, y = 10;
cout << "x=" << x << "y=" << y << endl;
swap(x, y);
cout << "x=" << x << "y=" << y << endl;
return 0;
}
输出:
(单向传递和双向传递!!)
七、特殊函数
1、含有可变参数的函数initializer_list(参数数量不确定)--参数类型相同
比如:初始化 --initializer_list<string> ls;
2、内联函数inline --编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。
--不能有循环语句和swtich语句
--定义必须在内联函数第一次被调用前
--对内联函数不能进行异常接口说明
实例3.7 计算圆的面积
const double PI = 3.141592653;
inline double calArea(double r)
{
return PI*r*r;
}
int main()
{
double r = 3.1;
double area = calArea(r);
cout << area << endl;
return 0;
}
3、constexpr函数--常量表达式函数
--在所有参数都是constexpr时,一定返回constexpr
4、带默认参数值的函数
--有默认参数的形参必须列在形参列表的最右,即默认参数值的右面不能有无默认值的参数;
--调用时实参与形参的结合次序是从左向右
实例3.8 计算长方体体积
--有三个形参:length(长)、width(宽)、height(高),其中 width 和 height带有默认值 2 和 3。
--主函数中以不同形式调用 getVolume 函数
int getVolume(int length, int width = 2, int height = 3);
int main() {
const int X = 10, Y = 12, Z = 15;
cout << "Some box data is " ;
cout << getVolume(X, Y, Z) << endl;
cout << "Some box data is " ;
cout << getVolume(X, Y) << endl;
cout << "Some box data is " ;
cout << getVolume(X) << endl;
return 0;
}
int getVolume(int length, int width, int height) {
cout << setw(5) << length << setw(5) << width << setw(5) << height << '\t';
return length * width * height;
}
八、函数重载--功能相近的函数在相同的作用域中以相同函数名声明
注意:--重载函数的形参必须不同:个数不同或类型不同;
--编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数
--不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆
九、C++系统函数