4-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:
#include <stdio.h>
int main(void) {
int n = 7;
if (n % 2 == 0) {
printf("%d — juft\n", n);
} else {
printf("%d — toq\n", n);
}
return 0;
}n ni har xil qiymatlarga o'zgartirib sinab ko'ring.
Topshiriq 2 — Harf baho
grade.c:
#include <stdio.h>
int main(void) {
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");
}
return 0;
}10 ta turli ball bilan sinab ko'ring.
Topshiriq 3 — Eng katta
max-of-3.c — 3 ta raqamdan eng kattasini topish:
#include <stdio.h>
int main(void) {
int a = 10, b = 25, c = 15;
int max;
if (a >= b && a >= c) {
max = a;
} else if (b >= a && b >= c) {
max = b;
} else {
max = c;
}
printf("Eng katta: %d\n", max);
return 0;
}Yana — eng kichik uchun ham min-of-3.c.
Topshiriq 4 — Kabisa yili
leap-year.c:
#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;
}Tekshiring: 2000, 2020, 2023, 2024, 1900, 2100.
Topshiriq 5 — Switch hafta kuni
weekday.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: printf("Shanba\n"); break;
case 7: printf("Yakshanba\n"); break;
default: printf("Noto'g'ri\n"); break;
}
return 0;
}Topshiriq 6 — Kalkulyator
calc.c:
#include <stdio.h>
int main(void) {
double a = 15.5;
double b = 4.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("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);
}
return 0;
}Turli operatorlar bilan sinab ko'ring: +, -, *, /, % (xato — % yo'q).
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:
#include <stdio.h>
int main(void) {
double vazn = 70.0;
double boy = 1.75;
double bmi = vazn / (boy * boy);
printf("BMI: %.2f\n", bmi);
if (bmi < 18.5) {
printf("Kategoriya: Vazn yetishmaydi\n");
} else if (bmi < 25) {
printf("Kategoriya: Normal\n");
} else if (bmi < 30) {
printf("Kategoriya: Ortiqcha vazn\n");
} else {
printf("Kategoriya: Semizlik\n");
}
return 0;
}Topshiriq 9 — Yil fasli
season.c — oy berilgan, fasl chiqarish:
#include <stdio.h>
int main(void) {
int oy = 5;
if (oy >= 3 && oy <= 5) {
printf("Bahor\n");
} else if (oy >= 6 && oy <= 8) {
printf("Yoz\n");
} else if (oy >= 9 && oy <= 11) {
printf("Kuz\n");
} else if (oy == 12 || oy == 1 || oy == 2) {
printf("Qish\n");
} else {
printf("Noto'g'ri oy\n");
}
return 0;
}switch bilan ham yozing.
Topshiriq 10 — GitHub'ga
$ cd ~/c-darslari
$ mkdir 4-oy-dars-4
$ # fayllarni shu joyga
$ git add .
$ git commit -m "feat: dars 4 - 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 |