Практика с двумерными массивами и отладка
1. Философия обучения программированию
Ключевое различие
- Синтаксис языка ≠ Умение решать задачи
- Алгоритмы ≠ Backend-разработка
Подход курса
✅ Практическое применение структур данных
✅ Решение реальных задач
❌ Академические алгоритмы (красно-чёрные деревья, графы и т.п.)
Цель: Научиться применять массивы для хранения и обработки данных, а не зубрить теорию.
2. Практический пример: игровое поле (крестики-нолики)
Представление данных
Двумерный массив = таблица = игровое поле.
board := [3][3]string{
{"X", "O", "X"},
{"O", "X", "O"},
{"X", ".", "."},
}
Обозначения:
"X"— ход крестиков"O"— ход ноликов"."или" "— пустая клетка
Вывод игрового поля
for row := 0; row < len(board); row++ {
for col := 0; col < len(board[row]); col++ {
fmt.Printf("%s ", board[row][col])
}
fmt.Println() // Переход на новую строку
}
Результат:
X O X
O X O
X . .
3. Отладка вложенных циклов (debugger)
Зачем использовать отладчик
- Понять порядок выполнения вложенных циклов
- Увидеть значения переменных на каждом шаге
- Проверить логику обхода двумерного массива
Пошаговая отладка (F10 в VS Code/GoLand)
Шаг 1: Инициализация внешнего цикла
for row := 0; row < len(board); row++ {
- Создаётся переменная
row = 0 - Проверяется условие
0 < 3→ true - Управление переходит внутрь цикла
Переменные:
row = 0
Шаг 2: Инициализация внутреннего цикла
for col := 0; col < len(board[row]); col++ {
- Создаётся переменная
col = 0 - Проверяется условие
0 < 3→ true - Управление переходит к телу цикла
Переменные:
row = 0
col = 0
Шаг 3: Вывод элемента
fmt.Printf("%s ", board[row][col])
board[0][0]→"X"- Выводится:
X
Визуализация:
[0][0] = X ← текущий элемент
[0][1] = O
[0][2] = X
...
Шаг 4: Инкремент col
col++→col = 1- Проверка условия
1 < 3→ true - Снова тело цикла:
board[0][1]→"O"
Переменные:
row = 0
col = 1
Вывод: X O
Шаг 5: Завершение внутреннего цикла
col = 2→ выводboard[0][2]→"X"col++→col = 3- Проверка
3 < 3→ false - Внутренний цикл завершён, управление возвращается к внешнему
Результат первой итерации:
X O X
Шаг 6: Инкремент row
row++→row = 1- Внутренний цикл снова запускается с
col = 0 - Процесс повторяется для второй строки
4. Порядок выполнения вложенных циклов
ВНЕШНИЙ ЦИКЛ (row):
row = 0
ВНУТРЕННИЙ ЦИКЛ (col):
col = 0 → board[0][0]
col = 1 → board[0][1]
col = 2 → board[0][2]
row = 1
ВНУТРЕННИЙ ЦИКЛ (col):
col = 0 → board[1][0]
col = 1 → board[1][1]
col = 2 → board[1][2]
row = 2
ВНУТРЕННИЙ ЦИКЛ (col):
col = 0 → board[2][0]
col = 1 → board[2][1]
col = 2 → board[2][2]
Правило: Внутренний цикл полностью выполняется на каждой итерации внешнего.
5. Практические советы по отладке
Использование отладчика
- Поставьте breakpoint на строку с внешним циклом
- F10 — выполнить текущую строку (Step Over)
- Следите за переменными в панели отладчика
- Наводите курсор на переменные для просмотра значений
Ручная трассировка
Если отладчик недоступен, добавьте вывод:
for row := 0; row < len(board); row++ {
for col := 0; col < len(board[row]); col++ {
fmt.Printf("board[%d][%d] = %s\n", row, col, board[row][col])
}
}
Вывод:
board[0][0] = X
board[0][1] = O
board[0][2] = X
board[1][0] = O
...
6. Практическое применение массивов
| Задача | Структура данных |
|---|---|
| Игровое поле 3×3 | [3][3]string |
| Таблица студентов и оценок | [студенты][предметы]int |
| Календарь (недели × дни) | [4][7]string |
| Изображение (пиксели) | [высота][ширина]цвет |
Ключевая идея: Если данные можно представить как таблицу → используйте двумерный массив.
7. Итоги
Что важно
✅ Практика > теория
✅ Отладчик — лучший учитель для понимания вложенных циклов
✅ Двумерные массивы = естественное представление табличных данных
✅ Изучение языка ≠ зубрёжка алгоритмов
Следующий шаг
Экспериментируйте с кодом:
- Измените размер поля на
4×4 - Добавьте проверку победы (3 в ряд)
- Используйте отладчик для каждой новой задачи
Формула успеха:
Теория + Практика + Отладка = Понимание