Skip to content

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

c
while (shart) {
    // body
}

Shart rost bo'lguncha body takrorlanadi.

c
int i = 0;
while (i < 5) {
    printf("%d ", i);
    i++;
}
// 0 1 2 3 4

2. for va while taqqoslash

for:

c
for (int i = 0; i < 5; i++) {
    printf("%d ", i);
}

while:

c
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

c
int yosh = -1;
while (yosh < 0 || yosh > 120) {
    printf("Yoshingizni kiriting (0-120): ");
    scanf("%d", &yosh);
}

Fayl tugamaguncha

c
int c;  // EOF bilan solishtirish uchun int bo'lishi kerak
while ((c = getchar()) != EOF) {
    putchar(c);
}

Cheksiz sikl

c
while (1) {
    // cheksiz, faqat break bilan chiqadi
}

4. do-while sikli

c
do {
    // body
} while (shart);

Avval body, keyin shart. Demak — kamida bir marta ishlaydi.

c
int i = 0;
do {
    printf("%d ", i);
    i++;
} while (i < 5);
// 0 1 2 3 4

5. while vs do-while farqi

c
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-while

do-while bir marta ishladi, while umuman ishlamadi.

6. do-while qachon kerak?

c
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

c
char javob;
do {
    printf("Davom etamiz? (h/y): ");
    scanf(" %c", &javob);
} while (javob != 'h' && javob != 'y');

7. Sikl turlari qachon?

HolatSikl
Aniq N martafor
Massiv bo'ylabfor
Foydalanuvchidan to'g'ri ma'lumot olishdo-while
Menudo-while
Fayl o'qishwhile
Shart asoslanganwhile

8. Aniq misol: Raqamlar yig'indisi

c
#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:

c
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}

9. Misol: Raqamning son sonini topish

c
int n = 12345;
int count = 0;

while (n > 0) {
    n = n / 10;
    count++;
}

printf("Son soni: %d\n", count);
// Son soni: 5

Har iteratsiyada n 10 ga bo'linadi. 12345 → 1234 → 123 → 12 → 1 → 0.

10. Misol: Raqamlar yig'indisi (raqam ichidagi)

c
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 = 15

11. Misol: Teskariga aylantirish

c
int n = 12345;
int reverse = 0;

while (n > 0) {
    reverse = reverse * 10 + n % 10;
    n /= 10;
}

printf("Teskari: %d\n", reverse);
// 54321

12. Palindrome (palindrom) tekshirish

Palindrom — teskari o'qiganda ham bir xil (121, 1331, 99).

c
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:

c
int a = 48, b = 18;

while (b != 0) {
    int temp = b;
    b = a % b;
    a = temp;
}

printf("GCD: %d\n", a);
// GCD: 6

14. Cheksiz sikl va break

c
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

c
int i = 0;
while (i < 10) {
    i++;
    if (i % 2 == 0) continue;  // faqat toq
    printf("%d ", i);
}
// 1 3 5 7 9

Continue va increment

While'da continue ishlatganda — increment'ni continue'dan oldin qo'ying. Aks holda — cheksiz sikl!

c
// 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

c
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

c
int i = 0;
while (i < 10) {
    printf("%d ", i);
    // i++ unutildi — cheksiz!
}

2. Shart noto'g'ri

c
int i = 10;
while (i < 5) {  // hech qachon true emas
    // ishlamaydi
}

3. = vs ==

c
int x = 5;
while (x = 0) { ... }   // XATO — belgilash, doim 0 (false)
while (x == 0) { ... }  // To'g'ri

4. Off-by-one

c
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)

c
#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:

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:

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:

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:

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:

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
c
#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:

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. 1 dan 100 gacha juft raqamlar yig'indisi
  2. Faktorial hisoblash (n ber, n! topish)
  3. Foydalanuvchi 0 kiritmaguncha raqamlarni qabul qilish va yig'indini topish
  4. Menu (3 ta tanlov)
  5. 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):

c
#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

bash
$ cd ~/c-darslari
$ mkdir 4-oy-dars-6
$ # fayllarni shu joyga
$ git add .
$ git commit -m "feat: dars 6 - while loops"
$ git push

Asosiy tushunchalar (lug'at)

TerminQisqacha izoh
whileShart asoslangan sikl
do-whileAvval body, keyin shart
Infinite loopCheksiz sikl
for vs whileSikl qachon ishlatish
Pre-test loopwhile (oldin shart)
Post-test loopdo-while (keyin shart)
Collatz conjectureMatematik gipoteza
Euclidean algorithmTezkor GCD usuli
PalindromeTeskaridan bir xil

Keyingi dars

7-dars: Funksiyalar — asoslar →

Master IT o'quv markazi — o'qitish rejasi