【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.mzph.cn/pingmian/62858.shtml

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

相关文章

6.824/6.5840 Lab 3: Raft——Part 3B3C

芙蓉花又栖满了枝头 奈何蝶难留 漂泊如江水向东流 望断门前隔岸的杨柳 寂寞仍不休 我无言让眼泪长流 ——山外小楼夜听雨 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 在完成Lab之前&#xff0c;务必把论文多读几遍&#xff0c;力求完全理解Leader选举、…

LeetCode - #150 逆波兰表达式求值

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

【C++】continue语句、goto语句

1、continue 语句 作用&#xff1a;在循环语句中&#xff0c;跳过本次循环中余下尚未执行的语句。继续下一次循环。 注意&#xff1a;continue只能用于循环中。 示例&#xff1a; 代码&#xff1a; //continue的用法 #include<iostream> using namespace std; int ma…

最长最短单词

最长最短单词 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入1行句子&#xff08;不多于200个单词&#xff0c;每个单词长度不超过100&#xff09;&#xff0c;只包含字母、空格和逗号。单词由至少一…

ESP32项目 --- 智能门锁(WiFi 蓝牙 OTA)

1 项目简介 1.1 项目概述 本项目是实现一款智能门锁中的智能控制部分, 可以应用在家庭, 办公室等任何使用门锁的场所. 本项目实现了以下主要功能: &#xff08;1&#xff09;通过按键配置密码 &#xff08;2&#xff09;通过按键输入密码开锁 &#xff08;3&#xff09;录…

洛谷题单-入门2-分支结构-python-下

找出出现的最早的最大值 count 0 list_number [] while True:list_number.append(list(map(int, input().split())))count 1if count 7:breaklist2_number_total []for i1,i2 in list_number:list2_number_total.append(i1i2)target max(list2_number_total)index 0 if…

框架模块说明 #05 权限管理_03

背景 权限设计可以分为两个主要方面&#xff1a;操作权限和数据权限。前两篇文章已经详细介绍了操作权限的设计与实现&#xff0c;以及如何将其与菜单关联起来的具体方法。本篇将聚焦于数据权限&#xff0c;为您深入讲解相关的设计与实现方式。 全局开关 Value("${syst…

Linux网络编程之---多线程实现并发服务器

下面我们来使用tcp集合多线程实现并发服务器 一.服务端 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h>typedef struct sockinfo {char ip[16];unsigne…

Linux C/C++编程之静态库

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…

网际协议(IP)与其三大配套协议(ARP、ICMP、IGMP)

网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;&#xff0c;又称互联网协议。是OSI中的网络层通信协议&#xff0c;用于跨网络边界分组交换。它的路由功能实现了互联互通&#xff0c;并从本质上建立了互联网。网际协议IP是 TCP/IP 体系中两个最主要的协议之…

uniapp实现加密Token并在每次请求前动态更新(vue、微信小程序、原生js也通用!)

导语&#xff1a;在Web开发中&#xff0c;Token作为一种身份验证的机制&#xff0c;被广泛应用于前后端交互过程中。本文将为大家介绍如何在每次请求前动态设置加密的Token&#xff0c;并在请求一次后使Token值加1&#xff08;或其他动态改变的逻辑&#xff09;&#xff0c;从而…

IDL学习笔记(二)IDL处理卫星数据

IDL处理卫星数据 HDF文件数据集属性通用属性 常用HDF4操作函数常用的HDF5操作函数读取HDF文件的一般步骤 HDF4文件读取-----数据信息查询HDF4文件读取示例-----目标数据TIFF输出 HDF文件 数据集属性 数据集名称&#xff0c;是“&#xff1a;”前的一部分&#xff0c;不是long_…

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…

TCP/IP协议簇自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 曾经&#xff0c;我只知道socket函数能进行网络间数据的通信&#xff0c;知道tcp/ip协议也是用来进行网络数据…

c++领域展开第一幕——入门基础(命名空间、iostream、缺省参数、函数重载、nullptr、inline(内联函数))超详细!!!!

文章目录 前言一、c的第一个程序二、命名空间2.1 namespace 的价值2.2 namespace 的定义2.3 命名空间的使用 三、c的输入和输出四、缺省参数五、函数重载六、nullptr七、inline总结 前言 今天小编带着大家进入c的大门&#xff0c;虽然c难&#xff0c;但好事多磨&#xff0c;一起…

DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试&#xff0c;于是配置并记录了一下&#xff1a; 首先运行ros接口的dm-vio&#xff0c;一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压&#xff0c;并安装一下依赖&#xff1a; sudo apt-get install …

基于Java Springboot成人教育APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

基于Java Springboot个人财务APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕 设置使用下载地址 设置 使用 下载地址 https://www.videohelp.com/software/PotPlayer

【软考网工笔记】网络基础理论——传输层

IPSec协议 Internet协议安全性是一种开放标准的框架结构&#xff0c;通过使用加密的安全服务以确保在Internet协议&#xff08;IP&#xff09;网络上进行保密而安全的通讯。 工作在OSI模型的第三层网络层上&#xff0c;使其在单独使用时适于保护基于TCP或UDP的协议&#xff0…