Практика с двумерными массивами и отладка

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 < 3true
  • Управление переходит внутрь цикла

Переменные:

row = 0

Шаг 2: Инициализация внутреннего цикла

for col := 0; col < len(board[row]); col++ {
  • Создаётся переменная col = 0
  • Проверяется условие 0 < 3true
  • Управление переходит к телу цикла

Переменные:

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 < 3true
  • Снова тело цикла: board[0][1]"O"

Переменные:

row = 0
col = 1

Вывод: X O


Шаг 5: Завершение внутреннего цикла

  • col = 2 → вывод board[0][2]"X"
  • col++col = 3
  • Проверка 3 < 3false
  • Внутренний цикл завершён, управление возвращается к внешнему

Результат первой итерации:

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. Практические советы по отладке

Использование отладчика

  1. Поставьте breakpoint на строку с внешним циклом
  2. F10 — выполнить текущую строку (Step Over)
  3. Следите за переменными в панели отладчика
  4. Наводите курсор на переменные для просмотра значений

Ручная трассировка

Если отладчик недоступен, добавьте вывод:

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 в ряд)
  • Используйте отладчик для каждой новой задачи

Формула успеха:

Теория + Практика + Отладка = Понимание