31
UNIVERZITET U NOVOM SADU TEHNIĈKI FAKULTET „MIHAJLO PUPIN― ZRENJANIN PROGRAMSKI PREVODIOCI DOC. DR LJUBICA KAZI Šk. 2019/20 PRIPREMNI MATERIJAL ZA KOLOKVIJUM Kategorizacija grešaka programskog koda Greške u odnosu prema procesu kompajliranja: 1. Logičke greške nezavisne od procesa kompajliranja ili izvršavanja, Program ne daje oĉekivan izlaz jer kod nije napisan u skladu sa specifikacijom zahteva. Ovu vrstu greške kompajler ne može da detektuje. 2. Greške u toku kompajliranja (compile-time errors): a) Leksiĉke greške nedozvoljeni simbol ili oblik reĉi (reĉ nije moguće prepoznati, tj. tokenizovati – klasifikovati i zameniti tokenom). PRIMERI: nije moguće prepoznati naredbu ili atribut neke klase, jer takav ne postoji (kucaĉka greška). b) Sintaksne greške nepravilna konstrukcija reĉenica, nedostaje neki element reĉenice. Reĉenica nije napisana u skladu sa sintaksnim pravilima. PRIMERI: nedostaje ; na kraju reĉenice, prilikom navoĊenja atributa stavlja se () a ne treba, kod poziva metode zaboravljen (), u okviru izraza zaboravljena zatvorena zagrada, u okviru blokova zaboravljena { ili } itd.... c) Semantiĉke greške kompajler ulazi u tumaĉenje znaĉenja programskog koda, uporeĊujući delove šireg programskog koda aplikacije i vezanih biblioteka klasa. Proverava generalnu usklaĊenost i potpunost. U okviru compile-time mogu se detektovati statiĉke semantiĉke greške. PRIMERI : Greške ovog tipa su vezane za tipove podataka, deklaraciju promenljivih, primenu operatora, parametre poziva procedura. Npr. promenljiva nije deklarisana, a koristi se. Objekat nije instanciran. Promenljiva je deklarisana, a nije korišćena. U using delu nije navedena potrebna biblioteka, a koristi se klasa iz te biblioteke. Procedura ima manje ili više parametara nego što je potrebno, tipovi podataka parametara ne odgovaraju. Primena operatora nad tipovima podataka koji ne odgovaraju, udruživanje promenljivih u operatorima neadekvatnih tipova. Promenljiva je deklarisana unutar bloka i izvan njega je nevidljiva i ne može se koristiti, a pozvana je...itd. d) Greške u toku izvršavanja aplikacije (run-time errors): PRIMERI: 2.1. Nedefinisano stanje programa u odnosu na unete podatke u toku korišćenja aplikacije – rešava se validacijama , tj. delom koda kojim se proveravaju očekivane tj. moguće greške korisnika i adekvatno reaguje ukoliko nastupe. 2.2. Nedostaje ili je neispravna prateća biblioteka klasa od koje osnovna aplikacija zavisi. 2.3. Dinamičke semantičke greške – često se dešava da se tek prilikom izvršavanja aplikacije dinamički spajaju moduli u jednu celinu i tek tada se mogu, u kombinaciji sa podacima, desiti greške. TakoĎe, dinamičke semantičke greške nastaju prilikom primene aplikacije nad podacima kada nisu validacijama sprečene situacije neispravnog unosa. 2.4. Logičke greške kompajler ih ne može detektovati, već su vidljive putem inspekcije koda (statičko white box testiranje) ili prilikom pokretanja (black box testiranje), kada kod ne daje očekivani izlaz. Razlog je što kod nije napisan u skladu sa specifikacijom zahteva. 2.5. Greške eksternih podataka – problem u ispravnosti i dostupnosti eksternih izvora podataka (datoteka, baza podataka) 1) ne postoji data putanja, mreža ne funkcioniše a zahtevaju se podaci iz lokalne mreže, internet ne funkcioniše a zahtevaju se podaci primenom nekog URL, nepostojeći ili nefunkcionalan URL, nepostojeća datoteka sa tim imenom, 2) neispravan SQL upit- ukazuje na nepostojeću bazu podataka, tabelu, polje i sl.

PRIPREMNI MATERIJAL ZA KOLOKVIJUM

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

UNIVERZITET U NOVOM SADU TEHNIĈKI FAKULTET „MIHAJLO PUPIN― ZRENJANIN PROGRAMSKI PREVODIOCI DOC. DR LJUBICA KAZI Šk. 2019/20

PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Kategorizacija grešaka programskog koda

Greške u odnosu prema procesu kompajliranja: 1. Logičke greške – nezavisne od procesa kompajliranja ili izvršavanja, Program ne daje oĉekivan izlaz jer

kod nije napisan u skladu sa specifikacijom zahteva. Ovu vrstu greške kompajler ne može da detektuje. 2. Greške u toku kompajliranja (compile-time errors):

a) Leksiĉke greške – nedozvoljeni simbol ili oblik reĉi (reĉ nije moguće prepoznati, tj. tokenizovati – klasifikovati i zameniti tokenom).

PRIMERI: nije moguće prepoznati naredbu ili atribut neke klase, jer takav ne postoji (kucaĉka greška).

b) Sintaksne greške – nepravilna konstrukcija reĉenica, nedostaje neki element reĉenice. Reĉenica nije napisana u skladu sa sintaksnim pravilima.

1.1. PRIMERI: nedostaje ; na kraju reĉenice, prilikom navoĊenja atributa stavlja se () a ne treba, kod poziva metode zaboravljen (), u okviru izraza zaboravljena zatvorena zagrada, u okviru blokova zaboravljena { ili } itd....

c) Semantiĉke greške – kompajler ulazi u tumaĉenje znaĉenja programskog koda, uporeĊujući delove šireg programskog koda aplikacije i vezanih biblioteka klasa. Proverava generalnu usklaĊenost i potpunost. U okviru compile-time mogu se detektovati statiĉke semantiĉke greške.

PRIMERI: Greške ovog tipa su vezane za tipove podataka, deklaraciju promenljivih, primenu operatora, parametre poziva procedura. Npr. promenljiva nije deklarisana, a koristi se. Objekat nije instanciran. Promenljiva je deklarisana, a nije korišćena. U using delu nije navedena potrebna biblioteka, a koristi se klasa iz te biblioteke. Procedura ima manje ili više parametara nego što je potrebno, tipovi podataka parametara ne odgovaraju. Primena operatora nad tipovima podataka koji ne odgovaraju, udruživanje promenljivih u operatorima neadekvatnih tipova. Promenljiva je deklarisana unutar bloka i izvan njega je nevidljiva i ne može se koristiti, a pozvana je...itd.

d) Greške u toku izvršavanja aplikacije (run-time errors): PRIMERI: 2.1. Nedefinisano stanje programa u odnosu na unete podatke u toku korišćenja aplikacije – rešava se

validacijama, tj. delom koda kojim se proveravaju očekivane tj. moguće greške korisnika i adekvatno reaguje ukoliko nastupe. 2.2. Nedostaje ili je neispravna prateća biblioteka klasa od koje osnovna aplikacija zavisi.

2.3. Dinamičke semantičke greške – često se dešava da se tek prilikom izvršavanja aplikacije dinamički spajaju moduli u jednu celinu i tek tada se mogu, u kombinaciji sa podacima, desiti greške. TakoĎe, dinamičke semantičke greške nastaju prilikom primene aplikacije nad podacima kada nisu

validacijama sprečene situacije neispravnog unosa. 2.4. Logičke greške – kompajler ih ne može detektovati, već su vidljive putem inspekcije koda (statičko white box testiranje) ili prilikom pokretanja (black box testiranje), kada kod ne daje očekivani izlaz. Razlog je što kod nije napisan u skladu sa specifikacijom zahteva.

2.5. Greške eksternih podataka – problem u ispravnosti i dostupnosti eksternih izvora podataka (datoteka, baza podataka) 1) ne postoji data putanja, mreža ne funkcioniše a zahtevaju se podaci iz

lokalne mreže, internet ne funkcioniše a zahtevaju se podaci primenom nekog URL, nepostojeći ili

nefunkcionalan URL, nepostojeća datoteka sa tim imenom, 2) neispravan SQL upit- ukazuje na nepostojeću bazu podataka, tabelu, polje i sl.

Page 2: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Primeri grešaka i poruka o greškama C# Neki od primera grešaka prema ranije navedenim kategorijama: Logiĉka greška

Public int Saberi (int a, int b) { return a - b ; }

Leksiĉka greška

int i =ч9; simbol ч se ne koristi intz i=9; intz ne može biti prepoznat kao validna kljuĉna-službena reĉ C# jezika

Sintaksna greška

int i=9 nedostaje ; na kraju reda

Statiĉka semantiĉka greška 1. primer

int i=3; promenljiva j nije prethodno deklarisana i=j+2*i;

2. primer int i=3; ne mogu se sabirati string i broj bez prethodnog type casting string j=―pozdrav‖; i=j+2*i;

Dinamiĉka semantiĉka greška: a=b/c za c je uneta vrednost 0, pa će biti generisana greška „Division by ZERO―.

Tipična run-time greška:

SQL upit u kojem se navodi naziv baze podataka, tabele ili polja koje ne postoji, odnosno

komanda samog SQL jezika koja ne može biti prepoznata. Tumačenje SQL naredbe u smislu

sintaksne ispravnosti se vrši tek kada sam SQL upit stigne do DBMS, a ne na nivou aplikacije.

Kompajler ove greške ne može da detektuje.

JOŠ JEDAN PRIMER:

PRIMER SA GREŠKOM KOREKTAN PRIMER

Xf (Textbox1.Text { a=b+c; }

IF (Textbox1.Text.Length>0) { a=b+c; }

U ovom primeru: Leksiĉka greška – Xf nije validna reĉ za uslov Sintaksna greška – nije zatvorena zagrada oko uslova Semantiĉka greška – uslov mora imati bool vrednost, ne može biti string

Page 3: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Lista grešaka koje prijavljuje kompajler C# jezika

Kompletna lista grešaka i upozorenja za C# programski jezik koje prijavljuje Visual Studio NET C#kompajler može se pogledati sa veb stranice: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/ Deo navedenih grešaka i odgovarajućih poruka dat je u nastavku:

Kod greške

TEKST PORUKE C# KOMPAJLERA

OBJAŠNJENJE KRATKO OBJAŠNJENJE NA SRPSKOM

PRIMER KODA KOJI GENERISE GRESKU

CS0006

Metadata file 'dll_name' could not be found

The program was compiled and explicitly passed the name of a file that contained metadata; however, the .dll was not found.

Ako je dll povezan sa aplikacijom i upisano je u meta podacima da se koristi, a ne postoji

CS0007 Unexpected common language runtime initialization error — 'description'

This error occurs if the runtime could not be loaded. This could occur if the version of the common language runtime that the compiler attempts to load is not present on the machine, or if the common language runtime installation or configuration is corrupt.

Ako se pokretanje aplikacije izvrši na raĉunaru koji nema sve potrebne standardne biblioteke (nema instalirano razvojno okruženje iste verzije ili barem jezgro biblioteka koje su potrebne za tu verziju aplikacije).

CS0015 The name of type 'type' is too long

The fully qualified name of a user-defined type must have fewer than 1024 characters, including the periods.

Naziv namespace, klase, metoda, atributa, promenljivih ne može biti veći od 1024 karaktera.

CS0016

Could not write to output file 'file' — 'reason'

The compiler could not write to an output file. Check the path to the file to make sure it exists. If a previously built file is already at the location, make sure it is writeable, and that no process currently has a lock on the file. For example, make sure your executable is not running when you attempt to build.

Putanja i fajl za izlaz (snimanje) ne postoji.

CS0019 Operator 'operator' cannot be applied to operands of type 'type' and 'type'

A binary operator is applied to data types that do not support it. For example, you cannot use the || operator on strings, you cannot use +, -, <, or > operators on bool variables, and you cannot use the == operator with a struct type unless the type explicitly overloads that operator.

Nije moguće primeniti operaciju nad promenljivama koje su takvog tipa da se nad njima ne može izvršiti operacija.

int i = 1; // You cannot compare an integer and a boolean value. if (i == true) //CS0019

CS0029

Cannot implicitly convert type 'type' to 'type'

Conversions must occur when assigning a variable of one type to a variable of a different type. When making an assignment between variables of different types, the compiler must convert the type on the right-hand side of the assignment operator to the type on the left-hand side of the assignment operator. he compiler requires an explicit conversion. For example, you may need to cast.

Potrebna je konverzija tipova podataka. Postoje eksplicitne konverzije i implicitne (kada se ne naglašava i ne daje konkretna naredba, već se konverzija podrazumeva automatski.

PRIMER GREŠKE: int i = 50; long lng = 100; i = lng; i = lng; Before making the assignment the compiler is implicitly converting the variable lng, which is of type long, to an int. This is implicit because no code explicitly instructed the compiler to perform this conversion. The problem with this code is that compiler does not allow implicit narrowing conversions because there could be a potential loss of data. We know that implicit narrowing conversions are not allowed, so to be able to compile this code we need to explicitly convert the data type. Explicit conversions are done using casting. Casting is the term used in C# to describe converting one data type to another.

Page 4: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

ISPRAVNO: int i = 50; long lng = 100; i = (int) lng; // Cast to int.

CS0050 Inconsistent accessibility: return type 'type' is less accessible than method 'method'

The return type and each of the types referenced in the formal parameter list of a method must be at least as accessible as the method itself.

Primena objekta klase koja nije public.

PRIMER SA GREŠKOM: class MyClass // Accessibility defaults to private. // Try the following line instead. // public class MyClass { } // deo koji generiše grešku: return new MyClass();

CS0051 Inconsistent accessibility:

parameter type 'type' is less accessible than

method 'method'

The return type and each of the types referenced in the formal parameter list of a method must be at least as accessible as the method itself.

Parametar je poziv objekta klase, a klasa nije public

PRIMER SA GREŠKOM: class B // PODRAZUMEVA SE PRIVATE { } // ovaj deo generise gresku public static void F(B b) // CS0051 { }

CS0052

Inconsistent accessibility: field type 'type' is less accessible

than field 'field'

The type of a field cannot be less accessible than the field itself because all public constructs must return a publicly accessible object.

Ako je atribut jedne klase objekat druge klase, a ta klasa je po svojoj definiciji privatna, nastaje greska.

PRIMER SA GRESKOM: public class MyClass2 { // The following line causes an error because the field, M, is declared // as public, but the type, MyClass, is private. Therefore the type is // less accessible than the field. public MyClass M; // CS0052 private class MyClass { }

CS0103

The name 'identifier' does not exist in the

current context

An attempt was made to use a name that does not exist in the class, namespace, or scope. Check the spelling of the name to make sure that the name that you are trying to use is available.

Koristimo naziv promenljive, objekta, atributa klase i slicno, a ranije nije definisan pod tim imenom, tj. ne postoji takav.

1. PRIMER GRESKE: Int a=0; C=a+b; GRESKA je jer c I b nisu deklarisani ranije kao promenljive.

2. PRIMER OBLAST DEFINISANJA: Int a=5; For (int i=0; i<a; i++) { Int c=a+i; } MessageBox.Show(―Vrednost c je:‖ + c.ToString()); Posto je c deklarisan unutar bloka for, izvan viticastih zagrada nije vidljiva I u message box-u se ne moze ocitati. Resenje: Izbaciti Int c izvan for ciklusa da bi bilo vidljivo u celom kodu.

CS0116

A namespace cannot directly contain

members such as fields or methods.

A namespace can contain other namespaces, structs, and classes.

U okviru NAMESPACE ne mogu da se postave promenljive niti procedure. Mogu biti postavljene klase.

PRIMER GRESKE: namespace x {

Page 5: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Atributi i metode mogu pripadati klasi i tek u okviru klase....

// A namespace can be placed within another namespace. using System; // These variables trigger the CS0116 error as they are declared outside of a struct or class. public int latitude; public int longitude; Coordinate coord; // Auto-properties also fall under the definition of this rule. public string LocationName { get; set; } // This method as well: if it isn't in a class or a struct, it's violating CS0116. public void DisplayLatitude() { Console.WriteLine($"Lat: {latitude}"); }

CS0120

An object reference is required for the nonstatic field,

method, or property 'member'

In order to use a non-static field, method, or property, you must first create an object instance.

Korišćenje atributa i metoda klase bez prethodnog poziva konstruktora. Znaĉi, ako ja klasa obiĉna (nije statiĉka), onda mora biti instancirana, tj. Pozvan konstruktor i kreiran objekat.

Primer greske: Public class Klasa { Public int i=0; Public int Funkcija() { Return i; } } Prilikom koriscenja nastaje greska: i=10; int b=Funkcija(); RESENJE KOD KORISCENJA: Klasa objKlasa = new Klasa(); int b=objKlasa.Funkcija(); DRUGI NACIN / primena statickih klasa: Public static class Klasa { Public static int i=0; Public static int Funkcija() { Return i; } } PRILIKOM KORIŠĆENJA STATIĈKIH KLASA NAVODI SE NAZIV KLASE I NE PRAVI SE OBJEKAT: int b=Klasa.Funkcija();

CS0122

'member' is inaccessible due to its

protection level

The access modifier for a class member prevents accessing the member.

Pokusaj pristupu privatnom atributu ili metodi.

PRIMER GRESKE: public class MyClass { // Make public to resolve CS0122. void MyMethod() { } } public class MyClass2 { public static int Main() {

Page 6: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

var a = new MyClass(); // MyMethod is private. a.MyMethod(); // CS0122

CS0163

Control cannot fall through from one

case label ('label') to another

When a switch statement contains more than one switch section, you must explicitly terminate each section, including the last one, by using one of the following keywords:

return

goto

break

throw

continue

Svaki pojedinacni slucaj u okviru CASE strukture mora da se završi odgovarajućom naredbom, npr. Break, a ne da se kod nastavi u okviru narednog sluĉaja.

PRIMER SA GREŠKOM: switch (i) // CS0163 { // Compiler error CS0163 is reported on the following line. case 1: i++; // To resolve the error, uncomment one of the following example statements. // return; // break; // goto case 3; case 2: i++; return;

CS0165

Use of unassigned local variable 'name'

The C# compiler doesn't allow the use of uninitialized variables. If the compiler detects the use of a variable that might not have been initialized, it generates compiler error.

Korišćenje vrednosti promenljivih, a da prethodno nisu barem inicijalizovane na poĉetnu vrednost.

PRIMER GRESKE: int i, j; // Because i might not have been initialized, the following // line causes CS0165. j = i; rešenje: Uvek kada se deklariše promenljiva (odredi ime i tip) treba postaviti poĉetnu vrednost. int i=0; int j =0; ovo je sada u redu: j = i;

CS0178

Invalid rank specifier: expected ',' or ']'

An array initialization was ill-formed. For example, when specifying the array dimensions, you can specify the following:

A number in brackets

Empty brackets

A comma enclosed in brackets

Nepravilno referenciranje na element niza. Potrebno je koristiti uglaste zagrade...

PRIMER GRESKE: int a = new int[5][,][][5; // CS0178

CS0201

Only assignment, call, increment, decrement,

and new object expressions can be

used as a statement

The compiler generates an error when it encounters an invalid statement. An invalid statement is any line or series of lines ending in a semicolon that does not represent an assignment (=), method call (), new, -- or ++ operation.

Pisanje izraza bez znaka dodele, poziva funkcije, konstruktora ili ++ ...

Nepravilno: 2 * 3; // CS0201 Pravilno: a=2*3;

CS0234

The type or namespace name

'name' does not exist in the namespace

'namespace' (are you missing an assembly

reference?)

If you see this error after moving code from one development machine to another, make sure that the project on the new machine has the correct references, and that the versions of the assemblies are the same as on the old machine.

Primena nekog atributa ili klase koja ne postoji u navedenoj aplikaciji i pratećim dodatim ili standardnim bibliotekama.

PRIMER SA GRESKOM: System.DateTime x = new System.DateTim(); // CS0234 // try the following line instead // System.DateTime x = new System.DateTime();

CS0246

The type or namespace name 'type/namespace'

could not be found (are you missing a

using directive or an assembly reference?)

A type or namespace that is used in the program was not found. You might have forgotten to reference (-reference) the assembly that contains the type, or you might not have added the required using directive. Or, there might be an issue with the assembly you are trying to reference.

Moguće da je zaboravljeno da se stavi USING na odgovarajuću biblioteku koja je izvor klasa koje koristimo. Moguće je da koristimo klasu iz verzije frameworka koja u ovoj verziji aplikacije ne postoji – npr. Radimo u ranijoj verziji, a u novijoj verziji frameworka je podržano (mi trenutno nemamo na raĉunaru tu noviju verziju).

PRIMER GREŠKE: DataSet dsPodaci=new DataSet(); RESENJE: Using System.Data; … DataSet dsPodaci=new DataSet(); ILI:

Page 7: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

System.Data.DataSet dsPodaci= new System.Data.DataSet();

CS0266

Cannot implicitly convert type 'type1' to

'type2'. An explicit conversion exists (are

you missing a cast?)

This error occurs when your code tries to convert between two types that cannot be implicitly converted, but where an explicit conversion is available.

Nije moguce automatski, implicitno izvrsiti konverziju tipova podataka i prebaciti jednu vrednost u drugu, ali postoji nacin za eksplicitnu konverziju, tj. Type casting.

PRIMER GRESKE: // You cannot implicitly convert a double to an integer. double d = 3.2; // The following line causes compiler error CS0266. int i1 = d; // However, you can resolve the error by using an explicit conversion. int i2 = (int)d;

CS0270

Array size cannot be specified in a variable

declaration (try initializing with a 'new'

expression)

his error occurs when a size is specified as part of an array declaration.

Definisanje velicine niza na pogresan nacin.

PRIMER GRESKE: int[10] a; // CS0270 // To resolve, use the following line instead: // int[] a = new int[10];

CS0433

The type TypeName1 exists in both

TypeName2 and TypeName3

Two different assemblies referenced in your application contain the same namespace and type, which produces ambiguity.

Dva dll fajla koja se koriste imaju istoimeni namespace i klase...

CS0446

Foreach cannot operate on a 'Method or Delegate'. Did you intend to invoke the

'Method or Delegate'?

This error is caused by specifying a method without parentheses or an anonymous method without parentheses in the part of the foreach statement where you would normally put a collection class. Note that it is valid, though unusual, to put a method call in that location, if the method returns a collection class.

Foreach naredba se pise tako sto se navodi element i kolekcija, a ne poziv metode. Jedino se moze pozvati metoda ako vraca kolekciju.

PRIMER GRESKE: static void M() { } … int[] intArray = new int[5]; foreach (int i in M) { } // CS0446 ISPRAVNO: foreach (int i in intArray) { }

CS0504

The constant 'variable' cannot be marked

static

If a variable is const, it is also static. If you want a const and static variable, just declare that variable as const; if all you want is a static variable, just mark it static.

Koristiti ili const ili static ako zelimo konstantu.

PRIMER GRESKE: static const int i = 0; // CS0504, cannot be both static and const

CS1001

Identifier expected.

Lista će biti dopunjena.

Page 8: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

PRIMER URAĐENIH ZADATAKA ZA KOLOKVIJUM NA RAČUNARU 1. PRIMER U nastavku je dat primer zadatka gde je zastupljena po jedna greška za svaki tip – leksiĉka, sintaksna i semantiĉka. ZADATAK: Data je desktop aplikacija sledećeg izgleda, spisak grešaka i sam programski kod. Izdvojiti: deo koda sa greškom, poruku kompajlera, objašnjenje greške, popravku greške. MATERIJAL ZA ANALIZU:

Spisak grešaka koje prijavljuje kompajler (debugger) nakon prvog pokretanja Build opcije:

Nakon popravke te jedne greške i ponovnog build dobija se sledeći spisak grešaka:

Nakon ponovnog kreiranja greške, a pre ponovnog build:

Page 9: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Programski kod sa greškama: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // using SqlDBUtils; namespace DesktopApp_KorisnickiInterfejs { public partial class frmNarucivanje : Form { // atributi //private clsSqlKonekcija objSqlKonekcija; private clsSqlTabela objSqlTabela; private DataSet dsNarucivanje; // METODE // konstruktor public frmNarucivanje() { InitializeComponent(); } // nase metode private DataSet DajSveNarudzbe() { // dsNarucivanje je globalna promenljiva na nivou ove forme i dobija vrednost ovde dsNarucivanje = objSqlTabela.DajPodatke("Select * from Narudzba"); return dsNarucivanje; } private DataSet DajNarudzbePremaRobi(string robaFilter) { // dsNarucivanje je globalna promenljiva na nivou ove forme i dobija vrednost ovde dsNarucivanje = objSqlTabela.DajPodatke("Select * from Narudzba where Proizvod='" + robaFilter + "'"); return dsNarucivanje; // nema potrebe da bude return, jer se salje vrednost u globalnu promenljivu koja je vidljiva svuda } private void NapuniGrid(DataSet dsPodaciZaGrid) { dgvSpisakRobe.DataSource = dsPodaciZaGrid.Tables[0]; dgvSpisakRobe.Refresh(); } private void IsprazniKontrole() { txbKorisnikIme.Text = ""; txbKorisnikAdresa.Text= ""; txbProizvod.Text= ""; txbKolicina.Text= "";

Page 10: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

txbCena.Text = ""; } // dogadjaji private void frmNarucivanje_Load(object sender, EventArgs e) { // inicijalizacija globalnih promenljivih na nivou stranice // 1.otvaranje konekcije objSqlKonekcija = new clsSqlKonekcija("DESKTOP-U5822NP\\MSSQL2008", "", "PP2020_Narucivanje"); objSqlKonekcija.OtvoriKonekciju(); objSqlTabela = new clsSqlTabela(objSqlKonekcija, "Narudzba"); dsNarucivanje = new DataSet(); } private void btnSvi_Click(object sender, EventArgs e) { txbFilterNazivRobe.Text = ""; NapuniGrid(DajSveNarudzbe()); } private void btnFilter_Click(object sender, EventArgs e) { if (txbFilterNazivRobe.Text.Equals("")) { MessageBox.Show("Niste uneli kriterijum filtriranja!"); txbFilterNazivRobe.Focus(); return; } else { NapuniGrid(DajNarudzbePremaRobi(txbFilterNazivRobe.Text)); } } private void btnSnimi_Click(object sender, EventArgs e) { // provera popunjenosti if (txbKorisnikIme.Txt.Equals("")) { MessageBox.Show("Niste uneli ime korisnika!"); txbKorisnikIme.Focus(); return; if (txbKorisnikAdresa.Text.Equals("")) { MessageBox.Show("Niste uneli adresu korisnika!"); txbKorisnikAdresa.Focus(); return; } if (txbProizvod.Text.Equals("")) { MessageBox.Show("Niste uneli proizvod!"); txbProizvod.Focus(); return; } if (txbKolicina.Text.Equals("izaberite")) { MessageBox.Show("Niste uneli kolicinu!"); txbKolicina.Focus(); return; } if (txbCena.Text.Equals("")) { MessageBox.Show("Niste uneli cenu!"); txbCena.Focus(); return; }

Page 11: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

// provera ispravnosti podataka // ****************snimanje podataka try { objSqlKonekcija.OtvoriKonekciju(); // ubaceno da se proveri parcijalni rezultat potreban za kasnije //MessageBox.Show("Uspesna konekcija!"); } catch (Exception greska) { MessageBox.Show("Greska konekcije:" + greska.Message); return; } // 2.preuzimanje podataka sa KI string korisnikIme = txbKorisnikIme.Text; string korisnikAdresa = txbKorisnikAdresa.Text; string proizvod = txbProizvod.Text; string kolicina= txbKolicina.Text; string cena = txbCena.Text; DateTime datumIsporuke = dtpDatumIsporuke.Value; // 3. transformacija ulazne vrednosti string strDatumIsporuke = datumIsporuke.Month.ToString() + "/" + datumIsporuke.Day.ToString() + "/" + datumIsporuke.Year.ToString(); // 4. priprema SQL upita tipa insert string sqlInsertUpit = "INSERT INTO Narudzba VALUES('" + korisnikIme + "', '" + korisnikAdresa + "','" + proizvod + "'," + kolicina + "," + cena + ",'" + strDatumIsporuke + "')"; // ubaceno da se proveri parcijalni rezultat potreban za kasnije //MessageBox.Show("Upit:" + sqlInsertUpit); // 5. izvrsavanje SQL upita tipa insert bool uspehSnimanja=false; try { uspehSnimanja = objSqlTabela.IzvrsiAzuriranje(sqlInsertUpit); MessageBox.Show("USPESNO SNIMLJENI PODACI!"); NapuniGrid(DajSveNarudzbe()); IsprazniKontrole(); } catch (Exception greska) { MessageBox.Show("Greska snimanja novog zapisa:" + greska.Message); return; } } private void btnOdustani_Click(object sender, EventArgs e) { IsprazniKontrole(); } private void btnExportXML_Click(object sender, EventArgs e) { dsNarucivanje.WriteXml("SpisakNarudzbi.XML"); MessageBox.Show("Uspesno snimljen spisak narudzbi u XML!"); } } }

Page 12: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

REŠENJE: IZVEŠTAJ O ANALIZI I KOREKCIJI GREŠAKA PROGRAMSKOG KODA

Deo koda sa

greškom

Tip greške

(leksička, sintaksna,

semantička)

Poruka debuggera Objašenjenje Popravka greške

txtKorisnikIme.Txt Leksička System.Windows.Forms.TextBox does not contain definition for

Txt …

Ne postoji osobina Txt

txtKorisnikIme.Text

Deo koda sa greškom Tip greške

(leksička, sintaksna,

semantička

)

Poruka

debuggera

Objašnjenj

e

Popravka greške

if (txbKorisnikIme.Text.Equals("")) { MessageBox.Show("Niste uneli ime korisnika!"); txbKorisnikIme.Focus(); return;

Sintaksna }

expected

Nije

zatvorena

vitičasta zagrada

if (txbKorisnikIme.Text.Equals("")) { MessageBox.Show("Niste uneli ime korisnika!"); txbKorisnikIme.Focus(); return;

}

Deo koda sa greškom

Tip greške (leksička,

sintaksna, semantička)

Poruka debuggera

Objašenjenje Popravka greške

//private clsSqlKonekcija objSqlKonekcija;

Semanticka The name

'objSqlKonekcija' does not exist in

the current context

objSqlKonekcija je

postavljeno u komentar,

a kasnije se koristi u

kodu.

private clsSqlKonekcija objSqlKonekcija;

Page 13: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

2. PRIMER

ZADATAK Dat je programski kod sa greškama leksičkog, sintaksnog i semantičkog tipa, objektno-orjentisana desktop aplikacija uz primenu biblioteka klasa.

Izgled korisnickog interfejsa aplikacije sa greskama:

Izgled Error liste nakon build:

Realizovati:

1. Pokrenuti opciju sa menija Build, Build Solution. 2. Izvršiti analizu izgleda programskog koda (posebnim bojama podvučen tekst), kao i pokretanje

debuggera radi detektovanja grešaka. 3. Pregledati listu gresaka ErrorList u dnu ekrana.

4. Na spisku gresaka su greske koje je detektovao debugger. 5. Napisati izveštaj: greška(deo koda), tip greške, poruka debuggera (kopirati tekst greške iz error list

– desni taster copy), objašnjenje greške

6. Klikom na grešku u okviru Error list pozicionirate se na lokaciju greške i možete je ispraviti. Dopuniti izveštaj ispravkom greške.

7. Nakon popravke greške uraditi svaki put Build-Build Solution. 8. Dodati 2 PrintScreena (“Print screen” na tastaturi , pa CTRL+V) za svaku gresku: 1) ekrana

razvojnog okruženja sa programskim kodom, nakon pokretanja debuggera sa njegovim porukama o greskama 2) ekrana razvojnog okruženja sa programskim kodom, nakon pokretanja debuggera i

popravke greške. 9. Na kraju dodati Print screen razvojnog okruzenja za uspesan build cele aplikacije.

IZVEŠTAJ ZA SVAKU GRESKU (6 bodova):

Deo koda sa Tip greške Poruka debuggera Objašenjenje Popravka greške

Page 14: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

greškom (leksička, sintaksna,

semantička)

(1 bod) (1 bod) (2 boda)

Izgled razvojnog okruženja (“Print screen” na tastaturi , pa CTRL+V) kada je detektovana greska: (1 bod)

Izgled razvojnog okruženja (“Print screen” na tastaturi , pa CTRL+V) kada je korigovana greska.

(1 bod)

FINALNI IZVEŠTAJ NAKON SVIH POPRAVKI (poslednji build nakon svih popravki je ovaj ekran, dakle identičan Print screen poslednje popravke):

Izgled razvojnog okruženja (“Print screen” na tastaturi, pa CTRL+V) kada su korigovane sve greske i

uradjen uspesan build.

REŠENJE:

1. Analiza i korekcija grešaka

IZVEŠTAJ GREŠKA BR 1:

Deo koda sa

greškom

Tip greške

(leksička, sintaksna,

semantička)

Poruka debuggera Objašenjenje Popravka greške

objNarucivanje = new clsNarucivanje()

sintaksna ; expected Nedostaje ; na kraju

reda

objNarucivanje = new clsNarucivanje();

Izgled razvojnog okruženja kada je detektovana greska:

Izgled razvojnog okruženja kada se selektuje (klikne) na grešku: (Napomena: OVO BI BILO PRECIZNIJI ODGOVOR)

Page 15: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Izgled razvojnog okruženja kada je korigovana greska:

Napomena: Na drugoj slici se uvek vidi selektovan deo koda koji je korigovan.

IZVEŠTAJ GREŠKA BR 2:

Deo koda sa greškom

Tip greške

(leksička, sintaksna

, semantič

ka)

Poruka debuggera Objašenjenje

Popravka greške

dgvSpisakRobe.DataSrc = dsPodaciZaGrid.Tables[0];

Leksička 'System.Windows.Forms.DataGridView' does not contain a

definition for 'DataSrc' and no

extension method 'DataSrc' accepting a first argument of

type 'System.Windows.Forms.DataG

ridView' could be found (are you missing a using directive

or an assembly reference?)

DataSrc je nepostoje

ća reč, tj.

atribut klase data

grid

dgvSpisakRobe.DataSource = dsPodaciZaGrid.Tables[0];

Izgled razvojnog okruženja kada je detektovana greska:

Page 16: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

NAPOMENA: Ovaj ekran je svaki put isti kao i 2. ekran za prethodnu grešku, tj. status nakon korekcije

prethodne greške.

Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:

Izgled razvojnog okruženja kada je korigovana greska:

Page 17: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

IZVEŠTAJ GREŠKA BR 3:

Deo koda sa

greškom

Tip greške

(leksička, sintaksna,

semantička)

Poruka debuggera Objašenjenje Popravka greške

txbKorisnikIme.Text = 0;

semantička Cannot implicitly convert type 'int' to

'string'

Ne može se atributi text

koji je tipa

string dodeliti

numerička vrednost

txbKorisnikIme.Text = "";

Izgled razvojnog okruženja kada je detektovana greska:

Page 18: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:

Izgled razvojnog okruženja kada je korigovana greska:

Page 19: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

IZVEŠTAJ GREŠKA BR 4:

Deo koda sa greškom Tip greške (leksička,

sintaksna, semantička

)

Poruka debuggera Objašenjenje

Popravka greške

NapuniGrid(objNarucivanjeDB.DajNarudzbePremaRobi(txbFilterNazivRobe.Text), false);

semantička No overload for method

'NapuniGrid' takes

2 arguments

Metoda NapuniGrid

nema 2

parametra, vec samo 1

NapuniGrid(objNarucivanjeDB.DajNarudzbePremaRobi(txbFilterNazivRobe.Text));

Izgled razvojnog okruženja kada je detektovana greska:

Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:

Page 20: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Izgled razvojnog okruženja kada je korigovana greska:

IZVEŠTAJ GREŠKA BR 5:

Deo koda sa

greškom

Tip greške

(leksička, sintaksna,

semantička)

Poruka debuggera Objašenjenje Popravka greške

txbKolicina.Focus;

sintaksna Only assignment, call,

increment, decrement,

and new object

expressions can be used as a statement

Nedostaju zagrade oko

metode

Focus

txbKolicina.Focus();

Izgled razvojnog okruženja kada je detektovana greska:

Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:

Page 21: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

Izgled razvojnog okruženja kada je korigovana greska:

Page 22: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

2. Prikaz ispravnog rada aplikacije – Finalni build

NAPOMENA: Obratiti pažnju da dole levo treba da piše: BUILD SUCEEDED i da piše Errors 0.

Page 23: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

PRIMERI ZADATAKA ZA KOLOKVIJUM NA PAPIRU

1. TIP ZADATKA (4 poena) – Dat je izgled korisniĉkog interfejsa i programski kod. Detektovati delove koda sa greškama (1), odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).

2. TIP ZADATKA (3 poena) - Dat je izgled korisniĉkog interfejsa i programski kod. Dat je kompletan Error list sa spiskom detektovanih grešaka od strane kompajlera. Odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1). 3. TIP ZADATKA

(3 poena) - Dat je ispravan segment koda. Napraviti namerne greške tako da bude jedna leksiĉka (1), jedna sintaksna (1) i jedna semantiĉka (1) greška. Napisati segment koda koji ukljuĉuje te greške. 4. TIP ZADATKA

(4 poena) – Dat je segment programskog koda sa greškama. Odrediti deo segmenta sa greškom (1), vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).

5. TIP ZADATKA Dat je segment programskog koda sa konkretnom jednom vrstom greške (leksiĉka, sintaksna, semantiĉka, run-time) koja je navedena. Detektovati delove koda sa greškama (1), objasniti problem (1) i ispraviti greške (1).

Page 24: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

1. TIP ZADATKA (4 poena) – Dat je izgled korisniĉkog interfejsa i programski kod. Detektovati delove koda sa greškama (1), odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).

(Primer aplikacije: DesktopNa3Nacina – stranica za rad sa SQLDBUtils)

KOD SA GREŠKAMA

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // using System.Data; using SqlDBUtils; namespace KorisnickiInterfejs { public partial class frmSaSopstvenomBibliotekomDBUtils : Form { // ------------ ATRIBUTI // ################################################# private DataTable podaciTabelarni; // ------------ METODE // ################################################# // -----------------NASE PROCEDURE private void IsprazniKontrole() { txtOznaka.Text = 0; txtNaziv.Text = ""; } private void AktivirajKontrole() { txtOznaka.Enabled = not true;

Page 25: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

txtNaziv.Enabled = true; } private void DeaktivirajKontrole() { txtOznaka.Enabled = false; txtNaziv.Enabled = false; } private int SnimiPodatke() { int brojslogova = 0; // preuzimanje iz korisnickog interfejsa // radi preglednosti koda postavljamo promenljive string Oznaka = txtOznaka.Text; string Naziv = txtNaziv.Text; string UkupnoMesta = "0"; clsSqlKonekcija objKonekcija = new clsSqlKonekcija(Parametri.stringKonekcije); objKonekcija.OtvoriKonekciju(); clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Drzava"); string SQLNaredba = "Insert into Drzava (Oznaka, Naziv, UkupnoMesta) Values ('" + Oznaka + "', '" + Naziv + "'," + UkupnoMesta + ")"; bool uspeh = objTabela.IzvrsiAzuriranje(SQLNaredba); if (uspeh) { brojslogova = ""; } else { brojslogova = Ž; } objKonekcija.ZatvoriKonekciju(); return brojslogova; } private DataTable UcitajSve() { DataTable TabelaPodataka = new DataTable(); clsSqlKonekcija objKonekcija = new clsSqlKonekcija(Parametri.stringKonekcije); objKonekcija.OtvoriKonekciju(); clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Drzava"); string SQLNaredba = "select * from Drzava"; DataSet dsPodaci = objTabela.DajPodatke(SQLNaredba); TabelaPodataka = dsPodaci.Tables[0]; objKonekcija.ZatvoriKonekciju(); return TabelaPodataka; } private DataTable UcitajFiltrirano(string Filter) { DataTable TabelaPodataka = new DataTable(); clsSqlKonekcija objKonekcija = new clsSqlKonekcija(Parametri.stringKonekcije); objKonekcija.OtvoriKonekciju(); clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Drzava"); string SQLNaredba = "select ! frm Drzav where Oznake='" + Filter + "'"; DataSet dsPodaci = objTabela.DajPodatke(SQLNaredba);

Page 26: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

TabelaPodataka = dsPodaci.Tables[0]; objKonekcija.ZatvoriKonekciju(); return TabelaPodataka; } private void PrikaziTabeluPodataka(DataTable TabelaPodataka) { dgvSpisakDrzava.DataSource = TabelaPodataka; dgvSpisakDrzava.Refesh(); } private void SnimiXML(DataTable podaci, string putanja) { DataSet dsPodaciEksport = new DataSet1(); // s obzirom da smo dobili kroz parametar poziva ove procedure "podaci" // zapravo samo promenljivu koja sadrzi memorijsku lokaciju, pokazivac // ka podacima, javlja se problem kada ovaj isti DataTable "podaci" // vezemo sa drugim datasetom "dsPodaciExport" jer je taj DataTable // vec povezan sa dsPodaci u okviru procedure UcitajSve i UcitajTabelarno. // Zato moramo da radimo Copy, da kopiramo strukturu i podatke u NOVI DataTable. DataTable podaciZaEksport = new DataTable(); podaciZaEksport = podaci.Copy(); dsPodaciEksport.Tables.Add(podaciZaEksport); dsPodaciEksport.WriteXml(putanja); } // KONSTRUKTOR public frmSaSopstvenomBibliotekomDBUtils() { InitializeComponent(); } // DOGADJAJI private void btnUnos_Click(object sender, EventArgs e) { IsprazniKontrole(); AktivirajKontrole; txtOznaka.Focus(); } private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > poruka) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBox.Show(); } private void btnOdustani_Click(object sender, EventArgs e) { IsprazniKontrole(); DeaktivirajKontrole(); } private void btnFiltriraj_Click(object sender, EventArgs e) { podaciTabelarni = UcitajFiltrirano(txtFilter.Text); PrikaziTabeluPodataka(podaciTabelarni); }

Page 27: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

private void btnSve_Click(object sender, EventArgs e) { podaciTabelarni = UcitajSve(); PrikaziTabeluPodataka(podaciTabelarni); } private void btnExportXML_Click(object sender, EventArgs e) { SnimiXML(podaciTabelarni, Parametri.putanjaXML); MessageBox.Show("Uspesno realizovan eksport podataka!"); } private void frmSaSopstvenomBibliotekomDBUtils_Load(object sender, EventArgs e) { } } }

SQL script baze podataka (POTREBAN ZA PROVERU RUN-TIME GREŠAKA) CREATE DATABASE [GEOGRAFIJASE1] GO USE [GEOGRAFIJASE1] GO CREATE TABLE [dbo].[MESTO]( [PTT] [nvarchar](5) NOT NULL PRIMARY KEY, [Naziv] [nvarchar](40) NOT NULL, [OznakaDrzave] [nvarchar](3) NOT NULL ) GO CREATE TABLE [dbo].[DRZAVA]( [OZNAKA] [nvarchar](3) NOT NULL PRIMARY KEY, [Naziv] [nvarchar](100) NOT NULL, [UkupnoMesta] int NOT NULL ) GO ALTER TABLE [dbo].[MESTO] ADD CONSTRAINT FK_PRIPADA FOREIGN KEY (OznakaDrzave) REFERENCES [dbo].[DRZAVA] (OZNAKA) ON UPDATE CASCADE ON DELETE NO ACTION; GO

REŠENJE

DEO KODA SA GREŠKOM VRSTA GREŠKE OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE

Page 28: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

2. TIP ZADATKA (3 poena) - Dat je izgled korisniĉkog interfejsa i programski kod. Dat je kompletan Error list sa spiskom detektovanih grešaka od strane kompajlera. Odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1). Pored prethodno datog materijala dodatno bi bilo dato I ovo:

REŠENJE

DEO KODA SA GREŠKOM VRSTA GREŠKE OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE

Page 29: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

3. TIP ZADATKA

(3 poena) - Dat je ispravan segment koda. Napraviti namerne greške tako da bude jedna leksiĉka, jedna sintaksna i jedna semantiĉka greška. Napisati segment koda koji ukljuĉuje te greške. ISPRAVAN SEGMENT KODA: if (ukupnoSnimljeno > 0) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; }

KOD SA LEKSIĈKOM GREŠKOM KOD SA SINTAKSNOM GREŠKOM

KOD SA SEMANTIĈKOM GREŠKOM

Page 30: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

4. TIP ZADATKA

(4 poena) – Dat je segment programskog koda sa greškama. Odrediti deo segmenta sa greškom (1), vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).

private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > poruka { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBx.Show(); }

DEO KODA SA GREŠKOM VRSTA GREŠKE OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE

5. TIP ZADATKA Dat je segment programskog koda sa konkretnom jednom vrstom greške (leksiĉka, sintaksna, semantiĉka, run-time) koja je navedena. Detektovati delove koda sa greškama (1), objasniti problem (1) i ispraviti greške (1).

LEKSIČKA private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > O) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBx.Show(); }

DEO KODA SA GREŠKOM OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE

Page 31: PRIPREMNI MATERIJAL ZA KOLOKVIJUM

SINTAKSNA private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > 0 { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBox.Show(); }

DEO KODA SA GREŠKOM OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE

SEMANTIČKA private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > poruka) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBox.Show(); }

DEO KODA SA GREŠKOM OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE