前言
乘法表是在学习编程初级阶段常见的问题之一,可以加深我们对循环的理解与应用。
乘法表的思路并不复杂,代码结构简单,但是简单的代码更方便我们进行深层的思考,同样的功能实现,如何书写更加合理的代码,让代码看起来更加清晰美观的同时增强代码的扩展性,降低debug的难度,这对于形成自己的代码风格都是十分有益的。
我会通过乘法表这个例子,适当深入的分析一下代码从无到有,从有到佳的过程,我认为,代码的功能实现是一方面,精致的代码也很重要,保证代码功能完善的情况下写出漂亮的代码应该是我们共同的追求。
本文将进行一定的深入分析,给大家带来一些让代码更加“合理精致”的小tips。
本人能力有限,如有考虑不全面的地方也欢迎大家指正补充。
一、理论思路分析
如图所示,我们首先来分析乘法表的输出思路。
首先考虑利用循环输出,观察可知,整个乘法表从第一行之最后一行结构相同,共同点在于同一行的乘数(乘号后的数字)都相同且逐行递增。在每一行中,从第一个等式到最后一个等式共同点在于被乘数(乘号前的数字)逐个递增,那么我们可以大致得到解题思路:两层循环,内层对单个等式循环,从而打印一行;外层对单行循环,从而打印整张表。
理论分析完毕,接下来我们代码实现。
二、代码实现与改进
1.主函数直接打印
代码如下(示例):
/* Alkaid#3529 */
#include <iostream>
using namespace std;
int main()
{
// 两层循环打印乘法表
for (int i = 1; i < 10; i++) // 第一层循环中,i作为逐行循环中的乘数,单行相同,逐行递增
{
for (int j = 1; j < i + 1; j++) // 第二层循环中,j作为每个等式中的被乘数,单行逐个递增
{
cout << j << " * " << i << " = " << j * i << " ";
}
cout << endl;
}
return 0;
}
运行后我们可以发现,虽然实现了输出功能,但是输出结果美中不足:第三行与第四行有部分等式并未对齐,观察可知,是因为乘积的位数并不一致,因此,我们对乘积进行分类讨论,增加判断条件,从而调齐整表。
代码如下(示例):
/* Alkaid#3529 */
#include <iostream>
using namespace std;
int main()
{
// 两层循环打印乘法表
for (int i = 1; i < 10; i++) // 第一层循环中,i作为逐行循环中的乘数,单行相同,逐行递增
{
for (int j = 1; j < i + 1; j++) // 第二层循环中,j作为每个等式中的被乘数,单行逐个递增
{
if (j * i < 10) // 如果乘积小于10,则多输出一个空格
cout << j << " * " << i << " = " << j * i << " ";
else // 否则无需处理
cout << j << " * " << i << " = " << j * i << " ";
}
cout << endl;
}
return 0;
}
调整后,整表输出美观,符合示例。
2.调用函数打印
主函数输出固然实现过程简洁,但是增加了主函数的复杂度,如果学习了函数的相关知识的话,我们可以考虑通过调用函数输出,从而大幅降低主函数复杂度,使得整篇代码思路更为清晰,方便阅读。
代码如下(示例):
/* Alkaid#3529 */
#include<iostream>
using namespace std;
/* 输出九九乘法表 */
void outputs_multiplication_table();
int main()
{
outputs_multiplication_table();
return 0;
}
void outputs_multiplication_table()
{
// 两层循环打印乘法表
for (int i = 1; i < 10; i++) // 第一层循环中,i作为逐行循环中的乘数,单行相同,逐行递增
{
for (int j = 1; j < i + 1; j++) // 第二层循环中,j作为每个等式中的被乘数,单行逐个递增
{
if (j * i < 10) // 如果乘积小于10,则多输出一个空格
cout << j << " * " << i << " = " << j * i << " ";
else // 否则无需处理
cout << j << " * " << i << " = " << j * i << " ";
}
cout << endl;
}
return;
}
可以明显看出,main函数只需调用我们写好的 outputs_multiplication_table() 函数即可实现功能,使用简单,也方便后续增加功能,增强了代码扩展性。
有读者可能会说:“最开始的两行函数声明完全没必要,只要把函数实现放在main函数前面就可以,徒增代码行数罢了”,对此我的解释是,这样的做法确实不影响代码执行与输出结果,但是从代码和理性的角度来分析,行数的多少绝不是评判代码优劣的标准,但是设想,这个项目中有着众多函数呢?那种情况下也要为了减少代码行数而放弃函数声明吗?那样无疑会增加代码阅读难度,得不偿失。
因此无论是函数声明开头还是main函数置于前部,都是方便读者阅读代码的有效手段,为了代码可读性而增加一些行数无伤大雅,即便仅有一个函数也是如此,良好的代码习惯要从一开始就培养。
总结
从一个乘法表的实现我们可以深入挖掘,深层分析,以小见大,实现乘法表的方式还有很多,还可以通过函数的重载,实现由用户自定义输出行数,考虑到大部分读者可能并不需要,也就放弃了补充的想法,如果有读者想了解的话,可以评论或者私信我,我会积极补充。本文也就不再扩展分析了,希望我谈到的方式和良好的代码习惯能够对大家有一些帮助。