Pisanje programa ne znači da će program odmah raditi ispravno.

U stvarnom programiranju greške su potpuno normalan deo razvoja softvera.

Čak i iskusni programeri svakodnevno nailaze na greške.

Razlika je samo u tome što iskusni programeri znaju:

  • kako da prepoznaju grešku,
  • gde da je traže,
  • i kako da je isprave.

Za početnike je veoma važno da shvate jednu ključnu stvar:

Greška nije neuspeh.

Greška je informacija da nešto u programu nije napisano ili izvedeno kako treba.

U C++ programiranju najčešće ćemo se susretati sa dve osnovne vrste grešaka:

  • syntax errors (sintaksne greške)
  • runtime errors (greške tokom izvršavanja)

Kasnije ćemo upoznati i treću grupu:

  • logical errors (logičke greške)

U ovom tekstu fokusiraćemo se na prve dve.

Šta je greška u programu?

Greška predstavlja problem zbog koga program:

  • ne može da se kompajlira,
  • ne može da se pokrene,
  • ili daje neočekivano ponašanje.

Na primer:

  • nedostaje tačka-zarez,
  • pokušavamo da delimo nulom,
  • koristimo nepostojeću promenljivu,
  • program se sruši tokom rada.

Sve su to različite vrste grešaka.

Šta je syntax error?

Syntax error je greška u pisanju koda.

Reč:

syntax

odnosi se na pravila jezika.

Kao što u gramatici prirodnog jezika postoje pravila, tako i C++ ima pravila pisanja.

Ako prekršimo ta pravila, kompajler prijavljuje grešku.

Program se tada ne može kompajlirati.

Primer sintaksne greške — nedostaje tačka-zarez

Pogrešno:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello"
    return 0;
}

Problem:

nedostaje:

;

Ispravno:

cout << "Hello";

Primer sintaksne greške — pogrešno ime

Pogrešno:

coout << "Hello";

Kompajler ne zna šta je:

coout

Ispravno:

cout << "Hello";

Primer sintaksne greške — nedostaje zagrada

Pogrešno:

int main() {
    cout << "Test";

Nedostaje završna zagrada:

}

Program neće moći da se kompajlira.

Kako prepoznati syntax error?

Sintaksne greške se pojavljuju tokom kompajliranja.

Code::Blocks ili drugi IDE obično prikazuju:

  • crvene poruke,
  • broj linije,
  • opis problema.

Primer poruke:

expected ';' before return

To znači:

Kompajler očekuje tačka-zarez pre naredbe return.

Najčešće syntax greške početnika

Veoma česte greške:

  • zaboravljen ;
  • pogrešno napisano cout
  • pogrešno napisano cin
  • nedostaju navodnici
  • nedostaje zagrada
  • pogrešan naziv promenljive
  • zaboravljen #include <iostream>

Primer:

Pogrešno:

cout << Hello;

Ispravno:

cout << "Hello";

Šta je runtime error?

Runtime error je greška koja se javlja kada se program pokrene.

Za razliku od syntax greške:

  • program se uspešno kompajlira,
  • ali se problem javlja tokom izvršavanja.

Reč:

runtime

znači vreme izvršavanja programa.

To su greške koje nastaju kada program radi.

Primer runtime greške — deljenje nulom

Primer:

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int b = 0;

    cout << a / b;

    return 0;
}

Program će se kompajlirati.

Ali tokom izvršavanja dolazi do problema.

Deljenje nulom nije dozvoljeno.

Rezultat može biti:

  • rušenje programa,
  • neočekivana vrednost,
  • ili sistemska greška.

Primer runtime greške — pristup neispravnoj memoriji

Kasnije ćemo učiti nizove i pokazivače, ali važno je znati da runtime greške mogu nastati i kada program pokuša da pristupi nevažećoj memoriji.

Na primer:

int niz[3];
cout << niz[100];

Program može:

  • raditi nepredvidivo,
  • dati pogrešan rezultat,
  • ili se srušiti.

Primer runtime greške — loš unos korisnika

Primer:

int broj;
cin >> broj;

Ako korisnik umesto broja unese:

abc

program može ući u grešno stanje.

To je takođe problem tokom izvršavanja.

Syntax vs Runtime — ključna razlika

Syntax error

Problem:
kod nije pravilno napisan

Kada se javlja:
tokom kompajliranja

Da li se program pokreće:
NE

Primer:

cout << "Test"

Runtime error

Problem:
program radi, ali dolazi do problema tokom izvršavanja

Kada se javlja:
tokom rada programa

Da li se program pokreće:
DA

Primer:

10 / 0

Jednostavno pravilo:

Ako program ne može da se pokrene → često je syntax error.

Ako se pokrene pa pukne → često je runtime error.

Kako rešavati syntax greške?

Koraci:

  1. Pročitati poruku kompajlera
  2. Pogledati liniju koju IDE označava
  3. Proveriti:
    • tačka-zarez
    • zagrade
    • navodnike
    • nazive promenljivih
  4. Ispraviti grešku
  5. Ponovo kompajlirati

Važno:

Greška nekad nije baš na liniji koju IDE prijavi.

Ponekad je problem nekoliko linija iznad.

Kako rešavati runtime greške?

Koraci:

  1. Pogledati gde se program ruši
  2. Proveriti ulazne podatke
  3. Proveriti matematičke operacije
  4. Proveriti promenljive
  5. Dodati pomoćne ispise

Primer:

cout << "a = " << a << endl;
cout << "b = " << b << endl;

Na ovaj način možemo lakše videti gde nastaje problem.

Šta je debugging?

Proces pronalaženja i ispravljanja grešaka zove se:

debugging

To je jedan od najvažnijih delova programiranja.

Programiranje nije samo pisanje koda.

Programiranje je i:

  • testiranje,
  • analiza,
  • popravljanje grešaka.

Dobri programeri mnogo vremena provode upravo u debugging procesu.

Kako početnici najčešće reaguju na greške?

Tipična reakcija:

“Program ne radi.”

Ali pravo pitanje je:

  • Da li se ne kompajlira?
  • Da li se pokrene pa pukne?
  • Da li daje pogrešan rezultat?

Ta razlika je veoma važna.

Primer poređenja

Primer 1:

cout << "Hello"

Problem:
syntax error

Zašto:
nedostaje ;


Primer 2:

int x = 10;
int y = 0;
cout << x / y;

Problem:
runtime error

Zašto:
deljenje nulom


Primer 3:

cin >> broj;

korisnik unese:

tekst

Problem:
runtime problem

Najčešće greške početnika

Syntax:

  • zaboravljen ;
  • pogrešan cout
  • pogrešan cin
  • zagrade
  • navodnici

Runtime:

  • deljenje nulom
  • loš unos
  • neispravni podaci
  • izlazak van granica niza
  • rad sa neinicijalizovanim vrednostima

Zašto je važno razumeti greške?

Ako razumemo vrstu greške:

  • brže je rešavamo,
  • manje gubimo vreme,
  • bolje razumemo program.

Početnici često paniče kada vide crvenu poruku.

Ali te poruke zapravo pomažu.

Kompajler pokušava da objasni problem.

Rezime

U ovom tekstu naučili smo dve važne vrste grešaka:

Syntax errors

Greške u pisanju koda koje sprečavaju kompajliranje.

Runtime errors

Greške koje se pojavljuju tokom rada programa.

Važno je naučiti da razlikujemo ove dve vrste jer je način rešavanja potpuno drugačiji.

Greške nisu znak neuspeha.

One su sastavni deo svakog programiranja.

Mini test

  1. Kada nastaje syntax error?
    a) Tokom kompajliranja
    b) Tokom rada programa
    c) Nakon gašenja računara
  2. Šta je runtime error?
    a) Greška tokom izvršavanja
    b) Greška u tastaturi
    c) Problem sa monitorom
  3. Šta je syntax error?
    a) Loš unos korisnika
    b) Greška u pisanju koda
    c) Deljenje nulom
  4. Šta radi debugging?
    a) Briše program
    b) Pronalaženje i ispravljanje grešaka
    c) Kompajlira kod
  5. Koji primer je runtime problem?
    a)
cout << "Test"

b)

10 / 0

c)

coout << "Test";

Zadaci za vežbu

  1. Namerno napravi syntax grešku sa nedostajućim ;
  2. Namerno napiši pogrešno cout
  3. Napravi program sa deljenjem nulom
  4. Napravi program koji traži broj, pa unesi tekst
  5. Zapiši razliku između syntax i runtime grešaka

Domaći zadatak

Napravi 3 kratka programa:

Program 1:
jedna syntax greška

Program 2:
jedna runtime greška

Program 3:
ispravna verzija oba programa

Objasni:

  • šta je bio problem,
  • kada se javio,
  • kako si ga rešio.

Pristupačnost