文章目录
- 💯前言
- 💯第一题:圆的计算
- 我的代码实现
- 代码分析
- 改进建议
- 改进代码
- 老师的代码实现
- 代码分析
- 可以改进的地方
- 改进代码
- 💯第二题:对齐输出
- 我的代码实现
- 代码分析
- 改进建议
- 改进代码
- 改进点解释
- 老师的代码实现
- 代码分析
- 改进建议
- 改进代码
- 改进点解释
- 💯小结
💯前言
- 本文深入探讨了两道与计算输出相关的编程问题,涵盖从
题目描述
到代码实现的逐步剖析及优化策略。我们分别讨论了题目的需求、代码实现过程
、老师给出的改进方案,并提出了多种优化思路,以帮助读者更好地理解和掌握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;
}
代码分析
- 代码结构:此代码采用了C语言风格的输入和输出函数
scanf
和printf
,虽然这在C语言中很常见,但在C++中逐渐被更现代化的输入输出方法替代。 - 计算:代码对直径、周长和面积的计算公式是正确的,且使用了精确的数学表达式。
- 格式输出:
printf("%.4lf %.4lf %.4lf", ...)
确保了保留小数点后 4 位,这符合题目要求。
改进建议
- 输入检查:代码缺少对输入半径的有效性检查,例如确保
r
的值在 0 到 10000 之间。有效的输入检查对于保障程序的稳定性和正确性至关重要。 - 输出格式潜在错误:在处理格式化输出时,任何不精确之处,例如缺少空格或者小数点后不精确的数值,都可能导致程序未能通过评测器检查。因此,保证输出的格式精确性是通过测试的关键。
改进代码
#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;
}
改进点:
- 添加了输入有效性检查,确保
r
的值合理。这对于处理边界情况和不合法的输入值是非常重要的。 - 在输出中添加换行符,确保输出格式符合要求,便于阅读和评测。
老师的代码实现
您提供的老师代码如下:
#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;
}
代码分析
- 使用现代C++输入输出:代码中使用了
cin
和cout
,这更符合现代C++编程规范,并且比C风格的输入输出更为简洁和类型安全。 - 常量定义:使用了
const double PI = 3.14159;
,这使得代码更具可维护性和可读性。常量定义有助于减少魔法数字的出现,从而使代码逻辑更加清晰。 - 混用输出方式:虽然输入部分使用了
cin
,但输出部分依旧使用了printf
,这导致代码风格混杂,不利于代码的统一性和规范性。
可以改进的地方
- 使用一致的C++风格输出:可以使用
cout
和<iomanip>
提供的工具,如setprecision
来控制输出精度。这不仅统一了代码风格,而且能更好地控制输出格式。 - 增强代码一致性:保持输入输出风格的一致性,尤其是在团队开发中,有助于代码的易读性和维护性。
改进代码
#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;
}
代码分析
- 简洁性:代码逻辑简单明了,使用
scanf
输入三个整数,再用printf
对其输出,结构直观清晰。 - 对齐输出:使用了
%8d
来确保每个整数占用 8 个字符宽度,符合题目要求。
改进建议
- 一致性:虽然题目未要求,但在输出末尾加上换行符使得结果更为规范和美观。
- 考虑更现代的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;
}
改进点解释
- 在输出末尾添加换行符,确保格式整齐,符合规范性要求。
- 输出结束后移动到下一行,有助于后续操作的可读性。
老师的代码实现
#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;
}
代码分析
- 现代输入方式:使用
cin
来输入数据,符合C++标准,更加类型安全。 - 混合风格:虽然输入部分使用了C++的
cin
,但输出部分仍然使用C风格的printf
,不利于代码的一致性和规范性。
改进建议
- 统一风格:建议统一使用
cin
和cout
,确保代码风格的一致性,提升代码的可读性。 - 使用
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;}
改进点解释
- 使用现代C++输出风格:
cout
与setw()
的结合使得代码风格一致,且输出更加符合规范。 - 对齐控制:使用
setw(8)
来控制每个整数的输出宽度,使其符合题目中对对齐输出的严格要求。
💯小结
通过上述代码的实现与优化,我们从以下几个方面深入讨论了C++代码的优化策略:
-
输入和输出的现代化:老师在改进中引入了现代C++的
cin
和cout
,逐步取代了C风格的scanf
和printf
。这种转变不仅提升了类型安全性,也符合现代C++编程的最佳实践。 -
常量的引入:在数学计算中,使用
const
定义常量可以增强代码的可维护性和可读性,减少了硬编码的弊端,便于后续修改和代码重用。 -
输入有效性检查:无论是学术研究还是工业应用,健壮性都是软件系统的重要指标。我们在代码中添加了输入有效性检查,以防止非法输入导致的未定义行为,提高了程序的稳定性和可靠性。
-
格式化输出的精度控制:采用
<iomanip>
库的工具,如setw()
和setprecision()
,使得代码的格式化输出更加灵活。输出的精度控制不仅使得结果准确,也大幅提高了代码的可读性与规范性。