You are on page 1of 3

Algoritmikë dhe Programim i Avancuar Seminar 5

1. Krijoni nje klase Autor e cila permban:


a. Tre te dhena private: emri(string), email (string) dhe gjinine (char ‘m’, ‘f’, ose ‘p’ ne rastin kur
eshte e papercaktuar.
b. Nje konstruktor per te inicializuar emrin, email dhe gjinine ne nje vlere te dhene.
c. Funksione per afishimin e emrin, email dhe gjinise.
d. Nje funksion per validimin e email nese pozicioni i @ nuk eshte ne fillim dhe ne fund te email.
e. Nje funksion print qe printon te dhenat ne formatin “emri (gjinia) dhe email”
Kjijoni programin per testimin e klases qe krijuat.

Autor
- emri:string
- emai:string
- gjinia:char
 Autor(emir: string, email: string, gjinia: char)
 afishoEmrin():string
 afishoEmail():string
 validoEmail(emai:stringl):void
 afishoGjinine():char
 print():void

2. Krijoni nje klase Libri. Supozojme se nje liber eshte shkruar nga vetem nje autor. Klasa Libri
permban:
a. Kater te dhena private emri(string), autor (nje instance e klases autor qe krijuam ne ushtrimin e
pare), cmimi (double), sasiaStok (int me vlere defaul 0). Cmimi dhe sasia ne stok duhet te jene
vlera pozitive ose 0.
Duhet te keni parasysh qe e dhena autro eshte nje instance (objekt) i klases Autor dhe jo nje e
dhene e tipit int ose double.
b. Funksionet per afishimin e te dhenave private emrin, cmimin sasine ne stok.
c. Nje funksion Autor afishoAutor() qe kthen nje object (instance) te klases Autor
d. Nje funksion qe lexon cmimin i cili nese futet nje vlere negativ e ve ate ne vleren 0.
e. Nje funksion qe lexon sasine ne stok i cili nese futet nje vlere negativ e ve ate ne vleren 0.
f. Nje funksion string afishoEmrinAutorit qe kthen emrin e autorit per instanven e ketij Libri.
Kjijoni programin per testimin e klases qe krijuat.

Liber
 emer:string
 autor:Autor
 cmimi:double
 sasiaStok:int=0
 Liber(emri:stringi, autor:Autor, cmimi:double, sasiaStok:int);
 afishoEmrin():string
 afishoAutor():Autor
 afishoCmimin():double
 lexoCmimin(cmimi:double):void
 afishoSasiaStok():int
 lexoSasiaStok(qtyInStock:int):void
 print():void
 afishoEmrinAutorit():string

1
Algoritmikë dhe Programim i Avancuar Seminar 5
- Duhet te perfshijme file “Autor.h” ne klasen Liber duke qene se ne e perdorim klasen Autor ne
klasen Liber.
- Nepermjet instruksionit Autor autor; kemi deklaruar nje te dhene private autor si instance e klases
Autor.
- Konstruktori
Liber::Liber(string emri, Autor autor, double cmimi, int sasiaStok)
: emri(emri), autor(autor) { // perdoret inicializimi i pjestareve per te ndertuar objektin
// therrasim dy funksionet per te validuar cmimn dhe sasine
lexoCmimin(cmimi);
lexoSasiaStok(sasiaStok);}
Ne konstruktor, thirrja e tij krijon nje instance te Autor dhe e kalon instancen e krijuar ne
konstruktor. Kemi perdorur nje liste inicializuese per te inicializuar te dhenat autor dhe emri. Ne
trupin e tij therrasim dy funksionet per verifikimin e cmimit dhe sasise ne stok. Trupi ekzekutohet
pasi eshte inicializuar lista. Autor(autor) therret konstruktorin e kopjes se klases Autor i cili krijon
nje anetar kopje per te gjitha te dhenat e saj. Objektet e te dhenave do te krijohen nepermjet listes
se inicializimi dhe jo ne trupin e tij. Ne te kundert konstruktori defaul do te therritet per ndertimin
e objektit
- Funksioni afishoEmrinAutorit() therret funksionin afishoEmrin() te klases Autor, qe kthen emrin
e autorit per kete instance Liber
string Liber::afishoEmrinAutorit() const {
return autor.afishoEmrin(); // therritet funksioni lexoEmrin() ne instancet autor }

Konstruktori default i kopjes


Inicialimizimi i autor(autor) ne konstruktor therret te ashtequajturin kostruktorin e kopjes. Nje kopje e
konstruktorit krijon nje instance te re duke kopjuar instancen e dhene te se njejtes klase. Nese nuk do te
kemi nje konstruktor te kopjes ne klase, C++ do te percaktoj nje konstruktor te kopjes default I cili do te
krijoj objektin e ri nemerjet nje pjesetari kopje. Per shembull per klasen Autor konstruktori i kopjes
default i percaktuar nga kompilatori do te ishte si me poshte:
//Konstruktori i kopjes default i percaktuar per klasen Autor nga C++
Autor::Autor(const Autor& tjeter)
: emri(tjeter.emri), email(tjeter.email), gjinia(tjeter.gjinia) { } // kopja e anetarit

3. Te realizohet ushtrimi i dyte duke perdorin kalimin me refernce parametrat Autor dhe string.

Ne menyre default objektet kalohen ne nje funksion nepermjet vleres. Dmth nje kopje klon krijohet dhe
kalohet ne funksion ne vend te nje kopje origjinale. Kalimi me vlere per objekte te medhaja sjell renie te
performances si pasoj e overhead per krijimin e nje kopje klon.

Ne vend te kesaj ne mund te kalojme nje objekt me reference ne nje funksion duke vendosur referencen
(&) ne deklarimin e listes se parametrave. Nese nuk duam te modifikojme objektin brenda funksionit (qe
jep efekte anesore tek kopja origjinale) e vendosim ate si const.

Ne klasen Liber te dhenat string dhe Autor jane objekte. Klasa Autor eshte percaktuar me pare; mstring
eshte nje klae ne C++ e percaktuar nga header <string> qe i perket namespace std. Ne vend qe te
perfshijme "using namespace std;" ne header ne duhet te perdorim operatorin e scope resolution dhe ti
referohemi si str::string.
- Ne C++ string eshte nje klase e librarise standarte <string> qe i perket namespace std si klasat e
tjera qe mund te kemi percaktuar.

2
Algoritmikë dhe Programim i Avancuar Seminar 5
- Ne vend teperdorimit te “using namespace std;", qe eshte nje praktike e padobishme duke qene se
kjo do te perfshihet ne cdo file qe perdor kete header ne mund te perdorim std::string.
- Ne vend qe ta kalojme nje objekt string me vlere e kalojme ate me reference
- Ne kalimin me reference ndryshimet brenda funksionit do te afektojne kopjen e thirrur jashte
funksionit
- Nese nuk duam te ndryshojme objektin brenda funksionit, mund te perdorimi const per te treguar
kete pandryshueshmeri . nese objekti ndryshohet pa dashje kompilatori do te japi nje gabim

- Autor::Autor(const string & emri, const string & email, char gjinia) { ...... }
Ne konstruktor string ate objektet kalohen me reference. Kjo permireson performances perderisa
eleminon nevojen per te krijuar nje objekt temporal, klon. Konstruktori me pas therret
konstruktorin e kopjes te klases string per te bere anetar argumentat e kopjuar ne te dhena
pjesetare emiri dhe email. I kemi vendosur parametrat konstante per te paraprire cdo ndryshim
brenda funksionit.
- Liber(const string & emri, const Autor & autor, double cmimi, int sasiaStok = 0);
Objektet string dhe Autor kalohen ne konstruktor me reference. Kjo permireson performance duke
eleminuar krijimin e nje kopje klon si tek kalimi me vlere. I kemi vendosur parametrat konstante
per te paraprire cdo ndryshim brenda funksionit.
- Autor afishoAutor () const;
Fuksioni kthen nje kopje te te dhenave te autorit
- Liber :: Liber(const string & emri, Autor & autor, double cmimi, int sasiaStok)
: emri(emri), autor(autor) { ...... }
emri(emri) dhe autor(autor) therrasin konstruktorin default te kopjes per te ndertuar instancen e re
te stringave dhe Autor duke memberwise copy the parameters.
- Autor Liber::afishoAutor() { return autor; }
Nje kopje e te dhenave te autor kthene pas thirrjes se funksionit. You should avoid returning a
reference of a private data member to the caller (e.g., Author & Book::getAuthro() { return
author; }), as the caller can change the private data member via the reference, which breaks the
concept of "information hiding and encapsulation".

- Ne file TestoLiber.cpp nje instance e Autorit te quajtur ana ndertohet ne rreshtin 8. Kjo instance
kalohet me reference ne konstruktorin e Libri ne rreshtin 12 per te krijuar instance algoritmike te
Libri-t.
- I gjithe kodi ne te dyja rastet eshte njelloj pervec faktit qe objektet si parametra te funksionit jane
percaktuat si "const classname &" . Kjo eleminon krijimi e nje objekti klon temporar si ne rastin e
kalimit me vlere dhe rrit performancen. Konstruktori therret konstruktori e kopjes per te kopjuar
te te dhenave ne vend qe ti referohet kopjese qe sigurohet nga thirrja.

You might also like