6-bo‘lim

Sikllar va diapazonlar

Diapazonlar va ularning shakllari, for ..in, indeks bilan yurish, while va do-while, break va continue hamda yorliqlar.

🕑 13 daqiqa o‘qish 📄 500 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Diapazonlar
  2. Diapazon - alohida qiymat
  3. To'plam bo'ylab
  4. Indekslar bilan
  5. while va do-while
  6. repeat
  7. break va continue
  8. Yorliqlar
  9. Ichma-ich sikllar
  10. Sikl - ifoda emas
  11. Amaliy misol
  12. Xulosa

Kotlin da sikl deyarli har doim diapazon yoki to'plam ustidan yuriladi. Klassik for (i = 0; i < n; i++) shakli umuman yo'q.

Diapazonlar #

KOTLIN
fun main() {
    for (i in 1..5) {
        print(i)
    }
    println()

    println((1 until 5).joinToString(" "))
    println((5 downTo 1).joinToString(" "))
    println((0..10 step 2).joinToString(" "))
}
Natija
12345
1 2 3 4
5 4 3 2 1
0 2 4 6 8 10
ShaklMa'nosi
1..51 dan 5 gacha, 5 ham kiradi
1 until 51 dan 5 gacha, 5 kirmaydi
5 downTo 1Teskari
0..10 step 2Ikkitadan sakrab
.. va until ni adashtirmang

1..5 da 5 ham bor, 1 until 5 da esa yo'q.

Massiv bo'ylab yurganda 0 until massiv.size yoki massiv.indices ishlating - 0..massiv.size deb yozsangiz, oxirgi qadamda chegaradan chiqib ketasiz.

Diapazon - alohida qiymat #

KOTLIN
fun main() {
    val oralik = 1..10

    println(oralik.first)
    println(oralik.last)
    println(5 in oralik)
    println(15 in oralik)
    println(oralik.sum())
    println(oralik.filter { it % 3 == 0 })

    val harflar = 'a'..'e'
    println(harflar.joinToString(""))
}
Natija
1
10
true
false
55
[3, 6, 9]
abcde

Diapazon shunchaki sikl uchun emas - u qiymat sifatida saqlanadi, tekshiriladi va ustida amal bajariladi. Harflar uchun ham ishlaydi.

To'plam bo'ylab #

KOTLIN
fun main() {
    val shaharlar = listOf("Namangan", "Andijon", "Farg'ona")

    for (shahar in shaharlar) {
        println(shahar)
    }

    println("---")

    for ((i, shahar) in shaharlar.withIndex()) {
        println("$i: $shahar")
    }
}
Natija
Namangan
Andijon
Farg'ona
---
0: Namangan
1: Andijon
2: Farg'ona

withIndex() - indeks ham, qiymat ham kerak bo'lganda. Qavs ichidagi (i, shahar) yoyish (destructuring) deb ataladi.

Indekslar bilan #

KOTLIN
fun main() {
    val ballar = listOf(85, 92, 78)

    for (i in ballar.indices) {
        println("$i -> ${ballar[i]}")
    }

    println(ballar.indices)
    println(ballar.lastIndex)
}
Natija
0 -> 85
1 -> 92
2 -> 78
0..2
2

indices - to'g'ri diapazonni o'zi beradi, shuning uchun - 1 ni unutish xavfi yo'q.

while va do-while #

KOTLIN
fun main() {
    var qoldiq = 100

    while (qoldiq > 0) {
        println("Qoldiq: $qoldiq")
        qoldiq -= 30
    }
    println("Tugadi: $qoldiq")

    var son = 5
    do {
        println("do ichida: $son")
        son++
    } while (son < 3)
}
Natija
Qoldiq: 100
Qoldiq: 70
Qoldiq: 40
Qoldiq: 10
Tugadi: -20
do ichida: 5

while shartni oldin, do-while esa keyin tekshiradi - shuning uchun ikkinchisi kamida bir marta bajariladi.

repeat #

KOTLIN
fun main() {
    repeat(3) {
        println("salom")
    }

    val kvadratlar = mutableListOf<Int>()
    repeat(4) { i ->
        kvadratlar.add(i * i)
    }
    println(kvadratlar.joinToString(" "))
}
Natija
salom
salom
salom
0 1 4 9

repeat - "shuncha marta bajar" degani. Indeks kerak bo'lsa, uni parametr sifatida olish mumkin.

break va continue #

KOTLIN
fun main() {
    val sonlar = listOf(4, 8, 15, 16, 23, 42)

    for (son in sonlar) {
        if (son > 15) {
            println("Birinchi katta son: $son")
            break
        }
        println("Tekshirildi: $son")
    }

    println("---")

    val toqlar = mutableListOf<Int>()
    for (i in 1..10) {
        if (i % 2 == 0) continue
        toqlar.add(i)
    }
    println(toqlar.joinToString(" "))
}
Natija
Tekshirildi: 4
Tekshirildi: 8
Tekshirildi: 15
Birinchi katta son: 16
---
1 3 5 7 9

Yorliqlar #

Ichma-ich sikldan butunlay chiqish kerak bo'lsa:

KOTLIN
fun main() {
    tashqi@ for (i in 1..4) {
        for (j in 1..4) {
            if (i * j > 6) {
                println("To'xtatildi: i=$i, j=$j")
                break@tashqi
            }
            print("${i * j} ")
        }
    }
    println()
}
Natija
1 2 3 4 2 4 6 To'xtatildi: i=2, j=4

tashqi@ - yorliq, break@tashqi esa aynan o'sha siklni to'xtatadi. Yorliqsiz break faqat ichki siklni to'xtatardi.

Yorliqlarni kam ishlating

Yorliq kuchli, lekin kodni o'qishni qiyinlashtiradi.

Ko'pincha ichki siklni alohida funksiyaga chiqarish va undan return qilish toza yechim bo'ladi. Yoki firstOrNull { ... } kabi tayyor funksiya bu ishni butunlay hal qiladi - buni 10-bo'limda ko'ramiz.

Ichma-ich sikllar #

KOTLIN
fun main() {
    for (i in 1..3) {
        for (j in 1..3) {
            print("${(i * j).toString().padStart(4)}")
        }
        println()
    }
}
Natija
   1   2   3
   2   4   6
   3   6   9

Sikl - ifoda emas #

for qiymat qaytarmaydi

if va when ifoda edi, lekin sikllar emas:

KOTLIN
val natija = for (i in 1..5) { ... }   // xato

Sikldan natija yig'ish kerak bo'lsa, ikki yo'l bor:

  1. Tashqarida var yoki ro'yxat e'lon qilib, sikl ichida to'ldirish.
  2. map, filter, sumOf kabi funksiyalarni ishlatish - bu Kotlin uslubi va 10-bo'limda ko'ramiz.
KOTLIN
fun main() {
    var jami = 0
    for (i in 1..10) {
        jami += i
    }
    println(jami)

    println((1..10).sum())
    println((1..10).filter { it % 2 == 0 }.sum())
}
Natija
55
55
30

Ikkinchi va uchinchi qator - o'sha ishning Kotlin uslubidagi ko'rinishi. Sikl yozish shart emas.

Amaliy misol #

KOTLIN
fun main() {
    val ballar = listOf(85, 92, 78, 95, 88)

    var jami = 0
    var engYuqori = ballar[0]

    for (ball in ballar) {
        jami += ball
        if (ball > engYuqori) engYuqori = ball
    }

    println("Jami: $jami")
    println("O'rtacha: ${jami.toDouble() / ballar.size}")
    println("Eng yuqori: $engYuqori")
}
Natija
Jami: 438
O'rtacha: 87.6
Eng yuqori: 95
Amaliy topshiriq
  1. 1 dan 10 gacha sonlarning kvadratini chiqaring.
  2. 1..5 va 1 until 5 farqini ko'rsating.
  3. 100 dan 0 gacha 10 qadam bilan teskari sanang.
  4. 'a'..'z' diapazonidan alifboni chiqaring.
  5. Ro'yxatni withIndex() bilan raqamlab chiqaring.
  6. indices va lastIndex ni sinab ko'ring.
  7. while bilan 2 ning darajalarini 1000 dan oshguncha chiqaring.
  8. do-while kamida bir marta bajarilishini isbotlang.
  9. repeat bilan uchburchak chizing.
  10. Ichma-ich sikldan break@yorliq bilan chiqing.

Xulosa #

  • Klassik for (i = 0; ...) shakli Kotlin da yo'q.
  • 1..5 oxirgi chegarani oladi, 1 until 5 esa olmaydi.
  • downTo teskari, step qadamni belgilaydi.
  • Diapazon - alohida qiymat: in, sum(), filter ishlaydi.
  • withIndex() indeks va qiymatni birga beradi; indices esa to'g'ri diapazonni.
  • while shartni oldin, do-while keyin tekshiradi.
  • repeat(n) - eng qisqa takrorlash.
  • Sikl ifoda emas - natija kerak bo'lsa map/sum ishlating.
  • Ichma-ich sikldan chiqish uchun yorliq, lekin uni kam ishlating.

Keyingi bo'limda funksiyalarni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.