algoritme dhe struktura te dhenash

91
Algoritme dhe struktura te dhenash ne C++ J. Litsa , Gjirokaster 2006 1 Algoritme dhe struktura te dhenash

Upload: saidj-dulevic

Post on 11-Sep-2015

197 views

Category:

Documents


19 download

DESCRIPTION

Permbledhje ne strukture te dhenash

TRANSCRIPT

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 1

    Algoritme dhe struktura te dhenash

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 2

    Permbajtja

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 3

    1 Njohuri nga gjuha C++ Gjuha C++ hyn ne familjen e gjuheve te zhvilluara. Me ndihmen e saj mund te krijojme projekte qe perdorin objekte te llojeve nga me te ndryshme, mund te perdorim me lehtesi metodat rekurente etj. Gjate ketij kursi do te jepen njohurite baze dhe do te perdoret per kete qellim versioni C++ qe ndodhet ne Visual Studio 6. Me poshte do te sqarojme se si do te pedorim ambientin e kesaj gjuhe.

    1.1 Visual Studio Visual studio eshte nje pakete programesh nga Microsoft qe nder te tjera permban edhe gjuhen Visual C++, e cila per veten e saj nen emrin console application perfshin gjuhen C++. Per kete qellim eshte kjo gjuhe se mund te gjendet lehte ndryshimet me gjuhen C ne llogjiken e perpunimit te objekteve pothuajse nuk egzistojne dhe nderkohe kemi te njejten pakete qe do perdoret dhe ne vazhdim per lendet e tjera.

    1.1.1 Krijimi dhe perpunimi i nje projekti Para se te fillojme te krijojme nje project duhet te kemi percaktuar nje katalog brenda te cilit do ta vendosim. Kete katalog mund ta krijojme me Windows Explorer ose me ndonje menyre tjeter dhe supozojme qe eshte C:\MI2005\TAKU\LAB1. Duke qene ne desktop zgjedhim Start -> Programs -> Microsoft Visual Studio 6 -> Microsoft Visual C++ 6 dhe ne vazhdim per te krijuar nje aplikim ne C++ zgjedhim File -> New dhe na del pamja si me poshte.

    Fig. 1

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 4

    Nga forma me emrin New duhet te zgjedhim Win32 Console Application, te plotesojme emrin e projektit tek Project Name, te plotesojme ose te zgjedhim katalogun ku do te vendoset projekti tek Location dhe ne vazhdim te zgjedhim butonin OK. Tek Wizard qe na del ne vazhdim zgjedhim An Empty Project dhe bejme klik tek Finish. Deri tani eshte krijuar nje project bosh dhe ne ne vazhdim duhet te shtojme objektet e tjera dhe konkretishte na duhet se ku do te shtojme kodin e programit tone. Per kete zgjedhim File -> New, nga forma New zgjedhim C++ Source File dhe plotesojme

    tek File Name emrin e skedarit ku do te rezervohet kodi i programit. Sa per prove shkruajme programin e meposhtem i cili gjen shumen e dy numrave. #include//pjesakryesoreeprogramitvoidmain(void){ inta; intb,c;//deklarimiivariablavebdhec a=2; b=4; c=a+b;cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 5

    Me Build -> Start Debug -> Go kompilohet dhe nderkohe na krijohet mundesia te kontrollojme per gabime. Me Build -> ! Execute test.exe egzekutohet ky program . Per te perpunuar nje project pasi kemi hapur Microsoft Visual C++ zgjedhim File -> Open dhe gjejme katalogun ku ndodhet projekti.

    1.2 Struktura e nje programi Pa ditur pak me perpara kemi shkruajtur nje program qe ne vazhdim do mundohemi te sqarojme veprimet me radhe.

    1.2.1 Cfare eshte C++? C++ eshte nje gjuhe programimi e bazuar ne gjuhen C. Kjo na ben nje gjuhe standarte per te shkruar programe te nivelit te ulet sic jane sistemet operative. Ne vitet 70 80 asnje nuk konsiderohej programues serioz ne qofte se nuk munde te shkruante programe ne C. Per ata qe nisen nga gjuha Pascal eshte nje gjuhe e veshtire ndersa per ata qe nisen nga C ose C++ nuk i hedhin syte fare nga Paskali.

    1.2.2 Cfare nevojitet per C++? Do tju duhet nje program qe quhet C++ Compiler. Zakonishte ju shkruani programet e C++ ne skedare tekst. Kompiluesi e merr kete skedar dhe e perkthen ne nje varg komandash te mikroprocesorit qe kompjuteri mund ti egzekutoje. Skedari i krijuar nuk eshte i lexueshem ne ekran po te mundohemi ta shohim do te duken bubureca por kompjuteri di ti egzekutoje ato. Para se ti perktheje kompiluesi kontrollon per ndojne gabim. Ne qofte se ka fjale celes (keywords) te shkruajtura keq ose instruksione ai ndalon dhe na lajmeron me mesazhe dhe na rikthen tek editor i tij perndryshe programi eshte gati per tu egzekutuar.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 6

    Kompiluesit e kesaj gjuhe si edhe te C ne fillim ishin skedare me vete tani jane te perfeksionuar dhe ato te gjitha tani jane ne nje ambient te perbashket.

    1.2.3 Si punon nje program Cdo program permban pjesen kryesore te tij proceduren main() dhe librarite e ndryshme qe duhet te perdoren gjate programit psh #include. Tek procedura kryesore jane deklaruar tre variabla int a; ne vazhdim u eshte dhene vlere a=2; eshte gjetur shuma s=a+b; dhe se fundi nxirret rezultati me cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 7

    instruksioni cout dmth do te dalin ne ekran. Ndersa endl tregon qe duhet te kalojme ne rreshte tjeter.

    Ne fund te cdo instruksioni ju duhet te vendosni ;. Kjo do te sqarohet dhe ne vazhdim.

    1.2.4 Kodi i shkruar i nje programi C++ eshte mjafte tolerante per menyren se si ju shkruani nje program. E gjitha cfare i nevojitet C++ eshte simbole te duhura ne renditjen e duhur. Nuk ka rendesi kur do te perfundoje nje rreshte dhe sa vende bosh do te vendosen. Ju mund te hiqni te gjitha vendet bosh midis fjaleve celes ne qofte se doni dhe gjithe programin ta vendosni ne nje rresht. // Ky eshte nje program ne C++ #includevoid main(){cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 8

    cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 9

    long c; (232 232-1) 4 byte double b, c; 1.7*10-308 1.7*10308 bool rezultati; true, false char germe = A; Me siper jane disa tipe me te perdorshme variablash. Mund te percaktojme tipet tona si me poshte typedef int iplote; typedef double real; Dhe ne vazhdim mund te perdorim kete percaktim iplote n; real x;

    1.3.2 Hyrje / Dalje Jane dy instruksione kryesore qe perdoren cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 10

    1.3.3 Zona e veprimit te variablave Ka rendesi te madhe te kuptojme deri ku e kane zonen e veprimit variabla te ndryshem te deklaruar. Le te shohim skemen e meposhtme. long v1;----------------------------------- int main() | { | int v2;-------------------- | | | { | | int v3;----------- | | | | | }----------------

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 11

    Operatoret e krahasimit kryejne krahasimin e vlerave te dy variablave dhe perdoren si ne rastet e meposhtme i == 1; i barazimit i != 1; i ndryshem i > 1; me i madh i >= 1; me i madh baraz i < 1; me i vogel i

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 12

    vendosura brenda kllapave gjarperushe.

    1.3.7 Operatoret llogjike Operatoret llogjike jane && -- AND || -- OR ! -- NOT dhe perdoren per te krijuar shprehje llogjike neper funksione ose ne instruksionin e kushtezuar qe sqaruam me siper. if((x = 0)) coutc;

    d=b*b-4*a*c;if(d>=0){cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 13

    1.3.8 Ciklet

    ++ dhe --

    Nje cikel eshte menyra per te perseritur nje varg instruksionesh nje numer te caktuar heresh ose deri sa te plotesohen disa kushte te caktuara. Nje cikel mund te realizohet ne nje nga tre menyrat e meposhtme. Rasti i thjeshte eshte cikli for qe quhet. Egziston nje variabel qe quhet indeksi i ciklit. Ky fillon nga nje vlere fillestare dhe e rrit ose e zvogelon vleren, zakonishte me nje, deri sa te arrije nje vlere te caktuar.

    Rasti tjeter eshte cikli do-while. Kryhen instruksionet e ciklit dhe na vazhdim kontrollohet nje kusht. Cikli vazhdon deri ky kusht plotesohet. Sapo kushti behet jo i vertete cikli perfundon.

    Kryen nje ose me shume instruksione

    Kontrollon nese eshte i vertet kushti i perfundimit te ciklit .

    PO

    JO

    Vendos vleren fillestare tek indeksi i ciklit

    Kryen nje ose me shume instruksione

    Kalon tek vlera tjeter e ciklit deri sa te arrihet vlera perfundimtare.

    JO

    PO

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 14

    Rasti i trete eshte cikli while. Ky eshte i njejte me ciklin do-while me perjashtim te faktit qe kushti kontrollohet ne fillim te ciklit dhe jo ne fund te tij. Cikli while do te perdoret kur egziston qofte edhe nje rast qe instruksionet e ciklin te mos egzekutohen asnjehere.

    1.3.9 Zbatimi i cikleve Trajta e pergjithshme e instruksionit for eshte : for ( ; ;

    ) { Nje ose me shume instruksione te ciklit }

    Pas fjales celes for jane tre pjese te ndare me pikepresje. Vlera fillestare eshte vlera nga e cila do te filloje te perseritet cikli. Ne rastin tone variavli x eshte variabli i ciklit ose indeksi i ciklit (counter) :

    x = 0;

    Kushti i perfundimit eshte kushti i cili na nderpret perseritjen e ciklit. Ne rastin konkret cikli do te perseritet deri sa te jete i vertete :

    x < 200;

    Indeksi i ciklit tregon menyren se si dote marre vlera cikli. Konkretishte vlerat vijne duke u rritur me nga nje.

    x++

    Ne vazhdimm duhet te vendosen instruksionet qe do kryhen. Ne qofte se jane me shume se nje instruksione ato duhet te mbyllen me kllapa gjarperushe { dhe } .

    Me poshte jepet rasti me i thjeshte i perdorimit te ciklit for :

    // Ky cikel do te perseritet 10 here #include void main () { int counter;

    Kontrollon nese eshte i vertete kushti i ciklit .

    Kryen nje ose me shume instruksione

    PO

    JO

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 15

    for (counter = 1; counter < 11; counter++) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 16

    Ne parim ju mund ti beni te tre pjeset e instruksionit for sa te nderlikuara te doni duke vendosur instruksione te tjera shtese. Por te tre pjeset midis tyre duhen ndare me pikepresje dhe instruksionet midis tyre me presje.

    #include void main () { int x, sum, t; for (x = 1, sum = 0, t = 0; x

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 17

    // shembull per ciklin while #include void main () { int number; cout > number; while (number number; } }

    Ne qofte se ju jipni nje numer me te madh se 10 heren e pare qe pyeteni athere cikli nuk do te egzekutohet. Ne qofte se ju jipni nje numer me te vogel ose baraz me 10 cikli egzekutohet dhe thote te provojme perseri. Kjo do te ndodh deri sa te japim nje numer me te madh se 10.

    1.3.11 Cikli do-while Kushti ne kete rast vendoset ne fund te ciklit keshtu qe sido qe te jete puna cikli do te egzekutohet te pakten nje here. Trajta e tij eshte : do { instruksioni (ose grupi i instruksioneve) } while ( )

    Nje shembull i pershtatshem do te ishte :

    // cikli do - while #include void main () { int number; do { cout > number; } while (number

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 18

    factorial = factorial * i; cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 19

    X = A[2]; Me poshte jepet programi qe printon vlerat e nje matrice. // Printimi i vlerave te nje matrice #include int main() { int i; int A[5] = {7,2,3,4,6}; for (i=0;i

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 20

    Matricen e mesiperme mund ta deklarojme si matrice me tre rreshta dhe 7 shtylla. double A[3][7]; Ne programin e meposhtem gjenden vlerat negative te matrices dhe printohen ato . Kjo behet duke marre me radhe rreshtat dhe per cdo rresht merren me rradhe shtyllat. // Printimi i vlerave negative te nje matrice // me dy permasa #include #include int main() { const int m = 3, n = 5; int i,j; int A[m][n] = {{7, 2,3, 4,6}, {0,-1,4,-3,0}, {-5,2,4,-1,9}}; for (i=0;i

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 21

    1.5 Funksionet

    FUNCTION ?

    1.5.1 Cfare eshte nje funksion ? Funksionet na japin menyren per te ndare programet ne copa te manaxhueshme. Ato kryejne detyra te caktuara mbi nje grup te dhenash. Per shembull ju mund te keni nje funksion qe rendit numrat ne nje matrice ose funksioni qe numuron sa here cfaqet nje element i caktuar. Keto nuk jane instruksione te thjeshta por jane grupe instruksionesh qe ju keni per te konstruktuar si pjese brenda programit.

    Perdorimi i funksioneve ka disa avantazhe. Se pari ben nje program shume te thjeshte per tu lexuar dhe konceptuar. Se dyti duke perdorur funksionet shmangim nevojen qe te dublojme kodin e programit. Ne qofte se kemi nje program i cili cfaq vlerat e nje vektori, ne vazhdim i rendit ato dhe i cfaq perseri ne rendin rrites. Ne kete rast ne qofte se nuk do te perdorim funksionet do te duhet te perserisim dy here te njejtin kod qe cfaq vlerat e vektorit.

    Egzistojne dy momente kryesore ne nje funksion, deklarimi i tij qe eshte dhe vendi ku ai percaktohet, dhe therritja e tij qe eshte vendi ku ne e perdorim kete funksion. Ne vazhdim eshte nje funksion i thjeshte i cili therritet nga programi dy here.

    #include // ky funksion gjen shumen e tre numrave int s3 (int a, int b, int c) { return (a + b + c); } // pjesa kryesore e programit // void main () { // therrasim nje here cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 22

    }

    Percaktimi i funksionit behet qe ne fillim pas instruksionit #include Funksioni ne vazhdim therritet dy here per qellime te ndryshme.

    1.5.2 Struktura e nje funksioni Ju deri tani jeni ambientuar me funksionin main() ne program. Funksionet kane te njejten strukture me te, trajta e pergjithshme eshte: () { // Instruksionet e funksionit do te vendosen ketu return }

    Funksionet kane emrin qe therriten nga programi , vleren qe rikthejne dhe parametrat qe jane varjablat qe kalojne tek ky funksion. Parametrat mund edhe te mungojne por kllapat gjitjmone duhet te jene aty.

    Funksioni funks1 kthen vetem nje vlere dhe nuk ka parametra:

    int funks1 () { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 23

    Egziston dhe nje menyre tjeter qe te vendoset funksioni prototip (function prototype ) perpara se ai te therritet dhe percaktimi i tij te behet pas pjeses kryesore te programit.

    1.5.3 Funksionet qe kthejne vlera Thirrja e funksionit mund te vendoset ne vend te numrave ose varjablave te nje shprehjeje psh:. cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 24

    #include #include void pershendetje(char name[50]) { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 25

    } void main () { float x,y; float &xx = x, &yy = y; sp(5,6,xx,yy); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 26

    tregon p te barabarte me 106."

    Sic do te shohim kjo i ben treguesat shume te perdorshem.

    1.6.2 Deklarimi Treguesat deklarohen njelloj si variablat e tjere, por duhet te specifikojme kur deklarojme ato se ku tregojne. Ne qofte se do te deklarojme nje tregues qe do te tregoje tek nje numer te plote, atehere ky nuk mund te perdoret per te treguar nje numer real ose ndonje tip tjeter.

    Treguesi deklarohet duke perdorur simbolin * i cili vendoset ndermjet emrit te variablit dhe tipit qe ky do te tregoje. Psh qe te deklarojme treguesin my_pointer qe do te tregoje tek nje numer te plote shkruajme njeren:

    int* my_pointer; int *my_pointer;

    Te dy deklarimet e mesiperme jane e njejta gje.

    Kujdes! Ne qofte se kemi per te deklaruar disa variabla ne nje rresht dhe vendosim float* ose dicka tjeter te ngjashme ne fillim , vetem variablat qe kane * direct para tyre jane treguesa.

    Kujdes ! Mos deklaroni treguesa dhe variabla te tjeshte ne te njejtin rresht per te shmangur ngatresat.

    double* first, second, third; // 'first' eshte tregues // 'second' and 'third' jane variabla te thjeshte. double* a,*b,*c; // Te gjitha jane treguesa // qe tregojne nje vlere reale. long *x,y,*z; // 'x' dhe 'z' jane treguesa // 'y' eshte variabel i thjeshte.

    Nje tregues eshte bere per te treguar dicka, duke vendosur barazimin me ate kjo realizohet, por duke shtuar operatorin & , nenkupton adresa e , keshtu

    my_pointer = &my_int;

    Ne kete rast, treguesi my_pointer tregon tek nje variabel te plote my_int duke bere qe te mbaje adresen e ketij variabli si vlere (ne memorje). Cdo variabel nga nje karakter dhe deri tek matricat rezervohen ne kujtese ne nje adrese te caktuar qe vendos kompiluesi kur perkthen programin. Ju mos u shqetesoni se ku jane keto adresa dhe sa gjate kompiluesi do te mbaje ecurine e tyre.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 27

    Le te supozojme qe my_int eshte rezervuar ne adresen 2411 ne memorje. Pasi instruksioni & te egzekutohet, treguesi my_pointer do te kete vleren 2411.

    Mund te theksojme se adresa e nje numri te plote nuk ka ndonje shenje dalluese se cfare ka ne te. Pra variabli my_int eshte vendosur tek 2411, por ka si vlere numrin 106.

    Ju gjithashtu mund ti jipni nje treguesi vlere si me poshte:

    my_pointer = 2411;

    Por kjo menyre eshte per te ngateruar! Variabli my_int eshte rezervuar ne adresen 2411 tani, por heren tjeter qe programi te kompilohet mund te jete psh ne adresen 6710, keshtu qe my_pointer = 2411 do te tregoje dicka krejt ndryshe dhe kjo mund te shkaktoje black out.

    1.6.3 Ndryshimi i asaj qe tregon nje tregues

    Sic vendosni qe nje tregues te tregoje ne nje variabel tjeter, ju duhet te keni mundesi ti referoheni ketij treguesi gjithashtu dhe objektit qe ky tregon dhe te beni veprime tek ai . Ketu fillon te nderlikohet pak situata. Kjo eshte ajo qe i nxjere njerezit jashte perdorimit te treguesave per nje kohe te gjate.

    Objekti qe treguesi referon jepet duke vendosur simbolin * perpara vet emrit te treguesit. Le te shohim shembullin my_pointer te meparshem:

    int my_int = 46; // Deklarojme nje numer te plote, me vlere 46 // Deklarojme treguesin dhe bejme ate qe te tregoje tek my_int int *my_pointer = &my_int; cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 28

    Instruksioni

    *my_pointer = 107

    eshte ekuivalent me

    my_int = 107.

    Ketu kemi nje shembull pak me te nderlikuar. Do te perdorim p si tregues, meqe thjeshton te shtypurit, dhe do ta bejme qe te tregoje (ti referohet) tek njeri nga te dy numrat real, a or b.

    float *p; float a = 12.13; float b = 0.0045; p = &a; cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 29

    hello[1] = &b; hello[2] = &c; // etj.

    Ky eshte nje problem , por nuk kemi ndonje rruge me te mire per ta bere ate! Ne qofte se treguasat tregojne tek alfa numeriket, egziston nje rruge me e mire per ta bere ate, por jo per te plotet.

    Sic shikoni tek skema nuk kemi mundesi te njohim qe me perpara se ku kompiluesi do ti vendos keto numra ne memorje. Keto nuk jane vendosur ne nje varg, megjithate kjo nuk perben asnje problem derisa ne kemi treguasat qe tregojne tek ata.

    Le te bejme dicka me keto treguesa. Gjeja me e zakonshme eshte te rendisim numrat ne memorje, jo duke levizur numrat ne nga adresat e tyre ne memorje, por duke ndryshuar tregimin e treguesave tek ato. Ju mund te vereni qe treguesi tek 109 vjen me perpara se treguesi tek 51 ne list. Ne duhet te bejme qe treguesi i dyte te tregoje tek 51 dhe i treti tek 109 (duke shkembyer adresen qe tregojne treguesat) ne kete menyre ata do te vendosen ne rradhe.Me poshte eshte programi qe ben kete:

    #include // Do te deklaroje matricen e treguesave ketu me qellim qe // funksioni 'display' ta perdor ate int* hello[10]; // Cfaq gjithe vlerat e treguesave void display () { int i; // Cfaq cfare tregon secili tregues nga matrica e treguesave // for (i = 0; i < 10; i++) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 30

    hello[0] = &a; hello[1] = &b; hello[2] = &c; hello[3] = &d; hello[4] = &e; hello[5] = &f; hello[6] = &g; hello[7] = &h; hello[8] = &k; hello[9] = &l; // E di qe eshte e bezdishme por a ka ndonje rruge tjeter. int* temp; int i,j; display(); // Cfaq vlerat para renditjes for (i = 0; i < 10; i++) for (j = 0; j < 9; j++) if (*hello[j] > *hello[j+1]) { temp = hello[j]; hello[j] = hello[j+1]; hello[j+1] = temp; } display(); // Cfaq pas renditjes }

    Egziston nje rruge me e thjeshte per te bere kete me alfa numeriket. Sekreti eshte qe treguesi te tregoje ne char ne vend te string.

    char* pointers_to_names[10] = {"Richard","Diane","Sarah","Tony","Jeremy", "Natalie","Mary","Henry","Sue","Fred"};

    Kjo eshte menyra qe pointers_to_names[0] te tregoje tek Richard, pointers_to_names[1] te tregoje tek Diane, pointers_to_names[2] te tregoje tek Sarah etj. Ka disa shkaqe qe C++ nuk na lejon ta bejme kete edhe me numrat!

    1.6.5 Treguesa tek Matricat Mund te supozoje qe kur te shohim se si nje tregues tregon nje matrice , ju keni per tu bere konfuz akoma me teper !

    Supozojme qe kemi nje matrice numrash natyror long v. Ju mund te deklaroni nje nje tregues te thjeshte natyror long dhe bejeni ate te tregoje tek matrica si zakonishte:

    unsigned long v[5] = {1004, 2201, 3000, 432, 500}; unsigned long* p = v; cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 31

    Kjo na cfaq numrin qe tregon p qe eshte numri i pare i matrices 1004. Tek rreshti i dyte qe u inicializua treguesi duket sikur ka nje gabim, qellimishte ketu nuk eshte perdorur shenja & per te inicializuar treguesin.

    Ju shikoni qe , C++ mundohet ti trajtoje matricat sikur ato te ishin treguesa, kjo eshte arsyeja qe nje tregues i referohet nje matrice direkt ne vend qe te perdor operatorin & adresa e. Instruksioni p = v ben qe nje tregues te tregoje nje matrice. Numri tek kjo adrese eshte elementi i pare i matrices, keshtu qe eshte kjo vlera qe merret kur perdorni *p:

    C++ ka disa instruksione matematike ekstra qe na lejojne ti bejme treguesat me fleksibel:

    p++

    Ky instruksion shton treguesin me nje keshtu qe ai tregon tek vlera tjeter e matrices. Ne qofte se ju ne vazhdim do te shkruani instruksionin cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 32

    1.6.6 Perdorimi i treguesave ne parametrat e funksionit Treguesat mund te perdoren si parametra te funksionit dhe te lejojne qe vlerat e parametrave te ndryshojne. Qe ta kuptojme me mire , le te sqarojme me nje shembull: #include void s_funks (int x) { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 33

    Atehere funksioni mund te ndryshoje vleren qe i referohet treguesi duke kujtuar qe ndryshon vleren reale te variablit. Ketu eshte programi i mesiperm me ndryshimet e nevojshme:

    #include void s_funks (int *px) { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 34

    2 Strukturat

    Cfare eshte nje strukture? Strukturat si parametra funksionesh Member Functions Strukturat brenda strukturave

    2.1 Cfare eshte nje strukture? Deri tani kemi perdorur variabla te thjeshta si numra te plote, reale, long, matricat, alfanumeriket etj. Strukturat na japin mundesi ti lidhim te gjitha se bashku.

    Le te supozojme se duam te rezervojme te dhena rreth nje personi ne kompjuter. Secili ka emrin, adresen, gjatesine, ngyren e syve edhe shume pjese te tjera informacioni qe ju mund te rezervoni. Eshte e mundur qe te rezervojme keto si nje varg variablash te thjeshte , nje alfanumerik per emrin, nje alfanumerik per adresen, nje numer per gjatesine , nje numer te plote per ngyren e syve (1 kafe , 2 jeshile, 3 blu etj). Eshte e mundur te rezervohen keto informacione ne matrica ose te ngjishen te gjitha keto informacione ne nje alfanumerik te vetem.

    Megjithate do te ishte me mire per perpunim ne qofte se do te perfshijme te gjithe kete informacion brenda nje strukture te vetme.

    struct person { string name; int eye_colour; float height; }; person friend,mother; person spouse;

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 35

    Kjo na krijon nje strukture qe quhet person dhe deklaron tre variabla te ketij tipi. Secili prej tyre ka emer , gjatesi dhe ngyre te syve. Deklarimi nuk vendos vlerat e tyre , ato do te vendosen si me poshte.

    friend.name = "Diane"; friend.eye_colour = 1; friend.height = 1.61; mother.name = "Mary"; mother.eye_colour = 2; mother.height = 1.44; spouse.name = "Helen"; spouse.eye_colour = 1; spouse.height = 1.7;

    Vlerat e variablave te vecante qe perbejne nje strukture (fushat , fields) u referohemi duke ndare me pike nga emri i variablit. Keto mund te trajtohen si variabla te zakonshem tek shprehjet dhe ne veprime te tjera. Per shembull, Diane pas rembimit nga alienet u gjet me ngyren e syve te ndryshuar:

    friend.eye_colour++

    Po te cfaqim vleren friend.eye_colour do te kete tani vleren 2.

    2.1.1 Structurat si parametra Funksionesh Ju mund te kaloni strukturat si parametra funksionesh shume thjeshte si gjithe tipet e variablave te tjera. Ne vazhdim keni nje funksion qe cfaq hollesirat per nje person: void cfaq_karakteristika (person x) { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 36

    2.1.2 Member Functions Kjo eshte suprize per ju! Mund te percaktoni nje funksion brenda nje strukture dhe ky te jete pjese e struktures. Nje funksion i tille qe lidhet me strukturen quhet member function. Me poshte kemi nje funksion. Le te supozojme qe kemi nje strukture qe ka te dhenat per nje drejtekendesh. Nje drejtekendesh percaktohet nga gjeresia dhe gjatesia. Gjithashtu mund te perfshihen suprina dhe perimetri qe mund te llogariten sipas gjeresise dhe gjatesise nga member functions: struct drejtekendeshi { double gjeresi, gjatesi; double suprina() { return gjeresi * gjatesi; } double perimetri() { return 2 * (gjeresi + gjatesi); } }; drejtekendeshi dhoma; drejtekendeshi flamur; drejtekendeshi fushe_futballi;

    Kjo strukture ka dy fusha dhe dy member functions. Mund te jipni te dhena si me siper:

    dhoma.gjeresi = 3; // dimensionet ne metra dhoma.gjatesi = 2.51; flamur.gjeresi = 3.1; // flamur.gjatesi = 1.923; // fushe_futballi.gjeresi = 50; fushe_futballi.gjatesi = 100;

    Ne vazhdim mund te perdorni keto funksione sikur te jene fusha te zakonshme. Dallimi i vetem eshte se ne fund keto kane kllapa te rrumbullakta.

    cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 37

    Le te fillojme me strukturen qe percakton pozicionin sipas kordinatave. struct posicion { float x,y; };

    Tani kalojme ne hapin tjeter qe do te na percaktoje sferen ( ball). Kjo ka pozicionin, ngjyren, piket, gjendja (1 ne tavoline, 0 ne kosh, -1 jashte).

    struct ball { posicion p; int colour; // 0=black, 1=white etc. int points; int status; };

    Duke pasur te mesipermet tani mund te deklarojme tavolinen qe ka 17 ball, 6 kosha ku secili percaktohet nga pozicioni i tij dhe se fundi permasat.

    struct table { ball balls[16]; // First ball is balls[0] position pockets[5]; float length,width; }; table t1;

    Strukturat brenda strukturave mund te aksesohen duke i ndare me pike psh t1.length = 2.4;

    Pozicionet e koshave

    t1.pockets[0].x = 0; dhe t1.pockets[0].y = 0;.

    Pozicioni i cdo sfere me

    t1.balls[4].p.x = 1.466; dhe t1.balls[4].p.y = 0.782;.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 38

    2.2 Hyrje / Dalje tek skedaret Skedaret jane variabla te nje tipi te vecante te cileve si gjithe variablat e tjere u japim vlera ose mund te lexojme vlerat e tyre. Deri tani te dhenat qe kemi perdorur neper programe i shkruanim direkt aty dhe ishin te disponueshme deri sa programi ishte ne pune, kjo nuk eshte me shume leverdi. C++ me qellim qe te behet e efektshme rezervon te dhenat ne skedar.

    2.2.1 Shtimi i te dhenave ne skedar Te gjitha funksionet qe kane te bejne me skedaret jane te percaktuar tek libraria fstream.h sic jane cin dhe cout te percaktuar tek iostream.h, keshtu qe te kemi mundesi te punojme me skedaret duhet te perfshijme kete librari tek deklarimet fillestare.

    #include

    Sugjerojme qe kjo te vendoset pas deklarimit te librarise baze.

    #include

    Menyra me e thjeshte per te deklaruar nje skedar dhe ta pregatisim per te shtuar te dhena eshte:

    const char* fname = "mydata"; ofstream f(fname);

    Ky krijon nje alfanumerik me emrin fname ne memorje qe permban fjalen mydata (qe do te jete emri i skedarit ne disk) . Rreshti

    ofstream f(fname);

    krijon nje variabel skedari fname qe lidhet me skedarin e diskut me emrin "mydata". Fjala const i tregon kompiluesit qe mos ta ndryshoje vleren ketij variabli.

    Fjala ofstream nenkupton qe ky skedar do te perdoret per te shtuar te dhena ne te dhe jo per te lexuar.

    2.2.2 Hapja dhe mbyllja e skedareve Para se te perdorim nje skedar duhet ta hapim ate. Kjo behet si me poshte : const char* sked1 = "Adresa"; ofstream f(sked1); f.open(); // Kjo hap skedarin keshtu qe mund te shtojme te dhena // ne te.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 39

    Sapo te keni mbaruar te gjitha veprimet me skedarin atehere ky duhet mbyllur si me poshte:

    f.close();

    2.2.3 Shtimi i te dhenave Tani qe skedari eshte hapur mund te shtojme te dhena ne te. Ne vazhdim per veprimet do te perdorim variablin skedar f te deklaruar me siper. Do te pedorim operatorin

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 40

    f.open(); for (i = 1; i

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 41

    Tek programi i mesiperm shtohen 10 rreshta ne nje skedar dhe ne vazhdim lexohen keto rreshta.

    2.2.7 Detektimi i fundit te skedarit

    Kur lexojme te dhena nga nje skedar nuk mund te kalojme pertej fundit te tij. Qe te kontrollojme kete perdoret funksioni eof() si me poshte:

    if (sk.eof() == 0) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 42

    }; friend pal, cousin, neighbour; friend *mate; parent Deirdre, Sam, Angela, Fred;

    Kjo strukture rezervon emrat e miqve moshen e tyre dhe dy treguesa per prinderit. Me poshte po japim vlera psh per kushurinjte.

    cousin.name = "Colin"; cousin.age = 37; cousin.mother = &Deirdre; cousin.father = &Fred;

    Ne na duhet nje tregues qe te tregoje ne nje strukture. I tille eshte *mate qe tregon ne strukturen friend . Kodi i meposhtem ben qe ky treguesi te tregoje tek variabli pal .

    mate = &pal; (*mate).name = "Thomas"; (*mate).age = 22; (*mate).mother = &Angela; (*mate).father = &Sam;

    Ne kete rast, *mate nenkupton "objekti qe mate tregon", qe eshte nje strukture. Objekti qe *mate tregon i ndjekur me pike dhe ne vazhdim emri i variablit qe perben kete strukture, do te sherbeje per ti dhene vlera kesaj strukture.

    Ju duhet te vendosni kllapa tek *mate kompiluesi ta interpretoje drejte. Ne qofte se do te shkruajme *mate.name kompiluesi do ta interpretoje si *(mate.name), dmth qe name eshte vete nje tregues. Kjo do te ishte nje gabim.

    C++ na jep nje rruge te shkurtuar per te shprehur kete.

    Ne vend qe te vendosim kllapa dhe yll ju mund te shkruani -> ndermjet treguesit dhe fushes se struktures. Ne vazhdim eshte shembulli i mesiperm i shkruajtur me kete shkurtim.

    mate = &pal; mate->name = "Thomas"; mate->age = 22; mate->mother = &Angela; mate->father = &Sam;

    Konkretishte, x->y nenkupton "x eshte nje tregues qe tregon ne nje objekt qe permban variablin e quajtur y. I referohet ketij variabli". Nuk ka asnje

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 43

    shkak perse ju mos ta perdorni kete shenim dhe ne krahun e djathte te instruksionit te dhenjes se vleres, psh:

    mate->name = cousin->name;

    Krahu i djathte i referohet variablit name qe eshte pjese e struktures qe tregohet nga cousin (dmth alfanumeriku Colin). Pra fusha name qe tregohet nga mate do te marre vleren Colin. Perfundimishte vlera Thomas ndryshon dhe behet Colin.

    2.4 Klasat Cfare jane klasat? Variablat public dhe privat Member functions

    2.4.1 Cfare jane klasat? Nje klase eshte nje version luksoz i struktures. Ju kujtohet qe nje strukture eshte nje grup te dhenash qe perbejne nje objekt psh per nej njeri do te kishim emrin , moshen , gjatesine , etj. Nje klase i ngjan kesaj por mund te bejme shume me teper se sa kjo strukture.

    Menyra me e mire per te krijuar nje klase eshte te marrim nje strukture dhe na vend te fjales struct te vendosim fjalen class. Ju kujtojme shembullin nga paragrafi i meparshem:

    struct person { string name; int eye_colour; float height; };

    Po te zevendesojme do te kemi:

    class person { string name; int eye_colour; float height; };

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 44

    Nuk eshte nevoja qe te ndryshojme menyren e deklarimit te variablave.

    person my_pal_from_work; my_pal_from_work.name = "Peregrin"; cout mother.height) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 45

    2.4.3 Member functions Eshte e mundur qe te shoqerojme klasen me funksione, keshtu qe klasa ka gjithcka qe i duhet :

    Nje member function eshte i njejte me nje funksion normal ka parametra, mund te rikthej vlera etj pervec se kryen detyra brenda klases dhe eshte pjese e saj. Member functions mund te jene edhe keto public ose privat.

    Supozojme qe duam nje funksion qe do te numuroj dritaret e nje ndertese. Kjo mund te behet :

    class building { public: int length, width, height; string purpose; string name; private: float volume; int num_windows; public: void count_windows() { num_windows = 2 * length * height + 2 * width * height; } }; building office, palace, home;

    Mos u shqetesoni per menyren e llogaritjes se dritareve e rendesishme eshte se kemi nje funksion qe ndodhet brenda klases. Ky funksion eshte public dhe mund te aksesohet nga pjesa kryesore e programit. Shenojme qe numri i dritareve brenda funksionit nuk u referohemi ne te njejten menyre si tek strukturat.

    Normalishte do te duhej ti referoheshim ketij varjabli si fushe e struktures psh : office.num_windows, palace.num_windows, por jo ne kete rast. Funksioni perdor kete variabel si pjestar te klases keshtu :

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 46

    office.count_windows(); jep vlere office.num_windows, palace.count_windows(); jep vlere palace.num_windows, etj.

    You will also notice that you call the member functions of a class by prefixing them with the class variable to which they belong and a full stop, i.e. treat them as though they were variables in a structure.

    Per te ndryshuar vleren e num_windows tek klasa, ne nuk mund ti referohemi direkt nga jashte sepse eshte nje variabel privat. Ne kete pike mund te deklarojme nje funksion public get_windows() tek klasa (qe mund te aksesoje variablat privat te klases) dhe mund te therritet nga jashte.

    class building { public: int length, width, height; string purpose; string name; private: float volume; int num_windows; public: void count_windows() { num_windows = 2 * length * height + 2 * width * height; } int get_windows() { return num_windows; } }; building office, palace, home;

    Pra tani mund ti referohemi variablit num_windows ne cdo pjese te programit dhe eshte nje menyre encapsulimi (fshehjeje):

    void main () { office.length = 20; // keto jane publike office.width = 10; office.height = 37; office.count_windows(); // therritet funksioni cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 47

    set_height(); ose set_name(); ose cdo gje tjeter do perdoret per tu dhene vlere variablave, dhe funksioni get_height(); ose get_height(); do te perdoret per te kthyer vleren e tij.

    Atehere perse na duhen variablat privat kur nje user mund ti aksesoje ato? E mira eshte se keto variabla mund te aksesohen vetem ne kete menyre dhe ne asnje menyre tjeter. Psh ne strukturat variablat jane komplet te pa mbrojtura.

    2.5 Constructors and Destructors Constructors Overloading constructors Destructors

    2.5.1 Constructors Constructor eshte nje funksion special qe mund te perfshihet ne nje klase. Ky eshte nje funksion jo i zakonshem se nuk mund te therritet si gjithe funksionet e tjere. Nje funksion i tille therritet automatikishte sapo nje variabel klase deklarohet. Pra krijohet variabli klase.

    Le te shohim programin:

    #include class daft { public: int x, y, z; }; daft my_variable; void main () { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 48

    { public: int x, y, z; daft () { x = 23; y = 45; z = 133; } }; daft my_variable; void main () { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 49

    2.5.2 Overloading constructors Pyetja llogjike eshte a mund te deklarohet nje klase me dy funksione construktor? Ky eshte nje rast i function overloading, ku me shume se nje funksione me te njejtin emer por me numer te ndryshem parametrash mund te deklarohen si funksione constructor, dhe kompiluesi sipas rastit zgjedh njerin prej tyre: #include #include class test { public: int x; string message; // The first constructor has no parameters test () { x = 23; message = "The no-parameter constructor was used."; } // The second constructor has 1 parameter test (int set_x_to_this) { x = set_x_to_this; message = "The 1-parameter constructor was used."; } }; void main () { test test_class1; test test_class2(100); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 50

    // Here is the constructor person (string init) { name = init; cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 51

    2.6 Trashegimia (Inheritance) Kjo eshte karakteristika qe lejon nje klase te rrjedh nga nje klase tjeter. Le te shohim sillogjizmin si me poshte:

    "Te gjithe papagallet jane zogj. Shumica e zogjve mund te fluturojne por disa jo. Te gjithe pinguinet jane zogj. Disa papagall jane te eger, disa jane te zbutur. Papagallet e zbutur kane emra."

    Cdo pjese e djagrames mund te implementohet si klase me variablat dhe funksionet e saj. Ne do perdorim trashegimin per ti lidhur ato.

    class animal { public: int warmblooded; // 1 means yes, 0 means no int numlegs; int colour_vision; // Applies to apes, birds, fish // and insects. A funny mix! }; class bird : public animal { public: int hasfeathers; // 1 means yes, 0 means no // Well, it could be a Sainsbury's frozen chicken! int canfly; string diet; int IQ; public: // Constructor for the bird class bird () { warmblooded = 1; numlegs = 2; colour_vision = 1; } }; class parrot : public bird { public: int cantalk; };

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 52

    class domestic_parrot { public: string name; }; domestic_parrot polly;

    Pas cdo emri klase me perjashtim te te pares qe eshte animal, ka dy pika dhe fjalen public dhe emrin e klases nga e cila kjo klase eshte rrjedhim. Klasa bird rrjedh nga klasa animal, dhe parrot eshte klasa qe rrjedh nga klasa bird. Themi ne kete rast qe bird eshte klasa baze per parrot, dhe animal eshte klasa baze per bird.

    Gjeja qe nje klase eshte rrjedhim i nje klase do te thote qe kjo trashegon te gjitha variablat dhe member functions nga klasa baze, keshtu klasa bird trashegon variablat nga klasa animal etj.

    Me poshte eshte nje shembull i nje deklarimi te tille. Klasa bird ka nje constructor funksion qe u jep vlera variablave warmblooded dhe numlegs qe nuk jane deklaruar direkt ne te por jane te trasheguar nga animal dhe jane publik per te , keto jane publik dhe per klasen bird .

    class animal { private: int warmblooded; // 1 means yes, 0 means no int numlegs; int colour_vision; }; class bird : public animal { public: int hasfeathers; int canfly; string diet; int IQ; public: // Constructor for the bird class bird () { warmblooded = 1; // Ah! Naughty, naughty! numlegs = 2; colour_vision = 1; } };

    Ne qofte se variablat jane privat keto mund te aksesohen sic thame me siper me get ose set funksione.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 53

    2.7 Funksionet modele Le te supozojme qe duam te ndertojme nje funksion qe na kthen vleren me te madhe te dy numrave. Atehere do te kishim: intmax(inta,intb){if(a>b)return(a);elsereturn(b);}

    Te dy variablat jane te plote dhe vlera qe kthehet eshte e plote. Ne qofte se do te gjenim maximumun per per dy numra real atehere do te duhej te shkruanim nje funksion tjeter qe do kishte si vlera keto tipe. Per te shmangur kete veprim per tipe te ndryshem ndertojme funksionet modele te cilat udhezojne kompiluesin se cfare do te kryeje dhe ne rastin konkret vendosen vlerat e tipeve te variablave perkates. Funksioni model per kete rast do te ishte: templatetipimax(tipia,tipib){if(a>b)return(a);elsereturn(b);}

    Ky funksion pret tani cdo tip te dhenash. Duhet te kemi kujdes vetem se te gjitha te dhenat jane te te njejtit tip, pra nuk mund te perdoret ne rastin kur nje variabel eshte i nje tipi te caktuar dhe variabli tjeter eshte i nje tipi tjeter. Ne kete rast mund te percaktonim nje funksion model me dy tipe: templatetipi1max(tipi1a,tipi2b){if(a>b)return(a);elsereturn(b);} Ne kete rast duhet te kujdesemi vetem per tipin e te dhenave qe do te kthehen.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 54

    2.8 Klasa modele Per klasat modele problemi eshte i njejte, ndertojme strukturen me tipet e variablave te pa percaktuar dhe ne rastin konkret ato do te marrin nje tip te caktuar. templateclassdrejtkendeshi{tipi1gjeresi;tipi1gjatesi;tipi2ngjyra;

    tipi1syprina(tipi1a,tipi1b){return(a*b);}}

    Per te deklaruar nje objekt te ketij tipi se bashku me te duhet te deklarojme dhe variablat konkret: Drejtkendeshixx;

    xx.gjeresi=1.3;xx.gjatesi=0.7;xx.ngyra=1;

    Konkretishte variabli tipi1 eshte float dhe variabli tipi2 eshte i plote, ne ndonje rast tjeter mund te ishin te dy te plote.

    3 Algoritmika

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 55

    3.1 Kuptimi i nje algoritmi Nje algoritem eshte nje procedure llogaritese e cila ploteson kushtet e meposhtme:

    Perbehet nga nje numer i fundem hapash (instruksionesh) te cilat kryhen njeri pas tjetrit.

    Cdo instruksion eshte i qarte dhe rigorozishte i percaktuar. Zbatohet mbi nje bashkesi te caktuar te dhenash. Perfundon gjithmone me nje zgjidhje ose arrin ne konkluzionin qe ska

    zgjidhje.

    Nje algoritem mund te pershkruhet me menyra te ndryshme. Me gjuhen e zakonshme, me pseudocode, me bllokskema, me nje gjuhe prohramimi te caktuar etj. Pervec pregatitjes (berjes) se nje algoritmi duhen edhe disa te dhena per te analizuar algoritmet, qe te jemi ne gjendje te vleresojme nje algoritem por edhe strukturat qe ai perdor. Disa karakteristika qe shikojme jane:

    Nderlikueshmeria Hapesira Koha Struktura e te dhenave Koha e pregatitjes se algoritmit Saktesia e zgjidhjes Siguria e te dhenave Fondet ne dispozicion

    Keto karakteristika per nje algoritem te caktuar kane nje mase te caktuar. Ne varesi te kushteve dhe te sistemit te perpunimit te informacionit zgjidhet raporti midis njera tjetres. Le te shohim nje algoritem ne tre menyra te ndryshme dhe te mundohemi te vleresojme karakteristikat e tij. Le te supozojme qe kemi nje varg te renditur elementesh. Kerkojme te gjejme ne qofte se elementi X ndodhet diku ne kete varg.

    3.1.1 Kerkimi binar

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 56

    I gjithe vargu ndahet ne dy pjese dhe ne cdo hap percaktohet se ne cilen ane ndodhet elementi. Intervali i zgjedhur ndahet perseri dhe keshtu vazhdon deri sa te gjendet elementi. Sipas ketij ne cdo hap te algoritmit mund te ndodhe qe ose

    - X eshte elementi i mesit - X ndodhet ne gjysmen e majte - X ndodhet ne gjysmen e djathte

    BinarySearch(A, N, X, U_gjet) { Deklarojme i_majte, i_djathte, mesi; U_gjet = 0; I_majte = 1; I_djathte = N; While((I_majte A[mesi]) I_majte = mesi + 1; Else I_majte = mesi -1; } } 1 (i_majte+i_djathte)/2 N i_majte mesi i_djathte

    3.1.2 Kerkimi rekursiv

    RecursiveSearch(A, i_majte, i_djathte, X, U_gjet) { int mesi; U_gjet = 0; If ((I_majte

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 57

    If (X > A[mesi]) RecursiveSearch(A, mesi + 1, i_djathte, X, U_gjet); Else RecursiveSearch(A, i_majte, mesi - 1, X, U_gjet); } }

    3.1.3 Serial Search SerialSearch(A, N, X, U_gjet) { int i; i=1; u_gjet = 0; while ((i

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 58

    Kemi tre shtylla dhe n disqe bashkeqendror me diametra te ndryshme qe jane kaluar tek shtylla e pare, te renditur dhe ne menyre te tille qe me i madhi te jete poshte dhe me i vogli siper. Duam te cvendosim te gjitha disqet tek shtylla C duke cvendosur nga nje disk cdo here dhe duke u kujdesur qe te mos vendosim nje disk te madh mbi nje tjeter me te vogel. Gjate kalimit te disqeve mund te perdorim shtyllen B si ndihmese. Llogjika e zgjidhjes rekurente mund te pershkruhet si me poshte: Per te kaluar me ndonje metode n disqe nga A tek C mundet qe me perpara te kalojme me te njejten metode (rekurente) te (n-1) disqet e siperme nga A tek B, pastaj te kalojme diskun me te madh nga A tek C dhe ne fund te kalojme me te njejten metode (rekurente) te (n-1) disqet nga B tek C. #include void TowersOfHanoi(int n, int x, int y, int z) { int i=1; //leviz n disqet e para nga X tek Y if (n>0) { TowersOfHanoi(n-1,x,z,y); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 59

    5. Vertetimi drejtesise se programit. Ne qofte se eshte gjetur algoritmi i duhur. 6. Vleresimi i rezultatueshmerise se programit. 7. Lexueshmeria, kuptueshmeria e programit.

    Menyra e deklarimit te variablave, funksioneve. Shtimi i komenteve ne cdo veprim. Per cdo funksion te tregohen procedurat qe therret dhe procedurat qe e therrasin

    8. Si do te organizohet sherbimi per kete program dhe mbeshtetja e klienteve. 9. Permiresimi i programit.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 60

    3.3 Tipi abstrakt i te dhenave te nje liste Nje list eshte nje varg prej zero ose me shume te dhena te ndonje tipi te caktuar. Keshtu mund te kemi lista te numrave te plote, te numrave real, te karaktereve, te matricave, te regjistrimeve etj. Nje list pershkruhet si nje varg (a1, a2, ... an) ku a1 quhet koka e listes dhe ( a2, ... an) mbetja, ose koka dhe bishti i listes. Nje nenlist eshte nje list (ak, ak+1, ... am) ku 1

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 61

    3.3.2 Shfrytezimi i nje liste Kjo mund te behet me dy menyra.

    3.3.2.1 Duke perdorur matricat Me poshte jepet programi ne C++ #include #include #include struct LinearList { int length; int MaxSize; float element[1000]; }; LinearList l; bool Find( int k,float& x ) {// Set x to the k'th element of the list. // Return false if no k'th; true otherwise. if (k < 1 || k > l.length) return false; x = l.element[k - 1]; return true; } int Search( float x) {// Locate x. Return position of x if found. // Return 0 if x not in list. for (int i = 0; i < l.length; i++) if (l.element[i] == x) return ++i; return 0; } void Delete(int k,float x) {// Set x to the k'th element and delete it. // Throw OutOfBounds exception if no k'th element. if (Find(k,x)) {// move elements k+1, ..., down for (int i = k; i < l.length; i++) l.element[i-1] = l.element[i]; l.length--; } else cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 62

    l.length++; } void Output() {// Put the list into the stream out. for (int i = 0; i < l.length; i++) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 63

    3.4 Duke perdorur treguesat

    3.4.1 Cfare eshte nje list e lidhur Nje list e lidhur eshte nje strukture te dhenash e krijuar nga strukturat dhe treguesat. Kjo krijon nje zinxhir nyjesh me treguesat qe paraqesin lidhjet e zinxhirit dhe i mbajne te gjitha se bashku. Nje list e lidhur mund te paraqitet si dhe me siper edhe me djagramin e meposhtem:

    Start

    Name: Fred Age: 34 Height: 1.7

    Name: Sue Age: 27 Height: 1.2

    Name: Joe Age: 48 Height: 1.4

    Name: Zoe Age: 30 Height: 1.3

    NULL

    Kjo list e lidhur ka kater nyje, secila me nga nje lidhje ne nyjen pasuese te vargut. Nyja e fundit ka nje lidhje speciale te nyja NULL. Egziston dhe nyja Start. This linked list has four nodes in it, each with a link to the next node in the series.

    3.4.2 Percaktimi i struktures se te dhenave per nje list te lidhur Struktura e te dhenave permban karakteristikat e nyjes (qe mund te jene emri, mosha, gjatesia etj ) dhe treguesi per nyjen tjeter. Me poshte eshte nje strukture tipike : struct node { char name[20]; // Name of up to 20 letters int age; // age float height; // In metres node *nxt; // Pointer to next node }; node *start_ptr = NULL;

    Ketu eshte deklaruar nje tregues start_ptr qe ka vleren NULL. Kjo tregon gjithashtu qe kemi nje list bosh.

    3.4.3 Shtimi i nje nyje ne fund te listes Problemi i pare eshte si te shtojme nje nyje ne nje list. Per thjeshtesi do te shtojme nje nyjen ne fund te listes kjo mund te shtohet ne cdo vend te listes.

    Se pari deklarojme nje hapesire per nje tregues dhe kete ja japim nj treguesi provizor. Kjo behet duke perdorur instruksionin new si me poshte :

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 64

    temp = new node;

    temp

    undefined

    Mund te referohemi tek nyja e re me *temp, d.m.th "nyja qe temp tregon ". Kur duam te perdorim fushat e kesaj strukture do te vendosim ne kllapa *temp perndryshe kompiluesi do te kujtoje qe ne referohemi fushave tregues. Perndryshe dhe per me thjeshte perdoret shenimi special qe treguam ne pjeset e meparshme.

    Duke deklaruar nje nyje ne duhet te plotesojme fushat e saj si me poshte:

    cout > temp->name; cout > temp->age; cout > temp->height; temp->nxt = NULL;

    Rreshti i fundit vendos vleren e treguesit per nyjen pasuese NULL qe tregon qe kjo eshte nyja e fundit. Ne qofte se lista eshte bosh kjo do te jete dhe nyja e pare.

    if (start_ptr == NULL) start_ptr = temp;

    Kur kemi element deklarojme nje nyje tjeter temp2 me te cilen kalojme hap pas hapi deri sa te gjejme nyjen e fundit.

    temp2 = start_ptr; // Njohim qe lista nuk eshte bosh NULL while (temp2->nxt != NULL) { temp2 = temp2->nxt; // Levizim nyja tjeter e zinxhirit }

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 65

    Cikli perfundon kur temp2 tregon tek nyja e fundit dhe kjo ndodh meqense treguesi nxt tregon NULL. Kur kjo gjendet vendoset qe treguesi nga nyja e fundit te tregoje tek kjo nyje qe sapo eshte deklaruar:

    temp2->nxt = temp;

    start_ptr

    temp2

    temp

    Nyja e re e

    shtuar

    NULL

    Lidhja temp2->nxt tek ky djagram lidh dy nyje te fundit. Me poshte jepet kodi i plote per kete proces.

    void add_node_at_end () { node *temp, *temp2; // Temporary pointers // Rezervojme hapesire per nje nyje te re //dhe e plotesojme me te dhena temp = new node; cout > temp->name; cout > temp->age; cout > temp->height; temp->nxt = NULL; // Set up link to this node if (start_ptr == NULL) start_ptr = temp; else { temp2 = start_ptr; // Kur lista nuk eshte bosh while (temp2->nxt != NULL) { temp2 = temp2->nxt; // Leviz tek nyja tjeter } temp2->nxt = temp; } }

    3.4.4 Cfaqja e listes se nyjeve Kjo gje eshte relativishte e thjeshte dhe metoda eshte: Vendos nje tregues provizor qe te tregoje tek e njejta gje qe tregon dhe nyja e pare i listes.

    1. Ne qofte se treguesi tregon NULL cfaqet mesazhi Fundi i listes dhe ndalon.

    2. Perndryshe cfaqen fushat e nyjes qe tregohen nga nyja e radhes.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 66

    3. Bejme qe treguesi provizor te tregoje tek e njejte nyje qe tregon dhe treguesi nxt i nyjes se rradhes .

    4. Kalo ne hapin 2.

    Treguesi provizor leviz pergjat listes duke cfaqur fushat e nyjes se rradhes. Kjo behet si me poshte:

    temp = start_ptr; do { if (temp == NULL) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 67

    Bejme qe treguesi start te tregoje tek nyja pasuese e nyjes se pare dhe treguesi provizor te tregoje tek nyja e pare si ne figure:

    start_ptr = start_ptr->nxt; // nyja e dyte e zinzhirit.

    start_ptr

    etc.

    temp

    delete temp; // Fshihet nyja e pare

    start_ptr

    etc.

    temp

    Ketu eshte funksioni qe fshin nje nyje nga fillimi:

    void delete_start_node() { node *temp; temp = start_ptr; start_ptr = start_ptr->nxt; delete temp; }

    Fshirja e nje nyje nga fundi eshte pak me e nderlikuar. Kjo ngjan me proceduren e shtimit te nje elementi ne fund te listes. Pra ideja eshte shkojme ne fund te listes dhe pastaj fshijme elementin e fundit duke perdorur dy treguesa provizore.

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 68

    void delete_end_node() { node *temp1, *temp2; if (start_ptr == NULL) cout nxt; } delete temp1; temp2->nxt = NULL; } } Ne rastin kur kemi vetem nje nyje duhet te shtojme nje pjese kodi qe ta parashikoje ate, kjo tregohet ne vazhdim. void delete_end_node() { node *temp1, *temp2; if (start_ptr == NULL) cout nxt != NULL) { temp2 = temp1; temp1 = temp1->nxt; } delete temp1; temp2->nxt = NULL; } } }

    3.4.6 Duke levizur pergjate listes E vetmja gje qe na duhet per te shkuar ne nje element te caktuar te listes eshte nje tregues qe do te perdoret si indeks. Kjo do te jete e nevojshme kur do te shtojme ose do te fshijme nje nyje diku brenda listes.Ne kete rast na duhet vetem pozicioni i nyjes ne list.

    Do te deklarojme nje tregues te levizshem me emrin current. E deklarojme dhe i japim vlere ketij treguesi te njejte me treguesin start_ptr :

    node *current; current = start_ptr;

    Grafikishte do te kishim qe te dy te tregojne te njejten gje :

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 69

    start current

    etc.

    Qe ketu eshte e lehte te bejme qe nje tregues te tregoje nyjen pasardhese:

    current = current->nxt;

    Bile me e mira do te ishte qe se pari te kontrollojme ne qofte se egziston nyja e rradhes:

    if (current->nxt == NULL) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 70

    }

    Tani qe mund te levizim ne pozicione te caktuara te listes mundet qe te ndryshojme dhe vlerat e fushave te nyjes perkatese:

    cout > current->name; cout > current->age; cout > current->height;

    Gjeja tjeter qe mund te bejme eshte te fshijme nyje pas pozicionit current. Rradha e veprimeve do te ishte:

    1. Se pari treguesi provizor e bejme qe te tregoje pas treguesit current. Kjo eshte nyja qe do te fshihet:

    2. Treguesi current e bejme qe te tregoje nje nyje pas treguesit provizor temp:

    3. Dhe hapi i fundit te fshijme nyjen qe tregon temp.

    Ketu eshte kodi per fshirjen e nyjes.

    if (current->nxt == NULL) cout nxt = temp->nxt; // Could be NULL delete temp; }

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 71

    Ne vazhdim eshte kodi per te shtuar nje nyje pas nyjes current. Kjo behet me te njejten menyre.

    if (current->nxt == NULL) add_node_at_end(); else { node *temp; new temp; get_details(temp); // Make the new node point to the same thing as // the current node temp->nxt = current->nxt; // Make the current node point to the new link // in the chain current->nxt = temp; }

    Ne vazhdim eshte nje program i plote i ketyre veprimeve.

    #include struct node { char name[20]; // Name of up to 20 letters int age; // D.O.B. would be better float height; // In metres node *nxt;// Pointer to next node }; node *start_ptr = NULL; node *current; // Used to move along the list int option = 0; void add_node_at_end() { node *temp, *temp2; // Temporary pointers // Reserve space for new node and fill it with data temp = new node; cout > temp->name; cout > temp->age; cout > temp->height; temp->nxt = NULL; // Set up link to this node if (start_ptr == NULL) { start_ptr = temp; current = start_ptr; } else { temp2 = start_ptr; // We know this is not NULL - list not empty! while (temp2->nxt != NULL) { temp2 = temp2->nxt; // Move to next link in chain

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 72

    } temp2->nxt = temp; } } void display_list() { node *temp; temp = start_ptr; cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 73

    void move_current_back () { if (current == start_ptr) cout nxt; } current = previous; } } void main() { start_ptr = NULL; do { display_list(); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 74

    int size; NodeType *head, *last, *temp; bool IsEmpty(void) { return head == NULL; } int length(void) { return size; } int InsertLast( float x) { if( IsEmpty()) { head = new NodeType; // create first node head->data = x; // fill it last = head; // update last last->next = NULL; } else { temp = new NodeType; // create new node temp->data = x; // fill it last->next = temp; // link previous node to it last = temp; // update last last->next = NULL; }; size++; return 0; } int Delete(int k){ NodeType *tmpB, *tmpN; temp=head; if(k>length()) return 1; int i=1; while (temp!=NULL){ tmpB=temp; temp=temp->next; if(k==1) {head=temp; return 1; size--;}; if(temp!=NULL) tmpN=temp->next; if(i==k-1)tmpB->next=tmpN; i++; } size--; return 0; } int print1(void){ for (temp=head; temp!=NULL; temp=temp->next) cout data

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 75

    } int main() { if(IsEmpty()) cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 76

    class NoMem { public: NoMem() {} }; // change new to throw NoMem instead of xalloc void my_new_handler() { throw NoMem(); }; new_handler Old_Handler_ = set_new_handler(my_new_handler); // improper array, find, insert, or delete index // or deletion from empty structure class OutOfBounds { public: OutOfBounds() {} }; // use when operands should have matching size class SizeMismatch { public: SizeMismatch() {} }; // use when zero was expected class MustBeZero { public: MustBeZero() {} }; // use when zero was expected class BadInput { public: BadInput() {} }; #endif Libraria e dyte eshte llist // file llist.h // formula-based linear list #ifndef LinearList_ #define LinearList_ #include #include #include "xcept.h" template class LinearList { public: LinearList(int MaxListSize = 10); // constructor ~LinearList() {delete [] element;} // destructor bool IsEmpty() const {return length == 0;} int Length() const {return length;} bool Find(int k, T& x) const; // return the k'th element of list in x int Search(const T& x) const;

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 77

    // return position of x LinearList& Delete(int k, T& x); // delete k'th element and return in x LinearList& Insert(int k, const T& x); // insert x just after k'th element void Output(ostream& out) const; private: int length; int MaxSize; T *element; // dynamic 1D array }; template LinearList::LinearList(int MaxListSize) {// Constructor for formula-based linear list. MaxSize = MaxListSize; element = new T[MaxSize]; length = 0; } template bool LinearList::Find(int k, T& x) const {// Set x to the k'th element of the list. // Return false if no k'th; true otherwise. if (k < 1 || k > length) return false; // no k'th x = element[k - 1]; return true; } template int LinearList::Search(const T& x) const {// Locate x. Return position of x if found. // Return 0 if x not in list. for (int i = 0; i < length; i++) if (element[i] == x) return ++i; return 0; } template LinearList& LinearList::Delete(int k, T& x) {// Set x to the k'th element and delete it. // Throw OutOfBounds exception if no k'th element. if (Find(k, x)) {// move elements k+1, ..., down for (int i = k; i < length; i++) element[i-1] = element[i]; length--; return *this; } else throw OutOfBounds(); } template LinearList& LinearList::Insert(int k, const T& x) {// Insert x after the k'th element. // Throw OutOfBounds exception if no k'th element. // Throw NoMem exception if list is already full. if (k < 0 || k > length) throw OutOfBounds(); if (length == MaxSize) throw NoMem(); // move one up for (int i = length-1; i >= k; i--) element[i+1] = element[i];

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 78

    element[k] = x; length++; return *this; } template void LinearList::Output(ostream& out) const {// Put the list into the stream out. for (int i = 0; i < length; i++) out

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 79

    Nje stive eshte nje strukture linare te dhenash ku hyrja dhe dalja e objekteve behet vetem nga njera ane e struktures.

    Gjithmone egziston nje pozicion qe quhet kreu i stives dhe eshte i vetmi vend ku behen veprime. Veprimet qe behen jane:

    Top () Jep elementin e kreut Empty() Bosh Full() Plot Push ose Add Shton nje element Pop ose Delete Fshin nje element

    3.6.1 Stivat me matrica #include #include #include struct stack{ int MaxSize; int element[100]; }; int top; int x; stack s; int IsEmpty() {return top == -1;} int IsFull() {return top == s.MaxSize - 1;} int Top(int& x) {//set x to top element if (IsEmpty()) return 0; //Top fails x = s.element[top]; return 1; //Top succeeds }

    an ... ... ... a2 a1

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 80

    int Add( int& x) {//add x to stack if (IsFull()) return 0; //add fails top++; s.element[top] = x; return 1; //add succeeds } int Delete(int& x) {//delete top element and put it in x if (IsEmpty()) return 0; //delete fails top--; x = s.element[top+1]; return 1; //delete succeeds } void main(void) { top = -1; s.MaxSize=10; x=1; Add(x); x=2; Add(x); x=3; Add(x); x=4; Add(x); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 81

    #ifndef Stack_ #define Stack_ // file nstack.h ... stack from scratch template class Stack { // LIFO objects public: Stack(int MaxStackSize = 10); // constructor ~Stack() {delete [] stack;} int IsEmpty() {return top == -1;} int IsFull() {return top == MaxSize - 1;} int Top(type& x); int Add(const type& x); int Delete(type& x); private: int top; int MaxSize; type *stack; }; template Stack::Stack(int MaxStackSize) { MaxSize = MaxStackSize; stack = new type[MaxSize]; top = -1; } template int Stack::Top(type& x) {//set x to top element if (IsEmpty()) return 0; //Top fails x = stack[top]; return 1; //Top succeeds } template int Stack::Add(const type& x) {//add x to stack if (IsFull()) return 0; //add fails stack[++top] = x; return 1; //add succeeds } template int Stack::Delete(type& x) {//delete top element and put it in x if (IsEmpty()) return 0; //delete fails x = stack[top--]; return 1; //delete succeeds } #endif Pjesa kryesore e programit eshte:

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 82

    #include #include "nstack.h" void main(void) { Stack S(3); int x; S.Add(1); S.Add(2); S.Add(3); S.Add(4); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 83

    #include #include const n=100; struct queue{ int front; int rear; float element[n]; }; queue q; void create(queue& x){ x.front=1; x.rear=0; } bool IsEmpty(queue& x) {return x.front > x.rear;} bool IsFull(queue& x) {return x.rear == n;} int FrontItem(queue& x, float& el) { if (IsEmpty(x)) return 0; el = x.element[x.front]; return 1; } int Enqueue(queue& x, float& el) { if (IsFull(x)) return 0; x.rear++; x.element[x.rear] = el; return 1; } int Dequeue(queue& x, float& el) { if (IsEmpty(x)) return 0; el = x.element[x.front ]; x.front ++; return 1; } void main(void) { create(q); float e; cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 84

    e = 9.1; Enqueue(q,e); FrontItem(q,e); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 85

    x.front->next = NULL; x.rear = x.front; return 0; }; //NodeType *head, *last, *temp; bool IsEmpty(Queue& x) { return x.front->next == NULL; } int Enqueue( Queue& x, float el) { tmp = new NodeType; tmp->data = el; x.rear->next = tmp; // link previous node to it x.rear = tmp; // update last x.rear->next = NULL; return 0; } int Dequeue( Queue& x, float& el) { if(IsEmpty(x)) return 1; tmp = x.front->next; el = tmp->data; delete x.front; if(x.rear = tmp) { // nqs ka nje element x.front = tmp ; x.rear=x.front; } else { tmp1=tmp->next ; x.front = tmp ; x.front->next = tmp1; } return 0; } int print2(Queue& x){ NodeType *temp; temp=x.front->next ; while (temp!=NULL){ cout data next; } return 0; } int main() { float xx; Create(q); xx = 7.01; Enqueue(q,xx); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 86

    print2(q); xx = 9.01; Enqueue(q,xx); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 87

    //referenca tek funksionet #include void sp(float a, float b, float &p, float &s) { p = a * b; s = a + b; } void main () { float x,y; float &xx = x, &yy = y; sp(5,6,xx,yy); cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 88

    { cout

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 89

    for (j=0;j

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 90

    #include const int n = 3; double A[n+1][n+1] ; double B[n+1]; double E[n+1][n+2]; //1 1 2 //1 2 2 //1 1 3 void lexo() { int i,j; for (i=1;i

  • Algoritme dhe struktura te dhenash ne C++

    J. Litsa , Gjirokaster 2006 91

    } int main() { int i,j; lexo(); for (i=1;i