You are on page 1of 68

1. Kako se dele tipovi u C# programskom jeziku?

Na slici 1. prikazana je podela tipova podataka na vrednosne i referentne tipove.


Vrednosni tipovi se dalje dele na strukturne tipove (struct) i
enumeracije (enum) Strukturni tipovi mogu biti: numerički, bool I strukture (korisnički definisani
strukturni tipovi).

Numerički tipovi mogu biti:


 svi celobrojni tipovi (sbyte, byte, char, short, ushort, int, uint, long, ulong);
 realni tipovi (float, double);
 decimal tip

Referentni tipovi podataka su:


 Klase,
 Interfejsi
 Delegati
 Nizovi
2. Šta je to pakovanje i objasniti na konkrentom primeru.

Pakovanje je proces implicitnog konvertovanja vrednostnog tipa u tip object, pri čemu se vrši kopiranje
vrednosti vrednostnog tipa podatka sa statičke zone memorije (steka) i njegovo smeštanje u
dinamičku zonu memorije (heap) i referenciranje podatka tipa object na tu kopiju. Promenljive tipa
object mogu da referenciraju na bilo koju vrednost nekog tipa.

Na primer:
int i = 123;
// Pakovanje i. (kopira vrednost i u objekat o)
object o = i;

Vrednost promenljive i se nalazi na steku, dok se u Heap (dinamičkoj) memoriji pravi tačna kopija
vrednosti promenljive i, a o referencira na tu kopiju. To automatsko kopiranje se naziva pakovanjem.

Na ovaj način promenljiva tipa object može da referencira na apsolutno sve promenljive, bez obzira na
tip.

3. Šta je to raspakivanje i objasniti na konkrentom primeru

Rakovanje je proces implicitnog konvertovanja tipa object u vrednosni tip u, pri čemu se vrši kopiranje
vrednosti vrednostnog tipa podatka sa dinamičke zone memorije (heap) u statičku zonu memorije (stek).

Sledeći primer pokazuje kako se vrši raspakivanje:


int i = 123; // a vrednosni tip
object o = i; // pakovanje
int j = (int)o; // raspakivanje

Na sledećoj slici se demonstrira rezultat prethodnih izraza:


4. Dovršiti konzolnu aplikaciju za ispis opsega realnih brojeva tipa float:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
____ max = ________________;
____ min = ________________;

Console.WriteLine($"___________________________________________");

Console.ReadKey();

}
}
}

RESENJE:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
float max = float.MaxValue;
float min = float,MinValue;

Console.WriteLine($"Opseg je od {min} do {max}");

Console.ReadKey();

}
}
}

5. Koji brojevi imaju veći opseg, a koji veću preciznost: brojevi tipa double ili brojevi tipa
decimal?

Brojevi tipa double ima ju veci opseg, dok brojevi tipa decimal imaju vecu preciznost (vise brojeva posle
zareza).
6. Dopuni dati program tako da a=1,5 b=3,8 i ispisati vrednost a/b,
c=1,7 d=3,8 i ispisati vrednost c*d,
e=4,5 f = 78,12 i ispisati vrednost e+f

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double a = ____________;
double b = ____________;
Console.WriteLine($________________________);

decimal c = ____________;
decimal d = ____________;
Console.WriteLine($________________________);

float e = ____________;
float f = ____________;
Console.WriteLine($________________________);

Console.ReadKey();

}
}
}

RESENJE:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double a = 1.5;
double b = 3.8;
Console.WriteLine($”Resenje a/b je {a/b}”);

decimal c = 1,7M;
decimal d = 3.8M;
Console.WriteLine($”Resenje c*d je {c*d}”);

float e = 4,5F;
float f = 78,12F;
Console.WriteLine($”Resenje e+f je {e+f}”);

Console.ReadKey();

}
}
}
7. U koji tip podatka spada string vrednosni ili referentni tip?

Upotreba stringova u kodiranju je veoma česta. String u C# programskom jeziku je instanca klase
System.String koja predstavlja tekst kao sekvencu Unicode karaktera. Ključna reč string sa kojom
deklarišemo promenjive tipa string je samo alias (skraćeno ime) klase System.String.
Ono što je bitno da upamtite da je string referentni tip podataka. Pre inicijalizacije tip string ima
vrednost null.

8. Da li je moguće izvršiti čitanje ili izmenu karaktera u nekom stringu direktno indeksiranjem?

Često će te čuti da je string kao i niz tipa char; sličnost definitivno postoji, indeksiranje počinje od 0, ali
izmena pojedinih karaktera u stringu ne može da se izvrši direktno indeksiranjem, kao u nizu karaktera.
Međutim čitanje pojedinih karaktrima u stringu je moguć. Klasa String jednostavno tretira stringove
kao niz karaktera samo za čitanje (read-only).

9. Da li je moguće promeniti vrednost promenljivoj tipa string? Šta se dešava sa memorijskim


sadržajem u kome je bila stara vrednost?

Jednom kad deklarišete i dodelite vrednost promenjivoj tipa string; to je nepromenjivo! Zato kad vi
dodelite ili promenite neku drugu vrednost promenjivoj tipa string vi u stvari stvarate novi string u
memoriji dok samo imate utisak da je vaš string promenio vrednost. Vaš stari string će biti uklonjen čim
to ustanovi sakupljač otpadaka, dok vi vidite vrednost novog stringa. Ukoliko nameravate u vašem
programu da manipulišete stringovima onda vam je bolje koristiti klasu StringBuilder i radi brzine i radi
memorije da vaša aplikacija nebi imala ozbiljne komplikacije sa performansama.

10. Dopuniti navedeni kod kao što pise u komentarima.

using System;
using static

System.Console; -> zato sto ubacili ovo, u kodu samo pisemo WriteLine

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringClass
{
class Program
{
static void Main(string[] args)
{
// deklaracija i inicijalizacija string www.ftn.kg.ac.rs
string link = ________________________;

// linija sa 20 karaktera '-'


string lines = _______________________;

//ispisi link
WriteLine(______________________________);

WriteLine(lines + Environment.NewLine);

//ispisi duzinu linka


WriteLine(______________________________);

// otkloniti 4 karaktera pocev od indexa 0


link = ______________________________;
// otkloniti 9 poslednjih karaktera
link = _______________________________;

// Staviti sva velika slova u linku


link = _____________________________;
// Zameniti slovo 'T' slovom 't'
link = _____________________________;
}

RESENJE

namespace StringClass
{
class Program
{
static void Main(string[] args)
{
// deklaracija i inicijalizacija string www.ftn.kg.ac.rs
string link = “www.ftn.kg.ac.rs”;

// linija sa 20 karaktera '-'


string lines = new String (‘-’, 20);

//ispisi link
WriteLine(link);

WriteLine(lines + Environment.NewLine); //ispisuje linije i


prebacuje u nov red kao /n

//ispisi duzinu linka


WriteLine(link.Length);

// otkloniti 4 karaktera pocev od indexa 0


link = link.Remove(0,4);

// otkloniti 9 poslednjih karaktera


link = link.Remove(link.Length-9, 9);

// Staviti sva velika slova u linku


link = link.toUpper();

// Zameniti slovo 'T' slovom 't'


link = link.Replace(‘T’, ‘t’);
}
11. Dopuniti navedeni kod kao što pise u komentarima.

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringClass
{
class Program
{
static void Main(string[] args)
{
// deklaracija i inicijalizacija string vase ime i prezime
string imePrezime = ________________________________;

// linija sa 30 karaktera '-'


string lines = ______________________________;

// definisati da su stringovi ime i prezime prazani


________ ime = ____________________;
________ prezime = ___________________;

// ispisati string imePrezime


WriteLine("String promenljiva: " + link);
WriteLine(lines + Environment.NewLine);

//podeliti string imePrezime na mestu gde je prazan razmak


string[] niz = ________________
ime = ______________;
prezime = ______________;

//ispisati stringove ime i prezime


WriteLine(________________________________);
//prikazati ime i prezime sa velikim pocetnim slovom
ime = _____________________________________________________;
prezime = _________________________________________________;

//Spojiti stringove ime i prezime


link = ________________________________;

// Promena svih slova u strigu u mala slova


link = ________________________________;

// Spajanja vise stringova sa join izmedju kojih se stavlja '.'


string[] niz2 = new string[3];
// Inicijalizovati niz2[0] na „www“
niz2[0] = _______________;
niz2[1] = link;
// Inicijalizovati niz2[0] na „com“
niz2[2] = _______________;
// Spojiti stringove u niz2 sa '.'
link = _________________________);
// Ispisati link
WriteLine(_________________________);

ReadKey();

}
}
}
RESENJE

namespace StringClass
{
class Program
{
static void Main(string[] args)
{
// deklaracija i inicijalizacija string vase ime i prezime
string imePrezime = “luka peric”;

// linija sa 30 karaktera '-'


string lines = new String (‘-’,30);

// definisati da su stringovi ime i prezime prazani


string ime = “”;
string prezime = “”;

// ispisati string imePrezime


WriteLine("String promenljiva: " + imePrezime);
WriteLine(lines + Environment.NewLine);

//podeliti string imePrezime na mestu gde je prazan razmak


string[] niz = imePrezime.Split(‘ ’) //razmak izmedju navoda
ime = niz[0];
prezime = niz[1];

//ispisati stringove ime i prezime


WriteLine(“Ime: ” + niz[0] + “, prezime: ” + niz[1]);

//prikazati ime i prezime sa velikim pocetnim slovom


ime = ime.Substring(0,1).ToUpper() + ime.Substring(1);
prezime = prezime.Substring(0,1).ToUpper() + prezime.Substring(1);

//Spojiti stringove ime i prezime


imePrezime = String.Concat(ime, prezime);

// Promena svih slova u strigu u mala slova


imePrezime = imePrezime.ToLower();

// Spajanja vise stringova sa join izmedju kojih se stavlja '.'


string[] niz2 = new string[3];

// Inicijalizovati niz2[0] na „www“


niz2[0] = “www”;
niz2[1] = imePrezime;

// Inicijalizovati niz2[2] na „com“


niz2[2] = “com”;

// Spojiti stringove u niz2 sa '.'


link = String.Join(“.”, niz2));

// Ispisati link
WriteLine(link);

ReadKey();

}
}
}
12 Dopuniti navedeni kod kao što pise u komentarima.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
string pozdrav = " Zdravo svima! ";
Console.WriteLine($"[{pozdrav}]");

//otkloniti praznine sa pocetka stringa


string pozdravPomeren = _________________;
Console.WriteLine($"[{pozdravPomeren}]");

//otkloniti praznine sa kraja stringa


pozdravPomeren = ____________________;
Console.WriteLine($"[{pozdravPomeren}]");

//otkloniti praznine sa pocetka i kraja stringa stringa


pozdravPomeren = ___________________;
Console.WriteLine($"[{pozdravPomeren}]");

Console.ReadKey();

}
}
}

RESENJE

1. Dopuniti navedeni kod kao što pise u komentarima.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
string pozdrav = " Zdravo svima! ";
Console.WriteLine($"[{pozdrav}]");

//otkloniti praznine sa pocetka stringa


string pozdravPomeren = pozdrav.TrimStart();
Console.WriteLine($"[{pozdravPomeren}]");

//otkloniti praznine sa kraja stringa


pozdravPomeren = pozdrav.TrimEnd();
Console.WriteLine($"[{pozdravPomeren}]");
//otkloniti praznine sa pocetka i kraja stringa stringa
pozdravPomeren = pozdrav.Trim();

Console.WriteLine($"[{pozdravPomeren}]");

Console.ReadKey();

}
}
}

13. Kada se pozove funkcija, u koju memoriju se smeštaju parametri i lokalne


promenljive?

Računarska memorija je podeljena na nekoliko delova od kojih se dva od tih delova


nazivaju
 stek i hip (dinamička) memorija. Stek i hip memorija se koriste za različite svrhe:
Kada se pozove funkcija, potrebna je memorija za njegove parametre i lokalne
promenljive. Ta se memorija uvek uzima iz steka. Kada se metod završi,
memorija koja je rezervisana za parametre i lokalne promenljive se briše iz
steka.

14. Kada se pravi objekat (instanca) neke klase pomoću ključne reči new i poziva
konstruktor, kako se zove memorija u koju se smeštaju objekti?

Kada se pravi objekat pomoću ključne reči new i poziva konstruktor, potrebna je
memorija da bi se objekat izgradio. Memorija za objekte se uvek uzima iz hip
memorije ( dinamicka memorija - koja je dostupna za vreme izvrsavanja programa)

15. Kako se vrši implicitna konverzija tipova? Kada je moguce da se ona izvrši za
neka dva tipa tip I i tip II?
Implicitna konverzija – je automatska konverzija koja se vrši pri: izračunavanju
vrednosti izraza, kada kompajler vrši automatsko usklađivanje različitih tipova
podataka koji se koriste u izrazu, ako je to moguće. Takođe. pri dodeljivanju
vrednosti promenljivoj izračunata vrednost se automatski konvertuje u tip
promenljive, ako je to moguće. Promenljiva tipa I čiji je skup mogućih vrednosti
podskup skupa mogućih vrednosti tipa II (a nikako obratno da se ne bi izgubile
informacije i da bi se sačuvala preciznost podataka) se može implicitno konvertovati
u promenljivu tipa II.
16. Na koje sve načine se može izvršiti eksplicitna konverzija tipova?

Eksplicitna konverzija - Eksplicitnom konverzijom programer od kompajlera


zahteva traženu konverziju. Eksplicitna konverzija se ostvaruje korišćenjem:

1) operatora cast - Operator cast - () koristimo tako što u zagradama


navedemo tip u koji želimo da konvertujemo vrednost izraza koji sledi za
operatorom cast - ().

2) koriščenjem metode Parse


Metoda Parse direktno konvertuje vrednost tipa string u neki od navedenih
tipova podataka. Ukoliko se konverzija ne može izvesti iz bilo kog razloga,
kompajler izbacuje grešku. Ukoliko niste sigurni da vaša konverzija će uvek
biti uspešna, onda obavezno koristite metodu Parse u okviru konstrukcije
try-catch-finally

3) Korišćenjem metode TryParse


Za razliku od metode Parse, metoda TryParse je tipa boolean i prvo proverava
da li se može izvesti konvertovanje i ukoliko može, radnja će se izvršiti;
metoda će vratiti True ili u suprotnom metoda će vratiti False. Ukoliko se ne
može izvršiti konvertovanje stringa, kompajler neće izbaciti grešku.

4) korišćenjem klase Convert (tabela 3).


Korišćenjem eksplicitne konverzije može doći do gubitka informacija, tj. do
sužavanja podataka, kada je skup vrednosti u koji se podatak konvertuje
podskup skupa vrednosti podatka koji konvertujemo.

17. Izvršiti eksplicitnu konverziju tipa broj1 u tip broj2 koristeći kastovanje u
sledećem primeru?
int broj1 = 100;
short broj2 = _______________;
Resenje
short broj2 = (short)broj1;
18. Izvršiti eksplicitnu konverziju tipa broj1 u tip broj2 koristeći metodu Parse
u sledećem primeru?
int broj1 = 100;
short broj2 = _______________;
Resenje
short broj2 = short.Parse(broj1.ToString());

19. Izvršiti eksplicitnu konverziju tipa broj1 (int) u tip broj2 (short int)
koristeći metodu TryParse u sledećem primeru?
int broj1 = 100;
______________________ = _______________;
Resenje
Bool rez = short.TryParse(broj1.ToString(), out broj2);

20. Izvršiti eksplicitnu konverziju tipa broj1 u tip broj2 koristeći klasu Convert
u sledećem primeru?
int broj1 = 100;
short broj2 = _______________;
Resenje
short broj2 = Convert.ToInt16(broj1);

Za konverziju u float koriscenjem klase Convertresenje je:


short broj2 = Convert.ToSingle(broj1);

21. Za ispisivanja dužine niza koirsti se svojstvo ___________, dok se za


ispisivanje dužine liste koristi svojstvo ____________.
Resenje
Za ispisivanja dužine niza koirsti se svojstvo LENGTH, dok se za ispisivanje dužine
liste koristi svojstvo COUNT.
22. Koja dva načina prenosa funkcijiskih parametara postoje u jeziku C#?

Ona rekla: po vrednosti i po referenci

Pri pozivu funkcije vrši se kopiranje vrednosti ovih promenljivih u funkcijske parametre –
lokalne funkcijske promenljive, tako da se sve izmene u funkciji koje se vrše nad funkcijskim
parametrima u stvari vrše samo nad lokalnim funkcijskim promenljivima. Ako se na ovaj način
poziva funkcija, ona ne može nikada promeniti vrednost promenljivih definisanih u glavnom
programu – prenos parametara po vrednosti. Ukoliko se parametri funkcije definišu preko
referenci korišćenjem ključnih reči ref ili out, vrši se prenos parametra po referenci.

23 Da li argumenti koji se prenose metodi po referenci pomoću ključne reči ref


moraju da budu inicijalizovani pre prosleđivanja funkciji?
Argumenti koji se prenose metodi po referenci pomoću ključne reči ref moraju da budu
inicijalizovani pre prosleđivanja funkciji.

2 4. Da li argumenti koji se prenose metodi po referenci pomoću ključne reči out


moraju da budu inicijalizovani pre prosleđivanja funkciji?
Argumenti koji se prenose funkciji po referenci sa ključnom reči out, ne moraju da budu
inicijalizovani pre prosleđivanja funkciji.
25. Odrediti i naznačiti koji delovi koda će prouzrokovati grešku?
public class PrimerParams
{
public static void MetodParams(params float[] niz)
{
for (int i = 0; i < niz.Length; i++)
{
Console.Write(niz[i] + " ");
}
Console.WriteLine();
}

public static void MetodParams2(params object[] niz)


{
for (int i = 0; i < niz.Length; i++)
{
Console.Write(niz[i] + " ");
}
Console.WriteLine();
}

static void Main()


{
MetodParams(1.4F, 2.9F, 3.2F, 4.2F); _________________________
MetodParams2(1.7F, 234M, 654, 'a', "tekst"); _________________

MetodParams(); ____________________
MetodParams2();____________________
string[] mojNiz = { “Milan”, “Ana”, “Jovan”};
MetodParams(mojNiz)________________________
object[] mojNizObjekata = { 2, 'b', "test", "again" };
MetodParams2(mojNizObjekata);______________________

MetodParams(mojNizObjekata);__________________________
MetodParams2(mojIntNiz);______________________________
}
}

Resenje
public class PrimerParams
{
public static void MetodParams(params int[] niz)
{
for (int i = 0; i < niz.Length; i++)
{
Console.Write(niz[i] + " ");
}
Console.WriteLine();
}
// Niz se deklariše kao tip object (referentni tip podatka)
//a to je niz bilo kojih tipova podataka
public static void MetodParams2(params object[] niz)
{
for (int i = 0; i < niz.Length; i++)
{
Console.Write(niz[i] + " ");
}
Console.WriteLine();
}

static void Main()


{
// Može se proslediti niz elemenata određenog tipa razdvojenih
zarezom.
MetodParams(1,2,3,4);
MetodParams2(1, 'a', "test");

// Parametar params može prihvatiti nuli ili više argumenata.


// Naredni poziv metoda prikazuje samo prazan red.

MetodParams2();

// Niz arugmenata se može prosleđivati sve dok se tip niza poklapa


// sa tipom parametra metoda koji se poziva.
int[] mojIntNiz = { 5, 6, 7, 8,9 };
MetodParams(mojIntNiz);

object[] mojNizObjekata = { 2, 'b', "test", "again" };


MetodParams2(mojNizObjekata);

// Sledeći poziv prouzrokuje pojavu greške zato što


// niz objekata ne može biti konvertovan u celobrojni niz.
// U koliko napravimo INT niz I ubacimo ga u FLOAT f-ju, radi ce zbog
konverzije manjeg u vece, ali DOUBLE nece raditi zato sto ima vecu
“fioku” od FLOAT-a. String niz ne moze da bude unos gde je stavljeno
da unos bude broj.
MetodParams(mojNizObjekata);

// Sledeći poziv ne prouzrokuje grešku, ali ceo celobrojniniz


postaje prvi element params niza.

MetodParams2(mojIntNiz);
}
}

26. Koji je opšti oblik sintakse prilikom obrade izuzetaka?

try
{
//kod koji se izvršava do pojave greške
throw new System.Exception();
...
}
catch (Exception){

//kod koji se izvršava ukoliko dođe do greške


...
}
finally{
//kod koji se izvršava bez obzira da li je bilo greške ili nije
...
}

27. Na kojji način treba da budu poređani Catch blokovi koji hvataju izuzetke?
Gde treba da se nađe catch(Exception ex) blok?

Trebaju da se poredjaju tako sto na pocetku se definisu specificniniji catch blokovi a


na kraju ide opsti (exception ex) blok koji hvata svaki tip greske.
28. Dopuniti delove koda, kako je naznačeno u komentarima.

namespace TryCatchFinally
{
class Program
{

static void Main(string[] args)


{
bool korektan = false;
string broj = String.Empty;

do
{
//Izvrsiti unos broja
broj = _______________________________

try
{
// Izvršiti konverziju unetog broja u Int32 tip korišćenjem Parse metode

________________________

korektan = true;

}
/*Poredjati redom FormatException, OverflowException, Exception u na
odgovarajucim mestima u catch blokovima*/

catch (_____________________)
{
korektan = false;
Error.WriteLine($"{_________________}" +
Environment.NewLine);//ispsiati poruku o izuzetku koriscenjem Message
metode

}
catch (_____________________)
{
korektan = false;
Error.WriteLine($"{________________}" +
Environment.NewLine); //ispsiati poruku o izuzetku koriscenjem Message
metode

}
catch (_____________________)
{
korektan = false;
Error.WriteLine($"___________________" +
Environment.NewLine); //ispsiati poruku o izuzetku koriscenjem Message
metode
}
finally
{
WriteLine("--------------------");

}
} while (!korektan);

WriteLine($"Uneti broj {broj} je korektan!");


ReadKey();
}
}
}
Resenje:
namespace TryCatchFinally
{
class Program
{

static void Main(string[] args)


{
bool korektan = false;
string broj = String.Empty;

do
{
//Izvrsiti unos broja
broj = ReadLine();

try
{
// Izvršiti konverziju unetog broja u Int32 tip korišćenjem Parse metode

Int32.Parse(broj);
korektan = true;

}
/*Poredjati redom FormatException, OverflowException, Exception u na
odgovarajucim mestima u catch blokovima*/

catch (FormatException fe)


{
korektan = false;
Error.WriteLine($"FormatException caught: {fe.Message}"
+ Environment.NewLine);
//ispsiati poruku o izuzetku koriscenjem Message metode

}
catch (OverflowException oe)
{
korektan = false;
Error.WriteLine($"OverflowException caught:
{oe.Message}" + Environment.NewLine);
//ispsiati poruku o izuzetku koriscenjem Message metode

}
catch (Exception ex)
{
korektan = false;
Error.WriteLine($"Exception caught: {ex.Message}" +
Environment.NewLine);
//ispsiati poruku o izuzetku koriscenjem Message metode
}
finally
{
WriteLine("--------------------");

}
} while (!korektan);

WriteLine($"Uneti broj {broj} je korektan!");


ReadKey();
}
}
}
2 8. Dopuniti delove koda, kako je naznačeno u komentarima.
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Izuzeci
{
class Program
{
static double Deljenje(double x, double y)
{
if (y == 0)
______________________________
//proizvesti izuzetak deljenja sa nulom
return x / y;
}
static void Main()
{
float a, b;
float rezultat;
WriteLine("Uneti a i b");
a = ___________________________________;
b = ___________________________________;
try
{
rezultat = Deljenje(a, b);
//Ispisati rezultat
_______________________________________;

}
/*Poredjati redom DivideByZeroException i Exception u na odgovarajucim
mestima u catch blokovima i ispisati poruke o greskama koriscenjem Message
metode*/

catch (____________________)
{
_____________________________________;
}
catch (_____________________) {

______________________________________;
}

Console.ReadKey();
}
}

}
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Izuzeci
{
class Program
{
static double Deljenje(double x, double y)
{
if (y == 0)
throw new System.DivideByZeroException();
//proizvesti izuzetak deljenja sa nulom
return x / y;
}
static void Main()
{
float a, b;
float rezultat;
WriteLine("Uneti a i b");
a = Convert.ToDouble (Console.ReadLine());

b = Convert.ToDouble(Console.ReadLine());
try
{
rezultat = Deljenje(a, b);
//Ispisati rezultat

WriteLine("Rezultat deljenja broja {0} brojem {1} je {2:F2}", a,


b, rezultat);

}
/*Poredjati redom DivideByZeroException i Exception u na odgovarajucim
mestima u catch blokovima i ispisati poruke o greskama koriscenjem Message
metode*/

catch (DivideByZeroException)
{
WriteLine("Nemoguce je izvrsiti deljenje
sa nulom!");

}
catch (Exception e) {

WriteLine($"Exception caught {e.Message}");


}

Console.ReadKey();
}
}

}
29. Kako se pristupa članovima klase kada klasa nije deklarisana kao static,
a kako kada je klasa deklarisana kao static.

Ako se klasa ne deklariše kao static, korisnik članovima klase može pristupati
preko objekata klase, korišćenjem operatora “.“. Ako se klasa deklariše kao static
postoji tada samo jedna kopija klase u memoriji i korisnik podacima članovima
pristupa direktno, a ne preko objekta klase.

30. Šta znači kada se ispred deklaracije klase stavi ključna reč abstract, a
šta kada se ispred klase stavi ključna reč seald?

Modifikator Opis
public Klasi se može pristupiti i izvan projekta u kome je klasa definisana
Pristup klasi je moguć i izvan projekta, i iz nje se može izvesti nova
public abstract
klasa koja ce implementirati apstraktne metode iz bazne klase
internal (ili ga Klasi se može pristupiti samo unutar projekta u kome je klasa
nema) definisana
abstract ili Pristup klasi je samo unutar projekta i iz nje se može izvesti nova
internal abstract klasa koja ce implementirati apstraktne metode iz bazne klase
sealed ili Pristup klasi je samo unutar projekta i iz nje se ne može izvesti nova
internal sealed klasa

31. Šta znači pojam apstrakcije u objektno orijentisanom programiranju?


Apstrakcija se ogleda u tome da se pri modelovanju predmata, bića ili pojava
nekom klasom, odabiruju samo atributi koji su bitni u konkretnom slučaju u
zavisnosti od namene posmatrane klase, dok se ostali atributi zanemaruju.
Konkretnije, u objektno-orijentisanom programiranju se odnosi na mogućnost da
se data klasa proglasi za apstraktnu klasu. Apstraktne klase su takve da se ne
mogu instancirati, odnosno ne mogu se stvarati objekti koji su tipa tih klasa, jer
sadrže jednu ili više apstraktnih metoda (funkcionalnosti), koje su nedefinisane.
Koriste se da bi se iz njih dalјe mogle izvesti konkretne klase koje se mogu
instancirati i koje moraju da implementiraju apstraktne metode iz bazne
(apstraktne) klase.
32. Šta znači pojam enkapsulacije u objektno orijentisanom programiranju?

Enkapsulacija (skrivanje) je programski mehanizam kojim se vrši skrivanje


podataka članova klase, kada se oni definišu kao private i implementacije (definicija)
metoda od korisnika, koji treba da znaju zašta je neka metoda namenjena da bi rešili
neki svoj konkretan problem, a i ne kako je ona realizovana tj. definisana (kako je
implementirano njeno telo). Pristup privatnim podacima klase se vrši samo preko
javnih metoda u klasi. Time sprečavamo korisnike klase da poremete unutrašnju
strukutru klase i da menjaju direktno njene metode.

33. Šta znači pojam nasleđivanja u objektno orijentisanom programiranju?

Nasleđivanje je postupak kojim se svi članovi osnovne (bazne) klase (nadklasa)


tj. i podaci članovi i metode članice prenose na drugu klasu koja se naziva
izvedenom klasom (podklasa). Koncept nasleđivanja je put ka formiranju
organizovanih familija (hijerarhija) klasa koje mogu dalje da se proširuju. Ukoliko
postoji nasleđivanje, ono se mora odrediti u definiciji klase. Osnovna klasa se
dodaje izvedenoj tako što se iza imena izvedene klase stave dve tačke (:). Na
primer:
public class MojaIzvedenaKlasa : MojaOsnovnaKlasa
{
//Clanovi klase
}

Kompajler ne dozvoljava da izvedena klasa ima veći pristup od osnovne klase. To


znači da se klasa definisana sa internal može naslediti od klase definisane sa public,
ali obrnuto ne važi.
34. Šta znači polimorfizam i na koja dva načina može da se ostvari?

Polimorfizam znaci “uzeti mnogo oblika”. Postoje dva nacina da se ostvari i


implementira polimorfizam:
1) Preklopljenom funkcijama (overloading) – funkcije istog naziva, a
različitog potpisa tj. različitog skupa arugmenta i njihovih tipova – Odluka o tome
koja će se funkcija pozvati ostvaruje se statičkim povezivanjem programa u
vreme prevodjenja.
2) Korišćenjem virtuelnih metoda – metode istog potpisa, tj. istog naziva i
istog tipa i skupa argumenta, a različite implementacije u nasledjenim klasama u
odnosu na baznu klasu (tačnije u baznoj klasi ove metode su virtuelne (virtual), a
u izvedenim klasama su nadjačane (override) jer imaju drugačiju implementaciju
od implementacije u baznoj klasi)
Odluka o tome koja će se funkcija pozvati vrši se dinamičkim (kasnim)
povezivanjem programa u vreme izvršavanja. Jer se u vreme prevođenja može
samo razrešiti da da li funkcija ima odgovarajući, naziv, povratni tip, kao i tip
argumenata. Pronalaženje odgovarajućeg tela funkcije može se vršiti samo u
trenutnku izvršavanja. Na taj način se dinamičkim (kasnim) povezivanejm
ostvaruje da se uvek poziva metoda koja odgovara klasi posmatranog objekta.

35. Koja su dva vida ponovnog korišćenja koda?

U klasičnom proceduralnom programiranju ponovno korišćenje koda se svodi na


pravljenje biblioteka funkcija opšte namene, koje se mogu ponovo koristiti. U
objektnoorijentisanom programiranju ponovno korišćenje koda podrazumeva
pravljenje biblioteke klasa opšte namene, koje se mogu ponovo koristiti.
Nasleđivanje predstavlja drugi vid ponovnog korišćenja koda, jer se metode
napisane u osnovnoj klasi nasleđuju u izvedenim klasama, pa ih ne treba ponovo
pisati. U izvedenim klasama treba pisati samo metode koje obezbeđuju dodatne
funkcionalnosti u odnosu na osnovnu klasu.
36. Koja su dva osnovna tipa konstruktora?

Konstruktor je specijalna metoda čnanica, klase koja ima isto ime kao i sama klasa,
a nema tip rezultata koji vraća. Konstruktor se poziva prilikom kreiranja
objekta klase i služi za inicijalizaciju podataka članova klase (atributa) sa
konkretnim vrednostima.
Sve definicije klasa sadrže bar jedan konstruktor bez argumenata koji se naziva
podrazumevani konstruktor (default constructor), koji nevidljivo inicijalizuje
podatke članove klase sa podrazumevanim (nultim) vrednostima. Podrazumevani
konstruktor nema argumente i ne mora se pisati u okviru definicije klase, ukoliko
klasa nema nijedan drugi definisani kronstuktor. Ukoliko se u klasi definiše još neki
konstruktor sa argumentima (konstruktor inicijalizacije) onda se mora definisati i
podrazumevani konstruktor.

U C#, konstruktori se pozivaju koristeći ključnu reč new za kreiranje objekata.

 Na primer, može se kreirati objekat klase Student koristeći


podrazumevani konstruktor na sledeći način:

Student s = new Student();

 Objekat klase Student sa podacima članovima imePrezime, brIndeksa i


prOcena, se može kreirati koristeći konstruktor inicijalizaije:

Student s = new Student("Ana Antic","134/2012",7.8);

Konstruktori mogu biti privatni (private) ili javni (public). Privatni konstruktor se ne
može koristiti izvan klase.

37. Kreirati objekat klase Student sa podacima clanovima imePrezime,


brIndeksa, i prOcena, koje treba inicijalizovati sa “Ana Antic ”,”134/2012”,
7.8 koriscenjem konstruktora inicijalizacije.

Student s = new Student(“Ana Antic”,”134/2012”,7.8)


38. Čemu služi ključna reč this? Da li statičke funkcije imaju this
pokazivač?

Ključna reč thisse koristi za koristi za pristup članovima klase iz:


 konstruktora - služi za referenciranje objekta kalse, koji se
kontruktorom kreira
 drugih metoda u klasi – služi za referenciranje objekta klase preko
koga se poziva određena metoda u klasi.

Statičke funkcije nemaju this pokazivač.

39. Dopuniti delove koda kako je naznačeno:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Klase
{
class Program
{
class Osoba
{
//privatni podaci clanovi
private string ime;
private int god;

//Definisati podrazumevani konstruktor


public Osoba()
{

}
//Definisati konstruktor inicijalizacije
public Osoba(string i, int g)
{

}
// Definisati svojsvo Ime:
public string GetSetIme
{

//Definisati svojstvo Godine:


public int GetSetGodine
{

}
//Definisati metodu za unos imena i prezimena osobe
public void unos()
{

//Nadjacati metodu ToString()


public override string ToString()
{

//Pronaci i ispisati podatke o najtarijoj osobi


static void najstarijaOsoba(Osoba[] niz)
{

static void Main(string[] args)


{

int n, i;
Console.WriteLine("Uneti broj osoba:");
n = Convert.ToInt32(Console.ReadLine());

//Kreirati niz osoba


Osoba[] nizOsoba = new Osoba[n];

for (i = 0; i < n; i++)


{
//Kreiranje pojedincnog elementa u nizu

//Poziv metode za unos

najstarijaOsoba(nizOsoba);

Console.ReadKey();

}
Resenje
namespace Klase
{
class Program
{
class Osoba
{
//privatni podaci clanovi
private string ime;
private int god;

//Definisati podrazumevani konstruktor


public Osoba()
{
this.ime = “ ”;
this.god = 0

}
//Definisati konstruktor inicijalizacije
public Osoba(string i, int g)
{
this.ime = i;
this.god = g;

}
// Definisati svojsvo Ime:
public string GetSetIme
{
get {return ime;}
set {ime = value;} //Ime koje budemo unosili prilikom
kreiranja objekta je “value” i ono ce biti dodeljeno promenjivoj ime.

//Definisati svojstvo Godine:


public int GetSetGodine
{
get {return god;}
set {god = value;}

//Definisati metodu za unos imena i prezimena osobe


public void unos()
{

Console.WriteLine(“Unesi ime osobe: ”);


this.ime = Console.ReadLine();
Console.WriteLine(“Uneti starost osobe:”);
this.god = Convert.ToInt32(Console.ReadLine();)

//konverzija se vrsi zato sto sve sto unesemo preko


konzole se tretira kao string

//Nadjacati metodu ToString()


public override string ToString()
{

return “Ime: ” + this.ime + “Godine: ” + this.godine;

}
}

//Pronaci i ispisati podatke o najtarijoj osobi


static void najstarijaOsoba(Osoba[] niz)
{
Osoba max = niz[0];
For(int i = 1; i < niz.Length; i++)
{

if (niz[i].GetSetGodine > max.GetSetGodine)


{
max = niz[i];
}
}

Console.WriteLine(“Podaci o najstarijoj osobi: ” +


max.ToString());
}

static void Main(string[] args)


{

int n, i;
Console.WriteLine("Uneti broj osoba:");
n = Convert.ToInt32(Console.ReadLine());

//Kreirati niz osoba


Osoba[] nizOsoba = new Osoba[n];

for (i = 0; i < n; i++)


{
//Kreiranje pojedincnog elementa u nizu

nizOsoba[i] = new Osoba()

//Poziv metode za unos

nizOsoba[i].unos();

najstarijaOsoba(nizOsoba);

Console.ReadKey();

}
40. Popuni kod kako je naznaceno
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Klase
{
class Program
{
class Pravougaonik
{
//privatni podaci clanovi klase
private double duzina;
private double sirina;

//Definisati podrazumevani konstruktor


public Pravougaonik()
{

//Definisati konstruktor inicijalizacije


public Pravougaonik(double d, double s)
{
}

public double GetSetDuzina


{

public double GetSetSirina


{

public double Povrsina()


{

public double Obim()


{
}
//Definisati metodu za unos duzina stranica
public void unos()
{

}
//Definisati metodu za ispis duzina stranica
public void ispis()
{

/*Definisati metodu za ispis pravougaonika u nizu pravougaonika cija


je povrisna veca od povrsine zadatog pravougaonika p*/
static void NadjiPravougaonikeVecePovr(Pravougaonik[] niz, int
n, Pravougaonik p) {
}

static void Main(string[] args)


{

int n,i;
//Definisati objekat prvavougaonik sa stranicama 5.2 i 2.3
Pravougaonik pr = ______________________________;

Console.WriteLine("Uneti broj pravougaonika");


n = Convert.ToInt32(Console.ReadLine());

Pravougaonik[] niz = new Pravougaonik[n];


for (i = 0; i < n; i++)
{

//Kreiranje pojedincnog elementa u nizu

//Poziv metode za unos

NadjiPravougaonikeVecePovr(niz, n, pr);

Console.ReadKey();

Resenje

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Klase
{
class Program
{
class Pravougaonik
{
//privatni podaci clanovi klase
private double duzina;
private double sirina;

//Definisati podrazumevani konstruktor


public Pravougaonik()
{
this.duzina = 0;
This.sirina = 0;
}

//Definisati konstruktor inicijalizacije


public Pravougaonik(double d, double s)
{
this.duzina = d;
this.sirina = s;
}

public double GetSetDuzina


{
get {return this.duzina;}
set {this.duzina = value;}
}

public double GetSetSirina


{
get {return this.sirina;}
set {this.sirina = value;}

public double Povrsina()


{
return 2 * duzina + 2 * sirina;
}

public double Obim()


{
}
//Definisati metodu za unos duzina stranica
public void unos()
{
Console.WriteLine (“Unesite duzinu”)
this.duzina = Convert.ToDouble(Console.ReadLine());
Console.WriteLine (“Unesite sirinu”)
this.sirina = Convert.ToDouble(Console.ReadLine());

}
//Definisati metodu za ispis duzina stranica
public void ispis()
{
Console.WriteLine ($”Duzina je {duzina}/n Sirina je {sirina}”)

/*Definisati metodu za ispis pravougaonika u nizu pravougaonika cija


je povrisna veca od povrsine zadatog pravougaonika p*/
static void NadjiPravougaonikeVecePovr(Pravougaonik[] niz, int
n, Pravougaonik p) {

for (int i = 0; i < n; i ++)


{
(if niz[i].Povrsina() > p.povrsina())
{
niz[i].ispis()
}
}

static void Main(string[] args)


{

int n,i;
//Definisati objekat prvavougaonik sa stranicama 5.2 i 2.3
Pravougaonik pr = new Pravougaonik (5.2, 2.3); //poziva se
konstruktor inicijalizacije

Console.WriteLine("Uneti broj pravougaonika");


n = Convert.ToInt32(Console.ReadLine());

Pravougaonik[] niz = new Pravougaonik[n];


for (i = 0; i < n; i++)
{

//Kreiranje pojedincnog elementa u nizu

niz[i] = new Pravougaonik ();

//Poziv metode za unos

niz[i].unos();

NadjiPravougaonikeVecePovr(niz, n, pr);

Console.ReadKey();

41. Dopuniti delove koda kako je naznačeno:

//Samo ovi delovi su uradjeni jer prethodni delovi ovog zadatka se rade isto kao i prvi delovi prethodna
dva

//Nadji srednju cenu automobila cija je marka jednaka zadatoj

static void NadjiSrednjuCenu(Automobil [] niz, Automobil zadati,


out bool ima, out double s) {
int i, br = 0;
s = 0;
ima = false;
for (i = 0; i < niz.Length; i++)
{
if (String.Compare(niz[i].GetSetMarka,
zadati.GetSetMarka) == 0)
{

ima = true;
S += niz[i].GetSetCena;
br++;

}
}
if (ima == true) s = s / br;

static void Main(string[] args)


{

int n,i;
bool ima;
double sr;
//Definisati objekat Automobil sa podacima: "fiat", 2005, 3000, "BG 123
EC"
Automobil zadati = new Automobil (“fiat”, 2005, 3000, “BG 123 EC”);
Console.WriteLine("Uneti broj automobila");

n = Convert.ToInt32(Console.ReadLine());

Automobil[] niz = new Automobil[n];

for (i = 0; i < n; i++)


{

//Kreiranje pojedincnog elementa u nizu

//Poziv metode za unos

niz[i] = new Automobil ();


niz[i].unos();
niz[i].ispis();

NadjiSrednjuCenu(niz, zadati, out ima, out sr);

if (ima == true)
//ispisati srednju cenu

Console.WriteLine(“Srednja cena je: ”, zadati.GetSetMarka, sr);

else
//ispisati da nema automobila cija je marka jednaka zadatoj

Console.WriteLine($“Nema automobila sa zadatom markom {0}”, zadati.GetSetMarka);

Console.ReadKey();

}
42. Dopuniti delove koda kako je naznačeno:

namespace Klase
{
class Program
{
public class Drzava
{
private string naziv;
private string glGrad;
private double povrsina;
private long brStanov;

//Klasa moze postojati bez konstruktora, tj. On postoji I ako nije napisan
u kodu I to je podrazumevani konstruktor!

//Definisati funkciju za odredjivanje gustine


public double Gustina() {
Return brStanov / povrsina;
}
//Definisati GetSet metode
public string GetSetNaziv
{
Get {return naziv};
Set {naziv = value};
}
public string GetSetGlGrad
{
Get {return glGrad};
Set {glGrad = value};
}
public double GetSetPovrsina
{

Get {return povrsina};


Set {povrsina = value};
}
public long GetSetBrStanovnika
{
Get {return brStanov};
Set {brStanov= value};

//Definisati funkcije za unos podataka o drzavi


public void unos()
{

Console.WriteLine(“Naziv Drzave: ”);


this.naziv = Console.ReadLine();

Console.WriteLine(“Glavni grad: ”);


this.glGrad= Console.ReadLine();

Console.WriteLine(“Povrsina: ”);
this.povrsina = Convert.ToDouble(Console.ReadLine());

Console.WriteLine(“Broj Stanovnika: ”);


this.brStanov= Convert.ToDouble(Console.ReadLine());

//Definisati funkcije za unos podataka o drzavi

public void ispis()


{

Console.WriteLine("\nNaziv drzave: {0}", naziv);


Console.WriteLine("Glavni grad: {0}", glGrad);
Console.WriteLine("Povrsina: {0}", povrsina); Console.WriteLine("Broj
stanovnika: {0}", brStanov); Console.WriteLine("Gustina naseljenosti je:
{0}", Gustina());

//Globalne funkcije su staticke


static public void Razmeni(Drzava a, Drzava b)
{
Drzava t = a;
a = b;
b = t;
}
//Definiati funkciju za sortiranje drzava po gustini
static public void Sortiranje(Drzava[] niz)
{

For (int i=0; i < niz.length-1; i++){


For (int j=j+1; j < niz.length; j++)
{
If (niz[i].Gustina() > niz[j].Gustina())
{
Razmeni(niz[i], niz[j]);
}
}
}

//Definisati funkciju za odredjivanje indeksa drzave sa maksimalnom


povrsioniom
static public void MaxPovrsina(Drzava[] niz)
{
Drzava max = niz [0];
For (int i = 1; i < niz.Length; i++)
{
If (niz[i].getSetPovrsina > max.GetSetPovrsina
{
Max = niz[i]
}
}

Console.WriteLine(“Drzava sa najvecom povrsinom je: ”);


Max.ispis();
}

Console.WriteLine("Podaci o drzavi sa najvecom povrsinom su: ");


Console.WriteLine();
}

static void Main(string[] args)


{
int n;
Console.WriteLine("Unesi broj drzava n: ");
n = int.Parse(Console.ReadLine());
Drzava[] niz = new Drzava[n];

for (int i = 0; i < n; i++)


{
//Kreiranje pojedincnog elementa u nizu
niz [i] = new Drzava();

//Poziv metode za unos


niz[i].unos();

}
Sortiranje(niz);

for (int i = 0; i < n; i++)


{
niz[i].ispis();
}
Console.WriteLine();
MaxPovrsina(niz);

Console.ReadKey();
}
}
}

43. Dopuniti delove koda kako je naznačeno:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Celzijus
{
private float stepeni;
//Definisati svojstvo samo za citanje koje vraca stepene
public float GetStepeni
{
get { return stepeni};
}
//Definisati konstruktor inicijalizacije

public Celzijus (float s)


{
stepeni=s;
}

/*Definisati javni staticki ekspicitni operator Farenhajt koji pretvara


zadate stepene Celzijusove skale u Farenhajte prema obrascu: (9.0f / 5.0f)
* step_cel + 32 i vraca ih*/
public static explicit operator Farenhajt(Celzijus c)
{
return new Farenhajt ((9.0f / 5.0f)* step_cel + 32);
}

}
class Farenhajt
{
private float stepeni;
//Definisati svojstvo samo za citanje koje vraca stepene
public float GetStepeni
{
get
{
return stepeni;
}
}
//Definisati konstruktor inicijalizacije

public Farenhajt(float f)
{
stepeni = f;
}

/*Definisati javni staticki ekspicitni operator Celzijus koji pretvara


zadate stepene Farenhajtove skale u Celzijuse prema obrascu: (5.0f / 9.0f)
* (far_step – 32) i vraca ih*/
public static explicit operator Celzijus(Farenhajt fahr)
{
return new Celzijus((5.0f / 9.0f) * fahr.GetStepeni – 32));
}
}
class Program
{
static void Main(string[] args)
{
// Primer sa temperaturama
Farenhajt far = new Farenhajt(80.0f);
Console.Write("{0} Farenhajt", fahr.Stepeni);

/*Kastovanje za ptretvaranje temperature iz Farenhajtove skale u skalu


stepena Celzijusa*/
Celzijus cel = (Celzijus)fahr;
//Sta ce ce ispisati?
Console.WriteLine(" = {0} Celzijus", cel.GetStepeni);
Ispisao je: 12,44 = Celzijus

/*Kastovanje za ponovno pretvaranje temperature iz Celziijusove skale u


skalu stepena Farenhajta*/
Farenhajt fahr1 = (Farenhajt)cel;

Console.Write("{0} Farenhajt", far.Stepeni);


Console.WriteLine(" = {0} Farenhajt", far1.Stepeni);
Console.ReadKey();
}
}

44 Dopuniti delove koda kako je naznačeno:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DictionaryGenericCollection
{

class Broj
{
public double vrednost;

//Definisati konstruktor inicijalizacije


public Broj(double b)
{
vrednost = b;
}

/*Definisati javni staticki implicitni operator koji


konvertuje Broj u double*/
public static implicit operator double(Broj d) { return d.vrednost;}

/*Definisati javni staticki implicitni operator koji konvertuje


double u Broj*/
public static implicit operator Broj(double d) { return new Broj(d);
{return new Broj (d);}
}

class Program
{
static void Main(string[] args)

{
Broj broj = new Broj(7);
//Koji operator se ovde poziva?
double broj1 = broj;
Poziva se: public static implicit operator double(Broj d)

//Koji operator se ovde poziva?


Broj broj2 = 12;
Poziva se: public static implicit operator Broj(double d)
Console.WriteLine("broj1 = {0} broj2 = {1}", broj1,
broj2.vrednost);
Console.ReadLine();
}
} }
45 Dopuniti delove koda kako je naznačeno:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class Complex


{
public int real;
public int imaginary;
//Definisati konstruktor inicijalizacije
}
public Complex (int r, int i)
{
real = r;
imaginary = i;
}

//Definisati javni staticki Complex operator – (Complex c1, Complex c2)


public static Complex operator = (Complex c1, Complex c2)
{
return new Complex()
}

//Definisati prepterecenu metodu ToString za prikaz kompleksnog broja


public override string ToString()
{
return (String.Format($“(real)+(imaginary)i“));
}
}
public static void Main()
{
Complex broj1= new Complex(7,2);
Complex broj2 = new Complex (3,4);
}

Complex razlika = broj1 –broj2;


//Sta ce se ispisati na ekranu?
Console.WriteLine(“Prvi kompleski broj: {0}“, broj1.ToString()); //7+2i
Console.WriteLine(“Drugi kompleski broj: {0}“, broj2.ToString()); //3+4i
Console.WriteLine(“Razlika dva kompleska broj: {0}“, razlika. ToString());
ssss//4-2i
Console.Readkey();
}
}
}

46 Koju ključnu reč treba staviti ispred podataka članova osnovne klase, da bi oni bili
dostupni funkcijama članicama klasa izvedenih iz date klase?

Da bi podaci članovi osnovne klase bili dostupni funkcijama članicama klasa izvedenih iz date klase, potrebno
ih je korišćenjem kljucne reči protected proglasiti zaštićenim članovima osnovne klase, jer funkcije članice
izvedenih klasa nemaju pravo pristupa privatnim članovima osnovne klase.

47 Da li funkcije članice izvedenih klasa imaju pravo pristupa privatnim članovima


osnovne klase?

Nemaju pravo, moraju da se proglase da su protected da bi obezbedili pristup osnovnim


podacima osnovne klase.
48 Pri kreiranju objekta izvedene klase, koji konstruktor se najpre poziva,
konstruktor izvedene klase ili konstruktor osnovne klase.

Pri kreiranju objekta izvedene klase, najpre se poziva konstruktor osnovne klase, kojim se inicijalizuju
nasleđeni podaci članovi iz osnovne klase, pa se zatim poziva konstruktor izvedene klase kojim se inicijalizuju
podaci članovi, koji pripadaju samo izvedenoj klasi.

49 Korišćenjem koje ključne reči se u konstruktoru izvedene klase može se eksplicitno


u listi inicijalizacije članova pozvati konstruktor bazne klase?

U konstruktoru izvedene klase može se eksplicitno u listi inicijalizacije članova pozvati konstruktor bazne klase,
korišćenjem ključne reči base.

50 U čemu su iste, a po čemu se razlikuju virtuelne funkcije u osnovnoj i izvedenim


klasama? Koja ključna reč stoji ispred virtuelnih funkcija u osnovnoj klasi, a koja
ispred virtuelnih funkcija u izvedenim klasama?

Virtuelna funkcija je funkcija članica osnovne klase ispred čije deklaracije stoji ključna
reč virtual. Virtuelna funkcija osnovne klase ima istu deklaraciju (potpis) u izvedenim klasama a drugačiju
definiciju (Razlikuju se po implementaciji) . Ovim se omogućuje redefinisanje (nadjačavanje) funkcije osnovne
klase u izvedenim klasama i poznato je pod pojmom overriding.

51 Da li se virtuelna funkcija osnovne klase mora redefinisati (nadjačati) u svim


klasama izvedenim iz date klase?

Virtuelna funkcija osnovne klase ne mora se redefinisati (nadjačati) u svim klasama izvedenim iz date klase. U
klasama izvedenim od bazne klase sve virtuelne funkcije koje se definišu imaju ključnu reč ovveride ispred
potpisa.

52 Kod kojih metoda se ne sme koristiti ključna reč virtual?

U C# programskom jeziku ključnu reč virtual ne možete koristiti kod apstraktnih metoda, statičnih metoda,
nadjačanih metoda i privatnih metoda.

53 Kada se vrši odlučivanje koja će se virtuelna funkcija pozvati i kako se naziva taj
pojam?

Kada se virtuelna funkcija poziva preko reference na osnovnu klasu, izvršava se ona funkcija koja pripada klasi
objekta na koga ta referenca ukazuje. Odlučivanje koja će se virtuelna funkcija pozvati, obavlja se u toku
izvršavanja programa - dinamički i poznato je pod pojmom polimorfizam.

54 Dopuniti delove koda kako je naznačeno:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication19
{
class Program
{
public class Osoba
{
protected string imePrezime;
//Definisati podrazumevani konstruktor
public Osoba()
{
imePrezime = String.Empty;
}
//Definisati konstruktor inicijalizacije
public Osoba(string ip)
{
imePrezime = String.Copy(ip)
}
//Definisati GetSet svojstvo
public string GetSetIP
{
get {return imePrezime; }
set {imePrezime = value;}

}
//Definisati virtuelnu metodu za unos imena i prezimena
public virtual void Unos()
{
Console.WriteLine(“Unesi ime I prezime osobe:”);
imePrezime = Console.ReadLine();

}
//Definisati virtuelnu metodu za ispis imena i prezimena
public virtual void Ispis()
{
Console.WriteLine($”Ime I prezime osobe je (imePrezime)”);

public class Zaposleni : Osoba


{
protected float cenaSataRada;
protected int brSatiRada;
//Definisati podrazumevani konstruktor

public Zaposleni():base()
{
cenaSataRada=0.0f;
}
//Definisati konstruktor inicijalizacije
public Zaposleni(string ip, float cs, int bs): base(ip)
{
CenaSataRada = cs;
brSatiRada = bs;

}
/*Definisati metodu za izracunavanje plate takko sto se cena rada po satu
pomnozi sa brojem sati rada*/
public virtual float Plata()
{
return cenaSataRada * brSatiRada;
}
//Definisati metodu za unos
public override void Unos()
{
base.Unos();
Console.Write(“Unesi cenu sati rada: ”);
cenaSataRada = Convert.ToSingle(Console.ReadLine());
Console.WriteLine(“Unesi broj sati rada: ”);
brSatiRada = Convert.ToInt32(Console.ReadLine());
}
//Definisati metodu za ispis
public override void Ispis()
{

base.Ispis();
Console.WriteLine($”Cena sati rada je: (cenaSataRada)”);
Console.WriteLine($”Broj sati rada: (brSatiRada)”);

}
}

public class NapredniZaposleni : Zaposleni


{
private float stimulacija;
//Definisati podrazumevani konstruktor
public NapredniZaposleni():base()
{
stimulacija = 0.0f;

}
//Definisati konstruktor inicijalizacije
public NapredniZaposleni(string ip, float cs, int bs, float
sssssssssss):base(ip,cs,bs) {
stimulacija = s;
}
//Definisati GetSet metodu
public float GetSetStimulacija
{
get { return stimulacija; }
set { stimulacija = value;}
}
//Definisati metodu za unos
public override void Unos()
{
base.Unos();
Console.WriteLine("Unesi vrednost stimulacije:");
stimulacija = Convert.ToSingle(Console.ReadLine());
}
//Definisati metodu za ispis
public override void Ispis()
{
base.Ispis();
Console.WriteLine($"Stimulacija naprednog zaposlenog je
{stimulacija)”;

}
/*Definisati metodu za izracunavanje plate takko sto se cena rada po satu
pomnozi sa brojem sati rada i na to doda simulacija*/
public override float Plata()
{

return (cenaSataRada * brSatiRada + stimulacija);

}
/* Pronaci i ispisati podatke o naprednim zaposlenim cija je plata veca od
plate zadatog naprednog zaposlenog*/
public static void IspisVecih(List<NapredniZaposleni> lista,
NapredniZaposleni z)
{
int i;
for (i=0; i< lista.Count; i++)
{
if(lista[i].Plata() > z.Plata())
{
lista[i].ispis();
}

}
static void Main(string[] args)
{
Osoba o1 = new Osoba("Ivan Markovic");
Zaposleni z1 = new Zaposleni("Dragan Mirkovic", 400.78F, 160);
NapredniZaposleni nz1 = new NapredniZaposleni("Bojan Lazic",
400.84F, 160, 5000);
o1.Ispis();
z1.Ispis();
nz1.Ispis();

Console.WriteLine("Unesi broj naprednih zaposlenih n:");


int n = Convert.ToInt32(Console.ReadLine());

List<NapredniZaposleni> lista = new List<NapredniZaposleni>();

Console.WriteLine("Uneti podatke o naprednim zaposlenim:");


int i;
for (i = 0; i < n; i++)
{

//Kreiranje jednog ojekta klase NapredniZaposleni


NapredniZaposleni nz = new NapredniZaposleni ();

//Poziv metode za unos i dodavanje u listu

nz.Unos();
lista.Add(nz);
}

IspisVecih(lista, nz1);

Console.WriteLine("Press any kay to continue..." +


Environment.NewLine);

Console.ReadKey();
}
} }
55 Dopuniti delove koda kako je naznačeno: (Scroll je kroz ovo pa sam samo
zalepio screenshots)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nasledjivanje
{
class Program
{

public class Programer


{
protected string ime;
protected int brSati;
protected double cenaSata;
protected int godineStaza;

//Definisati podrazumevani konstruktor


public Programer()
{

}
//Definisati konstruktor inicijalizacije
public Programer(string i, int bs, double cs, int gs)
{

}
//Definisati GetSet metode
public string GetSetIme
{

public int GetSetBrSati


{

}
public double GetSetCenaSata
{
}

public int GetSetGodineStaza


{

}
//Definisati virtuelnu metodu za unos
public virtual void Unos()
{

}
//Definisati virtuelnu metodu za ispis
public virtual void Ispis()
{

}
/*Definisati metodu za izracunavanje plate takko sto se cena rada po satu
pomnozi sa brojem sati rada i tome doda proizvod godina staza i koeficijenta
0.4*/

public virtual double Plata()


{

}
public class ProgramerFirme : Programer
{
private string nazivFirme;

//Definisati podrazumevani konstruktor


public ProgramerFirme()
{

}
//Definisati konstruktor inicijalizacije
public ProgramerFirme(string nf)
{

}
//Definisati GetSet metode
public string GetSetNazivFirme
{

}
//Definisati virtuelnu metodu za unos
public override void Unos()
{

}
//Definisati virtuelnu metodu za ispis
public override void Ispis()
{

/*Definisati metodu za izracunavanje plate takko sto se cena rada po satu


pomnozi sa brojem sati rada i keficijentom 1.1 i tome doda proizvod godina
staza i koeficijenta 0.4*/

public virtual double Plata()


{
}

//Sortirati programere prema plati

public static void Sort(List <Programer> lista)


{

static void Main(string[] args)


{
int n, i;
Console.WriteLine("Uneti broj programera: ");
n = Convert.ToInt32(Console.ReadLine());

List <Programer> lista = new List<Programer>();

//Unos podataka o programerima i proracun plate


//POLIMORFIZAM
for (i = 0; i < n; i++)
{

Sort(lista);

//Ispisati programere firme


for (i = 0; i < n; i++)

lista[i].Ispis();

Console.WriteLine("Press any key to continue..." +


Environment.NewLine);
Console.ReadLine();
}
}
}
56 Za koju klasu se kaže da je apstraktana? Da li apstraktna klasa može da se
instancira?

Svaka klasa koja sadrži ključnu reč abstract i koja ima najmanje jednu apstraktnu metodu se naziva apstraktna
klasa. Ne može da se instancira iz razloga jer ima metode koje nisu implementirane, koje nemaju telo i ne može
se praviti objekat apstraktne klase.

57 Šta je to apstraktna metoda i da li ona mora da bude nadjačana u svakoj


klasi koja nasleđuje baznu klasu?
Apstraktna metoda je metoda koja sadrži ključnu reč abstract i koja nema ni telo ni implementaciju.
Apstraktna klasa ne može da se instancira dok svaka njena apstraktna metoda mora da bude nadjačana i
implementirana u svakoj klasi koja nasleđuje apstraktnu klasu (imaju ključnu reč ovveride ispred potpisa).

58 Da li apstraktna klasa može da sadrži ključnu reč sealed ?


Znači za statičku klasu se podrazumeva da je sealed i bez ključne reči sealed dok apstraktna klasa ne može da
sadrži ključnu reč sealed jer je abstract kontradiktorno od sealed.

59 Da li su apstraktne metode automatski virtuelne i da li se sme koristiti


ključna reč virtual ispred apstraktnih metoda? (1:38:49)

Apstraktne metode su automatski virtualne ali ako koristite ključnu reč virtual dobićete grešku (Programeri C#
nikad ne zovu apstraktnu metodu virtualnom metodom, kao što to rade C++ programeri; već je zovu samo
apstraktna metoda).

Kad nasledite apstraktnu klasu vi morate obezbediti funkcionalnost za svaku apstraktnu metodu u apstraktnoj
klasi.
60. Dopuni kod kako je naznaceno

namespace DictionaryGenericCollection
{
public abstract class Zaposleni
{
//IZOSTAVITI PRIVATNE PODATKE CLANOVE
//Definisati skraceni oblik get set svojstava
public int ID {get; set;}
public string Ime {get; set;}
public string Prezime {get; set}
public string Zanimanje {get; set}

/*Definisati metodu koja vraća ime i prezime koriscenjem => umesto


return */
public string PunoIme() => Ime + “ “ + Prezime;
// Znak => oznacava da ne mora da ide return

public abstract decimal Plata();

//Definisati metodu za ispis


public virtual void Ispis()
{
WriteLine(“Id zaposlenog” + ID)
WriteLine(“Puno Ime” + ime)
WriteLine(“Zanimanje” + zanimanje)

}
class ZaposleniPunoVreme : Zaposleni
{
//IZOSTAVITI PRIVATNE PODATKE CLANOVE
//Definisati skraceni oblik get set svojstava
public decimal MesecnaPlata {get; set; }
public decimal PlataUvecanje { get; set }

//Svojstvo Status je samo za citanje "Zaposleni puno radno vreme"


public string Status { get } = “Zaposleni rade puno radno vreme”;

/*Nadjacati metodu Plata()za iračunavanje plate kao zbir mesečne


plate i uvećanja plate, koriscenjem => umesto return */

public override decimal Plata() => MesecnaPlata + PlataUvecanje;

/*Definisati nadjacanu metodu Ispis() u kojoj se ispisuje i status


i plata*/
public override void Ispis()
{
base.Ispis();
WriteLine(“Status: ” + Status);
//ispis plate sa novcanom valutom
String plata = String.Format{“{0:c}”, Plata()};
WriteLine(“Plata: ” + plata);

class ZaposleniPoUgovoru : Zaposleni


{
//IZOSTAVITI PRIVATNE PODATKE CLANOVE
//Definisati skraceni oblik get set svojstava

public short RadniDani { get; set; }


public decimal CasovnaPlata { get; set; }
//Definisati svojstvo Status samo za citanje "Po ugovoru zaposleni"
public string Status {get} = “Po ugovoru zaposleni”;

/*Nadjacati metodu Plata()za iračunavanje plate kao iračunavanje


plate kao proizvod casovne plate, broja radnih dana i broja 8, koriscenjem
=> umesto return */

public override decimal Plata() => CasovnaPlata * (RadniDani * 8);

/*Definisati nadjacanu metodu Ispis() u kojoj se ispisuje i status i plata*/

public override void Ispis()


{

base.Ispis();
//ispis plate sa novcanom valutom
String plata = String.Format{“{0:c}”, Plata()};
WriteLine(“Plata: ” + plata);
WriteLine(“Status: ” + Status);

}
class Program
{

static void Main(string[] args)


{

WriteLine("Plata izvestaj" + Environment.NewLine);

/* U glavnom programu definisati objekat klase ZaposleniPunoVreme sa sledećim


vrednostima ID=1001, Ime=„Milan“, Prezime= “Radovanovic“, Zanimanje=“Programer“,
MesecnaPlata= 84375.85, PovecanjePlate = MesecnaPlata/5 i objekat klase

ZaposleniPunoVreme Zaposleni1 = new ZaposleniPunoVreme ();

ZaposleniPunoVreme Zaposleni1 = new ZaposleniPunoVreme();


Zaposleni1.ID = 1001;
Zaposleni1.Ime = "Milan";
Zaposleni1.Prezime = "Radovanovic";
Zaposleni1.Zanimanje = "Programmer";
Zaposleni1.MesecnaPlata = 84375.85M;
Zaposleni1.PlataUvecanje = Zaposleni1.MesecnaPlata / 5; Zaposleni1.Ispis();

WriteLine(Environment.NewLine + new String('-', 20) +


Environment.NewLine);
ZaposleniPoUgovoru Zaposleni2 = new ZaposleniPoUgovoru();
Zaposleni2.ID = 5457;
Zaposleni2.Ime = "Milica";
Zaposleni2.Prezime = "Bojovic";
Zaposleni2.Zanimanje = "Designer";
ZaposeniPoUgovoru sa sledećim vrednostima ID=5457, Ime=„Milica“, Prezime=
“Bojovic“, Zanimanje=“Designer“, RadniDani= 20, CasovnaPlata=250.64 i
pozvati metodu Ispis() za svaki objekat.*/

ZaposleniPunoVreme Zaposleni1 = new ZaposleniPunoVreme();

WriteLine(Environment.NewLine + new String('-', 20) +


Environment.NewLine);
ZaposleniPoUgovoru Zaposleni2 = new ZaposleniPoUgovoru();

ReadKey();

}
61. Da li se statičke klase mogu instancirati i nasleđivati? Da li svi članovi
statičke klase moraju biti statički?

Statička klasa je u osnovi isto što i klasa koja nije statička, ali sa tom razlikom što se
statička klasa ne može instancirati. Statičke klase se jednostavno prave umetanjem
ključne reči static ispred ključne reči class
prilikom pravljenja klase, ali i svaka statična klasa mora da sadrži samo statičke
članove3.

62. Pozvati metodu Povrsina(int, int) za statičnu klasu Rectangle, ako


su dužine stranica 5 i 7, a zatim pozvati istu metodu za nestatičnu klasu
Kvadrat, ako je dužina stranice 6.

WriteLine(Rectangle.Povrsina(5, 7));
WriteLine(Rectangle.Povrsina(8, 9));

63. Pozvati statičnu metodu Povrsina(int, int) za nestatičnu klasu


Rectangle, ako su dužine stranica 5 i 7, a zatim pozvati istu metodu za
nestatičnu klasu Kvadrat, ako je dužina stranice 6.

Rectangle rectangle = new Rectangle();

WriteLine(Rectangle.Povrsina(5, 7));
WriteLine(Rectangle.Povrsina(8, 9));
64. Koristiti using direktivu da preko prostora imena (namespace)
StaticClass u kome se nalazi klasa Rectangle, proglasimo klasu
Rectagnle kao statičku, a zatim pozvati metodu Povrsina(int, int) za
nestatičnu klasu Rectangle, ako su dužine stranica 8 i 9.

using static StaticClass.Rectangle; // StaticClass je ime programa

Tada možete pisati još kraće kod.


WriteLine(Povrsina(5, 7));
WriteLine(Povrsina(8, 9));

65. Da li kod statičkih klasa statički konstruktor sme da ima parametre i da


bude javni bude javni? Da li može u klasi da bude više od jednog statičkog
konstruktora?

Kod statičkih klasa konstruktor ne sme da ima parametre niti sme da bude
javni što u neku ruku i ima smisla. Kao i svaki član čak i statički konstruktor
koristi ključnu reč static. Konstruktor statičke klase može biti samo jedan i on
se uvek implicitno poziva bez ključne reči new.
static double PI; static Circle()
{
PI = Math.PI;
}

66. U cemu je razlika izmenju statickog I ne statickog podatka, tj koji se


podatak deli a koji se kopira u svakoj instanci klase?

Znači statična promenjiva postaje deljena u celoj klasi. Da promenjiva nije statična,
da pravi kopiju same sebe u memoriji u svim primercima klase, trošili bi nepotrebno
memoriju.
67. Popuni kod kako je naznaceno
namespace StackGenericCollection
{
class Pravougaonik
{

/* Definisati staticku metodu u kojoj se izracunava povrisna pravougaonika


kao sirina*duzina*/
public static int Povrsina(int sirina, int duzina)
{
return sirina * duzina;

}
}

public static class Krug


{
static double PI;

/* Definisati staticki konstruktor u kome se staticki clan


inicijalizuje sa Math.PI*/
static Krug()
{
PI = Math.PI
}

// Definisati staticku metodu u kojoj se izracunava povrisna kruga


kao r*r*PI
public static double Povrsina(double r)
{
return r*r*PI;

class Program
{
static void Main(string[] args)
{
Pravougaonik p1 = new Pravougaonik();

//Ispisati provrsinu pravougaonika stranice 5 i 7


WriteLine("Povrsina pravougaonika za stranice 5 i 7 je: " +
Pravougaonik.Povrsina(5, 7));
//Ispisati provrsinu pravougaonika stranice 8 i 9
WriteLine("Povrsina pravougaonika za stranice 8 i 9: " +
Pravougaonik.Povrsina(8, 9));
WriteLine(Environment.NewLine + new String('-', 20) +
Environment.NewLine);

WriteLine("Staticna klasa:" + Environment.NewLine);


//Ispisati provrsinu kruga poluprecnika 5.45

WriteLine("Povrsina kruga za poluprecnik 5.45: " +


Krug.Povrsina(5.45));

//Ispisati provrsinu kruga poluprecnka 7.56


WriteLine("Povrsina kruga za poluprecnik 7.56: " +
Krug.Povrsina(7.56));

ReadKey();

}
} }
68. Popuni

Using static System.Console; //da bi se moglo pisati samo WriteLine


namespace StackGenericCollection
{
class Tacka
{
public int X, Y;

public Tacka(int X, int Y)


{
this.X = X;
this.Y = Y;
}

public override bool Equals(object obj)


{

if (obj.GetType() != this.GetType()) return false;

Tacka P = (Tacka)obj;

//Proveriti da li su X i Y koordinate jednake za tacku P i i objekat this


return ((this.X === P.X) && (this.Y = B.Y));
}

//Vratiti x iskljucivo ili y kao Hash kod


public override int GetHashCode() => this.X ^ this.Y;

//Vratiti kopiju tacke koriscenjem MeberwiseClone() metode


public Tacka Copy() => (Tacka) this.MemberwiseClone();

//Nadjacati metododu ToString tako da se koordinate tacke ispisuju kao (x,


y)
public override String ToString() => ($”({X}, {Y})”);

class Program
{
static void Main(string[] args)
{

Tacka p1 = new Tacka(3, 5);


//Pozvati metodu ToString() za tacku p1
WriteLine("Tacka 1: " + p1.ToString());
//Pozvati metodu ToString() za tacku p2
Tacka p2 = new Tacka(5, 3);
WriteLine("Tacka 2: " + p2.ToString());

WriteLine(new String('-', 20));

//Kopirati objekat p1 u p3
Tacka p3 = p1.Copy();
//Pozvati metodu ToString() za tacku p2
WriteLine("Tacka 3: " + p3.ToString());

WriteLine(new String('-', 20));

//Naznaciti sta ce se ipsisati true ili false na liniji


WriteLine("Da li je Tacka 3 tipa Tacka: " + (p3.GetType() ==
typeof(Tacka))); TRUE

//Naznaciti sta ce se ipsisati true ili false na liniji


WriteLine("Da li je Tacka 1 jednaka Tacka 3: " + p1.Equals(p3));TRUE
//Naznaciti sta ce se ipsisati true ili false na liniji
WriteLine("Da li je Tacka 3 referencira na Tacka 1: " +
Tacka.ReferenceEquals(p3, p1)); FALSE, jer referenceEquals kopira istu vrednost
ali ne nalazi se na istom prostoru u memoriji i zbog toga nije isto

WriteLine(new String('-', 20));

ReadKey();

}
}
}

6 9. Za koje klase _je pogodno praviti indeksere? Kojim članovima klase su


indekseri slični i da li imaju naziv? Koja ključna reč se koristi pri definisanju
indeksera?

 Indeksere je pogodno praviti za klase koje sadrže podatke članove koji su


kolekcija podataka u cilju lakšeg pristupa elementima kolekcije
 Slični su get i set svojstvima
 Nemaju naziv, svi se zovu this

Deklaracija indeksera je veoma slicna deklaraciji svojstva, ali umesto naziva piše se ključna reč this,
posle koje dolaze uglaste zagrade [ ] u kojima se nalazi jedan ili više indeksa. Zatim se indekser
nastavlja pisati kao svojstvo i takođe sadrži pristupne metode get i set

7 0. Da li se u klasi može definiati više od jednog indeksera i ako može po čemu


se oni moraju razlikovati?
Moguće je deklarisati i više indeksera u klasi/strukturi
Moze jedna klasa imati vise indeksera ali se moraju razlikovati po tipu indeksera.
class Program
{
public class NajStudenti
{
private string[] niz = new string[3];

/* Definisati indekser koji u get delu vraća i-ti element u nizu najboljih
studenata pod uslovom da je indeks u opsegu od 0 do 3 i set deo u kome se
setuje (menja) i-ti elemenat niza pod uslovom da je indeks u opsegu od 0
do 3*/
Public string this [int i]{
get {

If (i >= 0 && i < 3){ return niz[i] }


Else{ return null; }

Set {
If (I>= 0 && i < 3)
{
niz[i] = value;
}
}
}

}
public class Program
{
/* U glavnom programu definisati jedan objekat klase NajStudenti, sa
najboljim studentima: “Jovan Kostic“, „Nevena Stojic“ i „Ana Jovanovic“ i
ispisati ih na ekranu
*/
public static void Main()
{
NajStudenti student = new NajStudenti();
Student[0] = “Jovan Kostic”;
Student[1] = “Nevana Stojic”;
Student[3] = “Ana Jovanovic”;

Console.WriteLine(“Najbolji studenti su: ”);


for (int i = 0; i < 3; i++){
Console.WriteLine(“{0}”, student[i])
}

Console.ReadKey();

}
}

80. Da li klasa koja implementira interfejs mora da implemetira sve javne


metode u interfejsu?

Implementacija interfejsa tj. svih javnih metoda sadržanih u interfejsu se u


potpunosti prepušta implementirajućoj klasi.

81. U čemu se sastoji sličnost, a u čemu razlika između apstraktne klase i


interfejsa?

Interfejs predstavlja jednu vrstu ugovora da klasa koja implementira interfejs mora da
implementira metode navedene u interfejsu. Interfejsi jesu slični apstraktnim klasama, samo što
ne mogu da sadrže ništa osim navedenih potpisa metoda i nije retkost da se interfejsi koriste
zajedno sa apstraktnim klasama da bi se gradila programerska radna okruženja koja se proširuju.

82. Da li klasa može da nasleđuje više osnovnih klasa i da li klasa može da


implementira više interfejsa?

Klasa ne mogu nasledjivati vise osnovnih klasa ali zato mogu da implementiraju vise
interfejsa, kao i sto interfejs moze da poziva druge interfejse.

83. Da li intefrefjs može da sadrži podatke članove? Da li se ispred metoda u


interfejsu moze koristiti kljucna rec public?

Interfejs ne može da sadrži podatke članove (polja) već samo deklaracije (potpise) javnih
metoda, ispred kojih se ne sme upotrebiti kljucna rec public.
84. Dopuniti delove koda kako je naznačeno:
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DictionaryGenericCollection
{
/* Definisati interfejs IBankAccount sa metodama void Pozajmica(decimal
iznos), void Uplata(decimal iznos) i jednim svojstvom decimal Balans, koje
je samo za čitanje. */

interface IBankAccount
{

}
/* Definisati dve klase SaverAccount i GoldAccount, koje ekspicitno
implementiraju ovaj interfejs i sadže privatni podatak član balans */

class SaverAccount:IBankAccount
{
private decimal balans;

/* Eksplicitno implementirati metodu Uplata, na taj nacin sto se balans


uvecava za iznos */

/* Eksplicitno implementirati metodu Pozajmica, na taj nacin sto se balans


umanjuje za iznos, ukoliko je balans veci od iznosa. U suprotnom slučaju
uvecava za iznos ispisati na ekranu da je pokusaj pozajmice neuspesan */
decimal IBankAccount.Balans { get; }

public override string ToString()


{
return String.Format("Europe Bank Saver Account: Balans =
{0,6:C}", balans);

class Program
{
static void Main(string[] args)
{

string Ime = "Milan";


string Prezime = "Knezevic";

WriteLine(Ime + " " + Prezime);

//Kreirati jeda primerak klase SaverAccount a1


___________________________________

//Izvrsiti uplatu 200


a1.Uplata(250);
//Sta ce se ispisati
WriteLine(a1.ToString());//__________________

//Izvrsiti uplatu 500


a1.Uplata(500);
//Sta ce se ispisati
WriteLine(a1.ToString());//__________________

//Pozajmiti 1000
a1.Pozajmica(1000);
//Sta ce se ispisati
WriteLine(a1.ToString());//__________________

//Pozajmiti 400
a1.Pozajmica(400);
//Sta ce se ispisati
WriteLine(a1.ToString());//__________________

WriteLine(Environment.NewLine + new String('-', 20) +


Environment.NewLine);

ReadKey();

}
}

RESENJE
Dopuniti delove koda kako je naznačeno:
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DictionaryGenericCollection
{
/* Definisati interfejs IBankAccount sa metodama void Pozajmica(decimal
iznos), void Uplata(decimal iznos) i jednim svojstvom decimal Balans, koje
je samo za čitanje. */

interface IBankAccount
{

void Pozajmica (decimal iznos);


void Uplata (decimal iznos);
decimal Balans { get; }

}
/* Definisati dve klase SaverAccount i GoldAccount, koje ekspicitno
implementiraju ovaj interfejs i sadže privatni podatak član balans */

class SaverAccount:IBankAccount
{
private decimal balans;

/* Eksplicitno implementirati metodu Uplata, na taj nacin sto se balans


uvecava za iznos */

void IBankAccount.Uplata (decimal iznos);


{
balans = balans + iznos;
}

/* Eksplicitno implementirati metodu Pozajmica, na taj nacin sto se balans


umanjuje za iznos, ukoliko je balans veci od iznosa. U suprotnom slučaju
uvecava za iznos ispisati na ekranu da je pokusaj pozajmice neuspesan */

void IBankAccount.Pozajmica(decimal iznos);


{
if(balans >= iznos){
balans = balans - iznos;
}

else{
Console.WriteLine(“Neuspesan pokusaj pozajmice!”);
}
}

decimal IBankAccount.Balans { get; }

public override string ToString()


{
return String.Format("Europe Bank Saver Account: Balans =
{0,6:C}", balans);

}
class Program
{
static void Main(string[] args)
{

string Ime = "Milan";


string Prezime = "Knezevic";

Console.WriteLine(Ime + " " + Prezime);

//Kreirati jeda primerak klase SaverAccount a1


IBankAccount a1 = new SaverAccount();

//Izvrsiti uplatu 200


a1.Uplata(200);
//Sta ce se ispisati
Console.WriteLine(a1.ToString());
//Europe Bank Saver Account: Balans = 200

//Izvrsiti uplatu 500


a1.Uplata(500);
//Sta ce se ispisati
WriteLine(a1.ToString());
//Europe Bank Saver Account: Balans = 700

//Pozajmiti 1000
a1.Pozajmica(1000);
//Sta ce se ispisati
WriteLine(a1.ToString());
/Neuspesan pokusaj pozajmice!

//Pozajmiti 400
a1.Pozajmica(400);
//Sta ce se ispisati
WriteLine(a1.ToString());
//Europe Bank Saver Account: Balans = 700

WriteLine(Environment.NewLine + new String('-', 20) +


Environment.NewLine);

ReadKey();

}
}
}

4.7.Kad se koristi jednostavna klasa, kad apstraktna klasa a kad interfejs?


Apstraktne klase nameću strožiju strukturu koda i definišu podrazumevani oblik
realizovanja. Međutim ako poslovna logika nalaže mnoštvo klasa i njihovo
nasleđivanje tada su interfejsi rešenje. Ukoliko nemate potrebe za proširivanjem i
nadogradnjama poslovanja, onda je najbolje klasu ostaviti na nivou jednostavne klase.
Sve ostalo je na nivou poslovne logike.
36. Sta su to delegati ?

37. Na koje metode mogu referencirati delegati ? Kako se delegati izvrsavaju ?

A) Delegati su reference na metode.


B) Delegat može referencirati pokazivati na bilo koju metodu koja ima isti potpis kao
i delegat. Delegati se izvršavaju dinamički, u toku izvršavanja programa.

namespace SimpleDelegate
{
class Program
{
/*Definisati delegat Ispis tipa void sa string parametrom
delegate void Ispis (string parametar);
static public DateTime time;

static void LogIn(string name)


{
time = DateTime.Now;
WriteLine(name + " upisan/a " + time + Environment.NewLine);

}
static void LogOut(string name)
{
time = DateTime.Now;
WriteLine(name + " ispisan/n " + time + Environment.NewLine);

static void Main(string[] args)


{
Ispis gost1, gost2, gost3, gost4;
string line = new String('-', 20);

/*Referencirati delegat gost1 na funkciju LogIn*/


gost1 = new Ispis (LogIn);
/*Referencirati delegat gost2 na funkciju LogOut*/
gost2 = new Ispis (LogOut);

/*Referencirati delegat gost3 na gost1 i gost2*/


gost3 = gost1 + gost2;

/*Referencirati delegat gost4 na gost3, dereferencirati gost1*/


gost4 = gost3 - gost1;

WriteLine(line + Environment.NewLine);

gost1("Milan Jovanovic");

//Sta ce se ispisati na ekranu?


WriteLine(line); Milan Jovanovic upisan/a

gost2("Jovana Tosic");
//Sta ce se ispisati na ekranu?
WriteLine(line); Jovana Tosic ispisan/a

gost3("Jovana Tosic");
//Sta ce se ispisati na ekranu?
WriteLine(line); Jovana Tosic upisan/a
Jovana Tosic ispisana/a

gost4("Petar Zaric");
//Sta ce se ispisati na ekranu?
WriteLine(line); Petar Zaricc ispisana/a

WriteLine("Press any key to continue...");


ReadKey();

}
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UsingDelegatForFiltering
{
//Definisati javnu strukturu Zaposleni sa podacima clanovima ImePrezime i
Plata
public struct Zaposlelni
{

class Program
{
public delegate bool FilterDelegate(Zaposlelni zaposlelni);
//Proveriti da li je plata manja od 65000 i vratiti rezultat
static bool IsMinimum(Zaposlelni zaposlelni)
{
_____________________________________:
}
//Proveriti da li je plata veca od 65000, a manja od 90000 i vratiti rezultat
static bool IsMedian(Zaposlelni zaposlelni)
{
_____________________________________:
}
//Proveriti da li je plata veca od 90000 i vratiti rezultat
static bool IsHigh(Zaposlelni zaposlelni)
{
_____________________________________:
}

static void PrikaziPlate(string title, List<Zaposlelni> lista,


FilterDelegate filter)
{
WriteLine(title + Environment.NewLine);

foreach (Zaposlelni zaposlelni in lista)


{
if (filter(zaposlelni))
{
WriteLine($"{zaposlelni.ImePrezime},
{zaposlelni.Plata.ToString("C")}");

}
}

WriteLine(Environment.NewLine);

}
static void Main(string[] args)
{
string line = new String('-', 20);

Zaposlelni zaposlelni1;
zaposlelni1.ImePrezime = "Milan Rosic";
zaposlelni1.Plata = 105000;

Zaposlelni zaposlelni2;
zaposlelni2.ImePrezime = "Jovica Nedic";
zaposlelni2.Plata = 68000;

Zaposlelni zaposlelni3;
zaposlelni3.ImePrezime = "Marica Tosic";
zaposlelni3.Plata = 160000;

Zaposlelni zaposlelni4;
zaposlelni4.ImePrezime = "Aleksa Urosevic";
zaposlelni4.Plata = 52000;

Zaposlelni zaposlelni5;
zaposlelni5.ImePrezime = "Vojin Gojkovic";
zaposlelni5.Plata = 102000;

List<Zaposlelni> lista = new List<Zaposlelni>() { zaposlelni1,


zaposlelni2, zaposlelni3, zaposlelni4, zaposlelni5 };

WriteLine("Plate:");
WriteLine(line);
//Sta ce se ispisati na ekranu?
PrikaziPlate("Minimalne plate:", lista, IsMinimum);
WriteLine(line);

//Sta ce se ispisati na ekranu?


PrikaziPlate ("Srednje plate:", lista, IsMedian);
WriteLine(line);

//Sta ce se ispisati na ekranu?


PrikaziPlate("Visoke plate", lista, IsHigh);
WriteLine(line);

WriteLine("Press any key to continue...");


ReadKey();
}

}
}

RESENJE

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UsingDelegatForFiltering
{
//Definisati javnu strukturu Zaposleni sa podacima clanovima ImePrezime i
Plata
public struct Zaposlelni
{
string ImePrezime;
double Plata;

class Program
{
public delegate bool FilterDelegate(Zaposlelni zaposlelni);
//Proveriti da li je plata manja od 65000 i vratiti rezultat
static bool IsMinimum(Zaposlelni zaposlelni)
{
return zaposleni.Plata < 65000;
}
//Proveriti da li je plata veca od 65000, a manja od 90000 i vratiti rezultat
static bool IsMedian(Zaposlelni zaposlelni)
{
return (zaposleni.Plata > 65000 && zaposleni.Plata < 90000);
}
//Proveriti da li je plata veca od 90000 i vratiti rezultat
static bool IsHigh(Zaposlelni zaposlelni)
{
retun zaposleni.Plata > 90000;
}

static void PrikaziPlate(string title, List<Zaposlelni> lista,


FilterDelegate filter)
{
WriteLine(title + Environment.NewLine);

foreach (Zaposlelni zaposlelni in lista)


{
if (filter(zaposlelni))
{
WriteLine($"{zaposlelni.ImePrezime},
{zaposlelni.Plata.ToString("C")}");

}
}

WriteLine(Environment.NewLine);

}
static void Main(string[] args)
{
string line = new String('-', 20);

Zaposlelni zaposlelni1;
zaposlelni1.ImePrezime = "Milan Rosic";
zaposlelni1.Plata = 105000;

Zaposlelni zaposlelni2;
zaposlelni2.ImePrezime = "Jovica Nedic";
zaposlelni2.Plata = 68000;

Zaposlelni zaposlelni3;
zaposlelni3.ImePrezime = "Marica Tosic";
zaposlelni3.Plata = 160000;
Zaposlelni zaposlelni4;
zaposlelni4.ImePrezime = "Aleksa Urosevic";
zaposlelni4.Plata = 52000;

Zaposlelni zaposlelni5;
zaposlelni5.ImePrezime = "Vojin Gojkovic";
zaposlelni5.Plata = 102000;

List<Zaposlelni> lista = new List<Zaposlelni>() { zaposlelni1,


zaposlelni2, zaposlelni3, zaposlelni4, zaposlelni5 };

WriteLine("Plate:");
WriteLine(line);
//Sta ce se ispisati na ekranu?
PrikaziPlate("Minimalne plate:", lista, IsMinimum);
WriteLine(line);

//Minimalne plate:
Ime I prezime I plata

//Sta ce se ispisati na ekranu?


PrikaziPlate ("Srednje plate:", lista, IsMedian);
WriteLine(line);

Srednje plate:
Srednja plata iznos

//Sta ce se ispisati na ekranu?


PrikaziPlate("Visoke plate", lista, IsHigh);
WriteLine(line);

WriteLine("Press any key to continue...");


ReadKey();
}

}
}

Kako se naziva delegat na kome su bazirani događaji u .NET Frameworku


Klasa koja generiše događaj naziva se publisher – izdavač dok klasa
koja prima ili obrađuje događaj se naziva subcriber – pretplatnik.
Sta odredjuje klasa izdavac, a sta klasa pretplatnik kod dogadjaja ?

(2 u 1 odgovor)
Klasa publisher definiše kad će se generisati događaj, dok klasa
subscriber odlučuje koja će se akcija preduzeti. Obično klasa
pretplatnik sadrži čitavu listu metoda koji se pozivaju kad se izazove
događaj i takve metode takođe zovemo subscribers - pretplatničke
43. U kojim aplikacijama se najcesce koriste dogadjaji ?

44. Sta mora da bude tip dogadjaja i koja kljucna rec se koristi ...?

43.Kako će ceo tok programa da se izvršava zavisi od događaja koje korisnik


aktivira sve do izlaska iz aplikacije. Zato kažemo da su navedene
aplikacije vođene događajima. Događaji se retko koriste u konzolnim
aplikacijama ali i u njima mogu da imaju svoju primenu.

44.Deklaracija događaja je jednostavna, stime da su događaji namenjeni


da se koriste sa delegatima. Jednostavno tip događaja mora da bude delegat
i zato ispred delegata mora da se nalazi ključna reč event

45. Metoda je invoke, ImeMetode.Invoke();


U .Net Framework-u su događaji bazirani na EventHandler delegatu.
Konkretna implementacija u System.EventHandlersa potpisom: public
delegate void EventHandler(object izvor, EventArgs arg); gde je izvor je
referenca na objekat koji izaziva događaj.

Da li se moze dogajdaj pozvati van klase u kojoj je definisan?


Ne moze se pozvati van klase

46. zadatak 4.9.1 Klase napredno

public delegate void Semafor (byte arg)


public static event Semafor semafor;

semafor.Invoke (t1);
semafor.Invoke (t2);

47. zadatak 4.9.2 Klase napredno

delegate void TemperaturaJePromenjenaHandler(double arg);

public event TemperaturaJePromenjenaHandler TemperaturaJePromenjena;

TemperaturaJePromenjena.Invoke(TemperaturaJePromenjenaHandler );

t.TemperaturaJePromenjena += IspisTemperature;

t.MeriTemperaturu();

sta je nit?
Nit je sekvenca izvršavanja programa. Svaka nit u Windows-u ima svoje
određeno vreme koje se meri u milisekundima i nakon tog perioda nit se
pauzira i Windows se prebacuje na drugu nit. Takvo ponašanje zovemo
Context Switching. Koristeći niti mi izvršavamo procese bez čekanja da
se prethodni proces završi.

49. Koja klasa se koristi za manipulaciju sa nitima i koja metoda se koristi za pokretanje niti ?

Da bi ste najjednostavnije manipulisali nitima koristite Thread klasu


koja se nalazi u System.Threading imenskom prostoru
Za pokretanje niti koristi se metoda Start()

zadatak 53. ispitna pitanja I zadaci sa teams-a


//cekanje od 10s
Thread.Sleep(10000);
Thread t = new Thread (new ThreadStart(ThreadMethod));

//cekanje od 15s
Thread.Sleep(15000);

Kako se nazivaju niti koje se izvršavaju u prvom planu, a kako niti koje
se izvršavaju u pozadini?U čemu je razlika?Koje svojstvo je potrebno
postaviti na Trueda bi se nit izvršavala u pozadini?

Postoje dve vrste niti, foreground thread – nit koja se izvršava u prvom
planu i background thread - nit koja se izvršava u pozadini. Mnogo je bitno
znati razliku. Podrazumevano sve niti se izvršavaju u prvom planu i to
jednostavno znači da se vaša aplikacija ne može ugasiti dok se sve niti
ne izvrše. Ukoliko ste kreirali nit koja radi u pozadini, vaša aplikacija
se može ugasiti i ako nit nije izvršena.Da bi se vaša nit izvršavala u
pozadini dovoljno je podesiti properti IsBackground na true pre
pokretanja niti. Pogledajte sledeći program.

primer 53 = .fajl 4 = ispitni zadaci I pitanja


//Startovati izvrsavanje niti

Koji delegat je potrebno proslediti kontruktoru Threadda bi se kreirala


parametrizovanu nit?

Ukoliko vam je potrebno da vi parametrima utičete na izvršavanje niti, to je moguće


jer konstruktor Thread se može nadjačati delegatom ParameterizedThreadStart.

.Koji atribut može da se koristi ispreddeljene statičke promenljive da bi


se omogućilo da svaka nit ima svoju jedinstvenu kopijunekog polja
(atributa)?
[ThreadStatic] public static int field;
treba staviti ThreadStatic.
Koju klasu treba koristiti ako želimo da koristimo lokalne podatke i
inicijalizujemo ih za svaku nit posebno

Ako želite da koristite lokalne podatke i inicijalizujete ih za svaku nit


posebno, onda možete koristiti klasu ThreadLocal. U ovom slučaju klasa
zahteva delegat od metode koja inicijalizuje vrednost.

Koja klasa omogučuje ponovno korišćenje niti, kad se nit završi?

ThreadPool je kreiran da produži niti. Umesto da nit umre kad bude završena,
vi je šaljete ponovo u ThreadPool odakle može biti ponovo korišćena. Kad
koristite ThreadPool vi stavljate u red niti gde se izvršava nit prema
svojoj dostupnosti. Zato što je ThreadPool brojčano limitiran on se ne
koristi mnogo ali svakako ima svojih prednosti i vrlo se jednostavno
kodira

You might also like