Polja Polje (eng. array) Polje je imenovani uređeni skup indeksiranih vrijednosti istog tipa (niz, lista, matrica, tablica) Kod deklaracije, iza naziva tipa dolaze uglate zagrade: int[] brojilo; // polje cjelih brojeva double[] vrijednosti; // polje realnih brojeva Početna vrijednost varijable je null (specijalna vrijednost u C#-u za neinicijalizirane objekte) 1
Kreiranje polja Polje se kreira naredbom new (novo) // uspostavljanje polja za 4 cijelobrojne vrijednosti brojilo = new int[4]; // uspostaljanje polja, za vrijednosti realnog tipa, duljine // određene vrijednoscu cijelobrojne varijable velicina int velicina = Convert.ToInt32(Console.ReadLine()); vrijednosti = new double[velicina]; Prikaz polja dijagramom stanja brojilo članovi, elementi polja indeksi članova polja Pohrana vrijednosti u polje Koristi se operator [ ] brojilo[0] = 7; brojilo[1] = brojilo[0] * 2; brojilo[2]++; brojilo[3] -= 60; brojilo 2
Pristup elementima polja Uobičajen način prolaza kroz polje je korištenjem inkrementirajuće varijable u petlji kao indeksa int i = 0; while (i < 4) { Console.WriteLine (brojilo[i]); i++; Kopiranje polja Kad se nekoj varijabli polja pridruži vrijednost druge varijable polja, ne kopira se sadržaj već samo referenca (pokazivač) na polje double[] a = new double [3]; double[] b = a; Dvije varijable upućuju na isto polje 3
Kopiranje polja Promjena vrijednosti bilo koje varijable će se reflektirati i na drugu jer obe varijable referenciraju na isto polje u memoriji Ako se želi napraviti tvrda kopija polja, potrebno je kreirati novo polje iste veličine i kopirati vrijednosti svih elemenata iz starog polja: double[] b = new double [3]; int i = 0; while (i < 3) { b[i] = a[i]; i++; Duljina polja Polja su složeni objekti koji imaju imenovane varijable (atribute) i odgovarajuće metode Atributom Length može se saznati duljina polja Console.WriteLine( Duljina polja je + b.length) U petlji za gornju granicu veličine polja prikladno koristiti varijablu Length, a ne konstantnu vrijednost for (int i = 0; i < a.length; i++) { b[i] = a[i]; 4
Višedimenzionalna polja (matrice) Broj dimenzija polja određen je brojem zareza unutar uglatih zagrada uvećan za jedan kod deklaracije int a[]; // jedna dimenzija int b[,]; // dvije dimenzije int c[,,]; // tri dimenzije Dvodimenzionalno polje sa tri retka i dva stupca može se deklarirati na slijedeći način: int x[,] = new int[3, 2]; Višedimenzionalna polja (matrice) Za dohvaćanje elementa polja moraju se navesti indeksi za svaku dimenziju x[0, 0] = 4; x[0, 1] = 3; int z = x[0, 0] * x[0, 1]; // rezultat je 12 Veličina svake dimenzije se može doznati pomoću metode GetLength Console.WriteLine( x.getlength(0) ); // 3 Console.WriteLine( x.getlength(1) ); // 2 5
Prolaz kroz dvodimenzionalno polje Primjer postavljanja vrijednosti svih elemenata na 1 for (int i=0; i<x.getlength(0); i++) { for (int j=0; j<x.getlength(1); j++) { x[i, j] = 1; Kod dohvaćanja elementa, prva varijabla (u primjeru i)predstavlja redak, a druga varijabla (u primjeru j) stupac Metode sa poljima kao parametrima Metode mogu imati polja kao parametre, npr. static void IspisiPolje(int[] polje) { for(int i=0; i<polje.length; i++) { Console.Write(polje[i] + ); Console.WriteLine(); Kod običnih varijabli metodi se šalje vrijednost Kod varijabli deklariranih kao polja, metodi se šalje referenca što znači da metoda ima pristup originalnom polju static void KvadrirajElemente(int[] polje) { for(int i=0; i<polje.length; i++) { polje[i] = polje[i] * polje[i]; 6
Metode sa poljima kao parametrima Primjer: int[] x = new int[4]; x[0] = 2; x[1] = 4; x[2] = 6; x[3] = 8; IspisiPolje(x); KvadrirajElemente(x); IspisiPolje(x); Izvršavanjem gornjeg kôda, na zaslonu će se ispisati: 2 4 6 8 4 16 36 64 Metode koje vraćaju polja Pored primitivnih tipova (int, double, string, bool), metode mogu vratiti i polje bilo kojeg tipa Primjer metode koja vraća polje u kojem je niz od prvih n prirodnih parnih brojeva: static int[] ParniBrojevi(int n) { int[] brojevi = new int[n]; int brojac = 2; for(int i=0; i<n; i++) { brojevi[i] = brojac; brojac = brojac + 2; return brojevi; 7
Slučajni brojevi Računalni programi Deterministički Predodređeni slijed izvođenja naredbi programa Uz iste ulazne vrijednosti uvijek slijedi jednaki rezultat Nedeterministički Nepredvidiv slijed izvođenja naredbi programa je teško postići (računalo je deterministički sustav) Upotreba (pseudo)slučajnih (random) brojeva Primjena kod simulacije stvarnih pojava i procesa Klasa za generiranje slučajnih brojeva Klasa Random sadrži metode za generiranje slučajnih brojeva Prije upotrebe potrebno je kreirati generator sa naredbom new Random rnd = new Random(); Za generiranje cijelih slučajnih brojeva koristi se metoda Next: int x = rnd.next(100); // rezultat je broj 0-99 int y = rnd.next(40, 60); // rezultat je broj 40-59 Za generiranje realnih slučajnih brojeva u intervalu 0.0 x < 1.0 koristi se metoda NextDouble double p = rnd.nextdouble(); 8
Polje slučajnih brojeva Slučajno generirane vrijednosti između donje i gornje granice imaju istu vjerojatnost pojavljivanja U slučaju velikog broja slučajno generiranih vrijednosti, svaka vrijednost se mora pojaviti približno jednak broj puta Način provjere vjerojatnosti pojavljivanja slučajno generiranih brojeva Generirati veliki broj vrijednosti Pohraniti ih u polje Izbrojati broj pojavljivanja svakog broja Metoda generiranja polja slučajnih brojeva Stvaranje polja slučajnih brojeva (0-99) dužine n može se napisati u obliku metode koja vraća jednodimenzionalno polje tipa int: static int[] SlucajnoPolje (int n) { Random rnd = new Random(); int[] a = new int[n]; for (int i = 0; i<a.length; i++) { a[i] = rnd.next(0, 100); return a; Da bi stvorili i ispisali polje slučajno proizvedenih brojeva čija je dunjina 20, dovoljno je pozvati dvije metode: IspisiPolje( SlucajnoPolje(20) ); 9
Predložak prolaz i brojanje Prikaz slučajnih brojeva histogramom Brojila bilježe broj pojavljivanja pojedine vrijednosti unutar zadanih područja (klasa) vrijednosti Elementi predloška rješavanja prolaz i brojanje Skup ili spremnik koji treba proći, npr. polje ili znakovni niz Provjera koju treba uraditi na svakom elementu spremnika Brojilo koje bilježi koliko je elemenata prošlo provjeru Brojanje vrijednosti unutar zadanog područja Metoda brojanja unutar zadanog područja: static int UPodrucju (int[] a, int low, int high) { int brojilo = 0; for (int i=0; i<a.length; i++) { if (a[i] >= low && a[i] < high) brojilo++; return brojilo; Određivanje brojeva unutar područja: int[] uspjeh = SlucajnoPolje (30); int a = UPodrucju (uspjeh, 90, 100); int b = UPodrucju (uspjeh, 80, 90); int c = UPodrucju (uspjeh, 70, 80); int d = UPodrucju (uspjeh, 60, 70); int f = UPodrucju (uspjeh, 0, 60); 10
Veliki broj područja Za veći broj područja mukotrpno je navoditi sva područja int brojilo0 = UPodrucju (uspjeh, 0, 1); int brojilo1 = UPodrucju (uspjeh, 1, 2); int brojilo2 = UPodrucju (uspjeh, 2, 3);... int brojilo99 = UPodrucju (uspjeh, 99, 100); Upotreba polja brojila Za sva područja u intervalu 0 100 rezultate možemo spremiti u zasebno polje int[] brojila = new int [100]; for (int i = 0; i<100; i++) { brojila[i] = UPodrucju (uspjeh, i, i+1); Varijabla petlje se koristi kao: Indeks članova polja Parametar metode UPodrucju 11
Rješenje u jednom prolazu Svakim pozivom metode UPodrucju prolazi se kroz cijelo polje Učinkovitije je jedanput proći kroz polje i za svaku vrijednost, odrediti u koje područje ulazi i inkrementirati vrijednost odgovarajućeg brojila int[] brojila = new int [100]; for (int i = 0; i < uspjeh.length; i++) { int indeks = uspjeh[i]; brojila[indeks]++; Pojmovnik polje: imenovani uređeni skup indeksiranih vrijednosti istog tipa zbirka: podatkovna struktura koja sadrži skup članova ili elemenata element: jedna vrijednost polja. Operatorom [] se odabiru elementi polja indeks: cijelobrojna varijabla ili vrijednost korištena za označavanje elementa polja 12
Pojmovnik determinističan: program koji uz jednake ulazne podatke daje isti rezultat prilikom svakog izvođenja pseudoslučajni brojevi: slijed brojeva koji se čine slučajnim vrijednostima, ali su proizvedeni determinističkim računanjem histogram: polje cijelih brojeva pri čemu svaki cijeli broj označava broj vrijednosti unutar nekog zadanog područja Domaća zadaća Zadatak 1: Napisati metodu PreslikajPolje čiji parametar je polje cijelih brojeva i koja uspostavlja novo polje istog broja članova, preslikava članove prvog polja u novo polje i kao rezultat primjene metode vraća referencu na novo polje Zadatak 2: Napisati metodu SlucajniRealni čiji su parametri varijable donja i gornja i koja kao rezultat primjene metode vraća slučajni realni broj x takav da je donja <= x < gornja Zadatak 3: Obuhvati kod u metodu nazvanu Histogram koja prihvaća polje uspjeha i kao rezultat vraća histogram vrijednosti polja. Preurediti metodu tako da histogram ima samo 10 brojila i broji koliko ima vrijednosti u svakom području duljine 10 vrijednosti, tj. u području 90, 80, itd. 13