【C++】深入优化计算题目分析与实现


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯第一题:圆的计算
    • 我的代码实现
      • 代码分析
      • 改进建议
      • 改进代码
    • 老师的代码实现
      • 代码分析
      • 可以改进的地方
      • 改进代码
  • 💯第二题:对齐输出
    • 我的代码实现
        • 代码分析
        • 改进建议
      • 改进代码
        • 改进点解释
    • 老师的代码实现
      • 代码分析
      • 改进建议
      • 改进代码
        • 改进点解释
  • 💯小结


在这里插入图片描述


💯前言

  • 本文深入探讨了两道与计算输出相关的编程问题,涵盖从题目描述代码实现的逐步剖析及优化策略。我们分别讨论了题目的需求、代码实现过程、老师给出的改进方案,并提出了多种优化思路,以帮助读者更好地理解和掌握C++编程的精髓。每道题目不仅涉及如何找到适合的代码实现方案,还涵盖了代码改进方法与策略,使得读者能够深刻领悟编程背后的逻辑和优化的重要性
    在代码编写过程中,程序员需要面对多种复杂问题,例如数据有效性检查、代码的规范性和可读性,以及如何充分利用现代C++的特性实现更加优雅的解决方案。这些考量不仅关乎能否实现正确的功能,更涉及编程效率、代码的可维护性以及整体代码风格的统一。因此,通过本次分析,您将学会不仅能完成题目要求的代码编写,还能将代码提升至更符合专业标准的水平,使得代码质量更高,结构更易扩展和维护
    C++ 参考手册
    在这里插入图片描述

💯第一题:圆的计算

与圆相关的计算
在这里插入图片描述

题目描述

在本题中,给定一个圆的半径,需要计算其直径、周长和面积。输入一个半径实数 r,程序需输出该圆的直径、周长、面积,且每个数保留小数点后 4 位。圆周率取值为 3.14159。

输入格式

  • 输入包含一个实数 r (0 < r ≤ 10000),表示圆的半径。

输出格式

  • 输出一行,包含三个数,分别表示直径、周长、面积,数与数之间用一个空格分开,每个数保留小数点后 4 位。

输入输出样例

  • 输入 #1: 3.0
  • 输出 #1: 6.0000 18.8495 28.2743

格式化输出的精确性对于本题至关重要,需要确保输出的数据正确,且符合要求。输入与输出的格式化不仅需要基于正确的数学公式进行计算,还要特别注意输出的精度和排列格式。小数位数和数据之间的空格在实际评测中往往是决定代码是否能通过的重要因素。


我的代码实现

#include <cstdio>

int main() {
    double r;
    scanf("%lf", &r);
    printf("%.4lf %.4lf %.4lf", 2 * r, 2 * 3.14159 * r, 3.14159 * r * r);
    return 0;
}

在这里插入图片描述


代码分析

  1. 代码结构:此代码采用了C语言风格的输入和输出函数 scanfprintf,虽然这在C语言中很常见,但在C++中逐渐被更现代化的输入输出方法替代。
  2. 计算:代码对直径、周长和面积的计算公式是正确的,且使用了精确的数学表达式。
  3. 格式输出:printf("%.4lf %.4lf %.4lf", ...) 确保了保留小数点后 4 位,这符合题目要求。
    在这里插入图片描述

改进建议

  1. 输入检查:代码缺少对输入半径的有效性检查,例如确保 r 的值在 0 到 10000 之间。有效的输入检查对于保障程序的稳定性和正确性至关重要。
  2. 输出格式潜在错误:在处理格式化输出时,任何不精确之处,例如缺少空格或者小数点后不精确的数值,都可能导致程序未能通过评测器检查。因此,保证输出的格式精确性是通过测试的关键。
    在这里插入图片描述

改进代码

#include <cstdio>

int main() {
    double r;
    scanf("%lf", &r);

    // 检查输入是否合法
    if (r <= 0 || r > 10000) {
        return 1; // 非法输入直接退出
    }

    // 计算结果
    double diameter = 2 * r;
    double circumference = 2 * 3.14159 * r;
    double area = 3.14159 * r * r;

    // 输出结果
    printf("%.4lf %.4lf %.4lf\n", diameter, circumference, area);

    return 0;
}

在这里插入图片描述

改进点:

  1. 添加了输入有效性检查,确保 r 的值合理。这对于处理边界情况和不合法的输入值是非常重要的。
  2. 在输出中添加换行符,确保输出格式符合要求,便于阅读和评测。

老师的代码实现

您提供的老师代码如下:

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

const double PI = 3.14159;

int main() {
    double r;
    cin >> r;
    double z = 2 * r;
    double l = 2 * PI * r;
    double a = PI * r * r;

    printf("%.4f %.4f %.4f\n", z, l, a);
    return 0;
}

在这里插入图片描述


代码分析

  1. 使用现代C++输入输出:代码中使用了 cincout,这更符合现代C++编程规范,并且比C风格的输入输出更为简洁和类型安全。
  2. 常量定义:使用了 const double PI = 3.14159;,这使得代码更具可维护性和可读性。常量定义有助于减少魔法数字的出现,从而使代码逻辑更加清晰。
  3. 混用输出方式:虽然输入部分使用了 cin,但输出部分依旧使用了 printf,这导致代码风格混杂,不利于代码的统一性和规范性。
    在这里插入图片描述

可以改进的地方

  1. 使用一致的C++风格输出:可以使用 cout<iomanip> 提供的工具,如 setprecision 来控制输出精度。这不仅统一了代码风格,而且能更好地控制输出格式。
  2. 增强代码一致性:保持输入输出风格的一致性,尤其是在团队开发中,有助于代码的易读性和维护性。

改进代码

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

const double PI = 3.14159;

int main() {
    double r;
    cin >> r;

    // 检查输入有效性
    if (r <= 0 || r > 10000) {
        return 1;
    }

    // 计算结果
    double diameter = 2 * r;
    double circumference = 2 * PI * r;
    double area = PI * r * r;

    // 输出结果,保留 4 位小数
    cout << fixed << setprecision(4);
    cout << diameter << " " << circumference << " " << area << endl;

    return 0;
}

在这里插入图片描述

改进后的代码优势:

  • 使用 cout 替代 printf,使得输入和输出方式保持一致,增强代码可读性。
  • 使用 setprecision(4) 设置输出精度,确保符合题目要求。
  • 采用C++标准库特性,使代码更加现代化、易于理解和维护。

💯第二题:对齐输出

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

题目描述

读入三个整数,按每个整数占 8 个字符宽度进行对齐输出,整数之间用空格分开。

输入格式

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

输出格式

  • 一行输出,三个整数,按格式要求依次输出,之间以空格分开。

输入输出样例

  • 输入 #1: 123456789 0 -1
  • 输出 #1: 123456789 0 -1

我的代码实现

#include <cstdio>

int main() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    printf("%8d %8d %8d", a, b, c);
    return 0;
}

在这里插入图片描述


代码分析
  1. 简洁性:代码逻辑简单明了,使用 scanf 输入三个整数,再用 printf 对其输出,结构直观清晰。
  2. 对齐输出:使用了 %8d 来确保每个整数占用 8 个字符宽度,符合题目要求。
    在这里插入图片描述

改进建议
  1. 一致性:虽然题目未要求,但在输出末尾加上换行符使得结果更为规范和美观。
  2. 考虑更现代的C++风格:可以用C++标准库来替代C语言风格的输入输出函数,使代码风格更为统一和简洁。
    在这里插入图片描述

改进代码

#include <cstdio>

int main() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    printf("%8d %8d %8d\n", a, b, c);
    return 0;
}

在这里插入图片描述


改进点解释
  1. 在输出末尾添加换行符,确保格式整齐,符合规范性要求。
  2. 输出结束后移动到下一行,有助于后续操作的可读性。
    在这里插入图片描述

老师的代码实现

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

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    printf("%8d %8d %8d", a, b, c);
    return 0;
}

在这里插入图片描述


代码分析

  1. 现代输入方式:使用 cin 来输入数据,符合C++标准,更加类型安全。
  2. 混合风格:虽然输入部分使用了C++的 cin,但输出部分仍然使用C风格的 printf,不利于代码的一致性和规范性。
    在这里插入图片描述

改进建议

  1. 统一风格:建议统一使用 cincout,确保代码风格的一致性,提升代码的可读性。
  2. 使用 setw() 格式化输出:采用 setw(8) 可以更好地控制输出宽度,符合C++编程习惯。
    在这里插入图片描述

改进代码

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

int main() {
    int a, b, c;
    cin >> a >> b >> c;

    // 使用 setw(8) 保证每个整数占 8 个字符宽度
    cout << setw(8) << a << " " << setw(8) << b << " " << setw(8) << c << endl;

    return 0;
   }

在这里插入图片描述


改进点解释
  1. 使用现代C++输出风格:coutsetw() 的结合使得代码风格一致,且输出更加符合规范。
  2. 对齐控制:使用 setw(8) 来控制每个整数的输出宽度,使其符合题目中对对齐输出的严格要求。
    在这里插入图片描述

💯小结

  • 在这里插入图片描述
    通过上述代码的实现与优化,我们从以下几个方面深入讨论了C++代码的优化策略:
  1. 输入和输出的现代化:老师在改进中引入了现代C++的 cincout,逐步取代了C风格的 scanfprintf。这种转变不仅提升了类型安全性,也符合现代C++编程的最佳实践。

  2. 常量的引入:在数学计算中,使用 const 定义常量可以增强代码的可维护性和可读性,减少了硬编码的弊端,便于后续修改和代码重用。

  3. 输入有效性检查:无论是学术研究还是工业应用,健壮性都是软件系统的重要指标。我们在代码中添加了输入有效性检查,以防止非法输入导致的未定义行为,提高了程序的稳定性和可靠性。

  4. 格式化输出的精度控制:采用 <iomanip> 库的工具,如 setw()setprecision(),使得代码的格式化输出更加灵活。输出的精度控制不仅使得结果准确,也大幅提高了代码的可读性与规范性。


在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动手学深度学习10.5. 多头注意力-笔记练习(PyTorch)

本节课程地址&#xff1a;多头注意力代码_哔哩哔哩_bilibili 本节教材地址&#xff1a;10.5. 多头注意力 — 动手学深度学习 2.0.0 documentation 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>multihead-attention.ipynb 多头注…

大R玩家流失预测在休闲社交游戏中的应用

摘要 预测玩家何时会离开游戏为延长玩家生命周期和增加收入贡献创造了独特的机会。玩家可以被激励留下来&#xff0c;战略性地与公司组合中的其他游戏交叉链接&#xff0c;或者作为最后的手段&#xff0c;通过游戏内广告传递给其他公司。本文重点预测休闲社交游戏中高价值玩家…

软件质量保证——单元测试之白盒技术

笔记内容及图片整理自XJTUSE “软件质量保证” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 程序图 程序图定义 程序图P&#xff08;V,E&#xff09;&#xff0c;V是节点的集合&#xff08;节点是程序中的语句或语句片段&#xff09;&#xff0c;E是有向边的集合…

Node.js:开发和生产之间的区别

Node.js 中的开发和生产没有区别&#xff0c;即&#xff0c;你无需应用任何特定设置即可使 Node.js 在生产配置中工作。但是&#xff0c;npm 注册表中的一些库会识别使用 NODE_ENV 变量并将其默认为 development 设置。始终在设置了 NODE_ENVproduction 的情况下运行 Node.js。…

Zookeeper的通知机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的通知机制是什么?】面试题。希望对大家有帮助&#xff1b; Zookeeper的通知机制是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper的通知机制主要通过Watcher实现&#xff0c;它是Zookeeper客…

Request method ‘POST‘ not supported(500)

前端路径检查 查看前端的请求路径地址、请求类型、方法名是否正确&#xff0c;结果没问题 后端服务检查 查看后端的传参uri、传参类型、方法名&#xff0c;结果没问题 nacos服务名检查 检查注册的服务是否对应&#xff08;我这里是后端的服务名是‘ydlh-gatway’,服务列表走…

ESP32-S3模组上跑通ES8388(13)

接前一篇文章&#xff1a;ESP32-S3模组上跑通ES8388&#xff08;12&#xff09; 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第6段代码&#xff0c;本回继续往下解析。为了便于理解和回顾&#xff0c;再次贴出es8388_init函数源码&#xff0c;在…

Ubuntu 包管理

APT&dpkg 查看已安装包 查看所有已经安装的包 dpkg -l 查找包 apt search <package_name>搜索软件包列表&#xff0c;找到与搜索关键字匹配的包 dpkg与grep结合查找特定的包 dpkg -s <package>&#xff1a;查看某个安装包的详细信息 安装包 apt安装命令 更新…

泛化调用 :在没有接口的情况下进行RPC调用

什么是泛化调用&#xff1f; 在RPC调用的过程中&#xff0c;调用端向服务端发起请求&#xff0c;首先要通过动态代理&#xff0c;动态代理可以屏蔽RPC处理流程&#xff0c;使得发起远程调用就像调用本地一样。 RPC调用本质&#xff1a;调用端向服务端发送一条请求消息&#x…

开源 - Ideal库 - Excel帮助类,ExcelHelper实现(四)

书接上回&#xff0c;前面章节已经实现Excel帮助类的第一步TableHeper的对象集合与DataTable相互转换功能&#xff0c;今天实现进入其第二步的核心功能ExcelHelper实现。 01、接口设计 下面我们根据第一章中讲解的核心设计思路&#xff0c;先进行接口设计&#xff0c;确定Exce…

Android Studio 右侧工具栏 Gradle 不显示 Task 列表

问题&#xff1a; android studio 4.2.1版本更新以后AS右侧工具栏Gradle Task列表不显示&#xff0c;这里需要手动去设置 解决办法&#xff1a; android studio 2024.2.1 Patch 2版本以前的版本设置&#xff1a;依次打开 File -> Settings -> Experimental 选项&#x…

力扣hot100道【贪心算法后续解题方法心得】(三)

力扣hot100道【贪心算法后续解题方法心得】 十四、贪心算法关键解题思路1、买卖股票的最佳时机2、跳跃游戏3、跳跃游戏 | |4、划分字母区间 十五、动态规划什么是动态规划&#xff1f;关键解题思路和步骤1、打家劫舍2、01背包问题3、完全平方式4、零钱兑换5、单词拆分6、最长递…

计算机网络常见面试题总结(上)

计算机网络基础 网络分层模型 OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f; OSI 七层模型 是国际标准化组织提出的一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都需…

编译MT7620 OpenWrt的所有机型的固件

前置条件&#xff1a;准备VMware16Ubuntu16.04的编译环境 安装编译需要的插件 sudo apt-get install gcc g binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils libncurses5-dev ncurses-term zlib1g-dev gawk asciidoc libz-dev git-core uuid…

vue2+svg+elementui实现花瓣图自定义el-select回显色卡图片

项目需要实现花瓣图&#xff0c;但是改图表在echarts&#xff0c;highCharts等案例中均未出现&#xff0c;有类似的韦恩图&#xff0c;但是和需求有所差距&#xff1b; 为实现该效果&#xff0c;静态图表上采取svg来手动绘制花瓣&#xff1a; 确定中心点&#xff0c;以该点为中…

释放超凡性能,打造鸿蒙原生游戏卓越体验

11月26日在华为Mate品牌盛典上&#xff0c;全新Mate70系列及多款全场景新品正式亮相。在游戏领域&#xff0c;HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit&#xff08;图形加速服务…

Docker应用

一、需要知道什么&#xff08;先去了解一下&#xff09; Docker 概述 Docker 安装&#xff08;配置阿里云镜像加速器&#xff0c;要不 pull 镜像下载的慢&#xff09; portainer 可视化界面 关于镜像、容器、仓库的命令等 数据卷 Docker 网络 DockerFile DockerCompose …

Qt桌面应用开发 第十天(综合项目二 翻金币)

目录 1.主场景搭建 1.1重载绘制事件&#xff0c;绘制背景图和标题图片 1.2设置窗口标题&#xff0c;大小&#xff0c;图片 1.3退出按钮对应关闭窗口&#xff0c;连接信号 2.开始按钮创建 2.1封装MyPushButton类 2.2加载按钮上的图片 3.开始按钮跳跃效果 3.1按钮向上跳…

VScode离线下载扩展安装

在使用VScode下在扩展插件时&#xff0c;返现VScode搜索不到插件&#xff0c;网上搜了好多方法&#xff0c;都不是常规操作&#xff0c;解决起来十分麻烦&#xff0c;可以利用离线下载安装的方式安装插件&#xff01;亲测有效&#xff01;&#xff01;&#xff01; 1.找到VScod…

浅谈网络 | 应用层之HTTPS协议

目录 对称加密非对称加密数字证书HTTPS 的工作模式重放与篡改 使用 HTTP 协议浏览新闻虽然问题不大&#xff0c;但在更敏感的场景中&#xff0c;例如支付或其他涉及隐私的数据传输&#xff0c;就会面临巨大的安全风险。如果仍然使用普通的 HTTP 协议&#xff0c;数据在网络传输…