9-dars: Shartli operatorlar (if, else, switch)
Dars haqida
Davomiyligi: 90 daqiqa Maqsad: Talaba C tilida shartlar yozishi, if-else-if-else, nested if va switch'dan to'g'ri foydalanishi kerak.
1. Shart nima?
Dasturda qarorlar qabul qilish:
Agar yosh 18 dan katta — kattalar
Aks holda — bolaC'da:
if (yosh >= 18) {
printf("Kattalar\n");
} else {
printf("Bola\n");
}2. Asosiy if
if (shart) {
// Shart rost (true) bo'lsa — bu kod ishlaydi
}Misol:
int yosh = 25;
if (yosh >= 18) {
printf("Kattalar\n");
}yosh >= 18 rost — printf ishlaydi.
Qavslar
Bir statement bo'lsa, qavs majburiy emas:
if (yosh >= 18)
printf("Kattalar\n");Lekin doim qavs ishlating — kelajakda bug oldini oladi.
3. if-else
if (shart) {
// shart rost
} else {
// shart yolg'on
}Misol:
int yosh = 15;
if (yosh >= 18) {
printf("Kattalar\n");
} else {
printf("Bola\n");
}Natija: Bola
4. if-else if-else
Ko'p variant:
if (shart1) {
// variant 1
} else if (shart2) {
// variant 2
} else if (shart3) {
// variant 3
} else {
// hech qaysi
}Misol — harf baho:
int ball = 75;
if (ball >= 90) {
printf("A\n");
} else if (ball >= 80) {
printf("B\n");
} else if (ball >= 70) {
printf("C\n");
} else if (ball >= 60) {
printf("D\n");
} else {
printf("F\n");
}Natija: C (75 >= 70, lekin 80 dan past)
5. Nested if
If ichida if:
if (yosh >= 18) {
if (haydovchi_huquqi) {
printf("Haydashga ruxsat\n");
} else {
printf("Yosh kattalar, lekin huquq yo'q\n");
}
} else {
printf("Bola, haydab bo'lmaydi\n");
}Chuqurlikni cheklang
3-4 darajadan chuqurroq — o'qish qiyin.
Boshqa yo'l: operator && va || bilan.
if (yosh >= 18 && haydovchi_huquqi) {
printf("Haydashga ruxsat\n");
}6. Murakkab shartlar
int yosh = 25;
int ish_haqi = 5000000;
int tajriba = 3;
// Yoshi 18-60 VA ish_haqi 3M+ VA tajriba 2+
if (yosh >= 18 && yosh <= 60 && ish_haqi >= 3000000 && tajriba >= 2) {
printf("Qabul qilindi\n");
}
// Yoshi 18 dan past YOKI 60 dan katta
if (yosh < 18 || yosh > 60) {
printf("Ish yoshi emas\n");
}
// NOT
if (!(ish_haqi < 1000000)) {
printf("Yetarli ish haqi\n");
}7. To'liq misol: Imtihon natijasi
#include <stdio.h>
int main(void) {
int ball = 75;
if (ball < 0 || ball > 100) {
printf("Xato: ball 0-100 oralig'ida bo'lishi kerak\n");
} else if (ball >= 90) {
printf("Ball: %d, Baho: A (Ajoyib)\n", ball);
} else if (ball >= 80) {
printf("Ball: %d, Baho: B (Yaxshi)\n", ball);
} else if (ball >= 70) {
printf("Ball: %d, Baho: C (O'rtacha)\n", ball);
} else if (ball >= 60) {
printf("Ball: %d, Baho: D (Qoniqarli)\n", ball);
} else {
printf("Ball: %d, Baho: F (Yiqildi)\n", ball);
}
return 0;
}8. switch statement
switch — if-else if ning bir nechta variant uchun qisqa shakli.
switch (qiymat) {
case 1:
// qiymat = 1
break;
case 2:
// qiymat = 2
break;
case 3:
// qiymat = 3
break;
default:
// hech qaysi
break;
}Misol: Hafta kuni
#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:
printf("Shanba\n");
break;
case 7:
printf("Yakshanba\n");
break;
default:
printf("Noto'g'ri kun raqami\n");
break;
}
return 0;
}Natija: Chorshanba
9. break — to'xtatish
break unutmang
break — switch'dan chiqish. Yo'q bo'lsa — keyingi case'lar ham ishlaydi (fall-through).
switch (kun) {
case 1:
printf("Dushanba\n");
// break yo'q
case 2:
printf("Seshanba\n");
break;
}kun = 1 bo'lsa, natija:
Dushanba
SeshanbaBu — odatda xato. break ishlating!
Foydali fall-through
Ba'zan maxsus ishlatiladi:
int kun = 6;
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;
}kun = 6 yoki 7 — "Dam olish kuni".
10. switch cheklovlari
switch — faqat integer turlari (int, char, enum) bilan ishlaydi.
// ✓ To'g'ri
int x = 5;
switch (x) { ... }
char c = 'A';
switch (c) { ... }
// ✗ Yomon
float f = 3.14;
switch (f) { ... } // XATO
char str[] = "Akmal";
switch (str) { ... } // XATO
// Range yo'q
switch (x) {
case 1...10: // XATO (standart C'da)
...
}Aslida switch — diskret qiymatlar uchun.
11. switch vs if-else
| Holat | Tavsiya |
|---|---|
| Bir nechta aniq qiymat | switch |
| Range (1-10, 50+ va h.k.) | if-else |
| Murakkab shartlar | if-else |
| Faqat 2-3 ta tanlov | if-else |
| 5+ ta diskret tanlov | switch |
12. Ternary (eslatma)
Eng oddiy shartlar uchun ? : ishlatish mumkin:
int yosh = 17;
char *kategoriya = (yosh >= 18) ? "Kattalar" : "Bola";Lekin murakkab shartlar uchun — if-else aniqroq.
13. To'liq misol: Kalkulyator
#include <stdio.h>
int main(void) {
double a = 10.0;
double b = 3.0;
char op = '+';
switch (op) {
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("Xato: nolga bo'lib bo'lmaydi\n");
} else {
printf("%.2f / %.2f = %.2f\n", a, b, a / b);
}
break;
default:
printf("Noma'lum operator: %c\n", op);
break;
}
return 0;
}14. Misol: Yil — kabisa yili?
Kabisa yili (leap year) qoidasi:
- 4 ga qoldiqsiz bo'linadi VA
- (100 ga qoldiqsiz bo'linmaydi YOKI 400 ga qoldiqsiz bo'linadi)
#include <stdio.h>
int main(void) {
int yil = 2024;
if ((yil % 4 == 0 && yil % 100 != 0) || (yil % 400 == 0)) {
printf("%d — kabisa yili\n", yil);
} else {
printf("%d — oddiy yil\n", yil);
}
return 0;
}Tekshirish:
- 2024 → kabisa
- 2023 → oddiy
- 2000 → kabisa (400'ga)
- 1900 → oddiy (100'ga, lekin 400'ga emas)
15. Misol: Oyning kunlari
#include <stdio.h>
int main(void) {
int oy = 2;
int yil = 2024;
int kunlar;
switch (oy) {
case 1: case 3: case 5: case 7:
case 8: case 10: case 12:
kunlar = 31;
break;
case 4: case 6: case 9: case 11:
kunlar = 30;
break;
case 2:
// Kabisa yili
if ((yil % 4 == 0 && yil % 100 != 0) || (yil % 400 == 0)) {
kunlar = 29;
} else {
kunlar = 28;
}
break;
default:
kunlar = -1;
}
if (kunlar == -1) {
printf("Noto'g'ri oy raqami\n");
} else {
printf("%d-oyda %d kun\n", oy, kunlar);
}
return 0;
}16. Common pitfalls
1. = vs ==
if (x = 5) { ... } // XATO: belgilash, doim true
if (x == 5) { ... } // To'g'ri2. Qavs yo'q
if (yosh >= 18)
printf("Kattalar\n");
printf("Buni ham ishlaydi\n"); // ← bu doim ishlaydi! if'ga tegishli emasTo'g'ri:
if (yosh >= 18) {
printf("Kattalar\n");
printf("Buni ham\n");
}3. switch'da break unutmaslik
switch (x) {
case 1:
printf("Bir\n");
// break yo'q!
case 2:
printf("Ikki\n");
break;
}x = 1 → "Bir" va "Ikki" (fall-through).
4. else if shart tartibida xato
if (ball >= 60) {
printf("D\n");
} else if (ball >= 70) {
printf("C\n"); // ← bu hech qachon ishlamaydi!
}Birinchi shart ball >= 60 80 ball uchun ham rost — "D" chiqadi.
To'g'ri tartib — eng kattadan boshlang:
if (ball >= 90) { ... }
else if (ball >= 80) { ... }
else if (ball >= 70) { ... }Darsdagi topshiriqlar
Topshiriq 1 — Oddiy if-else
even-odd.c — berilgan butun son juft yoki toq ekanini if-else bilan aniqlab chop eting (% operatoridan foydalaning).
n ni har xil qiymatlarga o'zgartirib sinab ko'ring.
Topshiriq 2 — Harf baho
grade.c — 0–100 oralig'idagi ballni if / else if zanjiri bilan harf bahoga aylantiring:
- 90+ → A, 80+ → B, 70+ → C, 60+ → D, aks holda → F
10 ta turli ball bilan sinab ko'ring.
Topshiriq 3 — Eng katta
max-of-3.c — 3 ta butun sondan eng kattasini if / else if va mantiqiy && operatori yordamida topib chiqaring.
Yana — eng kichik uchun ham min-of-3.c yozing.
Topshiriq 4 — Kabisa yili
leap-year.c — berilgan yil kabisa yili (leap year) yoki oddiy yil ekanini aniqlang.
Qoida: yil 4 ga bo'linsa VA (100 ga bo'linmasa YOKI 400 ga bo'linsa) — kabisa. Mantiqiy &&, || va % operatorlaridan foydalaning.
Tekshiring: 2000, 2020, 2023, 2024, 1900, 2100.
Topshiriq 5 — Switch hafta kuni
weekday.c — 1 dan 7 gacha son berilganda mos hafta kunini (1 → Dushanba ... 7 → Yakshanba) switch bilan chiqaring. Har bir caseda break bo'lsin, defaultda "Noto'g'ri" chiqsin.
Topshiriq 6 — Kalkulyator
calc.c — ikkita double son (a, b) va bitta char operator (op) berilganda, switch yordamida +, -, *, / amallaridan mosini bajaruvchi kalkulyator yozing.
- Natijani
%.2fbilan chiqaring - Bo'lishda
b == 0bo'lsa "Nolga bo'lib bo'lmaydi" deb ogohlantiring defaultda noma'lum operatorni chiqaring
Turli operatorlar bilan sinab ko'ring: +, -, *, /.
Topshiriq 7 — Oy kunlari
Dars matni'da berilgan oy kunlari dasturini yarating va sinang:
- Yanvar (1) → 31
- Fevral (2) — kabisa yiliga qarab 28 yoki 29
- Aprel (4) → 30
- Iyul (7) → 31
- Dekabr (12) → 31
Saqlang: 7-month-days.c
Topshiriq 8 — BMI kategoriyasi
bmi-category.c — vazn (kg) va bo'y (m) berilganda BMI ni hisoblang (BMI = vazn / (boy * boy)) va if / else if bilan kategoriyasini aniqlang:
< 18.5→ Vazn yetishmaydi< 25→ Normal< 30→ Ortiqcha vazn- aks holda → Semizlik
BMI ni %.2f bilan chiqaring.
Topshiriq 9 — Yil fasli
season.c — oy raqami (1–12) berilganda faslni aniqlab chiqaring:
- 3–5 → Bahor, 6–8 → Yoz, 9–11 → Kuz, 12/1/2 → Qish
- boshqa qiymatda → "Noto'g'ri oy"
Avval if / else if bilan, so'ng switch bilan ham yozing.
Topshiriq 10 — GitHub'ga
$ cd ~/c-darslari
$ mkdir 4-oy-dars-9
$ # fayllarni shu joyga
$ git add .
$ git commit -m "feat: dars 9 - conditionals"
$ git pushAsosiy tushunchalar (lug'at)
| Termin | Qisqacha izoh |
|---|---|
| if | Shart |
| else | Aks holda |
| else if | Boshqa shart |
| switch | Ko'p variant tanlov |
| case | Switch ichida bitta variant |
| default | Hech qaysi case mos kelmasa |
| break | Switch'dan chiqish |
| fall-through | break yo'q — keyingi case |
| Nested if | If ichida if |
| Ternary | ? : qisqa if-else |