Download as pdf or txt
Download as pdf or txt
You are on page 1of 270

Programimi dhe algoritmet

Faton M. Berisha
fberisha@uni-pr.edu

Universiteti i Prishtinës
Fakulteti i Shkencave Matematike–natyrore

Kompjuterët dhe programimi – fq. 1


Kompjuterët dhe programimi

Kompjuterët 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.

Kompjuterët 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ë.

Kompjuterët 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.
Kompjuterët 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.

Kompjuterët 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.

Kompjuterët 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.

Kompjuterët 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


Kompjuterët 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.

Kompjuterët 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.

Kompjuterët 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.

Kompjuterët 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. Kompjuterët 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.
Kompjuterët 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.

Kompjuterët 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

Kompjuterët dhe programimi – fq. 16


Java aplikacione të thjeshta

Java aplikacione të 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 të 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 të thjeshta – fq. 3


Aplikacioni dhe arkitektura e tij –
Vazhdim

Hello
main

System.out
println

Figura 1. Arkitektura e programit fillestar

Java aplikacione të 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 të 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 të 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 të 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 të 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 të 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 të 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 të 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 të 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 të thjeshta – fq. 13


Si një objekt konstrukton një tjetër

NameAndDate GregorianCalendar
main getTime

System.out
println
print

Figura 2. Aplikacioni NameAndDate

Java aplikacione të 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 të 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 të 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 të 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 të 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 të 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 të 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 të 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 të 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 të 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 të 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 të 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi i metodave dhe klasave – fq. 11


Metodat konstruktorë – Vazhdim

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

Struktura e komponenteve: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi 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: Ndërtimi i metodave dhe klasave – fq. 58


Struktura e kontrollit: Urdhërat kushtëzues

Struktura e kontrollit: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – fq. 43
Disenjimi i modelit – Vazhdim

/** getBalance kthen balansin vijues


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

Struktura e kontrollit: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – 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: Urdhërat kushtëzues – fq. 72

You might also like