Menu
Coddy logo textTech

Przerywanie zagnieżdżonych pętli

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 2 z 68.

Podczas pracy z zagnieżdżonymi pętlami zwykła instrukcja break kończy tylko najbardziej wewnętrzną pętlę. Go udostępnia jednak etykiety, które pozwalają bezpośrednio przerwać zewnętrzne pętle, dając precyzyjną kontrolę nad złożonymi strukturami pętli.

Etykieta to identyfikator, po którym następuje dwukropek, umieszczany przed pętlą. Możesz wtedy użyć break, a następnie nazwy etykiety, aby zakończyć działanie konkretnej pętli, nawet z poziomu zagnieżdżonych pętli.

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)
    }
}

W tym przykładzie, gdy warunek i == 1 && j == 1 jest spełniony, break outer natychmiast kończy zarówno pętlę wewnętrzną, jak i zewnętrzną. Jest to szczególnie przydatne podczas przeszukiwania dwuwymiarowych struktur danych, gdy chcesz całkowicie przerwać wyszukiwanie po znalezieniu tego, czego szukasz.

challenge icon

Wyzwanie

Łatwy

W tym wyzwaniu poćwiczysz używanie instrukcji break z etykietą, aby wychodzić z zagnieżdżonych pętli podczas przeszukiwania siatki 2D. Musisz znaleźć w siatce określoną liczbę docelową i natychmiast przerwać przeszukiwanie, gdy ją znajdziesz.

Otrzymasz dwa wejścia:

  • Ciąg znaków reprezentujący wymiary siatki w formacie "rows,cols" (np. "3,4")
  • Ciąg znaków reprezentujący szukaną liczbę docelową (np. "7")

Otrzymasz następującą siatkę liczb 2D:

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

Twoje zadanie:

  1. Przeanalizować wymiary z pierwszego wejścia, aby określić, ile wierszy i kolumn przeszukać
  2. Przeanalizować liczbę docelową z drugiego wejścia
  3. Użyć zagnieżdżonych pętli z instrukcją break z etykietą, aby przeszukać siatkę
  4. Po znalezieniu liczby docelowej wypisać "Found [target] at position ([row], [col])" i natychmiast wyjść z obu pętli za pomocą instrukcji break z etykietą
  5. Jeśli zakończysz przeszukiwanie i nie znajdziesz liczby docelowej, wypisać "Target [target] not found"

Pozycję należy podać przy użyciu indeksowania od 0 (pierwszy wiersz ma indeks 0, pierwsza kolumna ma indeks 0).

Spróbuj swoich sił

package main

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

func main() {
    // Wczytaj dane wejściowe
    var dimensions string
    var targetStr string
    fmt.Scanln(&dimensions)
    fmt.Scanln(&targetStr)
    
    // Przeanalizuj wymiary
    dimParts := strings.Split(dimensions, ",")
    rows, _ := strconv.Atoi(dimParts[0])
    cols, _ := strconv.Atoi(dimParts[1])
    
    // Przeanalizuj szukaną liczbę
    target, _ := strconv.Atoi(targetStr)
    
    // Wstępnie zdefiniowana siatka
    grid := [][]int{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    }
    
    // TODO: Napisz swój kod poniżej
    // Użyj zagnieżdżonych pętli z etykietowaną instrukcją break, aby wyszukać szukaną liczbę
    
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online