数学库常用函数
函数
我们其实已经掌握了一些函数,比如主函数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起了个别名叫a
a++;
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