6-bo‘lim
Sikllar va diapazonlar
Diapazonlar va ularning shakllari, for ..in, indeks bilan yurish, while va do-while, break va continue hamda yorliqlar.
Ushbu bo‘lim mundarijasi
Kotlin da sikl deyarli har doim diapazon yoki to'plam ustidan
yuriladi. Klassik for (i = 0; i < n; i++) shakli umuman yo'q.
Diapazonlar #
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(" "))
}
12345
1 2 3 4
5 4 3 2 1
0 2 4 6 8 10
| Shakl | Ma'nosi |
|---|---|
1..5 | 1 dan 5 gacha, 5 ham kiradi |
1 until 5 | 1 dan 5 gacha, 5 kirmaydi |
5 downTo 1 | Teskari |
0..10 step 2 | Ikkitadan sakrab |
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 #
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(""))
}
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 #
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")
}
}
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 #
fun main() {
val ballar = listOf(85, 92, 78)
for (i in ballar.indices) {
println("$i -> ${ballar[i]}")
}
println(ballar.indices)
println(ballar.lastIndex)
}
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 #
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)
}
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 #
fun main() {
repeat(3) {
println("salom")
}
val kvadratlar = mutableListOf<Int>()
repeat(4) { i ->
kvadratlar.add(i * i)
}
println(kvadratlar.joinToString(" "))
}
salom
salom
salom
0 1 4 9
repeat - "shuncha marta bajar" degani. Indeks kerak bo'lsa, uni
parametr sifatida olish mumkin.
break va continue #
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(" "))
}
Tekshirildi: 4
Tekshirildi: 8
Tekshirildi: 15
Birinchi katta son: 16
---
1 3 5 7 9
Yorliqlar #
Ichma-ich sikldan butunlay chiqish kerak bo'lsa:
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()
}
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.
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 #
fun main() {
for (i in 1..3) {
for (j in 1..3) {
print("${(i * j).toString().padStart(4)}")
}
println()
}
}
1 2 3
2 4 6
3 6 9
Sikl - ifoda emas #
if va when ifoda edi, lekin sikllar emas:
val natija = for (i in 1..5) { ... } // xato
Sikldan natija yig'ish kerak bo'lsa, ikki yo'l bor:
- Tashqarida
varyoki ro'yxat e'lon qilib, sikl ichida to'ldirish. map,filter,sumOfkabi funksiyalarni ishlatish - bu Kotlin uslubi va 10-bo'limda ko'ramiz.
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())
}
55
55
30
Ikkinchi va uchinchi qator - o'sha ishning Kotlin uslubidagi ko'rinishi. Sikl yozish shart emas.
Amaliy misol #
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")
}
Jami: 438
O'rtacha: 87.6
Eng yuqori: 95
- 1 dan 10 gacha sonlarning kvadratini chiqaring.
1..5va1 until 5farqini ko'rsating.- 100 dan 0 gacha 10 qadam bilan teskari sanang.
'a'..'z'diapazonidan alifboni chiqaring.- Ro'yxatni
withIndex()bilan raqamlab chiqaring. indicesvalastIndexni sinab ko'ring.whilebilan 2 ning darajalarini 1000 dan oshguncha chiqaring.do-whilekamida bir marta bajarilishini isbotlang.repeatbilan uchburchak chizing.- Ichma-ich sikldan
break@yorliqbilan chiqing.
Xulosa #
- Klassik
for (i = 0; ...)shakli Kotlin da yo'q. 1..5oxirgi chegarani oladi,1 until 5esa olmaydi.downToteskari,stepqadamni belgilaydi.- Diapazon - alohida qiymat:
in,sum(),filterishlaydi. withIndex()indeks va qiymatni birga beradi;indicesesa to'g'ri diapazonni.whileshartni oldin,do-whilekeyin tekshiradi.repeat(n)- eng qisqa takrorlash.- Sikl ifoda emas - natija kerak bo'lsa
map/sumishlating. - Ichma-ich sikldan chiqish uchun yorliq, lekin uni kam ishlating.
Keyingi bo'limda funksiyalarni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.