JAVA I NIZOVI
Nizovne promenljive se koriste kad je potrebno upamtiti u memoriji više podataka istog tipa npr. int.
Da bi ste vežbali primere iz ove blasti idite na stranu: Nizovi u JAVI-primeri.
Posmatrajmo sledeći zadatak:
Primer: Potrebno je uneti ocene iz n predmeta i izračunati najveću ocenu.
Rezervišemo memoriju za podatak ocena, a zatim koristeći for ciklus pokušamo da unesemo n ocena(npr. n=5):
int ocena, n = 5;
String ocenaStr;
for( int i = 0; i < n; i++){
ocenaStr=JOptionPane.showInputDialog(“Unesi ocenu”);
ocena=Integer.parseInt(ocenaStr);
}ocena=Integer.parseInt(ocenaStr);
Međutim, pošto ocena pamti samo jedan broj, po izlasku iz for ciklusa biće upamćena samo poslednja ocena. Zadatak na ovaj način neće moći da se reši. Ne može se dalje, odredjivati najveća ocena(maximum), pošto nisu upamćene sve ocene. Ocene bi se mogle upamtiti kada bi smo umesto obične promenljive koristili nizovnu promenljivu, koja može sačuvati više podataka istog tipa. Uvedimo niz;
int [] ocene = new int [n];
Naziv niza je: ocene. Operator [] predstavljaju oznaku da je u pitanju niz, dok operator new rezerviše memoriju za n celih brojeva, jer vrednost u uglastoj zagradi zapravo je dimenzija niza.
0 | 1 | 2 | 3 | 4 |
ocene
Na slici je prikazana memorija koja je rezervisana za niz od 5 elemenata. Brojevi ispod polja predstavljaju indeks polja niza. Prvi član niza ima index 0, a poslednji n-1, tj. u ovom slučaju to je 4. Ako želimo da u polje sa indeksom 2(treće polje) unesemo ocenu 5 napisali bi smo:
ocene[ 2 ] = 5;
Evo kako bi izgledalo stanje u memoriji u tom slučaju:
5 | ||||
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
ocene
Unošenje ocena korišćenjem Input dijaloga, kroz for petlju bi sada izgledalo:
int [] ocene = new int [n];/*dodat red */
for( int i = 0; i < n; i++){
ocenaStr=JOptionPane.showInputDialog(“Unesi ocenu”);
ocene[ i ] =Integer.parseInt(ocenaStr); //promenjen red
}
Niz ocena bi se popunjavao redom kroz cikluse. U 1. ciklusu kada je i=0, vrednost upisana na dijalogu bi otišla u polje sa indeksom 0, u 2. ciklusu kada je i=1 u polje ocene[1], a to je drugo polje po redu i tako do kraja niza. Na kraju for ciklusa stanje u memoriji bi izgledalo npr.
3 | 4 | 5 | 5 | 4 |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
ocene
Određivanje maksimalnog elementa niza
Sada kada su sve ocene upamćene u memoriji možemo ih po potrebi izvući i recimo odrediti Najveću ocenu max.
Maksimalna ocena se određuje na sledeći način:
Maksimalna ocena se određuje na sledeći način:
int max= ocene [0];
Prvo se definiše celobrojna promenljiva koja će predstavljati maksimalnu ocenu i pretpostavi se da je jednaka prvoj oceni u nizu, tj. početna vrednost joj je ocene[0]. Dalje se otvara for ciklus i kroz ciklus se redom pristupa sledećoj oceni po redu ocene[i]. Proverava se u svakom ciklusu da li je nova ocena možda veća od trenutnog maksimuma i ako jeste ta vrednost postaje maksimum. To izgleda ovako:
for( int i = 0; i < n; i++)
{
if(ocene [ i ] > max)
{
max=ocene[i];
}
}
{
if(ocene [ i ] > max)
{
max=ocene[i];
}
}
Kada se ciklus završi promenljiva max predstavlja najveću ocenu. Kompletan kod ovog primera dat je na slici
Deklarisanje i definisanje nizova
Deklaracija niza od 10 celih brojeva izgleda:
int [] niz;
Definicija istog niza(tada se i rezerviše memorija za taj niz:
niz = new int [10];
Ovo će obezbediti mesto u memoriji za 10 celih brojeva. Ako bi smo pokušali da pristupimo 11-tom elementu niza program bi prekinuo izvršavanje na tom mestu zbog greške.
Nedostatak nizova je u tome što, kad unapred neznamo koliko će niz sadržati elemenata moramo da rezervišemo više mesta nego što očekujemo, za svaki slučaj. Deo tih mesta verovatno će ostati neiskorišćen ali neće doći do prekida programa zbog toga.
Mogućnost da se rezerviše broj mesta tačno onoliko koliko će biti potrebno rešava se upotrebom kolekcija, ali to je predmet izlaganja na višem kursu.
Nedostatak nizova je u tome što, kad unapred neznamo koliko će niz sadržati elemenata moramo da rezervišemo više mesta nego što očekujemo, za svaki slučaj. Deo tih mesta verovatno će ostati neiskorišćen ali neće doći do prekida programa zbog toga.
Mogućnost da se rezerviše broj mesta tačno onoliko koliko će biti potrebno rešava se upotrebom kolekcija, ali to je predmet izlaganja na višem kursu.
Definisanje realnog niza
Realni niz se definiše slično kao i celobrojni, s tim da umesto int stoji double ili float.
float [] niz1 = new float[10];
double [] niz2 = new double[10];
Davanje vrednosti članovima niza
Elementima niza se pristupa pomoću indeksa koji počinju od 0. Na primer za niz realnih brojeva od 5 elemenata definisanje i zadavanje vrednosti elementima bi bilo:
double [] niz= new double[5];
niz[0]=1.1;niz[1]=2.0;
niz[2]=2.5;
niz[3]=-1.6;
niz[4]=3.3;
Niz bi tada izgledao:
1.1 | 2.0 | 2.5 | -1.6 | 3.3 |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
ocene
Davanje vrednosti članovima niza kada su one unapred poznate
Ako unapred znamo vrednosti elemenata niza onda se inicijalizacija niza vrši zajedno sa definisanjem niza. Prethodni niz se inicijalizuje na sledeći način:
double [] niz= {1.1, 2.0, 2.5, -1.6, 3.3 };
PRIMER Učitavanje niza i određivanje pozitivnih:
Tekst zadatka: Učitati n, a zatim učitati n članova celobrojnog niza i odrediti koliko ima pozitivnih.
Rešenje: Prvo treba učitati n, da bi se mogao definisati niz jer je n dimenzija tog niza:
Rešenje: Prvo treba učitati n, da bi se mogao definisati niz jer je n dimenzija tog niza:
int n;
String nStr;elementNizaStr;
nStr=JOptionPane.showInputDialog("Unesi broj elemenata niza");
n=Integer.parseInt(nStr);
Zatim se rezerviše memorija za niz celih brojeva koji će imati n elemenata:
//Definisanje niza od n elemenata
int [] niz= new int[n];
Sada se mogu učitavati elementi:
//Ucitavanje niza
for(int i = 0; i < n; i++)
{
elementNizaStr=JOptionPane.showInputDialog("Ucitaj "+(i+1)+". element niza");
niz[i]=Integer.parseInt(elementNizaStr);
}
for(int i = 0; i < n; i++)
{
elementNizaStr=JOptionPane.showInputDialog("Ucitaj "+(i+1)+". element niza");
niz[i]=Integer.parseInt(elementNizaStr);
}
Niz se zatim, ispisuje na sledeći način koristeći for ciklus:
//Ispisivanje niza
for(int i = 0; i < n; i++)
{
System.out.print(niz[i]+" ");
}
for(int i = 0; i < n; i++)
{
System.out.print(niz[i]+" ");
}
U drugom delu, koristeći for ciklus sa istim parametrima kao i prilikom učitavanja i ispisivanja elemenata niza, brojimo elemente koji su pozitivni:
int brPozitivnih=0;
for(int i = 0; i < n; i++)
{
if (niz[i] > 0)
brPozitivnih++;
}
for(int i = 0; i < n; i++)
{
if (niz[i] > 0)
brPozitivnih++;
}
Kompletan kod je dat na slici ispod:
Nizovi i objekti
Prethodni primeri su pokazivali smeštanje u memoriju niza prostih podataka. Nizovi se mogu praviti i od objekata određene klase. Npr. niz lopti od 10 elemenata(klasa Lopta) bi bio:
Lopta [ ]lopte= new Lopta[10];
Ovde su svi elementi istog tipa, tj klase Lopta. Ako objekte različitog tipa treba smestiti u niz, onda se to može uraditi tako što se kao tip u nizu navede klasa koju klase tih objekata nasleđuju. Npr. Ako treba npr. napraviti niz objekata za crtanje: linije, krugove, pravougaonike i sve te klase pripadaju istoj hijerarhiji klasa tj. nasleđuju klasu GeometrijskiOblik, niz bi izgledao:
GeometrijskiOblik [ ] elementi=new GeometrijskiOblik[10];
U svakom slučaju sve klase indirektno nasleđuju klasu Object pa se uvek može za niz objekata mešovitog tipa napisati:
Object[ ]elementi=new Object[];
Više o nasleđivanju klasa pogledati na stranici:
Nasleđivanje klasa
Nasleđivanje klasa