ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum: 30.10.2011.
Workshop
Uvod u Javu (Zadaci + Rjeenja)
1. Otvorite razvojno okruenje Eclipse.
Pokrenite eclipse.exe (napravite shortcut na desktop-u)
2. Otvorite novi projekat File -> New -> Java Project
3. U folder src dodajte novi package-folder sa nazivom "si.vjezbe" Otvorite menij na src folderu pomou mia (desni klik) i odaberite New -> Package
4. U package "si.vjezbe" dodajte novu klasu sa imenom "Zadatak01" Otvorite menij na "si.vjezbe" folderu pomou mia (desni klik) i odaberite New -> Class
Slika 1. Primjer dodavanja nove klase u Eclipse-u
5. Isprobajte code slijedeeg programa. Program pokrenite sa opcijom Run as -> Java Application ili CTRL + F11
U programskom jeziku Java, za razliku od programskih jezika C++ i C#, jedna javna
klasa se implementiraju u zaseban istoimeni fajl. Klasa NekaKlasa se smjeta u fajl
NekaKlasa.java (kompajlirana klasa e se zvati NekaKlasa.class).
Klase se smjetaju u package-e, koji predstavljaju logiku grupu klasa, koji su na fajl-
sistemu predstavljeni kao folderi i podfolderi.
Package moete porediti sa putanjom foldera za neki fajl. Pogledajte sljedei primjer.
putanja foldera +
naziv fajla =
puna putanja do fajla
c:\folder1\folder2\ fajl.txt c:\folder1\folder2\fajl.txt
package +
naziv klase =
puni naziv klase
Java.util. ArrayList Java.util.ArrayList
Slika 2. Analogija izmeu package-a i putanje foldera
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
Dodavanje package-a se vri na sljedei nain:
a) desni klik na folder src
b) New -> Package
c) Upiite ime package-a -> Finish
Dodavanje klasa se vri na sljedei nain:
a) desni klik na ime package
b) New -> Class
c) Upiite ime nove klase -> Finish
Nekadanji cin i cout
Ispis na ekran se vri pomou statikih funkcija print i println koje se nalaze u klasi Console. Slijedi primjer ispisa stringova.
1:
2:
3:
4:
5:
6:
public static void main(String[] args)
{
String naziv = "FIT";
String grad = "Mostar";
System.out.println("Fakultet " + naziv + " se nalazi u gradu " + grad + "!");
}
Slijedi primjer ispisa brojanih podataka.
1:
2:
3:
4:
5:
6:
7:
public static void main(String[] args)
{
String naziv = "FIT";
Integer godina = 2007;
System.out.println("Copyright by " + naziv + ", " + godina.toString());
}
U prethodnom primjeru moemo izbaciti poziv funkcije toString, jer kompajler zna da
mora sabrati varijablu godina kao string a ne kao brojanu vrijednost. Sljedei primjer je
ekvivalentan kao prethodni.
1:
2:
3:
4:
5:
6:
7:
public static void main(String[] args)
{
String naziv = "FIT";
Integer godina = 2007;
System.out.println("Copyright by " + naziv + ", " + godina);
}
ta e se ispisatu u sljedeem programu?
1:
2:
3:
4:
5:
6:
7:
8:
9:
public static void main(String[] args)
{
String naziv = "FIT";
Integer godina = 2007;
System.out.println("Copyright by " + naziv + ", " + godina.toString());
System.out.println("Copyright by " + naziv + ", " + (godina + 1));
System.out.println("Copyright by " + naziv + ", " + godina + 1);
}
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Uitavanje sa tastature se vri pomou funkcija readLine koje se nalaze u klasi
BufferedReader. Slijedi primjer uitavanja stringova.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public static void main(String[] args)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String naziv;
System.out.println("Unesite naziv fakulteta");
try
{
naziv = reader.readLine();
} catch (IOException e)
{
naziv = "";
}
System.out.println("Copyright by " + naziv);
}
Napomena: Ako kopirate ovaj dio koda u novu klasu, pojavit e greke kao na sljedeoj slici.
Slika 3. Java program bez importovanih potrebnih paketa
Problem nastaje jer nisu importovani potrebni paketi. Njihovo ukljuivanje je neophodno kako bi kompajler mogao pronai klase. Ovaj problem se moe automatski rijeiti pomou opcije Organize packages, koja se moe pozvati na jedan od sljedea dva naina:
[1] (desni klik na kode) -> Source -> Organize packages
[2] kombinacija tipki CTRL + SHIFT + O Nakon koritenja ove opcije, Eclipse je automatski dodao linije koda koje ukljuuju potrebne pakete.
Slika 4. Java program (importovani paketi)
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
Funkcija readLine se mora nalaziti u try-catch blocku.
S obzirom da mi veoma esto moramo uitati neki string sa tastature, preporuujemo da napravimo statiku funkciju getString() koja e nam biti uvijek lahko dostupna. Primjer poziva
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
package ba.fit.imeprojekta.ui.gui.v1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class NekaKlasa
{
public static String ucitajString()
{
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
String result;
try
{
result = reader.readLine();
} catch (IOException e)
{
result = "";
}
return result;
}
public static void main(String[] args)
{
System.out.println("Unesite naziv fakulteta");
String naziv = ucitajString();
System.out.println("Unesite naziv grada");
String grad = ucitajString();
System.out.println("Copyright by " + naziv + ", " + grad);
}
}
Uitavanje cjelobrojnih vrijednosti
Povratna vrijednost funkcije ucitajString() je podatak tipa string. Ako elimo uitati
brojane vrijednosti moramo string pretvoriti (engl. parse) u neku brojanu vrijednost. Slijedi primjer.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public static void main(String[] args)
{
int godina;
String s;
System.out.println("Unesite godinu:");
s = uctajString();
godina = Integer.parseInt(s);
//...
}
Funkcija main je statika funkcija i ona se uvijek mora nalaziti u nekoj klasi.
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
Nizovi (jednodimenzionalni)
Slijedi primjer koritenja niza tipa int:
1:
2:
3:
4:
5:
int[] n = new int[5];
n[0] = 123;
n[1] = 124;
n[2] = 125;
//...
Prethodni primjer vrijedi za statike podatke kao npr. int, boolean, double.
Meutim, naredna dva primjera se odnose na niz objekata neke klase.
Primjer 1: Alokacija objekata niza bez konstruktora
1:
2:
3:
4:
5:
6:
7:
8:
NekaKlasa[] n = new NekaKlasa[10]; //U C++ ovo predstavlja niz od 10 pokazivaa na NekaKlasa
n[0] = new NekaKlasa(); //
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
Petlja foreach
Slijede dva primjera koritenja automatizovane foreach-petlje.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public static void main(String[] args)
{
int[] n = new int[30];
n[0] = 11;
n[1] = 12;
for (int i : n)
{
System.out.println(i);
}
}
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public static void main(String[] args)
{
NekaKlasa[] n = new NekaKlasa[30];
//ovdje je potrebno alocirati elemente niza
for (NekaKlasa i : n)
{
i.nekiClan = "neka vrijednost";
}
}
Tijelo petlje (linija br. 9) e se pozvati automatski za svaki lan niza n (tj. 30 puta).
Varijabla i e poprimiti vrijednost svakog lan niza n.
Varijabla i mora biti isti tip podatka kao niz n.
Slijedi jo jedan primjer koritenja automatizovane foreach-petlje.
1:
2:
3:
4:
5:
6:
7:
void nekaFunkcija(NekaKlasa[] m)
{
for (NekaKlasa i : m)
{
i.nekiClan = "neka vrijednost";
}
}
Foreach-petlja predstavlja forward-only i read-only pristup. Petlju foreach ne moete
koristiti za deklarisanje objekata u dinamikoj memoriji interativnoj varijabli i. Alokacija
objekta u narednom primjeru u liniji broj 5 nije ispravna. Varijablu (pokaziva) i smo
usmjerili na objekat koji je tek alociran, dok elementi niza n (pokazivai u nizu n) nee
biti 'usmjereni' (pokazivati) na novi objekat.
1:
2:
3:
4:
5:
6:
7:
NekaKlasa[] n = new NekaKlasa[30];
for (NekaKlasa i : n)
{
i = new NekaKlasa(); // "i = nesto..." nije dozvoljeno
i.nekiClan = "neka vrijednost"; // "i.nekiClan = nesto..." je uredu
}
Prethodnu foreach-petlju je potrebno zamijeniti obinom for-petljom. Slijedi ispravak
prethodnog programa.
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
7
Fakultet informacijskih tehnologija
1:
2:
3:
4:
5:
6:
7:
NekaKlasa[] n = new NekaKlasa[30];
for (int i = 0; i < n.length; i++)
{
n[i] = new NekaKlasa();
n[i].nekiClan = "neka vrijednost";
}
Uvodni zadatak Napravite program sljedei navedene zahtjeve:
a) neka korisnik sa tastature vri unos cijelog broja x
b) deklariite niz n tipa int veliine x
c) uitajte vrijednost niza sa tastature koristei for petlju
d) ispiite vrijednost niza koristei foreach petlju. (Objanjenje foreach petlje slijedi u nastavku.)
Rjeenje se nalazi na stranici 13.
Pravo pristupa
U jeziku Java, kao i u jeziku C#, morate prije svakog lana klase ili funkcije napisati da li
je rije o javnom, privatnom, zatienom ili defaultnom lanu.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public class NekaKlasa
{
private int NekiPrivatniClan;
public int NekiJavniClan;
private void NekaPrivatnaFunkcija()
{
//...
}
public void NekaJavnaFunkcija()
{
//...
}
}
Ako ne oznaite o kojoj vrsti lana je rije, on e se smatrati kao default, a to znai da je
mogue pristupati samo iz istog package-a.
U programskom jeziku Java, za razliku od C++-a, se ne stavlja taka-zarez (;) na kraj
klase.
Ako definiite funkciju kao statiku onda toj funkciji pristupamo preko klase a ne preko
objekta. Primjer statike funkcije su funkcije printLine koje se nalaze u klasi
System.out.
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
8
Fakultet informacijskih tehnologija
Slijede jo neke napomene:
a) Funkcija main mora biti statika.
b) Funkcija main mora se nalaziti u nekoj klasi.
c) Dealociranja memorije vie nema! To se vri automatski.
d) Svi objekti se alociraju u dinamikoj memoriji.
Kopiranje objekata neke klase vri se uvijek po refernci.
public static void main(String[] args)
{
NekaKlasa a = new NekaKlasa();
NekaKlasa b = a;
a.cijena = 20;
b.cijena = 23;
System.out.println(a.cijena); //ispis: 23
}
Ovdje se varijable a i b ponaaju kao pokazivai iz jezika C++
U prethodnom primjer a i b su referenca na isti objekat. Tako e izmjena
preko varijable b uticati i na varijablu a. (Program e ispisati vrijednost
23.)
e) Poetna vrijednost varijabli je neinicijalizirana vrijednost. Svakoj varijabli morate
dodijeliti neku poetnu vrijednost (npr. null). Slijedei program e prijaviti
greku.
public static void main(String[] args)
{
NekaKlasa p;
if (p == null) // error: The local variable p may not have been initialized System.out.println("p je null");
else
System.out.println("p nije null");
}
Zadatak 1a:
Napravite prazan projekat i dodajte sljedee:
a) Definiite klasu Kupac:
Dodajte javne lanove adresa, telefon, email, napomena i privatni lan
naziv (neka svi lanovi budu tipa String)
Dodajte javne gettere i settere za lana naziv. Prilikom ove do
inicijalizacije potrebno je odsjei prazne razmake prije i poslije naziva
kupca i postaviti ga velikim slovima. (proitajte pomo na kraju zadatka)
b) Definiite statiku funkciju ucitaj (u klasi Zadatak1a):
funkcija treba da ima jedan parametar (koji predstavlja niz tipa Kupac)
funkcija treba uitati podatke sa tastature u niz.
koristite for-petlju (ovdje nije mogue koristiti petlju foreach)
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
9
Fakultet informacijskih tehnologija
c) Definiite statiku funkciju ispis (u istoj klasu kao i funkcija main)
funkcija treba da ima jedan parametar (koji predstavlja niz tipa Kupac)
funkcija treba ispisati podatke o kupcima na ekran (koristiti foreach petlju)
d) Definite funkciju main (u klasu Zadatak1a)
definiite niz od 5 kupaca
uitajte podatke za kreirani niz pomou funkcije ucitaj
ispiite podatke za kreirani niz pomou funkcije ispis
Rjeenje se nalazi na stranici 13.
Pomo:
Funkcija trim nad Stringom vraa string sa uklonjenim praznim razmacima sa
poetka i kraja stringa.
Funkcija toUpperCase nad stringom vraa string iji su svi karakteri velika
slova.
Slijedi primjer poziva funkcija.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public static void main(String[] args)
{
String org = " fit Mostar ";
String a = org.trim();
String b = org.toUpperCase();
System.out.println("a[" + a + "]"); //a[fit Mostar]
System.out.println("b[" + b + "]"); //b[ FIT MOSTAR ]
}
Zadatak 1b:
Pitanje: Kako bi ste pozvali funkcije ucitaj i ispis da one nisu statike a nalaze se u istoj klasi
gdje je funkcija main?
Zadatak:
a) Prepravite program tako da funkcije ucitaj i ispis budu statike funkcije u klasi
Kupac. Da li funkcije moraju biti javne?
b) Napravite novu klasu FConsoleReader u koju ete premjestiti funkciju
ucitajString.
Odgovor i rjeenje se nalazi na stranici 15.
Zadatak 2:
Prepravite prethodni program tako da umjesto klasinih nizova koristite generike liste
(klasa ArrayList ). (Klasa ArrayList je slina klasi vector u jeziku C++.)
Rjeenje se nalazi na stranici 17.
Pomo:
Koje su prednosti liste u odnosu da klasine nizove ?
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
10
Fakultet informacijskih tehnologija
Prednosti su sljedee:
nije potrebno prilikom deklaracije liste navoditi veliinu niza (lista se automatski
iri), primjer deklaracije liste n tip String:
ArrayList n = new ArrayList();
mogue je dodavanje i uklanjanje elemenata se bilo koje pozicije
o funkcija n.add(i, "FIT") dodaje objekat na poziciju i (lista se iri)
o funkcija n.add("FIT")dodaje objekat na zadnju poziciju (lista se iri)
o funkcija n.remove(i) brie objekat sa pozicije i (lista se smanjuje)
o funkcija n.get(i) pristupamo objektu na poziciji i
o funkcija n.add("FIT")dodaje objekat na zadnju poziciju (lista se iri)
pomou funkcije subList mogue je izdvojiti dio niza
o noviNiz = n.subList(i, j) izdvaja (kopira) iz niza n objekte sa
indeksom i, (i+1), (i+2), ..., (j-1), j
pomou funkcije n.contains("FIT") mogue je pretraiti listu
pomou funkcije n.size() moemo saznati broj elementa u listi
Slijedi primjer rada koritenja generikih listi.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
public static void main(String[] args)
{
ArrayList n = new ArrayList();
for (int i = 0; i < 10; i++)
{
System.out.println("Unesite neku rije");
String str = ucitajString();
n.add(str);
}
for (int i = 0; i < n.size(); i++)
{
String str = n.get(i);
System.out.println(str);
}
}
Slijedi isti primjer, ali sa upotrebom foreach-petlje (u ispisu).
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public static void main(String[] args)
{
ArrayList n = new ArrayList();
for (int i = 0; i < 10; i++)
{
System.out.println("Unesite neku rije");
String str = ucitajString();
n.add(str);
}
for (String str : n)
ProgramiranjeI_sylabus.doc
Softverski inenjering :: Vjebe
http://dl.fit.ba/
11
Fakultet informacijskih tehnologija
13:
14:
15:
16:
{
System.out.println(str);
}
}
Slijedi primjer koji ispisuje elemente sa indeksom 2,3,4,5 sa upotrebom foreach-petlje i
funkcije subList.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public static void main(String[] args)
{
ArrayList n = new ArrayList();
for (int i = 0; i < 10; i++)
{
System.out.println("Unesite neku rije");
String str = ucitajString();
n.add(str);
}
for (String str : n.subList(2, 5))
{
System.out.println(str);
}
}
Zadatak 3:
Prepravite prethodni program tako da se korisniku (u funkciji ucitaj), nakon to je
korisnik unio sve podatke o jednom kupcu, omogui (npr. ako korisnik unese rije da)
ponovni unos podataka o novom kupcu.
Ako korisnik, nakon jednog unosa, ne eli unos novog kupca program treba, pomou
funkcije ispis, ispisati sve kupce.
U ovom programu veliina niza nije unaprijed poznata. Koristite, umjesto klasinih
nizova, generiku listu?
Rjeenje se nalazi na stranici 18.
WorkshopUvod u Javu (Zadaci + Rjeenja)Nekadanji cin i coutFunkcija main je statika funkcija i ona se uvijek mora nalaziti u nekoj klasi.Nizovi (jednodimenzionalni)Petlja foreachPravo pristupa