【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(),使得代码的格式化输出更加灵活。输出的精度控制不仅使得结果准确,也大幅提高了代码的可读性与规范性。


在这里插入图片描述


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

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

相关文章

Kafka配置SASL/PLAINTEXT安全认证

1、下载安装 Kafka下载地址&#xff1a;Apache Kafka 下载文件 wget https://downloads.apache.org/kafka/3.8.0/kafka_2.12-3.8.0.tgz 文件解压缩 tar -zxvf kafka_2.12-3.8.0.tgz 进入目录 cd kafka_2.12-3.8.0 2、Zookeeper 配置 2.1、修改 Zookeeper 配置文件 con…

go并发设计模式runner模式

go并发设计模式runner模式 真正运行的程序不可能是单线程运行的&#xff0c;go语言中最值得骄傲的就是CSP模型了&#xff0c;可以说go语言是CSP模型的实现。 假设现在有一个程序需要实现&#xff0c;这个程序有以下要求&#xff1a; 程序可以在分配的时间内完成工作&#xff0…

机器学习周志华学习笔记-第13章<半监督学习>

机器学习周志华学习笔记-第13章&#xff1c;半监督学习&#xff1e; 卷王&#xff0c;请看目录 13半监督学习13.1 生成式方法13.2 半监督SVM13.3 基于分歧的方法13.4 半监督聚类 13半监督学习 前面我们一直围绕的都是监督学习与无监督学习&#xff0c;监督学习指的是训练样本包…

DevOps工程技术价值流:GitLab源码管理与提交流水线实践

在当今快速迭代的软件开发环境中&#xff0c;DevOps&#xff08;开发运维一体化&#xff09;已经成为提升软件交付效率和质量的关键。而GitLab&#xff0c;作为一个全面的开源DevOps平台&#xff0c;不仅提供了强大的版本控制功能&#xff0c;还集成了持续集成/持续交付(CI/CD)…

Android笔记【12】脚手架Scaffold和导航Navigation

一、前言 学习课程时&#xff0c;对于自己不懂的点的记录。 对于cy老师第二节课总结。 二、内容 1、PPT介绍scaffold 2、开始代码实操 先新建一个screen包&#xff0c;写一个Homescreen函数&#xff0c;包括四个页面。 再新建一个compenent包&#xff0c;写一个displayText…

动态规划-----路径问题

动态规划-----路径问题 下降最小路径和1&#xff1a;状态表示2&#xff1a;状态转移方程3 初始化4 填表顺序5 返回值6 代码实现 总结&#xff1a; 下降最小路径和 1&#xff1a;状态表示 假设&#xff1a;用dp[i][j]表示&#xff1a;到达[i,j]的最小路径 2&#xff1a;状态转…

C_字符串的一些函数

1.字符串输入函数 scanf("%s",数组名)&#xff1b; gets(数组名)&#xff1b; 区别&#xff1a; scanf(“%s”,数组名); 把空格识别为输入结束 #include <stdio.h>int main() {char a[10];printf("输入&#xff1a;");scanf("%s",a)…

【数据事务】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

Zookeeper集群数据是如何同步的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper集群数据是如何同步的?】面试题。希望对大家有帮助&#xff1b; Zookeeper集群数据是如何同步的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper集群中的数据同步是通过一种称为ZAB&#xff08;Zo…

MySQL需掌握到何种程度?才能胜任工作

大家好&#xff0c;我是袁庭新。星友问&#xff1a;MySQL需要学到什么程度&#xff1f;才能胜任日常的软件开发工作呢&#xff01;以下是一些建议的学习目标和程度&#xff0c;这些目标旨在帮助你在工作中高效地使用MySQL。 数据库的基本概念、MySQL的安装及配置、SQL的概念、S…

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…

Qt 2D绘图之三:绘制文字、路径、图像、复合模式

参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…

java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍&#xff1a; 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档&#xff08;例如Word格式文件&#xff09;导入系统&#xff0c;通过数据清洗、向量化处理…

Java 基于Spring AI RAG组件做AI智能问答_rag检索增强_AI智能问答

基于RAG技术构建高效Java智能问答客服机器人 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以构建高效的Java智能问答客服机器人。首先&#xff0c;通过向量化处理将Word格式的问答QA文档转换为机器可理解的形式&#xff0c;并存储于Vect…

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09; 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

6.824/6.5840(2024)环境配置wsl2+vscode

本文是经过笔者实践得出的最速の环境配置 首先&#xff0c;安装wsl2和vscode 具体步骤参见Mit6.s081环境配置踩坑之旅WSL2VScode_mit6s081-CSDN博客 接下来开始为Ubuntu(笔者使用的版本依然是20.04)配置go的相关环境 1、更新Ubuntu的软件包 sudo apt-get install build-es…

【排序用法】.NET开源 ORM 框架 SqlSugar 系列

&#x1f4a5; .NET开源 ORM 框架 SqlSugar 系列 &#x1f389;&#x1f389;&#x1f389; 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

本篇将带你实现一个升级版的数字猜谜游戏。相比基础版&#xff0c;新增了计分和历史记录功能&#xff0c;用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。 关键词 UI互动应用数字猜谜状态管理历史记录用户交互 一…