Docstoc

Programimi dhe algoritmet

Document Sample
Programimi dhe algoritmet Powered By Docstoc
					Programimi dhe algoritmet
             Faton M. Berisha
           fberisha@uni-pr.edu




                                 ¨
          Universiteti i Prishtines
 Fakulteti i Shkencave Matematike–natyrore



                                                      ¨
                                             Kompjuteret dhe programimi – fq. 1
Kompjuterët dhe programimi




                                      ¨
                             Kompjuteret dhe programimi – fq. 2
                                            Referencat


Web sajte:
    http://www.fshmn.uni-pr.edu/fberisha
      http://fberisha.netfirms.com
    http://www.cis.ksu.edu/santos/schmidt/ppj
    http://java.sun.com
Literatura:
    D. Schmidt, Programming principles in Java:
    Architectures and Interfaces.
    I. Horton, Beginning Java 2, Wrox Press, 2000.


                                                        ¨
                                               Kompjuteret dhe programimi – fq. 3
                      Kompjuterët dhe programimi


Programimi kompjuterik është një proces në tre hapa:
   disenjim arkitekture,
   definim i klasave të cilat e përbëjnë arkitekturën,
   shkruarje e Java instruksioneve të cilat e realizojnë
   secilën klasë.




                                                         ¨
                                                Kompjuteret dhe programimi – fq. 4
                                   Ç’është kompjuteri?


Kompjuter: entitet i cili ekzekuton instruksione.
Procesor: pjesa e një komjuteri elektronik e cila i
ekzekuton istruksionet.
Memoria qendrore (RAM): pjesa e një komjuteri elektronik
e cila i ruan instruksionet dhe të dhënat të cilat procesori i
lexon për ta kryer punën e vetë.
Memoria periferike: pjesët e një komjuteri elektronik të cilat
arkivojnë instruksione dhe të dhëna shtesë. P.sh., disqet e
forta, disketat, CD-të.
Njësi hyrëse: tastiera ose mausi, i cili i jep të dhëna
kompjuterit.
Njësi dalëse: monitori për afishim ose printeri, i cili i
prezanton të dhëna shfrytëzuesit të kompjuterit.
                                                           ¨
                                                  Kompjuteret dhe programimi – fq. 5
                    Ç’është kompjuteri? – Vazhdim


Fajl (file): bashkësi të dhënash të ngjashme, tipikisht e
ruajtur në memorien periferike.
Folder: bashkësi fajlash, tipikisht e ruajtur në memorien
periferike.
Të dhënat në kompjuter janë të koduara në vargje 0-sh
dhe 1-shesh.
Bit: njësia themelore e informatës – një „0“ ose një „1“.
Kod binar: varg bitësh, i cili lexohet nga procesori si
instruksione ose të dhëna.
Gjuha e makinës: formati specifik i kodit binar i cili lexohet
nga procesori specifik.

                                                            ¨
                                                   Kompjuteret dhe programimi – fq. 6
                              Programimi kompjuterik


Programimi: aktiviteti i shkruarjes së instruksioneve të cilat
mund t’i ekzekutojë një kompjuter.

Algoritëm: varg i renditur hapash (instruksionesh) të
njëkuptimta, të ekzekutueshme, i cili përkufizon një proces
të fundmë.

Program kompjuterik: algoritëm i cili është shkruar në
mënyrë specifike për t’u ekzekutuar nga një procesor.

Gjuhë programuese: gjuhë e disenjuar posaçërisht për
shkruarjen e programeve kompjuterike.


                                                           ¨
                                                  Kompjuteret dhe programimi – fq. 7
               Programimi kompjuterik – Vazhdim


Hapat e përkthimit të një programi të shkruar në Java në
gjuhën e makinës:
 1. Kompilatori: programi i cili përkthen Java programet në
    Java byte code.
 2. Java interpretuesi (JVM): programi i cili përkthen Java
    byte code në gjuhën e makinës.




                                                          ¨
                                                 Kompjuteret dhe programimi – fq. 8
                               Programet janë objekte



          AFISHIMI                MEMORIA PERIFERIKE




SHFRYTËZUESI           PROGRAMI EKZEKUTIV (në memorien qendrore)




          TASTIERA                KOMPJUTERËT TJERË




               Figura 1. Rrethina kompjuterike
                                                              ¨
                                                     Kompjuteret dhe programimi – fq. 9
                                Programet janë objekte


Objekt: instancë e klasës në memorien qendrore. Njësi
themelore e një programi ekzekutiv.

Mesazh: komunikim të cilin një objekt i dërgon tjetrit.

Metodë: aktivitet specifik kompjuterik i cili mund të
aktivizohet kur i dërgohet një mesazh. Aftësi të cilën e
posedon objekti.

Objekt klient (client): objekt i cili dërgon mesazh.

Objekt pranues (receiver): objekt i cili pranon mesazh.


                                                            ¨
                                                   Kompjuteret dhe programimi – fq. 10
                 Programet janë objekte – Vazhdim


Input (hyrja): të dhënat të cilat i jepen programit
kompjuterik për llogaritje.

Output (dalja): përgjegjja e llogaritur nga programi.

Hardware: komponentet fizike të një kompjuteri, p.sh.,
procesori dhe memoria qendrore.

Software: programet kompjuterike.




                                                               ¨
                                                      Kompjuteret dhe programimi – fq. 11
                  Sistemet operative dhe Windows


Sistemi operativ: programi kontrollues i cili fillon të
ekzekutohet me ndezjen e kompjuterit.

Dritarja komanduese: pozitë në displejin kompjuterik ku
shfrytëzuesi mund të rradhisë instruksione për kompjuterin.




                                                            ¨
                                                   Kompjuteret dhe programimi – fq. 12
                                  Arkitektura e softuerit


Arkitekturë e softuerit: disanji, plani i përgjithshëm i një
programi komjuterik.
Hapat krucialë gjatë shkruarjes së një programi
kompjuterik:
    Specifikimi i arkitekturës së programit me anë të
    diagramit të klasave;
    Disenjimi i secilës klasë si bashkësi metodash;
    Shkruarja e secilës metodë si varg Java
    instruksionesh.
Me startimin e programit kompjuterik objektet në memorien
qendrore krijohen nga klasat në memorien periferike, duke
formuar programin ekzekutiv.                                 ¨
                                                    Kompjuteret dhe programimi – fq. 13
                 Arkitektura e softuerit – Vazhdim


Gjatë kursit do të mbështetemi esencialisht në një
arkitekturë të posaçme: Model–View–Controller (MVC).

Komponentet e MVC arktiekturës:
   View objekti: paraqitja ndaj shfrytëzuesit njeri;
   posedon metoda të cilat pranojnë kërkesa nga
   shfrytëzuesi dhe afishojnë rezultate.
   Controller objekti: posedon metoda të cilat kontrollojnë
   bartjen e informatave duke dërguar mesazhe
   komponenteve tjera.
   Model objekti: posedon metoda të cilat llogarisin
   pergjegjjet si reagim ndaj mesazheve të dërguara atij
   nga controller objekti.
                                                          ¨
                                                 Kompjuteret dhe programimi – fq. 14
                                  Diagramet e klasave


Klasa: fajl i cili përmban një komponentë të programit.

Diagram i klasave: prezantim grafik i klasave, metodave
dhe mesazheve. Specifikon arkitekturën e një programi.




                                                         ¨
                                                Kompjuteret dhe programimi – fq. 15
                   Diagramet e klasave – Vazhdim


                              Controller

                              main




                               Model

                        insertText
 Input View                                         Output View
                        deleteText
getRequest                                     redisplayDocument
                        reformatLines
getText                                        printDocument
                        ...
                        contentsOf



        Figura 2. Diagram klasash i një tekst procesori

                                                              ¨
                                                     Kompjuteret dhe programimi – fq. 16
Java aplikacione të thjeshta




                                                 ¨
                               Java aplikacione te thjeshta – fq. 1
                        Java aplikacione të thjeshta


Objektivat:
    Të prezantohet formati standard i një Java programi
    dhe të ilustrohen shembuj klase, metode dhe objekti
    në Java.
    Të shpjegohen hapat që ndërrmirren për të rradhitur
    një program, kontrolluar sintaksën e tij dhe ekzekutuar
    atë.
    Të tregohet si një objekt mund të dërgojë mesazhe
    objekteve tjerë, madje edhe të krijojë objekte tjerë
    gjatë ekzekutimit.



                                                                   ¨
                                                 Java aplikacione te thjeshta – fq. 2
                    Aplikacioni dhe arkitektura e tij


Aplikacion: Java program i cili startohet nga njeriu.

Metoda main: metoda inicuese e cila ekzekutohet fillimisht
kur startohet një aplikacion.




                                                                    ¨
                                                  Java aplikacione te thjeshta – fq. 3
     Aplikacioni dhe arkitektura e tij –
                              Vazhdim


                  Hello
                 main




               System.out
                 println


Figura 1. Arkitektura e programit fillestar




                                                               ¨
                                             Java aplikacione te thjeshta – fq. 4
             Aplikacioni dhe arkitektura e tij –
                                      Vazhdim


/** Afishon dy rreshta në konzolë. */
public class Hello
{ public static void main(String[] args)
  { System.out.println("Tungjatjeta botë!");
    System.out.println(2004);
  }
}




                                                        ¨
                                      Java aplikacione te thjeshta – fq. 5
                 Si ndërtohet dhe ekzekutohet një
                                       aplikacion


 1. Klasa class Hello rradhitet dhe ruhet në fajlin
    Hello.java.
 2. Kontrollohet sintaksa e programit – programi
    kompilohet; krijohet byte code fajli Hello.class.
 3. Programi startohet (ekzekutohet).

Për kryerjen e këtyre hapave mund të shfrytëzohet ose
rrethina zhvilluese e integruar (integrated development
environment, IDE) e gjuhës Java, ose një editor teksti dhe
Java Development Kit (JDK).




                                                                  ¨
                                                Java aplikacione te thjeshta – fq. 6
                           Si funksionon aplikacioni


Koment: shpjegim i futur në program për ta lexuar njeriu (e
jo kompjuteri).
Fjalë kyqe (keyword): fjalë me domethënie të caktuar të
posaçme.
Urdhër (sentence): një instruksion i vetëm përbrenda Java
programit; tipikisht përfundon me pikëpresë.
Argument: informatë shtesë e cila i bashkangjitet mesazhit;
i mbyllur në kllapa vijon pas emrit të metodës në mesazhin.
String: frazë tekstuale; varg karakterësh të mbyllur në
thonjëza të dyfishta.
Java dallon shkronjat e mëdha nga të voglat.

                                                                   ¨
                                                 Java aplikacione te thjeshta – fq. 7
     Gjurma e ekzekutimit të aplikacionit


                   Hello
public static void main(String[] args)
{ System.out.println("Tungjatjeta botë!");
  System.out.println(2005);
}



             System.out
...
println(...)
{ instruksione për të shtypur tekst }




                                                               ¨
                                             Java aplikacione te thjeshta – fq. 8
     Gjurma e ekzekutimit të aplikacionit
                              – Vazhdim


                    Hello
public static void main(String[] args)
{ > System.out.println("Tungjatjeta botë!");
  System.out.println(2005);
}



             System.out
...
println(...)
{ instruksione për të shtypur tekst }




                                                                 ¨
                                               Java aplikacione te thjeshta – fq. 9
     Gjurma e ekzekutimit të aplikacionit
                              – Vazhdim


                 Hello
public static void main(String[] args)
{ > PRIT
  System.out.println(2005);
}



              System.out
...
println(...)
{ > instruksione për të shtypur tekst }




                                                            ¨
                                          Java aplikacione te thjeshta – fq. 10
     Gjurma e ekzekutimit të aplikacionit
                              – Vazhdim


                 Hello
public static void main(String[] args)
{ ...
  > System.out.println(2005);
}



             System.out
...
println(...)
{ instruksione për të shtypur tekst }




                                                           ¨
                                         Java aplikacione te thjeshta – fq. 11
     Gjurma e ekzekutimit të aplikacionit
                              – Vazhdim


                 Hello
public static void main(String[] args)
{ ...
  > PRIT
}



              System.out
...
println(...)
{ > instruksione për të shtypur tekst }




                                                            ¨
                                          Java aplikacione te thjeshta – fq. 12
     Gjurma e ekzekutimit të aplikacionit
                              – Vazhdim


                 Hello
public static void main(String[] args)
{ ...
  ...
> }



             System.out
...
println(...)
{ instruksione për të shtypur tekst }




                                                           ¨
                                         Java aplikacione te thjeshta – fq. 13
       Si një objekt konstrukton një tjetër


NameAndDate               GregorianCalendar
main                     getTime



System.out
  println
  print


       Figura 2. Aplikacioni NameAndDate




                                                                ¨
                                              Java aplikacione te thjeshta – fq. 14
              Si një objekt konstrukton një tjetër –
                                          Vazhdim

import java.util.*;
/** Afishon emrin tim dhe kohën e datën e saktë. */
public class NameAndDate
{ public static void main(String[] args)
  { System.out.print("Filan Fisteku --- ");
    // Urdhëri vijues krijon një objekt
    GregorianCalendar c = new GregorianCalendar();
    System.out.println(c.getTime()); // afisho përgjegjjen
    System.out.println();
    System.out.println("Mbaroi");
  }
}




                                                                      ¨
                                                    Java aplikacione te thjeshta – fq. 15
             Si një objekt konstrukton një tjetër –
                                         Vazhdim


Adresë (e një objekti): „emër“ objekti në memorien
qendrore; shfrytëzohet për t’i dërguar mesazhe.

Emër i variablës: emër qelize ku ruhet një vlerë, siç është
adresa e një objekti.




                                                                   ¨
                                                 Java aplikacione te thjeshta – fq. 16
                                   Gjurma e ekzekutimit


                   NameAndDate
public static void main(String[] args)
{ > System.out.print("Filan Fisteku --- ");
  GregorianCalendar c = new GregorianCalendar();
  System.out.println(c.getTime());
  System.out.println();
  System.out.println("Mbaroi");
}

             System.out
...
print(...)
{ instruksione për të shtypur tekst }
println(...)
{ instruksione për të shtypur tekst
    dhe terminuar rreshtin
}

                                                                     ¨
                                                   Java aplikacione te thjeshta – fq. 17
                    Gjurma e ekzekutimit – Vazhdim


                    NameAndDate                           System.out
public static void main(String[] args)                  ...
{ ...
  > GregorianCalendar c = new GregorianCalendar();
  System.out.println(c.getTime());
  System.out.println();
  System.out.println("Mbaroi");
}



                a1 : GregorianCalendar
...
getTime()
{ instruksione për lexim të orës dhe kthim të kohës }




                                                                          ¨
                                                        Java aplikacione te thjeshta – fq. 18
                    Gjurma e ekzekutimit – Vazhdim


              NameAndDate                                 System.out
public static void main(String[] args)                  ...
{ ...
  GregorianCalendar c == a1
  > System.out.println(c.getTime());
  System.out.println();
  System.out.println("Mbaroi");
}



                a1 : GregorianCalendar
...
getTime()
{ instruksione për lexim të orës dhe kthim të kohës }




                                                                          ¨
                                                        Java aplikacione te thjeshta – fq. 19
                    Gjurma e ekzekutimit – Vazhdim


              NameAndDate                              System.out
public static void main(String[] args)               ...
{ ...
  GregorianCalendar c == a1
  > System.out.println(PRIT);
  System.out.println();
  System.out.println("Mbaroi");
}



                 a1 : GregorianCalendar
...
getTime()
{ > instruksione për lexim të orës dhe kthim të kohës }




                                                                       ¨
                                                     Java aplikacione te thjeshta – fq. 20
                          Gjurma e ekzekutimit – Vazhdim


                      NameAndDate                           System.out
public static void main(String[] args)                    ...
{ ...
  GregorianCalendar c == a1
  > System.out.println("Wed Nov 03 10:45:00 CET 2004");
  System.out.println();
  System.out.println("Mbaroi");
}



                a1 : GregorianCalendar
...
getTime()
{ instruksione për lexim të orës dhe kthim të kohës }




                                                                            ¨
                                                          Java aplikacione te thjeshta – fq. 21
              Si një objekt konstrukton një tjetër –
                                          Vazhdim


Versioni i aplikacionit pa variabël për objektin:
import java.util.*;
/** Afishon emrin tim dhe kohën e datën e saktë. */
public class NameAndDate
{ public static void main(String[] args)
  { System.out.print("Filan Fisteku --- ");
    // Urdhëri vijues krijon një objekt dhe i dërgon mesazh
    System.out.println(new GregorianCalendar().getTime());
    System.out.println();
    System.out.println("Mbaroi");
  }
}




                                                                       ¨
                                                     Java aplikacione te thjeshta – fq. 22
                          Përmirësimi i mesazheve të
                            gabimeve të kompilatorit


A është korrekt programi vijues i ruajtur në fajlin
Test.java?

public class test
{ public static main(String[] args)
  { System.out.println(Tung!)
}




                                                                        ¨
                                                      Java aplikacione te thjeshta – fq. 23
                 Përmirësimi i mesazheve të
          gabimeve të kompilatorit – Vazhdim


public class Test
{ public static void main(String[] args)
  { System.out.println("Tung!"); }
}




                                                     ¨
                                   Java aplikacione te thjeshta – fq. 24
                    Përmirësimi i mesazheve të
             gabimeve të kompilatorit – Vazhdim


Sintaksë: paraqitja drejtshkrimore e instruksioneve në
gjuhën Java.

Semantikë: domethënia e instruksioneve në Java.




                                                                  ¨
                                                Java aplikacione te thjeshta – fq. 25
Aritmetika dhe variablat




                           Aritmetika dhe variablat – fq. 1
                                Aritmetika dhe variablat


Objektivat:
    Të futet nocioni i tipit të së dhënës, i cili siguron
    konsistencë gjatë llogaritjeve.
    Të futen variablat kompjuterike dhe zbatimet
    tradicionale të tyre.
    Të jepet një mënyrë e thjeshtësuar por efektive për t’i
    dhënë të dhënat hyrëse programit.




                                                       Aritmetika dhe variablat – fq. 2
                        Aritmetika e numrave të plotë


/** Llogarit sasinë e parave të imëta. */
public class Total
{ public static void main (String[] args)
  { System.out.print("Për 4 gjysma, 2 njëzetqindarka, ");
    System.out.print("asnjë dhjetëqindarkë, 1 pesëqindarkë ");
    System.out.println("dhe 6 qindarka,");
    System.out.print("shuma totale është ");
    System.out.println((4 * 50) + (2 * 20) + (0 * 10)
                       + (1 * 5) + (6 * 1));
  }
}




                                                       Aritmetika dhe variablat – fq. 3
                    Aritmetika e numrave të plotë –
                                          Vazhdim


Operator: simbol, si * ose +, i cili shënon një operacion
aritmetik.

Operand: argument i një operatori, p.sh., 1 në 6 * 1.




                                                   Aritmetika dhe variablat – fq. 4
                      Aritmetika e numrave të plotë –
                                            Vazhdim

public class Test
{ public static void main(String[] args)
  { System.out.println(1 + ((2 - 3) * 4) + 5); }
}


     1 + ((2 - 3) * 4) + 5
=>   1 + ((-1) * 4) + 5
=>   1 + (-4) + 5
=>   -3 + 5
=>   2




                                                   Aritmetika dhe variablat – fq. 5
                   Madhësitë e emërtuara: variablat

/** Llogarit sasinë e parave të imtëa
 * mbështetur në vlerat e emërtuara me variabla. */
public class Total
{ public static void main (String[] args)
  { int gjysma = 4;
    int njezeta = 2;
    int dhjeta = 0;
    int pesa = 1;
    int qindarka = 6;




                                                      Aritmetika dhe variablat – fq. 6
                     Madhësitë e emërtuara: variablat –
                                              Vazhdim

        System.out.println("Për këto sasi metelikësh:");
        System.out.print("Gjysma = ");
        System.out.println(gjysma);
        System.out.print("Njëzetqindarka = ");
        System.out.println(njezeta);
        System.out.print("Dhjetëqindarka = ");
        System.out.println(dhjeta);
        System.out.print("Pesëqindarka = ");
        System.out.println(pesa);
        System.out.print("Qindarka = ");
        System.out.println(qindarka);
        System.out.print("Shuma totale është ");
        System.out.println( (gjysma * 50) + (njezeta * 20)
            + (dhjeta * 10) + (pesa * 5) + (qindarka * 1) );
    }
}


                                                           Aritmetika dhe variablat – fq. 7
                 Madhësitë e emërtuara: variablat –
                                          Vazhdim


Variabël (ndryshore): qelizë e cila përmban një vlerë
primitive të ruajtur (si, p.sh., një numër të plotë) ose një
adresë të një objekti.

Deklarim: forma e urdhërit që konstrukton variabël, p.sh.,
  int gjysma = 4;

Inicializim: urdhëri i cili i jep variablës vlerën e parë, iniciale
të saj.

Tipi i të dhënave: bashkësi e emërtuar, ose „lloj“ i vlerave.




                                                        Aritmetika dhe variablat – fq. 8
                Madhësitë e emërtuara: variablat –
                                         Vazhdim


Fjala kyçe në Java për tipin e numrave të plotë është int.

Literal: vlera aktuale e një tipi, p.sh. numrat e plotë si 1
dhe 115 janë literalë të tipit int.

Referencim i variablës: sjellja në shprehje e një kopjeje të
vlerës së ruajtur në variabël.

Verifikimi i tipit të të dhënave: kontrolli të cilin e bën
kompilatori për të siguruar se tipi i të dhënave të variablës
është i pranueshëm për kontekstin e referencimit të
variablës.


                                                      Aritmetika dhe variablat – fq. 9
                 Madhësitë e emërtuara: variablat –
                                          Vazhdim

/** Llogarit sasinë e parave të imëta. */
public class Total
{ public static void main (String[] args)
  { int gjysma = 4;
    int njezeta = 2;
    int dhjeta = 0;
    int pesa = 1;
    int qindarka = 6;




                                            Aritmetika dhe variablat – fq. 10
                     Madhësitë e emërtuara: variablat –
                                              Vazhdim

        System.out.println("Për këto sasi metelikësh:");
        System.out.println("Gjysma = " + gjysma);
        System.out.println("Njëzetqindarka = " + njezeta);
        System.out.println("Dhjetëqindarka = " + dhjeta);
        System.out.println("Pesëqindarka = " + pesa);
        System.out.println("Qindarka = " + qindarka);
        int total = (gjysma * 50) + (njezeta * 20)
            + (dhjeta * 10) + (pesa * 5) + (qindarka * 1);
        System.out.println("Shuma totale është " + (total / 100)
            + " Euro dhe " + (total % 100) + " cent");
    }
}




                                                           Aritmetika dhe variablat – fq. 11
                      Ndryshoret mund të ndryshojnë:
                                      ndarja e vlerës


                           Total
public static void main(String[] args)
{ int gjysma == 4
    int njezeta ==     2
    int dhjeta ==     0
    int pesa ==   1
    int qindarka == 6
     >System.out.println("Për këto sasi metelikësh:");
    System.out.println("Gjysma = " + gjysma);
    ...
}




                                                     Aritmetika dhe variablat – fq. 12
                  Ndryshoret mund të ndryshojnë:
                        ndarja e vlerës – Vazhdim


Ndarje vlere: forma e urdhërit e cila vë një vlerë të re në
variabël.

Shembuj:
int money = 0;
money = 100;
money = money + 50; // money += 50;




                                                   Aritmetika dhe variablat – fq. 13
                   Ndryshoret mund të ndryshojnë:
                         ndarja e vlerës – Vazhdim


/** Llogarit sasinë e metelikeve. */
public class MakeChange
{ public static void main (String[] args)
  { int euros = 3;
    int cents = 46;
    int money = (euros * 100) + cents;
    System.out.println("Gjysma = " + (money / 50));
    money = money % 50; // money %= 50
    System.out.println("Njëzetqindarka = " + (money / 20));
    money = money % 20;
    System.out.println("Dhjetëqindarka = " + (money / 10));
    money = money % 10;
    System.out.println("Pesëqindarka = " + (money / 5));
    money = money % 5;
    System.out.println("Qindarka = " + money);
  }
}

                                                       Aritmetika dhe variablat – fq. 14
                        Ndryshoret mund të ndryshojnë:
                              ndarja e vlerës – Vazhdim


                         MakeChange
public static void main(String[] args)
{ int euros == 3
    int cents ==   46
    int money == 346
     >System.out.println("Gjysma = " + (money / 50));
    money = money % 50;
    System.out.println("Njëzetqindarka = " + (money / 20));
    money = money % 20;
    ...
}




                                                       Aritmetika dhe variablat – fq. 15
                        Ndryshoret mund të ndryshojnë:
                              ndarja e vlerës – Vazhdim



                         MakeChange
public static void main(String[] args)
{ int euros == 3
    int cents ==   46
    int money == 46
    ...
     >System.out.println("Njëzetqindarka = " + (money / 20));
    money = money % 20;
    ...
}




                                                        Aritmetika dhe variablat – fq. 16
                  Ndryshoret mund të ndryshojnë:
                        ndarja e vlerës – Vazhdim


Semantika e urdhërave të ndarjeve të vlerës, të cilët mund
të kenë paraqitje cirkulare, si
money = money % 50; // money %= 50
konsiston nga tre hapat vijues:
 1. Alokohet variabla (e emërtuar money).
 2. Llogaritet rezultati i shprehjes në anën e djathtë të
    shenjës së barazimit (money % 50), duke referencuar
    vlerën të cilën për momentin e përmban variabla.
 3. Rezultati nga hapi paraprak vendoset në qelizën e
    variablës (money) si vlerë e re e saj.


                                                 Aritmetika dhe variablat – fq. 17
                     Operatorët e inkrementimit dhe
                                      dekrementimit


Operatori i inkrementimit (rritjes) ++: rrit për 1 vlerën e
operatorit.

Forma postfikse:
int count = 10;
count++; // sikur count = count + 1

Forma prefikse:
++count; // sikur count = count + 1




                                                     Aritmetika dhe variablat – fq. 18
                   Operatorët e inkrementimit dhe
                        dekrementimit – Vazhdim


Operatori i dekrementimit (zvogëlimit) --: zvogëlon për 1
vlerën e operatorit.

Forma postfikse:
count--; // sikur count = count - 1

Forma prefikse:
--count; // sikur count = count - 1




                                                 Aritmetika dhe variablat – fq. 19
                       Operatorët e inkrementimit dhe
                            dekrementimit – Vazhdim


Operatorët e inkrementimit dhe dekrementimit mund të
përdoren përbrenda një shprehjeje:
int numApples = 5;
int numOranges = 10;
int numFruit = 0;

numFruit = numApples++ + numOranges;   // numFruit == 15
                                       // numApples == 6

numFruit = ++numApples + numOranges;   // numApples == 7
                                       // numFruit == 17




                                                           Aritmetika dhe variablat – fq. 20
                       Operatorët e inkrementimit dhe
                            dekrementimit – Vazhdim

int numApples = 5;
int numOranges = 10;
int numFruit = 0;

numFruit = numApples-- + numOranges;   // numFruit == 15
                                       // numApples == 4

numFruit = --numApples + numOranges;   // numApples == 3
                                       // numFruit == 13




                                                           Aritmetika dhe variablat – fq. 21
                      Aritmetika e numrave thyesorë


Fjala kyçe në Java për tipin e numrave thyesorë është
double.
int c = 22;
double p = 3.14159;
double t = 4.7E17;
double d = 9.0;


Një veti e rëndësishme e operatorëve themelorë
aritmetikë +, -, *, /:
    Kur zbatohen mbi dy operandë të tipit int, rezultati
    është i tipit int.
    Kur së paku njëri nga operandët është i tipit double,
    rezultati është i tipit double.
                                                 Aritmetika dhe variablat – fq. 22
                    Aritmetika e numrave thyesorë –
                                           Vazhdim

/** Konverton vlerën e temperaturës. */
public class FahreheitToCelsius
{ public static void main(String[] args)
  { int f = 70;
    double c = (5.0/9.0) * (f - 32);
    System.out.println("Për gradë Fahrenheit " + f + ",");
    System.out.println("gradë Celsius " + c);
  }
}




                                                       Aritmetika dhe variablat – fq. 23
                 Aritmetika e numrave thyesorë –
                                        Vazhdim


Ekziston klasa Math e cila përmban metoda për llogaritje
me numra thyesorë:
double num = 1E-2;
System.out.println("Rrënja e " + num
  + " është " + Math.sqrt(num));
System.out.println("Kubi i " + num
  + " është " + Math.pow(num, 3));
System.out.println("Logaritmi natyror i " + num
  + " është " + Math.log(num));




                                                Aritmetika dhe variablat – fq. 24
                 Aritmetika e numrave thyesorë –
                                        Vazhdim


Shembull:
int i = 1;
double d = i;
Shembull jokorrekt:
double d = 1.6;
int i = d;
Programuesi mund të shfrytëzojë shprehjen e konvertimit
(cast expression):
double d = 1.6;
int i = (int)d; // Vlera e cunguar



                                               Aritmetika dhe variablat – fq. 25
                                       Operatorët OP=


Sintaksa:
NDRYSHORE OP= SHPREHJE

Semantika e njëjtë sikurse e ndarjes së vlerës:
NDRYSHORE = NDRYSHORE OP (SHPREHJE)

Shembuj:
count += 5; // sikur count = count + 5
money %= 50; // sikur money = money % 50




                                                  Aritmetika dhe variablat – fq. 26
                                                Tipi boolean


Tipi i të dhënave boolean konsiston nga dy vlerat logjike:
true dhe false.
double c = 22.0;
double f = 77.0;
double fConverted = (5.0/9.0) * (f - 32);
System.out.print(c + " Celsius më nxehtë se "
    + f + " Fahrenheit? ");
System.out.println(c > fConverted);


Operatorët e krahasimit (të cilët kthejnë rezultat të tipit
boolean): <, >, <=, >=, ==, !=.
boolean b = ((3 * 2) == (5 + 1));




                                                     Aritmetika dhe variablat – fq. 27
                 Përparësia e operatorëve (operator
                                       precedence)


                  ++ postfix, -- postfix
                  - unar, ++ prefix, -- prefix
                  *, /, %
                  +, -
                  <, <=, >, >=
                  ==, !=
                  operatorët OP=
            Tabela 1. Përparësia e operatorëve themelorë

Shembull:
b = 3 * 2 == 5 + 1;


                                                           Aritmetika dhe variablat – fq. 28
                   Stringjet, karakterët dhe operacionet
                                                   me ta

Emri në Java i tipit të të dhënave për stringje është String.

String name = "Filan Fisteku";
System.out.println("Unë quhem " + name);
System.out.println("dhe jam një Pentium " + (5 - 1));

Stringjet janë objekte në Java dhe operacionet me stringje janë metoda; p.sh.,

      Krahasimi në barazim i stringjeve s1 dhe s2: s1.equals(s2); p.sh.,
        String s = "tungjatjeta";
        System.out.println(s.equals("tungjat" + "jeta"));
        System.out.println(s.equals(s));

      Gjatësia e stringut s: s.length(); p.sh.,
        String s = "tungjatjeta";
        int l = s.length(); // l == 11




                                                                          Aritmetika dhe variablat – fq. 29
             Stringjet, karakterët dhe operacionet
                                   me ta – Vazhdim


Simbolet individualë përbrenda një stringu quhen
karakterë.

Tipi i karakterëve në Java është char.
char c = ’a’;

Literali karakter paraqitet duke u mbyllur në thonjëza të
njëfishta, p.sh., ’J’, ’a’, ’2’, ’&’.

Java zbaton Unicode formatin për karakterë; p.sh.,
int i = ’a’ + 1; // 98
char c = (char)(’a’ + 1);            // ’b’

                                                   Aritmetika dhe variablat – fq. 30
Stringjet, karakterët dhe operacionet
                      me ta – Vazhdim


        Karakteri   Semantika
        \b          backspace
        \t          tab
        \n          rresht i ri (newline)
        \r          return
        \"          thonjëza e dyfishtë
        \’          thonjëza e njëfishtë
        \\          backslash

Tabela 2. Kodimi i karakterëve kontrollues




                                             Aritmetika dhe variablat – fq. 31
              Stringjet, karakterët dhe operacionet
                                    me ta – Vazhdim


Metoda                Semantika                              Tipi i rezultatit
s1.equals(s2)         Krahasimi në barazim i s1, s2          boolean
s.length()            Gjatësia e s                           int
s.charAt(i)           Karakteri në pozitën i në s            char
s.substring(i1,i2)    Nënstringu i s nga pozita i1 deri në   String
                      i2 - 1
s.toUpperCase()       s në shkronja të mëdha                 String
s.toLowerCase()       s në shkronja të vogla                 String
s.trim()              s pa hapësirat përreth                 String
s1.indexOf(s2,i)      Indeksin (pozitën) e s2 në s1 nga      int
                      pozita i
s1.compareTo(s2)      Krahasimi (leksikografik) i s1, s2      int

             Tabela 3. Disa metoda të klasës String
                                                                 Aritmetika dhe variablat – fq. 32
              Stringjet, karakterët dhe operacionet
                                    me ta – Vazhdim


Për të manipuluar me karakterë individualë përbrenda një
stringu shfrytëzohet metoda charAt; p.sh.,
char c = "abc".charAt(0); // ’a’
String s = "abc" + "de"; // "abcde"
c = s.charAt(2+1); // ’d’
boolean result = s.charAt(0) == ’a’;   // true
c = "abc".charAt(3); // gabim




                                                 Aritmetika dhe variablat – fq. 33
                         Kontrolli i tipit të të dhënave


Java kompilatori zbaton tipet e të dhënave që të:
    sigurohet kompatibiliteti i operandëve ndaj
    operatorëve;
    parashikohet tipi i rezultatit të shprehjes;
    krijohen qeliza variablash të formatit përkatës;
    imponohet kompatibiliteti i shprehjeve ndaj variablave
    në inicializime dhe ndarje vlerash.




                                                    Aritmetika dhe variablat – fq. 34
        Kontrolli i tipit të të dhënave –
                                 Vazhdim


( ( -3 *     i ) +d ) > 2

    int    int             int

       int

     double      double

           double

           double         double

                 boolean

 Figura 1. Druri i tipit të së dhënës
                                        Aritmetika dhe variablat – fq. 35
                     Kontrolli i tipit të të dhënave –
                                              Vazhdim


Ne Java ekzistojnë dy forma tipesh të të dhënave:
   tipet primitive, si int, double dhe boolean
   tipet e referencës, si GregorianCalendar

double d = 2.5;
GregorianCalendar c = new GregorianCalendar();

Tipi String është tip i referencës në Java, megjithëse
përdoret sikurse tipet primitive të të dhënave.
String s = "abc";



                                                 Aritmetika dhe variablat – fq. 36
                 Hyrja (input) përmes argumentëve
                                       programorë


/** Afishon gjatësinë e argumentit programor */
public class LengthOfName
{ public static void main(String[] args)
  { String name = args[0];
    int length = name.length();
    System.out.println("Emri " + name + " ka gjatësinë " + length);
  }
}




                                                       Aritmetika dhe variablat – fq. 37
              Konvertimi ndërmjet stringjeve dhe
                       numrave dhe formatizimi


Konvertimi i stringjeve në numra të plotë:
String s = "20";
int i = new Integer(s).intValue();
class Integer konverton stringje numërorësh në numra
të plotë; posedon metodën intValue.




                                             Aritmetika dhe variablat – fq. 38
             Konvertimi ndërmjet stringjeve dhe
             numrave dhe formatizimi – Vazhdim


Konvertimi i stringjeve në numra thyesorë:
String approxPi = "3.14159";
double d = new Double(approxPi).doubleValue();
class Double konverton stringje numrash në numra
thyesorë; posedon metodën doubleValue.




                                             Aritmetika dhe variablat – fq. 39
             Konvertimi ndërmjet stringjeve dhe
             numrave dhe formatizimi – Vazhdim


Konvertimi i numrave në stringje:
double d = 3.14159;
String s = d + "";




                                       Aritmetika dhe variablat – fq. 40
                    Konvertimi ndërmjet stringjeve dhe
                    numrave dhe formatizimi – Vazhdim

Formatizimi i numrave:
import java.text.*;
public class Test
{ public static void main(String[] args)
  { DecimalFormat formatter = new DecimalFormat("0.00");
    double d = 100.0 / 3.0;
    String s = formatter.format(d);
    System.out.println(s + " Euro");
  }
}
class DecimalFormat gjendet në pakon java.text. Posedon metodën format(d)
e cila kthen vlerën e formatizuar në decimale të numrit d, mbështetur në shabllonin e
zbatuar në new DecimalFormat(SHABLLON).




                                                                       Aritmetika dhe variablat – fq. 41
                Konvertimi i temperaturës me input


import java.text.*;
/** Konverton vlerën e temperaturës. */
public class FahrenheitToCelsius
{ public static void main(String[] args)
  { int f = new Integer(args[0]).intValue();
    double c = (5.0/9.0) * (f - 32);
    System.out.println("Për gradë Fahrenheit " + f + ",");
    DecimalFormat formatter = new DecimalFormat("0.0");
    System.out.println("gradë Celsius " + formatter.format(c));
  }
}




                                                       Aritmetika dhe variablat – fq. 42
             Konvertimi i temperaturës me input –
                                        Vazhdim



                FahrenheitToCelsius
main(args[0] == "70" )
{ >int f = new Integer(args0).intValue();
  double c = (5.0/9.0) * (f - 32);
  System.out.println("Për gradë Fahrenheit " + f + ",");
  DecimalFormat formatter = new DecimalFormat("0.0");
  System.out.println("gradë Celsius " + formatter.format(c));
}




                                                       Aritmetika dhe variablat – fq. 43
   Konvertimi i temperaturës me input –
                              Vazhdim




     FahrenheitToCelsius
main(args[0] ==   "70"   )
{ int f == ?
   >f = new Integer(args[0]).intValue();
  double c = (5.0/9.0) * (f - 32);
  ...
}




                                           Aritmetika dhe variablat – fq. 44
 Konvertimi i temperaturës me input –
                            Vazhdim




    FahrenheitToCelsius
main(args[0] ==   "70"   )
{ int f == ?
   >f = new Integer("70").intValue();
  double c = (5.0/9.0) * (f - 32);
  ...
}




                                        Aritmetika dhe variablat – fq. 45
Konvertimi i temperaturës me input –
                           Vazhdim

  FahrenheitToCelsius
main(args[0] ==   "70"   )
{ int f == ?
   >f = a1.intValue();
  double c = (5.0/9.0) * (f - 32);
  ...
}



         a1 : Integer
   përmban 70
   intValue()
   { metodë e cila kthen 70 }




                                     Aritmetika dhe variablat – fq. 46
Konvertimi i temperaturës me input –
                           Vazhdim

  FahrenheitToCelsius
main(args[0] ==   "70"   )
{ int f == ?
   >f = PRIT;
  double c = (5.0/9.0) * (f - 32);
  ...
}



         a1 : Integer
  përmban 70
  intValue()
  { >metodë e cila kthen 70 }




                                     Aritmetika dhe variablat – fq. 47
Konvertimi i temperaturës me input –
                           Vazhdim




  FahrenheitToCelsius
main(args[0] ==   "70"   )
{ int f == ?
   >f = 70;
  double c = (5.0/9.0) * (f - 32);
  ...
}




                                     Aritmetika dhe variablat – fq. 48
             Konvertimi i temperaturës me input –
                                        Vazhdim



                  FahrenheitToCelsius
main(args[0] ==   "70"   )
{ int f == 70
   >double c = (5.0/9.0) * (f - 32);
  System.out.println("Për gradë Fahrenheit " + f + ",");
  DecimalFormat formatter = new DecimalFormat("0.0");
  System.out.println("gradë Celsius " + formatter.format(c));
}




                                                       Aritmetika dhe variablat – fq. 49
                      Diagnostifikimi i gabimeve në
                                          shprehje


Gabimet mund të kenë këto dy forma:
   Compile time errors: gabimet sintaksore të cilat
   paraqiten gjatë kompilimit.
   Run time errors (Exceptions): gabimet të cilat
   paraqiten gjatë ekzekutimit, kur llogaritet rezultat
   jokorrekt dhe ekzekutimi ndalohet.




                                                   Aritmetika dhe variablat – fq. 50
            Gabimet sintaksore (compile time
                                     errors)


System.out.println( (1+2(*3 );
string s = 3;
System.out.println(3+true);

int i;
System.out.println(2 * i);

int a = 1;
double a = 2.5;
System.out.println(a);




                                    Aritmetika dhe variablat – fq. 51
            Gabimet sintaksore (compile time
                           errors) – Vazhdim


System.out.println( (1+2)*3 );
String s = "3";
System.out.println(3+1);

int i = 0;
System.out.println(2 * i);

int a = 1;
double b = 2.5;
System.out.println(a);




                                    Aritmetika dhe variablat – fq. 52
                    Përjashtimet (exceptions)


int i = 0;
System.out.println(1 / i);

i = new Integer(args[0]).intValue();
System.out.println(1 / i);




                                       Aritmetika dhe variablat – fq. 53
                             Gabimet semantike


int x = 3;
int y = 7;
System.out.println(x = y);




                                      Aritmetika dhe variablat – fq. 54
               Gabimet semantike – Vazhdim


int x = 3;
int y = 7;
System.out.println(x == y);




                                  Aritmetika dhe variablat – fq. 55
                      Fjalët kyçe dhe identifkatorët


Identifikator: emër variable, klase ose metode; varg i
karkaterëve, ku karakteri i parë është jonumëror.

Fjalët kyçe kanë domethënie të posaçme në Java dhe nuk
mund të përdoren si identifikatorë.

Për stil konsistent, klasat emërtohen me identifikatorë që
fillojnë me shkronjë të madhe, kurse variablat dhe metodat
me shkronjë të vogël.




                                                 Aritmetika dhe variablat – fq. 56
Hyrja (input), dalja (output) dhe gjendja




                                Hyrja (input), dalja (output) dhe gjendja – fq. 1
                   Hyrja (input), dalja (output) dhe
                                             gjendja


Objektivat:
    Të zbatohet hyrje interaktive, ku një aplikacion mund të
    ketë interaksion me shfrytëzuesin dhe të kërkojë input
    kur është e nevojshme për kompjutim.
    Të shfrytëzohet inheritimi për të disenjuar dritare
    grafike që afishojnë output në forma teksti, ngjyrash
    dhe figurash.
    Të tregohet si një objekt mund të „mbajë mend“
    „gjendjen“ e kompjutimit me anë të variablave të
    fushave.


                                             Hyrja (input), dalja (output) dhe gjendja – fq. 2
                    Hyrja (input) interaktive


                Controller

               main




Input View                     Output View




Figura 1. Një arkitekturë me input-view




                                      Hyrja (input), dalja (output) dhe gjendja – fq. 3
                Hyrja (input) interaktive – Vazhdim


Input view: komponentet e një aplikacioni të cilat pranojnë
të dhëna hyrëse.

Output view: komponentet e një aplikacioni të cilat
afishojnë të dhëna dalëse.

Hyrje interaktive: të dhënat hyrëse të cilat shfrytëzuesi i jep
gjatë ekzekutimit të programit.

Dialog: dritare e cila afishon një mesazh të shkurtër
dhe/ose pranon hyrje interaktive, p.sh., duke rradhitur
shfrytëzuesi tekst ose duke shtypur një buton. Kur
shfrytëzuesi të ketë përfunduar interaksionin me të,
dialogu zhduket.
                                               Hyrja (input), dalja (output) dhe gjendja – fq. 4
               Hyrja (input) interaktive – Vazhdim


Hapat kryesorë për të shfrytëzuar klasën JOptionPane
për gjenerim të dialogut për lexim hyrjeje:
1. Kërko në pakon javax.swing klasën JOptionPane:
     import javax.swing.*;
2. Krijo dialogun në displej:
     String input
       = JOptionPane.showInputDialog(POROSIA);
   ku POROSIA është një string i cili do të afishohet
   përbrenda dialogut.




                                            Hyrja (input), dalja (output) dhe gjendja – fq. 5
                 Hyrja (input) interaktive – Vazhdim


import java.text.*;
import javax.swing.*;
/** FahrenheitToCelsius konverton vlerën e temperaturës
  * input: gradët Fahrenheit, int
  * output: gradët Celsius, double
  */
public class FahrenheitToCelsius
{ public static void main(String[] args)
  { String input = JOptionPane.showInputDialog("Gradë Fahrenheit:");
     int f = new Integer(input).intValue();
     double c = (5.0/9.0) * (f - 32);
     DecimalFormat formatter = new DecimalFormat("0.0");
     System.out.println("Për gradë Fahrenheit " + f + ",");
     System.out.println("gradë Celsius " + formatter.format(c));
  }
}


                                                 Hyrja (input), dalja (output) dhe gjendja – fq. 6
                  Hyrja (input) interaktive – Vazhdim




                        FahrenheitToCelsius
                       main
  JOptionPane                                         System.out
showInputDialog                                         println


                     Integer         DecimalFormat
                    intValue         format


 Figura 2. Arkitektura e aplikacionit për konvertimin e temperaturës




                                                     Hyrja (input), dalja (output) dhe gjendja – fq. 7
                                          Dialogu dalës


Krijimi i një dialogu të mesazhit në displej:
JOptionPane.showMessageDialog(null, MESAZHI);
ku MESAZHI është stringu i cili do të afishohet në dialogun.

null: vlerë e posaçme në Java e cila shënon „nuk ka
vlerë“. Përdorimi i null si operand në shprehje aritmetike
ose dërgimi kësaj i një mesazhi gjeneron një përjashtim
(run-time error).




                                            Hyrja (input), dalja (output) dhe gjendja – fq. 8
                                Dialogu dalës – Vazhdim


import java.text.*;
import javax.swing.*;
/** FahrenheitToCelsius konverton vlerën e temperaturës
  * input: gradët Fahrenheit, int
  * output: gradët Celsius, double
  */
public class FahrenheitToCelsius
{ public static void main(String[] args)
  { String input = JOptionPane.showInputDialog("Gradë Fahrenheit:");
     int f = new Integer(input).intValue();
     double c = (5.0/9.0) * (f - 32);
     DecimalFormat formatter = new DecimalFormat("0.0");
     JOptionPane.showMessageDialog(null, f + " Fahrenheit janë "
                                 + formatter.format(c) + " Celsius");
  }
}


                                                  Hyrja (input), dalja (output) dhe gjendja – fq. 9
                                  Dalja (output) grafike


Output view për dalje grafike janë dritaret grafike, të cilat
afishojnë tekst, figura, ngjyra, etj.

Dritaret grafike janë objekte.

Klasat e dritareve grafike shkruhen duke zgjeruar me
inheritim (trashigimi) klasë nga bibliotekat e Java (nga të
cilat mund të konstruktohen dritare boshe).




                                              Hyrja (input), dalja (output) dhe gjendja – fq. 10
                       Panelat dhe kornizat e tyre


Frame (korniza): emërtimi në Java për dritare grafike.
Kornizat ndërtohen nga class JFrame, e cila ndodhet në
pakon javax.swing.

import javax.swing.*;
/** FrameTest krijon një kornizë */
public class FrameTest
{ public static void main(String[] args)
  { JFrame sampleFrame = new JFrame();
    System.out.println("Ku është korniza?");
  }
}



                                        Hyrja (input), dalja (output) dhe gjendja – fq. 11
         Panelat dhe kornizat e tyre – Vazhdim


import javax.swing.*;
/** FrameTest krijon dhe afishon një kornizë */
public class FrameTest
{ public static void main(String[] args)
  { JFrame sampleFrame = new JFrame();
    sampleFrame.setSize(300, 200);
    sampleFrame.setVisible(true);
    System.out.println("Korniza u shfaq!");
  }
}



                                    Hyrja (input), dalja (output) dhe gjendja – fq. 12
              Përshtatja e panelave me trashigimi


Panel: objekti në Java mbi të cilin vizatohet. Për të vizatuar
mbi panel shfrytëzohet teknika e quajtur trashigimi
(inheritance).
 1. Duke u nisur nga class JPanel, shkruhet klasa e
    veçantë, p.sh., class TestPanel. Përbrenda kësaj
    klase përfshihen instruksionet për vizatim.
 2. Konstruktohet një objekt nga class TestPanel,
    konstruktohet një kornizë nga class JFrame, dhe
    futet objekti panel në objektin kornizë.
 3. Vëhet madhësia dhe dukshmëria e kornizës.



                                              Hyrja (input), dalja (output) dhe gjendja – fq. 13
               Përshtatja e panelave me trashigimi –
                                            Vazhdim

import java.awt.*;
import javax.swing.*;
public class TestPanel extends JPanel
{ public void paintComponent(Graphics g)
  { // ... instruksionet të cilat vizatojnë mbi panelin
  }
}

    Nga public class TestPanel mund të konstruktohen objekte panela.

    Fraza extends JPanel bën që class TestPanel ta zgjerojë/trashigojë
    class JPanel. TestPanel quhet nënklasë, JPanel quhet mbiklasë.

    Instruksionet shtesë përbrenda class TestPanel përmbahen në metodën e re
    paintComponent. Metoda paintComponent startohet dhe ristartohet
    automatikisht.

    Penda grafike g është objekti i cili vizaton mbi panelin. Penda grafike shfrytëzon
    klasa nga biblioteka java.awt.
                                                                Hyrja (input), dalja (output) dhe gjendja – fq. 14
            Përshtatja e panelave me trashigimi –
                                         Vazhdim

import java.awt.*;
import javax.swing.*;
/** TestPanel krijon një panel që afishon një string */
public class TestPanel extends JPanel
{ /** paintComponent vizaton panelin
    * @param g - penda grafike */
  public void paintComponent(Graphics g)
  { g.setColor(Color.red);
    g.drawString("Tungjatjeta!", 30, 80);
  }
}




                                                 Hyrja (input), dalja (output) dhe gjendja – fq. 15
             Përshtatja e panelave me trashigimi –
                                          Vazhdim

import javax.swing.*;
/** FrameTest krijon dhe afishon një kornizë,
  * dhe fut një panel në të. */
public class FrameTest3
{ public static void main(String[] args)
  { TestPanel samplePanel = new TestPanel();
    JFrame sampleFrame = new JFrame();
    sampleFrame.getContentPane().add(samplePanel);
    sampleFrame.setSize(300, 200);
    sampleFrame.setVisible(true);
    System.out.println("Korniza u shfaq e shkruar!");
  }
}




                                                 Hyrja (input), dalja (output) dhe gjendja – fq. 16
           Përshtatja e panelave me trashigimi –
                                        Vazhdim


Trashigimia (inheritance): teknikë për lidhjen e dy klasave
ashtu që njëra është „përshtatje“ ose zgjerim i tjetrës. Në
qoftë se klasa C2 trashigon (zgjeron) klasën C1
class C2 extends C1
atëherë çdo objekt i konstruktuar nga class C2 do të ketë
tërë strukturën e definuar përbrenda class C1 si dhe
strukturën përbrenda class C2.

Nënklasa dhe mbiklasa: C2 është nënklasë e C1, kurse C1
është mbiklasë e C2.




                                            Hyrja (input), dalja (output) dhe gjendja – fq. 17
               Përshtatja e panelave me trashigimi –
                                            Vazhdim



      FrameTest                             a1 : TestPanel
main(...)                           paintComponent(g == a2 )
{ samplePanel ==      a1            { ... }
    sampleFrame ==    a3            Instruksionet nga klasa JPanel
    ...
}
      a2 : Graphics                               a3 : JFrame
setColor(...) { ... }                      setSize(...) { ... }
drawString(...) { ... }                    setVisible(...) { ... }
...                                        ...
       [Objekti Graphics konstruktohet
        automatikisht me TestPanel.]



                                                        Hyrja (input), dalja (output) dhe gjendja – fq. 18
             Përshtatja e panelave me trashigimi –
                                          Vazhdim


  FrameTest                   TestPanel
  main                     paintComponent




    JFrame
                                                                     Graphics
getContentPane                 JPanel
                                                                  setColor
setSize
                                                                  drawString
setVisible


          Figura 3. Arkitektura e aplikacionit me TestPanel




                                                   Hyrja (input), dalja (output) dhe gjendja – fq. 19
            Përshtatja e panelave me trashigimi –
                                         Vazhdim

import java.awt.*;
import javax.swing.*;
/** MyPanel krijon një panel me ngjyra */
public class MyPanel extends JPanel
{ /** paintComponent vizaton mbi panelin
    * @param g -- penda grafike */
  public void paintComponent(Graphics g)
  { g.setColor(Color.red);
    int left = 100;
    int top = 70;
    int width = 90;
    int height = 60;
    g.drawRect(left, top, width, height);
    int diameter = 40;
    g.fillOval(left + width - diameter, top, diameter, diameter);
  }
}

                                                 Hyrja (input), dalja (output) dhe gjendja – fq. 20
             Përshtatja e panelave me trashigimi –
                                          Vazhdim

import java.awt.*;
import javax.swing.*;
/** FrameTest2 afishon një dritare me ngjyra */
public class FrameTest2
{ public static void main(String[] args)
  { JFrame myFrame = new JFrame();
    myFrame.getContentPane().add(new MyPanel());
    myFrame.setTitle("Vizatuesi im i kornizave");
    myFrame.setBackground(Color.white);
    int width = 300;
    int height = 200;
    myFrame.setSize(width, height);
    myFrame.setVisible(true);
  }
}



                                                    Hyrja (input), dalja (output) dhe gjendja – fq. 21
            Përshtatja e panelave me trashigimi –
                                         Vazhdim


Ngjyrosje e dritares: vizatimi i tekstit, ngjyrave dhe figurave
në dritaren grafike; kryhet përmes metodës
paintComponent.

Pendë grafike: objekti i shfrytëzuar nga metoda
paintComponent për ngjyrosjen e dritares.

Piksel: njëra nga „pikat“ e imazhit; shfrytëzohet si njësi
matëse për distanca përbrenda dirtares grafike.




                                              Hyrja (input), dalja (output) dhe gjendja – fq. 22
           Formati dhe metodat për vizatim




                 70


         100




                                         200
                      300




Figura 4. Alokimi i pikselit me koordinata (100,70)
                                               Hyrja (input), dalja (output) dhe gjendja – fq. 23
     Formati dhe metodat për vizatim –
                             Vazhdim




            70


     100
                      60

                 90




Figura 5. g.drawRect(100, 70, 90, 60)
                                Hyrja (input), dalja (output) dhe gjendja – fq. 24
     Formati dhe metodat për vizatim –
                             Vazhdim




            70


     100         40
            40




Figura 6. g.drawOval(100, 70, 40, 40)
                                Hyrja (input), dalja (output) dhe gjendja – fq. 25
               Formati dhe metodat për vizatim –
                                       Vazhdim


Metoda                           Semantika
setColor(c)                      Mbush pendën me ngjyrën
drawLine(x1, y1, x2, y2)         Vizaton segmentin
drawString(s, x, y)              Afishon stringun të pozicionuar
                                 sipas koordinatave
drawRect(x, y, width, height)    Vizaton drejtkëndëshin
fillRect(x, y, width, height)    Mbush drejtkëndëshin
drawOval(x, y, width, height)    Vizaton elipsën
fillOval(x, y, width, height)    Mbush elipsën
fillArc(x, y, width, height,     Vizaton pjesën e harkut të elipsës
startAngle, thickness)

  Tabela 1. Disa metoda të pendës grafike (class Graphics)

                                                   Hyrja (input), dalja (output) dhe gjendja – fq. 26
                   Konstruktor metodat dhe objekti
                                            this


Metodë konstruktor: metodë përbrenda një klase që
ekzekutohet kur të konstruktohet një objekt nga klasa.
Emri i konstruktorit është i njëjtë sikurse emri i klasës në të
cilën paraqitet.

this: vlerë e posaçme në Java e cila shënon „këtë
objekt“. Zbatohet për vetëreferencim të objekteve.




                                               Hyrja (input), dalja (output) dhe gjendja – fq. 27
                    Konstruktor metodat dhe objekti
                                   this – Vazhdim

import java.awt.*;
import javax.swing.*;
import java.util.*;
/** ClockWriter vizaton një orë */
public class ClockWriter extends JPanel
{ public ClockWriter()
  { int width = 200;
    JFrame clockFrame = new JFrame();
    clockFrame.getContentPane().add(this);
    clockFrame.setTitle("Ora");
    clockFrame.setBackground(Color.white);
    clockFrame.setSize(width, width);
    clockFrame.setVisible(true);
  }




                                             Hyrja (input), dalja (output) dhe gjendja – fq. 28
                  Konstruktor metodat dhe objekti
                                 this – Vazhdim

/** paintComponent vizaton orën
 * @param g - penda grafike */
public void paintComponent(Graphics g)
{ GregorianCalendar time = new GregorianCalendar();
  int minutesAngle = 90 - time.get(Calendar.MINUTE) * 6;
  int hoursAngle = 90 - time.get(Calendar.HOUR) * 30;
  int left = 50;
  int top = 50;
  int diameter = 100;
  g.setColor(Color.black);
  g.drawOval(left, top, diameter, diameter);
  g.setColor(Color.red);
  g.fillArc(left + 5, top + 5, diameter - 10, diameter - 10,
            minutesAngle, 5);
  g.setColor(Color.blue);
  g.fillArc(left + 25, top + 25, diameter - 50, diameter - 50,
            hoursAngle, -8);
}
                                               Hyrja (input), dalja (output) dhe gjendja – fq. 29
                      Konstruktor metodat dhe objekti
                                     this – Vazhdim

    /** main: për testim */
    public static void main(String[] args)
    { new ClockWriter(); }
}




                                             Hyrja (input), dalja (output) dhe gjendja – fq. 30
                 Konstruktor metodat dhe objekti
                                this – Vazhdim


Fraza
new ClockWriter()
ka semantikën vijuese:
   Konstruktohet një ClockWriter objekt në memorien
   qendrore;
   Objektit të ri i dërgohet mesazh për të ekzekutuar
   instruksionet në konstruktorin e tij, të quajtur poashtu
   ClockWriter.




                                             Hyrja (input), dalja (output) dhe gjendja – fq. 31
                  Objektet me gjendje: Variablat e
                                         fushave


Variabël e fushës (fushë): variabël e deklaruar në klasë
pavarësisht nga metodat e klasës. Fusha mund të
referencohet dhe t’i ndahet vlerë nga të gjitha metodat në
atë klasë.

Variabël lokale: variabël e deklaruar përbrenda një
metode. Mund të referencohet vetëm nga urdhërat
përbrenda asaj metode.




                                            Hyrja (input), dalja (output) dhe gjendja – fq. 32
                    Objektet me gjendje: Variablat e
                                fushave – Vazhdim

import java.awt.*;
import javax.swing.*;
/** FieldExample: Afishon numrin e ngjyrosjeve të dritares */
public class FieldExample extends JPanel
{ private int count; // numri i ngjyrosjeve të dritares
  /** FieldExample: konstrukton dritaren */
  public FieldExample()
  { count = 0; // dritarja akoma nuk është ngjyrosur
    JFrame myFrame = new JFrame();
    myFrame.getContentPane().add(this);
    myFrame.setTitle("Shembull fushe");
    int height = 200;
    myFrame.setSize(3 * height / 2, height);
    myFrame.setVisible(true);
  }



                                                 Hyrja (input), dalja (output) dhe gjendja – fq. 33
                      Objektet me gjendje: Variablat e
                                  fushave – Vazhdim

    /** paintComponent vizaton numrin e ngjyrosjeve
     * @param g - penda grafike */
    public void paintComponent(Graphics g)
    { count = count + 1; // ose count++
      g.setColor(Color.black);
      int margin = 25;
      int lineHeight = 20;
      int firstLine = 40;
      int baseline = firstLine + lineHeight * count;
      g.drawString("E ngjyrosur " + count + " herë", margin, baseline);
    }
    /** main: për testim */
    public static void main(String[] args)
    { new FieldExample(); }
}



                                                   Hyrja (input), dalja (output) dhe gjendja – fq. 34
                       Objektet me gjendje: Variablat e
                                   fushave – Vazhdim



FieldExample                            a2 : Graphics
  main(...)                       setColor(...) { ... }
  { ... > }                       drawString(...) { ... }
                                  ...
     a1 : FieldExample
private int count ==     0
paintComponent( g ==     a2   )          a3 : JFrame
{ count = count + 1;              setSize(...) { ... }
  ...                             setVisible(...) { ... }
}                                 ...




                                              Hyrja (input), dalja (output) dhe gjendja – fq. 35
                    Objektet me gjendje: Variablat e
                                fushave – Vazhdim


Fushat gjithashtu mund të përmbajnë edhe objekte
(adresa të tyre).
// ... import -- njësoj sikurse më parë
public class ClockWriter extends JPanel
{ private GregorianCalendar time = new GregorianCalendar();
  public ClockWriter()
  { // ... Njësoj sikurse më parë
  }
  public void paintComponent(Graphics g)
  { int minutesAngle = 90 - time.get(Calendar.MINUTE) * 6;
    int hoursAngle = 90 - time.get(Calendar.HOUR) * 30;
    // ... Njësoj sikurse më parë
  }
  // ... main -- njësoj sikurse më parë
}


                                                 Hyrja (input), dalja (output) dhe gjendja – fq. 36
           Objektet me gjendje: Variablat e
                       fushave – Vazhdim


      ClockWriter               JPanel
 paintComponent




                               Graphics
GregorianCalendar             setColor
get                           drawString


      Figura 7. Arkitektura e ClockWriter




                                          Hyrja (input), dalja (output) dhe gjendja – fq. 37
                  Objektet me gjendje: Variablat e
                              fushave – Vazhdim


Relacioni është: në qoftë se klasa C2 zgjëron klasën C1,
themi se C2 është C1.

Relacioni shfrytëzon: në qoftë se klasa C2 dërgon
mesazhe objekteve të konstruktuara nga klasa C1, themi
se C2 shfrytëzon C1.

Relacioni ka: në qoftë se klasa C2 posedon fushë vlera e
së cilës është objekt i klasës C1 të cilin ajo e ka
konstruktuar, themi se C2 ka C1.




                                           Hyrja (input), dalja (output) dhe gjendja – fq. 38
                  Objektet me gjendje: Variablat e
                              fushave – Vazhdim


Semantika e fushave:
   Qeliza e fushës krijohet kur edhe vetë objekti.
   Fusha mund të inicializohet me vetë krijimin, në
   instruksionin e deklarimit. Në qoftë se fusha nuk
   inicializohet gjatë deklarimit, atëherë preferohet që të
   inicializohet përbrenda metodës konstruktor.
   Vlera në qelizën e një fusheje mbahet edhe kur nuk
   ekzekutohet asnjë metodë e objektit.
   Emrat e fushave nuk duhet të rideklarohen përbrenda
   ndonjë metode.


                                             Hyrja (input), dalja (output) dhe gjendja – fq. 39
                Zbatimi i fushave për memorimin e
                            hyrjes dhe përgjegjjeve


import java.awt.*;
import javax.swing.*;
import java.text.*;
/** Konverton vlerën e temperaturës. */
public class FahrenheitToCelsiusWriter extends JPanel
{ private int fahrenheit;
  private double celsius;
  private int leftMargin = 20;
  private int lineHeight = 20;




                                                 Hyrja (input), dalja (output) dhe gjendja – fq. 40
              Zbatimi i fushave për memorimin e
              hyrjes dhe përgjegjjeve – Vazhdim


/** Konstruktori. */
public FahrenheitToCelsiusWriter()
{ String input = JOptionPane.showInputDialog("Gradë Fahrenheit:");
  fahrenheit = new Integer(input).intValue();
  celsius = (5.0/9.0) * (fahrenheit - 32);
  int frameHeight = 200;
  JFrame f = new JFrame();
  f.getContentPane().add(this);
  f.setTitle("Celsius në Fahrenheit");
  f.setBackground(Color.white);
  f.setSize(3 * frameHeight / 2, frameHeight);
  f.setVisible(true);
}




                                               Hyrja (input), dalja (output) dhe gjendja – fq. 41
                  Zbatimi i fushave për memorimin e
                  hyrjes dhe përgjegjjeve – Vazhdim


    /** Vizaton porosinë.
     * @param g penda grafike */
    public void paintComponent(Graphics g)
    { g.setColor(Color.red);
      int firstLine = lineHeight * 4;
      g.drawString(fahrenheit + " Fahrenheit janë",
                   leftMargin, firstLine);
      DecimalFormat formatter = new DecimalFormat("0.0");
      g.drawString(formatter.format(celsius) + " Celsius",
                   leftMargin, firstLine + lineHeight);
    }
    /** main: për testim */
    public static void main(String[] args)
    { new FahrenheitToCelsiusWriter(); }
}



                                                   Hyrja (input), dalja (output) dhe gjendja – fq. 42
                Testimi i programit i cili shfrytëzon
                                                 hyrje


Varësisht nga lloji i test shembujve, stili i testimit mund të
jetë:
 1. Testim i „kutisë së bardhë“.
 2. Testim i „kutisë së zezë“.




                                                Hyrja (input), dalja (output) dhe gjendja – fq. 43
Struktura e komponenteve: Ndërtimi i
       metodave dhe klasave




                                                   ¨
                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 1
              Struktura e komponenteve: Ndërtimi
                           i metodave dhe klasave


Objektivat:
    Të shkruhen metoda publike dhe private të cilat marrin
    argumente (parametra) dhe kthejnë rezultate.
    Të shkruhen klasa që përmbajnë metoda të cilat
    rishfrytëzohen sërish.
    Të lexohen dhe shkruhen specifikime interfejsash, të
    cilat përshkruajnë sjelljet e klasave dhe metodave të
    tyre.




                                                                 ¨
                                     Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 2
                                                                      Metodat


Metodë: varg i emërtuar urdhërash; i destinuar për
kryerjen e një detyre ose përgjegjësie specifike.

public class MyApplication
{ public static void main(String[] args)
  { // ... Instruksionet të cilat ekzekutohen
    //     me startimin e aplikacionit
  }
}




                                                                ¨
                                    Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 3
                                         Metodat – Vazhdim

import java.awt.*;
import javax.swing.*;
public class MyPanel extends JPanel
{ public MyPanel()
  { // ... Instruksionet për konstruktimin dhe inicializimin
    //     e panelit
  }

    public void paintComponent(Graphics g)
    { // ... Instruksionet për vizatim në panelin
    }
}




                                                                       ¨
                                           Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 4
                                            Metodat publike


System.out.println("TEKSTI");

Invokim metode: dërgim mesazhi i cili përfshin emrin e
metodës. Mesazhi kërkon që objekti pranues të ekzekutojë
metodën e emërtuar në mesazhin.

Klient: objekti i cili dërgon mesazh (invokim).

Pranues: objekti i cili pranon mesazh; ekzekuton metodën
e emërtuar në mesazhin.




                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 5
                            Metodat publike – Vazhdim


public void paintComponent(Graphics g) // kjo është ballina
{ URDHËRAT // ky është trupi
}


Përnga sintaksa, metoda përbëhet nga ballina (header
line) dhe trupi.

Metoda publike i është në dispozicion „publikut gjeneral“,
përfshirë sistemin operativ të kompjuterit si dhe objekte të
krijuara nga klasë tjera.




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 6
                        Ca metoda publike themelore


/** Vizaton ASCII art */
public class AsciiArtWriter
{ /** Konstruktori */
  public AsciiArtWriter()
  { System.out.println(); }

  /** Afishon një bletë */
  public void printBee()
  { System.out.println(" ,-.");
    System.out.println(" \\_/"); // \\ për \
    System.out.println(">{|||}-");
    System.out.println(" / \\");
    System.out.println(" ‘-^");
    System.out.println();
  }



                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 7
                        Ca metoda publike themelore –
                                             Vazhdim

    /** Afishon një fluturë */
    public void printButterfly()
    { System.out.println("   _ \" _"); // \" për "
      System.out.println(" (_\\|/_)");
      System.out.println("   (/|\\)");
      System.out.println();
    }

    /** Afishon një kalikuese */
    public void printLadybug()
    { System.out.println(" ‘m\’");   // \’ për ’
      System.out.println(" (|)");
      System.out.println();
    }
}



                                                                        ¨
                                            Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 8
                      Ca metoda publike themelore –
                                           Vazhdim

/** DrawArt: ca Ascii art*/
public class DrawArt
{ public static void main(String[] args)
  { AsciiArtWriter writer = new AsciiArtWriter();
    writer.printBee();
    System.out.println("Test");
    writer.printLadybug();
    writer.printButterfly();
  }
}




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 9
                 Ca metoda publike themelore –
                                      Vazhdim


Specifikim metode: koment i filluar me /** i cili
dokumenton qellimin ose sjelljen e një metode.
Specifikimet mund të përpunohen me veglën javadoc për
të gjeneruar një dokumentacion kodi.




                                                            ¨
                                Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 10
                               Metodat konstruktorë


Konstruktor: metodë përbrenda klasës e cila invokohet
automatikisht kur të konstruktohet një objekt në memorien
qendrore të kompjuterit.
AsciiArtWriter writer = new AsciiArtWriter();




                                                                ¨
                                    Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 11
            Metodat konstruktorë – Vazhdim



                   DrawArt
main
{ 1> AsciiArtWriter writer = new AsciiArtWriter();
  ...
}




                                                             ¨
                                 Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 12
                         Metodat konstruktorë – Vazhdim



         DrawArt                      a1 : AsciiArtWriter
main                               AsciiArtWriter()
{ AsciiArtWriter writer ==   ? ;   { 2> System.out.println(); }
  1> writer = PRIT                 public void printBee() {...}
  ...                              public void printButterfly() {...}
}                                  public void printLadybug() {...}




                                                                         ¨
                                             Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 13
                         Metodat konstruktorë – Vazhdim



         DrawArt                      a1 : AsciiArtWriter
main                               public void printBee() {...}
{ AsciiArtWriter writer ==   ? ;   public void printButterfly() {...}
  1> writer = a1                   public void printLadybug() {...}
  ...
}




                                                                         ¨
                                             Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 14
                         Metodat konstruktorë – Vazhdim



          DrawArt                      a1 : AsciiArtWriter
main                                public void printBee() {...}
{ AsciiArtWriter writer ==   a1 ;   public void printButterfly() {...}
  ...                               public void printLadybug() {...}
  1> writer.printBee();
  ...
}




                                                                          ¨
                                              Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 15
                         Metodat konstruktorë – Vazhdim



          DrawArt                      a1 : AsciiArtWriter
main                                public void printBee()
{ AsciiArtWriter writer ==   a1 ;   { 2> System.out.println(...);
  ...                                 ...
  1> PRIT                           }
  ...                               public void printButterfly() {...}
}                                   public void printLadybug() {...}




                                                                          ¨
                                              Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 16
                          Metodat konstruktorë – Vazhdim



          DrawArt                     a1 : AsciiArtWriter
main                               public void printBee() {...}
{ AsciiArtWriter writer == a1 ;    public void printButterfly() {...}
  ...                              public void printLadybug() {...}
  1> System.out.println("Test");
  ...
}




                                                                         ¨
                                             Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 17
                              Parametrat e metodave


Parametrat aktualë: argumentet lista e të cilëve jepet së
bashku me emrin e metodës gjatë invokimit të metodës,
p.sh.,
System.out.println("TEKSTI");




                                                                 ¨
                                     Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 18
                 Parametrat e metodave – Vazhdim


Parametrat formalë: emrat e variablave lista e të cilave
jepet në ballinën e metodës.
 /** Afishon një bletë me emër.
  * @param name emri i bletës
  */
 public void printBeeWithName(String name)
 { System.out.println(" ,-.");
   System.out.println(" \\_/");
   System.out.println(">{|||}-" + name + "-");
   System.out.println(" / \\");
   System.out.println(" ‘-^");
   System.out.println();
 }




                                                                    ¨
                                        Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 19
                  Parametrat e metodave – Vazhdim


Kur metoda invokohet parametrat aktualë u shoqërohen
parametrave formalë përkatës ashtu që parametri formal
inicializohet me parametrin aktual. Lidhja e një parametri
aktual me një parametër formal funksionon sikur një
inicializim i një variableje lokale.
AsciiArtWriter writer = new AsciiArtWriter();
String s = "Tringa";
writer.printBeeWithName(s);

writer.printBeeWithName("Filan " + "Fisteku");




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 20
          Parametrat e metodave – Vazhdim


                      DrawArt
         main
         { AsciiArtWriter writer ==         a1 ;
             String s == "Tringa" ;
             1> writer.printBeeWithName(s);
             ...
         }


             a1 : AsciiArtWriter
public   void   printBee() {...}
public   void   printButterfly() {...}
public   void   printLadybug() {...}
public   void   printBeeWithName(String name) {...}




                                                               ¨
                                   Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 21
           Parametrat e metodave – Vazhdim


                      DrawArt
    main
    { AsciiArtWriter writer ==     a1 ;
         String s == "Tringa" ;
         1> writer.printBeeWithName("Tringa");
         ...
    }


             a1 : AsciiArtWriter
public   void   printBee() {...}
public   void   printButterfly() {...}
public   void   printLadybug() {...}
public   void   printBeeWithName(String name) {...}




                                                               ¨
                                   Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 22
Parametrat e metodave – Vazhdim

            DrawArt
main
{ AsciiArtWriter writer ==          a1 ;
    String s ==   "Tringa" ;
    1> PRIT
    ...
}


    a1 : AsciiArtWriter
    ...
    public void printBeeWithName
    { 2> String name = "Tringa";
      System.out.println(...);
      ...
    }
    ...


                                                       ¨
                           Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 23
Parametrat e metodave – Vazhdim

             DrawArt
main
{ AsciiArtWriter writer ==          a1 ;
    String s ==   "Tringa" ;
    1> PRIT
    ...
}


     a1 : AsciiArtWriter
    ...
    public void printBeeWithName
    { String name == "Tringa"
      2> System.out.println(...);
      ...
    }
    ...


                                                       ¨
                           Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 24
                                   Format e parametrave


Çdo vlerë e cila mund t’i shoqërohet (ndahet për vlerë) një
variableje mund të jetë parametër aktual. Parametri aktual
duhet të jetë kompatibil me parametrin formal.
import java.text.*;
/** Kryen operacione matematike. */
public class MathOperations
{ /** Afishon numrin invers të një numri të plotë
   * të formatizuar në tri vende decimale.
   * @param i numri i plotë i cili invertohet */
  public void printInverse(int i)
  { DecimalFormat formatter = new DecimalFormat("0.000");
    double d = 1.0 / i;
    String s = formatter.format(d);
    System.out.println(s);
  }
}
                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 25
                  Format e parametrave – Vazhdim


Invokimi i printInverse bëhet, p.sh., me
MathOperations calculator = new MathOperations();
calculator.printInverse(3);

Invokim jokorrekt: calculator.printInverse(0.5).

Për printInverse të shkruar me ballinën
public void printInverse(double i)
korrekte do të ishin të dy invokimet vijuese:
calculator.printInverse(0.5);
calculator.printInverse(3);



                                                                  ¨
                                      Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 26
                 Format e parametrave – Vazhdim


/** Afishon numrin invers të një numri të plotë.
 * @param i numri i plotë i cili invertohet
 * @param pattern shablloni për formatizimin e rezultatit */
public void printInverse(int i, String pattern)
{ DecimalFormat formatter = new DecimalFormat(pattern);
  double d = 1.0 / i;
  String s = formatter.format(d);
  System.out.println(s);
}




                                                                 ¨
                                     Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 27
                 Format e parametrave – Vazhdim


MathOperations calculator = new MathOperations();
calculator.printInverse(3, "0.00000");
calculator.printInverse(5, "0.0");

Shoqërimi i parametrave aktualë parametrave formalë
përcaktohet nga renditja në listë e parametrave aktualë –
parametrat aktualë u shoqërohen parametrave formalë me
radhë.




                                                               ¨
                                   Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 28
                Format e parametrave – Vazhdim


/** Afishon numrin invers të një numri të plotë.
 * @param i numri i plotë i cili invertohet
 * @param f objekti i cili formatizon rezultatin */
public void printInverse(int i, DecimalFormat f)
{ double d = 1.0 / i;
  String s = f.format(d);
  System.out.println(s);
}




                                                                 ¨
                                     Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 29
                   Format e parametrave – Vazhdim


Invokimi i metodës së tretë:
DecimalFormat fivePlaces = new DecimalFormat("0.00000");
calculator.printInverse(3, fivePlaces);




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 30
             Format e parametrave – Vazhdim


Metodat konstruktorë mund të shfrytëzojnë parametra
formalë njësoj sikurse metodat tjera publike.
Metoda ballina e së cilës ka formën
public void EMRI_I_METODËS()
është metodë me zero parametra formalë dhe duhet të
invokohet nga urdhër i cili ka zero parametra aktualë:
OBJEKTI_PRANUES.EMRI_I_METODËS();




                                                            ¨
                                Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 31
                            Case study: kornizë dalëse me
                                 destinim të përgjithshëm


Specifikim interfejsi (interfejs): listë emrash dhe
përgjegjësish të metodave publike të një klase.
 MyWriter krijon dritare grafike e cila afishon
 një fjali
 Konstruktori:
 MyWriter(int w, int h)                         Konstrukton dritaren me gjerësi dhe
                                                lartësi të specifikuar
 Metodat:
 writeSentnce(String s)                         Afishon fjalinë në dritaren grafike
 repositionSentence(int x, int y)               Riafishon fjalinë në pozitën e re

    Tabela 1. Specifikimi i interfejsit të kornizës dalëse MyWriter



                                                                                ¨
                                                    Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 32
                    Case study: kornizë dalëse me
               destinim të përgjithshëm – Vazhdim


import javax.swing.*;
import java.awt.*;
/** Krijon dritare grafike e cila afishon një fjali. */
public class MyWriter extends JPanel
{ private int width;
  private int height;
  private String sentence = "";
  private int xPosition;
  private int yPosition;




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 33
                  Case study: kornizë dalëse me
             destinim të përgjithshëm – Vazhdim


/** Konstruktor: krijon panelin.
 * @param w gjerësia e dritares
 * @param h lartësia e dritares */
public MyWriter(int w, int h)
{ width = w;
  height = h;
  xPosition = width / 5;
  yPosition = height / 2;
  JFrame myFrame = new JFrame();
  myFrame.getContentPane().add(this);
  myFrame.setTitle("MyWriter");
  myFrame.setSize(width, height);
  myFrame.setVisible(true);
}




                                                                    ¨
                                        Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 34
                  Case study: kornizë dalëse me
             destinim të përgjithshëm – Vazhdim


/** Vizaton panelin.
 * @param g penda grafike */
public void paintComponent(Graphics g)
{ g.setColor(Color.white);
  g.fillRect(0, 0, width, height);
  g.setColor(Color.red);
  g.drawString(sentence, xPosition, yPosition);
}




                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 35
                      Case study: kornizë dalëse me
                 destinim të përgjithshëm – Vazhdim


    /** Afishon një fjali.
     * @param s fjalia që afishohet */
    public void writeSentence(String s)
    { sentence = s;
      this.repaint();
    }
    /** Riafishon fjalinë në pozitën e re.
     * @param x pozita e re horizontale
     * @param y pozita e re vertikale */
    public void repositionSentence(int x, int y)
    { xPosition = x;
      yPosition = y;
      this.repaint();
    }
}



                                                                       ¨
                                           Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 36
                    Case study: kornizë dalëse me
               destinim të përgjithshëm – Vazhdim


import javax.swing.*;
/** Afishon në dritare grafike një fjali të futur. */
public class MyWriterTest
{ public static void main(String args)
  { int width = 300;
    int height = 200;
    MyWriter writer = new MyWriter(width, height);
    writer.repositionSentence(50, 80);
    String s = JOptionPane.showInputDialog("Rradhisni ca tekst:");
    writer.writeSentence(s);
  }
}




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 37
                  Case study: kornizë dalëse me
             destinim të përgjithshëm – Vazhdim


1. Disenjuam dhe shkruam një klasë e cila mund të
   shfrytëzohet si komponentë e shumë aplikacioneve.
2. Disenjuam një specifikim interfejsi i cili na ndihmoi ta
   shkruajmë klasën.
3. Shfrytëzuesit e klasës mund ta lexojnë specififikim e
   klasës për të kuptuar se si t’i shfrytëzojnë metodat e
   klasës; nuk ka nevojë për ta lexuar kodimin e klasës.
4. Kodimi shfrytëzoi konstruktor dhe fusha private për të
   ndihmuar metodat publike të sillen në mënyrë korrekte;
   metodat publike invokuan njëra tjetrën sipas nevojës.



                                                                 ¨
                                     Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 38
              Case study: kornizë dalëse me
         destinim të përgjithshëm – Vazhdim


Kur një aplikacion ndërtohet nga disa njerëz, është më
lehtë për njerëzit veç e veç të shkruajnë dhe testojnë
pjesët e aplikacionit në qoftë se aplikacioni ndahet në
klasë.
Në qoftë se një pjesë aplikacioni duhet sërish të
shkruhet ose të zëvendësohet, është më lehtë për t’u
bërë në qoftë se pjesa është një klasë e veçantë.




                                                            ¨
                                Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 39
                Rezultatet e metodave: Funksionet


Kur një objekt klient dërgon mesazh, ndonjëherë klienti
pret përgjegjje kthyese, p.sh.,
String input = JOptionPane.showInputDialog("Gradë Fahrenheit:");
int f = new Integer(input).intValue();


Rezultat metode: përgjegjje e llogaritur nga metoda dhe e
kthyer klientit.

Funksion: metodë e cila kthen rezultat.




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 40
             Rezultatet e metodave: Funksionet –
                                        Vazhdim

/** Konverton vlera temperaturash. */
public class TemperatureConvertor
{ /** Konverton vlerën e dhënë.
   * @param f shkallët Fahrenheit
   * @return ekuivalenti në shkallë Celsius */
  public double fahrenheitToCelsius(double f)
  { double c = (5.0/9.0) * (f - 32);
    return c;
  }
}




                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 41
             Rezultatet e metodave: Funksionet –
                                        Vazhdim


Teknika për kthimin e rezultatit:
    Në ballinën e metodës zëvendësohet fjala kyçe void
    me tipin e të dhënave të rezultatit të cilin duhet ta
    kthejë metoda. Fjala kyçe void do të thotë mos kthe
    fare rezultat.
    Në fund të trupit të metodës vëhet urdhër
      return SH;
    ku shprehja SH llogarit vlerën e cila do të kthehet.




                                                                  ¨
                                      Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 42
              Rezultatet e metodave: Funksionet –
                                         Vazhdim

import javax.swing.*;
/** ConvertorTest teston konvertorin e temperaturave */
public class ConvertorTest
{
  public static void main(String args)
  { String input =
      JOptionPane.showInputDialog("Gradë Fahrenheit:");
    int f = new Integer(input).intValue();
    TemperatureConvertor convert = new TemperatureConvertor();
    double c = convert.fahrenheitToCelsius(f);
    MyWriter writer = new MyWriter(300, 200);
    writer.writeSentence(f + " Fahrenheit janë " + c + " Celsius");
  }
}




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 43
             Rezultatet e metodave: Funksionet –
                                        Vazhdim


Urdhëri return është pikë daljeje nga funksioni. P.sh.,
funksioni vijues llogarit në mënyrë jokorrekte katrorin e një
numri:
public int square(int num)
{ int result = 0;
  return result;
  result = num * num;
}




                                                                  ¨
                                      Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 44
            Rezultatet e metodave: Funksionet –
                                       Vazhdim



                     ConvertorTest
main
{ int f == 68.0
  1> TemperatureConvertor convert = new TemperatureConvertor();
  double c = convert.fahrenheitToCelsius(f);
  ...
}




                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 45
      Rezultatet e metodave: Funksionet –
                                 Vazhdim


               ConvertorTest
main
{ int f ==   68.0
    TemperatureConvertor convert == a1
    1> double c = convert.fahrenheitToCelsius(f);
    ...
}


       a1 : TemperatureConvertor
public double fahrenheitToCelsius(double f) {...}




                                                             ¨
                                 Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 46
Rezultatet e metodave: Funksionet –
                           Vazhdim

          ConvertorTest
main
{ int f ==       68.0
    TemperatureConvertor convert ==               a1
    double c == ?
    1> c = PRIT;
    ...
}


    a1 : TemperatureConvertor
             fahrenheitToCelsius
             { double f == 68.0
                 double c == 20.0
                 2> return c;
             }


                                                           ¨
                               Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 47
    Rezultatet e metodave: Funksionet –
                               Vazhdim


              ConvertorTest
    main
    { int f ==   68.0
        TemperatureConvertor convert ==            a1
        double c == ?
        1> c = 20.0;
        ...
    }
        a1 : TemperatureConvertor
public double fahrenheitToCelsius(double f) {...}




                                                            ¨
                                Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 48
             Rezultatet e metodave: Funksionet –
                                        Vazhdim


Rezultati i një funksioni mund të injorohet, p.sh., në
class FahrenheitToCelsiusWriter kemi pasur
 /** main: për testim */
 public static void main(String args)
 { new FahrenheitToCelsiusWriter(); }




                                                                    ¨
                                        Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 49
                                               Metodat private


Metodat private mund të invokohen vetëm përbrenda
klasës në të cilë paraqiten.

Metoda private shkruhen si zgjidhje në dy situata:
 1. Kur ka përsëritje të një detyre.
 2. Kur një formulë ose nënalgoritëm fundamental meriton
    të ketë emër të vetin.




                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 50
                     Emërtimi i një nënalgoritmi me
                                     metodë private


Algoritmi për paraqitjen e dritares grafike me kufi të kaltër e
qendër të bardhë:
 1. Ngjyros tërë dritaren në të kaltër.
 2. Llogarit madhësinë e një drejtkëndëshi të madhësisë
    ca më të vogël sesa tërë dritarja.
 3. Ngjyros drejtkëndëshin në të bardhë.




                                                                  ¨
                                      Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 51
                    Emërtimi i një nënalgoritmi me
                        metodë private – Vazhdim


/** Vizaton panelin.
 * @param g penda grafike */
public void paintComponent(Graphics g)
{ makeBorder(g);
  g.setColor(Color.red);
  g.drawString(sentence, xPosition, yPosition);
}
/** Ngjyros kufirin e kornizës.
 * @param pen penda grafike */
private void makeBorder(Graphics pen)
{ pen.setColor(Color.blue);
  pen.fillRect(0, 0, width, height);
  int borderSize = 20;
  int rectWidth = width - 2 * borderSize;
  int rectHeight = height - 2 * borderSize;
  pen.setColor(Color.white);
  pen.fillRect(borderSize, borderSize, rectWidth, rectHeight);
}
                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 52
              Përsëritja e një aktiviteti me metodë
                                             private


Algoritmi për ngjyrosjen e një veje:
 1. Llogarit lartësinë e vesë si 2/3 e gjerësisë së saj.
 2. Llogarit skajin e majtë të vesë ashtu që veja të jetë e
    qendërsuar në dritaren, dhe llogarit skajin e sipërm të
    vesë.
 3. Ngjyros venë.
 4. Kthe vlerën e skajit të sipërm, në rast nevoje që
    mëpastaj të vendoset një tjetër ve përmbi.




                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 53
               Përsëritja e një aktiviteti me metodë
                                  private – Vazhdim


import javax.swing.*;
import java.awt.*;
/** Vizaton tri ve të renditura. */
public class StackedEggWriter extends JPanel
{ private int frameWidth;
  private int frameHeight;
  private int egg1Size;
  private int egg2Size;
  private int egg3Size;




                                                                     ¨
                                         Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 54
             Përsëritja e një aktiviteti me metodë
                                private – Vazhdim


/** Konstruktori.
 * @param width gjerësia e panelit
 * @param height lartësia e panelit
 * @param size1 gjerësia e vesë së poshtme
 * @param size2 gjerësia e vesë së mesme
 * @param size3 gjerësia e vesë së sipërme */
public StackedEggWriter(int width, int height,
                        int size1, int size2, int size3)
{ frameWidth = width; frameHeight = height;
  egg1Size = size1; egg2Size = size2;
  egg3Size = size3;
  JFrame myFrame = new JFrame();
  myFrame.getContentPane().add(this);
  myFrame.setTitle("Mullar vezësh");
  myFrame.setBackground(Color.yellow);
  myFrame.setSize(frameWidth, frameHeight);
  myFrame.setVisible(true);
}
                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 55
             Përsëritja e një aktiviteti me metodë
                                private – Vazhdim


/** Mbush dritaren me vezë.
 * @param g penda grafike */
public void paintComponent(Graphics g)
{ int egg1Top = paintAnEgg(frameHeight, egg1Size, g);
  int egg2Top = paintAnEgg(egg1Top, egg2Size, g);
  paintAnEgg(egg2Top, egg3Size, g);
}




                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 56
             Përsëritja e një aktiviteti me metodë
                                private – Vazhdim


/** Vizaton një ve.
 * @param bottom pozita e skajit të poshtëm
 * @param width pozita e skajit të poshtëm
 * @param pen penda grafike
 * @return y pozita e skajit të sipërm */
private int paintAnEgg(int bottom, int width, Graphics pen)
{ int height = 2 * width / 3;
  int top = bottom - height;
  int left = (frameWidth - width) / 2;
  pen.setColor(Color.pink);
  pen.fillOval(left, top, width, height);
  pen.setColor(Color.black);
  pen.drawOval(left, top, width, height);
  return top;
}



                                                                   ¨
                                       Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 57
                 Përsëritja e një aktiviteti me metodë
                                    private – Vazhdim


    /** main për testim */
    public static void main(String args)
    { int width = 300;
      int height = 200;
      new StackedEggWriter(width, height, 140, 90, 50);
    }
}




                                                                       ¨
                                           Struktura e komponenteve: Ndertimi i metodave dhe klasave – fq. 58
Struktura e kontrollit: Urdhërat kushtëzues




                                                            ¨         ¨
                                Struktura e kontrollit: Urdherat kushtezues – fq. 1
                              Struktura e kontrollit: Urdhërat
                                                  kushtëzues

Objektivat:

      Të studiohet rrjedha e kontrollit të programit dhe një formë e re urdhëri, urdhëri
      kushtëzues, e cila i mundëson metodës të bëjë pyetje mbi vlerat e argumenteve të
      saj ose të dhënave hyrëse. Mbështetur në përgjegjjet në pyetjet, metoda mund të
      kontrollojë rrjedhën e llogaritjes në rrugën më të përshtatshme për këto vlera.

      Të studiohen operatorët logjikë dhe të mësohet logjika prapa urdhërave
      kushtëzues.

      Të shfrytëzohet dituria mbi rrjedhën e kontrollit për të zhvilluar ndërtim
      aplikacionesh në më tepër detaje; në veçanti, aplikacioni ndahet në tri
      komponente: model, view (pamje) dhe controller (kontrollues), ku view merr
      përgjegjësinë për hyrjen dhe daljen e të dhënave, kontrolluesi për rrjedhën e
      kontrollit, kurse modeli merr përgjegjësinë për llogaritjet e përgjegjjeve.




                                                                                             ¨         ¨
                                                                 Struktura e kontrollit: Urdherat kushtezues – fq. 2
               Rrjedha e kontrollit dhe struktura e
                                          kontrollit


Rrjedhë e kontrollit: renditja në të cilën ekzekutohen
urdhërat e një programi.

Strukturë e kontrollit: formë urdhëri e cila përcakton
rrjedhën e kontrollit.




                                                                         ¨         ¨
                                             Struktura e kontrollit: Urdherat kushtezues – fq. 3
                       Rrjedha e kontrollit dhe struktura e
                                      kontrollit – Vazhdim

Struktura e kontrollit e vargut të urdhërave
URDHËRI1;
URDHËRI2;
...
URDHËRIn;

përcakton rrjedhën e kontrollit të ekzekutimit të njëpasnjëshëm të urdhërave përkatëse.

Struktura e kontrollit e invokimit të metodës

PRANUESI.METODA(ARGUMENTET)

përcakton rrjedhën e kontrollit të pauzimit të ekzekutimit në vendin e invokimit ashtu që
urdhërat e emërtuara me METODA në PRANUESI të ekzekutohen në vijim.




                                                                                              ¨         ¨
                                                                  Struktura e kontrollit: Urdherat kushtezues – fq. 4
                Struktura kushtëzuese e kontrollit


Urdhër kushtëzues („urdhër if“): strukturë kontrolli e cila
shtron një pyetje (test) dhe në bazë të përgjegjjes zgjedh
një rrjedhë të kontrollit.

Sintaksa e urdhërit kushtëzues:
if ( TESTI )
{ URDHËRAT1 }
else { URDHËRAT2 }

Semantika: në qoftë se rezultati i testit është true,
atëherë ekzekutohet then-krahu; në qoftë se rezultati i
testit është false, atëherë ekzekutohet else-krahu.


                                                                        ¨         ¨
                                            Struktura e kontrollit: Urdherat kushtezues – fq. 5
            Struktura kushtëzuese e kontrollit –
                                      Vazhdim

/** Afishon se a është argumenti negativ.
  * @param i - argumenti */
public void printPolarity(int i)
{ System.out.print("Numri " + i + " është ");
   if ( i < 0 )
   { System.out.println("negativ.");}
   else { System.out.println("jonegativ.");}
   System.out.println("Fund!");
}




                                                                  ¨         ¨
                                      Struktura e kontrollit: Urdherat kushtezues – fq. 6
               Struktura kushtëzuese e kontrollit –
                                         Vazhdim




                                TESTI?
                         true            false

                      URDHËRAT1     URDHËRAT2




Figura 1. Skema e rrjedhës së kontrollit të përcaktuar nga urdhëri
kushtëzues



                                                                             ¨         ¨
                                                 Struktura e kontrollit: Urdherat kushtezues – fq. 7
              Struktura kushtëzuese e kontrollit –
                                        Vazhdim


Ndonjëherë, kur dëshirohet të specifikohet vetëm
then-krahu, urdhëri kushtëzues shkruhet në formën
if ( TESTI )
{ URDHËRAT }
e cila është shkurtesë për

if ( TESTI ) { URDHËRAT } else { }




                                                                     ¨         ¨
                                         Struktura e kontrollit: Urdherat kushtezues – fq. 8
              Struktura kushtëzuese e kontrollit –
                                        Vazhdim


Algoritmi i një aplikacioni i cili konverton orët në sekonda:
 1. Lexo nga shfrytëzuesi (si hyrje) një numër të plotë, i cili
    paraqet sasinë e orëve.
 2. Në qoftë se numri i plotë është jonegativ, atëherë kthe
    orët në sekonda. Përndryshe, numri i plotë nuk është
    jonegativ, prandaj afisho një mesazh gabimi.




                                                                          ¨         ¨
                                              Struktura e kontrollit: Urdherat kushtezues – fq. 9
               Struktura kushtëzuese e kontrollit –
                                         Vazhdim

import javax.swing.*;
/** Konverton orët në sekonda.
 * Input: numër i plotë jonegativ
 * Output: koha e konvertuar në sekonda */
public class ConvertHours
{ public static void main(String[] args)
  { int hours = new Integer(
      JOptionPane.showInputDialog("Numri i orëve")).intValue();




                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 10
                   Struktura kushtëzuese e kontrollit –
                                             Vazhdim

        if ( hours >= 0 )
        { int seconds = hours * 60 * 60;
          JOptionPane.showMessageDialog(null,
             hours + " orë janë " + seconds + " sekonda");
        }
        else
        { JOptionPane.showMessageDialog(null,
             "Gabim: hyrje negative " + hours);
        }
    }
}




                                                                                 ¨         ¨
                                                     Struktura e kontrollit: Urdherat kushtezues – fq. 11
                 Urdhërat kushtëzues të vendosur
                                       përbrenda


Urdhëra kushtëzues mund të vendosen përbrenda
ndonjërit nga krahët e një urdhëri kushtëzues tjetër, për të
koduar situata kur ekzistojnë pyetje të shumëfishta për t’u
testuar.




                                                                        ¨         ¨
                                            Struktura e kontrollit: Urdherat kushtezues – fq. 12
                         Urdhërat kushtëzues të vendosur
                                    përbrenda – Vazhdim


Algoritmi për një version më të avansuar të MakeChange:
  1. Lexo eurot si një numër të plotë.
  2. Në qoftë se eurot janë negativë, atëherë gjenero një mesazh gabimi. Përndryshe,
     eurot janë jonegativë:
     (a) Lexo centët, numër i plotë.
     (b) Në qoftë se centët janë negativë, atëherë gjenero një mesazh gabimi.
         Përndryshe, centët janë jonegativë:
         i. Në qoftë se centët janë më të mëdhenj se 99, atëherë gjenero një mesazh
            gabimi. Përndryshe, centët janë në intrvalin 0. . . 99:
            A. Llogarit totalin e eurove dhe centëve.
            B. Nxjerr sasinë përkatëse të metelikëve gjysëmeurosh,
               njëzetqindarkësh, dhjetëqindarkësh, pesëqindarkësh dhe qindarkësh.




                                                                                         ¨         ¨
                                                             Struktura e kontrollit: Urdherat kushtezues – fq. 13
                  Urdhërat kushtëzues të vendosur
                             përbrenda – Vazhdim


import javax.swing.*;
/** Llogarit sasinë e metelikeve.
 * Input: dy numra të dhënë në rreshtin komandues
 *          sasia e eurove dhe sasia e centëve
 * Output: sasitë e metelikëve */
public class MakeChange
{ public static void main (String[] args)
   { int euros = new Integer(args[0]).intValue();
     if ( euros < 0 )
     { JOptionPane.showMessageDialog(null,
         "Gabim: euro negativë " + euros);
     }




                                                                           ¨         ¨
                                               Struktura e kontrollit: Urdherat kushtezues – fq. 14
              Urdhërat kushtëzues të vendosur
                         përbrenda – Vazhdim


else
{ int cents = new Integer(args[1]).intValue();
  if ( cents < 0 )
  { JOptionPane.showMessageDialog(null,
       "Gabim: cent negativë " + cents);
  }
  else
  { if ( cents > 99 )
     { JOptionPane.showMessageDialog(null,
         "Gabim: në cent " + cents);
     }




                                                                        ¨         ¨
                                            Struktura e kontrollit: Urdherat kushtezues – fq. 15
                          Urdhërat kushtëzues të vendosur
                                     përbrenda – Vazhdim


                else
                { int money = (euros * 100) + cents;
                  System.out.println("Gjysma = " + (money / 50));
                  money = money % 50;
                  System.out.println("Njëzetqindarka = " + (money / 20));
                  money = money % 20;
                  System.out.println("Dhjetëqindarka = " + (money / 10));
                  money = money % 10;
                  System.out.println("Pesëqindarka = " + (money / 5));
                  money = money % 5;
                  System.out.println("Qindarka = " + money);
                }
            }
        }
    }
}


                                                                                    ¨         ¨
                                                        Struktura e kontrollit: Urdherat kushtezues – fq. 16
                Urdhërat kushtëzues të vendosur
                           përbrenda – Vazhdim


        lexo eurot;
        euro negative?

                         lexo centët;
gabim
                         cent negativë?

             gabim                        cents > 99 ?

                                                         total të holla;
                                gabim
                                                         llogarit metelikët




          Figura 2. Skema e rrjedhës së kontrollit

                                                                             ¨         ¨
                                                 Struktura e kontrollit: Urdherat kushtezues – fq. 17
                  Urdhërat kushtëzues të vendosur
                             përbrenda – Vazhdim


import javax.swing.*;
/** Llogarit sasinë e metelikeve
 * Input: dy numra të dhënë në rreshtin komandues
 *          sasia e eurove dhe sasia e centëve
 * Output: sasitë e metelikëve */
public class MakeChange4
{ public static void main (String[] args)
   { boolean ok = true; // memoron korrektësinë e të dhënave hyrëse
     int euros = new Integer(args[0]).intValue();
     int cents = new Integer(args[1]).intValue();
     if ( euros < 0 )
     { JOptionPane.showMessageDialog(null,
         "Gabim: euro negativë " + euros);
       ok = false;   // gabimi mohon korrektësinë
     }



                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 18
              Urdhërat kushtëzues të vendosur
                         përbrenda – Vazhdim


if ( ok )   // eurot janë në rregull, shqyrto centët
{ if ( cents < 0 )
  { JOptionPane.showMessageDialog(null,
      "Gabim: cent negativë " + cents);
    ok = false;
  }
  if ( cents > 99 )
  { JOptionPane.showMessageDialog(null,
      "Gabim: në cent " + cents);
    ok = false;
  }
}




                                                                        ¨         ¨
                                            Struktura e kontrollit: Urdherat kushtezues – fq. 19
                      Urdhërat kushtëzues të vendosur
                                 përbrenda – Vazhdim


        if ( ok )    // eurot dhe centët janë në rregull,
                  //    llogarit përgjegjjen.
        { int money = (euros * 100) + cents;
          System.out.println("Gjysma = " + (money / 50));
          money = money % 50;
          System.out.println("Njëzetqindarka = " + (money / 20));
          money = money % 20;
          System.out.println("Dhjetëqindarka = " + (money / 10));
          money = money % 10;
          System.out.println("Pesëqindarka = " + (money / 5));
          money = money % 5;
          System.out.println("Qindarka = " + money);
        }
    }
}



                                                                                ¨         ¨
                                                    Struktura e kontrollit: Urdherat kushtezues – fq. 20
                                         Operatorët logjikë


import javax.swing.*;
/** Llogarit sasinë e metelikeve
 * Input: dy numra të dhënë në rreshtin komandues
 *          sasia e eurove dhe sasia e centëve
 * Output: sasitë e metelikëve */
public class MakeChange
{ public static void main (String[] args)
   { int euros = new Integer(args[0]).intValue();
     int cents = new Integer(args[1]).intValue();
     if ( (euros < 0) || (cents < 0) || (cents > 99) )
     { JOptionPane.showMessageDialog(null,
         "Gabim në hyrje " + euros + " " + cents); }




                                                                             ¨         ¨
                                                 Struktura e kontrollit: Urdherat kushtezues – fq. 21
                             Operatorët logjikë – Vazhdim


        else
        { int money = (euros * 100) + cents;
          System.out.println("Gjysma = " + (money / 50));
          money = money % 50;
          System.out.println("Njëzetqindarka = " + (money / 20));
          money = money % 20;
          System.out.println("Dhjetëqindarka = " + (money / 10));
          money = money % 10;
          System.out.println("Pesëqindarka = " + (money / 5));
          money = money % 5;
          System.out.println("Qindarka = " + money);
        }
    }
}




                                                                                ¨         ¨
                                                    Struktura e kontrollit: Urdherat kushtezues – fq. 22
                         Operatorët logjikë – Vazhdim


Operator logjik: operator i cili mundëson të shkruhen dy
krahasime në një shprehje të tipit boolean.
            Operatori     Semantika
                          Konjuksioni „dhe“:
                          true && true => true
            SH1 && SH2
                          true && false => false
                          false && SH2 => false
                          Disjunksioni „ose“:
                          false || false => false
            SH1 || SH2
                          false || true => true
                          true || SH2 => true
                          Negacioni „jo“:
            !SH           !true => false
                          !false => true

                    Tabela 1. Operatorët logjikë                               ¨         ¨
                                                   Struktura e kontrollit: Urdherat kushtezues – fq. 23
                     Operatorët logjikë – Vazhdim


Semantika e urdhërave logjikë:
(minutes >= 0) && (minutes < 60)
=> false && (minutes < 60)
=> false

(cents < 0) || (cents > 99)
=> true || (cents > 99)
=> true




                                                                ¨         ¨
                                    Struktura e kontrollit: Urdherat kushtezues – fq. 24
                       Operatorët logjikë – Vazhdim


Operatorët logjikë kanë precedencë më të ulët sesa
operatorët relacionalë; p.sh., në versionin e fundit të
aplikacionit MakeChange kemi mundur të shkruajmë
if ( euros < 0 || cents < 0 || cents > 99 )




                                                                         ¨         ¨
                                             Struktura e kontrollit: Urdherat kushtezues – fq. 25
                  Zbatimi i urdhërave kushtëzues


Dy zbatimet kryesore të urdhërave kushtëzues janë:
   për t’i mundësuar metodës të veprojë bazuar në vlera
   të dhënash dhe parametrash;
   për të paisur metodën për mbrojtje nga të dhëna dhe
   parametra aktualë të pakuptimë.




                                                                     ¨         ¨
                                         Struktura e kontrollit: Urdherat kushtezues – fq. 26
                   Zbatimi i urdhërave kushtëzues –
                                           Vazhdim

/** Konverton kohën 12 orëshe në 24 orëshe.
 * @param hour - koha 12 orëshe në orë
 * @param minute - koha në minuta
 * @param am - boolean: true për mëngjes, false për pasdite
 * @return koha 24 orëshe, e formatizuar si string
 */
public String twentyfourHourClock(int hour, int minute, boolean am)
{ String answer = "";
  if ( hour < 1 || hour > 12 || minute < 0 || minute > 59 )
  { answer = "Gabim: " + hour + ":" + minute; }




                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 27
                     Zbatimi i urdhërave kushtëzues –
                                             Vazhdim

    else { if ( hour == 12 )
           { if ( am )
             { answer = answer + "0"; }
             else { answer = answer + "12"; }
           }
           else { if ( am )
                   { answer = answer + hour; }
                   else { answer = answer + (hour + 12); }
                }
           answer = answer + ":";
           if ( minute < 10 )
           { answer = answer + "0"; }
           answer = answer + minute;
         }
    return answer;
}


                                                                               ¨         ¨
                                                   Struktura e kontrollit: Urdherat kushtezues – fq. 28
                 Ndryshimi i rrjedhës së kontrollit


Përjashtim (exception): gabim i cili ndodh gjatë ekzekutimit
të një programi. Zakonisht, përjashtimi ndalon programin
(themi se është hedhur një përjashtim).

Hedhja eksplicite e një përjashtimi mund të bëhet me anë
të strukturës kontrolluese:
throw new RuntimeException(MESAZHI);
ku MESAZHI është një string.




                                                                       ¨         ¨
                                           Struktura e kontrollit: Urdherat kushtezues – fq. 29
             Ndryshimi i rrjedhës së kontrollit –
                                       Vazhdim

/** hourToSecond konverton orët në sekonda
  * @param hours - orët
  * @return ekuvalenti në sekonda */
public int hourToSecond(int hours)
{ int seconds = 0;
   if ( hours < 0 )
   { String error = "Gabim: orët " + hours;
     JOptionPane.showMessageDialog(null, error);
     throw new RuntimeException(error);
   }
   else { seconds = hours * 60 * 60; }
   return seconds;
}

                                                                   ¨         ¨
                                       Struktura e kontrollit: Urdherat kushtezues – fq. 30
                 Ndryshimi i rrjedhës së kontrollit –
                                           Vazhdim


Urdhëri return shkakton që rrjedha e kontrollit të kthehet
menjëherë në vendin e invokimit të metodës.
public void printSeconds(int hours)
{ if ( hours < 0 )
  { return; }
  int seconds = hours * 60 * 60;
  System.out.println(horus + " orë janë " + seconds + " sekonda");
}

public int hourToSecond(int hours)
{ if ( hours < 0 )
  { return -1; }
  int seconds = hours * 60 * 60;
  return seconds;
}

                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 31
                                       Urdhëri switch


Në disa raste, urdhëri switch është një alternativë për
urdhërat if-else të vendosur përbrenda.
Sintaksa:
switch (SHPREHJA)
{ case VLERA1 : { URDHËRAT1;
                  break;
                }
  case VLERA2 : { URDHËRAT2;
                  break;
                }
  ...
  case VLERAn : { URDHËRATn;
                  break;
                }
  default : { URDHËRATn+1; }
}
                                                                      ¨         ¨
                                          Struktura e kontrollit: Urdherat kushtezues – fq. 32
                         Urdhëri switch – Vazhdim


Semantika:
1. Llogaritet SHPREHJA në vlerën e saj, të themi, v.
2. Në qoftë se ndonjë nga VLERAk është e barabartë
   me v, atëherë ekzekutohen urdhërat përkatëse
   URDHËRATk ; në qoftë se asnjë nga VLERAk nuk është
   e barabartë me v, atëherë ekzekutohen urdhërat
   URDHËRATn+1;




                                                                      ¨         ¨
                                          Struktura e kontrollit: Urdherat kushtezues – fq. 33
                             Urdhëri switch – Vazhdim

Shembull:
switch(ch)
{ case ’C’: case ’c’: { // Celsius
    // ...
    break;
  }
  case ’F’: case ’f’: { // Fahrenheit
    // ...
    break;
  }
  case ’K’: case ’k’: { // Kelvin
    // ...
    break;
  }
  default: { System.out.println("Gabim: TempConverter"); }
}

                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 34
                   Komponentet model dhe kontrollues


                                KONTROLLUESI


         INPUT VIEW                                      OUTPUT VIEW


                                    MODELI


                   Figura 3. Një arkitekturë e thjeshtë MVC
Komponenta model merr përgjegjësinë për „modelimin“ e problemit dhe „kompjutimin“ e
pergjegjjeve të tij.

Komponenta view merr përgjegjësinë për bartjen e të dhënave hyrëse dhe dalëse.

Komponenta kontrollues merr përgjegjësinë për rrjedhën e kontrollit të aplikacionit,
d.m.th. përcakton renditjen e kryerjes së kompjutimit.


                                                                                             ¨         ¨
                                                                 Struktura e kontrollit: Urdherat kushtezues – fq. 35
            Komponentet model dhe kontrollues
                                   – Vazhdim


Arsyet kryesore për zbatimin e MVC arkitekturës:
1. Klasët të cilat i gjenerojnë objektet mund të
   rishfrytëzohen.
2. Komponentet e organizojnë një aplikacion në pjesë
   madhësish të menagjueshme me detyra specifike.
   Pjesët janë të organizuara në një arkitekturë standarde
   dhe mund të shkruhen dhe testohen veç e veç.
3. Komponentet janë të izoluara, kështu që modifikimi i
   njërës pjesë nuk kërkon rishkrimin edhe të pjesëve
   tjera.



                                                                       ¨         ¨
                                           Struktura e kontrollit: Urdherat kushtezues – fq. 36
             Komponentet model dhe kontrollues
                                    – Vazhdim


Në një situatë ideale, ndërtimi i një aplikacioni do të
konsistonte nga
    zgjedhja e klasëve tanimë të shkruara, ndoshta paksa
    të zgjeruara, për gjenerimin e input-output-views;
    zgjedhja një klase tanimë të shkruar, ndoshta paksa të
    zgjeruar, për gjenerimin e modelit;
    shkruarja e një klase të re për gjenerimin e
    kontrolluesit i cili lidh së bashku pjesët e aplikacionit.




                                                                          ¨         ¨
                                              Struktura e kontrollit: Urdherat kushtezues – fq. 37
             Komponentet model dhe kontrollues
                                    – Vazhdim


Model: komponentë në aplikacion e cila „modelon“
problemin që programohet dhe llogarit përgjegjjet e tij.

Atribut: variabël fushe private përbrenda një klase modeli.
Fusha përmban informata mbi „gjendjen e brendshme“ të
modelit.




                                                                        ¨         ¨
                                            Struktura e kontrollit: Urdherat kushtezues – fq. 38
                    Case study: menagjer kontosh
                                        bankiere


Ndërtojmë një menagjer kontoje bankiere i cili për hyrjet,
p.sh.,
Komanda (D,T,M): d 50.50
Komanda (D,T,M): T 30.33
Komanda (D,T,M): M
afishon në dritare grafike raportet mbi transakcionet dhe
gjendjet e balancit.




                                                                        ¨         ¨
                                            Struktura e kontrollit: Urdherat kushtezues – fq. 39
                                            Disenjimi i modelit


BankAccount modelon një konto bankiere
Konstruktori:
BankAccount(int amount)                  inicializon konton
Metodat:
boolean deposit(int amount)              deponon sasinë e dhënë në konton;
                                         kthen true për sukses dhe false
                                         për mossukses
boolean withdraw(int amount)             tërheq sasinë e dhënë nga kontoja;
                                         kthen true për sukses dhe false
                                         për mossukses
int getBalance()                         kthen balansin e kontos

                Tabela 2. Interfejsi i klasës BankAccount


                                                                                   ¨         ¨
                                                       Struktura e kontrollit: Urdherat kushtezues – fq. 40
                        Disenjimi i modelit – Vazhdim


import javax.swing.*;
/** Modelon një konto. */
public class BankAccount
{ private int balance; // invariantë: balance >= 0
  /** Konstruktori.
   * @param amount - balansi inicial */
  public BankAccount(int amount)
  { if ( amount >= 0 )
    { balance = amount; }
    else { balance = 0; }
  }




                                                                           ¨         ¨
                                               Struktura e kontrollit: Urdherat kushtezues – fq. 41
                      Disenjimi i modelit – Vazhdim


/** Deponon të holla në konto.
 * @param amount - sasia për deponim
 * @return true nëse tërheqja e suksesshme, false përndryshe */
public boolean deposit(int amount)
{ boolean result = false;
  if ( amount < 0 )
  { JOptionPane.showMessageDialog(null,
      "Gabim: depositi " + amount);
  }
  else { balance = balance + amount;
         result = true;
       }
  return result;
}




                                                                         ¨         ¨
                                             Struktura e kontrollit: Urdherat kushtezues – fq. 42
                      Disenjimi i modelit – Vazhdim


/** Tërheq të holla nga kontoja.
 * @param amount - sasia për tërheqje
 * @return true nëse tërheqja e suksesshme, false përndryshe */
public boolean withdraw(int amount)
{ boolean result = false;
  if ( amount < 0 )
  { JOptionPane.showMessageDialog(null,
      "Gabim: tërheqja " + amount);
  }
  else if ( amount > balance )
       { JOptionPane.showMessageDialog(null,
           "Gabim: tërheqja tejkalon balansin");
       }
  else { balance = balance - amount;
           result = true;
       }
  return result;
}
                                                                         ¨         ¨
                                             Struktura e kontrollit: Urdherat kushtezues – fq. 43
                          Disenjimi i modelit – Vazhdim


    /** getBalance kthen balansin vijues
     * @return balansi */
    public int getBalance()
    { return balance; }
}




                                                                       ¨         ¨
                                           Struktura e kontrollit: Urdherat kushtezues – fq. 44
                     Disenjimi i modelit – Vazhdim


Metodë accessor: metodë e cila vetëm raporton vlera
fushash të objektit (atributesh) por nuk ndyshon asnjë
fushë.

Metodë mutator: metodë e cila ndyshon vlera fushash të
një objekti.




                                                                       ¨         ¨
                                           Struktura e kontrollit: Urdherat kushtezues – fq. 45
                 Arkitektura e softuerit të aplikacionit


AccountManager             AccountController
main(...)                processTransactions()



    BankReader
                                                 BankAccount
char readCommand()
                                        boolean deposit(int amount)
int readAmount()
                                        boolean withdraw(int amount)

            BankWriter                  int getBalance()

showTransaction(String message,
                 int amount)
showTransaction(String message)


              Figura 4. Arkitektura e AccountManager
                                                                              ¨         ¨
                                                  Struktura e kontrollit: Urdherat kushtezues – fq. 46
                                               View komponentet


BankReader lexon transakcionet nga shfry-
tëzuesi
Metodat:
char readCommand(String message)            lexon linjë të re komanduese; kthen
                                            karakterin e parë të linjës
int readAmount()                            kthen vlerën numerike nga linja e
                                            lexuar së fundi

              Tabela 3. Interfejsi i klasës BankReader




                                                                                     ¨         ¨
                                                         Struktura e kontrollit: Urdherat kushtezues – fq. 47
                           View komponentet – Vazhdim


BankWriter shkruan transakcionet
Konstruktori:
BankWriter(String title,                inicializon shkruesin me titullin dhe
BankAccount a)                          konton e dhënë
Metodat:
showTransaction(String message,         afishon transakcionin e dhënë me
int amount)                             vlerën e dhënë
showTransaction(String message)         afishon transakcionin e dhënë

                Tabela 4. Interfejsi i klasës BankWriter




                                                                                  ¨         ¨
                                                      Struktura e kontrollit: Urdherat kushtezues – fq. 48
                        View komponentet – Vazhdim


import javax.swing.*;
/** Lexon transakcione bankiere. */
public class BankReader
{ private String inputLine;
  /** Konstruktori. */
  public BankReader()
  { inputLine = ""; }
  /** Lexon linjë të re komanduese.
   * @param message - prompti për shfrytëzuesin
   * @return karakterin e parë të komandës */
  public char readCommand(String message)
  { inputLine
      = JOptionPane.showInputDialog(message).trim().toUpperCase();
    return inputLine.charAt(0);
  }



                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 49
                          View komponentet – Vazhdim


    /** Kthen vlerën numerike nga linja komanduese.
     * @return vlera e konvertuar në cent */
    public int readAmount()
    { int answer = 0;
      String s = inputLine.substring(1, inputLine.length());
      s = s.trim();
      if ( s.length() > 0)
      { double money = new Double(s).doubleValue();
        answer = (int)(money * 100);
      }
      else { JOptionPane.showMessageDialog(null,
               "Gabim: transakcion pa vlerë");
           }
      return answer;
    }
}


                                                                              ¨         ¨
                                                  Struktura e kontrollit: Urdherat kushtezues – fq. 50
                        View komponentet – Vazhdim


import javax.swing.*;
import java.awt.*;
import java.text.*;
/** Shkruan transakcione bankiere. */
public class BankWriter extends JPanel
{
  private int width = 300;
  private int height = 200;
  private BankAccount account;
  private String lastTransaction = "";




                                                                     ¨         ¨
                                         Struktura e kontrollit: Urdherat kushtezues – fq. 51
                      View komponentet – Vazhdim


/** Konstruktori.
 * @param title - titulli i dritares grafike
 * @param a - kontoja bankiere që afishohet */
public BankWriter(String title, BankAccount a)
{ account = a;
  JFrame f = new JFrame();
  f.getContentPane().add(this);
  f.setTitle(title);
  f.setSize(width, height);
  f.setBackground(Color.white);
  f.setVisible(true);
}




                                                                         ¨         ¨
                                             Struktura e kontrollit: Urdherat kushtezues – fq. 52
                      View komponentet – Vazhdim


public void paintComponent(Graphics g)
{ g.setColor(Color.white);
  g.fillRect(0, 0, width, height);
  g.setColor(Color.black);
  int textMargin = 50;
  int textBaseline = 50;
  g.drawString(lastTransaction, textMargin, textBaseline);
  g.drawString("Balanci vijues = "
      + unconvert(account.getBalance())
      + " E", textMargin, textBaseline + 20);
}
/** Reformaton centët në euro dhe cent. */
private String unconvert(int amount)
{ double money = amount / 100.0;
  return new DecimalFormat("0.00").format(money);
}


                                                                          ¨         ¨
                                              Struktura e kontrollit: Urdherat kushtezues – fq. 53
                          View komponentet – Vazhdim


    /** Afishon transakcion.
     * @param message - transakcioni
     * @param amount - sasia e transakcionit */
    public void showTransaction(String message, int amount)
    { lastTransaction = message + " " + unconvert(amount) + " E";
      this.repaint();
    }
    /** Afishon transakcion.
     * @param message - transakcioni */
    public void showTransaction(String message)
    { lastTransaction = message;
      this.repaint();
    }
}




                                                                              ¨         ¨
                                                  Struktura e kontrollit: Urdherat kushtezues – fq. 54
                            Konstruktimi i kontrollerit


Algoritmi i kontrollerit për procesimin e një transakcioni:
 1. Lexo komandën.
 2. Në qoftë se komanda është ’M’, atëherë përfundo
    procesimin.
 3. Përndryshe:
   (a) Në rast se komanda është ’D’, lexo sasinë e
       depositit, kryej depositin dhe afisho transakcionin.
   (b) Në rast se komanda është ’T’, lexo sasinë e
       tërheqjes, kryej tërheqjen dhe afisho transakcionin.
   (c) Përndryshe, komanda është jolegale, prandaj
       ankohu.

                                                                         ¨         ¨
                                             Struktura e kontrollit: Urdherat kushtezues – fq. 55
              Konstruktimi i kontrollerit – Vazhdim

/** Menagjon një konto.
 * Input: një varg komandash të formës
 *     D ee.cc (deponim), T ee.cc (tërheqje), M (mjaft)
 * Output: Afishon transakcione */
public class AccountController
{ private BankReader reader;
   private BankWriter writer;
   private BankAccount account;
   /** Konstruktori.
    * @param r - input view objekti
    * @param w - output view objekti
    * @param a - model objekti */
   public AccountController(BankReader r, BankWriter w,
                            BankAccount a)
   { reader = r;
     writer = w;
     account = a;
   }
                                                                             ¨         ¨
                                                 Struktura e kontrollit: Urdherat kushtezues – fq. 56
            Konstruktimi i kontrollerit – Vazhdim

/** Proceson transakcione. */
public void processTransactions()
{ char command =
    reader.readCommand("Komanda (D,T,M) dhe sasia:");
  if ( command == ’M’ )
  { }
  else
  { switch ( command )
    { case ’D’ :
       { int amount = reader.readAmount();
         boolean ok = account.deposit(amount);
         if ( ok )
         { writer.showTransaction("Deponim", amount); }
         else { writer.showTransaction("Deponim jovalid"); }
         break;
       }


                                                                          ¨         ¨
                                              Struktura e kontrollit: Urdherat kushtezues – fq. 57
                    Konstruktimi i kontrollerit – Vazhdim

              case ’T’ :
              { int amount = reader.readAmount();
                boolean ok = account.withdraw(amount);
                if ( ok )
                { writer.showTransaction("Tërheqje", amount); }
                else { writer.showTransaction("Tërheqje jovalide"); }
                break;
              }
              default :
              { writer.showTransaction("Komandë jovalide " + command); }
            }
            this.processTransactions();
        }
    }
}




                                                                                  ¨         ¨
                                                      Struktura e kontrollit: Urdherat kushtezues – fq. 58
              Konstruktimi i kontrollerit – Vazhdim

/** Starton aplikacionin për menagjim kontoje. */
public class AccountManager
{
  public static void main(String[] args)
  { BankReader reader = new BankReader();
    BankAccount account = new BankAccount(0);
    BankWriter writer =
      new BankWriter("Shkruesi bankier", account);
    AccountController controller =
      new AccountController(reader, writer, account);
    controller.processTransactions();
  }
}




                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 59
            Konstruktimi i kontrollerit – Vazhdim


Invokim rekursiv: invokim ku metoda dërgon mesazh për të
ristartuar vetvehten.

Emër i mbingarkuar metode (overloaded): emër metode i
cili përdoret për të emërtuar dy metoda të ndryshme të së
njëjtës klasë. Objekti pranues i mesazhit shfrytëzon sasinë
dhe tipin e të dhënave të parametrave aktualë për të
zgjedhur metodën përkatëse për ekzekutim.




                                                                       ¨         ¨
                                           Struktura e kontrollit: Urdherat kushtezues – fq. 60
                 Objekte të shumëfishta nga e njëjta
                                             klasë


Modifikojmë menagjerin e kontove ashtu që të menagjojë
dy konto të ndryshme në mënyrë simultane.

Hyrjet, p.sh.:
Komanda    (P,S,D,T,M):    P
Komanda    (P,S,D,T,M):    d 50.50
Komanda    (P,S,D,T,M):    s
Komanda    (P,S,D,T,M):    D10.10
Komanda    (P,S,D,T,M):    p
Komanda    (P,S,D,T,M):    T 30.33
Komanda    (P,S,D,T,M):    m



                                                                   ¨         ¨
                                       Struktura e kontrollit: Urdherat kushtezues – fq. 61
                   Objekte të shumëfishta nga e njëjta
                                    klasë – Vazhdim


AccountManager               AccountController
main(...)                processTransactions()
                                  1       1
                                                 2
    BankReader
                                                     BankAccount
char readCommand()
                                          boolean deposit(int amount)
int readAmount()
                         2                boolean withdraw(int amount)

            BankWriter                    int getBalance()

showTransaction(String message,
                 int amount)
showTransaction(String message)


              Figura 5. Arkitektura e AccountManager
                                                                                  ¨         ¨
                                                      Struktura e kontrollit: Urdherat kushtezues – fq. 62
                Objekte të shumëfishta nga e njëjta
                                 klasë – Vazhdim

/** Menagjon dy konto.
 * Input: një varg komandash të formës
 *     P (menagjo konton primare), S (menagjo konton sekondare)
 *     D ee.cc (deponim), T ee.cc (tërheqje), M (mjaft)
 * Output: Afishon transakcione */
public class AccountController2
{ private BankReader reader;
   // kontoja primare
   private BankWriter primaryWriter;
   private BankAccount primaryAccount;
   // kontoja sekondare
   private BankWriter secondaryWriter;
   private BankAccount secondaryAccount;
   // kontoja aktive
   private BankWriter writer;
   private BankAccount account;
   // invariantë: barazi me fushat të kontos primare ose sekondare

                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 63
              Objekte të shumëfishta nga e njëjta
                               klasë – Vazhdim

/** Konstruktori
 * @param r - input view objekti
 * @param w1 - output view objekti i parë
 * @param a1 - model objekti i parë
 * @param w2 - output view objekti i dytë
 * @param a2 - model objekti i dytë */
public AccountController2(BankReader r,
                          BankWriter w1, BankAccount a1,
                          BankWriter w2, BankAccount a2)
{ reader = r;
  primaryWriter = w1;
  primaryAccount = a1;
  secondaryWriter = w2;
  secondaryAccount = a2;
  writer = primaryWriter;
  account = primaryAccount;
}

                                                                          ¨         ¨
                                              Struktura e kontrollit: Urdherat kushtezues – fq. 64
              Objekte të shumëfishta nga e njëjta
                               klasë – Vazhdim

/** Ndryshon konton aktive. */
private void resetAccount(BankWriter w, BankAccount a)
{ writer.showTransaction("Joaktiv");
  writer = w;
  account = a;
  writer.showTransaction("Aktiv");
}




                                                                          ¨         ¨
                                              Struktura e kontrollit: Urdherat kushtezues – fq. 65
              Objekte të shumëfishta nga e njëjta
                               klasë – Vazhdim

/** Proceson transakcione. */
public void processTransactions()
{ char command
    = reader.readCommand("Komanda (P,S,D,T,M) dhe sasia:");
  if ( command == ’M’ )
  { }
  else
  { switch ( command )
    { case ’D’ :
       { int amount = reader.readAmount();
         boolean ok = account.deposit(amount);
         if ( ok )
         { writer.showTransaction("Deponim", amount); }
         else { writer.showTransaction("Deponim jovalid"); }
         break;
       }


                                                                          ¨         ¨
                                              Struktura e kontrollit: Urdherat kushtezues – fq. 66
        Objekte të shumëfishta nga e njëjta
                         klasë – Vazhdim

case ’T’ :
{ int amount = reader.readAmount();
  boolean ok = account.withdraw(amount);
  if ( ok )
  { writer.showTransaction("Tërheqje", amount); }
  else { writer.showTransaction("Tërheqje jovalide"); }
  break;
}




                                                                    ¨         ¨
                                        Struktura e kontrollit: Urdherat kushtezues – fq. 67
                      Objekte të shumëfishta nga e njëjta
                                       klasë – Vazhdim

              case ’P’ :
              { this.resetAccount(primaryWriter, primaryAccount);
                break;
              }
              case ’S’ :
              { this.resetAccount(secondaryWriter, secondaryAccount);
                break;
              }
              default :
              { writer.showTransaction("Komandë jovalide " + command); }
            }
            this.processTransactions();
        }
    }
}




                                                                                  ¨         ¨
                                                      Struktura e kontrollit: Urdherat kushtezues – fq. 68
                Objekte të shumëfishta nga e njëjta
                                 klasë – Vazhdim

/** Starton aplikacionin për menagjim kontosh. */
public class AccountManager2
{
  public static void main(String[] args)
  { BankReader reader = new BankReader();
    BankAccount primaryAccount = new BankAccount(0);
    BankWriter primaryWriter
      = new BankWriter("Kontoja primare", primaryAccount);
    BankAccount secondaryAccount = new BankAccount(0);
    BankWriter secondaryWriter
      = new BankWriter("Kontoja sekondare", secondaryAccount);
    AccountController2 controller
      = new AccountController2(reader, primaryWriter, primaryAccount,
            secondaryWriter, secondaryAccount);
    controller.processTransactions();
  }
}

                                                                            ¨         ¨
                                                Struktura e kontrollit: Urdherat kushtezues – fq. 69
                   Testimi i metodave dhe klasave


Secila metodë e secilës klasë testohet veç e veç.

Kur metoda përmban urdhëra if secili krah i secilit urdhër
ekzekutohet së paku nga një test.

Në qoftë se klasa përmban fusha, atëherë testohet secila
metodë e klasës në invariantat e paraqitjes së fushave.




                                                                      ¨         ¨
                                          Struktura e kontrollit: Urdherat kushtezues – fq. 70
                   Testimi i metodave dhe klasave –
                                           Vazhdim

public static void main(String[] args)
{ BankAccount a = new BankAccount(100);
  int i = new Integer(args[0]).intValue();
  boolean result = a.withdraw(i);
  System.out.println(result);
  System.out.println(a.getBalance());
}




                                                                         ¨         ¨
                                             Struktura e kontrollit: Urdherat kushtezues – fq. 71
                     Testimi i metodave dhe klasave –
                                             Vazhdim

public class BankAccount
{ private int balance; // invariantë: balance >= 0

    public BankAccount(int amount) { balance = 0; } // dummy

    public boolean deposit(int amount)
    { boolean result = false;
      if ( amount < 0 )
      { JOptionPane.showMessageDialog(null, "Gabim"); }
      else { balance = balance + amount;
             result = true;
           }
      return result;
    }

    public boolean withdraw(int amount) { return true; } // dummy
    public int getBalance() { return 0; } // dummy
}
                                                                              ¨         ¨
                                                  Struktura e kontrollit: Urdherat kushtezues – fq. 72

				
DOCUMENT INFO
Shared By:
Stats:
views:393
posted:11/10/2012
language:
pages:270