Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الخروج من الحلقات المتداخلة

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 2 من 68.

عند العمل مع الحلقات المتداخلة، فإن جملة break العادية تخرج فقط من الحلقة الداخلية. ومع ذلك، توفر لغة Go تسميات (labels) تسمح لك بالخروج من الحلقات الخارجية مباشرة، مما يمنحك تحكماً دقيقاً في هياكل الحلقات المعقدة.

التسمية (label) هي معرّف يتبعه نقطتان رأسيتان تضعه قبل الحلقة التكرارية. يمكنك بعد ذلك استخدام 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 ذات التسمية (labeled break) للخروج من الحلقات المتداخلة عند البحث عبر شبكة ثنائية الأبعاد (2D grid). تحتاج إلى العثور على رقم مستهدف محدد في الشبكة وإيقاف البحث فور العثور عليه.

ستتلقى مدخلين:

  • سلسلة نصية تمثل أبعاد الشبكة بتنسيق "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])" واخرج فوراً من كلتا الحلقتين باستخدام الـ labeled break
  5. إذا أكملت البحث دون العثور على الهدف، قم بطباعة "Target [target] not found"

يجب الإبلاغ عن الموضع باستخدام فهرسة تبدأ من الصفر (الصف الأول هو 0، والعمود الأول هو 0).

ورقة مرجعية

تسمح لك التسميات (Labels) بالخروج من الحلقات الخارجية من داخل الحلقات المتداخلة. التسمية هي معرف يتبعه نقطتان رأسيتان يتم وضعه قبل الحلقة.

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: اكتب الكود الخاص بك أدناه
    // استخدم الحلقات المتداخلة مع كسر مسمى (labeled break) للبحث عن الهدف
    
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow