Professional Documents
Culture Documents
2. Napisati program u kome se definie funkcija prost koja ispituje da li je broj prost i funkcija
main() koja njenim korienjem tampa sve proste brojeve od 3 do datog prirodnog broja n.
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int i, n;
Console.WriteLine("Uneti broj n ");
n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Prosti brojevi od 3 do " + n + " su ");
for (i = 3; i <= n; i++)
if (prost(i))
Console.WriteLine(i);
Console.ReadLine();
}
static bool prost(int n)
{
int i;
for (i = 2; i <= Math.Sqrt(n); i++)
if (n % i == 0)
return false;
return true;
}
C++
cout<<i;
cin>>i;
C#
Console.WriteLine(i);
i=Console.ReadLine();
3. Napisati program za formiranje strukture student sa karakteristikama: Ime, Prezime, broj indeksa,
srednja ocena. Za uneti broj studenata n, sortirati studente prema srednjoj oceni i ispisati na ekranu.
namespace ConsoleApplication3
{
class Program
{
// sve atribute strukture postaviti public (objasnjenje na sledecem casu)
struct Student
{
public String ime;
public String prezime;
public int br_indeksa;
public double sred_ocena;
}
static void Main(string[] args)
{
int n, i;
Student[] STF = new Student[20];
String im, p;
int b;
double s;
Console.WriteLine("Unesite broj studenata: ");
n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Unesite podatke o studentima:");
for (i = 0; i < n; i++)
{
Console.WriteLine("\nIme studenta: \n");
im = Console.ReadLine();
Console.WriteLine("Prezime studenta: \n");
p = Console.ReadLine();
Console.WriteLine("Broj indeksa: ");
b = Convert.ToInt32(Console.ReadLine()); ;
Console.WriteLine("Srednja ocena studenta: \n");
s = Convert.ToDouble(Console.ReadLine()); ;
STF[i] = setStudent(im, p, b, s);
}
Tipovi podataka
Definiu:
o skup dozvoljenih vrednosti,
o operacije nad tipom i
o veliine dozvoljenih vrednosti
C# sadri niz ugraenih tipova koji se nazivaju prosti tipovi.
CTS (Common Type System) je sastavni deo CLR-a (Common Language Runtimenajvaniji deo .Net framework-a nadlean za aktiviranje objekata, izvravanje bezbednosnih
provera, smetanje i uklanjanje iz memorije.. ), koji definie pravila za deklarisanje,
korienje i upravljanje tipovima (podrava vrednosne i referentne tipove).
int, long: uvanje celih brojeva
float, double: brojevi sa decimalnim zarezom (double moe da prihvati broj sa preciznou
duplo veom od broja u promenljivoj tipa float)
decimal: za uvanje novanih vrednosti od 28 znaajnih cifara
char: za pojedinane znakove
string: niz znakova
bool: tano, netano
Metode
[modifikator] Tip_povratne_vrednosti Naziv_metode([lista_parametara]) {telo_metode}
parametar++;
}
static void Main()
{
int a = 5;
Inkrement(a);
Console.WriteLine(a);
}
U ovom sluaju vrednost parametra a pri ispisu je i dalje 5, bez obzira to je pozvana metoda za
inkrementiranje. Ovo vai i za argumente referencnog tipa (klase, nizove). U sluaju kada treba
napisati metod koji treba da izmeni argument, koristie se kljune rei ref i out.
Za prenos po referenci se koristi kljuna re ref. Ova kljuna re se koriste i u definiciji
metoda i na mestu poziva. Prenos parametara po referenci omoguava bone efekte metoda nad
njima ne pravi se kopija stvarnog argumenta ve se izmene vre nad njim. Izlazni parametri ne
moraju da budu inicijalizovani pre prosleivanja metodi. Ako se izlaznom parametru ne pridrui
vrednost u metodi, javlja se greka. Primer:
{
parametar++;
}
static void Main()
{
int a = 5;
Inkrement(ref a);
Console.WriteLine(a);
}
class Primer2Ref
static void Metod(ref string s)
{
s = "izmenjen tekst";
}
static void Main()
{
string str = "originalni tekst";
Metod(ref str);
Console.WriteLine(str);
}
Definisanje out parametra je slino definisanju ref parametra. Ako ispred parametra
upotrebimo kljunu re out, to znai da parametar postaje alijas argumenta (referentna promenljiva
je alternativno ime za drugu promenljivu). Kada argument prosledimo parametru out, mora i ispred
argumenta da se upotrebi kljuna re out. Razlika izmeu parametra ref i out je to metod ne mora
da dodeli vrednost ref parametru, ali out parametru mora da dodeli vrednost. Prethodni primer ne
moe proi prevoenje zato to u metodu Inkrement nije dodeljena vrednost za parametar.
class PrimerOut1
{
static void Inkrement(out int parametar)
{
parametar=5;//Inicijalizacija u metodi
parametar++;
}
static void Main()
{
int a ;
Inkrement(out a);
Console.WriteLine(a);
}
}
Kljuna re params odreuje parametar metoda koji uzima promenljivi broj argumenata. Tako je
mogue proslediti listu argumenata razdvojenih zarezom u deklaraciji parametara ili niz argumenata
}
}
//kompletna klasa
class Auto {
class Auto {
public int godiste;
public String boja;
public String ostecenje;
};
Apstrakcija
ta su elementi knjige?
Iz perspektive bibliotekarke:
naslov, autor, isbn broj, kategorija kojoj knjiga pripada.
Njena perspektiva je odreena njenim poslom.
Klasifikacija
Npr. Svi automobili imaju slina ponaanja (njima se moe upravljati, mogu se zaustaviti, ubrzati..)
i zajednike atribute (imaju volan, motor...).
Re Automobil se koristi za sve objekte koji dele ta zajednika ponaanja i atribute.
Konkretan objekat bi bio npr:
Opel Astra, registarskih tablica: BG 123, bele boje.
Enkapsulacija (uaurenje)
10
Klasa
Modifikator
Public
Private
Internal
Protected
Protected
Internal
Primenljivo na
Tipove, lanove tipova
Tipove, lanove tipova
Tipove, lanove tipova
lanove tipova
lanove tipova
Opis
Vidljivo svuda, ak i izvan sklopa
Vidljivo samo u kodu koji pripada istom tipu
Vidljivo samo u kodu koji se nalazi u istom sklopu
Vidljivo samo u kodu koji pripada istom ili izvedenom tipu
Vidljivo samo u kodu koji se nalazi u istom sklopu ili u
izvedenoj klasi u drugom sklopu
11
Polja i Svojstva
12
class Kupac
{
public double UkupnaKupovina { get; set; }
public string Ime { get; set; }
public int IdKupac { get; set; }
// .. Dodatne metode, dogaaji...
}
class Program2
{
static void Main()
{
// Inicijalizacija novog objekta.
Kupac cust1 = new Kupac();
//Izmena svojstva
cust1.UkupnaKupovina += 499.99;
NAPOMENA: Ne moete imati automatski definisano svojstvo koje ima samo naredbu get (ako ne
postoji pozadinsko polje, kako biste mu zadali vrednost?), ali naredba set moe biti privatna:
public int IdKupac { get; private set; }
4.Napravi klasu Osoba sa atributima ime,prezime i godina rodjenja. Kreirati Instancu klase Osoba i
iskoristiti ugraenu metodu predstaviSe().
NAPOMENA: Reenje demonstrirano u C++ i C# programskim jezicima!!!
//
C++
#include <iostream.h>
#include <string.h>
#define DIM 20
class Osoba{
public:
void PredstaviSe();
void setIme(char i[]){strcpy(ime, i);}
void setPrezime(char p[]){strcpy(prezime, p);}
void setGodiste(int g){godiste = g;}
char* getIme(){return ime;}
char* getPrezime(){return prezime;}
13
//
C#
class Osoba
{
private string ime;
public string Prezime{ get; set; }
public int Godiste { get; set; } //kako pristupiti da je {get;private set;}
public string Ime
{
get { return ime; }
set { ime = value; }
}
public void PredstaviSe(){
Console.WriteLine("Pozdrav svima!!!");
Console.WriteLine("Ja sam " + ime + " " + Prezime + " i " + Godiste + ".
sam godiste !!!");
}
};
class Program
{
static void Main(string[] args)
{
Osoba o = new Osoba();
o.Ime = "Pera";
o.Prezime = "Peric";
o.Godiste = 1990;
}
o.PredstaviSe();
14
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace KonzolnaAplikacijaAutomobil
{
class Program
{
public class Automobil
{
//podaci clanovi
public string marka;
public int godP;
public double cena;
public string regB;
//funkcija clanica klase-metoda
public void unos()
{
Console.WriteLine("Unesi podatke o automobilu:");
Console.WriteLine("Marka automobila:");
marka = Console.ReadLine();
Console.WriteLine("Godina proizvodnje:");
godP = int.Parse(Console.ReadLine());
Console.WriteLine("Cena:");
cena = double.Parse(Console.ReadLine());
Console.WriteLine("Registarski broj:");
regB = Console.ReadLine();
}
//funkcija clanica klase-metoda
public void ispis()
{
Console.WriteLine("Marka automobila: {0}", marka);
Console.WriteLine("Godina proizvodnje: {0}", godP);
Console.WriteLine("Cena automobila: {0}", cena);
Console.WriteLine("Registarski broj: {0}", regB);
Console.ReadLine();
}
}
// globalna funkcija van klase
static public void vecaCena(Automobil a, Automobil b)
{
Console.WriteLine("Automobil koji ima vecu cenu ima sledece podatke:");
if (a.cena > b.cena)
a.ispis();
else b.ispis();
}
15
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace KlasaDrzava
{
class Program
{
public class Drzava
{
private string naziv;
private string glGrad;
private double povrsina;
private long brStanov;
/*
Ne koriste se get i set pristupnici jer polja nisu koriena u glavnoj funkciji
* ve u samoj klasi
*
public string GetSetNaziv
{
get
{
return naziv;
}
set
{
naziv = value;
}
}
*/
16
double
}
static public void Razmeni(Drzava[] niz, int a, int b)
{
Drzava t = niz[a];
niz[a] = niz[b];
niz[b] = t;
}
static public void Sortiranje(Drzava[] niz, int n)
{
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
{
if (niz[i].Gustina() > niz[j].Gustina())
{
Razmeni(niz, i, j);
}
}
}
static public void MinGustina(Drzava[] niz, int n)
{
double min = niz[0].Gustina();
int mini = 0;
for (int i = 1; i < n; i++)
{
if (min > niz[i].Gustina())
{
min = niz[i].Gustina();
mini = i;
}
}
17
18
Konstruktor
class Student
{
string _ime;
string _brojIndeksa;
//public Student(){}
/* default konstruktor; podrazumeva se da postoji
(automatski se generise) ukoliko nije eksplicitno naveden konstruktor*/
}
class Program
{
public static void Main(string[] args)
{
/*kreira se objekat pozivom podrazumevanog konstruktora*/
Student student = new Student();
}
}
19
//parametarizovani konstruktor
class Student
{
private string _ime;
private string _brojIndeksa;
public Student(string i,string bi)
{
_ime = i;
_brojIndeksa = bi;
}
}
class Program
{
public static void Main(string[] args)
{
Student student = new Student();
/* greska; ispravno je pozvati ukoliko u
klasi postoji eksplicitno naveden
podrazumevajuci konstruktor ili ne
postoji ni jedan*/
Student student1 = new
Student("Pera","123/2000");
}
}
}
}
20
21
class Program
{
static void Main(string[] args)
{
Televizor t = new Televizor();
t.ispisi();
//Televizor je ukljucen: False
//Jacina tona je: 0
t.ukljuci();
t.ispisi();
//Televizor je ukljucen: True
//Jacina tona je: 0
t.jacinaTona = 12;
t.pojacajTon();
t.ispisi();
//Televizor je ukljucen: True
//Jacina tona je: 13
Console.ReadLine();
}
}
22
NAPOMENA: u okviru oba konstruktora podesiti polje broj tako da predstavlja broj kreiranih
instanci klase Krug u glavnom delu programa.
Javnu metodu: povrsina() : void, koja rauna povrinu i na ekranu ispisuje poruku sedeeg
formata: Povrsina kruga parametara X = 1, Y = 2, R = 3 je: 28.26
Krug.broj = 5;
a.broj = 5;
REENJE:
class Krug
{
private int _x;
private int _y;
public int R { get; set; }
public static int broj {get; private set;}
public int X
{
set {_x = value;}
get {return _x;}
}
public int Y
{
set { _y = value; }
get { return _y; }
}
23
}
class Program
{
static void Main()
{
Console.WriteLine("static broj = " + Krug.broj);
Krug a, b = new Krug(3, 5, 7);
Console.WriteLine("static broj = " + Krug.broj);
// 0
// 1
a = new Krug();
a.X = 1;
a.Y = 2;
a.R = 3;
Console.WriteLine("static broj = " + Krug.broj);
// 2
a.povrsina();
b.povrsina();
// Krug.broj = 5;
// a.broj = 5;
}
Console.ReadKey();
24
Nasleivanje
Jedan od osnovnih koncepata OOP
Na osnovu postojee klase (bazna klasa) izvodi se nova (izvedena) koja nasleuje sve
lanove (polja i metode)
Odnos meu klasama a ne meu objektima
Klasa System.Object je osnovna za sve klase
Grupe koje su povezane nasleivanjem formiraju strukturu koja se naziva hijerarhija klasa
Vrste nasleivanja
Direktno
Indirektno
25
Implementacija
class BaznaKlasa
{
}
class IzvedenaKlasa:BaznaKlasa
{
26
PRIMER 1:
Definisati klasu Osnovna sa :
privatnim poljem int _a,
zastienim poljem int _b,
javnim poljem int _c.
Javnom metodom void osnovnaMetoda: podeava vrednosti svih polja na 50
Definisati klasu Izvedena, izvedenu iz klase Osnovna sa :
privatnim poljem int _d,
zastienim poljem int _e,
javnim poljem int _f.
Javnom metodom void izvedenaMetoda: podeava vrednosti svih polja na 80
U glavnom delu programa:
Kreirati objekat osnovne klase
Ispisti vrednosti dostupnih polja osnovne klase
Pozvati metodu osnovnaMetoda()
Ispisti vrednosti dostupnih polja osnovne klase
Kreirati objekat izvedene klase
Ispisti vrednosti dostupnih polja izvedene klase
Pozvati metodu osnovnaMetoda()
Ispisti vrednosti dostupnih polja izvedene klase
Pozvati metodu izvedenaMetoda()
Ispisti vrednosti dostupnih polja izvedene klase
Kako izgleda ispis u konzoli
27
REENJE:
class Osnovna
{
private int _a;
protected int _b;
public int _c;
public
{
//
//
_a
void osnovnaMetoda()
iz metode osnovne klase se moze raditi sa:
svim poljima osnovne klase
= _b = _c = 50;
class Izvedena:Osnovna
{
private int _d;
protected int _e;
public int _f;
public
{
//
//
_d
void izvedenaMetoda()
iz metode izvedene klase se moze raditi sa:
svim poljima izvedene klase
= _e = _f = 80;
28
// C = 0
o.osnovnaMetoda();
Console.WriteLine("Iz osnovne C = " + o._c);
// C = 50
// C = 0
// F = 0
iz.osnovnaMetoda();
Console.WriteLine("Iz izvedene C = " + iz._c);
Console.WriteLine("Iz izvedene F = " + iz._f);
// C = 50
// F = 0
iz.izvedenaMetoda();
Console.WriteLine("Iz izvedene C = " + iz._c);
Console.WriteLine("Iz izvedene F = " + iz._f);
// C = 80
// F = 80
Console.ReadKey();
}
Nasleivanje je odnos meu klasama, a ne objektima. To znai da odnos vai za sve objekte iz te
klase.
29
VEBE 06
30
}
class Izvedena1 : Osnovna
{
protected int _y;
}
}
class Izvedena2 : Osnovna
{
private String _z;
PRIMER 1:
Definisati klasu Osoba sa:
Protected poljima ime i prezime
Parametarizovanim konstruktorom
Public metodom void podaciOsobe(): ispisuje podatke o Osobi
31
32
class Glavna
{
static void Main(string[] args)
{
Osoba o = new Osoba("Pera", "Peric");
o.podaciOsobe();
// Pera Peric
Student s = new Student("Mika", "Mikic", 11);
s.podaciOsobe();
s.podaciStudenta();
// Mika Mikic
// Mika Mikic 11
Console.ReadKey();
}
33
34
REENJE:
o
r
d
NAPOMENA:
parametari konstruktora se moraju poklapati po broju, tipu i redosledu
u objekat osnovne klase MOE se smestiti objekat izvedene klase
u objekat izvedene klase NE MOE se smestiti objekat osnovne klase
35
VEBE 07
Polimorfizam
Metoda koja je implementirana u osnovnoj (baznoj) klasi moe da bude implementirana
na vie razliitih naina u razliitim izvedenim klasama
36
Pravila
Nije dozvoljeno deklarisati privatan metod sa kljunom rei virtual ili override
Dva metoda moraju biti identina ( isto: ime, tipovi parametara i tip povratne vrednosti )
Ako izvedena klasa ne oznai metod sa override, ona tada ne nadjaava metod bazne klase
37
38
stanje -= i;
39
class Glavna
{
static void Main(string[] args)
{
Dinarski din = new Dinarski();
Console.WriteLine(din);
Console.WriteLine(din.Stanje);
// DINARSKI = 0 dinara
// 0 // OK, public get
// DEVIZNI = 0 eura
// 0 // OK, public get
din.uplata(50000);
// din.Stanje += 50000;
Console.WriteLine(din);
Console.WriteLine(din.Stanje);
dev.uplata(1000);
// dev.Stanje += 1000;
Console.WriteLine(dev);
Console.WriteLine(dev.Stanje);
din.isplata(10000);
Console.WriteLine(din);
Console.WriteLine(din.Stanje);
dev.isplata(200);
Console.WriteLine(dev);
Console.WriteLine(dev.Stanje);
Console.ReadKey();
}
40
void isplata(Racun [] a, int n, int iznos) vri isplatu prosleenog iznosa sa svih rauna u
nizu a.
U glavnom programu kreirati nekoliko razliitih tiova rauna (Dinarski, Devizni) i ubaciti iz u niz
Racuna (pokazivaa na osnovnu klasu). Pozvati metodu ispis, pa isplata da isplati po 100 sa svih
rauna. Nakon toga pozvati ponovo metodu ispit da se ispiu podaci svih rauna i proveriti da li je
pravilno izraunata provizija pri isplati sa dinarskih i deviznih rauna.
REENJE:
class Program
{
static void Main(string[] args)
{
Racun r0 = new Dinarski();
Racun r1 = new Dinarski();
Racun r2 = new Devizni();
Racun r3 = new Devizni();
r0.uplata(1000);
r1.uplata(1000);
r2.uplata(1000);
r3.uplata(1000);
Racun[] niz = new Racun[4];
niz[0]
niz[1]
niz[2]
niz[3]
=
=
=
=
r0;
r1;
r2;
r3;
ispis(niz, 4);
isplata(niz, 400);
ispis(niz, 4);
Console.ReadKey();
}
public static void ispis(Racun [] niz, int n) {
Console.WriteLine("PREGLED RACUNA");
for (int i = 0; i < n; i++)
Console.WriteLine(niz[i]);
}
public static void isplata(Racun[] niz, double iznos) {
foreach (Racun pom in niz)
pom.isplata(iznos);
}
}
41
42
VEBE 08
Kada bazna i izvedena klasa imaju metode sa istim potpisom, potrebno je da se kod
izvedene upotrebi kljuna re new.
NAPOMENA:
Medota osnovne klase nije obeleena kao virtualna i kao takva nije podlona promeni
implementacije u izvedenim klasama (ne ponaa se polimorfno) ve se novokreirana metoda
izvedene klase ponaa kao nova metoda
Korienje new modifikatora kod deklaracije koja nije nasleena, generie upozorenje.
43
Podsetnik:
Promenljiva tipa bazna klasa moe da referencira instance direktno ili indirektno
izvedenih klasa.
bude sakriven.
Override proiruje implementaciju nasleenog lana.
44
new
override
public class Osnovna
{
public virtual void SomeMethod()
{
//print Osnovna
}
}
public class Izvedena : Osnovna
{
public override void SomeMethod()
{
//print Izvedena
}
}
//...
Osnovna b = new Izvedena ();
Izvedena d = new Izvedena ();
b.SomeMethod();
d.SomeMethod();
b.SomeMethod ();
d.SomeMethod ();
IZLAZ:
Izvedena//pozvana metoda iz izvedene
Izvedena
IZLAZ:
Osnovna // pozvana metoda iz Osnovne
Izvedena
ZAKLJUAK:
Kada je u usnovnoj klasi metoda definisana kao virtualna onda ako se u izvedenoj
klasi njena implementacija:
proiri pomou override svaka instanca klase Izvedena (ne vano da li preko
Osnovne ili Izvedene klase) poziva metudu izvedene klase
pregazi pomou new svaka instanca klase Izvedene referencirana preko:
o Osnovne klase poziva metodu osnovne klase
o Izvedene klase poziva metodu izvedene klase
45
Console.ReadKey();
}
/*IZLAZ:
55
100
100
22
22
200
*/
46