switch–case
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 2dan boshlab hammasi bajarildi! Bu xato emas — C ning qasddан shunday ishlashi. Lekin ko'pincha bu noto'g'ri natija beradi. Doimbreakyozish 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:dancase 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.
Nnafar qiz vaMnafar yigit musobaqa o'ynashdi.Har bir qiz o'rtacha
k1kg, har bir yigitk2kg 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'lishdab=0ni 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. ChiqishHar 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 tiliFoydalanuvchidan 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:
AMyokiPMekanini 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 → cswitch 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→XQo'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. ChiqishQoidalar:
- 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