8-bo‘lim

Sikllar

for, while va do-while sikllari, break va continue, ichma-ich sikllar, cheksiz sikl xavfi va sikl tanlash qoidalari.

🕑 16 daqiqa o‘qish 📄 536 so‘z 👁 3 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. for sikli
  2. Turli qadamlar
  3. while sikli
  4. do-while sikli
  5. break va continue
  6. Ichma-ich sikllar
  7. Uchburchak chizish
  8. Cheksiz sikl
  9. Qaysi siklni tanlash?
  10. Amaliy misollar
  11. Yig'indi va o'rtacha
  12. Faktorial
  13. Tub sonlarni topish
  14. Sonlar yig'indisi
  15. Xulosa

Sikl - bir xil ishni bir necha marta takrorlash usuli. C da uch xil sikl bor.

for sikli #

for siklining uch qismi for (int i = 0; i < 5; i++) 1. Boshlang'ich bir marta bajariladi 2. Shart har aylanishdan oldin 3. Qadam har aylanishdan keyin Tartib: 1 → 2 → tana → 3 → 2 → tana → 3 → ...
Boshlang'ich faqat bir marta, qolgani har aylanishda
C
#include <stdio.h>

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

    printf("Sikl tugadi.\n");
    return 0;
}
Natija
Aylanish 1
Aylanish 2
Aylanish 3
Aylanish 4
Aylanish 5
Sikl tugadi.
for (int i = ...) - C99 dan beri

Eski C89 da o'zgaruvchi sikldan oldin e'lon qilinishi kerak edi:

C
int i;
for (i = 0; i < 5; i++) { ... }

Zamonaviy C da sikl ichida e'lon qilgan ma'qul - o'zgaruvchi faqat siklda yashaydi va tashqarida chalkashlik keltirmaydi. Buning uchun -std=c17 (yoki -std=c99) bayrog'i kerak.

Turli qadamlar #

C
#include <stdio.h>

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

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

    printf("Ikki barobar: ");
    for (int i = 1; i <= 64; i *= 2) {
        printf("%d ", i);
    }
    printf("\n");

    return 0;
}
Natija
Teskari: 5 4 3 2 1 
Ikkitalab: 0 2 4 6 8 10 
Ikki barobar: 1 2 4 8 16 32 64 

while sikli #

C
#include <stdio.h>

int main(void) {
    int qoldiq = 100;
    int kun = 0;

    while (qoldiq > 0) {
        qoldiq -= 30;
        kun++;
        printf("%d-kun: qoldiq %d\n", kun, qoldiq);
    }

    printf("Zaxira %d kunga yetdi.\n", kun);
    return 0;
}
Natija
1-kun: qoldiq 70
2-kun: qoldiq 40
3-kun: qoldiq 10
4-kun: qoldiq -20
Zaxira 4 kunga yetdi.

do-while sikli #

C
#include <stdio.h>

int main(void) {
    int son = 100;

    /* while: shart yolg'on - tana umuman bajarilmaydi */
    while (son < 10) {
        printf("while ichida\n");
        son++;
    }

    /* do-while: tana kamida bir marta bajariladi */
    do {
        printf("do-while ichida (son = %d)\n", son);
        son++;
    } while (son < 10);

    return 0;
}
Natija
do-while ichida (son = 100)
Shart qayerda tekshiriladi? while Shart? Tana 0 yoki undan ko'p marta do-while Tana Shart? kamida 1 marta
do-while menyu va foydalanuvchi kiritishida qulay
do-while da nuqtali vergul
C
do {
    ...
} while (shart);    /* nuqtali vergul MAJBURIY */

while va for da esa aksincha - qavsdan keyin nuqtali vergul qo'yilmaydi.

break va continue #

C
#include <stdio.h>

int main(void) {
    printf("break bilan:\n");
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break;              /* siklni butunlay to'xtatadi */
        }
        printf("%d ", i);
    }
    printf("\n");

    printf("continue bilan:\n");
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;           /* shu aylanishni o'tkazib yuboradi */
        }
        printf("%d ", i);
    }
    printf("\n");

    return 0;
}
Natija
break bilan:
1 2 3 4 
continue bilan:
1 3 5 7 9 
break va continue farqi
Nima qiladi
breakSikldan butunlay chiqadi
continueJoriy aylanishni tugatib, keyingisiga o'tadi

for siklida continue qadam qismini (i++) bajaradi. Lekin while da ehtiyot bo'ling:

C
int i = 0;
while (i < 10) {
    if (i == 5) continue;    /* CHEKSIZ SIKL: i oshmaydi! */
    i++;
}

Ichma-ich sikllar #

C
#include <stdio.h>

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

    return 0;
}
Natija
  1  2  3  4  5
  2  4  6  8 10
  3  6  9 12 15
  4  8 12 16 20
  5 10 15 20 25

Uchburchak chizish #

C
#include <stdio.h>

int main(void) {
    int balandlik = 5;

    for (int qator = 1; qator <= balandlik; qator++) {
        for (int bosh = 0; bosh < balandlik - qator; bosh++) {
            printf(" ");
        }
        for (int yulduz = 0; yulduz < 2 * qator - 1; yulduz++) {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}
Natija
    *
   ***
  *****
 *******
*********
Ichma-ich siklda break faqat bittasini to'xtatadi
C
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (j == 1) break;    /* faqat ichki siklni to'xtatadi */
    }
    /* tashqi sikl davom etadi */
}

Ikkalasidan chiqish uchun bayroq ishlating:

C
int topildi = 0;

for (int i = 0; i < 3 && !topildi; i++) {
    for (int j = 0; j < 3; j++) {
        if (shart) {
            topildi = 1;
            break;
        }
    }
}

Cheksiz sikl #

C
#include <stdio.h>

int main(void) {
    int hisob = 0;

    for (;;) {                      /* cheksiz sikl */
        hisob++;

        if (hisob >= 3) {
            printf("Uch marta aylandi, chiqamiz.\n");
            break;
        }

        printf("Aylanish %d\n", hisob);
    }

    return 0;
}
Natija
Aylanish 1
Aylanish 2
Uch marta aylandi, chiqamiz.

for (;;) va while (1) - ikkalasi ham cheksiz sikl. Ular menyu va server dasturlarida ataylab ishlatiladi.

Tasodifiy cheksiz sikl

Eng ko'p uchraydigan sabablar:

C
/* 1. Hisoblagich oshmaydi */
int i = 0;
while (i < 10) {
    printf("%d\n", i);      /* i++ unutilgan */
}

/* 2. Shart hech qachon yolg'on bo'lmaydi */
for (unsigned int i = 10; i >= 0; i--) { ... }

/* 3. Nuqtali vergul sikl oxirida */
for (int i = 0; i < 10; i++);      /* diqqat: ; */
{
    printf("%d\n", i);             /* siklga kirmaydi */
}

Dastur qotib qolsa, terminalda Ctrl+C bosing.

Qaysi siklni tanlash? #

HolatSikl
Aylanishlar soni ma'lumfor
Massiv yoki oraliqni aylanishfor
Shart bo'yicha, soni noma'lumwhile
Fayl oxirigacha o'qishwhile
Kamida bir marta bajarilishi kerakdo-while
Menyu, foydalanuvchi kiritishido-while

Amaliy misollar #

Yig'indi va o'rtacha #

C
#include <stdio.h>

int main(void) {
    int baholar[] = {85, 92, 78, 95, 88};
    int soni = 5;
    int yigindi = 0;

    for (int i = 0; i < soni; i++) {
        yigindi += baholar[i];
    }

    printf("Yig'indi: %d\n", yigindi);
    printf("O'rtacha: %.2f\n", (double) yigindi / soni);

    return 0;
}
Natija
Yig'indi: 438
O'rtacha: 87.60

Faktorial #

C
#include <stdio.h>

int main(void) {
    int n = 10;
    long long faktorial = 1;

    for (int i = 2; i <= n; i++) {
        faktorial *= i;
    }

    printf("%d! = %lld\n", n, faktorial);
    return 0;
}
Natija
10! = 3628800

Tub sonlarni topish #

C
#include <stdio.h>

int main(void) {
    int chegara = 30;

    printf("2 dan %d gacha tub sonlar:\n", chegara);

    for (int son = 2; son <= chegara; son++) {
        int tubmi = 1;

        for (int bolvchi = 2; bolvchi * bolvchi <= son; bolvchi++) {
            if (son % bolvchi == 0) {
                tubmi = 0;
                break;
            }
        }

        if (tubmi) {
            printf("%d ", son);
        }
    }

    printf("\n");
    return 0;
}
Natija
2 dan 30 gacha tub sonlar:
2 3 5 7 11 13 17 19 23 29 
bolvchi * bolvchi <= son nima uchun?

Sonning bo'luvchisini son gacha emas, faqat kvadrat ildizigacha qidirish yetarli.

Sabab: agar son = a * b bo'lsa va a > √son bo'lsa, unda b < √son bo'lishi shart - ya'ni kichikroq bo'luvchini biz allaqachon topgan bo'lardik.

100 uchun 10 tagacha, 10000 uchun 100 tagacha tekshiramiz - bu tezlikni keskin oshiradi.

Sonlar yig'indisi #

C
#include <stdio.h>

int main(void) {
    int son = 4729;
    int asl = son;
    int yigindi = 0;

    while (son > 0) {
        yigindi += son % 10;    /* oxirgi raqamni olamiz */
        son /= 10;              /* oxirgi raqamni tashlaymiz */
    }

    printf("%d sonining raqamlari yig'indisi: %d\n", asl, yigindi);
    return 0;
}
Natija
4729 sonining raqamlari yig'indisi: 22
Amaliy topshiriq
  1. 1 dan 100 gacha sonlar yig'indisini hisoblang.
  2. 10 dan 1 gacha teskari sanang.
  3. Berilgan sonning ko'paytuv jadvalini chiqaring.
  4. break va continue farqini o'z misolingizda ko'rsating.
  5. To'g'ri to'rtburchak shaklida yulduzchalar chizing.
  6. Piramida shaklini chizing (yuqoridagi misol asosida).
  7. Sonning faktorialini hisoblang va 20! da nima bo'lishini kuzating.
  8. 100 gacha bo'lgan tub sonlarni toping.
  9. Sonni teskari aylantiring (1234 → 4321).
  10. Fibonachchi ketma-ketligining birinchi 15 hadini chiqaring.

Xulosa #

  • for - aylanishlar soni ma'lum bo'lganda.
  • while - shart bo'yicha, soni noma'lum bo'lganda.
  • do-while - tana kamida bir marta bajarilishi kerak bo'lganda.
  • for uch qismdan iborat: boshlang'ich (bir marta), shart (har aylanishdan oldin), qadam (har aylanishdan keyin).
  • break sikldan chiqadi, continue keyingi aylanishga o'tadi.
  • while ichida continue ishlatganda hisoblagichni oshirishni unutmang.
  • Ichma-ich siklda break faqat bitta siklni to'xtatadi.
  • for (;;) va while (1) - ataylab yaratilgan cheksiz sikl.
  • Sikl qavsidan keyin nuqtali vergul qo'ymang.

Keyingi bo'limda massivlarni o'rganamiz.

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.