从用户获得2个输入后,需要以非常特定的方式创建一个乘法表

时间:2019-02-02 00:02:02

标签: c++ c++14

我们正在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 个答案:

答案 0 :(得分:1)

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

我建议从一开始就省去这些,而仅打印乘积本身,例如

...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。 我们已经钉上了这段代码,只需要在外循环之前添加它即可。

(还有另外一项添加代码的任务,即在左上角添加空格。 稍后我们将通过header列进行处理,但现在,我们所拥有的将与乘法表保持一致。)

// 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()函数内部,取出我们不需要的位了。