阅读程序 · 答案 AB · 考点:函数定义与调用、基本数据类型、运算符与表达式、输入输出
← 整套速查表 CSP-J 入门级 全部真题#include<iostream>
#include<cmath>
using namespace std;
double f(double a,double b,double c){
double s=(a+b+c)/2;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
int main(){
cout.flags(ios::fixed);
cout.precision(4);
int a,b,c;
cin>>a>>b>>c;
cout<<f(a,b,c)<<endl;
return 0;
}假设输入的所有数都为不超过 $1000$ 的正整数,完成下面的判断题和单选题:
1. (2分)当输入为 2 2 2 时,输出为1.7321( )
2. (2分)将第7行中的 (s-b)*(s-c) 改为 (s-c)*(s-b) 不会影响程序运行的结果( )
3. (2分)程序总是输出四位小数( )
4. 当输入为 3 4 5 时,输出为( )
5. 当输入为 5 12 13 时,输出为( )
这题考海伦公式求三角形面积。拿到题先看库函数 sqrt 和 cout 的格式控制,再代入数字算半周长 s 和面积 S。注意乘法交换律、输出精度以及不能构成三角形时 sqrt 会变 NaN。
判断题3最容易错,以为 cout.precision(4) 就保证所有输出都是四位小数,其实当三边构不成三角形时 s-s-a 等项会出现负数,sqrt 得到 NaN,输出就不是四位小数了。另外单选题算面积时容易把根号漏掉或算错半周长,导致选项选偏。
这道题考查海伦公式(Heron's Formula)、基本数据类型、运算符与表达式、函数定义与调用以及输入输出格式控制。
海伦公式:已知三角形三边长 a、b、c,半周长 $s = \frac{a+b+c}{2}$,面积 $S = \sqrt{s(s-a)(s-b)(s-c)}$。程序里用 sqrt 开方,用 cout.flags(ios::fixed) 和 cout.precision(4) 把结果固定为小数点后4位。
命题人喜欢在这里挖两个坑: 1. 乘法顺序:(s-b)*(s-c) 改成 (s-c)*(s-b),考察学生是否理解乘法交换律,很多初学者会下意识觉得“顺序变了结果就变”。 2. 输出格式陷阱:cout.precision(4) 只控制数值型输出的小数位数,当 sqrt 出现 NaN 时,输出不再是四位小数,而是 NaN,这是最隐蔽的错误点。
三边相等,构成等边三角形。 $s = (2+2+2)/2 = 3$。 $S = \sqrt{3 \times (3-2) \times (3-2) \times (3-2)} = \sqrt{3 \times 1 \times 1 \times 1} = \sqrt{3} \approx 1.73205...$ 保留四位小数后是 1.7321,输出正确。 答案:A(正确)。