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:

  1. Sintaksis xatolari
  2. Mantiqiy xatolar
  3. 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.