Upload
others
View
71
Download
7
Embed Size (px)
Citation preview
Algoritmi i programiranje
Objekti, klase i liste
Prof. dr. sc. Tonči Carić
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
U izradi predavanja dijelom korišteni materijali predmeta ASP sa FER-a,
http://www.fer.unizg.hr/predmet/asp
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Sadržaj
– Uvod
– Objekti
– Klase
– Liste
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Računalna okolina i zahtjevi koji se postavljaju na nju postaju sve kompleksniji:
– Grafičko sučelje
– Povećanje brzine obrade podataka
– Međusobna komunikacija računala
– Obrada i arhiviranje velike količine podataka
• Jednostavni tipovi podataka postaju niži apstrakcijski nivo i koriste se nova paradigma klasa i objekata
Uvod
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Objekti su složene strukture podataka koje mogu slati poruke drugim objektima i primati poruke od drugih objekata
• Za razvoj određenog programa potrebno je identificirati objekte čijom će interakcijom program rješavati problem
• Identificirani objekti se generaliziraju u klase
• Programiranje zasnovano na objektima
• Aplikacije postaju skup objekata koje izmjenjuju poruke
Objekti
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Svaki objekt ima svoje varijable i metode
– Moguće definiranje razina pristupa
• Razmjena podataka odvija se pomoću metoda za čitanje i pisanje
– Metode za rad s konzolom • Console.ReadLine() i
• Console.WriteLine()
• Moguće je kreirati sličan objekt pomoću nasljeđivanja svojstava
• Moguće definiranje metoda objekta istog imena, ali različitih ulaznih podataka
– Višeobličje ili polimorfizam
Objekti
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Klasa je “kalup” za kreiranje objekata
– Definira atribute i metode kreiranog objekta
– Moguće ju je iskoristiti više puta
• Definiranjem klase definira se novi tip podataka
– Nova varijabla se inicijalizira naredbom new
• Naredbom new se poziva konstruktor
– Posebna metoda kojom se iz klase kreira objekt
– Konstruktor je istog naziva kao i klasa
– Ne navodi se tip podatka kod poziva new
Klase
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Programski jezik C# sadrži gotove klase
• Primjer klasa Random
– Služi za generiranje slučajnih brojeva
– Kreiranja objekta iz klase Random
Random rnd = new Random();
– Generiranje slučajnog cijelog broja
int slucajni;
slucajni = rnd.Next();
// unutar intervala 0 i 100
slucajni = rnd.Next(0, 100);
Klase
tip (klasa) varijabla konstruktor
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Po potrebi moguće definirati vlastite klase
• Sintaksa definicije klase class <NAZIV> {
<DEKLARACIJE ATRIBUTA>
<DEKLARACIJE KONSTRUKTORA>
<DEKLARACIJE METODA>
}
• Atributi su globalne varijable deklarirane prije deklaracije konstruktora i metoda te se mogu koristiti u svim metodama klase
• Konstruktora može biti više sa različitim parametrima
• Ukoliko se konstruktor izostavi, objekt će biti kreiran sa standardnim početnim vrijednostima atributa
Klase
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Kod naziva klasa, prvo slovo svake riječi je veliko
– Ostala pravila analogna imenima varijabli i metoda
– Primjer: Automobil, SeminarskiRad
• Atributi se deklariraju na početku iza čega slijede konstruktori, pa metode
• Svaka klasa se sprema u istoimenu datoteku sa ekstenzijom “.cs”
• Glavnu metodu “Main“sadrži samo klasa iz koje se program pokreće
Klase
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Primjer definicije nove klase
Klase Primjena
Automobil makina = new Automobil(0);
makina.Pokreni();
makina.DodajGas();
makina.DodajGas();
makina.DodajGas();
Console.WriteLine(makina.Brzina);
Uporaba klase Automobil:
Svakoj klasi, atributu, metodi i
konstruktoru može se odrediti
“vidljivost” stavljanjem ključne riječi private (uporaba samo
unutar klase) ili public
(uporaba moguća iz drugih
klasa) ispred deklaracije
public class Automobil {
private bool MotorPokrenut = false;
public int Brzina = 0;
public Automobil(int brzina) {
Brzina = brzina;
if (Brzina != 0)
MotorPokrenut = true;
}
public void Pokreni() {
MotorPokrenut = true;
}
public void DodajGas() {
if (MotorPokrenut)
Brzina++;
}
}
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Iz jednom definirane klase može se kreirati više objekata
• Primjer
Automobil golf = new Automobil(0);
Automobil fiat = new Automobil(0);
Automobil mercedes = new Automobil(0);
• Iako kreirani iz iste klase sa istim parametrom, tri varijable predstavljaju tri različita objekta u memoriji, nezavisna jedan od drugog
• Svaki objekt ima vlastite atribute definirane u klasi
Klase Primjena
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
golf.Pokreni();
fiat.Pokreni();
golf.DodajGas();
golf.DodajGas();
fiat.DodajGas();
mercedes.DodajGas();
Console.WriteLine(golf.Brzina);
Console.WriteLine(fiat.Brzina);
Console.WriteLine(mercedes.Brzina);
• Izvršavanjem gornjeg kôda na zaslonu će se ispisati vrijednosti 2, 1, 0
Klase Primjena
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Definirana klasa predstavlja novi tip podataka koji je ravnopravan ostalim ugrađenim tipovima (int, double, string, bool, ...)
• Moguće je napisati metodu koja vraća objekt, npr. Automobil BrziAuto()
{
Random rnd = new Random();
return new Automobil(rnd.Next(100, 130));
}
Klase Metode
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Kada se objekti šalju metodi kao argumenti, vrijede ista pravila kao i za polja, npr. void UbrzajDvaPuta(Automobil a)
{
a.Brzina = a.Brzina * 2;
}
• Za razliku od varijabli primitivnog tipa gdje se metodi šalje vrijednost, kod varijabli objekta šalje se referenca na objekt
• Promjenom objekta u metodi mijenja se i originalni objekt
Klase Metode
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Iz klase Automobil se može kreirati polje
• Primjer Automobil[] voznipark = new Automobil[3];
voznipark[0] = new Automobil(0);
voznipark[1] = new Automobil(50);
voznipark[2] = new Automobil(100);
Console.WriteLine(voznipark[1].Brzina);
Klase Polja
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Sadržaj
– Uvod
– Objekti
– Klase
– Liste
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Polja mogu spremiti više podataka istog tipa
– Potrebno je zauzeti dovoljno memorije za spremanje svih podataka
• Ponekad se javlja neiskorišten memorijski prostor
Liste
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Pogodno koristiti dinamičku alokaciju memorije
– Memorija se zauzima kada je potrebna i oslobađa kada podatak postane nepotreban
• Koriste se liste
• Lista se sastoji od reference na prvi član i elemenata liste
– Element liste sadrži podatke i referencu na sljedeći (po potrebi i na prethodni) element
Liste
Sljedeći
Podaci
Sljedeći
Podaci Glava
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Kada je lista prazna referenca na početak liste ima vrijednost null – Referenca zadnjeg elementa u listi ima također
vrijednosti null
• Posebna ključna riječ null u C#-u označava
neinicijalizirani objekt • Pristup neinicijaliziranoj varijabli objekta može
dovesti do iznimke NullReferenceException
• Svaka objektna varijabla ili rezultat metode se može ispitati uspoređivanjem sa null
Liste Vrijednost null
Glava
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Kod korištena objekata dobro napraviti provjeru da li referenca na objekt ima vrijednost
• Primjer
Automobil a;
...
if (a == null)
{
Console.WriteLine(“Varijabla nema vrijednost”);
}
else
{
Console.WriteLine(“Brzina = “ + a.Brzina);
}
Liste Vrijednost null
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Programski jezik C# ima gotovu klasu za korištenje listi -> klasa ArrayList
• Definirana u sistemskom prostoru imena System.Collections
– Učitava se uporabom naredbe using
• Služi za pohranu elemenata u listu
• Često se koristi, u mnogim slučajevima jednostavnija alternativa za polje
• Elementi mogu biti objekti bilo kojeg tipa (klase)
• Kod dohvaćanja elemenata potrebno je koristiti ukalupljivanje (engl. “cast”)
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Metode za kreiranje i rad sa listama
– Add – dodavanje objekta u listu
– Clear – uklanja sve objekte iz liste
– Contains – provjerava prisutnost zadanog objekta
– IndexOf – vraća indeks zadanog objekta
– Insert – umeće zadani objekt na zadano mjesto
– Remove – uklanja zadani objekt
– RemoveAt – uklanja objekt sa zadanim rednim
brojem
– Reverse – okreće naopako redoslijed objekata
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Lista se kreira naredbom new kao i svi drugi objekti • Veličina liste se ne mora zadati unaprijed jer se ona
sama po potrebi proširuje – Proširivanjem se zauzima optimalna količina memorije
• Primjer ArrayList lista = new ArrayList(); lista.Add(new Automobil(70)); lista.Add(“ovo je obican string“); Console.WriteLine(lista.Count);
• Atributom Count se može doznati ukupan broj elemenata u listi
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Za umetanje objekata u listu koristi se metoda Insert kojoj je prvi parametar pozicija na koju se objekt umeće ArrayList lista = new ArrayList(); lista.Add("prvi"); lista.Add("drugi"); lista.Insert(1, "treci");
• Kao i kod polja, indeksi kreću od nule • Umetanjem stringa “treci“ na indeks 1,
redoslijed elemenata u listi će biti prvi, treci, drugi
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Dohvaćanje pojedinog elementa izvodi se kao kod polja, upisivanjem uglatih zagrada i indeksa elementa kojeg želimo dohvatiti
• Zbog univerzalnosti i mogućnosti da pohrani i vrati objekt bilo kojeg tipa, kod dohvaćanja elementa potrebno je koristiti ukalupljivanje
Automobil a = (Automobil) lista[0];
string s = (string) lista[1];
• Dobra praksa je koristiti samo jedan tip u listi jer postoji potencijalna opasnost krivog ukalupljivanja
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Kada imamo listu objekata istog tipa, za brz prolaz kroz cijelu listu može se koristiti naredba foreach
– Slična for petlji
– Koristi se za brz prolaz kroz polje ili listu
– Na svaki element primjeni naredbe u svom tijelu
– Primjer
int[] fibarray = new int[] { 0, 1, 2, 3};
foreach (int i in fibarray)
{
System.Console.WriteLine(i);
}
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Pod pretpostavkom da lista naziva studenti sadrži 30 nizova znakova (string) lakši ispis elemenata liste bi bio
foreach(string s in studenti)
{
Console.WriteLine(s);
}
• Petlja će se izvršiti 30 puta mijenjajući vrijednost varijable s, od prvog do posljednjeg elementa
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Metoda IndexOf vraća poziciju zadanog elementa – U slučaju da objekt ne pripada listi vraća -1
ArrayList lista = new ArrayList(); Automobil a1 = new Automobil(20); Automobil a2 = new Automobil(50); lista.Add(a1); Console.WriteLine( lista.IndexOf(a1) ); // 0 Console.WriteLine( lista.IndexOf(a2) ); // -1
• Metoda Contains vraća vrijednost true ili false ovisno o tome da li se zadani objekt nalazi u listi Console.WriteLine( lista.Contains(a1) ); // true Console.WriteLine( lista.Contains(a2) ); // false
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Uklanjanje objekta iz liste ne znači njegovo trajno brisanje iz memorije, već samo izbacivanje reference iz liste – Sam objekt ostaje netaknut
ArrayList lista = new ArrayList(); Automobil f1 = new Automobil(300); lista.Add(f1); lista.Remove(f1); Console.WriteLine(f1.Brzina);
• Za uklanjanje elementa koji se nalazi na određenom mjestu u listi koristi se metoda RemoveAt, npr. lista.RemoveAt(0);
• Za uklanjanje svih elemenata iz liste koristi se metoda Clear, npr. lista.Clear();
Liste Klasa ArrayList
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
• Generičke liste
– su programske strukture kojima se može pohraniti više vrijednosti istog tipa
– kao i u slučaju polja, elementima liste moguće je pristupiti navodeći indekse, a prvi element ima indeks 0. Način kreiranja liste:
List<tip> varijabla = new List<tip>();
– U listu je moguće dodati samo vrijednosti odabranog tipa.
– Za razliku od polja, lista ne mora imati unaprijed definiran broj elemenata
ZITS :: Algoritmi i programiranje :: Objekti, klase i liste © 2013 Carić, Ivanjko
Primjer:
List<int> lista = new List<int>();
lista.Add(2);
• razlika između ArrayList i List strukture:
– u ArrayList strukturi mogu se dodavati različiti tipovi podataka što je potencijalna opasnost za runtime pogrešku
– kod List strukture mora se unaprijed definirirati tip podatka i samo se može koristiti taj tip,češće se koristi List