Professional Documents
Culture Documents
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.
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).
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.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).
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.
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 = ________________________;
//ispisi link
WriteLine(______________________________);
WriteLine(lines + Environment.NewLine);
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”;
//ispisi link
WriteLine(link);
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 = ________________________________;
ReadKey();
}
}
}
RESENJE
namespace StringClass
{
class Program
{
static void Main(string[] args)
{
// deklaracija i inicijalizacija string vase ime i prezime
string imePrezime = “luka peric”;
// 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}]");
Console.ReadKey();
}
}
}
RESENJE
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
string pozdrav = " Zdravo svima! ";
Console.WriteLine($"[{pozdrav}]");
Console.WriteLine($"[{pozdravPomeren}]");
Console.ReadKey();
}
}
}
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?
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);
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.
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();
}
MetodParams2();
MetodParams2(mojIntNiz);
}
}
try
{
//kod koji se izvršava do pojave greške
throw new System.Exception();
...
}
catch (Exception){
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?
namespace TryCatchFinally
{
class Program
{
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);
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 (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);
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
}
/*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) {
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
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.
Konstruktori mogu biti privatni (private) ili javni (public). Privatni konstruktor se ne
može koristiti izvan klase.
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 konstruktor inicijalizacije
public Osoba(string i, int g)
{
}
// Definisati svojsvo Ime:
public string GetSetIme
{
}
//Definisati metodu za unos imena i prezimena osobe
public void unos()
{
int n, i;
Console.WriteLine("Uneti broj osoba:");
n = Convert.ToInt32(Console.ReadLine());
najstarijaOsoba(nizOsoba);
Console.ReadKey();
}
Resenje
namespace Klase
{
class Program
{
class Osoba
{
//privatni podaci clanovi
private string ime;
private int god;
}
//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.
}
}
int n, i;
Console.WriteLine("Uneti broj osoba:");
n = Convert.ToInt32(Console.ReadLine());
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 metodu za ispis duzina stranica
public void ispis()
{
int n,i;
//Definisati objekat prvavougaonik sa stranicama 5.2 i 2.3
Pravougaonik pr = ______________________________;
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 metodu za ispis duzina stranica
public void ispis()
{
Console.WriteLine ($”Duzina je {duzina}/n Sirina je {sirina}”)
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
niz[i].unos();
NadjiPravougaonikeVecePovr(niz, n, pr);
Console.ReadKey();
//Samo ovi delovi su uradjeni jer prethodni delovi ovog zadatka se rade isto kao i prvi delovi prethodna
dva
ima = true;
S += niz[i].GetSetCena;
br++;
}
}
if (ima == true) s = s / br;
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());
if (ima == true)
//ispisati srednju cenu
else
//ispisati da nema automobila cija je marka jednaka zadatoj
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!
Console.WriteLine(“Povrsina: ”);
this.povrsina = Convert.ToDouble(Console.ReadLine());
}
Sortiranje(niz);
Console.ReadKey();
}
}
}
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
}
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;
}
namespace DictionaryGenericCollection
{
class Broj
{
public double vrednost;
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)
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.
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.
U konstruktoru izvedene klase može se eksplicitno u listi inicijalizacije članova pozvati konstruktor bazne klase,
korišćenjem ključne reči base.
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.
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.
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.
}
//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 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)”);
}
}
}
//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()
{
}
/* 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();
nz.Unos();
lista.Add(nz);
}
IspisVecih(lista, nz1);
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
{
}
//Definisati konstruktor inicijalizacije
public Programer(string i, int bs, double cs, int gs)
{
}
//Definisati GetSet metode
public string GetSetIme
{
}
public double GetSetCenaSata
{
}
}
//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 class ProgramerFirme : Programer
{
private string nazivFirme;
}
//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()
{
Sort(lista);
lista[i].Ispis();
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.
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}
}
class ZaposleniPunoVreme : Zaposleni
{
//IZOSTAVITI PRIVATNE PODATKE CLANOVE
//Definisati skraceni oblik get set svojstava
public decimal MesecnaPlata {get; set; }
public decimal PlataUvecanje { get; set }
base.Ispis();
//ispis plate sa novcanom valutom
String plata = String.Format{“{0:c}”, Plata()};
WriteLine(“Plata: ” + plata);
WriteLine(“Status: ” + Status);
}
class Program
{
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.
WriteLine(Rectangle.Povrsina(5, 7));
WriteLine(Rectangle.Povrsina(8, 9));
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.
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;
}
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
{
}
}
class Program
{
static void Main(string[] args)
{
Pravougaonik p1 = new Pravougaonik();
ReadKey();
}
} }
68. Popuni
Tacka P = (Tacka)obj;
class Program
{
static void Main(string[] args)
{
//Kopirati objekat p1 u p3
Tacka p3 = p1.Copy();
//Pozvati metodu ToString() za tacku p2
WriteLine("Tacka 3: " + p3.ToString());
ReadKey();
}
}
}
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
/* 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 {
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.ReadKey();
}
}
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.
Klasa ne mogu nasledjivati vise osnovnih klasa ali zato mogu da implementiraju vise
interfejsa, kao i sto interfejs moze da poziva druge interfejse.
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;
class Program
{
static void Main(string[] args)
{
//Pozajmiti 1000
a1.Pozajmica(1000);
//Sta ce se ispisati
WriteLine(a1.ToString());//__________________
//Pozajmiti 400
a1.Pozajmica(400);
//Sta ce se ispisati
WriteLine(a1.ToString());//__________________
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
{
}
/* Definisati dve klase SaverAccount i GoldAccount, koje ekspicitno
implementiraju ovaj interfejs i sadže privatni podatak član balans */
class SaverAccount:IBankAccount
{
private decimal balans;
else{
Console.WriteLine(“Neuspesan pokusaj pozajmice!”);
}
}
}
class Program
{
static void Main(string[] args)
{
//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
ReadKey();
}
}
}
namespace SimpleDelegate
{
class Program
{
/*Definisati delegat Ispis tipa void sa string parametrom
delegate void Ispis (string parametar);
static public DateTime time;
}
static void LogOut(string name)
{
time = DateTime.Now;
WriteLine(name + " ispisan/n " + time + Environment.NewLine);
WriteLine(line + Environment.NewLine);
gost1("Milan Jovanovic");
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
}
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)
{
_____________________________________:
}
}
}
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;
WriteLine("Plate:");
WriteLine(line);
//Sta ce se ispisati na ekranu?
PrikaziPlate("Minimalne plate:", lista, IsMinimum);
WriteLine(line);
}
}
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;
}
}
}
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;
WriteLine("Plate:");
WriteLine(line);
//Sta ce se ispisati na ekranu?
PrikaziPlate("Minimalne plate:", lista, IsMinimum);
WriteLine(line);
//Minimalne plate:
Ime I prezime I plata
Srednje plate:
Srednja plata iznos
}
}
(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 ...?
semafor.Invoke (t1);
semafor.Invoke (t2);
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 ?
//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.
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