6-dars: Sikllar — while, do-while
Dars haqida
Davomiyligi: 90 daqiqa Maqsad: Talaba while va do-while sikllarini bilishi, for bilan qachon birini, qachon boshqasini ishlatishni tushunishi kerak.
1. while sikli
while (shart) {
// body
}Shart rost bo'lguncha body takrorlanadi.
int i = 0;
while (i < 5) {
printf("%d ", i);
i++;
}
// 0 1 2 3 42. for va while taqqoslash
for:
for (int i = 0; i < 5; i++) {
printf("%d ", i);
}while:
int i = 0;
while (i < 5) {
printf("%d ", i);
i++;
}Bir xil natija. Lekin:
- for — qachon nechta marta ishlashini oldindan bilamiz
- while — qancha marta ishlashini bilmaymiz
3. while qachon kerak?
Foydalanuvchi to'g'ri raqam kiritmaguncha
int yosh = -1;
while (yosh < 0 || yosh > 120) {
printf("Yoshingizni kiriting (0-120): ");
scanf("%d", &yosh);
}Fayl tugamaguncha
int c; // EOF bilan solishtirish uchun int bo'lishi kerak
while ((c = getchar()) != EOF) {
putchar(c);
}Cheksiz sikl
while (1) {
// cheksiz, faqat break bilan chiqadi
}4. do-while sikli
do {
// body
} while (shart);Avval body, keyin shart. Demak — kamida bir marta ishlaydi.
int i = 0;
do {
printf("%d ", i);
i++;
} while (i < 5);
// 0 1 2 3 45. while vs do-while farqi
int x = 10;
// while: shart yolg'on — bir marta ham ishlamaydi
while (x < 5) {
printf("while\n");
}
// do-while: avval body, keyin shart
do {
printf("do-while\n");
} while (x < 5);Natija:
do-whiledo-while bir marta ishladi, while umuman ishlamadi.
6. do-while qachon kerak?
Menu
int tanlov;
do {
printf("\n=== MENU ===\n");
printf("1. Yangi\n");
printf("2. Ochish\n");
printf("3. Saqlash\n");
printf("4. Chiqish\n");
printf("Tanlov: ");
scanf("%d", &tanlov);
// tanlovni qayta ishlash...
} while (tanlov != 4);Menu kamida bir marta ko'rinishi kerak.
Foydalanuvchi to'g'ri javob bermaguncha
char javob;
do {
printf("Davom etamiz? (h/y): ");
scanf(" %c", &javob);
} while (javob != 'h' && javob != 'y');7. Sikl turlari qachon?
| Holat | Sikl |
|---|---|
| Aniq N marta | for |
| Massiv bo'ylab | for |
| Foydalanuvchidan to'g'ri ma'lumot olish | do-while |
| Menu | do-while |
| Fayl o'qish | while |
| Shart asoslangan | while |
8. Aniq misol: Raqamlar yig'indisi
#include <stdio.h>
int main(void) {
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i;
i++;
}
printf("1+2+...+100 = %d\n", sum);
return 0;
}for bilan:
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}9. Misol: Raqamning son sonini topish
int n = 12345;
int count = 0;
while (n > 0) {
n = n / 10;
count++;
}
printf("Son soni: %d\n", count);
// Son soni: 5Har iteratsiyada n 10 ga bo'linadi. 12345 → 1234 → 123 → 12 → 1 → 0.
10. Misol: Raqamlar yig'indisi (raqam ichidagi)
int n = 12345;
int sum = 0;
while (n > 0) {
sum += n % 10; // oxirgi raqam
n /= 10; // oxirgisini olib tashlash
}
printf("Yig'indi: %d\n", sum);
// 1+2+3+4+5 = 1511. Misol: Teskariga aylantirish
int n = 12345;
int reverse = 0;
while (n > 0) {
reverse = reverse * 10 + n % 10;
n /= 10;
}
printf("Teskari: %d\n", reverse);
// 5432112. Palindrome (palindrom) tekshirish
Palindrom — teskari o'qiganda ham bir xil (121, 1331, 99).
int n = 121;
int original = n;
int reverse = 0;
while (n > 0) {
reverse = reverse * 10 + n % 10;
n /= 10;
}
if (original == reverse) {
printf("%d — palindrom\n", original);
} else {
printf("%d — palindrom emas\n", original);
}13. Misol: Eng katta umumiy bo'luvchi (Euclidean)
Eng samarali GCD algoritmi:
int a = 48, b = 18;
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
printf("GCD: %d\n", a);
// GCD: 614. Cheksiz sikl va break
while (1) {
int input;
printf("Raqam kiriting (0 — chiqish): ");
scanf("%d", &input);
if (input == 0) {
break; // cheksizdan chiqish
}
printf("Kvadrati: %d\n", input * input);
}15. continue while'da
int i = 0;
while (i < 10) {
i++;
if (i % 2 == 0) continue; // faqat toq
printf("%d ", i);
}
// 1 3 5 7 9Continue va increment
While'da continue ishlatganda — increment'ni continue'dan oldin qo'ying. Aks holda — cheksiz sikl!
// XATO — cheksiz!
int i = 0;
while (i < 10) {
if (i % 2 == 0) continue; // i hech qachon o'zgarmaydi!
printf("%d ", i);
i++;
}16. Nested while
int i = 1;
while (i <= 3) {
int j = 1;
while (j <= 3) {
printf("(%d,%d) ", i, j);
j++;
}
printf("\n");
i++;
}Natija:
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
(3,1) (3,2) (3,3)17. Common pitfalls
1. Increment unutish
int i = 0;
while (i < 10) {
printf("%d ", i);
// i++ unutildi — cheksiz!
}2. Shart noto'g'ri
int i = 10;
while (i < 5) { // hech qachon true emas
// ishlamaydi
}3. = vs ==
int x = 5;
while (x = 0) { ... } // XATO — belgilash, doim 0 (false)
while (x == 0) { ... } // To'g'ri4. Off-by-one
int i = 1;
while (i < 10) { // 1-9 (9 marta)
...
}
int i = 1;
while (i <= 10) { // 1-10 (10 marta)
...
}18. Murakkab misol: Number guessing game (qisqa)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));
int secret = rand() % 100 + 1;
int guess;
int attempts = 0;
printf("1-100 oralig'idagi raqamni toping!\n");
do {
printf("Sizning taxminingiz: ");
scanf("%d", &guess);
attempts++;
if (guess > secret) {
printf("Pastroq!\n");
} else if (guess < secret) {
printf("Balandroq!\n");
}
} while (guess != secret);
printf("Topdingiz! Urinishlar: %d\n", attempts);
return 0;
}Bu — keyingi darslarda (input/output) yana ko'rib chiqamiz.
Darsdagi topshiriqlar
Topshiriq 1 — Asosiy while
while-asoslari.c:
#include <stdio.h>
int main(void) {
// 1 dan 10 gacha
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++;
}
printf("\n");
// 10 dan 1 gacha
i = 10;
while (i >= 1) {
printf("%d ", i);
i--;
}
printf("\n");
// Yig'indi
int sum = 0;
i = 1;
while (i <= 50) {
sum += i;
i++;
}
printf("1+2+...+50 = %d\n", sum);
return 0;
}Topshiriq 2 — Raqam tahlili
number-analysis.c:
#include <stdio.h>
int main(void) {
int n = 123456789;
int original = n;
// Raqamlar soni
int count = 0;
int temp = n;
while (temp > 0) {
temp /= 10;
count++;
}
// Raqamlar yig'indisi
int sum = 0;
temp = n;
while (temp > 0) {
sum += temp % 10;
temp /= 10;
}
// Teskari
int reverse = 0;
temp = n;
while (temp > 0) {
reverse = reverse * 10 + temp % 10;
temp /= 10;
}
printf("Raqam: %d\n", original);
printf("Raqamlar soni: %d\n", count);
printf("Raqamlar yig'indisi: %d\n", sum);
printf("Teskari: %d\n", reverse);
return 0;
}Boshqa raqamlar bilan sinab ko'ring.
Topshiriq 3 — Palindrome
palindrome.c:
#include <stdio.h>
int main(void) {
int n = 12321;
int original = n;
int reverse = 0;
while (n > 0) {
reverse = reverse * 10 + n % 10;
n /= 10;
}
if (original == reverse) {
printf("%d — palindrom\n", original);
} else {
printf("%d — palindrom emas\n", original);
}
return 0;
}Sinab ko'ring: 121, 1331, 123, 9999, 12321, 100.
Topshiriq 4 — do-while menu
menu.c:
#include <stdio.h>
int main(void) {
int tanlov;
do {
printf("\n=== MENU ===\n");
printf("1. Yangi fayl\n");
printf("2. Ochish\n");
printf("3. Saqlash\n");
printf("4. Chop etish\n");
printf("5. Chiqish\n");
printf("Tanlov: ");
scanf("%d", &tanlov);
switch (tanlov) {
case 1: printf("Yangi fayl yaratildi\n"); break;
case 2: printf("Fayl ochildi\n"); break;
case 3: printf("Fayl saqlandi\n"); break;
case 4: printf("Chop etilmoqda\n"); break;
case 5: printf("Xayr!\n"); break;
default: printf("Noma'lum tanlov\n");
}
} while (tanlov != 5);
return 0;
}Topshiriq 5 — GCD Euclidean
gcd-euclidean.c:
#include <stdio.h>
int main(void) {
int a = 1071, b = 462;
int original_a = a, original_b = b;
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
printf("GCD(%d, %d) = %d\n", original_a, original_b, a);
return 0;
}Boshqa raqamlar: (48, 18), (100, 75), (24, 36).
Topshiriq 6 — Collatz Conjecture
collatz.c:
Collatz qoidasi:
- Agar n juft —
n / 2 - Agar n toq —
3n + 1 - 1'ga yetguncha takrorlash
#include <stdio.h>
int main(void) {
int n = 27;
int steps = 0;
printf("Boshlanish: %d\n", n);
while (n != 1) {
if (n % 2 == 0) {
n /= 2;
} else {
n = 3 * n + 1;
}
steps++;
printf("Qadam %d: %d\n", steps, n);
}
printf("Jami qadamlar: %d\n", steps);
return 0;
}Sinab ko'ring: 1, 2, 3, 6, 7, 27, 97.
(Bonus: 27 uchun 111 qadam kerak)
Topshiriq 7 — Tub son tekshirish (while bilan)
prime-while.c:
#include <stdio.h>
int main(void) {
int n = 31;
int is_prime = 1;
if (n < 2) {
is_prime = 0;
} else {
int i = 2;
while (i * i <= n) {
if (n % i == 0) {
is_prime = 0;
break;
}
i++;
}
}
if (is_prime) {
printf("%d — tub\n", n);
} else {
printf("%d — tub emas\n", n);
}
return 0;
}Sinab ko'ring: 2, 3, 4, 17, 100, 97, 1000007.
Topshiriq 8 — for/while/do-while qaysisi?
Quyidagi vazifalarning har biri uchun eng mos siklni tanlang va dasturni yozing:
- 1 dan 100 gacha juft raqamlar yig'indisi
- Faktorial hisoblash (n ber, n! topish)
- Foydalanuvchi 0 kiritmaguncha raqamlarni qabul qilish va yig'indini topish
- Menu (3 ta tanlov)
- 2^n qachon 1 milliondan oshadi? (n = ?)
Har biri uchun:
- Qaysi sikl?
- Sabab?
Va dasturlarni yozing.
Topshiriq 9 — Nested while
nested-while.c:
5x5 jadval chizish (har xil naqshlar):
#include <stdio.h>
int main(void) {
// 1. Oddiy to'rtburchak
int i = 0;
while (i < 5) {
int j = 0;
while (j < 5) {
printf("* ");
j++;
}
printf("\n");
i++;
}
printf("\n");
// 2. Piramida
i = 1;
while (i <= 5) {
int j = 0;
while (j < i) {
printf("* ");
j++;
}
printf("\n");
i++;
}
return 0;
}3 ta o'z naqshingiz ham qo'shing.
Topshiriq 10 — GitHub'ga
$ cd ~/c-darslari
$ mkdir 4-oy-dars-6
$ # fayllarni shu joyga
$ git add .
$ git commit -m "feat: dars 6 - while loops"
$ git pushAsosiy tushunchalar (lug'at)
| Termin | Qisqacha izoh |
|---|---|
| while | Shart asoslangan sikl |
| do-while | Avval body, keyin shart |
| Infinite loop | Cheksiz sikl |
| for vs while | Sikl qachon ishlatish |
| Pre-test loop | while (oldin shart) |
| Post-test loop | do-while (keyin shart) |
| Collatz conjecture | Matematik gipoteza |
| Euclidean algorithm | Tezkor GCD usuli |
| Palindrome | Teskaridan bir xil |