SI Workshop 02 (Java Zadaci)

11
Softverski inženjering :: Vježbe http://dl.fit.ba/ 1 Fakultet informacijskih tehnologija [email protected] Datum: 30.10.2011. Workshop Uvod u Javu (Zadaci + Rješenja) 1. Otvorite razvojno okruženje 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 pomoću miša (desni klik) i odaberite New -> Package 4. U package "si.vjezbe" dodajte novu klasu sa imenom "Zadatak01" Otvorite menij na "si.vjezbe" folderu pomoću miša (desni klik) i odaberite New -> Class Slika 1. Primjer dodavanja nove klase u Eclipse-u 5. Isprobajte code slijedećeg 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 smješta u fajl NekaKlasa.java (kompajlirana klasa će se zvati NekaKlasa.class). Klase se smještaju u package-e, koji predstavljaju logičku grupu klasa, koji su na fajl- sistemu predstavljeni kao folderi i podfolderi. Package možete porediti sa putanjom foldera za neki fajl. Pogledajte sljedeći 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 između package-a i putanje foldera

Transcript of SI Workshop 02 (Java Zadaci)

  • ProgramiranjeI_sylabus.doc

    Softverski inenjering :: Vjebe

    http://dl.fit.ba/

    1

    Fakultet informacijskih tehnologija

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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

    [email protected]

    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