在获得用户的2个输入后,需要以非常具体的方式创建乘法表

Need to create a multiplication table in a very specific way after getting 2 inputs from the user

本文关键字:非常 方式 创建 用户 2个 输入      更新时间:2023-10-16

我们正在学习C++类中的for循环,我们被要求从用户那里获得2到10之间的2个输入。然后生成一个看起来像这样的表:(在这个例子中,两个输入是5和7)

.....1...2...3...4...5...6...7
.1...1...2...3...4...5...6...7
.2...2...4...6...8..10..12..14
.3...3...6...9..12..15..18..21
.4...4...8..12..16..20..24..28
.5...5..10..15..20..25..30..35

基本上是将轴上的每个数字相乘,然后显示在中间(乘法表)。我对iomanip很满意,不需要帮助调整数字。我只是不完全理解如何使用for循环产生实际的乘法。

我试过几件事,但老实说,我不知道该去哪里。以下是我目前拥有的

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
int userInputX;
int userInputY;
do {
do {
cin >> userInputX;
} while (((1 > userInputX) || (userInputX > 11)));
do {
cin >> userInputY;
} while (((1 > userInputY) || (userInputY > 11)));
for (int i = 1; i <= userInputY; i++) {
cout << setw(5) << right << setfill('.') << i;
}
cout << 'n';
for (int k = 1; k <= userInputY; k++) {
cout << setw(5) << right << setfill('.') << k;
}
cout << "n";
for (int i = 1; i <= userInputX; i++) {
cout << setw(5) << right << setfill('.') << i;
}
cout << "n";
} while (false);
return 0;
}

由于需要打印标题行和列,此任务变得更加复杂。

我建议从忽略这些开始,只打印乘法本身,例如

...1...2...3...4
...2...4...6...8
...3...6...9..12

只打印表格

为此,我们需要一个嵌套循环-一个内循环外循环

  • 内部循环将输出一行(即,一行中的每个数字,每列一个数字)
  • 外循环将为每行执行一次内循环
// outer loop: for each row
for (int i = 1; i <= userInputY; i++) {
// inner loop: for each column in the row
for (int j = 1; j <= userInputX; j++) {
// [code to print i*j]
}
// [code to print a newline after each row]
}

最终,内部循环中的代码将运行(rows * columns)次,这正是我们所期望的。

只有几个空格需要填写。

我们已经有了打印数字所需的代码,用点填充。我们只需要调整它来输出ij的乘积,而不仅仅是循环计数器变量本身。

一旦我们完成了这项工作,我们就有了可以打印出上表的代码。

现在,我们必须研究如何添加标题行和列。这实际上是两个独立的任务:

打印标题行

  1. 要添加标题行,我们必须添加仅打印数字1..userInputX的代码。我们已经确定了这个代码,我们只需要在外循环之前添加它

(左上角还有添加代码的额外任务。稍后我们将在标题列中处理此问题,但目前,我们所拥有的内容将与乘法表对齐。)

// row header loop: for each column
for (int j = 1; j <= userInputX; j++) {
// [code to print each 'j']
}
// outer loop: for each row
...

(哦,我差点忘了:在打印标题行之后,我们还必须在行标题循环之后,在外循环运行之前打印一行换行符。)

打印标题列

要添加标题行,我们必须在第一列之前每行打印一次额外的数字。这意味着我们必须将代码放在外循环中,就在内循环开始之前。

...
// outer loop: for each row
for (int i = 1; i <= userInputY; i++) {
// [code to print 'i']
// inner loop: for each column in the row
...

当我们这样做时,标题行将错位,因为它在第一列中需要.。在打印标题行之前,我们需要添加代码来完成此操作:

// print '.' in top-left corner
// [code to print '.']
// row header loop: for each column
...

这很简单,只需使用我们的代码打印一个数字,然后用'.'字符替换该数字。

最终代码结构

我们剩下的是:

// print '.' in top-left corner
// [code to print '.']
// row header loop: for each column
for (int j = 1; j <= userInputX; j++) {
// [code to print each 'j']
}
// [code to print a newline after header row]

// outer loop: for each row
for (int i = 1; i <= userInputY; i++) {
// inner loop: for each column in the row
for (int j = 1; j <= userInputX; j++) {
// [code to print each i*j]
}
// [code to print a newline after each row]
}

这是代码的最终结构。剩下的就是填空,把它放在上面提供的main()函数中,去掉我们不再需要的部分。