تخطَّ إلى المحتوى

الحلقات في Kotlin: for و while و repeat

الدرس 4 من 11 · Kotlin

الحاسوب لا يتعب ولا يملّ: يكرر نفس العمل ملايين المرات بنفس الدقة. الحلقات هي الطريقة التي تستغل بها هذه القدرة: عرض كل الرسائل في تطبيق المحادثة، وحساب مجموع الفاتورة، وتحريك عدّاد تنازلي. وفي Kotlin، الحلقات أقصر وأوضح من كثير من اللغات بفضل المجالات.

for (i in 1..3) {
println("الدورة $i")
}
الناتج
الدورة 1
الدورة 2
الدورة 3

اقرأها: «لكل i في المجال من 1 إلى 3، نفّذ الكود». لا تحتاج تعريف عدّاد، ولا شرطاً، ولا زيادة يدوية كما في لغات أخرى.

for (i in 1 until 4) print("$i ")
println()
for (i in 10 downTo 0 step 5) print("$i ")
println()
for (i in 0..10 step 3) print("$i ")
الناتج
1 2 3
10 5 0
0 3 6 9
الكتابة المعنى
1..5 من 1 إلى 5 شاملة الطرفين
1 until 5 من 1 إلى 4 (بدون 5)
10 downTo 1 عدّ تنازلي من 10 إلى 1
step 2 القفز بمقدار 2 بدلاً من 1

لاحظ أن print تطبع دون النزول لسطر جديد، و println() الفارغة تنزل سطراً فقط.

تخيّل المجال مثل درجات السلم: 1..5 تصعد كل الدرجات، و step 2 تقفز درجتين كل مرة، و downTo تنزل.

val fruits = listOf("تفاح", "موز", "برتقال")
for (fruit in fruits) {
println("- $fruit")
}
الناتج
- تفاح
- موز
- برتقال

وإذا احتجت رقم كل عنصر مع قيمته، استخدم withIndex():

for ((index, fruit) in fruits.withIndex()) {
println("$index: $fruit")
}
الناتج
0: تفاح
1: موز
2: برتقال

الصيغة (index, fruit) تفكّ كل عنصر إلى جزأين، وتسمى التفكيك (Destructuring). ولاحظ أن الترقيم يبدأ من صفر.

عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:

var balance = 100
var days = 0
while (balance > 0) {
balance -= 30
days++
}
println("انتهى الرصيد بعد $days أيام")
الناتج
انتهى الرصيد بعد 4 أيام

وهناك أيضاً do { ... } while (...) التي تنفّذ الكود مرة واحدة على الأقل قبل فحص الشرط.

إذا أردت تكرار شيء عدداً محدداً من المرات ولا تحتاج العدّاد:

repeat(3) {
println("مرحباً")
}
الناتج
مرحباً
مرحباً
مرحباً

بسيطة وواضحة: «كرر 3 مرات».

  • break: اخرج من الحلقة فوراً.
  • continue: تخطَّ باقي هذه الدورة وانتقل للتالية.
for (i in 1..10) {
if (i % 2 == 0) continue // تخطَّ الزوجي
if (i > 7) break // توقف بعد 7
print("$i ")
}
الناتج
1 3 5 7

جدول الضرب:

val num = 7
for (i in 1..5) {
println("$num × $i = ${num * i}")
}
الناتج
7 × 1 = 7
7 × 2 = 14
7 × 3 = 21
7 × 4 = 28
7 × 5 = 35

مجموع الأعداد من 1 إلى 100:

var sum = 0
for (i in 1..100) sum += i
println(sum)
الناتج
5050
  1. اطبع العد التنازلي من 10 إلى 1 ثم «انطلق!» باستخدام downTo.
  2. اطبع كل الأعداد الزوجية من 2 إلى 20 باستخدام step.
  3. اكتب قائمة بأسماء 4 أصدقاء، واطبع كل اسم مع رقمه بدءاً من 1 (تلميح: index + 1).
  4. تحدٍّ (FizzBuzz): اطبع الأعداد من 1 إلى 15، لكن «Fizz» بدل مضاعفات 3، و«Buzz» بدل مضاعفات 5، و«FizzBuzz» بدل مضاعفات الاثنين معاً. جرّب حلها بـ when.
  • الخلط بين .. و until: 1..5 تشمل 5، و 1 until 5 لا تشملها. فكّر في آخر قيمة تريدها.
  • العد التنازلي بـ ..: 10..1 مجال فارغ لا يدخل الحلقة أبداً. استخدم 10 downTo 1.
  • نسيان أن الفهرس يبدأ من صفر: أول عنصر في withIndex رقمه 0.

سؤال

ماذا تطبع for (i in 1 until 4) print(i)؟

سؤال

أي كتابة صحيحة للعد التنازلي من 5 إلى 1؟

  • for (i in 1..5) حلقة بمجال شامل، و until يستثني الطرف الأخير.
  • downTo للعد التنازلي، و step لتغيير مقدار القفز.
  • for (item in list) للمرور على القوائم، و withIndex() للرقم والقيمة معاً.
  • while حسب شرط، و repeat(n) لتكرار عدد محدد من المرات.
  • break للخروج من الحلقة، و continue لتخطي الدورة الحالية.