IlmHamroh
JavaScript Full-stack/8-qism. JavaScript asoslari35/61-dars16 daqiqa
Mundarija (33)

JavaScript while va do...while: takrorlar soni noma'lum bo'lganda

Qisqacha: while sikli shart true ekan, kodni qayta-qayta bajaradi: while (summa < 10000000) { ... }. Necha marta aylanishi oldindan noma'lum bo'lsa, shu sikl ishlatiladi. do...while esa avval tanani bajaradi, keyin shartni tekshiradi — shuning uchun u kamida bir marta ishlaydi.

Bu darsda

  • while siklini yoza olasiz va uni qachon for o'rniga tanlashni bilasiz.
  • do...while nega kamida bir marta ishlashini tushuntira olasiz.
  • Omonat o'sishi, sonning raqamlari soni kabi masalalarni sikl bilan yecha olasiz.
  • Sentinel qiymat (to'xtash belgisi) naqshini ishlata olasiz.
  • Cheksiz siklning sabablarini taniysiz va undan himoyalana olasiz.

Oldin bilishingiz kerak: for sikli, if / else, Math obyekti (Math.floor, Math.random).

1. Nega bu kerak?

Oldingi darsda for siklini o'rgandik. U "5 ta chipta chiqar", "12 oyni ko'rib chiq" kabi ishlarga juda mos. Chunki u yerda necha marta aylanish oldindan ma'lum.

Endi boshqa savol. Bankka 5 000 000 so'm omonat qo'ydingiz. Bank har yili summaning 20% ini qo'shib beradi. Necha yildan keyin pulingiz 10 000 000 so'mdan oshadi?

Bu yerda for ga nima deb yozamiz? i <= ... — nechagacha? Javobni bilmaymiz, uni aynan sikl topishi kerak. Biz faqat shartni bilamiz: "summa 10 mln dan kam ekan — yana bir yil kutamiz".

Hayotda bunday vaziyatlar ko'p:

  • Choynak qaynamaguncha kutasiz. Necha daqiqa? Bilmaysiz — qaynaganini ko'rasiz, xolos.
  • Taksi kutyapsiz: mashina kelmaguncha xaritaga qarab turasiz.
  • O'yinda: hayot qolmaguncha o'ynayverasiz.

Bunday masalalar uchun while sikli bor.

2. while sikli

2.1 Tuzilishi

js
while (shart) {
  // shart true ekan, shu kod qayta-qayta bajariladi
}

while inglizchada "... ekan", "... paytida" degani. Butun sikl shunday o'qiladi: "shart to'g'ri ekan, tanani bajar".

Oddiy misol — sanash:

js
let i = 1;

while (i <= 3) {
  console.log(i);
  i++;
}

Konsolda:

text
1
2
3

Bu natija for bilan ham xuddi shunday chiqardi. Farqi — qismlar joylashuvida:

Qism for da while da
Boshlanish Qavs ichida: let i = 1 Sikldan oldin, alohida qator
Shart Qavs ichida: i <= 3 Qavs ichida: i <= 3
Qadam Qavs ichida: i++ Tananing ichida, o'zingiz yozasiz

while qavsida faqat shart bor. Qolgan hamma narsani o'zingiz joylashtirasiz.

2.2 Qanday tartibda ishlaydi?

  1. Shart tekshiriladi.
  2. false bo'lsa — sikl tugaydi, dastur sikldan keyingi qatorga o'tadi.
  3. true bo'lsa — tana bajariladi.
  4. Yana 1-qadamga qaytiladi.

Muhim xulosa: tana ichida shartni o'zgartiradigan biror narsa bo'lishi shart. Yuqoridagi misolda bu — i++. U bo'lmasa, i doim 1 bo'lib qoladi, 1 <= 3 doim true — sikl hech qachon to'xtamaydi.

Tekshirib ko'ring: Quyidagi kod nima chiqaradi?

js
let i = 10;
while (i < 5) {
  console.log(i);
  i++;
}
console.log("Tugadi");
Javob

Faqat Tugadi. Birinchi tekshiruvdayoq 10 < 5 — false. Tana bir marta ham bajarilmadi. while avval shartni tekshiradi, shuning uchun u nol marta aylanishi ham mumkin.

3. while ning haqiqiy o'rni: oldindan noma'lum son

3.1 Omonat necha yilda ikki baravar bo'ladi?

Dars boshidagi omonat savoliga qaytamiz:

js
let summa = 5000000;
let yil = 0;

while (summa < 10000000) {
  summa += summa * 20 / 100;
  yil++;
}

console.log(`${yil} yildan keyin: ${summa} so'm`);

Konsolda:

text
4 yildan keyin: 10368000 so'm

summa * 20 / 100 — summaning 20 foizi. Har aylanishda summa oshadi va yil bittaga ko'payadi. Summa 10 mln dan oshgan zahoti shart false bo'ladi va sikl to'xtaydi.

Kuzatuv jadvali:

Tekshiruv summa summa < 10000000 yil
1 5 000 000 true 0 → 1
2 6 000 000 true 1 → 2
3 7 200 000 true 2 → 3
4 8 640 000 true 3 → 4
5 10 368 000 false 4 (tugadi)

Biz 4 raqamini kodga hech qayerda yozmadik. Uni sikl o'zi topdi. while ning kuchi shunda.

O'zingiz sinab ko'ring: foizni 20 dan 10 ga tushiring. Necha yil chiqadi?

3.2 Sonda nechta raqam bor?

Telefon raqam, karta raqami yoki PIN-kod uzunligini tekshirish kerak bo'ladi. Son berilgan: nechta raqamdan iborat?

G'oya: sonni 10 ga bo'lib, kasr qismini tashlab yuboramiz. Har bo'lishda bitta raqam "tushib qoladi". Son 0 ga aylanguncha necha marta bo'lganimizni sanaymiz.

js
let son = 2026;
let raqamlar = 0;

while (son > 0) {
  son = Math.floor(son / 10);
  raqamlar++;
}

console.log(raqamlar); // 4

Math.floor — Math darsidan: sonni pastga yaxlitlaydi. 2026 / 10 — 202.6, Math.floor esa 202 beradi.

Aylanish son oldin son keyin raqamlar
1 2026 202 1
2 202 20 2
3 20 2 3
4 2 0 4

5-tekshiruvda 0 > 0 — false, sikl tugaydi.

Bu kodda bitta yashirin muammo bor. son = 0 bo'lsa nima bo'ladi? Birinchi tekshiruvdayoq 0 > 0 — false. Sikl ishlamaydi va javob 0 chiqadi. Lekin 0 soni ham bitta raqamdan iborat! Bu muammoni do...while chiroyli hal qiladi — uni hozir ko'ramiz.

3.3 for yoki while — qaysi birini tanlash kerak?

Texnik jihatdan har qanday for ni while bilan yozish mumkin (va aksincha). Tanlov — kodni o'qiydigan odam uchun:

Vaziyat Tanlov Misol
Necha marta — ma'lum for 12 oy, 5 chipta, satrdagi har harf
Necha marta — noma'lum, faqat shart bor while Omonat 10 mln bo'lguncha, son 0 bo'lguncha

for ni ko'rgan dasturchi darhol "bu N marta aylanadi" deb tushunadi. while ni ko'rsa — "bu biror holat yuz berguncha aylanadi" deb tushunadi.

Tekshirib ko'ring: Qaysi sikl mos keladi? (a) Hafta kunlarining nomini chiqarish. (b) Telefon zaryadi 100% ga yetguncha kutish. (c) 1 dan 50 gacha sonlarni qo'shish.

Javob

(a) for — 7 kun, soni ma'lum. (b) while — necha daqiqa ketishi noma'lum, faqat shart bor. (c) for — 50 marta, soni ma'lum. while bilan ham yozsa bo'ladi, lekin for niyatni aniqroq ko'rsatadi.

4. do...while — kamida bir marta

4.1 Tuzilishi

js
do {
  // kamida bir marta bajariladigan kod
} while (shart);

do — "bajar". Butun sikl: "tanani bajar, keyin shart to'g'ri ekan — yana bajar".

while dan yagona farqi: shart tanadan keyin tekshiriladi. Shuning uchun tana hech bo'lmaganda bir marta ishlaydi.

Hayotdan o'xshatish: oshpaz sho'rvani tatib ko'radi. Avval tatib ko'radi, keyin "tuz kerakmi?" deb hal qiladi. Kerak bo'lsa — tuz soladi va yana tatib ko'radi. Tatib ko'rmasdan turib tuz kerakligini bilib bo'lmaydi.

4.2 Farqni ko'rish

Sharti boshidanoq false bo'lgan ikkita sikl:

js
let a = 10;
while (a < 5) {
  console.log("while ishladi");
}

let b = 10;
do {
  console.log("do...while ishladi");
} while (b < 5);

Konsolda:

text
do...while ishladi

while birinchi tekshiruvdayoq to'xtadi — tana nol marta bajarildi. do...while esa avval tanani bajardi, keyin shartni tekshirdi va to'xtadi. Birinchi siklda a++ yo'q, lekin xavfi yo'q: tana hech qachon bajarilmaydi.

4.3 Raqamlar soni — endi 0 uchun ham to'g'ri

Raqamlar sonidagi 0 muammosini tuzatamiz:

js
let son = 0;
let raqamlar = 0;

do {
  son = Math.floor(son / 10);
  raqamlar++;
} while (son > 0);

console.log(raqamlar); // 1

Tana kamida bir marta ishladi, shuning uchun raqamlar 1 ga teng. 2026 uchun ham bu kod to'g'ri ishlaydi — 4 chiqadi. "Har qanday sonda kamida bitta raqam bor" degan haqiqat kodda o'z aksini topdi.

4.4 Oltitani kutish

O'yin: kubik (o'yin toshi) 6 tushguncha tashlanadi. Tashlamasdan turib nima tushganini bilmaymiz — demak, kamida bir marta tashlash kerak. Bu do...while uchun ayni muddao:

js
let tosh;
let urinish = 0;

do {
  tosh = Math.floor(Math.random() * 6) + 1;
  urinish++;
  console.log(`${urinish}-urinish: ${tosh}`);
} while (tosh !== 6);

console.log("Olti tushdi!");

Math.random() * 6 — 0 dan 6 gacha tasodifiy kasr son. Math.floor uni 0–5 butun songa aylantiradi, + 1 esa 1–6 qiladi.

Natija har safar boshqacha, chunki tosh tasodifiy. Masalan, shunday chiqishi mumkin:

text
1-urinish: 3
2-urinish: 1
3-urinish: 6
Olti tushdi!

Kodni bir necha marta ishga tushiring. Ba'zan birinchi urinishdayoq 6 tushadi, ba'zan 10 dan ortiq urinish kerak bo'ladi. Aynan shuning uchun bu yerda for yaramaydi.

4.5 Menyu: brauzerda foydalanuvchidan so'rash

do...while ning eng klassik ishlatilishi — menyu. Menyu kamida bir marta ko'rsatilishi kerak. Foydalanuvchi "Chiqish" ni tanlamaguncha qayta-qayta ko'rsatiladi.

Buning uchun brauzerning prompt() funksiyasidan foydalanamiz. U ekranda kiritish maydoni bor oyna ochadi va foydalanuvchi yozgan matnni satr sifatida qaytaradi. "Bekor qilish" (Cancel) bosilsa — null qaytaradi. Uni hozir faqat misol uchun ishlatamiz, brauzer imkoniyatlarini keyingi qismda batafsil o'rganamiz.

js
let tanlov;

do {
  tanlov = prompt("1 — Balans, 2 — To'lov, 0 — Chiqish");

  if (tanlov === "1") {
    console.log("Balansingiz: 250 000 so'm");
  } else if (tanlov === "2") {
    console.log("To'lov bo'limi");
  }
} while (tanlov !== "0" && tanlov !== null);

console.log("Xayr!");

Bu kodni brauzer konsolida sinab ko'ring (F12 → Console). Node'da prompt yo'q — u yerda ReferenceError: prompt is not defined chiqadi.

E'tibor bering: prompt satr qaytaradi, shuning uchun "1" bilan (qo'shtirnoqda) solishtiryapmiz, 1 bilan emas. === turni ham tekshiradi — "1" === 1 — false.

Tekshirib ko'ring: Quyidagi kod necha marta "Salom" chiqaradi?

js
let n = 0;
do {
  console.log("Salom");
  n++;
} while (n < 0);
Javob

Bir marta. Tana avval bajariladi: "Salom" chiqadi, n 1 bo'ladi. Keyin 1 < 0 tekshiriladi — false, sikl tugaydi. Oddiy while bo'lganda edi, birinchi tekshiruvdayoq 0 < 0 — false bo'lib, "Salom" umuman chiqmasdi.

5. Sentinel qiymat — to'xtash belgisi

5.1 G'oya

Kassir xaridorning mahsulotlarini birma-bir kiritadi. Nechta mahsulot bo'lishini oldindan bilmaydi. Xo'sh, dastur "tamom, boshqa mahsulot yo'q" ekanini qanday biladi?

Kelishib olamiz: kassir 0 kiritsa — ro'yxat tugadi. Bunday maxsus qiymat sentinel qiymat (sentinel value) — "qorovul qiymat" yoki to'xtash belgisi deb ataladi. U haqiqiy ma'lumot emas, faqat "shu yerda to'xta" degan signal.

Hayotdan o'xshatish: xatning oxiridagi "Hurmat bilan, ..." Uni o'qigan odam xat tugaganini tushunadi.

js
let jami = 0;
let narx = Number(prompt("Narx (tugatish uchun 0)"));

while (narx !== 0) {
  jami += narx;
  narx = Number(prompt("Narx (tugatish uchun 0)"));
}

console.log(`Jami: ${jami} so'm`);

Kassir 12000, 5000, 8000, keyin 0 kiritsa, konsolda Jami: 25000 so'm chiqadi. Number() satrni songa aylantiradi (turlarni o'zgartirish). "Bekor qilish" bosilsa, Number(null) ham 0 beradi — sikl shunda ham to'xtaydi.

Sentinel qiymat haqiqiy ma'lumot orasida uchramasligi kerak. Narx 0 so'm bo'lmaydi, shuning uchun 0 yaxshi tanlov.

5.2 Satrdagi sentinel

Xuddi shu g'oya satrda ham ishlaydi. SMS xabarning birinchi gapini — birinchi nuqtagacha bo'lgan qismini — olamiz. Bu yerda nuqta — to'xtash belgisi:

js
const sms = "Kodingiz tayyor. Uni hech kimga aytmang.";
let gap = "";
let i = 0;

while (sms[i] !== ".") {
  gap += sms[i];
  i++;
}

console.log(gap); // Kodingiz tayyor

Lekin ehtiyot bo'ling! Satrda nuqta umuman bo'lmasa-chi? i satr oxiridan o'tib ketadi, sms[i] esa undefined bo'ladi. undefined !== "." doim true — sikl hech qachon to'xtamaydi.

Himoya — shartga ikkinchi tekshiruv qo'shish:

js
const sms = "Kodingiz tayyor";
let gap = "";
let i = 0;

while (i < sms.length && sms[i] !== ".") {
  gap += sms[i];
  i++;
}

console.log(gap); // Kodingiz tayyor

Endi sikl ikki holatda to'xtaydi: nuqta topilsa yoki satr tugasa. && — mantiqiy operatorlar darsidan: ikkala shart ham true bo'lsagina sikl davom etadi.

Maslahat: Sentinel bilan ishlaganda doim so'rang: "Agar to'xtash belgisi umuman kelmasa-chi?" Kelmasligi mumkin bo'lsa — shartga zaxira chegara qo'shing.

6. Cheksiz sikl va undan himoya

6.1 Eng ko'p uchraydigan sabab

while da qadamni o'zingiz yozasiz. Uni unutish — cheksiz siklning birinchi sababi:

js
// ❌ ISHGA TUSHIRMANG!
let i = 1;
while (i <= 3) {
  console.log(i);
  // i++ unutildi
}

Konsolga to'xtovsiz 1, 1, 1... chiqaveradi. Tanada i hech o'zgarmaydi, shart doim true.

To'xtatish: terminalda Ctrl + C, brauzerda — yorliqni (tab) yopish. Batafsil for darsida ko'rgansiz.

6.2 Ataylab cheksiz sikl

Ba'zan dasturchilar siklni ataylab while (true) deb yozishadi. Masalan, server doim ishlab turishi kerak. Bunday sikldan chiqish uchun ichida break ishlatiladi. Uni keyingi darsda o'rganamiz. Hozircha qoida: while (true) ichida albatta chiqish yo'li bo'lsin.

6.3 Zaxira hisoblagich

Shartning to'xtashiga 100% ishonchingiz bo'lmasa, siklga "sug'urta" qo'shing — urinishlar sonini cheklang:

js
let tosh = 0;
let urinish = 0;

while (tosh !== 6 && urinish < 1000) {
  tosh = Math.floor(Math.random() * 6) + 1;
  urinish++;
}

console.log(urinish <= 1000); // true

1 000 urinishdan keyin sikl baribir to'xtaydi. Real dasturlarda shunday yondashuv ko'p uchraydi. Masalan, internet uzilsa, ilova ulanishga 5 marta urinadi — cheksiz emas.

7. Ko'p uchraydigan xatolar

7.1 Qadamni unutish

Cheksiz sikl bo'limida ko'rdik. Belgisi: dastur tugamaydi, konsol bir xil qiymat bilan to'lib boradi. Tekshiring: tana ichida shartdagi o'zgaruvchi o'zgaryaptimi?

7.2 while (...) dan keyin nuqta-vergul

js
// ❌ ISHGA TUSHIRMANG!
let i = 1;
while (i <= 3); {
  console.log(i);
  i++;
}

for darsidagi tuzoq, lekin bu yerda oqibati yomonroq. ; — bo'sh tana. Sikl "hech narsa qilmasdan" aylanaveradi va i++ gacha hech qachon yetib bormaydi. Natija — cheksiz sikl, konsolda esa hech narsa chiqmaydi. Dastur shunchaki qotib qoladi.

7.3 do ichida e'lon qilingan o'zgaruvchi

js
do {
  let javob = "yo'q";
  console.log("So'radim");
} while (javob !== "ha");
text
ReferenceError: javob is not defined

Tarjimasi: "javob aniqlanmagan". Lekin u aniqlangan-ku? Gap shundaki, let bilan { } ichida yaratilgan o'zgaruvchi faqat shu qavslar ichida yashaydi. while (javob ...) sharti esa qavslardan tashqarida turibdi. Tuzatish: o'zgaruvchini sikldan oldin e'lon qiling (let javob;), ichida esa faqat qiymat bering. Menyu misolidagi tanlov aynan shunday yozilgan.

7.4 Shartni teskari yozish

js
let summa = 5000000;
let yil = 0;

while (summa > 10000000) {
  summa += summa * 20 / 100;
  yil++;
}

console.log(yil); // 0

Xato yo'q, lekin javob noto'g'ri. > yozildi, kerakli belgi esa < edi. 5000000 > 10000000 — false, sikl bir marta ham aylanmadi. Shartni ovoz chiqarib o'qing: "summa 10 mln dan kam ekan, davom et". Qoida: while sharti — davom etish sharti, to'xtash sharti emas.

8. Mashqlar

1-mashq (oson): Telefon zaryadi

Telefon zaryadi 15%. Quvvatlagich har 10 daqiqada zaryadni 12% ga oshiradi. Zaryad 100% ga yetguncha (yoki oshguncha) necha daqiqa kerak? while sikli bilan hisoblang. Natija: 80 daqiqa.

Yechim
js
let zaryad = 15;
let daqiqa = 0;

while (zaryad < 100) {
  zaryad += 12;
  daqiqa += 10;
}

console.log(`${daqiqa} daqiqa`); // 80 daqiqa

Zaryad: 15 → 27 → 39 → 51 → 63 → 75 → 87 → 99 → 111. 8 marta oshdi, har biri 10 daqiqa — 80 daqiqa. Oxirgi qiymat 111% chiqdi. Haqiqiy telefonda 100% dan oshmaydi, lekin bizga faqat vaqt kerak edi.

2-mashq (o'rta): Raqamlar yig'indisi

Karta raqamlarini tekshirish algoritmlarida sonning raqamlarini qo'shish kerak bo'ladi. 2026 sonining raqamlari yig'indisini toping: 2 + 0 + 2 + 6 = 10.

Ishora: son % 10 — oxirgi raqam (qoldiq operatori), Math.floor(son / 10) — oxirgi raqamni olib tashlaydi. Darsdagi raqamlar soni kodini asos qilib oling.

Yechim
js
let son = 2026;
let yigindi = 0;

while (son > 0) {
  yigindi += son % 10;
  son = Math.floor(son / 10);
}

console.log(yigindi); // 10
Aylanish son % 10 yigindi son keyin
1 6 6 202
2 2 8 20
3 0 8 2
4 2 10 0

Raqamlar teskari tartibda (oxiridan) olinadi, lekin qo'shishda tartib ahamiyatsiz.

3-mashq (qiyin): "3n + 1" jumbog'i

Matematikada mashhur jumboq bor. Istalgan musbat butun son olinadi:

  • Son juft bo'lsa — 2 ga bo'linadi.
  • Toq bo'lsa — 3 ga ko'paytirilib, 1 qo'shiladi.

Shu amal son 1 ga aylanguncha takrorlanadi. Qiziq tomoni: hozirgacha sinab ko'rilgan barcha sonlar oxir-oqibat 1 ga keladi. Lekin olimlar bu har doim shunday ekanini hali isbotlay olmagan!

6 soni uchun har bir qadamni chiqaring va jami necha qadam ketganini hisoblang. Keyin 27 sonini sinab ko'ring.

Ishora: juftlikni son % 2 === 0 bilan tekshiring. Necha qadam ketishini oldindan bilmaymiz — demak, while.

Yechim
js
let son = 6;
let qadam = 0;

while (son !== 1) {
  if (son % 2 === 0) {
    son = son / 2;
  } else {
    son = son * 3 + 1;
  }
  qadam++;
  console.log(son);
}

console.log(`Jami: ${qadam} qadam`);

Konsolda:

text
3
10
5
16
8
4
2
1
Jami: 8 qadam

27 bilan sinab ko'rsangiz, son 9 232 gacha ko'tariladi va 1 ga kelguncha 111 qadam ketadi. Kichkina sondan shuncha uzun yo'l — while busiz hal qilib bo'lmaydigan masala.

9. Real ishda

  • Qayta urinish (retry): internet uzilsa, ilova serverga ulanishga bir necha marta urinadi — while va zaxira hisoblagich bilan.
  • O'yinlar: "o'yinchi tirik ekan — o'yin davom etadi" — o'yinning asosiy sikli.
  • Ma'lumot o'qish: fayl yoki tarmoqdan ma'lumot bo'laklab keladi. Bo'laklar tugaguncha o'qilaveradi. Nechta bo'lak kelishi oldindan noma'lum.
  • Terminal dasturlari va botlar: menyu do...while bilan kamida bir marta ko'rsatiladi.

Real kodda while ga for dan kamroq duch kelasiz. Lekin kerak bo'lganda uning o'rnini hech narsa bosa olmaydi. Intervyularda "raqamlar yig'indisi", "sonni teskari aylantirish" kabi masalalar tez-tez beriladi — hammasi while bilan yechiladi.

Xulosa

  • while (shart) { ... } — shart true ekan aylanadi. Necha marta ekani noma'lum bo'lsa, shu sikl ishlatiladi.
  • while avval shartni tekshiradi — tana nol marta bajarilishi ham mumkin.
  • do { ... } while (shart); — avval tana, keyin shart. Tana kamida bir marta bajariladi.
  • Tana ichida shartni o'zgartiradigan kod bo'lishi shart, aks holda — cheksiz sikl.
  • Sentinel qiymat — "tugadi" degan maxsus belgi. U kelmay qolishi mumkin bo'lsa, zaxira chegara qo'shing.
  • Shart — davom etish sharti: "... ekan, davom et".

Oldingi dars: for sikli.

Keyingi dars: break, continue va label'lar — sikldan erta chiqish va bitta aylanishni o'tkazib yuborish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
JavaScript while va do...while: takrorlar soni noma'lum bo'lganda — IlmHamroh