CSP-J 入门级 · CSP 2023 入门级第一轮 第 16 题

阅读程序 · 答案 AB · 考点:函数定义与调用、基本数据类型、运算符与表达式、输入输出

← 整套速查表 CSP-J 入门级 全部真题

题目

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

1.

#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 时,输出为( )

答案:AB

考点

函数定义与调用基本数据类型运算符与表达式输入输出

解题思维

这题考海伦公式求三角形面积。拿到题先看库函数 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,这是最隐蔽的错误点。

逐题推演

判断题 1:输入 2 2 2

三边相等,构成等边三角形。 $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(正确)。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断