7-bo‘lim
Shart operatorlari
if, else if, else tuzilmasi, switch operatori va uning tuzoqlari, ichma-ich shartlar va ularni soddalashtirish usullari.
Ushbu bo‘lim mundarijasi
Dastur qaror qabul qilishi kerak bo'lganda shart operatorlari ishlatiladi.
if operatori #
#include <stdio.h>
int main(void) {
int yosh = 25;
if (yosh >= 18) {
printf("Siz voyaga yetgansiz.\n");
}
printf("Dastur davom etadi.\n");
return 0;
}
Siz voyaga yetgansiz.
Dastur davom etadi.
if - else #
#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;
}
O'tmadingiz. Yana urinib ko'ring.
else if zanjiri #
#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;
}
Ball: 87, daraja: B
/* 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 #
if (yosh >= 18)
printf("Voyaga yetgan\n");
Bitta buyruq bo'lsa, qavs shart emas. Lekin bu xavfli:
if (yosh >= 18)
printf("Voyaga yetgan\n");
printf("Ovoz bera oladi\n"); /* SHARTGA KIRMAYDI! */
Ikkinchi printf doim bajariladi - kod chekinishiga qaramay.
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 #
#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;
}
Qabul qilindi
Erta qaytish bilan soddalashtirish #
#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;
}
Qabul qilindi
Yosh yetarli emas
Ball yetarli emas
To'lov kutilmoqda
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 #
#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;
}
Chorshanba
break ni unutmangbreak bo'lmasa, dastur keyingi case ga o'tib ketadi - bu «fall
through» deb ataladi.
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:
case 6:
/* ataylab pastga o'tadi */
case 7:
printf("Dam olish kuni\n");
break;
switch cheklovlari #
/* 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 #
#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;
}
12.00 * 4.00 = 48.00
Menyu misoli #
#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;
}
=== Asosiy menyu ===
1. Yangi yozuv
2. Ro'yxatni ko'rish
3. Qidirish
0. Chiqish
Tanlov: 2
Ro'yxat ochilmoqda...
switch ichida o'zgaruvchi yaratish #
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'lmaydicase 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 #
1. Nuqtali vergul if dan keyin
if (yosh >= 18); /* diqqat: ; */
{
printf("Voyaga yetgan\n"); /* DOIM bajariladi */
}
2. = o'rniga ==
if (yosh = 18) { ... } /* qiymat beradi, taqqoslamaydi */
3. Haqiqiy sonni == bilan solishtirish
if (narx == 0.1) { ... } /* deyarli hech qachon rost bo'lmaydi */
-Wall bayrog'i birinchi ikkitasi haqida ogohlantiradi.
- Sonning musbat, manfiy yoki nol ekanini aniqlang.
- Uchta sondan eng kattasini
ifbilan toping. - Ballga qarab daraja beruvchi dastur yozing (A, B, C, D, F).
- Shartlar tartibini teskari qilib, xatoni o'z ko'zingiz bilan ko'ring.
ifdan keyin nuqtali vergul qo'yib, natijani kuzating.- Kalkulyatorni to'rt amal bilan
switchorqali yozing. - Nolga bo'lish holatini alohida tekshiring.
- Oyning raqamiga qarab kunlar sonini chiqaring (
switchbilan). breakni ataylab olib tashlab, «fall through» ni ko'ring.- Ichma-ich shartli kodni erta qaytish uslubiga o'tkazing.
Xulosa #
ifshart rost bo'lsa blokni bajaradi,elseaks holda.else ifzanjirida 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.
switchfaqat butun son va belgilar bilan ishlaydi.- Har bir
caseoxiridabreakbo'lishi kerak. defaultbo'limi kutilmagan qiymatlarni ushlaydi.ifdan keyin nuqtali vergul qo'ymang.
Keyingi bo'limda sikllarni - for, while va do-while ni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.