Menu
Coddy logo textTech

Выход из вложенных циклов

Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 2 из 68.

При работе с вложенными циклами обычный оператор break прерывает только самый внутренний цикл. Однако Go предоставляет метки, которые позволяют выходить из внешних циклов напрямую, обеспечивая точный контроль над сложными структурами циклов.

Метка — это идентификатор, за которым следует двоеточие, который вы помещаете перед циклом. Затем вы можете использовать break, за которым следует имя метки, чтобы выйти из этого конкретного цикла, даже из вложенных циклов.

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i == 1 && j == 1 {
            break outer
        }
        fmt.Printf("i=%d, j=%d\n", i, j)
    }
}

В этом примере, когда условие i == 1 && j == 1 выполняется, break outer немедленно завершает выполнение как внутреннего, так и внешнего циклов. Это особенно полезно при поиске в двумерных структурах данных, когда необходимо полностью прекратить поиск, как только вы найдете то, что искали.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

В этом испытании вы попрактикуетесь в использовании именованных операторов break для выхода из вложенных циклов при поиске в двумерной сетке. Вам нужно найти определенное целевое число в сетке и немедленно прекратить поиск, как только вы его найдете.

Вы получите два входных значения:

  • Строку, представляющую размеры сетки в формате "rows,cols" (например, "3,4")
  • Строку, представляющую целевое число для поиска (например, "7")

Вам предоставлена следующая двумерная сетка чисел:

grid := [][]int{
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
}

Ваша задача:

  1. Разобрать размеры из первого входного значения, чтобы определить, сколько строк и столбцов нужно просмотреть
  2. Разобрать целевое число из второго входного значения
  3. Использовать вложенные циклы с именованным break для поиска по сетке
  4. Когда вы найдете целевое число, выведите "Found [target] at position ([row], [col])" и немедленно выйдите из обоих циклов, используя именованный break
  5. Если вы завершите поиск, не найдя цели, выведите "Target [target] not found"

Позиция должна быть указана с использованием индексации, начинающейся с 0 (первая строка — 0, первый столбец — 0).

Шпаргалка

Метки позволяют выходить из внешних циклов изнутри вложенных циклов. Метка — это идентификатор, за которым следует двоеточие, помещенный перед циклом.

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if condition {
            break outer  // выход из обоих циклов
        }
    }
}

Используйте break, за которым следует имя метки, чтобы выйти из конкретного цикла, даже из глубоко вложенных структур. Это полезно при поиске в двумерных данных, когда вы хотите полностью остановиться, как только найдете цель.

Попробуйте сами

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    // Чтение входных данных
    var dimensions string
    var targetStr string
    fmt.Scanln(&dimensions)
    fmt.Scanln(&targetStr)
    
    // Разбор размеров
    dimParts := strings.Split(dimensions, ",")
    rows, _ := strconv.Atoi(dimParts[0])
    cols, _ := strconv.Atoi(dimParts[1])
    
    // Разбор целевого числа
    target, _ := strconv.Atoi(targetStr)
    
    // Предопределенная сетка
    grid := [][]int{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    }
    
    // TODO: Напишите свой код ниже
    // Используйте вложенные циклы с именованным break для поиска цели
    
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком