Krahasimet e të dhënave, degëzimet dhe operatorët logjik
1. () [] left to right
3. * / % left to right
4. + - left to right
5. > >= < <= left to right
6. == != left to right
7. = right to left
Kur krahasojmë të dhënat duke përdorur shprehje “boolean”, është e rëndësishme të kuptohen nuancat e disa llojeve të veçanta të të dhënave
T’i shqyrtojmë disa situata të rëndësishme:
Krahasimi i vlerave me presje dhjetore për barazi (operatorët relacional)
Krahasimi i simboleve (ang. Character)
Krahasimi i stringjeve (sipas radhitjes alfabetike)
Kur kemi të bëjmë me krahasimin e dy vlerave me presje dhjetore, operatori i barazimit (==) duhet të përdoret me mjaft kujdes dhe nëse mund të evitohet atëherë duhet të evitohet
Dy vlera me presje dhjetore janë të barabarta vetëm nëse reprezentimi binar i tyre plotësisht përshtatet
Llogaritjet shpesh rezultojnë në diferenca të vogla që mund të jenë të parëndësishme
Në shumë raste, dy numra me presje dhjetore mund të konsiderohen se janë “mjaft të përafërta” edhe pse nuk janë plotësisht të barabarta
Në mënyrë që të vërtetohet nëse dy vlera me presje dhjetore janë të “përafërsisht të barabartë”, mund të përdorim teknikën si më poshtë:
Math.abs (f1 - f2) < TOLERANCA Nëse vlera absolute e diferencës në mes të dy
vlerave me presje dhjetore është më e vogël se TOLERANCA (vlera e lejuar), ato konsiderohen të jenë të barabarta
Toleranca mund të vihet në një nivel të duhur, si p.sh. 0.000001
Sikur që kemi diskutuar edhe më parë, simbolet në Java janë të bazuar në bashkësinë Unicode të simboleve (16 bit)
Sipas bashkësisë Unicode të simboleve, çdo simboli i përcaktohet një numër i veçantë dhe kështu krijohet një radhitje e simboleve
Ne mund të përdorim operatorët relacional për krahasimin e simboleve duke u bazuar në këtë radhitje
Për shembull, simboli ‘A’ ka vlerë më të vogël se simboli ‘J’ sepse radhitet para saj në bashkësinë Unicode të simboleve.
Më shumë informata për Unicode mund të gjeni në: http://unicode.org/
Në bashkësinë Unicode të simboleve, simbolet numerike (‘0’- ‘9’) janë fqinjësore dhe radhiten sipas vlerës së tyre numerike
Në të njëjtën mënyrë, shkronjat e mëdha (ang. uppercase) (A-Z) dhe shkronjat e vogla (ang. lowercase) (a-z) janë fqinjësore dhe radhiten sipas radhitjes alfabetike
Prandaj, nëse dëshirojmë të mbështesim një vendim në programin tonë të bazuar në faktin se a është një simbol numerik apo jo, mund të përdorim kodin siç vijon:
character >= ‘0’ dhe character <= ‘9’
Gjithashtu mund të vërtetojmë nëse një simbol është shkronjë e madhe apo jo:
character >= ‘A’ dhe character <= ‘Z’
Do të mësojmë më vonë si të aplikojmë operacionin dhe në Java
Mos harroni se në Java një String është objekt e jo e dhënë e thjeshtë (ang. simple datatype)
Operatori (==) nuk mund të përdoret që të krahasohen vlerat e dy stringjeve nëse janë të barabartë apo jo.
Në vend të operatorit == duhet të përdoret metoda equals që të determinohet nëse dy stringje përmbajnë saktësisht të njëjtat simbole me radhitje të njëjtë
Dhe rezultati i metodës equals është një ‘boolean’
emri1.equals (emri2)
Operatorët relacional nuk mund të përdoren për krahasimin e stringjeve
Për këtë qëllim klasa String përmban metodën compareTo që përdoret të determinohet nëse një String vjen para një tjetri
Nëse thirret emri1.compareTo (emri2) ◦ kthen zero nëse emri1 dhe emri2 janë të barabartë
(përmbajnë simbolet e njëjta)
◦ kthen vlerë negative nëse emri1 është më i vogël se emri2
◦ kthen vlerë pozitive nëse emri1 është më i madh se emri2
Renditja leksikografike nuk është absolutisht alfabetike kur kemi përzierje të simboleve (shkronjave) të mëdha dhe të vogla
Për shembull, stringu “I madh” vjen para stringut “fantastik” sepse shkronjat e mëdha në bashkësinë Unicode të simboleve kanë vlerë më të vogël se shkronjat e vogla. Kështu që, ‘I’ është më i vogël se ‘f’
Gjithashtu, stringjet më të shkurtra (me më pak simbole) vijnë para stringjeve më të gjata edhe pse e kanë të njëjtën parashtesë (bazuar në alfabet)
Kështu që “madh” vjen para “madhështor” String ka funskionet equalsIgnoreCase dhe compareToIgnoreCase
Një njësi e vetme ekzekutuese e kodit shkruhet me simbolin ; në fund
Specifying the order in which statements (actions) execute in a program is called program control
Procesi i kontrollimit të rrjedhjes dhe degëzimit të programit mbështetet në gjendjen aktuale të programit
Llojet e komandave kontrolluese: ◦ Komandat sekuenciale: Sequential Statements ◦ Komandat për degëzim të kushtëzuar të programit:
Selection/Decision Statements ◦ Komandat për përsëritje të programit (unazat apo ciklet):
Repetition/Iteration/Looping Statements ◦ Komandat për kërcim
Ezkekutohen një nga një në renditjen që janë shkruar.
Komanda1;
Komanda2;
Komanda3;
...
if, if/else – degëzimi i programit në njërën nga dy rrugëtimet e ndryshme (zgjedhja në mes të dy mundësive të ndryshme)
if/else if/else–degëzimi i programit në njërën nga më shumë rrugëtimet e ndryshme (zgjedhja në mes të më shumë mundësive të ndryshme)
switch – Mundëson degëzimin e programit në më shumë drejtime
Sintaksa:
if(shprehja_logjike)
Komanda_1;
Ose
if(shprehja_logjike)Komanda_1;
if (piket >= 50) System.out.println(" Filan Fisteku kaloi
provimin!“);
Sintaksa: if(shprehja_logjike) Komanda_1; else Komanda_1; Ose if(shprehja_logjike) { Komanda_1; … Komanda_n; } else { Komanda_1; … Komanda_n; }
if(piket >= 50)
System.out.println(" Filan Fisteku kaloi provimin!“);
else
System.out.println(" Filan Fisteku nuk kaloi provimin!“);
Zero apo më shumë instruksione në mes të simboleve { dhe }
Përmes krijimit të bllokut të instruksioneve, mundësohet përdorimi i komandave si tërësi në çdo rast që do të mund të ishte e nevojshme
P.sh. Në strukturën degëzuese if dhe unazën for
if(x<y) { //fillimi i bllokut x=y; y=0; } // fundi i bllokut
Hapësira e vlefshmërisë së variablës
Rregulla bazë:
Varablat të cilat deklarohen në brendësi të ndonjë blloku nuk janë “të dukshme” në blloqet tjera të programit
public class VlefshmeriaEVariablave { public static void main(String[] args) { int x; // Kjo variabel eshte e dukshme per tere programin
x = 1; if(x == 1) { // Fillimi i një blloku te ri te programit
int y = 2; // Deklarimi i variablesse re, e cila
// do te jete e dukshme vetëm ne kete bllok
System.out.println("x: " + x+ " y: " + y); x = y * 10; } // Fundi i bllokut te ri te programit
y = 5; // Gabim , sepse y nuk vlen ne ketë pozite! // Por x ende vlene, andaj mund ta shkruajmë:
System.out.println("x: " + x); } }
if (studentGrade >= 90) System.out.println("A"); else if (studentGrade >= 80) System.out.println("B"); else if (studentGrade >= 70) System.out.println("C"); else if (studentGrade >= 60) System.out.println("D"); else System.out.println("F");
int i=5, j=10, k=20, a=0, b=0, c=2, d=3; if (i== 10) a=d; else { if (j<20) a=b; if (k>100) c=d; else a=c; } System.out.println("a="+a+", b="+b+", c="+c+",
d="+d);
int piket= 20; boolean vijueshmeria= true;
System.out.println(“A e plotëson kushtin per marrje të nënshkrimit Filan Fisteku");
System.out.println(“Numri i pikëve nga kolokviumi dhe projekti= " + piket); if(piket >= 25) if(vijueshmeria) { System.out.println(“Ka ardhe vazhdimisht në ushtrime"); System.out.println(“Ka plotësuar të dy kushtet për të marrë nënshkrimin"); } else{ System.out.print(“Ka pikë të mjaftueshme por nuk ka ardhë me rregull në ushtrime, andaj nuk e plotëson kushtin për
marrje të nënëshkrimit” ); } else{ System.out.print(“Nuk ka pikë të mjaftueshëm, andaj nuk e marrim
fare për bazë vijueshmërinë"); }
Për të testuar më shumë se një kusht brenda if ose else if përdorim operator logjik.
Conditional AND (&&) Operator
Conditional OR (||) Operator
Boolean Logical Exclusive OR (^)
Logical Negation (!) Operator
if (gender == ‘F’ && age >= 65)
System.out.println(“Senior Female”);
Nëse gender nuk është ‘F’ shprehja e dytë nuk kalkuloet.
if (semesterAverage >= 90) || (finalExam >= 90)
System.out.println ("Student grade is A");
if (! (grade == sentinelValue))
System.out.printf("The next grade is %d%n", grade);
if (grade != sentinelValue)
System.out.printf("The next grade is %d%n", grade);
Operators Associativity Type
! (type) Right to left Unary prefix
< <= > >= Left to right relational
== != Left to right equality
^ Left to right boolean logical exclusive OR (XOR)
&& Left to right conditional AND
|| Left to right conditional OR
= += -= *= /= %= Right to left assignment
double y=32.567, x=15.123; if(y>0 && x>0) System.out.println("Pika (" + y +"," +x +") gjendet
ne kuadrantin I"); else if(y>0 && x<0) System.out.println("Pika (" + y +"," +x +") gjendet
ne kuadrantin II"); else if(y<0 && x<0) System.out.println("Pika (" + y +"," +x +") gjendet
ne kuadrantin III"); else System.out.println("Pika (" + y +"," +x +") gjendet
ne kuadrantin IV");
Int piket = 90;
if(piket<50)
System.out.println("Suksesi i pamjaftueshem(1)");
else if(piket>=50 && piket<=59)
System.out.println("Suksesi i mjaftueshem(2)");
else if(piket>=60 && piket<=76)
System.out.println("Suksesi i mire (3)");
else if(piket>=77 && piket<=89)
System.out.println("Suksesi i shume i mire (4)");
else
System.out.println("Suksesi i shkelqyeshem(5)");
Strategjia e pare
krahasoni secilin me të gjithë
int x1=13,x2 = 9,x3=3;
int max;
if((x1 >= x2) && (x2>=x3)) max = x1;
else if ((x2 >= x1) && (x2>=x3)) max = x2;
else max = x3;
System.out.println(max);
Strategjia e dyte
pema e vendimit (decision tree)
Strategjia e dyte pema e vendimit (decision tree)
int x1=13,x2 = 19,x3=3; int max; if (x1>=x2) { if (x1>x3) max = x1; else max = x3; } else { if (x2>x3) max = x2; else max = x3; } System.out.println(max);
Strategjia e trete
Perpunimi sekuncial (sequential processing)
int x1=13,x2 = 19,x3=3;
int max = x1;
if (x2 >= max) max=x2;
if (x3 >= max) max=x3;
System.out.println(max);
Sintaksa:
shprehja1 ? shprehja2 : shprehja3
Shprehja1 mund të jetë çfarëdo lloj shprehje e cila për rezultat kthen një vlerë të llojit boolean
Nëse shprehja1 ka vlerën true atëherë llogaritet shprehja2, përndryshe llogaritet shprehja3
classTernar{ public static void main(String [] args){ int i, k; i=10; k= i<0 ? –i : i; System.out.print(“Vlera apsolute e“); System.out.println(i + “ eshte“ + k); i=-10; k= i<0 ? –i : i; System.out.print(“Vlera apsolute e“); System.out.println(i + “ eshte“ + k); } }
Deklarata switch vlerëson/teston një shprehje (vetëm byte,int, char ose String) dhe pastaj provon t’a përputh rezultatin me një nga rastet e mundshme
Çdo rast (ang. case) përmban një vlerë dhe një listë të deklaratave
Rrjedhshmëria e kontrollit transferohet te blloku i deklaratave të cilat përshtaten me vlerën e parë me të cilin përputhet
Shpesh deklarata “break” përdoret si deklarata e fundit në një bllok të deklaratave
Deklarata break transferon kontrollin në fund të deklaratës switch
Në rast të mospërdorimit të deklaratës break, rrjedhshmëria e kontrollit do të vazhdoj në rastin (ang. case) tjetër
Ndonjëherë kjo mund të jetë e përshtatshme, mirëpo shumë më shpesh ne vetëm dëshirojmë të ekzekutojmë deklaratat e shoqëruara me një rast (ang. case) të vetëm
switch (opsioni) {
case ‘A’ :
aCount++ ;
break ;
case ‘B’ :
bCount++ ;
break ;
}
Deklarata switch mund të ketë një rast (ang. case) opsional si vlerë automatike “default”, nëse asnjë rast tjetër nuk e plotëson kushtin
Rasti i nënkuptuar (ang. default case) nuk ka vlerë krahasuese por thjesht vetëm përdor fjalën e rezervuar default
Nëse kemi rast të nënkuptuar (ang. default case) dhe asnjë vlerë tjetër nuk e plotëson kushtin, kontrolli i kodit transferohet në listën e deklaratave të përfshira në rastin e nënkuptuar (ang. default case)
Në rast se nuk e kemi rastin e nënkuptuar (ang. defaul case) dhe asnjë vlerë tjetër nuk e plotëson kushtin, kontrolli bartet në deklaratën pas switch-it pa e ekzekutuar asnjë deklaratë brenda switch-it
switch (opsioni) { case ‘A’ : aCount++ ; break ; case ‘B’ : bCount++ ; break ; default: errorCount++; }
Java How to Program ◦ Chapter 2;
2.8 Decision Making: Equality and Relational Operators
◦ Chapter 4:
4.4 Control Structures
4.5 if Single-Selection Statement
4.6 if…else Double-Selection Statement
◦ Chapter 5:
5.6 Switch Multiple-Selection Statement
5.9 Logical Operators