乘法表输出及其扩展(附带部分代码书写习惯) C++实现


前言

乘法表是在学习编程初级阶段常见的问题之一,可以加深我们对循环的理解与应用。

乘法表的思路并不复杂,代码结构简单,但是简单的代码更方便我们进行深层的思考,同样的功能实现,如何书写更加合理的代码,让代码看起来更加清晰美观的同时增强代码的扩展性,降低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函数置于前部,都是方便读者阅读代码的有效手段,为了代码可读性而增加一些行数无伤大雅,即便仅有一个函数也是如此,良好的代码习惯要从一开始就培养。


总结

从一个乘法表的实现我们可以深入挖掘,深层分析,以小见大,实现乘法表的方式还有很多,还可以通过函数的重载,实现由用户自定义输出行数,考虑到大部分读者可能并不需要,也就放弃了补充的想法,如果有读者想了解的话,可以评论或者私信我,我会积极补充。本文也就不再扩展分析了,希望我谈到的方式和良好的代码习惯能够对大家有一些帮助。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alkaid3529

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值