CC++ & Algorithm

C++最大值与最小值 max/min

中等21
语言版本:C++Python
概述:像比较两个人的身高一样,max和min函数能快速告诉你哪个数更大或更小。

C++最大值与最小值 max/min:轻松找出谁大谁小

在学习和生活中,我们经常需要比较大小——比如比身高、比分数、比零花钱。C++里有两个特别方便的函数:maxmin,它们就像一把“快速比较尺”,能立刻告诉你两个数中哪个更大(max)或哪个更小(min)。

这两个函数住在 <algorithm> 头文件里,可以帮我们比较整数、小数、字符,甚至字符串(按字母顺序)。你只要把两个要比较的值放进括号里,它就会把“赢家”或“输家”返回给你。

比比谁更大 —— max 和 min 的用法

想象一下,体育课上测跳远:小明跳了3.2米,小红跳了2.8米。谁跳得更远?当然是小明。在代码里,我们就可以用 max(3.2, 2.8) 来得到3.2这个结果。

max(a, b) 返回 a 和 b 中较大的那个值,min(a, b) 返回较小的那个值。两个参数的类型要一致(都是整数、或都是小数、或都是字符等)。

看一个简单的学生成绩比较例子:

#include <iostream>
#include <algorithm>   // 引入max和min函数
using namespace std;

int main() {
    int score1 = 85, score2 = 92;           // 两个同学的成绩
    int highest = max(score1, score2);      // 最高分
    int lowest  = min(score1, score2);      // 最低分
    cout << "最高分: " << highest << endl;
    cout << "最低分: " << lowest << endl;
    return 0;
}

运行结果:

最高分: 92
最低分: 85

是不是很直观?就像老师直接告诉你答案一样。

还可以比较三个数吗?—— 嵌套使用

如果要从三个数里找最大值,可以用两次 maxmax(a, max(b, c))。原理是先把后两个数比出大的那个,再和第一个数比。同样,找最小值要用两次 min

贴近生活的例子:三个朋友小明、小红、小刚的钱分别是10元、20元、5元。谁的钱最多?我们就用 max(10, max(20, 5)) 来算。

int a = 10, b = 20, c = 5;                    // 三个人的零花钱(单位:元)
int biggest = max(a, max(b, c));               // 钱最多的那个人有多少?答案是20
int smallest = min(a, min(b, c));              // 钱最少的呢?答案是5

如果还想找第四个数,可以继续嵌套:max(a, max(b, max(c, d)))。这样层层比较,就像淘汰赛一样,最终决出冠军。

还能比字符和字符串?

是的!字符比较的是它们的 ASCII 码值。比如 'A' 是65,'B' 是66,所以 max('A', 'B') 返回 'B'。字母顺序和字典序一致,所以 max("apple", "banana") 返回 "banana"(因为b在a后面)。

char char1 = 'X', char2 = 'M';                // 两个字母
char bigger_char = max(char1, char2);         // 'X'的ASCII码88 > 'M'的77,所以是'X'
cout << "较大的字母是: " << bigger_char << endl;

新手容易犯的错误

  1. 参数类型不匹配
    max(10, 3.5) 中一个是 int,一个是 double,编译器会报错或警告。一定要保持类型一致,比如统一用 doublemax(10.0, 3.5)

  2. 忘记包含头文件
    如果没写 #include <algorithm>,编译器就不认识 maxmin,会报“未定义的标识符”错误。别忘了在程序最前面加上它。

  3. 误用成 maxmin 作为变量名
    有些同学可能会写 int max = 5;,这样就把函数名覆盖了,后面再想用 max(a,b) 就会出错。建议不要用 max min 当变量名。

  4. 比较三个数时括号写错
    max(a, max(b, c)) 是正确的,但有人写成 max(a, b, c) —— 这是错误的,因为 max 一次只能比较两个数。三个数要像套娃一样嵌套。

完整可运行的示例:运动会成绩统计

假设学校运动会三个项目:跳远(米)、跑步(秒,越小越好)、掷铅球(米)。我们想输出每个项目的最好成绩和最差成绩。

#include <iostream>
#include <algorithm>   // 使用max和min
using namespace std;

int main() {
    // 三人的跳远成绩(米)
    double longJump1 = 3.2, longJump2 = 2.8, longJump3 = 4.1;
    double bestJump = max(longJump1, max(longJump2, longJump3));   // 最好成绩
    double worstJump = min(longJump1, min(longJump2, longJump3));  // 最差成绩
    cout << "跳远最好成绩: " << bestJump << " 米" << endl;
    cout << "跳远最差成绩: " << worstJump << " 米" << endl;

    // 三人的100米跑秒数(越小越好)
    double run1 = 12.5, run2 = 13.2, run3 = 11.8;
    // 注意:跑步是时间越短越好,但max/min只比较数值大小
    // 这里我们用 min 找最快(时间最小),用 max 找最慢(时间最大)
    double fastest = min(run1, min(run2, run3));    // 最快成绩(最小秒数)
    double slowest = max(run1, max(run2, run3));    // 最慢成绩(最大秒数)
    cout << "跑步最快时间: " << fastest << " 秒" << endl;
    cout << "跑步最慢时间: " << slowest << " 秒" << endl;

    // 三人的铅球成绩(米)
    double ball1 = 8.5, ball2 = 7.2, ball3 = 9.0;
    double bestBall = max(ball1, max(ball2, ball3));
    double worstBall = min(ball1, min(ball2, ball3));
    cout << "铅球最好成绩: " << bestBall << " 米" << endl;
    cout << "铅球最差成绩: " << worstBall << " 米" << endl;

    return 0;
}

运行结果:

跳远最好成绩: 4.1 米
跳远最差成绩: 2.8 米
跑步最快时间: 11.8 秒
跑步最慢时间: 13.2 秒
铅球最好成绩: 9 米
铅球最差成绩: 7.2 米

相关指引

  • 想自己写比较逻辑?可以学学条件语句 if-else,或用三目运算符 a>b ? a : b
  • 如果要从一组数(比如数组)里找最大最小值,可以用循环配合 max,或者直接用 *max_element*min_element(也在 <algorithm> 中)。
  • 学完基础比较,可以挑战排序sort 函数),把一堆数字按顺序排好。

掌握了 maxmin,以后遇到“谁最高、谁最低”的问题,写一行代码就搞定啦!

例题精讲

1单选题

已知 int x = 10, y = 20; 则 max(x, y) 的返回值是?

A10
B20
C30
D无定义
2判断题

max 和 min 函数只能用于 int 类型的变量。

3填空题
以下程序从键盘输入两个整数,输出较小的数。请填空。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int a, b;
    cin >> a >> b;
    cout << ___(a, b);
    return 0;
}
4单选题

哪个头文件包含了 max 和 min 函数?

A<iostream>
B<cmath>
C<algorithm>
D<cstdlib>
5填空题
以下程序输出三个整数中的最大值,请填空。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int a=10, b=25, c=18;
    int m = max(a, ___(b, c));
    cout << m;
    return 0;
}