【C++】绝对值输出问题详解与代码优化分析

发布于:2024-12-09 ⋅ 阅读:(132) ⋅ 点赞:(0)

在这里插入图片描述

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


在这里插入图片描述


💯前言

  • 在计算机编程的学习过程中,掌握输入输出以及数据处理的基本操作是每个学习者必须经过的阶段。本篇文章将围绕一道基础的 C++ 编程题目展开深入探讨,详细分析各种解决方法以及背后的理论支撑,从而帮助读者对 C++ 语言的基本概念和常用技巧进行更深层次的理解。通过深入剖析与优化,希望本文能够帮助你在编程实践中灵活运用这些知识点,解决更多类似的问题,最终提升编程能力。
    C++ 参考手册
    在这里插入图片描述

💯题目介绍:输出绝对值

输出绝对值
在这里插入图片描述

题目描述如下:

  • 输入一个浮点数 n,输出这个浮点数的绝对值。

输入格式:

  • 输入一个浮点数 n,其绝对值不超过 10000

输出格式:

  • 输出 n 的绝对值,保留到小数点后两位。

输入输出示例:

  • 输入:
    -3.14
    
  • 输出:
    3.14
    

在这道题目中,核心任务是计算一个浮点数的绝对值并输出,同时保留小数点后两位精度。这涉及到输入输出的格式化、条件判断、以及数学函数的使用等编程中的基础知识点。我们将通过不同的实现方法来逐步优化代码,从而展示最佳实践。


💯第一种解决方案:手动计算绝对值

首先来看下一个学生编写的初始代码,其代码如下:

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

int main() {
    float n;
    cin >> n; // 输入一个浮点数 n
    if (n >= 0) // 判断 n 是否为非负
        cout << fixed << setprecision(2) << n << endl; // 非负直接输出
    else
        cout << fixed << setprecision(2) << -n << endl; // 负数取反后输出
    return 0;
}

在这里插入图片描述


代码分析

在这里插入图片描述

  1. 浮点数输入

    float n;
    cin >> n;
    
    • 使用 float 类型来存储输入的浮点数 n,能够满足题目中规定的范围。
  2. 绝对值计算

    if (n >= 0)
        cout << fixed << setprecision(2) << n << endl;
    else
        cout << fixed << setprecision(2) << -n << endl;
    
    • 通过 if-else 结构判断 n 是否为负数:
      • 如果 n 非负,直接输出 n
      • 如果 n 为负数,输出 -n 作为绝对值。
  3. 格式化输出

    cout << fixed << setprecision(2) << n << endl;
    
    • 使用 fixedsetprecision(2) 来确保输出的浮点数保留到小数点后两位,符合题目对精度的要求。

优点与改进建议

在这里插入图片描述

  • 该代码逻辑清晰,结构明确,能够满足题目的所有要求。
  • 改进建议
    • 代码存在一些冗余逻辑,例如 if-else 结构可以通过使用标准库中的数学函数来简化,这样可以提高代码的简洁性和可维护性。
    • 可以引入 cmath 库中的 fabs 函数直接计算绝对值,减少冗余代码,使得代码更为优雅且高效。

💯第二种解决方案:使用 C 风格的输入输出

接下来是老师推荐的另一种解决方案,其代码如下:

#include <cstdio>
#include <iostream>
using namespace std;

int main() {
    float n = 0;
    scanf("%f", &n); // 使用 C 语言风格的输入方式,读取一个浮点数
    if (n >= 0)
        printf("%.2f\n", n); // C 语言风格的输出,保留两位小数
    else
        printf("%.2f\n", -n); // 输出绝对值,保留两位小数
    return 0;
}

在这里插入图片描述


代码分析

在这里插入图片描述

  1. scanfprintf 的使用

    • 使用了 C 风格的输入输出函数:scanf("%f", &n) 读取浮点数,printf("%.2f\n", n) 格式化输出。
    • 这种方法更为直接和简洁,尤其是在需要精确控制格式的情况下。
  2. 与第一种代码的区别

    • 该代码采用了 C 风格的输入输出,相比 C++ 风格的 cincout 更为简洁,但缺少了 C++ 标准库的一些安全检查和特性。
    • C++ 是向后兼容 C 的语言,因此我们可以在 C++ 中直接使用这些 C 风格的输入输出函数。

优点与不足

在这里插入图片描述

  • 优点
    • 相较于使用 cincoutscanfprintf 在执行效率上通常更高,特别是在处理大量输入输出时,C 风格的函数能够带来性能上的提升。
  • 不足
    • 这种风格在现代 C++ 编程中显得有些过时,尤其是在团队协作和大型项目中,使用 C++ 标准库提供的输入输出接口更符合规范。
    • 缺乏类型安全检查,容易因为格式符号不匹配而引入潜在错误。

💯第三种解决方案:使用 fabs 函数

为了让代码更加简洁,还可以引入 <cmath> 库中的 fabs 函数来计算绝对值,代码如下:

#include <cstdio>
#include <iostream>
#include <cmath> // 引入cmath库,提供fabs函数
using namespace std;

int main() {
    float n = 0;
    scanf("%f", &n); // 输入浮点数 n
    n = fabs(n); // 使用 fabs 函数直接计算绝对值
    printf("%.2f\n", n); // 格式化输出保留两位小数
    return 0;
}

在这里插入图片描述


代码分析

在这里插入图片描述

  1. fabs 函数的使用

    • fabs(n)<cmath> 中的标准函数,用于计算浮点数的绝对值。
    • 这种方式避免了手写 if-else 判断逻辑,使代码更加简洁且不易出错。
  2. 格式化输出

    • 使用 printf("%.2f\n", n) 格式化输出,确保输出保留到小数点后两位。

优点

在这里插入图片描述

  • 代码简洁:减少了 if-else 的冗余逻辑,使得代码逻辑更加直接。
  • 易读性和稳定性:标准库函数的使用提高了代码的可读性和可靠性,降低了人为错误的概率。
  • 效率:相较于手动实现绝对值计算,使用标准库函数 fabs 提高了代码的简洁性并且更加直观。

💯关于 <cstdio> 的讨论

在这里插入图片描述
在讨论中,我们还提到一个问题:为什么在代码中没有包含 <cstdio> 头文件,scanfprintf 依旧可以使用?


解释原因

在这里插入图片描述

  • C 标准库兼容性

    • 在 C++ 中,<cstdio><stdio.h> 的 C++ 版本。C++ 标准库为了向后兼容 C 语言,默认包含了部分 C 标准库的功能,包括 scanfprintf
  • 编译器处理

    • 现代 C++ 编译器(如 GCC、Clang、MSVC)在处理 C++ 标准输入输出时,会隐式包含 C 标准库头文件,这使得即使不显式包含 <cstdio>,编译器也能够解析这些函数。
  • 最佳实践

    • 尽管如此,为了代码的清晰性和规范性,推荐在使用 scanfprintf 时显式包含 <cstdio> 头文件,以明确依赖关系。
    • 在大型项目和团队开发中,显式地包含所有依赖头文件,可以减少编译错误并提升代码的可维护性和可读性。

💯解决方案对比与总结

在这里插入图片描述

方案 输入输出方式 优点 不足
第一种 cincout C++ 标准,代码规范 if-else 冗余,略显繁琐
第二种 scanfprintf 简洁明了,性能较好 C 风格输入输出,不符合 C++ 标准化编程风格
第三种 scanfprintf,结合 fabs 代码最简洁,易读性高 需要额外包含 <cmath>

在三种解决方案中,第三种是最简洁和高效的实现,直接调用标准库函数计算绝对值,并结合格式化输出,既高效又易读。如果追求代码的简洁性和可读性,这种方式是首选。而第一种和第二种方法也各有其适用场景,尤其是在学习过程中,理解 if-else 和不同输入输出方式的差异是非常重要的。


💯小结

  • 在这里插入图片描述
    在这道题目中,我们重点讨论了输入输出和绝对值计算的几种实现方式。通过这些讨论,学习者可以进一步理解以下几个编程概念:
  1. C++ 与 C 的兼容性:C++ 是基于 C 的语言,保留了许多 C 的特性,但在编写现代 C++ 时,建议尽量使用 C++ 标准库函数,除非有特定的性能需求。
  2. 标准库的使用<cmath> 中的 fabs 函数可以极大简化代码逻辑,使用标准库函数是现代编程中非常推荐的做法,因为它们经过优化和广泛测试,可靠性较高。
  3. 格式化输出的方式:通过 printfsetprecision 分别控制 C 和 C++ 中输出的精度是基本功之一,这对于处理需要严格控制输出格式的题目尤为重要。
  4. 代码可维护性与风格一致性:对于长期维护的项目,代码的风格和一致性至关重要。选择统一的风格不仅能提高代码的可读性,还可以减少团队合作中的沟通成本和潜在的错误。
  5. 性能与简洁性之间的权衡:有时候,C 风格的输入输出确实能在性能上带来一些提升,尤其是在涉及大量数据的场景下。但是在代码简洁性和可读性方面,C++ 风格更具优势。因此,理解不同实现方式的利弊,并根据具体需求做出合理选择,是每个开发者应具备的核心能力。

在这里插入图片描述



网站公告

今日签到

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