$$ \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.

Često se dešava da naš program radi, ali ne uvek ono što smo očekivali. Ponekad čak i ne primetimo da se to dešava. Program uvek radi ono što smo mu rekli da radi, a ne ono što smo mislili. Zbog toga je važno da se program pažljivo i detaljno testira nakon što ga napišemo.

U ovoj lekciji ćeš videti kako možeš da potražiš grešku nakon što otkriješ da za neke ulazne podatke tvoj program ne daje očekivani odgovor.

Primer: Odličnim učenicima jedne škole se odobrava popust na godišnju školarinu. Oni koji imaju sve petice plaćaju samo polovinu školarine, a ostali koji su odlični plaćaju dve trećine od iznosa školarine. Potrebno je da se kreira program koji će na osnovu iznosa pune školarine i uspeha učenika izračunati koliko taj učenik treba da se plati.

Recimo da je program koji sledi rešenje postavljenog zadatka.

static void Main(string[] args)
{
    double skolarina, uspeh;
    Console.WriteLine("Iznos skolarine:");
    skolarina = double.Parse(Console.ReadLine());
    Console.WriteLine("Uspeh:");
    uspeh = double.Parse(Console.ReadLine());
    if (uspeh == 5)
        skolarina = skolarina / 2;
    else if (uspeh >= 4.5)
        skolarina = 2 / 3 * skolarina;
    Console.WriteLine("Iznos za placanje: ");
    Console.WriteLine(skolarina.ToString("0.00"));
}

Kada napišemo program, prvo proveravamo da li on može da se izvrši. Pokrenemo prevođenje programa i vidimo u prozoru ispod:

U prozoru Error list možemo da vidimo da nema ni grešaka, ni upozorenja. Program koji smo napisali je uspešno preveden.

Normalno, sada želimo da vidimo kako naš program radi. Da bismo se koliko-toliko uverili da je program ispravan, trebalo bi da smislimo različite test-primere tako da nateramo svaki deo (svaku granu) programa da se izvrši.

Pre pokretanja programa treba proveriti da je trenutna konfiguracija "Debug" (vidi lekciju "Postepeno izvršavanje programa").

Isprobajmo program sa sledećim podacima:

Iznos skolarine: 45000
Uspeh: 5
Iznos za placanje: 22500
(Dobili smo dobar rezultat)

Probajmo sada sa ovim podacima:

Iznos skolarine: 45000
Uspeh: 3.5
Iznos za placanje: 45000
(Rezultat je ponovo dobar)

Da li je ovo dovoljno proveravanja? Ne, rekli smo da treba da pokušamo da prođemo kroz svaku granu programa. Ostalo je da proverimo da li se popust dobro obračunava za odične učenike koji nemaju sve petice. Za to bi trebalo da nam posluži primer sa podacima:

Iznos skolarine: 45000
Uspeh: 4.7
Iznos za placanje: 0
(Rezultat nije dobar, trebalo je da bude 30000)

Hajde da izvršavamo program naredbu po naredbu i pratimo šta se dešava.

Program će da uđe u if naredbu sa sledeće slike zato što uneti uspeh 4.7 nije jednak 5, ali je odličan. U tom trenutku vrednost promenljive skolarina iznosi 45000.

Događa se međutim da se nakon ove naredbe vrednost promenljive skolarina postavlja na nulu.

Obratimo pažnju na poslednju naredbu koja se izvršila. Pomnožili smo iznos školarine sa dve trećine tako što smo razlomak napisali kao 2 podeljeno sa 3 (2/3). Brojevi 2 i 3 su celi, pa je na ovom mestu doslo do celobrojnog deljenja i dobili smo vrednost 0 (količnik pri deljenju 2 sa 3 je 0) umesto očekivane dve trećine.

Kako je promenljiva skolarina tipa double, dovoljno je da promenimo formulu na 2*skolarina/3 i dobićemo očekivani rezultat i u slučaju kada unosimo podatke za učenika koji je odičan ali nema sve petice.

static void Main(string[] args)
{
    double skolarina, uspeh;
    Console.WriteLine("Iznos skolarine:");
    skolarina = double.Parse(Console.ReadLine());
    Console.WriteLine("Uspeh:");
    uspeh = double.Parse(Console.ReadLine());
    if (uspeh == 5)
        skolarina = skolarina / 2;
    else if (uspeh >= 4.5)
        skolarina = 2 * skolarina / 3;
    Console.WriteLine("Iznos za placanje: ");
    Console.WriteLine(skolarina.ToString("0.00"));
}

Za neke greške koje napravimo, kao za grešku iz prethodnog primera, nećemo dobiti nikakvo upozorenje od okruženja, jer ne radimo ništa neuobičajeno ili sumnjivo. Programu za prevođenje su podjednako logične obe formule na datom mestu, jer on nema pojma o tome šta mi pokušavamo da izračunamo. Zato je i bitno da savladamo veštinu nalaženja grešaka onako kako je opisano u ovoj lekciji, a to se postiže vežbanjem. Osećaj zadovoljstva kada ti program proradi kako treba pomoći će ti da u tom vežbanju istraješ i stekneš rutinu.

U nekim situacijama međutim, samo okruženje će nam dati upozorenje (Warnings) da će možda biti nekih problema, čak i ukoliko se prevođenje obavi bez grešaka (Errors).

Treba da obratiš pažnju na upozorenja koja dobijaš pri prevođenju programa i da pokušaš da ih razumeš i uzmeš u obzir. Nemoj da brineš ako ti neki put nisu jasna, ona mogu da budu vrlo nerazumljiva, a ponekad nisu ni tako važna. Ipak, ako ih uočiš i rastumačiš, mogu da ti uštede mnogo kasnijeg truda u traženju grešaka. Svako upozorenje ili greška koju dobijemo ima svoju oznaku, odnosno kod, ali i kratak tekst koji daje objašnjenje. Ako ne razumeš kraku poruku, možeš da potražiš na internetu detaljnije objašnjenje ili primer koji ilustruje kakav program dovodi to te poruke.