PROGRAMSKI JEZIK JAVA – UVOD
Predmet: Principi programiranja
Profesor: Prof. dr Zoran Avramović
PANEVROPSKI UNIVERZITET APEIRON FAKULTET INFORMACIONIH TEHNOLOGIJA
UVOD – Objektno orijentisani programski jezici
Svi programski jezici obezbjeđuju apstrakciju.
Tako je mašinski jezik mala apstrakcija mašine na kojoj se
programi izvršavaju. Mnogi „proceduralni“ jezici koji su sljedili
mašinski kod (BASIC, Fortran i C), bili su apstrakcija mašinskog
jezika.
Ovi jezici su veliki napredak u odnosu na mašinski jezik, ali
njihova primarna apstrakcija ipak zahtjeva od vas da razmišljate
iz ugla strukture računara umjesto iz ugla problema koji
rješavate.
UVOD – Objektno orijentisani programski jezici
Objektno orijentisani pristup ide korak dalje, obezbjeđujući
alate pomoću kojih programer predstavlja elemente u prostoru
problema. Ovo je mnogo fleksibilnija i snažnija apstrakcija od
predhodne.
Objektno orjentisano programiranje dozvoljava da opišete
problem iz ugla problema, a ne iz ugla računara na kome će se to
rješenje izvršavati.
Prilikom razvoja Java jezika, ideja je bila da se stvori
programski jezik koji bi bio nezavisan od operativnog sistema,
baziran na C++-u, ali sa pojednostavljenom sintaksom,
stabilnijim runtime sistemom i pojednostavljenom kontrolom
memorije.
UVOD – Objektno orijentisani programski jezici
Tako je započet razvoj Java – programskog jezika, koji je danas
jedan od najmlađih objektno orjentisanih programskih jezika
razvijan je u Sun Microsystems-u početkom 1990-tih.
Sun Microsystems izbacuje prvu verziju ovog programskog
jezika, Java 1.0 u 1995. godini, pod motom “Jednom napiši,
izvršavaj bilo gdje”.
Krajem 2009. godine Java postaje vlasništvo ORACLE-a, po
čijim tvrdnjama se Java programski kod danas koristi na preko 3
milijarde raznih uređaja. Danas u 2012. godini Java doživljava
svoju sedmu verziju.
UVOD – Objektno orijentisani programski jezici
Javin izvorni kod nije kompajliran u mašinski kod nego je
pretvoren u takozvani bytecode koji zahtjeva posebno okruženje
da bi se mogao izvršavati.
To okruženje se u ovom slučaju zove Javina Virtuelna Mašina
(eng. Java Virtual Machine ili JVM). Trenutno JVM podržava
praktično sve operativne sisteme. Ideja je da ako se kod napiše i
kompajlira na jednoj platformi (npr. Mac OS X), taj isti bytecode
se može izvršavati na svim ostalim platformama koje imaju JVM
(npr. Microsoft Windows, Linux, Android) bez potrebe za
ponovnim kompajliranjem na toj platformi.
UVOD – Objektno orijentisani programski jezici
Slika prikazuje put od izvornog koda do virtualne mašine
Ova karakteristika Java jezika, da se izvorni kod prevodi u
“bytecode” pa se tek onda interpretira na virtuelnoj mašini za
određenu platformu, je najznačajnija za današnju veliku
rasprostranjenost i brz prodor ovog programskog jezika.
UVOD – Objektno orijentisani programski jezici
Java je danas prisutna na velikom broju uređaja, od mobilnih
telefona, preko tableta, televizora, automobila pa sve do servera i
super-računara.
Vrste java programa
– Aplikacija • uobičajeni program koji rješava neki problem potpuno
samostalno
– Aplet • izvršava se u Web pretraživaču u okviru neke Web strane
• automatska distribucija i instalacija
• kako se appleti učitavaju sa Interneta, uvedena su neka ograničenja radi sprečavanja zloupotrebe:
– appleti ne mogu da čitaju ili pišu u fajl sistemu korisnika
– ne mogu da komuniciraju sa serverima, osim sa onim sa kog su učitani
– ne mogu da pokreću druge programe
– Servlet, JSP (Java Server Pages) • izvršava se na Web serveru (dinamičke strane)
UVOD – Objektno orijentisani programski jezici
Šta je objekat kod objektno orijentisanih jezika?
1. Sve je objekat (možemo ga posmatrati kao poboljšanu
promjenjivu, on čuva podatke, ali možemo mu postaviti
zahtjeve koje on ispunjava vršeći operacije nad podacima),
2. Program je skup objekata, koji jedni drugima porukama
saopštavaju šta da rade,
3. Svaki objekat ima svoj memorijski prostor koji se sastoji
od drugih objekata,
4. Svaki objekat ima tip (klasu),
5. Svi objekti određenog tipa mogu da primaju iste poruke.
UVOD – Objektno orijentisani programski jezici
Objekat ima interfejs!
Objekti međusobno razmjenjuju poruke preko interfejsa.
Zahtjevi koji se postavljaju objektu definisani su preko
njegovog interfejsa, koji je određen tipom.
Interfejs određuje koje zahtjeve možemo postaviti određenom
objektu.
UVOD – Objektno orijentisani programski jezici
Sijalica sj = new Sijalica();
Sj.ukljuci()
Sijalica
ukljuci()
iskljuci()
pojacaj()
prigusi()
Ime tipa
Interfejs
U ovom primjeru, ime tipa/klase je Sijalica, ime posebnog objekta
klase Sijalica je sj, a zahtjevi koje možemo postaviti objeku Sijalica
su : uključi se, isključi se, pojačaj svjetlo i priguši svjetlo.
Objekat tipa Sijalica pravimo kada definišemo referencu (sj) na
dati objekat i pozovemo new, čime zahtjevamo novi objekat tog tipa.
Osnovni elementi Java jezika
• Imena (identifikatori)
• Tipovi podataka
• Promjenjive
• Izrazi
Imena
Imena za razne elemente Java programa
– Ime mora da počinje slovom ili _
– Ostali znaci: slova, cifre ili _
– Razlikuju se mala i velika slova
– Dužina nije ograničena
– Ne mogu se koristiti rezervisane (službene,
ključne) riječi
Imena
Konvencije za imenovanje – Paketi: sva slova su mala
• mojpaket
– Klase: početna slova svake riječi su velika slova
• MojaKlasa
– Metod/promjenljiva: početno slovo je malo, a naredne riječi počinju sa velikim slovima
• mojMetod, mojaPromjenljiva
– Konstante: sva slova su velika • MOJA_KONSTANTA
Java ključne rječi
Tipovi podataka
Kada deklarišemo promjenljivu, moramo zadati njen tip. Deklaracija promjenjivih su oblika: tip ime.
Tip vrjednosti smještene u promjenjivoj je tip podataka. Tipovi
podataka mogu biti ili primitivni ili referentni.
Primitivni tip sadrži vrjednost koja odgovara tipu podataka, kao
što je npr. broj 1 ukoliko je u pitanju cjelobrojni tip. Sa druge
strane, referentni tipovi ukazuju gdje je stvarna vrjednost ili set
vrjednosti smještena.
Postoji osam različitih primitivnih tipova podataka u programskom
jeziku Java. Njihove veličine su unaprijed definisane
specifikacijom jezika, tako da ne moramo voditi računa o
razlikama platformi.
Tipovi podataka
• Tipovi podataka byte, short, int i long služe za rad sa cjelim
brojevima i razlikuju se po veličini memorijske lokacije koja se
koristi za binarni zapis cjelih brojeva.
• Tipovi podataka float i double služe za predstavljanje realnih
brojeva . Ova dva tipa se razlikuju po veličini memorijske lokacije
koja se koristi za binarni zapis realnih brojeva, ali i po tačnosti tog zapisa.
• Tip podataka char sadrži pojedinačne alfabetske znakove kao što su mala i velika slova,cifre, znakovi interpunkcije i neki
specijalni znakovi (za razmak, za novi red, za tabulator, . . . ).
Tipovi podataka
• Tip podataka boolean služi za predstavljanje samo dvije logičke
vrjednosti: tačno (true) i netačno (false). Logičke vrjednosti u
programima se najčešće dobijaju kao rezultat izračunavanja
relacijskih operacija.
• Najzad, deveti primitivni tip podataka void je na neki način
degenerativan jer ne sadrži nijednu vrjednost. On je analogan praznom skupu u matematici i služi u nekim sintaksnim
konstrukcijama za formalno označavanje tipa podataka bez
vrjednosti.
• Svi primitivni tipovi podataka imaju tačno određenu veličinu
memorijske lokacije u bajtovima za zapisivanje njihovih vrednosti.
Tipovi podataka
Tip
podataka
Opis Veličina
boolean logička vrjednost N/A (ili je true(tačno) ili
false (netačno))
byte cijeli broj definisan sa 8 bita 8 bita
short cijeli broj definisan sa 16 bita 16 bita
int cijeli broj definisan sa 32 bita 32 bita
long cijeli broj definisan sa 64 bita 64 bita
float pokretni zarez IEEE 754 jednostruke
preciznosti
32 bita
double pokretni zarez IEEE 754 duple
preciznosti
64 bita
char znak 16 bita
Tipovi podataka
– Cjelobrojni tipovi podataka
– Brojevi sa pokretnim zarezom
– Znakovi
– Logički
29
Promjenjive
• Promjenjiva može biti deklarisana unutar klase i tada se
naziva promjenjiva članica (klase).
• Promjenjiva deklarisana unutar neke metode je lokalna
promjenjiva.
• Lokalne promjenjive imaju oblast važenja bloka.
• Globalne promjenjive u JAVI NE POSTOJE:
• Nema razlike između definicije i deklaracije promjenjive.
• Svaka promjenjiva se mora definisati (deklarisati )
• Deklaracija promjenjive:
• tip + ime + (eventualno) početna vrjednost
Format:
tip ime = vrjednost;
Tip promjenljive je primitivni ili klasni tip.
Konstatnte
int
double
flag
xCo
o
=
=
0x23ff; //
2.3E-11;//
cijeli broj zadat heksadecimalno floating point
konstante su tipa double
float
char
xx
slovo =
=
11.2F; /
'c';
konstanta tipa float ima F na kraju
• Sintaksa konstanti je ista kao u C-u. Na primjer:
char znak = '\u05D0'; // znak א predstavljen Unicodovim kodom
• U Javi se promjenljiva može učiniti konstantnom pomoću ključne riječi
final (const u C-u).
• Na primjer:
final x=3; znači da promjenljivu x više ne možemo mijenjati.
Izrazi
• Izrazi su, pojednostavljeno rečeno, formule na osnovu kojih se
izračunava neka vrjednost.
• Primjer jednog izraza u Javi je:
2 * r * Math.PI
• Bitna karakteristika izraza je to što se tokom izvršavanja programa
svaki izraz izračunava i kao rezultat se dobija tačno jedna vrjednost
koja predstavlja vrjednost izraza.
• Ova vrjednost izraza se može dodjeliti nekoj promjenjivoj,koristiti u drugim naredbama, koristiti kao argument u pozivima metoda, ili
kombinovati sa drugim vrjednostima u građenju složenijeg izraza.
Izrazi
Izrazi se dijele na proste i složene.
Prost izraz može biti literal, promjenjiva ili poziv metoda.
Složeni izrazi se grade kombinovanjem prostih izraza sa
dozvoljenim operatorima (aritmetičkim, relacijonim i drugim).
Izračunavanje vrjednosti složenog izraza odvija se primjenom
operacija koje označavaju operatori na vrjednosti prostijih izraza
koji se nalaze u složenom izrazu.
Operatori
Operatori su posebni simboli koji se koriste za kombinovanje promjenjivih,
bukvalnih vrjednosti, poziva metoda, i drugih operatora. Operator djeluje na
operandu. Na primjer, u narednom iskazu:
2*3
Operator je znak množenja, a operandi su brojevi 2 i 3.
Ukoliko želimo da zapamtimo vrjednost, to dodaje još jedan operator, znak
jednakosti (=), za dodjeljivanje:
int proizvod = 2 * 3;
Kada u izrazu ima više operatora, to dovodi do koncepta prioriteta operatora
ili redosleda po kome se operatori primjenjuju. Koji operator prvi djeluje? U
narednom iskazu imamo tri operatora: =, + i *:
int rezultat = 2 + 3 * 5;
Aritmetički operatori
Ovi operatori prihvataju operande koje su cjelobrojne ili operande pokretnog
zareza i daju cjelobrojni rezultat ili rezultat u pokretnom zarezu.
Operatori automatskog povećanja i automatskog smanjivanja su uključeni kao
aritmetički operatori.
Operator Namjena
+ sabiranje
- oduzimanje
* množenje
/ dijeljenje
% dijeljenje (sa ostatkom)
Relacioni operatori
Relacioni operatori upoređuju dve količine da bi odredili da li su one
jednake ili je jedna veća od druge.
Operator koji testira jednakost je == operator. Ukoliko su operandi
ugrađenog tipa (numerički, char ili boolean), operator jednakosti vraća logičku
vrjednost true (tačno) ukoliko operandi imaju istu vrjednost, i false (netačno)
ukoliko nemaju. Ukoliko su operandi objektne promjenljive, operator
jednakosti vraća true ukoliko objektne promjenljive upućuju na isti objekat (ili
su oba null).
Ukoliko objektne promjenljive upućuju na različite objekte ili jedna upućuje
na objekat, a druga je null, operator jednakosti vraća false.
Logički operatori
Logički operatori dodjeljuju na logičkima (boolean) operandima i vraćaju
logički rezultat. Oni implementiraju standardne logičke algebarske operacije:
AND (i), OR (ili), NOT (ne) i XOR (eXclusive OR - isključivo ili)
Operator AND vraća true ukoliko su oba operanda true. Operator OR vraća
true ukoliko je bilo koji operand ili ukoliko su oba operanda true. Java ima dve
verzije od oba ova operanda:
Prva verzija (& za AND; | za OR) prisiljavaju rezultovanje oba operanda.
Druga verzija (&& za AND; | | za OR) neće rezultovati drugi operand
ukoliko on ne može odrediti rezultat nakon rezultovanja prvog. To se naziva
skraćivanjem okolišanja (eng. short circuiting).
String operatori
Operator nadovezivanja (+) je jedini operator koji se primjenjuje na stringove
i lijevo-asocijativan je. Operator spaja dva stringa zajedno da bi oformio treći:
String s;
s = “Zdravo" + " " + “svima"; //promjenjivoj s je
//dodjeljno “Zdravo svima!"
Ukoliko je samo jedan operand string, drugi operand se automatski
konvertuje u string: String s;
s = "5 * 6 = " + (5 * 6); //promjenjivoj s je
//dodjeljeno "5 * 6 = 30"
Ukoliko je operand koji nije string objekat, Java koristi metodu toString() da bi dobila string ekvivalent objekta. Metoda toString()
je nasljeđena i može biti pozivana u svim klasama jer je implementirana u klasu Object.
Naredbe
Naredba je jedna komanda koju izvršava Java interpretator tokom izvršavanja Java programa.
Podrazumijevani redoslijed izvršavanja naredbi je onaj u kojem su naredbe napisane u programu, mada u Javi postoje mnoge upravljačke naredbe kojima se ovaj sekvencijalni redoslijed izvršavanja može promjeniti.
Naredbe u Javi mogu biti proste ili složene.
Proste naredbe obuhvataju naredbu dodijele i naredbu deklaracije promjenljive.
Naredbe
Složene naredbe služe za komponovanje prostih i složenih naredbi radi definisanja komplikovanijih upravljačkih struktura u programu.
U složene naredbe spadaju blok naredbi, naredbe grananja (if naredba, if-else naredba i switch naredba) i naredbe ponavljanja (while naredba, do-while naredba i for naredba).
Naredbe dodjele
Naredba dodijele je osnovni način da se vrijednost nekog izraza dodijeli promjenjivoj u programu.
Glavni opšti oblik naredbe dodijele je:
promjenljiva = izraz;
Efekat izvršavanja naredbe dodijele može se podijeliti u dva koraka:
najprije se izračunava vrijednost izraza na desnoj strani znaka jednakosti, a zatim se ta vrijednost dodijeljuje promjenjivoj na lijevoj strani znaka jednakosti.
Naredbe dodjele
U stvari,bilo koji operator dodijele može se koristiti kao naredba dodijele dodavanjem tačke-zapete na kraju.
Na primjer:
brojStudenata = 30; // dodijela
a += b; // kombinovana dodijela
n++; // inkrementiranje
m--; // dekrementiranje
Blok naredbi
Blok naredbi (ili kraće samo blok) je niz od više naredbi napisanih između otvorene i zatvorene vitičaste zagrade.
Opšti oblik bloka naredbi je:
{
naredba1
naredba2
.
.
.
naredba n
}
Blok naredbi
Osnovna svrha bloka naredbi je samo da se niz bilo kakvih naredbi grupiše u jednu (složenu) naredbu.
Blok se obično nalazi unutar drugih složenih naredbi kada je potrebno da se više naredbi sintaksno objedine u jednu naredbu.
Efekat izvršavanja bloka naredbi je sekvencijalno izvršavanje niza naredbi unutar bloka.
Blok naredbi
U sljedećem primjeru bloka naredbi, međusobno se zamjenjuju vrjednosti cjelobrojnih promjenjivih x i y, pod pretpostavkom da su ove promjenjive u programu deklarisane i inicijalizovane ispred bloka:
{
int z; // pomoćna promjenjiva
z = x; // vrijednost z je stara vrijednost x
x = y; // nova vrijednost x je stara vrijednost y
y = z; // nova vrijednost y je stara vrijednost x
}
Ovaj blok čini niz od 4 naredbe koje se redom izvršavaju. Primjetimo da je pomoćna promjenjiva z deklarisana unutar samog bloka.
NAREDBA IF I IF-ELSE
Naredba if je najprostija upravljačka naredba koja omogućava uslovno izvršavanje niza od jedne ili više naredbi.
Svaka naredba if se sastoji od jednog logičkog izraza i jedne (blok) naredbe koji se u oštem obliku pišu na sljedeći način:
if (logički-izraz)
naredba
Izvršavanje naredbe if se izvodi tako što se najpre izračunava vrijednost logičkog izraza u zagradi.
NAREDBA IF I IF-ELSE
Zatim, zavisno od toga da li je dobijena vrijednost logičkog izraza tačno ili netačno, naredba koja se nalazi u produžetku logičkog izraza izvršava se ili preskače.
Ako je dobijena vrijednost tačno (true), ta naredba se izvršava; u suprotnom slučaju, ako je dobijena vrijednost netačno (false), ta naredba se ne izvršava.
Time se u oba slučaja izvršavanje naredbe if završava, a izvršavanje programa se dalje nastavlja od naredbe koja slijedi iza naredbe if.
NAREDBA IF I IF-ELSE
Kako niz naredbi unutar vitičastih zagrada predstavlja jednu (blok) naredbu, naredba unutar if naredbe može biti i blok naredbi.
if (x > y) {
int z;
z = x;
x = y;
y = z;
}
U ovom primjeru se izvršava međusobna zamjena vrijednosti promjenjivih x i y samo ukoliko je vrijednost promjenljive x početno veća od vrjednosti promjenjive y. U suprotnom slučaju se cijeli blok od četiri naredbe preskače.
NAREDBA IF I IF-ELSE U slučaju kada je vrijednost logičkog izraza if naredbe jednaka
netačno, programska logika često nalaže da treba uraditi nešto drugo,
a ne samo preskočiti naredbu unutar if naredbe.
Za takve slučajeve služi naredba if-else čiji je opšti oblik:
if (logički-izraz)
naredba1
else
naredba2
Izvršavanje if-else naredbe je slično izvršavanju if naredbe, osim što u slučaju kada je vrijednost logičkog izraza u zagradi jednaka netačno, izvršava se naredba2 i preskače naredba1.
NAREDBA IF I IF-ELSE
U drugom slučaju, kada je vrijednost logičkog izraza jednaka tačno, izvršava se naredba1 i preskače naredba2.
Time se u oba slučaja izvršavanje if-else naredbe završava, a izvršavanje programa se dalje nastavlja od naredbe koja sledi iza if-else naredbe.
Jedan primer upotrebe naredbe višestrukog grananja je sledeći programski fragment u kojem se određuje ocjena studenta na ispitu na osnovu broja osvojenih poena i „standardne” skale:
NAREDBA IF I IF-ELSE
// Podrazumjeva se 0 <= brojPoena <= 100
if (brojPoena >= 91)
ocjena = 10;
else if (brojPoena >= 81)
ocjena = 9;
else if (brojPoena >= 71)
ocjena = 8;
else if (brojPoena >= 61)
ocjena = 7;
else if (brojPoena >= 51)
ocjena = 6;
NAREDBA SWITCH
Treća naredba grananja, naredba switch, na neki način je specijalni slučaj naredbe višestrukog grananja iz prethodnog odjeljka kada izbor jednog od više alternativnih blokova naredbi za izvršavanje zavisi od vrijednosti datog cijelobrojnog ili znakovnog izraza.
Naime, u tom slučaju je neefikasno da se izračunavanje tog izraza ponavlja u višestruko ugneždenim if naredbama.
Najčešći oblik naredbe switch je:
NAREDBA SWITCH
switch (izraz) {
case konstanta1: // izvrši odavde ako izraz == konstanta1
niz-naredbi1
break; // kraj izvršavanja tog slučaja
case konstanta2: // izvrši odavde ako izraz == konstanta2
niz-naredbi2
break; // kraj izvršavanja tog slučaja
...
case konstantan: // izvrši odavde ako izraz == konstantan
niz-naredbi n
break; // kraj izvršavanja tog slučaja
default: // izvrši odavde u krajnjem slučaju ...
niz-naredbi n+1
} // kraj izvršavanja tog slučaja
NAREDBA SWITCH
Ovom switch naredbom se najprije izračunava izraz u zagradi na početku naredbe.
Zatim se zavisno od dobijene vrijednosti tog izraza izvršava niz naredbi koji je pridružen jednom od slučajeva označenih klauzulama case unutar switch naredbe.
Pri tome se redom odozgo na dole traži prva konstanta uz klauzulu case koja je jednaka vrijednosti izračunatog izraza i izvršava se odgovarajući niz naredbi pridružen pronađenom slučaju.
Poslednji slučaj u switch naredbi može opciono biti označen klauzulom default, a taj slučaj se izvršava ukoliko izračunata vrijednost izraza nije jednaka nijednoj konstanti uz klauzule case.
NAREDBA WHILE
Naredba while je osnovna naredba za ponavljanje izvršavanja neke naredbe (ili bloka naredbi) više puta.
Pošto ciklično izvršavanje bloka naredbi obrazuje petlju u sljedu izvršavanja naredbi programa, while naredba se često naziva i while petlja.
Blok naredbi unutar while petlje čije se izvršavanje ponavlja naziva se tijelo petlje.
Broj ponavljanja tijela petlje se kontroliše vrijednošću jednog logičkog izraza.
NAREDBA WHILE
Ovaj logički izraz se naziva uslov nastavka (ili uslov prekida) petlje, jer se izvršavanje tijela petlje ponavlja sve dok je vrijednost tog logičkog izraza jednaka tačno, a ovo ponavljanje se prekida u trenutku kada vrijednost tog logičkog izraza postane netačno.
Ponovljeno izvršavanje tijela petlje se može, u principu,izvoditi beskonačno, ali takva beskonačna petlja obično predstavlja grešku u programu.
Opšti oblik while naredbe je:
while (logički-izraz)
naredba
NAREDBA WHILE
Izvršavanje while naredbe se izvodi tako što se najpre izračunava vrijednost logičkog izraza u zagradi.
U jednom slučaju, ako je dobijena vrijednost jednaka netačno, odmah se prekida izvršavanje while naredbe.
To znači da se preskače ostatak while naredbe i izvršavanje programa se normalno nastavlja od naredbe koja sledi iza while naredbe.
U drugom slučaju, ako izračunavanje logičkog izraza da je tačno, najprije se izvršava naredba unutar while naredbe, a zatim se ponovo izračunava logički izraz u zagradi i ponavlja isti ciklus.
NAREDBA WHILE
U narednom jednostavnom primeru while naredbe se na ekranu prikazuje niz brojeva 0, 1, 2, . . ., 9 u jednom redu:
int broj = 0;
while (broj < 10) {
System.out.print(broj + " ");
broj = broj + 1;
}
System.out.println(); // pomeranje kursora u novi red
U ovom primjeru se na početku cijelobrojna promjenljiva broj inicijalizuje vrijednošću 0. Zatim se izvršava while naredba, kod koje se najprije određuje vrijednost logičkog izraza broj < 10.
NAREDBA DO - WHILE
Kod while naredbe se uslov prekida petlje provjerava na početku svake iteracije.
U nekim slučajevima, međutim, prirodnije je provjeravati taj uslov na kraju svakog izvršavanja tijela petlje.
U takvim slučajevima se može koristiti do-while naredba koja je vrlo slična while naredbi, osim što su riječ while i uslov prekida pomjereni na kraj, a na početku se nalazi službena reč do.
Opšti oblik do-while naredbe je: do naredba while (logički-izraz); ili, ako je naredba unutar do-while naredbe jedan blok naredbi, taj oblik je:
do {niz-naredbi }
while (logički-izraz);
NAREDBA DO - WHILE
Na primjer, do-while naredbom se prikazivanje brojeva 0, 1, 2, . . ., 9 u jednom redu na ekranu može postići na sledeći način:
int broj = 0;
do {
System.out.print(broj + " ");
broj = broj + 1;
} while (broj < 10);
System.out.println(); // pomjeranje kursora u novi red
Kod izvršavanja do-while naredbe se najpre izvršava tijelo petlje, odnosno izvršava se naredba ili niz naredbi u bloku između službenih reči do i while. Zatim se izračunava vrijednost logičkog izraza u zagradi.
NAREDBA FOR
Treća vrsta petlji u Javi se obično koristi kada je potrebno izvršiti tijelo petlje za sve vrijednosti određene promjenljive u nekom intervalu.
Za prikazivanje brojeva 0, 1, 2, . . ., 9 u jednom redu na ekranu, na primjer, koristili smo naredbe while i do-while. U tim naredbama se zapravo tijelo petlje sastoji od prikazivanja promjenljive broj, a ovo tijelo petlje se izvršava za sve vrijednosti promjenljive broj u intervalu od 0 do 9.
U ovom slučaju je mnogo prirodnije koristiti naredbu for, jer je odgovarajući ekvivalentni programski fragment mnogo kraći i izražajniji:
NAREDBA FOR
for ( int broj = 0; broj < 10; broj = broj + 1)
System.out.print(broj + " ");
System.out.println(); // pomjeranje kursora u novi red
Opšti oblik for naredbe je:
for (kontrolni-dio)
naredba
U drugom slučaju, ako se tijelo naredba for sastoji od bloka naredbi, njen opšti oblik je:
for (kontrolni-dio) {
niz-naredbi
}
NAREDBA FOR
Kod izvršavanja for naredbe dakle, na samom početku se izvršava dio inicijalizacija konrolnog dijela, i to samo je for petlje predstavljen logičkim izrazom izračunava prije svakog izvršavanja tijela for petlje, a izvršavanje petlje se prekida kada izračunata vrijednost logičkog izraza jeste netačno.
Dio završnica konrolnog dijela se izvršava na kraju svakog izvršavanja tijela for petlje, neposredno posle izvršavanja tijela petlje i prije ponovne provjere uslova nastavka petlje.
Dio inicijalizacija može biti bilo koji izraz, mada je to obično naredba dodjele.
NAREDBE BREAK I CONTINUE
Kod while petlje i do-while petlje se uslov prekida tih petlji proveravana početku odnosno na kraju svake iteracije. Slično, iteracije for petlje se završavaju kada se ispuni uslov prekida u kontrolnom delu te petlje.
Ponekad je ipak prirodnije prekinuti neku petlju u sredini izvršavanja tela petlje. Za takve slučajeve se može koristiti break naredba koja ima jednostavan oblik:
break;
Kada se izvršava break naredba unutar neke petlje, odmah se prekida izvršavanje te petlje i prelazi se na normalno izvršavanje ostatka programa od naredbe koja sledi iza petlje.
NAREDBE BREAK I CONTINUE
U petljama se slično može koristiti i continue naredba čiji je oblik takođe jednostavan:
continue;
Međutim, izvršavanjem continue naredbe se samo preskače ostatak aktuelne iteracije petlje.
To znači da se, umesto prekidanja izvršavanja cele petlje kao kod break naredbe, continue naredbom prekida izvršavanje samo aktuelne iteracije petlje i nastavlja sa izvršavanjem naredne iteracije petlje (uključujući i izračunavanje uslova prekida petlje radi provere da li treba uopšte nastaviti izvršavanje petlje).
Radno okruženje
• – Java Development Kit (JDK 7u10) - http://java.sun.com/
• – JCreator-radno okruženje - http://www.jcreator.com/
• – NetBeans 7.2.1 - http://netbeans.org/
• – Eclipse - http://www.eclipse.org/
Java SE (Standard Edition)
Java Me (Micro Edition)
Java EE (Enterprise Edition).
Jednostavni primjeri Java koda
public class Pozdrav
{ /* ispis poruke na ekranu */
public static void main (String[] args)
{ System.out.println("Zdravo svima!") ;
}
}
Analiziramo li ovaj jednostavan kod, vidimo da ovdje postoje dva objekta. Prvi je
System.out, a drugi sam niz znakova "Zdravo svima!".
Između ova dva objekta postoji dio koda: “println“. To je metoda kojom objekat
System.out ispisuje tekst "Zdravo svima!". Operacije koje se izvršavaju nad
objektom nazivaju se metode. Konkretno metoda “println“ znači “ispiši ono što ti
dajem na konzoli i pređi u novi red”.
Gdje su tu objekti?
Kako je konstruisan program iz primjera?
public class Pozdrav
Sa ovom linijom koda definišemo javnu klasu koju ćemo nazvati “pozdrav”.
Klase mogu biti: javne, privatne i zaštićene (public, private, protected)
/* ispis poruke na ekranu */
Ovo je komentar koji opisuje šta bi program trebao raditi. To je jednostavno
poruka za onoga ko čita izvorni kod programa.
Svaki tekst između /* i */ biće tretiran kao komentar i Java prevodioc će ga u
potpunosti ignorisati.
public static void main (String[] args)
Ovo predstavlja zaglavlje (eng. heading) metode. Svaka metoda ima svoj
naziv. U ovom slučaju naziv metoda je riječ koja se nalazi neposredno ispred
zagrade. Riječ public označava da je metoda javno dostupna. Argument
metode main() je niz objekata klase String. Argumente args ne koristimo u
ovom programu, ali prevodilac insistira da se tu nalaze.
Kako je konstruisan program iz primjera?
{ System.out.println("Zdravo svima!") ;
}
Ovo je tijelo (eng. body) metoda. Uvijek se sastoji od niza naredbi
zatvorenih u vitičaste zagrade, {..}. Pozivom ovog metoda izvršava se svaka od
naredbi (u ovom slučaju samo jedna).
U ovom primjeru klasa se sastoji od samo jednog člana, metode nazvane
main. Uopšteno, program se sastoji od jedne ili više definicija klasa od kojih
svaka sadržava jednu ili više metoda. Java programeri koriste konvenciju po
kojoj naziv klase započinje velikim slovom, a naziv metode malim slovom.
IME FAJLA MORA BITI ISTO KAO I IME
OSNOVNE KLASE
Kako je konstruisan program iz primjera?
Na sledećoj slici prikazan je program koji se sastoji od jedne naredbe
razdvojen okvirima koji nam pokazuju šta je klasa, šta je metoda, a šta su
naredbe.
Upravljnje iskazima u Javi - if iskazi
Najjednostavniji uslovni iskaz je if blok, koji obezbjeđuje izvršavanje iskaza ukoliko
neki uslovni izraz rezultuje u true (tačno). Na primjer, da bismo provjerili argumente
koji su proslijeđeni iz komandnog reda, provjeriće da li je dužina niza proslijeđenog metodi main() jednaka nuli
public static void main (String argumenti[]){
if (argumenti.lenght == 0)
System.out.println("Nema argumenata");
}
Za sve uslovne iskaze if, umetnut izraz mora rezultirati u logičku vrjednost true ili
false. Ukoliko izraz rezultuje u true, izvršavaju se iskazi koji se nalaze neposredno
iza if odredbe.
Upravljnje iskazima u Javi - if iskazi
Ukoliko želimo da izvršimo više iskaza, moramo ih postaviti u vitičaste zagrade, kao što
je prikazano na sledećem primjeru:
public static void main (String argumenti[]){
if (argumenti.lenght == Ø){
System.out.println("Nema argumenata");
System.out.println("Trebalo bi da nesto unesete");
}
}
Upravljnje iskazima u Javi - switch iskazi
Iskaz switch radi dobro kada imamo dugačak blok if-else iskaza koji svi testiraju zadatu
cjelobrojnu vrjednost (ili nešto što može biti predstavljeno int promjenljivom, kao što je
char, byte ili short, ali ne long, float, double ili boolean). Razmotrimo ovaj poduži if-else
blok:
int dana = ...;
if (dana == 28){
uradiMjesec28();
} else if (dana == 30){
uradiMjesec30();
} else if (dana == 31){
uradiMjesec31();
} else {
uradiPrestupnuGodinu();
}
Neki ljudi switch iskaz smatraju jasnijim načinom da se urade stvari. Uslov koji
upoređujemo je samo zajednička promjenljiva iz svake od if provjera:
switch (promjenljiva)
Upravljnje iskazima u Javi - switch iskazi
Dok je svaka vrjednost koju provjeravamo zadata vrjednost (case vrjednost:) ili
konačna odredba koja je uvijek ispunjena (deufalt). Potom, za koju god provjeru da
se vrjednosti promjenjivih podudaraju, switch iskaz počinje izvršavanje koda od tog
mjesta. Evo prethodnog if bloka kao nekomplementiranog switch bloka:
switch (dana){
case 28:
uradiMjesec28();
case 30:
uradiMjesec30();
case 31:
uradiMjesec31();
deufalt:
uradiPrestupnuGodinu();
}
Upravljnje iskazima u Javi - switch iskazi
Sledeći primjer demostrira mogućnosti za izvršavanje koda za više slučajeva. Možemo
napraviti blok switch koji prijavljuje broj dana u zavisnosti od mjeseca (i godine, da bi se
obradile prestupne godine). Ovdje će mjesec biti 1 do 12, a mi ćemo postaviti promjenljivu
dana na osnovu toga koji mjesec je proslijeđen. Obratićemo pažnju da slučajevi za April,
Juni, Septembar i Novembar (30 dana) dijele isti blok koda koji treba izvršiti.
int getDana(int mjesec, int godine){
int dana;
switch (mjesec){
case 4: // April
case 6: // Juni
case 9: // Septembar
case 11: // Novembar
dana = 30;
break;
case 2: // Februar
if (((godina % 4 == 0) &&
(godina % 100 != 0)) ¦¦ (godina %400 == 0)){
dana = 29;
} else {
Upravljnje iskazima u Javi - switch iskazi
dana = 28;
}
break;
deufalt: // ostali
dana = 31;
break;
}
return dana;
}
Upravljnje iskazima u Javi - switch iskazi
Iskaz for se koristi kada je potrebno da izvršimo iskaz (ili blok iskaza ukoliko koristimo
vitičaste zagrade) više puta, sa jednostvnim korakom inicijalizacije, uslovom za prekid, a
potom korakom ka ažuriranju.
Kada se for petlja izvršava, ona izvodi korak inicijalizacije, a potom provjerava uslov.
Ukoliko je uslov true (ispunjen), izvršava se tijelo petlje. Kada je završeno izvršavanje
tijela petlji, izvršava se korak ažuriranja. Nakon toga se ponovo provjerava uslov. Ovo
izvršavanje se nastavlja dok uslov ne bude bio false. Donja slika vizualizuje ovaj proces.
Upravljnje iskazima u Javi - while iskazi
Da bismo demostrirali petlju for, kreirajmo petlju za pregled svih argumenata
komandnog reda. Ovdje ćemo napraviti promjenljivu i i inicijalizovaćemo je na nula u našem koraku inicijalizacije. Ova promjenljiva će biti lokalna za petlju for i neće biti
dostupna van petlje. Uslov naše petlje će provjeravati da i nije previše poraslo i izašlo van
kraja niza. Korak ažuriranja povećava promjenljivu, a tijelo prikazuje vrjednost sa zadatom
vrijednošću indeksa:
for (int i=0; i < argumenti.lenght; i++){
System.out.println(argumenti[i]);
}
Kako se dužina niza argumenti neće promjeniti za vrijeme izvršavanja petlje, možemo je
jednom očitati u bloku inicijalizacije i snimiti u lokalnoj promjenjivoj.
Upravljanje iskazima u Javi - while izrazi
Petlja while je jednostavnija od for petlje jer ona samo ima uslov i tijelo.
Kod nje se prvo provjerava uslov, i ukoliko je on true (ispunjen) izvršava se
tijelo petlje prije ponovnog provjere uslova:
while (uslov)
tijelo;
Obično, tijelo petlje na kraju mijenja stanje koje se provjerava u uslovu, jer
ukoliko uslov uvijek rezultuju u true, petlja će se izvršavati vječno. Kao i kod petlje for, tijelo petlje while se nikad ne izvršava ukoliko je uslov na
početku false. Slika na sledećem slajdu prikazuje opšti tok petlje while.
Upravljanje iskazima u Javi - while izrazi
Upravljanje iskazima u Javi - do-while izrazi
Posljednja konstrukcija petlje koja se koristi je do-while petlja – najmanje
korišćena, jer uvijek izvršava iskaze iz svog tijela petlje makar jednom, prije
nego što uopšte provjeri uslov. Međutim, češći je slučaj da je potrebno prvo provjeriti uslov. Evo osnovne strukture do-while petlje:
do
tijelo
while (uslov);
Upravljanje iskazima u Javi - break izrazi
Iskaz break koristimo da bi smo zaustavili izvršavanje bloka koda ili
iskaza switch. Kada sistem naiđe na iskaz break, trenutno zaustavlja
izvršavanje bloka koda i prenosi kontrolu programa na iskaz koji neposredno
slijedi iza bloka. Na primjer, pretpostavimo da 10 puta želimo proći petlju, ali
želimo da prekinemo sa petljom ukoliko se desi neki poseban uslov. Možemo dodati iskaz break koji će nas prebaciti na iskaz nakon petlje (što je u ovom
slučaju System.out.println("Tri");).
for (int i=0; i<5; i++){
System.out.println("Jedan");
if (i == 3){
break;
}
System.out.println("Dva");
}
System.out.println("Tri");
Upravljanje iskazima u Javi - return izrazi
return iskaz koristimo da bi smo prebacili kontrolu nazad pozivaču
metode. Ukoliko deklarišemo svoju metodu da vraća void, koristimo samo
return, bez pratećeg izraza:
return;
Međutim, ukoliko smo deklarisali svoju metodu da vraća vrjednost, moramo se
osigurati da vraćamo odgovarajući tip vrjednosti iz svoje metode. To smo uradili u metodi getDana() u switch primjeru, gdje smo deklarisali da
vraća int. Evo koda ponovo, sa pojačanim iskazom return:
Upravljanje iskazima u Javi - return izrazi
int getDana(int mjesec, int godine){
int dana;
switch (mjesec){
case 4: // April
case 6: // Juni
case 9: // Septembar
case 11: // Novembar
dana = 30;
break;
case 2: // Februar
if (((godina % 4 == 0) &&
(godina % 100 != 0)) || (godina %400 == 0)){
dana = 29;
} else {
dana = 28;
}
break;
deufalt: // ostali
dana = 31;
Upravljanje iskazima u Javi - return izrazi
break;
}
return dana;
}
Prema tome, pokazivač će pozvati metodu, a potom na odgovarajući način
koristi povratnu vrjednost:
int vrjednost = getDana(2, 2000);
Primjeri Java programa
Zadatak 1
Načiniti program za pronalaženje i štampanje svih prostih brojeva manjih od datog prirodnog broja N.
Rješenje: import java.util.Scanner;
public class zadatak1
{
public static void main(String[] args)
{
Scanner tastatura=new Scanner(System.in);
System.out.println("Program pronalazi i ispisuje proste brojeve manje
od unesenog broja.");
System.out.print("Unesi broj do kojeg želis da program ispise proste
brojeve: ");
int a=tastatura.nextInt();
System.out.println("Prosti brojevi su:");
for(int b=1; b<a; b++) \\ petlja dodjeljuje vrij od 1 do a
{
Primjeri Java programa
boolean prost=true; \\ utvrđuje istinu da li je prost
for(int c=2; c<b; c++) \\ petlja dijeli b sa svim manjim od b
{
if (b%c==0) \\ ako je djeljiv nije prost
{
prost=false;
break; \\ izađi iz petlje
}
}
if(prost)
System.out.print(b+", ");
}
}
}
Primjeri Java programa
Zadatak 2
Načinite program za određivanje svih prostih činilaca datog prirodnog broja N. (npr. 10 je djeljiv sa 5 i 2)
Rješenje:
import java.util.Scanner;
public class zadatak2
{
public static void main(String[]args)
{
System.out.println("Program pronalazi i ispisuje proste činioce
unesenog broja.");
System.out.print("Unesite broj koji želis rastaviti na proste činioce:
");
Scanner tastatura=new Scanner(System.in);
int a=tastatura.nextInt();
System.out.print("Prosti činioci broja "+a+" su: ");
int b=1;
while(b<=a)
{
Primjeri Java programa
b++;
while(a%b==0) \\ ako je ostatak od djeljenja jednak nuli
{
System.out.print(b+", ");
a/=b; \\ a je jednako a\b
}
}
}
}
Primjeri Java programa
Zadatak 3
Najveći zajednički dijeliliac (NZD) dva prirodna broja je najveći broj kojim možemo podijeliti i broj m i broj n a
da pri tome nemamo ostatka.
Rješenje:
import java.util.Scanner;
public class zadatak3
{
public static void main(String[] args)
{
System.out.println("Program pronalazi i ispisuje NZD za dva prirodna
broja.");
System.out.print("Unesi prvi broj: ");
Scanner tastatura=new Scanner(System.in);
int a=tastatura.nextInt();
System.out.print("Unesi drugi broj: ");
int b= tastatura.nextInt();
System.out.println("NZD za brojeve "+a+" i "+b+" je "+nzd(a,b)+".");
}
static int nzd(int a,int b) \\definisanje podklase nzd
{
Primjeri Java programa
int c=1;
if (a==b) \\ ako je a jednako b
{
c=a; \\ varijabli c upisati vrjednost a
}
else if(a>b)
{
c=nzd(a-b,b);
}
else
{
c=nzd(a,b-a);
}
return c;
}
}
Primjeri Java programa
Zadatak 4
Može li se zadati prirodan broj M predstaviti kao zbir dva kvadrata? Načiniti program koji riješava ovaj zadatak.
Rješenje:
import java.util.Scanner;
public class zadatak4
{
public static void main(String args[])
{
System.out.println("Program pronalazi i ispisuje kako zadati broj
predstaviti kao zbir kvadrata dva prirodna broja.");
Scanner tastatura=new Scanner(System.in);
System.out.print("Unesi neki prirodni broj M koji želiš da predstaviš
kao zbir kvadrata: ");
int M=tastatura.nextInt(); \\ unesi cijeli broj M
for(int a=1; a<=(int)Math.sqrt(M); a++) \\ od a do kvadratnog korijena
broja M
{
Primjeri Java programa
for(int b=1; b<=(int)Math.sqrt(M); b++)
{
int c=a*a;
int d=b*b;
if (c+d==M)
{
System.out.println("Prirodni broj "+M+" jednak je zbiru
kvadrata "+a+" i "+b);
System.out.println(M+"="+c+"+"+d);
}
}
}
}
}
Primjeri Java programa
Zadatak 5
Podijeliti dva prirodna broja na zadat broj decimala, N (N<50) koristeći pravilo za ručno dijeljenje.
Rješenje:
import java.util.Scanner;
public class zadatak5
{
public static void main(String args[])
{
System.out.println("Program dijeli dva prirodna broja na zadati broj
decimala.");
Scanner tastatura=new Scanner(System.in);
System.out.print("Unesi dijeljenik:");
int a= tastatura.nextInt();
System.out.print("Unesi dijelilac:");
int b=tastatura.nextInt();
System.out.print("Unesi na koliko decimala želis da bude rezultat: ");
int N=tastatura.nextInt(); \\ za N upiši unos sa tastature
Primjeri Java programa
int c=a/b; \\ dijelimo cijeli broj
System.out.print(c+","); \\cijeli broj, f
for (int d=0;d<N;d++) \\ brojač decimala
{
int e=a%b;\\ varijabla e jednaka ostatku dijeljenja
a=e*10; \\ dodajemo nulu na ostatak
int f=a/b; \\ određujemo vrjednost decimale
System.out.print(f); \\ ispisujemo decimalu
}
}
}
HVALA NA PAŽNJI!