7. Sikllar — for, while va do while

Oldingi bo‘limda if yordamida shart tekshirishni o‘rgandik.

Masalan:

if (yosh >= 18) {
    printf("Voyaga yetgan.");
}

Endi boshqa bir muammoni ko‘rib chiqamiz.

Agar biror kodni bir necha marta bajarish kerak bo‘lsa-chi?

Masalan:

Salom
Salom
Salom
Salom
Salom

Buni besh marta alohida yozishimiz mumkin:

printf("Salom\n");
printf("Salom\n");
printf("Salom\n");
printf("Salom\n");
printf("Salom\n");

Lekin bu qulay emas.

Buning o‘rniga sikldan foydalanamiz.


Sikl nima?

Sikl — biror kodni bir necha marta bajarish uchun ishlatiladi.

Masalan:

Salom
Salom
Salom

kabi bir xil amalni qayta-qayta bajarish mumkin.

C tilida asosan uchta sikl mavjud:

  • for
  • while
  • do while

Ularning vazifasi o‘xshash, lekin ishlatilish holatlari biroz farq qiladi.


for sikli

Eng ko‘p ishlatiladigan sikllardan biri for.

Oddiy ko‘rinishi:

for (boshlanish; shart; o'zgarish) {
    // takrorlanadigan kod
}

Birinchi qarashda bu biroz murakkab ko‘rinishi mumkin.

Keling, oddiy misol ko‘ramiz.

#include <stdio.h>

int main() {
    for (int i = 1; i <= 5; i++) {
        printf("Salom\n");
    }

    return 0;
}

Natija:

Salom
Salom
Salom
Salom
Salom

printf() besh marta bajarildi.


for qanday ishlaydi?

Quyidagi kodni ko‘ramiz:

for (int i = 1; i <= 5; i++) {
    printf("Salom\n");
}

Bu yerda:

int i = 1

boshlang‘ich qiymat.

i <= 5

sikl davom etishi uchun shart.

i++

esa har bir takrorlanishdan keyin i ni 1 ga oshiradi.

Sikl taxminan shunday ishlaydi:

i = 1 → Salom
i = 2 → Salom
i = 3 → Salom
i = 4 → Salom
i = 5 → Salom
i = 6 → to‘xtaydi

i nima?

Misollarda ko‘pincha:

i

nomli o‘zgaruvchi ishlatiladi.

i maxsus so‘z emas.

Uni boshqa nom bilan ham yozish mumkin.

Masalan:

for (int son = 1; son <= 5; son++) {
    printf("%d\n", son);
}

Bu ham ishlaydi.

Lekin i sikllarda juda ko‘p ishlatilgani uchun uni ko‘p ko‘rasiz.


for yordamida sonlarni chiqarish

Keling, 1 dan 5 gacha bo‘lgan sonlarni chiqaramiz:

#include <stdio.h>

int main() {
    for (int i = 1; i <= 5; i++) {
        printf("%d\n", i);
    }

    return 0;
}

Natija:

1
2
3
4
5

Bu yerda i ning qiymati har safar o‘zgaradi.


1 dan 10 gacha

Xuddi shu usulda 1 dan 10 gacha chiqarish mumkin:

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        printf("%d\n", i);
    }

    return 0;
}

Natija:

1
2
3
4
5
6
7
8
9
10

10 dan 1 gacha

Siklni kamaytirish yo‘nalishida ham ishlatish mumkin.

#include <stdio.h>

int main() {
    for (int i = 10; i >= 1; i--) {
        printf("%d\n", i);
    }

    return 0;
}

Natija:

10
9
8
7
6
5
4
3
2
1

Bu yerda:

i--

har safar i ni 1 ga kamaytiradi.


while sikli

Ikkinchi sikl turi:

while

while"gacha" yoki "shu shart bajarilayotgan paytda" degan ma'noda ishlatiladi.

Oddiy ko‘rinishi:

while (shart) {
    // kod
}

Masalan:

#include <stdio.h>

int main() {
    int i = 1;

    while (i <= 5) {
        printf("%d\n", i);
        i++;
    }

    return 0;
}

Natija:

1
2
3
4
5

while qanday ishlaydi?

Quyidagi kodni ko‘ramiz:

int i = 1;

while (i <= 5) {
    printf("%d\n", i);
    i++;
}

Dastur:

i = 1
↓
1 <= 5 → ha
↓
1 ni chiqarish
↓
i = 2
↓
2 <= 5 → ha
↓
2 ni chiqarish

va shu tarzda davom etadi.

i 6 bo‘lganda:

6 <= 5 → yo‘q

va sikl to‘xtaydi.


for va while

Ikkalasi bilan ham bir xil ishni bajarish mumkin.

for:

for (int i = 1; i <= 5; i++) {
    printf("%d\n", i);
}

while:

int i = 1;

while (i <= 5) {
    printf("%d\n", i);
    i++;
}

Ikkalasining natijasi:

1
2
3
4
5

bo‘ladi.

Hozircha for va while orasidagi barcha farqlarni bilish shart emas.


do while

Uchinchi sikl:

do while

Oddiy ko‘rinishi:

do {
    // kod
} while (shart);

Masalan:

#include <stdio.h>

int main() {
    int i = 1;

    do {
        printf("%d\n", i);
        i++;
    } while (i <= 5);

    return 0;
}

Natija:

1
2
3
4
5

while va do while farqi

Bu ikki siklning muhim farqi bor.

while avval shartni tekshiradi:

while (shart) {
    // kod
}

do while esa avval kodni bajaradi, keyin shartni tekshiradi:

do {
    // kod
} while (shart);

Shuning uchun do while ichidagi kod kamida bir marta bajariladi.


Oddiy misol

while:

int son = 10;

while (son < 5) {
    printf("Salom");
}

Bu yerda:

10 < 5

noto‘g‘ri.

Shuning uchun Salom chiqmaydi.

Ammo do while:

int son = 10;

do {
    printf("Salom");
} while (son < 5);

Natija:

Salom

bo‘ladi.

Chunki do while avval kodni bir marta bajaradi.


Siklda hisoblash

Sikllar yordamida hisob-kitob qilish ham mumkin.

Masalan, 1 dan 5 gacha bo‘lgan sonlar yig‘indisini topamiz.

#include <stdio.h>

int main() {
    int yigindi = 0;

    for (int i = 1; i <= 5; i++) {
        yigindi = yigindi + i;
    }

    printf("%d", yigindi);

    return 0;
}

Natija:

15

Chunki:

1 + 2 + 3 + 4 + 5 = 15

Juft sonlarni chiqarish

Sikl va % operatoridan foydalanib, juft sonlarni chiqarishimiz mumkin.

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            printf("%d\n", i);
        }
    }

    return 0;
}

Natija:

2
4
6
8
10

Bu yerda if va for birgalikda ishlatilmoqda.


break

Ba'zan siklni shart tugashidan oldin to‘xtatish kerak bo‘ladi.

Buning uchun:

break;

ishlatiladi.

Masalan:

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break;
        }

        printf("%d\n", i);
    }

    return 0;
}

Natija:

1
2
3
4

i 5 bo‘lganda break siklni to‘xtatdi.


continue

continue joriy takrorlanishni tashlab, keyingi takrorlanishga o'tadi.

Masalan:

#include <stdio.h>

int main() {
    for (int i = 1; i <= 5; i++) {
        if (i == 3) {
            continue;
        }

        printf("%d\n", i);
    }

    return 0;
}

Natija:

1
2
4
5

3 chiqarilmadi.

Chunki continue 3-iteratsiyani tashlab ketdi.

Hozircha continue ni chuqur o‘rganish shart emas.


Siklning cheksiz bo‘lib qolishi

Siklning sharti hech qachon noto‘g‘ri bo‘lmasa, sikl to‘xtamaydi.

Masalan:

int i = 1;

while (i <= 5) {
    printf("%d\n", i);
}

Bu kodda i hech qachon o‘zgarmaydi.

Shuning uchun:

i <= 5

har doim to‘g‘ri bo‘lib qoladi.

Natijada sikl cheksiz davom etadi.

To‘g‘ri variant:

int i = 1;

while (i <= 5) {
    printf("%d\n", i);
    i++;
}

Bu yerda i har safar oshib boradi.


Qaysi sikldan foydalanamiz?

Hozircha quyidagicha eslab qolishingiz mumkin:

for

Takrorlanish soni taxminan ma'lum bo‘lsa:

for (int i = 1; i <= 10; i++) {
    printf("%d\n", i);
}

while

Shart bajarilayotgan paytda takrorlash kerak bo‘lsa:

while (shart) {
    // kod
}

do while

Kod kamida bir marta bajarilishi kerak bo‘lsa:

do {
    // kod
} while (shart);

Boshlang‘ich dasturlarda for juda ko‘p ishlatiladi.


Amaliy mashqlar

1-mashq

for yordamida 1 dan 10 gacha bo‘lgan sonlarni chiqaring.

Natija:

1
2
3
4
5
6
7
8
9
10

2-mashq

10 dan 1 gacha bo‘lgan sonlarni chiqaring.

Natija:

10
9
8
7
6
5
4
3
2
1

3-mashq

1 dan 20 gacha bo‘lgan juft sonlarni chiqaring.

Natija:

2
4
6
8
10
12
14
16
18
20

4-mashq

1 dan 10 gacha bo‘lgan sonlar yig‘indisini hisoblang.

Natija:

55

bo‘lishi kerak.


5-mashq

Quyidagi kod nima chiqaradi?

for (int i = 1; i <= 5; i++) {
    printf("%d\n", i);
}

Javobingizni oldindan topib, keyin tekshiring.


Muhim narsalarni eslab qoling

C tilida uchta asosiy sikl bor:

for
while
do while

for:

for (boshlanish; shart; o'zgarish) {
    // kod
}

while:

while (shart) {
    // kod
}

do while:

do {
    // kod
} while (shart);

Shuningdek:

break;

siklni to‘xtatadi.

continue;

joriy takrorlanishni tashlab, keyingisiga o'tadi.


Xulosa

Sikl yordamida bir xil kodni qayta-qayta yozmasdan, uni bir necha marta bajarishimiz mumkin.

Masalan:

for (int i = 1; i <= 5; i++) {
    printf("Salom\n");
}

Bu kod Salom so‘zini besh marta chiqaradi.