17. Xatolarni tushunish va tuzatish¶
Dasturlashni o‘rganayotganda xato qilish odatiy hol.
Masalan, dastur yozdik:
#include <stdio.h>
int main() {
printf("Salom")
return 0;
}
Bu dastur ishlamaydi.
Chunki printf() qatorining oxirida ; belgisi yo‘q.
Dasturlashda bunday xatolar ko‘p uchraydi. Muhimi — xatoning sababini topishni o‘rganish.
Xato nima?¶
Dasturimizda noto‘g‘ri yozilgan yoki noto‘g‘ri ishlatilgan qism bo‘lsa, bu xato hisoblanadi.
C tilidagi xatolarni oddiy qilib uchta guruhga ajratish mumkin:
- Sintaksis xatolari
- Mantiqiy xatolar
- Ishlash vaqtidagi xatolar
Sintaksis xatosi¶
Sintaksis — kodni qanday yozish qoidalari.
Masalan:
printf("Salom")
Bu yerda ; yo‘q.
To‘g‘ri ko‘rinishi:
printf("Salom");
Kompilyator bunday xatoni aniqlashi mumkin.
Qavslarni unutish¶
Masalan:
if (yosh >= 18 {
printf("Voyaga yetgan");
}
Bu yerda ) yetishmayapti.
To‘g‘ri kod:
if (yosh >= 18) {
printf("Voyaga yetgan");
}
Nuqtali vergulni unutish¶
C tilida ko‘p qatorlar ; bilan tugaydi.
Masalan:
int yosh = 18;
printf("%d", yosh);
Agar:
int yosh = 18
deb yozsak, xato bo‘ladi.
O‘zgaruvchini e'lon qilmasdan ishlatish¶
Masalan:
int main() {
printf("%d", yosh);
return 0;
}
Bu yerda yosh yaratilmagan.
To‘g‘ri:
int main() {
int yosh = 18;
printf("%d", yosh);
return 0;
}
Noto‘g‘ri ma'lumot turi¶
Masalan:
int yosh = "Ali";
Bu noto‘g‘ri.
Chunki int butun sonlar uchun ishlatiladi.
To‘g‘ri:
int yosh = 18;
Agar matn saqlamoqchi bo‘lsak:
char ism[] = "Ali";
Mantiqiy xato¶
Ba'zi xatolarda dastur ishlaydi, lekin natija noto‘g‘ri bo‘ladi.
Masalan:
int a = 10;
int b = 20;
printf("%d", a - b);
Agar biz yig‘indini hisoblamoqchi bo‘lgan bo‘lsak, - noto‘g‘ri operator.
To‘g‘risi:
printf("%d", a + b);
Bunday xatoni kompilyator xato deb ko‘rsatmasligi mumkin.
Chunki kod grammatik jihatdan to‘g‘ri.
Muammo — biz dasturga noto‘g‘ri buyruq berganmiz.
Natijani tekshirish¶
Masalan, sonning kvadratini hisoblaymiz:
int son = 5;
int natija = son * son;
printf("%d", natija);
Natija:
25
Agar tasodifan:
int natija = son + son;
deb yozsak:
10
chiqadi.
Dastur ishlaydi, lekin biz kutgan natija chiqmaydi.
Bu mantiqiy xato.
Ishlash vaqtidagi xato¶
Ba'zi xatolar dastur ishga tushgandan keyin yuz beradi.
Masalan, mavjud bo‘lmagan xotira joyidan foydalanish yoki noto‘g‘ri pointer bilan ishlash.
Masalan:
int *p = NULL;
printf("%d", *p);
Bu xavfli.
Chunki p hech qanday haqiqiy xotira joyini ko‘rsatmayapti.
Kompilyator xabarlari¶
C dasturini kompilyatsiya qilganimizda xato bo‘lsa, kompilyator bizga xabar beradi.
Masalan:
error: expected ';' before 'return'
Bu xabar bizga return dan oldin ; bilan bog‘liq muammo borligini bildiradi.
Xato xabarini ko‘rganingizda qo‘rqmang.
Uni o‘qib, qaysi qatorda muammo borligini aniqlashga harakat qiling.
Xato qatorini topish¶
Masalan:
main.c:5: error
Bu xabar taxminan:
main.c
5-qator
atrofida muammo borligini bildiradi.
Shuning uchun xato xabaridagi:
fayl nomi
qator raqami
xato turi
ga e'tibor bering.
printf() yordamida tekshirish¶
Ba'zan dastur nima qilayotganini tushunish uchun vaqtincha printf() ishlatish mumkin.
Masalan:
int a = 10;
int b = 20;
printf("a = %d\n", a);
printf("b = %d\n", b);
int natija = a + b;
printf("natija = %d\n", natija);
Natija:
a = 10
b = 20
natija = 30
Bu usul dastur ichida nima bo‘layotganini ko‘rishga yordam beradi.
printf() bilan xatoni izlash¶
Masalan, quyidagi kodda natija noto‘g‘ri:
int a = 10;
int b = 5;
int natija = a * b;
printf("%d", natija);
Agar boshqa natija kutgan bo‘lsak, qiymatlarni tekshiramiz:
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("natija = %d\n", natija);
Shu orqali muammo qayerdaligini aniqlash osonroq bo‘ladi.
Xatoni qanday tuzatish kerak?¶
Xato ko‘rsangiz, quyidagi tartibda ishlashga harakat qiling:
1. Xato xabarini o‘qing¶
Kompilyator nima deyayotganini ko‘ring.
2. Qatorni toping¶
Xato ko‘rsatilgan qatorni tekshiring.
3. Yuqoridagi qatorlarni ham tekshiring¶
Ba'zan haqiqiy xato oldingi qatorda bo‘ladi.
Masalan, qavs yopilmagan bo‘lishi mumkin.
4. Kodni kichik qismlarga bo‘lib tekshiring¶
Muammoni topish osonlashadi.
Xatodan qo‘rqmang¶
Dasturlashni o‘rganayotganda xatolar juda ko‘p bo‘ladi.
Tajribali dasturchilar ham xato qilishadi.
Muhimi:
xato qilish
↓
xatoni tushunish
↓
tuzatish
↓
yana sinab ko‘rish
Shu jarayon orqali dasturlashni o‘rganamiz.
Oddiy misol¶
Quyidagi kodda xato bor:
#include <stdio.h>
int main() {
int son = 10
printf("%d", son);
return 0;
}
Muammo:
int son = 10
qatorida ; yo‘q.
To‘g‘ri:
int son = 10;
Endi dastur ishlaydi.
Yana bir misol¶
Quyidagi kodni ko‘ring:
int yosh = 15;
if (yosh > 18) {
printf("Voyaga yetgan");
}
Dastur ishlaydi.
Lekin agar 18 yosh ham voyaga yetgan deb hisoblasak, shart noto‘g‘ri.
To‘g‘ri:
if (yosh >= 18) {
printf("Voyaga yetgan");
}
Bu mantiqiy xatoni tuzatishga misol.
Amaliy mashqlar¶
1-mashq¶
Quyidagi koddagi xatoni toping:
int main() {
int son = 10
printf("%d", son);
return 0;
}
2-mashq¶
Quyidagi koddagi xatoni toping:
int main() {
int yosh = "18";
printf("%d", yosh);
return 0;
}
3-mashq¶
Quyidagi kodning natijasi nima bo‘ladi?
int a = 10;
int b = 5;
printf("%d", a + b);
4-mashq¶
Quyidagi dasturda mantiqiy xatoni toping:
int son = 10;
if (son < 0) {
printf("Musbat son");
}
Shartni to‘g‘rilang.
5-mashq¶
O‘zingiz ataylab kichik xato yozing.
Masalan:
;
belgisini olib tashlang.
Keyin dasturni kompilyatsiya qilib, kompilyator chiqargan xabarni o‘qing va xatoni tuzating.
Muhim narsalarni eslab qoling¶
C dasturida xatolar bo‘lishi tabiiy.
Asosiy xato turlari:
Sintaksis xatosi
Mantiqiy xato
Ishlash vaqtidagi xato
Kompilyator xabarlarini o‘qishni o‘rganing.
Xato ko‘rsatilgan qatorni tekshiring.
Xato oldingi qatorda ham bo‘lishi mumkin.
printf() yordamida o‘zgaruvchilarning qiymatlarini tekshirish mumkin.
Eng muhimi:
Xatoni ko‘rganingizda uni tushunishga harakat qiling, shunchaki o‘chirib tashlashga emas.