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