Menu
Coddy logo textTech

İç İçe Döngülerden Çıkma

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 2 / 68.

İç içe döngülerle çalışırken, normal bir break ifadesi yalnızca en içteki döngüden çıkar. Ancak Go, dış döngülerden doğrudan çıkmanıza olanak tanıyan etiketler (labels) sağlar; bu da size karmaşık döngü yapıları üzerinde hassas kontrol sağlar.

Etiket, bir döngünün önüne yerleştirdiğiniz, ardından iki nokta üst üste gelen bir tanımlayıcıdır. Ardından, iç içe geçmiş döngülerin içinden bile olsa, o belirli döngüden çıkmak için break ve ardından etiket adını kullanabilirsiniz.

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

Bu örnekte, i == 1 && j == 1 koşulu sağlandığında, break outer hem iç hem de dış döngüden anında çıkar. Bu, özellikle aradığınız şeyi bulduğunuzda aramayı tamamen durdurmak istediğiniz 2D veri yapıları içinde arama yaparken yararlıdır.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

challenge icon

Görev

Kolay

Bu challenge'da, bir 2D ızgara (grid) içinde arama yaparken iç içe geçmiş döngülerden çıkmak için etiketli (labeled) break ifadelerini kullanma pratiği yapacaksınız. Izgarada belirli bir hedef sayıyı bulmanız ve bulduğunuz anda aramayı hemen durdurmanız gerekiyor.

İki girdi alacaksınız:

  • Izgaranın boyutlarını "rows,cols" formatında temsil eden bir dize (örneğin, "3,4")
  • Aranacak hedef sayıyı temsil eden bir dize (örneğin, "7")

Size aşağıdaki 2D sayı ızgarası verilmiştir:

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

Göreviniz şunlardır:

  1. Kaç satır ve sütun aranacağını belirlemek için ilk girdiden boyutları ayrıştırın
  2. İkinci girdiden hedef sayıyı ayrıştırın
  3. Izgara içinde arama yapmak için etiketli bir break ile iç içe geçmiş döngüler kullanın
  4. Hedef sayıyı bulduğunuzda, "Found [target] at position ([row], [col])" yazdırın ve etiketli break kullanarak her iki döngüden de hemen çıkın
  5. Eğer aramayı hedefi bulamadan tamamlarsanız, "Target [target] not found" yazdırın

Konum, 0 tabanlı indeksleme kullanılarak bildirilmelidir (ilk satır 0, ilk sütun 0'dır).

Kopya kağıdı

Etiketler, iç içe geçmiş döngülerin içinden dış döngülerden çıkmanıza olanak tanır. Bir etiket, bir döngünün önüne yerleştirilen ve ardından iki nokta üst üste gelen bir tanımlayıcıdır.

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if condition {
            break outer  // her iki döngüden de çıkar
        }
    }
}

Derin iç içe yapılardan bile olsa, o belirli döngüden çıkmak için break ve ardından etiket adını kullanın. Bu, 2D verilerde arama yaparken ve hedefinizi bulduğunuzda tamamen durmak istediğinizde kullanışlıdır.

Kendin dene

package main

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

func main() {
    // Girdiyi oku
    var dimensions string
    var targetStr string
    fmt.Scanln(&dimensions)
    fmt.Scanln(&targetStr)
    
    // Boyutları ayrıştır
    dimParts := strings.Split(dimensions, ",")
    rows, _ := strconv.Atoi(dimParts[0])
    cols, _ := strconv.Atoi(dimParts[1])
    
    // Hedef sayıyı ayrıştır
    target, _ := strconv.Atoi(targetStr)
    
    // Önceden tanımlanmış ızgara
    grid := [][]int{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    }
    
    // TODO: Kodunuzu aşağıya yazın
    // Hedefi aramak için etiketli break (labeled break) ile iç içe döngüler kullanın
    
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler