Таблица умножения с помощью двумерного массива
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]