本讲定位:二级的最后一讲,内容最轻松,但坑最密集。官方大纲把五个函数点了名——
abs()、sqrt()、max()、min()、rand()/srand()——并要求”理解相应的算法原理”。这五个函数本身两分钟就能学会,真正要花时间的是它们的边界行为:sqrt的返回值是double、max的两个参数类型必须一致、rand不设种子每次结果都一样。这些坑在客观题里是送命题,在编程题里是隐形失分。对应官方大纲:二级知识块 8「数学函数」——绝对值函数
abs()、平方根函数sqrt()、最大值函数max()、最小值函数min()、随机数函数rand()/srand()及相关。前置知识:一级第 04 讲(数据类型)、二级第 05 讲(类型转换——本讲一半的坑都源于类型)。
代码说明:本讲所有代码均已用 g++ 11.5(
-std=c++11)编译运行验证,输出结果即为文中标注结果。
第一道(单选):
下列语句中,会导致编译错误的是( ) A.
cout << max(3, 7);B.cout << sqrt(16.0);C.int a = 1; double b = 2.0; cout << max(a, b);D.cout << abs(-5);
第二道(判断):
在没有调用
srand()的情况下,程序每次运行时rand()产生的随机数序列是不同的。( )
答案:第一道选 C,第二道错误。
max 的两个参数类型必须完全相同,int 和 double 混用编译不过。srand(),每次运行得到的序列完全一样——这是”伪随机”的本质。这两道题就是本讲的两大坑区:类型和随机数种子。
| 函数 | 头文件 | 备注 |
|---|---|---|
abs(整数) |
<cstdlib> |
C++11 起 <cmath> 也提供 |
fabs(浮点) |
<cmath> |
|
sqrt、pow、floor、ceil、round |
<cmath> |
|
max、min |
<algorithm> |
⚠️ 不在 <cmath> 里 |
rand、srand、RAND_MAX |
<cstdlib> |
|
time(配合 srand 用) |
<ctime> |
💡 省事的做法:把常用的几个一次性写全。本课程推荐的二级标准头:
#include<iostream> #include<cmath> #include<algorithm> #include<cstdlib> using namespace std;⚠️ 最容易漏的是
<algorithm>——学生用max时常忘记它,报错信息是'max' was not declared in this scope。看到这个报错,第一反应就是补<algorithm>。📌 竞赛里常用
#include <bits/stdc++.h>一次性包含全部,但它不是标准写法,某些编译器不支持。GESP 考场用 Dev-C++(g++)通常可用,但本课程仍建议逐个写清楚。
abs 与 fabs#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
int main() {
cout << abs(-7) << " ";
cout << fabs(-7.5) << " ";
cout << abs(-7.5) << endl;
return 0;
}
输出:
7 7.5 7.5
| 函数 | 用于 | 返回 |
|---|---|---|
abs(x) |
整数 | 整数 |
fabs(x) |
浮点数 | double |