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);
int [] ocene = new int [n];
| 0 | 1 | 2 | 3 | 4 |
ocene
ocene[ 2 ] = 5;
| 5 | ||||
|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 |
ocene
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
}
| 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:
int max= ocene [0];
for( int i = 0; i < n; 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{
if(ocene [ i ] > max)
{
max=ocene[i];
}
}
Slika 1: Nizovi. Određivanje maksimuma
Deklarisanje i definisanje nizova
Deklaracija niza od 10 celih brojeva izgleda:int [] niz;
niz = new int [10];
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;
| 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:
int n;
String nStr;elementNizaStr;
nStr=JOptionPane.showInputDialog("Unesi broj elemenata niza");
n=Integer.parseInt(nStr);
//Definisanje niza od n elemenata
int [] niz= new int[n];
//Ucitavanje niza
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:for(int i = 0; i < n; i++)
{
elementNizaStr=JOptionPane.showInputDialog("Ucitaj "+(i+1)+". element niza");
niz[i]=Integer.parseInt(elementNizaStr);
}
//Ispisivanje niza
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:for(int i = 0; i < n; i++)
{
System.out.print(niz[i]+" ");
}
int brPozitivnih=0;
for(int i = 0; i < n; i++)
{
if (niz[i] > 0)
brPozitivnih++;
}
Kompletan kod je dat na slici ispod:for(int i = 0; i < n; i++)
{
if (niz[i] > 0)
brPozitivnih++;
}
Slika 2: Nizovi. Određivanje broja pozitivnih elemenata niza
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
Ciklusi i nizovi
Posmatrajmo sledeći problem:Želimo da simuliramo promenu položaja s[m] pri ravnomernom kretanju za promenu vremena.
- Posmatraćemo promene položaja za svaki mali porast vremena od dt[s].
- Uzmimo da je ta promena za dt=0.05s
- Neka se vreme menja tokom 1s
- 20 promena po 0.05s = 1s
- Početne vrednosti su s=0; t=0; v unosi korisnik
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
System.out.println(“s=“+s);
Dakle, na sledeći način:s=s+v*dt; //promena položaja za 0.05s
System.out.println(“s=“+s);
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
System.out.println(“s=“+s+”);
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
System.out.println(“s=“+s+”);
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
System.out.println(“s=“+s+”);
...
Ovaj način nije dobar.
Vidimo da se 3 naredbe ponavljaju 20 puta.
Umesto toga treba napisati 3 naredbe jedan put a onda koristiti neku drugu naredbu koja će ih ciklično ponoviti onoliko puta koliko mi želimo
To su naredbe koje zovemo ciklusi(petlje):
for
while
do-while
Sada bi prethodnu simulaciju rešili na sledeći način:
for(int i = 0; i < n; i++)
{
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
System.out.println(“s=“+s);
}
{
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
System.out.println(“s=“+s);
}
Primer: Kreirati 20 kuglica čiji su centri raspoređeni u dvodimenzionalnoj ravni
po slučajnom principu. Prečnik kuglica je r.
Kreirajmo prvo 1 kuglicu.Položaj centra u ravni je određen sa koordinatama x i y, dobijenih po slučajnom principu. Za generisanje slučajnih brojeva koristićemo klasu Math i njenu funkciju random(). Ova funkcija generiše slučajan broj između 0 i 1.
Ako želimo da x bude slučajan broj u opsegu 10-290
a y u opsegu 0-400
x=10+Math.random()*280;
y=Math.random()*400;
Simulacija je kreirana pomoću alata EJS(Easy Java Simulation). Više o izradi simulacija pomoću ovog alata može se videti na sajtu:y=Math.random()*400;
https://kosi-hitac.herokuapp.com/
Kuglica čije su koordinate izračunate korišćenjem Math.random() funkcije vidi se na sledećoj slici:
Slika 3: Ciklusi i nizovi. Prikaz kreirane kuglice.
Da bi kreirali kuglicu kreiramo objekat koji će predstavljati tu kuglicu:
x=10+Math.random()*280;
y=Math.random()*400;
Kuglica k=new Kuglica(x, y, 1);
Da bi kreirali objekat klase Kuglica, moramo da definišemo klasu:y=Math.random()*400;
Kuglica k=new Kuglica(x, y, 1);
public class Kuglica
{
double x,y,r;
public Kuglica(double x, double y,double r)
{
this.x = x;
this.y= y;
this.r = r;
}
Kreirajmo sada 20 kuglica.{
double x,y,r;
public Kuglica(double x, double y,double r)
{
this.x = x;
this.y= y;
this.r = r;
}
Koordinate treba kreirati po slučajnom principu. Potrebno je upamtiti te koordinate da bi mogle da se upotrebe kasnije.
Slika 4: Ciklusi i nizovi. Prikaz kreiranih 20 kuglica nasumično.
Kreiramo koordinate kao i za 1 kuglu i stavimo u for ciklus da bi dobili 20 ponavljanja. Problem je zapamtiti dobijene koordinate. Da bi smo ih upamtili treba uvesti niz prema sledećoj sintaksi:
tip_podatka[ ] naziv_niza=new tip_podatka [dimenzija];
Slika 5: Ciklusi i nizovi. Definisanje nizova
Ovo će obezbediti memoriju za 20 podataka po nizu:
Slika 6: Ciklusi i nizovi. Definisanje nizova, prikaz memorije
Da bi generisali koordinate centara kuglica, posmatrane u dvodimenzionoj ravni X0Y, koristimo pomenute formule i stavljamo ih u telo for ciklusa da bi obezbedili 20 ponavljanja, na sledeći način. Treća dimenzija(z) je konstantna z=0 jer posmatramo samo kretanje u ravni, tako da je nećemo pisati;
for(int i = 0; i < n; i++)
{
x=10+Math.random()*280;
y=Math.random()*400;
}
Da bi upamtili sve x i y koordinate, za kasniju upotrebu umesto običnih promenljivih tipa double treba uvesti nizove.{
x=10+Math.random()*280;
y=Math.random()*400;
}
Koristimo for za ponavljanje a random funkcija za slučajne brojeve:
for(int i = 0; i < n; i++)
{
x[i]=10+Math.random()*280;
y[i]=Math.random()*400;
}
gde je "i" pozicija u nizu. Ovo će dodeliti vrednosti x nizu i y nizu sa slučajnim brojevima i redom popuniti memoriju:{
x[i]=10+Math.random()*280;
y[i]=Math.random()*400;
}
Slika 7: Ciklusi i nizovi. Definisanje nizova, Inicijalizacija
U prethodnom primeru želimo da imamo skup objekata koji predstavljaju kuglice:
Kuglica [] kuglice=new Kuglica [20];
Koristimo for za ponavljanje a random funkciju za slučajne brojeve.
for(int i = 0; i < n; i++)
{
x[i]=10+Math.random()*280;
y[i]=Math.random()*400;
Kuglica k = new Kuglica(x, y, 1);
kuglice[i] = k;
}
poslednji red u for petlji:{
x[i]=10+Math.random()*280;
y[i]=Math.random()*400;
Kuglica k = new Kuglica(x, y, 1);
kuglice[i] = k;
}
kuglice[i] = k;
popunjava memoriju niza kuglice sa objektima
Slika 8: Ciklusi i nizovi. Popunjavanje sa podacima
Ako bi želeli da izvršimo kretanje svih kuglica u x pravcu za neku slučajnu veličinu dx, koristili bi niz objekta koji je upamćen u memoriji, zatim izvlačili 1 po 1 objekat iz memorije i vršili pomeranja. Koristimo for za ponavljanje arandom funkciju za slučajne brojeve
for(int i = 0; i < n; i++)
{
double dx=Math.random()*10;
Kuglica k=kuglice[i];
k.x=k.x+dx;
}
{
double dx=Math.random()*10;
Kuglica k=kuglice[i];
k.x=k.x+dx;
}
| Prethodno |< Petlje u programskom jeziku Java |
Sledeće Klase i objekti>| |
Srodni članci
Ugnježdene petlje u C/C++Nizovi-primeri
Euklidov algoritam
Internet stvari
Grananje u programu - primeri
