CSP-J 2023 入门级 第一轮 阅读程序(1)

文章介绍了CSP-J2023编程语言中的一个示例,展示了如何使用海伦公式计算三角形面积,涉及输入验证、输出格式设置和数学原理的应用。

【题目】

CSP-J 2023 入门级 第一轮 阅读程序(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的正整数,完成下面的判断题和单选题:
判断题:
16. 当输入为"2 2 2"时,输出为"1.7321"( )
17. 将第7行中的"(s-b)*(s-c)“改为”(s-c)*(s-b)"不会影响程序运行的结果( )
18. 程序总是输出四位小数( )
单选题
19. 当输入为"3 4 5"时,输出为( )
A. “6.0000” B. “12.0000” C. “24.0000” D. “30.0000”
20. 当输入为"5 12 13"时,输出为( )
A. “24.0000” B. “30.0000” C. “60.0000” D. “120.0000”

【题目考点】

1. 数学
  • 海伦公式
    三角形三条边边长分别为:a, b, c
    三角形半周长:p=(a+b+c)/2p = (a+b+c)/2p=(a+b+c)/2
    三角形面积:S=p(p−a)(p−b)(p−c)S = \sqrt{p(p-a)(p-b)(p-c)}S=p(pa)(pb)(pc)
  • 勾股数
    满足a2+b2=c2a^2+b^2=c^2a2+b2=c2的三个数字
    常见的勾股数有:3 4 5, 6 8 10, 5 12 13…

【解题思路】

先看f函数

double f(double a, double b, double c) {
    double s = (a + b + c) / 2;
    return sqrt(s * (s - a) * (s - b) * (s - c));
}

很明显,a,b,c是三角形的三条边,s是半周长,f函数为使用海伦公式求三角形的面积。

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;
}

主函数中前两句是用于设定浮点数输出格式,输出时固定保留4位小数,最后一位四舍五入,不足4位则补0。
而后输入三角形三条边长,输出三角形面积。
注意:虽然本题使用了海伦公式求三角形面积,但具体在做题时,我们可以通过自己熟悉的或更方便的方法求三角形面积。

判断题
16. 当输入为"2 2 2"时,输出为"1.7321"( )

答:T
边长为2的等边三角形,高为22−12=3\sqrt{2^2-1^2}=\sqrt{3}2212=3,面积为S=2∗3/2=3S=2*\sqrt{3}/2=\sqrt{3}S=23/2=33\sqrt{3}3保留4位小数就是1.7321。
如果忘了3\sqrt{3}3的值了,针对这个问题,可以求一下1.732102≈3.0002>31.73210^2 \approx 3.0002> 31.7321023.0002>31.732052≈2.999997<31.73205^2\approx 2.999997 < 31.7320522.999997<3,所以1.73205<3<1.732101.73205 < \sqrt{3} < 1.732101.73205<3<1.73210,四舍五入到小数点后第四位,得到3≈1.7321\sqrt{3}\approx 1.732131.7321

  1. 将第7行中的"(s-b)*(s-c)“改为”(s-c)*(s-b)"不会影响程序运行的结果( )

答:T
乘法交换律,两个数字相乘,交换顺序结果不变。

  1. 程序总是输出四位小数( )

答:F
cout.flags(ios::fixed);cout.precision(4);运行这两句后,设置了输出浮点数的格式为保留4位小数输出。
但是题目没有给定输入数据的范围,输入的三个数字可能会:两边之和小于等于第三边而无法构成三角形。如果a+b<ca+b<ca+b<c,则s=(a+b+c)/2<cs=(a+b+c)/2 < cs=(a+b+c)/2<cs−c<0,s−a>0,s−b>0s-c<0,s-a>0,s-b>0sc<0sa>0sb>0,会导致s(s−a)(s−b)(s−c)<0s(s-a)(s-b)(s-c)<0s(sa)(sb)(sc)<0,在使用海伦公式s(s−a)(s−b)(s−c)\sqrt{s(s-a)(s-b)(s-c)}s(sa)(sb)(sc)时无法对负数开根号,该程序如果运行,会输出nan。

单选题
19. 当输入为"3 4 5"时,输出为( )
A. “6.0000” B. “12.0000” C. “24.0000” D. “30.0000”

答:A
3 4 5是勾股数,边长为3 4 5的三角形是直角三角形,直角边为3 4,面积为:S=3∗4/2=6S=3*4/2=6S=34/2=6

  1. 当输入为"5 12 13"时,输出为( )
    A. “24.0000” B. “30.0000” C. “60.0000” D. “120.0000”

答:B
5 12 13是勾股数,边长为5 12 13的三角形是直角三角形,直角边为5 12,面积为:S=5∗12/2=30S=5*12/2=30S=512/2=30

【答案】

  1. T
  2. T
  3. F
  4. A
  5. B
由于没有直接获取到完整的CSP - J 2023入门级第一轮初赛答案及解析的详细内容,不过可以先对提供的代码进行分析。 ### 代码功能概述 这段代码的功能是根据输入的三角形三条边的长度,计算并输出该三角形的面积。 ### 代码详细解析 ```cpp #include <iostream> #include <cmath> using namespace std; // 定义函数f,用于计算三角形的面积 double f(double a, double b, double c) { // 计算半周长s double s = (a + b + c) / 2; // 使用海伦公式计算三角形面积 return sqrt(s * (s - a) * (s - b) * (s - c)); } int main() { // 设置输出格式,固定小数点后4位 cout.flags(ios::fixed); cout.precision(4); // 定义三个整数变量a, b, c用于存储输入的边长 int a, b, c; // 从标准输入读取三个整数分别赋值给a, b, c cin >> a >> b >> c; // 调用函数f计算三角形面积并输出,结果保留4位小数 cout << f(a, b, c) << endl; return 0; } ``` ### 复杂度分析 - **时间复杂度**:该程序的时间复杂度为$O(1)$,因为代码中只涉及到简单的算术运算和函数调用,不随输入规模的增大而变化。 - **空间复杂度**:空间复杂度同样为$O(1)$,只使用了固定的额外变量来存储中间结果和输入值。 ### 注意事项 -程序假设输入的三条边能够构成一个合法的三角形。如果输入的边长不能构成三角形,例如`a + b <= c`,则计算结果可能没有实际意义。 - 由于输入的是整数类型,在计算过程中会自动转换为双精度浮点数进行计算。 ### 示例运行 假设输入`3 4 5`,程序将计算并输出以3、4、5为边长的三角形的面积。根据海伦公式,半周长$s=(3 + 4 + 5)/2 = 6$,面积$S = \sqrt{6\times(6 - 3)\times(6 - 4)\times(6 - 5)}=\sqrt{6\times3\times2\times1}=6$,程序输出结果为`6.0000`。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值