You are on page 1of 40

Računarski praktikum 3

Vježbe 05
Vinko Petričević

Polja, indekseri,
kolekcije
 u .net okruženju imamo mnoštvo klasa kolekcije
 od verzije 2.0 većina ih je generička
 najjednostavnija kolekcija je Array, za koju C#
ima ugrađenu podršku.
 indekseri omogućuju dohvat n-tog člana kolekcije
 .net ima različita sučelja, poput IEnumerable i
ICollection, pomoću kojih se može iterirati po
elementima
Polje (array)
 indeksirana kolekcija objekata istog tipa
int[] poljeBrojeva = new int[5];

 objekt je izveden iz System.Array


System.Array
 BinarySearch() – Preopterećena javna statička metoda koja pretražuje
jednodimenzionalno sortirano polje.
 Clear() – Javna statička metoda koja raspon elemenata u polju postavlja
na 0 ili null.
 Copy() – Preopterećena javna statička metoda koja dio jednog polja kopira
u drugo polje.
 CreateInstance() – Preopterećena javna statička metoda koja stvara novu
instancu polja.
 GetEnumerator() – Javna metoda koja vraća IEnumerator.
 GetLength() – Javna metoda koja vraća duljinu zadane dimenzije polja.
 GetLowerBound() – Javna metoda koja vraća donju granicu zadane
dimenzije polja.
 GetUpperBound() – Javna metoda koja vraća gornju granicu zadane
dimenzije polja.
System.Array
 IndexOf() – Preopterećena javna statička metoda koja vraća indeks
(pomak) prve instance vrijednosti u jednodimenzionalnom polju.
 Initialize() – Inicijalizira sve vrijednosti u polju vrijednosnog tipa
pozivanjem podrazumijevanog konstruktora za svaku vrijednost. U
referentnim poljima svi su elementi postavljeni na null.
 IsFixedSize – Obavezno svojstvo jer Array implementira ICollection. S
poljima će uvijek vratiti true, jer su polja fiksne veličine.
 IsReadOnly – Javno svojstvo (obavezno jer Array implementira IList),
vraća Boolean vrijednost koja pokazuje je li polje samo za čitanje.
 IsSynchronized – Javno svojstvo (obavezno jer Array implementira
ICollection), vraća Boolean vrijednost koja pokazuje je li polje sigurno za
dretve.
 LastIndexOf() – Preopterećena javna statička metoda koja vraća indeks
posljednje instance vrijednosti u jednodimenzionalnom polju.
System.Array
 Length – Javno svojstvo koje vraća duljinu polja.
 Rank – Javno svojstvo koje vraća broj dimenzija polja.
 Reverse() – Preopterećena javna statička metoda koja
elemente jednodimenzionalnog polja postavlja u obrnuti
redoslijed.
 SetValue() – Preopterećena javna metoda koja zadane
elemente polja postavlja na neku vrijednost.
 Sort() – Preopterećena javna statička metoda koja sortira
vrijednosti u jednodimenzionalnom polju.
 SyncRoot – Javno svojstvo koje vraća objekt koji se može
koristiti za sinkronizaciju pristupa polju.
Polja
 deklaracija
tip[] imePolja;
 instanciranje
imePolja = new tip[brojElemenata];

 veličina polja se ne može naknadno mijenjati


 polje je smješteno na hrpi
 vrijednosni tipovi su inicijalizirani na defaultne
vrijednosti, dok se reference inicijaliziraju na null
Polje
int[] poljeCijelihBrojeva = new int[5]; // autom. inicijalizacija elemenata
Osoba[] poljeOsoba = new Osoba[3]; // elementi inicijalizirani na null
 
// Inicijalizacija elemenata polja referentog tipa
poljeOsoba[0] = new Osoba("Ivan", "Ivanković");
poljeOsoba[1] = new Osoba(“Marko", “Marković");
poljeOsoba[2] = new Osoba(“Jozo", “Jozić");
 
// pristupanje elementima polja kroz petlju
for (int i = 0; i < poljeCijelihBrojeva.Length; i++)
{
Console.WriteLine(poljeCijelihBrojeva[i].ToString());
}

for (int i = 0; i < poljeOsoba.Length; i++)


{
Console.WriteLine(poljeOsoba[i].ToString());
}
foreach

 iteracija kroz sve elemente polja (ili neke druge


kolekcije)
foreach(tip identifikator in izraz) …

foreach(int broj in poljeCijelihBrojeva)


Console.WriteLine(broj.ToString());

foreach(Osoba o in poljeOsoba) {
Console.WriteLine(o.ToString());
}
params
 omogućava prosljeđivanje promjenjivog broja
parametara bez eksplicitnog stvaranja polja

static void Main(string[] args) {


int[] eksplicitnoPolje = new int[5] { 2, 4, 6, 8, 10 };
  // poziv metode prosljeđivanjem eksplicitno definiranog polja
PrikaziVrijednosti(eksplicitnoPolje);

  // poziv metode prosljeđivanjem niza vrijednosti


PrikaziVrijednosti(5, 6, 7, 8);
}
 
static void PrikaziVrijednosti(params int[] poljeCjelobrojnihVrijednosti) {
foreach (int i in poljeCjelobrojnihVrijednosti) {
Console.WriteLine("PrikaziVrijednosti {0}", i);
}
}
Zadatak 1

 Napišite klasu velikiBroj, te osnovna 4


operatora na njemu
 veliki broj je predstavljen nizom znamenaka
višedimenzionalna polja

 pravokutna (rectangular)
int[,] polje = new int [4,3];

int[,] polje = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {9, 10, 11} };
 pristup elementu
polje[1,2]

 može i više dimenzija


Zadatak 2
 Napišite klasu matrica, koja predstavlja
matricu brojeva, te osnovne operacije na njoj
višedimenzionalna polja

 nejednaka (jagged) polja


int[][] polje = new int [4][];

polje[0] = new int[5];


polje[1] = new int[3];

 pristup elementu
for(int i=0; i<polje.Length; ++i)
for(int j=0; j<polje[i].Length; ++j)
polje[i][j] = i+j;
Postavljanje granice polja
int[] duljinePolja = new int[2] { 3, 5 };
int[] granicePolja = new int[2] { 2, 3 };
Array visedimenzionalnoPolje = Array.CreateInstance(
typeof(string), duljinePolja, granicePolja);

// Prikazujemo donju i gornju granicu svake dimenzije


Console.WriteLine("Gran.:\tDonja\tGornja");
for (int i = 0; i < visedimenzionalnoPolje.Rank; i++) {
Console.WriteLine("{0}\t{1}\t{2}“, i,
visedimenzionalnoPolje.GetLowerBound(i),
visedimenzionalnoPolje.GetUpperBound(i));
}

// 0 2 4
// 1 3 7
implicitna pretvorba polja

 polja se mogu pretvarati ako su im dimenzije


jednake i ako je moguće pretvaranje između
njihovih elemenata

static void IspisiPolje(object[] polje) { … }



Osoba[] o = …
IspisiPolje(o);
sort, reverse

string[] poljeRijeci = { "Danas", "radimo", "s", "poljima“ };

IspisiPolje(poljeRijeci); // Ispis inicijalnog polja


Console.WriteLine();
Array.Sort(poljeRijeci); // Sortiramo polje
IspisiPolje(poljeRijeci); // Ispis sortiranog polja
Console.WriteLine();
Array.Reverse(poljeRijeci); // Obrćemo redoslijed elemenata
IspisiPolje(poljeRijeci); // Ispis obrnuto složenog polja
Zadatak 3
 Napišite program koji učitava riječi s
tipkovnice, te ih sortira
indekseri
 operator[] je svojstvo
[modifikator pristupa] tip this[argument tipa] { get; set; }

 primjer
class Osoba {…}
class Osobe {
public Osoba this[int indeks] {
get { … } set { … } }
public Osoba this[string indeks] {
get { … } set { … } }
}

Osobe oo; …
o[15] = …
o[“Ivan”] = …
Zadatak 4
 Napišite klasu Osoba i Osobe.
 klasa Osobe ima konstruktor koji kao
parametar prima maksimalan broj osoba
 osobe je moguće naći po imenu, ili rednom
broju
kolekcije
 sučelja za implementaciju generičkih kolekcija:
 ICollection<T> – Osnovno sučelje za generičke
kolekcije. Implementiraju ga sve kolekcije.
 IComparer<T> i IComparable<T> – Uspoređuje dva
objekta unutar kolekcije da bi se kolekcija mogla sortirati.
 IEnumerator<T> i IEnumerable<T> – Enumerira
(prebrojava) kolekciju pomoću iskaza foreach.
 IDictionary<K, V1> – Koristi se za kolekcije temeljene na
parovima ključ/vrijednost kakva je Dictionary.
 IList<T> – Koriste ga kolekcije koje se mogu indeksirati
poljima.
IEnumerable<T>
 koristi se u foreach iskazu
class Osobe: IEnumerable<Osoba> {
private Osoba[] osobe; // privatno polje osoba
  public Osobe(int brojOsoba) { this.osobe = new Osoba[brojOsoba]; }
  public int BrojOsoba { get { return this.osobe.Length; } }
  public Osoba this[int indeks] {
get { return this.osobe[indeks]; }
set { this.osobe[indeks] = value; }
}
// implementacija sučelja IEnumerable<Osoba>
public IEnumerator<Osoba> GetEnumerator() {
foreach (Osoba o in this.osobe) {
yield return o;
}
}
// implementacija sučelja IEnumerable
// jer IEnumerable<T> izvodi iz IEnumerable moramo implementirati i njega
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
IEnumerable<T>

static void Main(string[] args)


{
// Inicijaliziramo novu kolekciju osoba
Osobe osobe = new Osobe(3);
 
// Inicijaliziramo elemente
osobe[0] = new Osoba("Ivan");
osobe[1] = new Osoba(“Marko");
osobe[2] = new Osoba(“Jozo");
 
// Pomoću foreach ispisujemo osobe iz kolekcije
foreach (Osoba o in osobe)
{
Console.WriteLine("Osoba: {0}", o);
}
}
List<T>
 više mogućnosti of Array
 Add() – Javna metoda za dodavanje objekta u List.
 AddRange() – Javna metoda koja dodaje objekte iz sučelja ICollection na kraj List.
 BinarySearch() – Preopterećena javna metoda koja koristi binarno pretraživanje
za pronalaženje određenog elementa u sortiranom List.
 Capacity – Svojstvo za postavljanje ili vraćanje broja elemenata koje polje List
može sadržavati. Ova se vrijednost automatski povećava ako broj elemenata
premašuje kapacitet. Možemo ju postaviti da bismo smanjili broj ponovnih
alokacija te možemo pozvati metodu Trim() za smanjivanje ove vrijednosti na
stvarni broj elemenata Count.
 Clear() – Uklanja sve elemente iz List.
 Contains() – Utvrđuje pripada li element List.
 CopyTo() – Preopterećena javna metoda koja List kopira u jednodimenzionalno
polje.
 Count – Svojstvo koje vraća broj elemenata koje polje trenutno sadrži.
 Exists() – Utvrđuje sadrži li List elemente koji odgovaraju zadanim uvjetima.
List<T>
 Find() – Vraća prvu pojavu elementa u List.
 FindAll() – Vraća sve navedene elemente u List.
 GetEnumerator() – Preopterećena javna metoda koja vraća enumeraciju za iteraciju kroz List.
 GetRange() – Kopira raspon elemenata u novo polje List.
 IndexOf() – Preopterećena javna metoda koja vraća indeks prve pojave vrijednosti.
 Insert() – Umeće element u List.
 InsertRange() – Elemente kolekcije umeće u polje List.
 Item() – Vraća ili postavlja element na određeni indeks. To je zapravo indekser za klasu List.
 LastIndexOf() – Preopterećena javna metoda koja vraća indeks posljednje pojave vrijednosti
u List.
 Remove() – Uklanja prvu pojavu određenog objekta.
 RemoveAt() – Uklanja element na određenom indeksu.
 RemoveRange() – Uklanja raspon elemenata.
 Reverse() – Elemente u List postavlja obrnutim redoslijedom.
 Sort() – Sortira List.
 ToArray() – Kopira elemente List u novo polje.
 TrimToSize() – Postavlja kapacitet stvarnog broja elemenata u List.
Primjer korištenja List<T>
using System.Collections.Generic;
class Osoba {
public string Ime;
public Osoba(string ime) { this.Ime = ime; }
public override string ToString() { return this.Ime; }
}
class Program {
static void Main(string[] args) {
// Instanciramo novi objekt kolekciju - objekt klase List<Osoba>
List<Osoba> osobe = new List<Osoba>();
 
// Dodajemo par osoba u kolekciju
osobe.Add(new Osoba("Ivan"));
osobe.Add(new Osoba(“Marko"));
osobe.Add(new Osoba(“Jozo"));
 
// Ispisujemo elemente redom
foreach (Osoba o in osobe) {
Console.WriteLine(o);
}
}
}
IComparable<T>
class Osoba : IComparable<Osoba> {
public string Ime;
public int Starost;
public Osoba(string ime, int starost) { Ime = ime; Starost = starost; }
public override string ToString() {return Ime + ", " + Starost.ToString(); }
 // Implementacija sučelja IComparable
public int CompareTo(Osoba o) {
if (this.Starost < o.Starost) { return -1; }
else if (this.Starost > o.Starost) { return 1; }
else { return 0; }
} }
class Program {
static void Main(string[] args) {
List<Osoba> osobe = new List<Osoba>();
osobe.Add(new Osoba("Ivan", 25));
osobe.Add(new Osoba(“Marko", 21));
osobe.Add(new Osoba(“Jozo", 35));
 
foreach (Osoba o in osobe) Console.WriteLine(o);
Console.WriteLine();
 
osobe.Sort();
foreach (Osoba o in osobe) Console.WriteLine(o);
} }
IComparer<T>
class Osoba : IComparable<Osoba> {
public string Ime;
public string Prezime;
public Osoba(string ime, string prezime) { Ime = ime; Prezime = prezime; }
public override string ToString() { return this.Ime + " " + this.Prezime; }
 
// Implementacija sučelja IComparable
// delegiramo na uspredbu člana ime
public int CompareTo(Osoba o) { return this.Ime.CompareTo(o.Ime); }
 
// ugniježđena klasa koja implementira sučelje IComparer
public class OsobaUsporedjivac : IComparer<Osoba> {
// Enumeracija tipova za uspoređivanje
public enum TipUsporedbe { Ime, Prezime }
// varijabla članica čuva odabrani tip usporedbe
public Osoba.OsobaUsporedjivac.TipUsporedbe KojaUsporedba;
 
// Implementacija sučelja IComparer<Osoba>
public int Compare(Osoba x, Osoba y)
{
return x.CompareTo(y,
this.KojaUsporedba);
}
}
 
IComparer<T>
//posebna implementacija koju će pozvati prilagođeni uspoređivač
public int CompareTo(Osoba o,
Osoba.OsobaUsporedjivac.TipUsporedbe
kojaUsporedba)
{
switch (kojaUsporedba)
{
case
OsobaUsporedjivac.TipUsporedbe.Ime:
return
this.Ime.CompareTo(o.Ime);
case
OsobaUsporedjivac.TipUsporedbe.Prezime:
return
this.Prezime.CompareTo(o.Prezime);
}
return 0;
}
 
// statička metoda za uzimanje Comparer objekta
public static OsobaUsporedjivac DohvatiUsporedjivac()
{
return new OsobaUsporedjivac();
}
}
IComparer<T>
class Program
{
static void Main(string[] args)
{
// Instanciramo novi objekt kolekciju - objekt klase
List<Osoba>
List<Osoba> osobe = new List<Osoba>();
 
// Dodajemo par osoba u kolekciju
osobe.Add(new Osoba(“ja", “jaic"));
osobe.Add(new Osoba(“ti", “onic"));
osobe.Add(new Osoba(“on", “tiic"));
 
// Sortiramo kolekciju po imenu
Osoba.OsobaUsporedjivac ou =
Osoba.DohvatiUsporedjivac();
ou.KojaUsporedba =
Osoba.OsobaUsporedjivac.TipUsporedbe.Ime;
osobe.Sort(ou);
 
// Ispisujemo elemente redom
foreach (Osoba o in osobe)
{
Console.WriteLine(o);
}
IComparer<T>
Console.WriteLine();
 
// Sortiramo kolekciju po prezimenu
ou.KojaUsporedba =
Osoba.OsobaUsporedjivac.TipUsporedbe.Prezime;
osobe.Sort(ou);
foreach (Osoba o in osobe)
{
Console.WriteLine(o);
}
}
}
Queue<T>
 Clear() – Uklanja sve objekte iz Queue.
 Contains() – Utvrđuje pripada li element Queue.
 CopyTo() – Kopira elemente Queue u postojeće
jednodimenzionalno polje.
 Count – Javno svojstvo koje vraća broj elemenata u Queue.
 Dequeue() – Vraća i briše objekt sa početka Queue.
 Enqueue() – Dodaje objekt na kraj Queue.
 GetEnumerator() – Vraća enumerator Queue.
 Peek() – Vraća objekt na početku Queue, ali ga ne uklanja.
 ToArray() – Kopira elemente u novo polje.
Queue<T>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Redovi {
class Program {
// Metoda za ispis elemenata kolekcije pomoću enumeratora
static void IspisiBrojeve(IEnumerable<int> kolekcija) {
IEnumerator<int> enumerator = kolekcija.GetEnumerator();
while (enumerator.MoveNext())
Console.Write("{0}, ", enumerator.Current);
Console.WriteLine();
}
static void Main(string[] args){
Queue<int> redCijelihBrojeva = new Queue<int>();
  // Dodajemo elemente u red - Enqueue metoda
for (int i = 1; i <= 5; i++)
redCijelihBrojeva.Enqueue(i);
// Ispisujemo red
IspisiBrojeve(redCijelihBrojeva);
// Brišemo element iz reda - Dequeue metoda
Console.WriteLine("Dequeue: {0}", redCijelihBrojeva.Dequeue());
  // Ispisujemo red
IspisiBrojeve(redCijelihBrojeva);
  // Pregledamo prvi element, ali ga ne uklanjamo - Peek metoda
Console.WriteLine("Peek: {0}", redCijelihBrojeva.Peek());
  // Ispisujemo red
IspisiBrojeve(redCijelihBrojeva);
}}}
Stack<T>
 GetEnumerator() – Vraća enumerator Stack.
 Clear() – Uklanja sve objekte iz Stack.
 Contains() – Utvrđuje pripada li element Stack.
 CopyTo() – Kopira elemente Stack u postojeće
jednodimenzionalno polje.
 Count – Javno svojstvo koje vraća broj elemenata u Stack.
 Peek() – Vraća objekt s vrha Stack, ali ga ne uklanja.
 Pop() – Vraća i briše objekt s vrha Stack.
 Push() – Dodaje objekt na vrh Stack.
 ToArray() – Kopira elemente u novo polje.
Zadatak 5
 Napišite program koji nalazi najkraći put između dvije
točke na mapi. Mapa je zadana nizom stringova, koji su
svi iste duljine, a sastoje se od znakova . i x. x označava
zid, a točka mjesto na kojem se možemo kretati. Točke
na mapi označene su slovima p (početak) i k (kraj).
 ..kx..
...x.p
...x..
...x..
......
 Rezultat je 10. Pokuajte i ispisati taj najkraći put
(dddlllgggg) (neka slovo r označava desno)
Dictionary<K, V>
 Add() – Dodaje unos s ključem (Key) i vrijednost (Value).
 Clear() – Uklanja sve objekte iz Dictionary.
 ContainsKey() – Utvrđuje pripada li određeni ključ Dictionary.
 ContainsValue() – Utvrđuje pripada li određena vrijednost Dictionary.
 Count – Javno svojstvo koje vraća broj elemenata u Dictionary.
 GetEnumerator() – Vraća enumerator za Dictionary.
 GetObjectData() – Implementira sučelje ISerializable i vraća podatke
potrebne za serijalizaciju Dictionary.
 Item() – Indekser za Dictionary.
 Keys – Javno svojstvo koje vraća kolekciju ključeva za Dictionary.
 Remove() – Uklanja unos s određenim ključem.
 Values – Javno svojstvo koje vraća kolekciju vrijednosti u Dictionary.
IDictionary<K, V>
 public V Item[K key] { get; set; }
Dictionary<K,V>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Rjecnici
{
class Program
{
static void Main(string[] args)
{
// instanciramo rječnik
Dictionary<string, string> gradoviPttBrojevi
= new Dictionary<string, string>();
 
// Dodajem elemente u rječnik
gradoviPttBrojevi.Add("Zagreb", "10 000");
gradoviPttBrojevi.Add("Split", "21 000");
gradoviPttBrojevi.Add("Rijeka", "51 000");
gradoviPttBrojevi.Add("Osijek", "31 000");
 
// Ispisujemo poštanski broj Rijeke
Console.WriteLine("Rijeka: {0}", gradoviPttBrojevi["Rijeka"]);
}
}
}
Zadatak 6
 Napišite naredbu pobroji koja prima niz
stringova. Niz će uvijek biti neprazan.
Naredba treba za svaki različit string ispisati
koliko se puta pojavljuje u listi. Ispis treba biti
u obliku uređenih parova, odvojenih zarezom,
a na kraju prazan red.
 Npr, za niz {abc,abc,aaa} ispis bi bio:
 (abc,2),(aaa,1)
Zadatak 7
 Napišite program kojim određujemo najkraću udaljenost
između dva vrha u grafu.
 Na početku unosimo vrhove koji su povezani u obliku
vrh1 vrh2 udaljenost (gdje su imena vrhova stringovi, a
udaljenost tipa double)
 To ponavljamo sve dok ne unesemo za naziv prvog
vrha kraj
 Nakon toga unosimo imena vrhova koje treba povezati.
 Program ispisuje najkraću udaljenost, ili -1 ako vrhovi
nisu spojeni

You might also like