الخروج من الحلقات المتداخلة
جزء من قسم 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 يخرج من كل من الحلقتين الداخلية والخارجية فوراً. هذا مفيد بشكل خاص عند البحث في هياكل البيانات ثنائية الأبعاد حيث تريد التوقف عن البحث تماماً بمجرد العثور على ما تبحث عنه.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلفي هذا التحدي، ستتدرب على استخدام عبارات break ذات التسمية (labeled break) للخروج من الحلقات المتداخلة عند البحث عبر شبكة ثنائية الأبعاد (2D grid). تحتاج إلى العثور على رقم مستهدف محدد في الشبكة وإيقاف البحث فور العثور عليه.
ستتلقى مدخلين:
- سلسلة نصية تمثل أبعاد الشبكة بتنسيق
"rows,cols"(على سبيل المثال،"3,4") - سلسلة نصية تمثل الرقم المستهدف للبحث عنه (على سبيل المثال،
"7")
يتم تزويدك بالشبكة ثنائية الأبعاد التالية من الأرقام:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}مهمتك هي:
- تحليل الأبعاد من المدخل الأول لتحديد عدد الصفوف والأعمدة التي سيتم البحث فيها
- تحليل الرقم المستهدف من المدخل الثاني
- استخدام حلقات متداخلة مع
breakذات تسمية للبحث عبر الشبكة - عندما تجد الرقم المستهدف، قم بطباعة
"Found [target] at position ([row], [col])"واخرج فوراً من كلتا الحلقتين باستخدام الـ labeled break - إذا أكملت البحث دون العثور على الهدف، قم بطباعة
"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) للبحث عن الهدف
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات