数学库常用函数
函数
我们其实已经掌握了一些函数,比如主函数main()。还有其他的函数比如一些库中的函数,例:<stdio.h>头文件对应标准输入输出库中的printf()和scanf()、<stdlib.h>标准库头文件对应的标准库中的srand()和rand(),除此之外在C++中常用的还有数学库函数
C++中常见的数据类型
若想使用数学库函数,首先需导入<math.h>
头文件,当然在C++中也可以导入<cmath>
头文件
常用的数学库函数有:
函数 | 解释 |
---|---|
abs() | 取绝对值 |
ceil() | 向上取整 |
floor() | 向下取整 |
pow() | 指数函数 |
log2() | 对数函数 |
sqrt() | 算术平方根 |
#include <iostream>
#include <cmath>
using namespace std; int main() { int a = -100;cout << abs(a) << endl;double d = 3.14;// 向下取整 cout << floor(d) << endl;// 向上取整 cout << ceil(d) << endl;int m=2, n=10;// m的n次方 cout << pow(m, n) << endl;// 对数函数 2的几次方是1024 cout << log2(1024) << endl;// 算术平方根cout << sqrt(100) << endl; return 0;
}
100
3
4
1024
10
10
实战演练:完全平方数判定
#include <iostream>
#include <cmath>
using namespace std; int main() { int n; cin >> n;double ret = sqrt(n);int i = int(ret);if(i == ret){cout << "yes" << endl;}else{cout << "no" << endl;}return 0;
}
运行结果:
100
yes
函数与递归
函数与自定义函数
函数是一组一起执行一个任务的语句。每个C++程序都至少有一个函数,即主函数main()
,所有简单的程序都可以定义其他额外的函数。
自定义函数的声明要告诉编译器函数的名称、返回值和参数。
自定义函数
自定义函数名字和变量名一样都属于标识符,都必须遵循标识符的命名规则,而且要有意义
比如我们要写一个求和函数,可以起名为sum,再比如我们要写一个我们自己的交换函数,可以起名为mySwap。
无返回值类型void
void function(){cout << "这是一个无返回值类型的函数" << endl;
}
有返回值类型
int function(){cout << "这是一个有返回值类型的函数,返回值为1" << endl;return 1;
}
return的作用
自定义函数的返回值:
- 结束当前函数(return的作用)。
- 将返回值给到被调用的当前函数(返回值的作用)。
主函数的返回值:
- 结束当前程序(return的作用)。
- 一般情况下写为return 0,如果返回了错误码,说明程序崩溃。虽然编译成功,但代码中存在错误(返回值的作用)。
函数的调用
int main(){function_name(arg1, arg2......);
}
有参数
int sum(int a, int b){ // 形参return a + b;
}
自定义函数内的参数成为形参,即形式参数
int main(){int a, b;cout << sum(a, b); // 实参
}
主函数中调用函数传进去的参数为实参,即实际参数
实战演练:
#include <iostream>
#include <cmath>
using namespace std; int myMax(int a, int b){return a > b ? a : b;
}int main() { int a, b; cin >> a >> b;// c++自带的求最大值函数max //cout << max(a, b) << endl;cout << myMax(a, b) << endl;return 0;
}
运行结果:
100 200
200
实战演练:
#include <iostream>
#include <cmath>
using namespace std; long long myPow(int a, int b){long long ans = 1;for(int i=1; i<=b; i++){ans *= a;}return ans;
}int main() { int m, n; cin >> m >> n;//cout << pow(m, n) << endl;cout << myPow(m, n) << endl;return 0;
}
运行结果:
2 10
1024
作用域
作用域
作用域(scope)
,程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。
全局变量、局部变量的作用域
全局变量作用域
主函数外对应的内存区域我们成为全局区,其中全局区定义的变量我们称之为全局变量
全局变量如果未初始化,会自动初始化为0
全局变量作用域为整个C++项目,任何一个函数(局部作用域)均可以访问全局变量
#include <iostream>
using namespace std; // 全局区
// 全局变量如果未初始化,那么会自动初始化为0
// 全局变量作用域作用于整个C++文件,任何一个局部区域都可以访问
int g; void add(){g++;cout << g << endl;
} int main() { g++;cout << g << endl;add();return 0;
}
运行结果:
1
2
局部变量作用域
函数内对应的内存区域我们称为栈区,栈区内定义的变量称为局部变量
局部变量必须初始化
局部变量的作用域为当前函数,各个局部作用域中的变量互不关联
#include <iostream>
using namespace std; void add(){// 局部变量,局部变量必须初始化,局部变量作用域为当前函数下 int a = 200; a++;cout << a << endl;
} int main() { int a = 100;a++;add();cout << a << endl;return 0;
}
运行结果:
201
101
参数的值传递与引用传递
int& 整型引用类型
#include <iostream>
using namespace std; int main() { int b = 100;// int& 整型引用类型 int& a = b; // 给b起了个别名叫aa++;cout << b << endl; return 0;
}
运行结果:
101
实战演练:自定义交换两个变量的函数mySwap()
#include <iostream>
using namespace std; // 引用传参
void mySwap(int& a, int& b){int c = a;a = b;b = c;
}int main() { int a, b; cin >> a >> b; //swap(a, b);mySwap(a, b);cout << a << " " << b;return 0;
}
运行结果:
100 200
200 100
递归
递归
也许我们都听过下面这句话
从前有座山,山里有座庙,庙里有个和尚讲故事,故事内容是,从前有座山,山里有座庙,庙里有个和尚讲故事,故事内容是…
这句话包含了递归技术的思想,所谓递归,就是在自定义函数中调用自己
#include <iostream>
using namespace std; // 递归-在自定义函数中调用自己
void function(){cout << "从前有座山,山里有座庙,庙里有个和尚讲故事,故事内容是:" << endl;function();
} int main() { function();return 0;
}
实战演练:递归打印1-n
#include <iostream>
using namespace std; // 递归
int n;
void function(int i){if(i >= n) return; // 结束当前函数 cout << i << " ";i++; function(i);
} int main() { cin >> n;int i = 1; function(i);return 0;
}
运行结果:
10
1 2 3 4 5 6 7 8 9