如果用三个 int 类型的变量 a、b 和 h 分别表达梯形的上底、下底和高的长度,则下列哪个表达式可以用来计算梯形的面积?( )
这题就是考梯形面积公式和整数除法陷阱。拿到题先背公式 S=(a+b)×h/2,然后立刻问自己:a、b、h 都是 int,直接写 h*(a+b)/2 行不行?不行,因为整数除法会丢精度,必须把 2 换成浮点数 0.5,或者先乘再除。
最容易掉进 A 的坑里,觉得公式对就对,完全没看数据类型。其实 int/int 在 C++ 里就是整数除法,余数直接扔掉,(a+b)是奇数时结果就少 0.5。另外 C 和 D 是把 b 的位置放错了,梯形面积公式里 b 是和 a 一起求和的,不是单独加在后面,这两个选项纯粹是公式记混了。
《GESP C++ 二级》「基础运算与数据类型」,核心就是整数除法截断与浮点运算的区别。命题人专门卡住那些「背了公式但没看数据类型」的考生。
梯形面积公式为 S = (a + b) × h / 2。当 a、b 为奇数时,(a+b) 是偶数,除以 2 没问题;但当 a+b 为奇数时,(a+b)/2 会产生 0.5 的小数部分。如果 a、b、h 都是 int 类型,表达式 h * (a + b) / 2 中,先算乘法得到 int,再除以 int 2,C++ 的整数除法会直接截断小数部分,导致结果少 0.5,精度丢失。
拿到题先想:公式对吗?对,是 (a+b)×h/2。然后立刻检查变量类型:都是 int。那直接写 h*(a+b)/2 行不行?不行,整数除法会丢精度。怎么改?把除数 2 换成浮点数 0.5,或者先乘再除时确保中间结果是浮点。选项 B 是 0.5 * h * (a + b),这里 0.5 是 double,整个表达式变成浮点运算,结果精确。
A 项:h * (a + b) / 2,看似公式对,但整数除法截断,是典型陷阱。C 项:0.5 * (h * a + b),把 b 单独加,不符合梯形面积公式。D 项:0.5 * h * a + b,同样错误地把 b 当作常数项。命题人利用「会背公式不会看数据类型」的思维定式。
整数除法截断!int/int 结果是 int。要得到精确结果至少一个操作数为浮点类型。本题正确答案是 B,因为 0.5 强制了整个表达式为浮点运算,避免了精度丢失。
基本数据类型考过 267 题,逐年分布:2013 年 1 题、2016 年 1 题、2019 年 3 题、2023 年 63 题、2024 年 34 题、2025 年 26 题、2026 年 119 题、null 年 20 题;分赛事:GESP 一级 81 题、GESP 二级 48 题、GESP 四级 40 题、GESP 三级 38 题、GESP 五级 21 题、GESP 六级 18 题、GESP 七级 9 题、CSP 入门级 5 题、GESP 八级 3 题、CSP 提高级 2 题、NOIP 提高组 初赛 1 题、NOIP 普及组 初赛 1 题。运算符与表达式考过 261 题,逐年分布:2007 年 4 题、2008 年 1 题、2009 年 4 题、2010 年 5 题、2014 年 1 题、2019 年 3 题、2020 年 2 题、2021 年 1 题、2022 年 1 题、2023 年 91 题、2024 年 41 题、2025 年 61 题、2026 年 14 题、null 年 32 题;分赛事:GESP 一级 72 题、GESP 二级 70 题、GESP 三级 47 题、GESP 四级 37 题、CSP 入门级 12 题、NOIP 普及组 初赛 9 题、CSP 提高级 7 题、NOIP 提高组 初赛 6 题、GESP 五级 1 题。
从数据看,2026 年基本数据类型和运算符与表达式的考频都极高(119 题和 14 题),说明这类「数据类型陷阱」是近年高频考点。未来可能继续用几何公式(梯形、平行四边形、圆面积)结合 int 变量来挖整数除法坑,或者在更复杂的表达式里混合 int 和 double 考察优先级与类型转换。暂无足够依据预测具体形式,但「公式对但实现错」的思路定式大概率还会反复出现。