Таблица умножения с помощью двумерного массива

1. Постановка задачи

Цель: Создать таблицу умножения 5×5 с помощью двумерного массива.

Результат:

  1   2   3   4   5
  2   4   6   8  10
  3   6   9  12  15
  4   8  12  16  20
  5  10  15  20  25

2. Алгоритм решения

Шаг 1: Объявление массива

var multiTable [5][5]int  // 5 строк × 5 столбцов

Шаг 2: Заполнение вложенными циклами

for i := 0; i < len(multiTable); i++ {       // Строки (0-4)
    for j := 0; j < len(multiTable[i]); j++ { // Столбцы (0-4)
        multiTable[i][j] = (i + 1) * (j + 1)
    }
}

Формула: (i + 1) × (j + 1) — индексы начинаются с 0, а таблица — с 1.

Шаг 3: Вывод таблицы

for i := 0; i < len(multiTable); i++ {
    for j := 0; j < len(multiTable[i]); j++ {
        fmt.Printf("%3d ", multiTable[i][j])  // Ширина 3 символа
    }
    fmt.Println()  // Переход на новую строку
}

3. Пошаговое выполнение (трассировка)

Первая итерация (i=0, j=0):

multiTable[0][0] = (0 + 1) * (0 + 1) = 1

Первая строка полностью (i=0):

j=0: (0+1) × (0+1) = 1
j=1: (0+1) × (1+1) = 2
j=2: (0+1) × (2+1) = 3
j=3: (0+1) × (3+1) = 4
j=4: (0+1) × (4+1) = 5

Результат: [1, 2, 3, 4, 5]

Вторая строка (i=1):

j=0: (1+1) × (0+1) = 2
j=1: (1+1) × (1+1) = 4
j=2: (1+1) × (2+1) = 6
...

Результат: [2, 4, 6, 8, 10]

Паттерн: Внутренний цикл выполняется полностью на каждой итерации внешнего (5 раз × 5 раз = 25 итераций).


4. Отладка задачи

Точка останова (breakpoint)

Поставить после заполнения массива, перед выводом:

// Заполнение завершено
// ← breakpoint здесь

// Вывод таблицы
fmt.Println("Таблица умножения:")

Просмотр массива в отладчике

multiTable = [5][5]int{
    {1, 2, 3, 4, 5},
    {2, 4, 6, 8, 10},
    {3, 6, 9, 12, 15},
    {4, 8, 12, 16, 20},
    {5, 10, 15, 20, 25},
}

Совет: Если непонятно — пройдите пошагово все 25 итераций с F10.


5. Универсальность решения

Изменение размера

var multiTable [7][5]int  // 7 строк, 5 столбцов

for i := 0; i < len(multiTable); i++ {
    for j := 0; j < len(multiTable[i]); j++ {
        multiTable[i][j] = (i + 1) * (j + 1)
    }
}

Результат: Таблица 7×5 — код работает без изменений!

Масштабируемость

var multiTable [100][100]int  // 100×100

Формула остаётся той же — решение в общем виде.


6. Форматирование вывода

Проблема

fmt.Printf("%d ", multiTable[i][j])

Вывод:

1 2 3 4 5
2 4 6 8 10

Столбцы не выравнены (1 vs 10).

Решение

fmt.Printf("%3d ", multiTable[i][j])  // Минимум 3 символа

Вывод:

  1   2   3   4   5
  2   4   6   8  10

Аккуратные столбцы!

Для больших таблиц (10×10):

fmt.Printf("%4d ", multiTable[i][j])  // 4 символа для 3-значных чисел

7. Ключевые концепции

Концепция Описание
Вложенные циклы Внешний = строки, внутренний = столбцы
Формула (i+1) × (j+1) — коррекция индексов с 0
Общее решение Работает для любого размера массива
Форматирование %Nd — выравнивание по ширине

8. Типичные ошибки

Забыли +1 в формуле:

multiTable[i][j] = i * j  // Первая строка = [0, 0, 0, 0, 0]

Неправильный порядок индексов:

multiTable[j][i] = ...  // Транспонирование!

Выход за границы:

for i := 0; i <= len(multiTable); i++  // Должно быть <, а не <=

9. Итоги

✅ Двумерный массив — естественная структура для таблиц
✅ Вложенные циклы — стандартный паттерн для 2D-обхода
✅ Хорошее решение работает для любых размеров
✅ Отладчик помогает понять порядок выполнения

Практика: Попробуйте сделать:

  • Таблицу 10×10
  • Таблицу сложения вместо умножения
  • Вывод только диагонали multiTable[i][i]