【C++】双温度转换与并联电阻计算的编程题分析与优化


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯从华氏温度到摄氏温度的转换
    • 题目背景与华氏温度与摄氏温度的转换
    • 初始代码与验证通过的解法
      • 代码分析
      • 特点与优缺点
    • 老师的代码:结合 C 与 C++ 的风格
      • 代码分析与对比
      • 改进建议
    • 现代 C++ 的改进代码
  • 💯并联电阻的计算
    • 初始代码与验证通过的解法
      • 代码分析
      • 改进建议
    • 老师的代码:结合 C 与 C++ 的风格
      • 代码分析
      • 改进建议
  • 💯小结


在这里插入图片描述


💯前言

  • 在编写数值计算程序时,准确性代码的可维护性 是两个核心的目标。本篇文章通过两道与 物理计算 相关的编程题目深入探讨了 温度转换电阻并联计算 的代码实现方式。通过比较不同的代码风格以及现代化编程的改进,旨在帮助读者理解如何编写更加 高效简洁、且符合 现代编程规范 的代码。在此过程中,文章不仅涵盖了基础的算法实现,还特别强调了 输入输出的最佳实践浮点数的精确控制、以及 代码模块化 的设计方法,以适应日益复杂的编程需求。
    C++ 参考手册
    在这里插入图片描述

💯从华氏温度到摄氏温度的转换

温度表达转化
在这里插入图片描述

题目要求我们利用公式将华氏温度转换为摄氏温度,具体要求如下:

  • 使用公式:

C = 5 × ( F − 32 ) 9 C = \frac{5 \times (F - 32)}{9} C=95×(F32)

其中 F F F表示输入的华氏温度, C C C表示输出的摄氏温度。

  • 输入格式:

    • 输入一行,包含一个实数 F F F,表示华氏温度。
      - F ≥ − 459.67 F \ge -459.67 F459.67(即温度不能低于绝对零度)。
  • 输出格式:

    • 输出一行,包含一个实数 C C C,表示对应的摄氏温度,要求输出精确到小数点后 5 位。
  • 输入输出示例:

    • 输入:
      41
      
    • 输出:
      5.00000
      

题目背景与华氏温度与摄氏温度的转换

华氏温度和摄氏温度是两种常用的温度计量单位。在科学计算中,理解温度的转换非常重要。公式如下:

C = 5 × ( F − 32 ) 9 C = \frac{5 \times (F - 32)}{9} C=95×(F32)

该公式中,摄氏温度 C C C是通过从华氏温度 F F F中减去 32,然后乘以 5/9 来计算的。这是因为华氏和摄氏的比例关系以及他们的起始基准点的不同。对于编程的任务来说,除了正确的计算外,格式化输出的要求也非常重要,这就是本题中要求精确到小数点后 5 位的部分。

在这里插入图片描述


初始代码与验证通过的解法

首先,是我编写的第一份代码,该代码是用C语言风格解决的,具体如下:

#include <cstdio>
int main() {double F; // 定义变量 F 存储华氏温度scanf("%lf", &F); // 从用户输入读取 F 的值printf("%.5f", 5.0 * (F - 32) / 9); // 按格式保留 5 位小数输出计算结果return 0;
}

在这里插入图片描述


代码分析

在这里插入图片描述

  1. 输入部分:

    • 使用 scanf 从标准输入读取一个浮点数,并赋值给 F%lf 用于读取类型为 double 的数据。
  2. 计算部分:

    • 使用公式 5.0 × ( F − 32 ) / 9 5.0 \times (F - 32) / 9 5.0×(F32)/9进行计算。
    • 使用 5.0 而非 5 是为了确保浮点数计算,避免整数除法带来的精度丢失问题。
  3. 输出部分:

    • 使用 printf("%.5f", c),其中 %.5f 保证输出结果精确到小数点后 5 位。

特点与优缺点

在这里插入图片描述

  • 优点:

    • 代码简洁,直接利用 scanfprintf 进行输入输出,符合C语言风格。
    • 使用浮点数 5.0 来保证计算的精度。
  • 缺点:

    • 使用了C语言风格的输入输出,虽然简洁,但与C++的标准流风格(cin/cout)不一致,不符合现代C++的推荐实践。

老师的代码:结合 C 与 C++ 的风格

老师在课堂上的代码使用了一种折衷的方式,将 C++ 的输入方式与 C 的输出方式结合在了一起。代码如下:

#include <iostream>
#include <iomanip>
using namespace std;int main() {double F;cin >> F; // 使用 cin 从标准输入读取 Fdouble c = 5 * (F - 32) / 9; // 按公式计算摄氏温度printf("%.5f", c); // 使用 printf 输出结果,保留 5 位小数return 0;
}

在这里插入图片描述


代码分析与对比

在这里插入图片描述

  1. 输入部分:

    • 老师的代码使用了 cin 来读取输入。这是 C++ 标准流的一部分,使得代码更现代化,易于理解。
  2. 输出部分:

    • 老师保留了 printf 进行输出,这种风格在一些场合下更容易实现精确的格式化输出,但它与 cin 风格不完全统一。

改进建议

为了让代码更加符合现代 C++ 风格,建议将输出部分也改为 cout,并结合 iomanip 进行格式化输出。

#include <iostream>
#include <iomanip>
using namespace std;int main() {double F;cin >> F; // 从用户输入获取华氏温度double c = 5.0 * (F - 32) / 9; // 计算摄氏温度cout << fixed << setprecision(5) << c << endl; // 格式化输出return 0;
}

在这里插入图片描述


现代 C++ 的改进代码

在这里插入图片描述
在这份代码中,我们完全使用了 C++ 的输入输出方式,使得代码更易读,并且更符合现代 C++ 的推荐风格。

  1. cincout

    • 使用 cin 进行输入,cout 进行输出,这样可以使代码具有更高的可读性,且更符合 C++ 面向对象的设计理念。
  2. 格式化输出:

    • fixedsetprecision(5) 用于控制 cout 的输出格式,fixed 表示定点格式输出,setprecision(5) 用于控制保留到小数点后 5 位。

💯并联电阻的计算

计算并联电阻的阻值
在这里插入图片描述

对于阻值为 r 1 r_1 r1 r 2 r_2 r2的电阻,其并联电阻值公式计算如下:

R = 1 1 r 1 + 1 r 2 R = \frac{1}{\frac{1}{r_1} + \frac{1}{r_2}} R=r11+r211

  • 输入格式:

    • 输入两个实数 r 1 , r 2 r_1, r_2 r1,r2,以一个空格分开。
  • 输出格式:

    • 输出并联之后的阻抗大小,结果保留小数点后 2 位。
  • 输入输出示例:

    • 输入:
      1 2
      
    • 输出:
      0.67
      

初始代码与验证通过的解法

首先,我们来看您编写的代码,该代码通过了测试,具体如下:

#include <cstdio>
int main() {int r1, r2;double R;scanf("%d %d", &r1, &r2);R = 1.0 / ((1.0 / r1) + (1.0 / r2));printf("%.2lf", R);return 0;
}

在这里插入图片描述


代码分析

在这里插入图片描述

  1. 变量类型:

    • r1r2 使用 int 类型来读取。这种情况下,如果电阻值是浮点数,会失去精度。因此,改进时可以将 r1r2 定义为 double,这样可以处理浮点数输入。
  2. 并联计算:

    • R = 1.0 / ((1.0 / r1) + (1.0 / r2)); 这里正确地将 1.0 作为除数,确保运算结果是浮点数。这样避免了整数除法带来的精度丢失。
  3. 输入输出:

    • 使用 scanf 读取输入,printf 格式化输出,%.2lf 表示保留 2 位小数输出结果。

改进建议

  1. 变量类型统一为浮点数:

    • r1r2 都声明为 double 类型,以确保能处理更精确的输入。
    • 代码改进如下:
      #include <cstdio>
      int main() {double r1, r2, R;scanf("%lf %lf", &r1, &r2);R = 1.0 / ((1.0 / r1) + (1.0 / r2));printf("%.2lf\n", R);return 0;
      }
      
  2. 使用现代 C++ 风格:

    • 为了符合现代 C++ 的风格,可以使用 iostreamiomanip 进行输入和格式化输出:

      #include <iostream>
      #include <iomanip>
      using namespace std;int main() {double r1, r2;cin >> r1 >> r2;double R = 1.0 / ((1.0 / r1) + (1.0 / r2));cout << fixed << setprecision(2) << R << endl;return 0;
      }
      

      在这里插入图片描述

    • 这里的 fixedsetprecision(2) 用于控制小数点后的位数。

  3. 输入校验:

    • 可以考虑对输入进行简单的检查,例如,电阻值不能为 0,否则会导致除以零的错误。
      if (r1 == 0 || r2 == 0) {cout << "Invalid input: Resistance cannot be zero." << endl;return 1; // 非正常退出
      }
      
  4. 代码的结构化与可维护性:

    • 可以考虑将并联电阻的计算提取为一个函数,方便代码的复用和结构化。
      double calculate_parallel_resistance(double r1, double r2) {if (r1 == 0 || r2 == 0) {throw invalid_argument("Resistance cannot be zero");}return 1.0 / ((1.0 / r1) + (1.0 / r2));
      }
      
    • 然后在主函数中调用这个计算函数,这样使得代码更加清晰和模块化:
      int main() {double r1, r2;cin >> r1 >> r2;try {double R = calculate_parallel_resistance(r1, r2);cout << fixed << setprecision(2) << R << endl;} catch (const invalid_argument& e) {cout << e.what() << endl;}return 0;
      }
      

老师的代码:结合 C 与 C++ 的风格

老师在课堂上的代码如下:

#include <iostream>
#include <iomanip>
using namespace std;int main() {double r1, r2;cin >> r1 >> r2;double r = 1 / (1 / r1 + 1 / r2);printf("%.2lf\n", r);return 0;
}

在这里插入图片描述


代码分析

在这里插入图片描述

  1. 输入方式:

    • 使用 cin 进行输入,符合 C++ 标准流风格,使得代码更现代化。
  2. 输出方式:

    • 使用了 printf,这是一种 C 风格的输出方式,与 cin 不完全匹配。

改进建议

  1. 输入输出风格统一:

    • 建议改为 cout,结合 iomanip,使代码更加符合 C++ 风格:
      #include <iostream>
      #include <iomanip>
      using namespace std;int main() {double r1, r2;cin >> r1 >> r2;double r = 1 / (1 / r1 + 1 / r2);cout << fixed << setprecision(2) << r << endl;return 0;
      }
      
      在这里插入图片描述
  2. 健壮性与可读性:

    • 增加输入检查,避免输入 0 值导致除零错误,使代码更加健壮。
  3. 模块化改进:

    • 将计算提取到函数中,有助于提高代码的可读性和维护性,同时便于测试和复用。
      double calculate_parallel_resistance(double r1, double r2) {return 1 / (1 / r1 + 1 / r2);
      }int main() {double r1, r2;cin >> r1 >> r2;if (r1 == 0 || r2 == 0) {cout << "Invalid input: Resistance cannot be zero." << endl;return 1;}double r = calculate_parallel_resistance(r1, r2);cout << fixed << setprecision(2) << r << endl;return 0;
      }
      
      在这里插入图片描述

💯小结

  • 在这里插入图片描述
    通过这两道题的讨论,我们学习了如何利用 C 和 C++ 的不同输入输出风格 解决问题,并且了解了如何改进代码使其更符合 现代 C++ 的编程习惯。同时,通过增加必要的 输入检查,代码的健壮性也能得到提高。此外,我们还学习了如何利用 模块化的方法,使代码更具结构化和可维护性。在编写高质量代码时,保持 风格的一致性、增加必要的 输入验证、以及 模块化设计,都是非常重要的编码实践。这些技巧不仅有助于代码的可读性和维护性,还能帮助我们更有效地处理复杂的逻辑和 潜在的错误情况

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/484506.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【采样率、采样定理、同步和异步采样】

内容来源&#xff1a;【数据采集卡的【采样率】【采样定理】【同步采样】【异步采样】的相关说明】 此篇文章仅作笔记分享。 前言 模拟信号需要通过采样、储存、量化、编码这几个步骤转换成数字信号&#xff0c;本篇文章将会对采样进行一个更详细的说明。 采样 采样就是将一…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能&#xff0c;无论是数据传输、充电还是外接设备&#xff0c;都离不开它。然而&#xff0c;当USB接口突然没有反应时&#xff0c;这无疑会给我们的工作和学习带来不小的困扰。下面&#xff0c;我们就来探讨一下笔记本USB接…

linux运维之shell编程

Shell 编程在系统运维中及其重要 1. Shell 编程概述 Shell 是一种命令行解释器&#xff0c;能够执行操作系统的命令。Shell 脚本是一个包含一系列 Shell 命令的文件&#xff0c;它可以被执行&#xff0c;以自动化和批量处理任务。常用的 Shell 类型包括 bash、sh、zsh 等。Shel…

怎么自己创建一个网站? 开发语言首选 java,使用CMS网站内容管理系统是不错的选择

怎么自己创建一个网站 推荐使用 Java CMS 网站内容管理系统&#xff0c;根据网站规划的功能模块&#xff0c;创建不同的页面风格&#xff1b; 文章目录 怎么自己创建一个网站一、规划网站1.1确定网站主题和目的1.2规划网站结构和内容 二、注册域名2.1选择域名注册商2.2 查找并…

小米澎湃OS2跟蜂窝网络相关的设置和调试【功能设计】

界面功能 开发者模式下&#xff0c;支持数据和WLAN网络相关的设置&#xff0c;跟数据有关的主要如下&#xff1a; 蜂窝网络调试 > 5G-A 特性中心始终开启移动数据网络&#xff08;便于WiFi和数据快速切换&#xff0c;在国外北美运营商有些需求中明确定义要开着&#xff09…

八、Python —— 类、异常处理、模块、包的管理、虚拟环境

文章目录 一、类1.1、类的定义1.2、类变量和实例变量1.3、类的继承 二、异常处理三、模块 和 包3.1、模块和包的概念&#xff0c;以及项目的树形结构3.2、模块和包的使用 (from import)方法一&#xff1a;from 模块 import 变量/函数/类方式二&#xff1a;from 模块 import 变量…

【text2sql】低资源场景下Text2SQL方法

SFT使模型能够遵循输入指令并根据预定义模板进行思考和响应。如上图&#xff0c;、 和 是用于通知模型在推理过程中响应角色的角色标签。 后面的内容表示模型需要遵循的指令&#xff0c;而 后面的内容传达了当前用户对模型的需求。 后面的内容代表模型的预期输出&#xff0c;也…

自适应神经网络架构:原理解析与代码示例

个人主页&#xff1a;chian-ocean 文章专栏 自适应神经网络结构&#xff1a;深入探讨与代码实现 1. 引言 随着深度学习的不断发展&#xff0c;传统神经网络模型在处理复杂任务时的局限性逐渐显现。固定的网络结构和参数对于动态变化的环境和多样化的数据往往难以适应&#…

挑战用React封装100个组件【004】

项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于展示图片的地方&#xff0c;提供了small&#xff0c;medium&#xff0c;large三种大小。可以删除图片&#xff0c;也可以全屏预览图片。 样式展示 前置依赖 今天我们的这个挑战需要用用到了…

基于MobileNet深度学习网络的MQAM调制类型识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

如何使用apache部署若依前后端分离项目

本章教程介绍,如何在apache上部署若依前后端分离项目 一、教程说明 本章教程,不介绍如何启动后端以及安装数据库等步骤,着重介绍apache的反向代理如何配置。 参考此教程,默认你已经完成了若依后端服务的启动步骤。 前端打包命令使用以下命令进行打包之后会生成一个dist目录…

标贝科技受邀出席2024东湖国际人工智能高峰论坛并入选数据要素合作伙伴名单

近日&#xff0c;备受瞩目的2024东湖国际人工智能高峰论坛在中国光谷科技会展中心隆重召开。会议以“智联世界&#xff0c;共创未来”为主题&#xff0c;省市相关单位、专家学者、产学研各界百余家联合体单位齐聚一堂&#xff0c;共话人工智能领域的最新技术及产业发展趋势。会…

QGIS Python插件开发环境搭建--QGIS3.34.11+PyCharm

QGIS Python插件开发环境搭建--QGIS3.34.11PyCharm 安装QGIS启动QGIS并设置为中文启动QGIS Python插件开发中用到的插件安装PyCharm社区版使用Plugin Builder 3生成插件模板加载插件打开QGIS插件路径将自己的插件拷贝到QGIS的python插件路径 使用PyCharm打开插件代码配置Python…

On-Chip-Network之router微架构的物理实现

Low-Power Microarchitecture 自20世纪90年代以来&#xff0c;功耗一直是嵌入式芯片和高性能芯片面临的一个挑战。自2000年代中期以来&#xff0c;它已经成为大多数设计的主要约束。多核解决了功耗问题&#xff0c;由此产生的communication substrate&#xff0c;namely the on…

java 21 多线程

1.相关概念 进程: 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存空间。当我们使用迅雷&#xff0c;又启动了一个进程&#xff0c;操作系统将为迅雷配新的内存空间。 进程是程序的一次执行过程&#…

Envoy-istio

最近研究envoy-istio&#xff0c;发现这个博客&#xff0c;觉得很不错&#xff0c;这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七&#xff1a;envoy的http流量管理基础 envoy部分六&#xff1a;envoy的集群管理 envoy部分五&#xff…

【ETCD】ETCD用户密码认证

目录 概述 特殊用户和角色 root用户 root角色 用户操作 角色操作 启用身份验证 使用etcdctl进行身份验证 使用TLS通用名称 概述 etcd 2.1中增加了身份验证功能。etcd v3 API对身份验证功能的API和用户界面进行了轻微修改&#xff0c;以更好地适应新的数据模型。本指南…

蓝牙定位的MATLAB程序,四个锚点、三维空间

这段代码通过RSSI信号强度实现了在三维空间中的蓝牙定位&#xff0c;展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。代码涉及信号衰减模型、距离计算和最小二乘法估计等基本概念&#xff0c;并通过三维可视化展示了真实位置与估计位置的关系。 目录 程序描述 运…

【计算机网络】实验4:生成树协议STP的功能以及虚拟局域网VLAN

实验 4&#xff1a;生成树协议STP的功能以及虚拟局域网VLAN 一、 实验目的 加深对生成树协议STP的功能的理解。 了解虚拟局域网VLAN。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、验证交换机生成树协议STP的功能 (1) 第一步&#xff1a;构建网络拓…

VMware官网下载

访问官网 https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 跳转到broadcom 注册 -> 登录 拉到下面 选择版本 然后填写地址信息&#xff0c; 随便写写&#xff0c; 再回去点下载按钮&#xff0c; 就可以下载了