7-bo‘lim

Shart operatorlari

if, else if, else tuzilmasi, switch operatori va uning tuzoqlari, ichma-ich shartlar va ularni soddalashtirish usullari.

🕑 15 daqiqa o‘qish 📄 549 so‘z 👁 3 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. if operatori
  2. if - else
  3. else if zanjiri
  4. Jingalak qavsni tashlamang
  5. Ichma-ich shartlar
  6. Erta qaytish bilan soddalashtirish
  7. switch operatori
  8. switch cheklovlari
  9. Kalkulyator misoli
  10. Menyu misoli
  11. switch ichida o'zgaruvchi yaratish
  12. Umumiy xatolar
  13. Xulosa

Dastur qaror qabul qilishi kerak bo'lganda shart operatorlari ishlatiladi.

if operatori #

C
#include <stdio.h>

int main(void) {
    int yosh = 25;

    if (yosh >= 18) {
        printf("Siz voyaga yetgansiz.\n");
    }

    printf("Dastur davom etadi.\n");
    return 0;
}
Natija
Siz voyaga yetgansiz.
Dastur davom etadi.

if - else #

C
#include <stdio.h>

int main(void) {
    int ball = 45;

    if (ball >= 60) {
        printf("O'tdingiz. Tabriklaymiz!\n");
    } else {
        printf("O'tmadingiz. Yana urinib ko'ring.\n");
    }

    return 0;
}
Natija
O'tmadingiz. Yana urinib ko'ring.

else if zanjiri #

C
#include <stdio.h>

int main(void) {
    int ball = 87;
    char daraja;

    if (ball >= 90) {
        daraja = 'A';
    } else if (ball >= 80) {
        daraja = 'B';
    } else if (ball >= 70) {
        daraja = 'C';
    } else if (ball >= 60) {
        daraja = 'D';
    } else {
        daraja = 'F';
    }

    printf("Ball: %d, daraja: %c\n", ball, daraja);
    return 0;
}
Natija
Ball: 87, daraja: B
Zanjir yuqoridan pastga tekshiriladi ball >= 90 ? yo'q → ball >= 80 ? ROST → daraja = 'B' ball >= 70 ? tekshirilmaydi ball >= 60 ? tekshirilmaydi Birinchi rost shart topilgach, qolganlari o'tkazib yuboriladi
Shuning uchun shartlar tartibi muhim
Shartlar tartibi
C
/* NOTO'G'RI */
if (ball >= 60) daraja = 'D';
else if (ball >= 70) daraja = 'C';
else if (ball >= 90) daraja = 'A';

Bu kodda 95 ball ham 'D' oladi - chunki birinchi shart allaqachon rost.

Qat'iy qoida: eng qattiq shartdan boshlang, keyin yumshoqroqlariga o'ting.

Jingalak qavsni tashlamang #

C
if (yosh >= 18)
    printf("Voyaga yetgan\n");

Bitta buyruq bo'lsa, qavs shart emas. Lekin bu xavfli:

C
if (yosh >= 18)
    printf("Voyaga yetgan\n");
    printf("Ovoz bera oladi\n");   /* SHARTGA KIRMAYDI! */

Ikkinchi printf doim bajariladi - kod chekinishiga qaramay.

Qavsni doim qo'ying
C
if (yosh >= 18) {
    printf("Voyaga yetgan\n");
}

Bu bir sekund ko'proq vaqt oladi, lekin kelajakda soatlab qidiriladigan xatoning oldini oladi. 2014-yilda Apple'ning SSL kutubxonasida aynan shu xato jiddiy xavfsizlik zaifligiga sabab bo'lgan («goto fail» hodisasi).

Ichma-ich shartlar #

C
#include <stdio.h>

int main(void) {
    int yosh = 25;
    int ball = 85;
    int tolagan = 1;

    if (yosh >= 18) {
        if (ball >= 60) {
            if (tolagan) {
                printf("Qabul qilindi\n");
            } else {
                printf("To'lov kutilmoqda\n");
            }
        } else {
            printf("Ball yetarli emas\n");
        }
    } else {
        printf("Yosh yetarli emas\n");
    }

    return 0;
}
Natija
Qabul qilindi

Erta qaytish bilan soddalashtirish #

C
#include <stdio.h>

void arizani_kor(int yosh, int ball, int tolagan) {
    if (yosh < 18) {
        printf("Yosh yetarli emas\n");
        return;
    }

    if (ball < 60) {
        printf("Ball yetarli emas\n");
        return;
    }

    if (!tolagan) {
        printf("To'lov kutilmoqda\n");
        return;
    }

    printf("Qabul qilindi\n");
}

int main(void) {
    arizani_kor(25, 85, 1);
    arizani_kor(16, 90, 1);
    arizani_kor(25, 40, 1);
    arizani_kor(25, 85, 0);

    return 0;
}
Natija
Qabul qilindi
Yosh yetarli emas
Ball yetarli emas
To'lov kutilmoqda
Erta qaytish (early return)

Ikkinchi variant o'qishga ancha oson: har bir shart alohida tekshiriladi va muammo topilsa darhol chiqiladi.

Kod chapga siljimaydi, ichma-ichlik chuqurlashmaydi. Bu uslub «qo'riqchi shart» (guard clause) deb ataladi va professional kodda keng ishlatiladi.

switch operatori #

C
#include <stdio.h>

int main(void) {
    int kun = 3;

    switch (kun) {
        case 1:
            printf("Dushanba\n");
            break;
        case 2:
            printf("Seshanba\n");
            break;
        case 3:
            printf("Chorshanba\n");
            break;
        case 4:
            printf("Payshanba\n");
            break;
        case 5:
            printf("Juma\n");
            break;
        case 6:
        case 7:
            printf("Dam olish kuni\n");
            break;
        default:
            printf("Noto'g'ri kun raqami\n");
            break;
    }

    return 0;
}
Natija
Chorshanba
break ni unutmang

break bo'lmasa, dastur keyingi case ga o'tib ketadi - bu «fall through» deb ataladi.

C
switch (kun) {
    case 1:
        printf("Dushanba\n");   /* break yo'q! */
    case 2:
        printf("Seshanba\n");
        break;
}

kun = 1 bo'lsa, ikkala qator chiqadi.

Ba'zan bu ataylab ishlatiladi (yuqoridagi case 6: case 7: kabi). Bunday holatda izoh qoldiring:

C
case 6:
    /* ataylab pastga o'tadi */
case 7:
    printf("Dam olish kuni\n");
    break;

switch cheklovlari #

Qachon if, qachon switch? if / else if ✔ Oraliqlar: ball >= 80 ✔ Murakkab shartlar: a > 0 && b < 5 ✔ Haqiqiy sonlar ✔ Satrlarni solishtirish Har qanday shart uchun ishlaydi switch ✔ Aniq qiymatlar: 1, 2, 3 ✔ Belgilar: 'a', 'b' ✔ enum qiymatlari ✖ Oraliq va haqiqiy son bo'lmaydi Ko'p variantda tozaroq ko'rinadi
switch faqat butun son va belgilar bilan ishlaydi
C
/* switch da ishlamaydigan holatlar */

switch (ball) {
    case ball >= 90:      /* XATO: shart yozib bo'lmaydi */
    case 90 ... 100:      /* XATO: standart C da oraliq yo'q */
}

switch (narx) {           /* XATO: double bo'lmaydi */
}

Kalkulyator misoli #

C
#include <stdio.h>

int main(void) {
    double a = 12.0, b = 4.0;
    char amal = '*';
    double natija = 0.0;
    int togrimi = 1;

    switch (amal) {
        case '+': natija = a + b; break;
        case '-': natija = a - b; break;
        case '*': natija = a * b; break;
        case '/':
            if (b == 0.0) {
                printf("Xato: nolga bo'lish\n");
                togrimi = 0;
            } else {
                natija = a / b;
            }
            break;
        default:
            printf("Noma'lum amal: %c\n", amal);
            togrimi = 0;
            break;
    }

    if (togrimi) {
        printf("%.2f %c %.2f = %.2f\n", a, amal, b, natija);
    }

    return 0;
}
Natija
12.00 * 4.00 = 48.00

Menyu misoli #

C
#include <stdio.h>

int main(void) {
    int tanlov = 2;

    printf("=== Asosiy menyu ===\n");
    printf("1. Yangi yozuv\n");
    printf("2. Ro'yxatni ko'rish\n");
    printf("3. Qidirish\n");
    printf("0. Chiqish\n");
    printf("Tanlov: %d\n\n", tanlov);

    switch (tanlov) {
        case 1:
            printf("Yangi yozuv qo'shilmoqda...\n");
            break;
        case 2:
            printf("Ro'yxat ochilmoqda...\n");
            break;
        case 3:
            printf("Qidiruv boshlandi...\n");
            break;
        case 0:
            printf("Dasturdan chiqildi.\n");
            break;
        default:
            printf("Bunday tanlov yo'q.\n");
            break;
    }

    return 0;
}
Natija
=== Asosiy menyu ===
1. Yangi yozuv
2. Ro'yxatni ko'rish
3. Qidirish
0. Chiqish
Tanlov: 2

Ro'yxat ochilmoqda...

switch ichida o'zgaruvchi yaratish #

C
switch (tanlov) {
    case 1: {
        int vaqtinchalik = 10;    /* jingalak qavs kerak */
        printf("%d\n", vaqtinchalik);
        break;
    }
    case 2:
        printf("Ikkinchi\n");
        break;
}
case ichida to'g'ridan-to'g'ri e'lon qilib bo'lmaydi
C
case 1:
    int x = 10;    /* ba'zi kompilyatorlarda xato */

Sababi: case yorlig'i (label) hisoblanadi va yorliqdan keyin darhol e'lon kelishi mumkin emas. Yechim - blokni jingalak qavs bilan o'rash.

Umumiy xatolar #

Uchta eng ko'p uchraydigan xato

1. Nuqtali vergul if dan keyin

C
if (yosh >= 18);              /* diqqat: ; */
{
    printf("Voyaga yetgan\n");   /* DOIM bajariladi */
}

2. = o'rniga ==

C
if (yosh = 18) { ... }        /* qiymat beradi, taqqoslamaydi */

3. Haqiqiy sonni == bilan solishtirish

C
if (narx == 0.1) { ... }      /* deyarli hech qachon rost bo'lmaydi */

-Wall bayrog'i birinchi ikkitasi haqida ogohlantiradi.

Amaliy topshiriq
  1. Sonning musbat, manfiy yoki nol ekanini aniqlang.
  2. Uchta sondan eng kattasini if bilan toping.
  3. Ballga qarab daraja beruvchi dastur yozing (A, B, C, D, F).
  4. Shartlar tartibini teskari qilib, xatoni o'z ko'zingiz bilan ko'ring.
  5. if dan keyin nuqtali vergul qo'yib, natijani kuzating.
  6. Kalkulyatorni to'rt amal bilan switch orqali yozing.
  7. Nolga bo'lish holatini alohida tekshiring.
  8. Oyning raqamiga qarab kunlar sonini chiqaring (switch bilan).
  9. break ni ataylab olib tashlab, «fall through» ni ko'ring.
  10. Ichma-ich shartli kodni erta qaytish uslubiga o'tkazing.

Xulosa #

  • if shart rost bo'lsa blokni bajaradi, else aks holda.
  • else if zanjirida birinchi rost shart ishlaydi, qolganlari tekshirilmaydi.
  • Shartlar tartibi muhim - eng qattiq shartdan boshlang.
  • Bitta buyruq bo'lsa ham jingalak qavsni qo'ying.
  • Ichma-ich shartlarni erta qaytish bilan soddalashtiring.
  • switch faqat butun son va belgilar bilan ishlaydi.
  • Har bir case oxirida break bo'lishi kerak.
  • default bo'limi kutilmagan qiymatlarni ushlaydi.
  • if dan keyin nuqtali vergul qo'ymang.

Keyingi bo'limda sikllarni - for, while va do-while ni 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.