【C++】实现三角形面积计算的比较与拓展分析

发布于:2024-12-06 ⋅ 阅读:(112) ⋅ 点赞:(0)

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++


在这里插入图片描述


💯前言

  • 本文旨在深入探讨如何利用海伦公式计算三角形面积的编程实现问题。
    我们将详细分析基于C++C语言的两种解法,并从计算效率代码风格输入输出的便利性等多个角度进行比较。 这些比较将有助于全面理解两种编程语言在解决特定问题时的特点优劣 此外,本文还将讨论如何进一步优化这些实现,包括增加输入合法性检查以及改进代码可读性等。 通过这些内容本文希望读者能够从理论和实践两个层面深入理解三角形面积计算的实现
    C++ 参考手册
    在这里插入图片描述

💯题目描述

三角形面积
在这里插入图片描述

给定一个三角形的三边长分别为 a a a b b b c c c,要求通过输入这三个边长来计算三角形的面积。依据海伦公式,三角形面积 s s s 可通过以下公式计算:

s = p ⋅ ( p − a ) ⋅ ( p − b ) ⋅ ( p − c ) s = \sqrt{p \cdot (p - a) \cdot (p - b) \cdot (p - c)} s=p(pa)(pb)(pc)

其中, p p p 表示半周长:

KaTeX parse error: Unexpected character: ' ' at position 8: p = ̲rac{a + b + c}{…

输入格式:

  • 输入包含一行,三个实数 a a a b b b c c c,以空格分隔。

输出格式:

  • 输出一个实数,表示三角形面积,保留到小数点后1位。

输入输出样例:

  • 输入:
    3 4 5
    
  • 输出:
    6.0
    

说明/提示:

  • 数据保证能够构成一个合法的三角形。
  • 0 ≤ a , b , c ≤ 1000 0 \le a, b, c \le 1000 0a,b,c1000,每个边长的输入精度不超过两位小数。

sqrt 函数介绍

这里介绍用于计算平方根的库函数sqrt,函数原型如下:

1 double sqrt(double x);
2 float sqrt(float x);
3 long double sqrt(long double x);

函数用于计算参数x的平方根并返回结果。需要包含头文件<cmath>
在这里插入图片描述


💯C++ 解法分析

首先展示基于C++的解决方案,代码如下:

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main() {
    double a, b, c;
    cin >> a >> b >> c;
    double p = 0.5 * (a + b + c);
    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    cout << fixed << setprecision(1) << s << endl;
    return 0;
}

在这里插入图片描述


代码解析

在这里插入图片描述

  1. 引入头文件

    • #include <iostream>:用于输入和输出操作。
    • #include <cmath>:用于数学计算,如sqrt函数计算平方根。
    • #include <iomanip>:用于格式化输出。
  2. 输入三边长

    cin >> a >> b >> c;
    

    通过cin读取用户输入的三边长,分别存储到double类型变量abc中。

  3. 计算半周长

    double p = 0.5 * (a + b + c);
    

    使用给定三边计算半周长 p p p

  4. 计算面积

    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    

    根据海伦公式计算三角形的面积。

  5. 格式化输出

    cout << fixed << setprecision(1) << s << endl;
    

    使用fixedsetprecision(1)来确保输出保留到小数点后1位。


💯C 语言解法分析

接下来介绍C语言的解决方案,代码如下:

#include <cstdio>
#include <cmath>

int main() {
    double a, b, c;
    scanf("%lf%lf%lf", &a, &b, &c);
    double p = 0.5 * (a + b + c);
    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    printf("%.1lf\n", s);
    return 0;
}

在这里插入图片描述


代码解析

在这里插入图片描述

  1. 引入头文件

    • #include <cstdio>:用于输入输出操作,C语言中使用scanfprintf
    • #include <cmath>:用于数学运算,如sqrt函数。
  2. 输入三边长

    scanf("%lf%lf%lf", &a, &b, &c);
    

    通过scanf读取用户输入的三个边长,分别存储到double类型变量中。格式化符号%lf表示输入为双精度浮点数。

  3. 计算半周长

    double p = 0.5 * (a + b + c);
    

    计算半周长 p p p

  4. 计算面积

    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    

    根据海伦公式计算三角形面积。

  5. 格式化输出

    printf("%.1lf\n", s);
    

    使用printf进行格式化输出,保留到小数点后1位。


💯C++ 与 C 解法的比较

在这里插入图片描述


1. 输入输出方式的差异

  • C++ 使用 cincout C++提供了输入输出流的操作方式,相比于C语言的传统函数,代码更简洁,并且具有更好的人性化特性,尤其在处理多种类型数据时非常方便。
  • C 使用 scanfprintf C语言的输入输出函数更接近硬件,具有较高的执行效率,但需要明确地指定数据类型,使用格式化符号如%lf来处理double类型数据。
    在这里插入图片描述

2. 格式化输出的差异

  • C++ 使用 iomanip 通过#include <iomanip>,C++ 提供了灵活的格式化输出工具,可以轻松设置输出的精度(如fixedsetprecision)。
  • C 使用格式化符号: C语言则使用printf函数的格式化字符串实现同样的效果,例如%.1lf用于保留1位小数。
    在这里插入图片描述

3. 代码风格与简洁性

  • C++代码风格较为抽象和现代化,适用于处理复杂的数据结构,并且具有更高的代码可读性和维护性。
  • C语言代码更接近底层,具有显式操作的特点,适合嵌入式开发以及对性能要求较高的场景。
    在这里插入图片描述

4. 执行效率的考虑

  • C语言的scanfprintf函数由于更接近硬件,在嵌入式系统或资源受限的环境中,可能比C++的输入输出流更具效率。
  • C++的输入输出流尽管在灵活性上具有优势,但在大量数据处理场景中,其执行效率可能稍逊于C的标准输入输出函数。
    在这里插入图片描述

💯优化与拓展

在这里插入图片描述


1. 输入的有效性检查

无论是C还是C++版本,原始实现都没有对输入的三边进行合法性检查,以确认其是否构成一个有效的三角形。在实际应用中,加入有效性检查至关重要,以确保输入的边长能够构成一个三角形。以下是优化后的代码示例:

C++ 优化版:

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main() {
    double a, b, c;
    cin >> a >> b >> c;
    if (a + b > c && a + c > b && b + c > a) {
        double p = 0.5 * (a + b + c);
        double s = sqrt(p * (p - a) * (p - b) * (p - c));
        cout << fixed << setprecision(1) << s << endl;
    } else {
        cout << "Invalid triangle" << endl;
    }
    return 0;
}

在这里插入图片描述

C 优化版:

#include <cstdio>
#include <cmath>

int main() {
    double a, b, c;
    scanf("%lf%lf%lf", &a, &b, &c);
    if (a + b > c && a + c > b && b + c > a) {
        double p = 0.5 * (a + b + c);
        double s = sqrt(p * (p - a) * (p - b) * (p - c));
        printf("%.1lf\n", s);
    } else {
        printf("Invalid triangle\n");
    }
    return 0;
}

在这里插入图片描述


2. 减少硬编码

在代码中,半周长的计算使用了硬编码0.5,可以改为1.0 / 2.0,从而更加明确表示浮点数除法,提升代码的可读性和维护性。
在这里插入图片描述


3. 浮点数精度问题

浮点数运算存在精度问题,可能会导致结果的细微偏差。在对精度要求较高的场景下,应考虑如何处理浮点数误差,如设置适当的误差范围进行比较,以减少因浮点误差导致的不准确性。
在这里插入图片描述


4. 数学背景知识的拓展

海伦公式用于计算三角形面积,但其适用前提是三边必须满足三角形不等式。在编写代码时,理解三角形不等式(任意两边之和大于第三边)有助于更好地进行合法性验证,确保输入值能构成有效的三角形。这些数学背景知识能够帮助程序员编写更健壮的代码。
在这里插入图片描述


💯小结

  • 在这里插入图片描述
    本文详细分析了通过C++C语言实现三角形面积计算的两种方法,
    比较了这两种实现方式的优劣。通过对代码进行优化和拓展,我们探讨了提高代码健壮性和可读性的方法。

  • C++C语言各自都能够有效计算三角形的面积,但它们在代码风格使用方式上存在显著差异。
    C++更加现代化,代码简洁且易于维护,C更贴近底层,更适合需要精细控制高性能的场景。

  • 在开发过程中,输入的有效性检查是必要的,以确保程序对不合法输入进行合理处理,避免崩溃或异常。

  • 浮点数的处理需要特别注意精度问题尤其是在计算过程中可能因精度误差而导致结果的不准确。

  • **数学背景知识在编程中的重要性不容忽视,**理解和应用这些知识能够帮助开发人员编写出更加稳健正确的代码。

希望本文的分析能够帮助读者更好地理解CC++语言在解决实际问题中的各自特点及其应用场景。
通过这种深入的比较与优化,读者可以更熟练地运用这两种编程语言来解决复杂的数学问题,并对编程中的数学背景知识有更为深入的理解。


在这里插入图片描述



网站公告

今日签到

点亮在社区的每一天
去签到