Нужно создать таблицу умножения очень специфическим способом после получения 2 входных данных от пользователя - PullRequest
0 голосов
/ 02 февраля 2019

Мы изучаем циклы for в моем классе C ++, и нас просят получить 2 ввода от пользователя между 2 и 10. Затем создайте таблицу, которая выглядит примерно так: (в этом примере два ввода были 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 голосов
/ 02 февраля 2019

Эта задача усложнилась из-за необходимости печатать строку заголовка и столбец.

Я бы порекомендовал начать с того, что опустить их, и просто напечатать сами умножения, например

...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) раз, что мы и ожидали.

Есть всего пара пробелов для заполнения.

У нас уже есть код, необходимый для печати числа, дополненного точками.Нам просто нужно адаптировать это для вывода продукта i и j, а не только для переменной счетчика циклов.

Как только мы это сделаем, у нас будет код, который можетраспечатайте приведенную выше таблицу.

Теперь нам нужно решить, как добавить строку и столбец заголовка.На самом деле это две отдельные задачи:

Печать строки заголовка

  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(), которую вы предоставили выше, вынимая ненужные нам биты.

...