switch–case

~10 daq · C tili · Asoslar

Nima uchun switch kerak?

Oldingi darsda else if bilan ko'p shartni tekshirdik. Lekin ba'zan bir o'zgaruvchining aniq qiymatlarini tekshirish kerak bo'ladi. Masalan:

// else if bilan — charchagan ko'rinish
if      (kun == 1) printf("Dushanba\n");
else if (kun == 2) printf("Seshanba\n");
else if (kun == 3) printf("Chorshanba\n");
else if (kun == 4) printf("Payshanba\n");
else if (kun == 5) printf("Juma\n");
else if (kun == 6) printf("Shanba\n");
else if (kun == 7) printf("Yakshanba\n");

Bu ishlaydi — lekin takroriy, charchagan kod. switch bilan yanada tozaroq yoziladi.


switch sintaksisi

switch (ifoda) {
    case qiymat1:
        // qiymat1 ga teng bo'lsa
        break;
    case qiymat2:
        // qiymat2 ga teng bo'lsa
        break;
    default:
        // hech biri mos kelmasa
        break;
}

Qanday ishlaydi?

switch (ifoda)
       │
       ├── case 1 ga tengmi? → ha → bajar → break → chiq
       │
       ├── case 2 ga tengmi? → ha → bajar → break → chiq
       │
       ├── case 3 ga tengmi? → ha → bajar → break → chiq
       │
       └── default → hech biri emas → bajar → chiq

Yuqoridagi misolni switch bilan

#include <stdio.h>

int main() {
    int kun;

    printf("Kun raqamini kiriting (1-7): ");
    scanf("%d", &kun);

    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: printf("Shanba\n");     break;
        case 7: printf("Yakshanba\n");  break;
        default: printf("Noto'g'ri raqam!\n"); break;
    }

    return 0;
}

Natija (kun = 3):

Chorshanba

Natija (kun = 9):

Noto'g'ri raqam!

break — nima uchun muhim?

break — switch dan chiqish buyrug'i. Unutilsa — keyingi case lar ham bajariladi! Bu fall-through deyiladi.

break siz nima bo'ladi?

#include <stdio.h>

int main() {
    int x = 2;

    switch (x) {
        case 1: printf("Bir\n");
        case 2: printf("Ikki\n");    // ← shu yerdan boshlanadi
        case 3: printf("Uch\n");     // break yo'q — bu ham bajariladi!
        case 4: printf("To'rt\n");   // bu ham!
        default: printf("Boshqa\n"); // bu ham!
    }

    return 0;
}

Natija:

Ikki
Uch
To'rt
Boshqa

⚠️ Diqqat: case 2 dan boshlab hammasi bajarildi! Bu xato emas — C ning qasddан shunday ishlashi. Lekin ko'pincha bu noto'g'ri natija beradi. Doim break yozish odatini oling.

break bilan to'g'ri

switch (x) {
    case 1: printf("Bir\n");    break;
    case 2: printf("Ikki\n");   break;  // ← break, chiqadi
    case 3: printf("Uch\n");    break;
    default: printf("Boshqa\n"); break;
}

Natija (x = 2):

Ikki

Fall-through — qasddан ishlatish

Ba'zan fall-through foydali bo'ladi. Bir nechta case uchun bir xil ish bajarish kerak bo'lsa:

#include <stdio.h>

int main() {
    int kun;
    printf("Kun (1-7): ");
    scanf("%d", &kun);

    switch (kun) {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("Ish kuni\n");
            break;
        case 6:
        case 7:
            printf("Dam olish kuni\n");
            break;
        default:
            printf("Noto'g'ri!\n");
            break;
    }

    return 0;
}

Natija (kun = 3):

Ish kuni

Natija (kun = 6):

Dam olish kuni

💡 case 1: dan case 5: gacha — hammasi "Ish kuni" ga tushadi. Bu fall-through ning to'g'ri ishlatilishi.


default — majburiy emas, lekin kerak

default — hech bir case mos kelmasa ishlaydi. Majburiy emas, lekin doim yozish yaxshi amaliyot.

switch (baho) {
    case 5: printf("A'lo\n");       break;
    case 4: printf("Yaxshi\n");     break;
    case 3: printf("Qoniqarli\n");  break;
    default:
        printf("Noto'g'ri baho: %d\n", baho);
        break;
}

switch + char

switch int va char bilan ishlaydi. (float, double, string bilan ishlamaydi!)

#include <stdio.h>

int main() {
    char amal;
    double a, b;

    printf("Son1: ");  scanf("%lf", &a);
    printf("Amal: ");  scanf(" %c", &amal);
    printf("Son2: ");  scanf("%lf", &b);

    switch (amal) {
        case '+':
            printf("%.2f + %.2f = %.2f\n", a, b, a + b);
            break;
        case '-':
            printf("%.2f - %.2f = %.2f\n", a, b, a - b);
            break;
        case '*':
            printf("%.2f * %.2f = %.2f\n", a, b, a * b);
            break;
        case '/':
            if (b == 0)
                printf("Nolga bo'lib bo'lmaydi!\n");
            else
                printf("%.2f / %.2f = %.2f\n", a, b, a / b);
            break;
        default:
            printf("Noto'g'ri amal: %c\n", amal);
            break;
    }

    return 0;
}

Natija:

Son1: 15
Amal: *
Son2: 4
15.00 * 4.00 = 60.00

switch ichida switch — Nested switch

#include <stdio.h>

int main() {
    int fasl, oy;

    printf("Fasl (1-4): ");
    scanf("%d", &fasl);

    switch (fasl) {
        case 1:
            printf("Qish — ");
            printf("Oylar: Dekabr, Yanvar, Fevral\n");
            break;
        case 2:
            printf("Bahor — ");
            printf("Oylar: Mart, Aprel, May\n");
            break;
        case 3:
            printf("Yoz — ");
            printf("Oylar: Iyun, Iyul, Avgust\n");
            break;
        case 4:
            printf("Kuz — ");
            printf("Oylar: Sentabr, Oktabr, Noyabr\n");
            break;
        default:
            printf("Noto'g'ri fasl!\n");
            break;
    }

    return 0;
}

if-else vs switch — qachon nimani ishlating?

switch ishlating:
  ✓ Bir o'zgaruvchining aniq qiymatlarini tekshirganda
  ✓ Ko'p case bo'lganda (3 dan ortiq)
  ✓ int yoki char bilan ishlashda
  ✓ Menyu tizimlarida

if-else ishlating:
  ✓ Oraliq tekshirishda (x > 10 && x < 20)
  ✓ float/double solishtishda
  ✓ Murakkab mantiqiy shartlarda
  ✓ Ikki holatdan birida

Amaliy dastur — Restoran menyusi

#include <stdio.h>

int main() {
    int tanlov;
    int mikdor;
    double narx, jami;

    printf("╔═══════════════════════════════╗\n");
    printf("║        FOUNDATION CAFE        ║\n");
    printf("╠═══════════════════════════════╣\n");
    printf("║  1. Lag'mon        12 000 so'm║\n");
    printf("║  2. Shashlik       25 000 so'm║\n");
    printf("║  3. Palov          15 000 so'm║\n");
    printf("║  4. Choy            3 000 so'm║\n");
    printf("║  5. Ko'k choy       2 000 so'm║\n");
    printf("╚═══════════════════════════════╝\n");

    printf("\nTanlovingiz (1-5): ");
    scanf("%d", &tanlov);
    printf("Miqdor: ");
    scanf("%d", &mikdor);

    switch (tanlov) {
        case 1: narx = 12000; printf("Lag'mon");    break;
        case 2: narx = 25000; printf("Shashlik");   break;
        case 3: narx = 15000; printf("Palov");      break;
        case 4: narx =  3000; printf("Choy");       break;
        case 5: narx =  2000; printf("Ko'k choy");  break;
        default:
            printf("Noto'g'ri tanlov!\n");
            return 1;
    }

    jami = narx * mikdor;
    printf(" x %d = %.0f so'm\n", mikdor, jami);

    return 0;
}

Natija:

╔════════════════════════════════╗
║      FOUNDATION CAFE           ║
╠════════════════════════════════╣
║  1. Lag'mon        12 000 so'm ║
║  2. Shashlik       25 000 so'm ║
║  3. Palov          15 000 so'm ║
║  4. Choy            3 000 so'm ║
║  5. Ko'k choy       2 000 so'm ║
╚════════════════════════════════╝

Tanlovingiz (1-5): 2
Miqdor: 3
Shashlik x 3 = 75000 so'm

Masala va vazifalar


Oson


Masala 1 — Hafta kuni [oson]

Foydalanuvchidan 1-7 orasida son oling. Mos hafta kunini chiqaring.

Input Output
1 Dushanba
5 Juma
7 Yakshanba
8 Noto'g'ri raqam

Masala 2 — Fasl [oson]

Oy raqamini oling (1-12). switch bilan faslini chiqaring.

Input Output
1 Qish
4 Bahor
7 Yoz
10 Kuz
13 Noto'g'ri oy

Hint: Fall-through — 12, 1, 2 → Qish


Masala 3 — Amal nomi [oson]

Foydalanuvchidan +, -, *, / belgisini oling. Amal nomini chiqaring.

Input Output
+ Qo'shish
* Ko'paytirish
/ Bo'lish
^ Noto'g'ri amal

Masala 4 — Rang kodi [oson]

Foydalanuvchidan 1-5 son oling. switch bilan rangni chiqaring: 1→Qizil, 2→Yashil, 3→Ko'k, 4→Sariq, 5→Oq

Input Output
1 Qizil
3 Ko'k
6 Noma'lum rang

Masala 5 — Baho harfi [oson]

Foydalanuvchidan baho harfini oling (A,B,C,D,F). switch bilan ta'rifini chiqaring:

Input Output
A Mukammal (90-100)
B Yaxshi (75-89)
C Qoniqarli (60-74)
D Qoniqarsiz (45-59)
F Yiqildi (0-44)
X Noto'g'ri baho

O'rta


Masala 6 — Paxta terish [o'rta]

Dam olish kuni talabalar paxta terimiga hasharga chiqishdi. N nafar qiz va M nafar yigit musobaqa o'ynashdi.

Har bir qiz o'rtacha k1 kg, har bir yigit k2 kg paxta terdi.

Hisoblang:

  • Umumiy paxta og'irligi S (tonnada)
  • Har bir talaba tergan o'rtacha Q (kilogrammda)
Input Output
N=20 M=15 k1=12 k2=10 S=0.39 tonna, Q=11.14 kg
N=10 M=10 k1=8 k2=8 S=0.16 tonna, Q=8.00 kg

Hint:

double S = (N*k1 + M*k2) / 1000.0;
double Q = (N*k1 + M*k2) / (double)(N+M);

Masala 7 — Mukofot [o'rta]

Yuqoridagi masalaga ko'ra, tadbirkor talabalarni mukofotlashga qaror qildi.

Shart:

  • Qizlar ko'p tersa → har bir qizga 3 ta shokolad
  • Qizlar kam tersa → har bir qizga 1 ta shokolad
  • Yigitlar g'alaba qozansa → har bir yigitga 2 ta muzqaymoq
  • Yigitlar yutqazsa → har bir yigitga 1 ta muzqaymoq

Tadbirkor jami necha dona shokolad va necha dona muzqaymoq sotib oldi?

Input Output
N=20 M=15 k1=12 k2=10 60 ta shokolad, 15 ta muzqaymoq
N=10 M=10 k1=8 k2=10 10 ta shokolad, 20 ta muzqaymoq

Hint: switch emas, if-else bilan — lekin natijani chiqarishda switch ishlatib ko'ring.


Masala 8 — Kalkulyator [o'rta]

Foydalanuvchidan ikkita son va amal (+,-,*,/) oling. switch bilan natijani hisoblang. Bo'lishda b=0 ni tekshiring.

Input Output
15 4 + 19.00
7 0 / Nolga bo'lib bo'lmaydi!
3 8 * 24.00

Masala 9 — Oy kunlari [o'rta]

Foydalanuvchidan oy raqamini oling. switch bilan o'sha oyda necha kun borligini chiqaring. (Kabisa yilini hozircha hisobga olmang)

Input Output
1 31 kun
2 28 kun
4 30 kun
13 Noto'g'ri oy

Hint: Fall-through: 1,3,5,7,8,10,12 → 31 kun


Masala 10 — Transport [o'rta]

Foydalanuvchidan transport turini oling: 1→Avtobus, 2→Metro, 3→Taksi, 4→Piyoda

Har biri uchun:

  • Narxi (so'm)
  • Taxminiy vaqt (daqiqa)
  • Maslahat
1 → Narx: 1400 so'm | Vaqt: ~25 daq | Tez-tez to'xtaydi
2 → Narx: 1400 so'm | Vaqt: ~15 daq | Eng tez
3 → Narx: 15000 so'm | Vaqt: ~10 daq | Qulay lekin qimmat
4 → Narx: 0 so'm | Vaqt: ~45 daq | Sog'liq uchun yaxshi

Masala 11 — Telefon menyusi [o'rta]

Oddiy telefon menyusini switch bilan yozing:

=== ASOSIY MENYU ===
1. Qo'ng'iroqlar
2. Xabarlar
3. Kamera
4. Sozlamalar
0. Chiqish

Har bir tanlov uchun: "[Qo'ng'iroqlar] ochildi" kabi xabar chiqaring. 0 → "Xayr!" Noto'g'ri → "Bunday menyu yo'q"


Masala 12 — Trigonometriya yo'nalishi [o'rta]

Foydalanuvchidan yo'nalish (N, S, E, W) harfini oling. switch bilan to'liq nomini va gradusini chiqaring:

Input Output
N Shimol — 0°
E Sharq — 90°
S Janub — 180°
W G'arb — 270°
X Noma'lum yo'nalish

Qiyin


Masala 13 — Yuk tashish narxi [qiyin]

Yuk tashish kompaniyasi quyidagi tarifda ishlaydi:

Tur 1 (Shahar ichida):
  0-10 km  → km boshiga 2000 so'm
  10+ km   → km boshiga 1500 so'm

Tur 2 (Shaharlararo):
  0-100 km → km boshiga 1000 so'm
  100+ km  → km boshiga 800 so'm

Tur 3 (Xalqaro):
  Har km   → 5000 so'm
  + 50$ bojxona to'lovi (1$=12800 so'm)

Foydalanuvchidan tur (1/2/3) va masofani oling. Jami narxni hisoblang.

Input Output
1 15 22500 so'm
2 150 140000 so'm
3 200 1640000 so'm

Masala 14 — ATM simulyatsiyasi [qiyin]

Oddiy ATM dasturi yozing:

Hisob: 500000 so'm (o'zgaruvchida)

1. Balans ko'rish
2. Pul yechish
3. Pul qo'yish
0. Chiqish
  • Yechishda: yetarli pul bormi tekshiring
  • Qo'yishda: manfiy son kiritilsa xato chiqaring
  • Har amaldan keyin yangi balansni chiqaring
Input Output
1 Balans: 500000 so'm
2 → 200000 Yechildi. Balans: 300000 so'm
2 → 400000 Yetarli mablag' yo'q!

Masala 15 — Semestr bahosi [qiyin]

Talabaning bahosi quyidagi tizimda hisoblanadi:

Dars davomati:  20%
Oraliq nazorat: 30%
Yakuniy imtihon: 50%

Foydalanuvchidan uch bahoni oling. Yakuniy bahoni hisoblang va switch bilan baho harfini chiqaring:

86-100 → A (Mukammal)
71-85  → B (Yaxshi)
56-70  → C (Qoniqarli)
41-55  → D (Qoniqarsiz)
0-40   → F (Yiqildi)

Hint:

int yakuniy = (int)(davom*0.2 + oraliq*0.3 + imtihon*0.5);
switch (yakuniy / 10) { ... }
// 86-100 → case 8, 9, 10

Masala 16 — Qabul imtihoni [qiyin]

Universitetga qabul tizimi:

Yo'nalish tanlang:
1. Dasturlash    → Matematika + Fizika
2. Iqtisodiyot  → Matematika + Ingliz tili
3. Huquqshunoslik → Tarix + Ingliz tili

Foydalanuvchidan yo'nalish va ikkita fan bahosini oling. O'rtacha hisoblang. switch bilan natija:

90+  → "Davlat granti"
70+  → "To'lov-kontrakt"
70-  → "Qabul qilinmadi"
Input Output
1, 95, 88 Dasturlash — O'rtacha: 91.5 — Davlat granti
2, 65, 70 Iqtisodiyot — O'rtacha: 67.5 — Qabul qilinmadi

Masala 17 — Vaqt formati [qiyin]

Foydalanuvchidan soat (0-23) oling. switch + fall-through bilan:

0-5   → "Tun (yoqimli tush!)"
6-8   → "Ertalab (nonushta vaqti)"
9-11  → "Oldingi tush (ish vaqti)"
12    → "Tush (ovqat vaqti)"
13-17 → "Tushdan keyin (ish vaqti)"
18-20 → "Kechqurun (dam olish)"
21-23 → "Kech kechqurun (uxlash vaqti)"

Shu bilan birga: AM yoki PM ekanini chiqaring.

Input Output
7 07:00 AM — Ertalab (nonushta vaqti)
14 02:00 PM — Tushdan keyin (ish vaqti)
0 12:00 AM — Tun (yoqimli tush!)

⭐ Yulduzcha


⭐ Masala 18 — Shifrlash [yulduzcha]

Foydalanuvchidan kichik harf (a-z) oling. Sezar shifri — harfni 3 ta oldinga suring:

a → d
b → e
x → a  (aylana — z dan keyin a ga qaytadi)
y → b
z → c

switch bilan faqat maxsus holatlarni (x, y, z) alohida ko'rsating, qolganlarini matematik formula bilan:

char shifr = (harf - 'a' + 3) % 26 + 'a';
Input Output
a d
z c
m p

Qo'shimcha: Rasshifrovka funksiyasini ham yozing (3 ta orqaga suring).


⭐ Masala 19 — Roman raqamlari [yulduzcha]

Foydalanuvchidan 1-10 orasida son oling. switch bilan Roman raqamiga aylantiring:

Input Output
1 I
4 IV
9 IX
10 X
1→I  2→II  3→III  4→IV   5→V
6→VI 7→VII 8→VIII 9→IX  10→X

Qo'shimcha: 1-50 gacha kengaytiring. Qanday yondashuvni tanladingiz?


⭐ Masala 20 — Mini bank tizimi [yulduzcha]

Ikki foydalanuvchi: Ali va Vali. Har birining boshlang'ich balansi: 1 000 000 so'm

=== BANK TIZIMI ===
1. Ali → Vali pul o'tkazish
2. Vali → Ali pul o'tkazish
3. Ali balansini ko'rish
4. Vali balansini ko'rish
5. Ikkalasining jami boyligini ko'rish
0. Chiqish

Qoidalar:

  • O'tkazmada yetarli pul bormi tekshiring
  • Manfiy miqdor kiritilsa xato chiqaring
  • Har amaldan keyin chek chiqaring:
╔══════════════════════════════╗
║         BANK CHEKI           ║
╠══════════════════════════════╣
║  Kimdan:  Ali                ║
║  Kimga:   Vali               ║
║  Miqdor:  50,000 so'm        ║
║  Ali:     950,000 so'm       ║
║  Vali:    1,050,000 so'm     ║
╚══════════════════════════════╝

Hint: Hali loop o'rganmadik — faqat bir marta amal bajaring. Loop darsidan keyin bu dasturni yanada kuchaytirish mumkin bo'ladi.


Xulosa

switch if-else
Tur int, char Istalgan
Shart Aniq qiymat Istalgan ifoda
O'qilishi Yaxshi (ko'p case) Yaxshi (murakkab shart)
Fall-through Ha (break kerak) Yo'q
Oraliq tekshirish ❌ ✅

Keyingi dars

switch bilan aniq qiymatlarni tekshirdik. Endi takrorlash — bir ishni ko'p marta bajarish.

9-dars: Sikllar — for, while, do-while