$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Sintaksne greške

Sigurno ti se desilo da se u običnom govoru ili dopisivanju ne izraziš dovoljno jasno ili tačno, pa te sagovornik zbog toga ne razume. Na primer, ako nekome napišeš: „donesi kopu“, verovatno neće razumeti šta želiš (ne zna šta je kopa). Primalac poruke će možda pretpostaviti da je ona pogrešno otkucana, pa će iz ranijeg razgovora pokušati da pogodi šta želiš da donese (kofu, kapu, klopu, korpu…). Ipak, najverovatnije je da će te pitati šta treba da donese i daće ti priliku da pojasniš ili ispraviš svoj zahtev.

Slično se dešava i u programiranju. Pravila za pisanje programa su vrlo precizna i za svaki deo programa je tačno određeno kako se može napisati i šta u tom slučaju znači. Skup pravila za pisanje programa na nekom programskom jeziku naziva se sintaksa tog jezika. Sintaksna greška nastaje kada računar ne razume neki deo tvog programa zato što nije napisan dosledno sa tim pravilima.

Kao što smo videli u primeru (donesi kopu), može biti dovoljno da se u pogrešno napisanoj rečenici zameni ili doda samo jedno slovo, pa da ta rečenica dobije smisao i da nešto znači. Ipak, računaru je sasvim svejedno da li je rečenica (program) skoro ispravna ili potpuno besmislena. Na primer, računar ne vidi razliku između rečenica poput „Dobrome dva nežno krug“ ili čak "adf#fghty!p o?e&c*nm^,.%". Računar uvek zahteva potpunu preciznost u izražavanju i uvek samo prijavljuje šta tačno ne razume, budući da on nije sposoban da pogodi šta je trebalo da bude napisano i da sam ispravi grešku, ma koliko mala bila ta greška.

Zbog toga je važno da razumeš poruke o greškama. Na primer, pogledajmo sledeći program.

Za ovaj program računar u Output prozoru (output ovde možemo prevesti kao ishod ili učinak) na sledeći način prijavljuje da li je program uspešno preveden, ili je bilo sintaksnih grešaka:

U ovom primeru, program ima jednu grešku. Ispisan je tekst koji sadrži puno ime fajla i podatke o grešci error CS1002: ; expected.

Deo teksta CS1002 je oznaka ili kod za ovu vrstu greške. Koristeći taj kod, na internetu možeš lako pronaći više informacija (na žalost uglavnom na engleskom) o ovoj vrsti greške: u čemu se ona sastoji, kako može da nastane, često i kratak i jednostavan primer - program u kome se ova greška pojavljuje. Objašnjenja koja na ovaj način pronađeš će ti verovatno biti korisnija nakon što stekneš malo iskustva.

Deo teksta ; expected. daje kratko objašnjenje ove greške, koje pomaže da grešku uočiš i ispraviš. U ovom primeru, dati tekst znači da se na označenom mestu očekuje znak ';' (tačka-zarez). Zaista, kao što je pomenuto u prethodnoj lekciji, na kraju naredbe mora da se nalazi znak ';', a ovde je (greškom) izostavljen. Dodaj znak ';' nakon teksta "Hello World!" i prevedi program ponovo. Trebalo bi da dobiješ ovakav sadržaj output prozora.

Ovaj tekst znači da od svih projekata čije prevođenje je traženo, 1 je bilo uspešno, 0 neuspešnih, i 0 izostavljenih (urađenih ranije). Kraće rečeno, tvoj (jedini) projekat je uspešno preveden. Ukoliko na primer, umesto znaka ';' dodaš ':' dobijaš ovakvu poruku:

Greška je iste vrste, jer se čitanjem programa ne nailazi na očekivani znak, nego na neki drugi. Zato je kod greške isti (CS1002). Ovakvih poruka o greškama može da bude i više od jedne. U ovom slučaju se pojavila još jedna (CS1513). Iako prema prikazanoj poruci deluje da se radi o drugoj grešci, zapravo se radi o samo jednoj, i kada se izmeni znak ':' ponovo u ';', obe greške će nestati. Savet je da se greške uvek otklanjaju redom kojim su uočene, zato što prisustvo jedne greške često pokreće još neke greške.

Svaka poruka o sintaksnoj grešci sadrži ove delove:

  • Mesto u programu (ime fajla i redni broj linije, prvi broj u zagradi nakon imena fajla) gde se greška pojavila;

  • Oznaka (kod) greške;

  • Kratak opis greške, koji će ti ubrzo postati dovoljan da razumeš o čemu se radi.

Takvim porukama računar ti govori da određeni deo programa nije napisan ispravno i zato nije jasan. Ove poruke služe da lakše uočiš šta je u programu neispravno i da to onda ispraviš.

Kao što je već rečeno, pri ispravljanju se uvek usredsredi na prvu prijavljenu grešku, jer je moguće da njenim ispravljanjem nestane još nekoliko prijavljenih grešaka. Ako neke greške ne razumeš, možeš da, nakon što ispraviš prvu, prevedeš program ponovo. Pojaviće se nova lista grešaka, koja bi trebalo da bude kraća.

Pravljenje ovakvih grešaka je normalno, pogotovo u početku. Moraš da se naoružaš strpljenjem tokom pisanja svojih prvih programa jer će se ovakve stvari skoro sigurno dešavati. Važno je da ne odustaneš pri ovim početnim teškoćama jer se one uglavnom brzo savladaju, a posle toga imaćeš zadovoljstvo da vidiš kako tvoji programi rade i to sve komplikovanije i zanimljivije stvari.

Mi ćemo se truditi da ti pomognemo tako što ćemo ti tokom lekcija o pisanju programa skretati pažnju na neke greške koje početnici često prave. Nije loše da grešku prvi put napraviš namerno da bi video kako izgleda poruka. To može da ti pomogne da kasnije, kada grešku napraviš slučajno, lakše razumeš (prepoznaš) poruku o grešci.

Greške u značenju

Rečenice sa sintaksnom greškom su neispravno napisane i zato ne znače ništa, čak i ako je samo jedan znak pogrešan. Samo potpuno ispravno napisane rečenice mogu nešto da znače. Ako računar ne razume neki deo programa, on će ti to reći na svoj način i neće ni pokušati da izvrši program.

Osim sintaksnih, postoji još jedna vrsta grešaka, a to je kada tvoja rečenica ima značenje, ali ne ono koje je tebi bilo na umu. Na primer, ako kažeš ili napišeš: „Kada polazi avion iz Atine?“ umesto „Kada dolazi avion iz Atine?“, niko neće primetiti tvoju grešku jer je pitanje razumljivo i ima smisao. U ovakvoj situaciji ćeš najverovatnije dobiti informaciju koja je za tebe pogrešna (nije ona koju želiš da dobiješ) i zbog toga će neko možda propustiti let avionom ili će nepotrebno čekati na aerodromu.

Ovakve greške se zovu greške u značenju, ili semantičke greške. One lako mogu da prođu nezapaženo jer računaru je „sve jasno“ i on može da izvrši program. Na žalost, rezultat rada programa je u takvim slučajevima nekad ispravan, nekad neispravan, a ponekad je nesporazum između nas i računara toliko veliki da rezultata uopšte i ne bude. Možda se pitaš kako uopšte možeš da proveriš da li tvoj program (koji može da se izvrši) nema semantičke greške i da radi ispravno. Jedini efikasan način je testiranje programa. Testiranje programa je kao kada nekome postavljaš pitanja na koja znaš odgovor. Još bolje, to je kao kada nekome ko ume da računa daješ računski zadatak (na primer izdiktiraš neki brojni izraz), a rezultat znaš unapred. Na taj način proveravaš da li taj neko ono što govoriš razume na isti način kao i ti. Ako daje odgovor koji očekuješ, znači da ste se lepo razumeli (ili ste samo imali sreće), u protivnom, bilo je nesporazuma, to jest grešaka u značenju. Dakle, testiranje programa nam služi da otkrijemo što više grešaka u značenju koje smo napravili pišući program. Testiranjem programa i otkrivanjem grešaka u značenju ćemo se detaljno baviti u nekim od narednih lekcija.

Za sada, dok učiš programiranje, kada rešavaš zadatke koje smo postavili na Petlju, možeš da koristiš naš sistem za testiranje rešenja koja nam šalješ. Sistem za testiranje radi upravo na opisani način - on ima pripremljena pitanja za tvoj program i proverava da li dobija odgovor koji očekuje. Bilo bi dobro da kasnije, kada se malo uhodaš, počneš da gradiš naviku da na isti način i samostalno testiraš svaki svoj program.