Close
Faqja 0 prej 3 FillimFillim 12 FunditFundit
Duke shfaqur rezultatin -19 deri 0 prej 53
  1. #1

    C - Strukturat e t dhnave (Matricat, Listat, Pemt)

    Pershendetje cuna !
    Kam nje problem me nje ushtrim dhe kerkoj ndihmen tuaj Me pak fjale :

    duhet qe te shkruaj disa record ne nje file
    cdo record ka dy kampe (nje string dhe nje int)
    ...
    struct record {
    char personi [20];
    int num;
    };

    struct record r;
    struct record *rPtr;
    rPtr= &r;
    int dim=sizeof(r);

    strcopy(r.personi, "Naim Frasheri ");
    r.num =17;

    int fd;
    fd = fopen("file.txt",O_WRONLY) ;

    write (fd ,rPtr ,dim);
    close (fd);

    Duke ekzekutuar kete kod arrij te shkruaj ne FILE kampin e pare pra STRINGEN "Naim Frasheri"
    ndersa kampin dyte (pra numrin ) qe eshte INT nuk e shkruaj dot ne FILE . Ne vend te 17 gjej te shkrojtura karaktere te tjere

    Kush mund te me thote se ku qedron gabimi dhe si mund ta korrigjoj

    Dhe nje ushtrim tjeter :Duhet qe nderkohe qe shtoj rekorde te rinj ne FILE , gjithe rekordet duhen te jene te renditur sipas
    kampit te pare (String) sipas rendit alfabetik


    Ju falenderoj per pergjigjet e mundshme .
    ... cos' I was high when i wrote this !!!

  2. #2
    Larguar Maska e cunimartum
    Antarsuar
    07-06-2002
    Vendndodhja
    Canada
    Mosha
    39
    Postime
    680
    rPtr->num = 17
    (*rPtr).num = 17 \\ " . " me shume precedense se *

    Duket sikur po ndryshon adresen jo permbajtjen prandaj dhe shef junk.
    Fen e ke krejt personale. MEMEDHEUN E KEMI TE PERBASHKET.

  3. #3
    Programues Softueresh Maska e edspace
    Antarsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Mosha
    38
    Postime
    2,573
    M duket se problemi qndron tek funksioni write() q printon char dhe jo ints. Numrin 17 mundohet ta interpretoj si nj karakter t ASCII dhe prandaj nxjerr shkronja t panjohura.

    Ky kod punon:
    Kodi PHP:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    struct record 
    {
        
    char personi [20];
        
    int num;
    };

    int main (void)
    {
        
    struct record r;
        
    struct record *rPtr = &r;
       
        
    strcpy(r.personi"Naim Frasheri ");
        
    r.num =17;
        
        
    FILE fd;
        
    fd fopen("file.txt","w") ;  //ndryshoje "w" n O_WRONLY pr linux
        
        
    fprintffd"%s%d"rPtr->personirPtr->num);
        
    close (fd);

    Edi

  4. #4

    ok

    Faleminderit cuna per pergjigjet

    Po persa i perket pjeses se dyte , dmth renditjen e rekordeve ne file sipas kampit STRING (dmth siaps alfabetit) keni ndonje ide ??

    Gjith te mirat !
    ... cos' I was high when i wrote this !!!

  5. #5
    mos e luaj; I DEBUAR! Maska e qoska
    Antarsuar
    17-05-2004
    Vendndodhja
    tirane
    Postime
    837
    nje pyetje kisha do gjithmone qe ta kesh file ne text dmth te lexueshem edhe nga editore te tjere ???

  6. #6
    63n700 Maska e werewolf
    Antarsuar
    03-10-2003
    Vendndodhja
    Rome
    Mosha
    38
    Postime
    164
    Pse nuk i mban te renditura ne nje linked list rekordet, dhe ne fund ti shkruash ne file? eshte menyra me e thjeshte( dhe e vetmja qe me vjen ne mendje per momentin)!!!


    qoska, nese eshte i hapur ne write nga nje proces, sbesoj se hapet nga 1 file tjeter...
    The truth may be out there, but lies are inside your head.

  7. #7
    Programues Softueresh Maska e edspace
    Antarsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Mosha
    38
    Postime
    2,573
    Shiko programin m posht.
    - Lexon nj skedar me dy kollona t ndara me tab '\t'.
    - I hedh rekordet n nj matric (array)
    - Rendit matricn sipas alfabetit
    - Shkruan prsri skedarin me rekordet t renditur sipas alfabetit

    Leximi i rekordeve mbaron kur gjen rreshtin e par bosh, ose kur arrin fundin e skedarit.

    Maksimumi i rekordeve sht 30 por mund ta ndryshosh sipas dshirs duke ndryshuar variabln REK_MAX.

    Kam komentuar gjithka por mos nguro t pyessh.
    Skedari i bashkngjitur ZIP ka kodin main.c dhe databaza.txt.

    Un e shkruajta n windows por duhet t punoj edhe n linux.
    E prpilova me Dev C++

    Ja nj shmbull i skedarit para se t prdoret programi:

    Kodi:
    Pashko Vasa	354
    Gjergj Fishta	614
    Ndre Mjeda	459
    Andon Zako ajupi	130
    Naim Frashri	755
    Jeronim De Rada	223

    Kodi i programit n C:

    Kodi PHP:
    // Autori: Edi, edspace ET comcast PIKE net
    // Pershkrimi: 
    //     Lexon dhe shkruan rekorde ne nje skedar sipas renditjes alfabetike
    //     Rekordi permban 2 kollona te ndara me tab 
    //
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <string.h> 

    const REK_MAX 30;  // numri maksimal per rekordet

    struct rekord // struktura e nje rekordi

        
    char personi [20];  // emri i personit deri ne 20 shkronja
        
    int num;            // numri
    }; 

    //********************************************************************
    // Hap skedarin db dhe hidh rekordet ne matricen r
    // Kthen numrin e rekordeve ne skedar ose -1 nqs nuk hapet skedari
    //
    int lexo_databaze( const char db [], struct rekord r);

    //********************************************************************
    // Hap skedarin db dhe shkruar nr rekorde nga matrica r
    // Kthen 0 nqs ndodh gabim
    //
    int shkruaj_databaze(const char db [], const struct rekord r, const size_t nr);

    //********************************************************************
    // Krahaso dy rekorde duke u bazuar mbi personin. 
    // Ky funksion perdoret per renditjen e rekordeve
    // emrat 0 konsiderohen si te pavlefshem dhe renditen ne fund 
    // Kthejme: -1 nqs r1<r2, 0 nqs r1=r2,  1 nqs r1>r1
    // A < Z < 0
    //
    int rekord_krah ( const struct rekord r1, const struct rekord r2);


    //********************************************************************
    // MAIN
    //
    int main (void

       const 
    char db [] = "databaza.txt"// emri i skedarit ku do ruhet info
        
       // tregues per array me rekorde
       
    struct rekord NULL;
       
       
    // kerkojme memorjen per REK_MAX rekorde
       
    callocREK_MAXsizeof(struct rekord) );
       
       if( 
    == NULL )  // nqs nuk ka memorje te mjaftueshme
       
    {
           
    printf("GABIM: Nuk ka memorje te mjaftueshme");   
           return 
    1;
       }       
       
       
    int nr_rekordeve lexo_databazedb);
       
       if ( 
    nr_rekordeve == -)
       {
           
    printf("GABIM: Nuk mund te hapej skedari %s"db);
       }
       
       
    qsort (rREK_MAXsizeof (struct rekord), (const void *)rekord_krah);  
        
       
    // ketu mund te ndryshosh matricen duke shtuar rekorde te tjera

       
    if( !shkruaj_databazedbrnr_rekordeve ) )
       {
           
    printf("GABIM: Nuk mund te hapej skedari %s"db);
           return 
    1;
       }    
       
       return 
    0;   // mbaruam


    //************************************************************************
    // Lexojme rekordet nga databaza
    //
    int lexo_databaze( const char db [], struct rekord r)
    {
       
    FILE inskedari// tregues per skedarin

       
    if(!(inskedari fopen(db"r"))) 
       {
           return -
    1// nqs nuk hapim dot skedarin kthejme kodin -1 (gabim)
       
    }    
        
       
    int i 0;
       
    char rresht [100];  // buffer per 1 rresht (maksimumi 100 shkronja)
      
       
    while(REK_MAX )   // marrim REK_MAX rekorde nga skedari
       
    {
           
    fgetsrresht100inskedari);   // marrim rreshtin

           // nqs eshte rreshti i fundit, dalim jashte
           
    if( feof(inskedari) || strlen(rresht) == 1) break;  
           
           
    // marrim emrin e personit qe ndahet me tab nga numri
           
    strncpyr[i].personistrtok (rresht,"\t"), 20 ); 
           
    r[i].num atoistrtok (NULL," \n") );    // marrim numrin        
           
    i++;
       }

       
    fclose(inskedari);   // mbyllim skedarin
       
       
    return i;       // numri i rekordeve qe gjetem ne skedar
    }   

    //************************************************************************
    // Shkruajme rekordet ne databaze
    //
    int shkruaj_databaze( const char db [], const struct rekord rsize_t nr )
    {
       
    FILE outskedari// tregues per skedarin
      
       // nqs nuk hapim dot skedarin per te shkruar
       
    if(!(outskedari fopen(db"w+"))) // 
       
    {
           return 
    0// nqs nuk hapim dot skedarin kthejme kodin 0 (gabim)
       
    }    
       
       
    int i;
       
       for (
    0nri++)  // shkruajme rekordet
       
    {    // emri dhe numri jane te ndara me tab
           
    fprintf (outskedari"%s\t%d\n"r[i].personir[i].num);
       }    
      
       
    fclose (outskedari);  // mbyllim skedarin
       
       
    return 1;
    }

    //************************************************************************
    // Krahasojme rekordet e databazes
    //  
    int rekord_krah (const struct rekord r1, const struct rekord r2)
    {
        if( 
    strcmp("\0"r1->personi) == ) return 1;    // zeron e vendosim ne fund
        
    if( strcmp("\0"r2->personi) == ) return -1;   // zeron e vendosim ne fund
        
    return strcmp (r1->personir2->personi);        // krahasojme dy fjale


    Skedari pas ekzekutimit t programit:

    Kodi:
    Andon Zako ajupi	130
    Gjergj Fishta	614
    Jeronim De Rada	223
    Naim Frashri	755
    Ndre Mjeda	459
    Pashko Vasa	354
    Skedart e Bashkngjitur Skedart e Bashkngjitur
    Ndryshuar pr her t fundit nga edspace : 02-12-2004 m 22:45
    Edi

  8. #8
    i/e regjistruar
    Antarsuar
    27-09-2002
    Mosha
    37
    Postime
    23
    nuk e ka te percaktuar numrin e rekordeve qe do shkruaj ne file, prandaj smund te perdori matrice!
    Matematicienet jane makina qe shnderrojne kafete ne teorema.

  9. #9
    Programues Softueresh Maska e edspace
    Antarsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Mosha
    38
    Postime
    2,573
    Gjithnj ka nj kufizim sepse kompjuteri nuk ka memorje pa kufi. fardo strukture t prdor pr ruajtjen e informacionit, qoft kjo me matrica, vektor, hash, kapica, lista zinxhir, etj, gjithnj do ket nj limit.

    30 q kam vn un mund t ndryshohet n 3000, ose 30,000 pr aq koh sa sistemi ka memorje t mjaftueshme. Ky numr sht pr numrin maksimal t rekordeve, por programi lexon dhe shkruan vetm rekordet q kan informacion dhe jo ato q jan bosh.

    Nqs skedari ka vetm 6 rekorde si n shmbullin m lart, ather 24 rekordet e tjera jan bosh dhe programi nuk i shkruan.

    Zgjidhja tjetr pr t kursyer memorje (jo pr t hequr kufizimet) sht me matrica dinamike por ka komplikime t tjera.

    Ndryshoje kodin tim q t punoj m mir ose sill ndonj zgjidhjen tnde.
    Edi

  10. #10
    Programues Softueresh Maska e edspace
    Antarsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Mosha
    38
    Postime
    2,573
    Sapo provova programin me nj skedar me 400.000 (4-qind mij) rekorde t tipit:

    Kodi:
    asdfasdf1	800
    asdfasdf2	801
    asdfasdf3	802
    asdfasdf4	803
    ...	...
    E krijova n excel q ka limit 65.000 rekorde dhe pastaj e hapa me nj editor tjetr dhe bra copy-paste disa her deri sa u b nj skedar rreth 7MB me 400.000 rekorde. Rekordet i rendita me fuksionin rand() te excelit.

    Programi m lart i lexoi, i renditi dhe i shkruajti prap n skedar brnda 30 sekondave.

    Kompjuteri sht 2.6GHz dhe ka 256MB memorje (windows XP).

    Jo keq apo jo?

    Po ke koh t lir, provoje me 500.000+ deri sa t gjesh limitet e kompjuterit tnd.
    Edi

  11. #11
    i/e regjistruar Maska e zeus
    Antarsuar
    27-05-2003
    Vendndodhja
    Ktu
    Mosha
    44
    Postime
    937
    -------------------------------------------------------

    Mendoj se Gjigandi ka te drejte! Perdorimi i nje matrice eshte i papershtatshem.

    Per te renditur permbajtjen ne nje file mund te perdoret edhe nje liste e renditur si thote nje koleg me lart po perseri me duket e papershtatshme sepse mendoj se qellimi nuk eshte qe ky shoku jone thjesht te mbaroje detyren, po te mesoje te punoje me nje file. Une ne fakt C nuk mbaj mend shume tani se e kam bere para 6 vjeteve po per ta mbajtur kete file gjithnje te renditur: cdo rekord i ri duhet krahasuar me ato ekzistueset dhe duhet pozicionuar ne vendin qe i takon sipas rendit rrites ose zbrites. Nuk e di nese kjo mund te behet me nje file ashtu si behet psh me nje liste. Nese nuk mund te realizohet me nje file te vetem mund te perdoren file ndihmes.

    -------------------------------------------------------
    N bot ka 10 lloje njerzish: ata q kuptojn sistemin binar, dhe ata q nuk e kuptojn!

  12. #12
    Programues Softueresh Maska e edspace
    Antarsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Mosha
    38
    Postime
    2,573
    Cila sht arsyeja q t duket i paprshtatshm prdorimi i matricave? Gjigandi zuri n goj prcaktimin e madhsis dhe ajo sht disi me vnd por nga provat q bra, programi sht shum i shpejt edhe pr 1.000.000+ rekorde, prandaj kufizimi i matrics nuk sht problem.

    Sugjerimi q jep ti me prdorimin e skedarve nuk sht praktik sepse pr do rresht q do shtohet, ti duhet ta krahasosh me rreshtat e tjer dhe kt do ta bsh duke lexuar skedarin. Leximi i hard diskut sht shum her m i ngadalt se leximi i memorjes dhe programi do ishte tepr i ngadalt. Prandaj mnyra q kam ndjekur, lexon dhe shkruan n disk vetm njher. Krahasimi dhe renditja bhet n memorje q sht shum e shpejt.

    Duke prdorur listat zinxhir i vetmi prmirsim do ishte se programi do zinte m pak memorje. N ann tjetr, nqs do bje krahasimin n skedar ose me lista zinxhir, do duhej t shkruaje nj funksion m vete pr renditjen dhe kjo nuk sht gj e leht. Un prdora funksionin qsort q sht standart i C dhe sht shkruajtur nga ekspertt.

    Prdorimi i matricave t lejon prdorimin e treguesve [i] dhe kjo sht shum e rndsishme kur punon me rekorde q lexohen ose ndryshohen shpesh. (psh: katalogu i libraris, llogarit e bankave, faturat e shitjes, etj).

    Nj zgjidhje pak m e mir do ishin matricat dinamike, por edhe kto kan problemet e tyre.
    Ndryshuar pr her t fundit nga edspace : 03-12-2004 m 15:07
    Edi

  13. #13
    i/e regjistruar Maska e zeus
    Antarsuar
    27-05-2003
    Vendndodhja
    Ktu
    Mosha
    44
    Postime
    937
    -------------------------------------------------------------

    Besoj se detyra eshte e qarte: sa here shtoj 1 rekord duhet te pozicionohet ne vendin e duhur. Mos bej sikur nuk kupton kush eshte problemi i matricave! Nqs une deklaroj nje matric me 20 element dhe te nesermen ne mengjes dua te shtoj elementin e 21 duhet te ndryshoj 1 rresht te programit (ne mos me shume) dhe kete duhet ta bej sa here kam nevoje per me shume rekorde. Pastaj nuk me duket e arsyeshme kur duhet te shtoj nje element ne nje bashkesi (qoft kjo matrice, file apo list) elementesh te renditur te aplikoj quicksort do her! Nejse ai ka mendjen e tij e le te beje si te doje...

    P.S. Eshte thjesht nje debat konstruktiv (shpresoj) pa tone polemike!

    -------------------------------------------------------------
    N bot ka 10 lloje njerzish: ata q kuptojn sistemin binar, dhe ata q nuk e kuptojn!

  14. #14
    i/e regjistruar
    Antarsuar
    11-10-2004
    Postime
    39
    Mua me duket se perdorimi i vektoreve eshte mjaft i pershatshem per problemin ne fjale. Sic thote edhe Edi nje permiresim mund te ishte perdorimi i vektoreve dinamike. Nje permiresim tjeter mund te ishte nese dihet se sa rreshta ka skedari. Ne kete rastin e fundit mund te rezervohet aq memorie sa duhet dhe jo me teper. Kjo praktike eshte shume e perhapur. P.sh. cdo format fotosh qe njoh une (p.sh. BMP) ne fillim te skedarit ka te dhena per foton (sa pixel jane, sa ngjyra jane etj.).

    Sic e tha edhe Edi, renditja e nje skedari in-place (pa e ngarkuar te teren ne memorie) ka problemin qe eshte shume e ngadalshme. Por sigurisht qe nese nuk ke memorie te mjaftueshme ne disk do e besh (keshtu vepronin databazat dikur).
    Nje verejtje qe do beja ne lidhje me kete rast eshte qe skedari duhet te jete binar. Eshte teper e veshtire te renditesh nje skedar tekst si ai qe perdori Edi in-place.

    Nga ana tjeter nuk mendoj se eshte e sugjerueshme perdorimi i listave ne kete rast. Renditja e listave kerkon te shkruash funksione speciale dhe eshte e sigurte qe do jete shume me e ngadalshme se renditja e vektoreve.

    Nje strukture qe mund te perdoret ketu dhe qe shumekujt i kujton listat (por nuk eshte liste) eshte pema (tree). Pema eshte nje strukture ku elementet renditen gjate futjes. Futja e nje elementi ne peme kushton log time ndersa ne nje vektor kushton constant time. Por renditja e nje vektori kushton n*log(n) time kurse renditja e nje peme nuk kushton asgje sepse pema eshte e renditur.

    Do ishte interesante qe ndokush te bente eksperimente me vektore dhe peme dhe te krahasonte shpejtesine e programeve. Une besoj se vektori duhet te jete me i shpejte por edhe shpejtesia e pemes duhet te jete e pranueshme.

  15. #15
    Programues Softueresh Maska e edspace
    Antarsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Mosha
    38
    Postime
    2,573
    Gjeta kohn e lir pr t rindrtuar programin m lart me strukturn e pems q ka prmndur edhe Iliri. U mundova t shkruaja kod sa m t shpejt n mnyr q t barazohej sa m mir me kodin e shkruajtur pr matricn dhe t mund t bheshin krahasime domethnse pr t dyja strukturat.
    Jepni mendimet tuaja pr ndryshimet n kod nqs shikoni mundsi pr prmirsime.

    Sipas eksperimenteve q bra, Matrica ngelet metoda m e mir pr kt program por edhe Pema nuk sht larg. Q t dyja strukturat kan vshtirsi me renditjen e rekordeve; matrica me funksionin qsort, ndrsa pema me funksionin hedh_ne_peme. Nxjerrja e rekordeve nga pema sht m e ngadalt, dhe po ashtu edhe lirimi i memorjes. Funksioni pr t shtuar nj nyje t re n pem sht shkruajtur n menyrn prsritse (me while) sepse metoda rekursive ishte shum e ngadalt. Nxjerrja nga pema dhe lirimi i memorjes bhet n mnyrn rekursive pr t shmangur kodin e gjat me mnyrat prsritse.

    M posht jan rezultatet e t dy versioneve
    1. Matrica (array) me prmas t paracaktuar pr 1.500.000 rekorde
    2. Pema (tree) (pa kufizim pr memorjen)

    Sistemi i prdorur: Pentium 4 2.66 GHz, 256 MB memorje
    Sistemi Operativ: Windows XP SP1
    Prpiluesi: Dev-C++ 4.9.9.1 me GCC/MinGW 3.3.1

    Do ishte mir q programet t testoheshin n disa sisteme para se t nxjerrim konkluzione.

    Koha e harxhuar nga programet n baz t numrit t rekordeve
    Kodi:
    # Rekordeve	Matrica (ms)	Pema (ms)
      125.000	  470		  610
      250.000	  910		1.251
      500.000	1.790		2.600
      750.000	2.653		4.130
    1.000.000	3.500		7.000
    1.250.000	5.900		8.800
    1.500.000	7.500		11000

    Analiza e funksioneve t Matrics Statike (array)
    Kodi:
    Funksioni		% kohes
    rekord_krah		80,23
    strcmp			 9,30
    shkruaj_databaze	 5,81	
    lexo_databaze		 2,33
    fgets			 2,33
    Analiza e funksioneve t Pems
    Kodi:
    Funksioni		% kohes
    hidh_ne_peme		52,70
    shkruaj_databaze	21,96
    liro_memorje		19,26
    lexo_databaze		 3,38
    fgets			 1,42
    strcmp			 0,71
    shkruaj_databaze dhe liro_memorje jane rekursive.


    Skedart e kodit jan bashkngjitur m posht.

    Kodi n C pr Matricn
    Kodi PHP:
    // Autori: Edi, edspace ET comcast PIKE net
    // Pershkrimi: 
    //     Lexon dhe shkruan rekorde ne nje skedar sipas renditjes alfabetike
    //     Rekordi permban 2 kolona te ndara me tab 
    //
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <string.h> 
    #include <time.h>

    typedef struct rekord rekord;

    const 
    REK_MAX 1500000;  // numri maksimal per rekordet

    struct rekord // struktura e nje rekordi

        
    char personi [20];  // emri i personit deri ne 20 shkronja
        
    int num;            // numri
    }; 

    //********************************************************************
    // Hap skedarin db dhe hidh rekordet ne matricen r
    // Kthen numrin e rekordeve ne skedar ose -1 nqs nuk hapet skedari
    //
    int lexo_databaze( const char db [], rekord r);

    //********************************************************************
    // Hap skedarin db dhe shkruar nr rekorde nga matrica r
    // Kthen 0 nqs ndodh gabim
    //
    int shkruaj_databaze(const char db [], const rekord r, const size_t nr);

    //********************************************************************
    // Krahaso dy rekorde duke u bazuar mbi personin. 
    // Ky funksion perdoret per renditjen e rekordeve
    // emrat 0 konsiderohen si te pavlefshem dhe renditen ne fund 
    // Kthejme: -1 nqs r1<r2, 0 nqs r1=r2,  1 nqs r1>r1
    // A < Z < 0
    //
    int rekord_krah ( const rekord r1, const rekord r2);


    //********************************************************************
    // MAIN
    //
    int main (void

       
    clock_t koha1 clock(); 

       const 
    char db [] = "databaza.txt"// emri i skedarit ku do ruhet info
       
    const char db1 [] = "databaza2.txt"// emri i skedarit ku do ruhet info
        
       // tregues per array me rekorde
       
    rekord NULL;
       
       
    // kerkojme memorjen per REK_MAX rekorde
       
    callocREK_MAXsizeof(rekord) );
       
       if( 
    == NULL )  // nqs nuk ka memorje te mjaftueshme
       
    {
           
    printf("GABIM: Nuk ka memorje te mjaftueshme\n");   
           return 
    1;
       }       
       
       
    int nr_rekordeve lexo_databazedb);
       
       if ( 
    nr_rekordeve == -)
       {
           
    printf("GABIM: Nuk mund te hapej skedari %s\n"db);
       }
       
       
    qsort (rnr_rekordevesizeof (rekord), (const void *)rekord_krah);  
         
       if( !
    shkruaj_databazedb1rnr_rekordeve ) )
       {
           
    printf("GABIM: Nuk mund te hapej skedari %s\n"db1);
           return 
    1;
       }    
       
       
    free(r);
       
       
    printf("Koha e ekzekutimit: %ld"clock() - koha1);
       
       return 
    0;   // mbaruam


    //************************************************************************
    // Lexojme rekordet nga databaza
    //
    int lexo_databaze( const char db [], rekord r)
    {
       
    FILE inskedari// tregues per skedarin

       
    if(!(inskedari fopen(db"r"))) 
       {
           return -
    1// nqs nuk hapim dot skedarin kthejme kodin -1 (gabim)
       
    }    
        
       
    int i 0;
       
    char rresht [100];  // buffer per 1 rresht (maksimumi 100 shkronja)
      
       
    while(REK_MAX )   // marrim REK_MAX rekorde nga skedari
       
    {
           
    fgetsrresht100inskedari);   // marrim rreshtin

           // nqs eshte rreshti i fundit, dalim jashte
           
    if( feof(inskedari) || strlen(rresht) == 1) break;  
           
           
    // marrim emrin e personit qe ndahet me tab nga numri
           
    strncpyr[i].personistrtok (rresht,"\t"), 20 ); 
           
    r[i].num atoistrtok (NULL," \n") );    // marrim numrin        
           
    i++;

       }

       
    fclose(inskedari);   // mbyllim skedarin
       
       
    return i;       // numri i rekordeve qe gjetem ne skedar
    }   

    //************************************************************************
    // Shkruajme rekordet ne databaze
    //
    int shkruaj_databaze( const char db [], const rekord rsize_t nr )
    {
       
    FILE outskedari// tregues per skedarin
      
       // nqs nuk hapim dot skedarin per te shkruar
       
    if(!(outskedari fopen(db"w+"))) // 
       
    {
           return 
    0// nqs nuk hapim dot skedarin kthejme kodin 0 (gabim)
       
    }    
       
       
    int i;
       
       for (
    0nri++)  // shkruajme rekordet
       
    {    // emri dhe numri jane te ndara me tab
           
    fprintf (outskedari"%s\t%d\n"r[i].personir[i].num);
       }    
      
       
    fclose (outskedari);  // mbyllim skedarin
       
       
    return 1;
    }

    //************************************************************************
    // Krahasojme rekordet e databazes
    //  
    int rekord_krah (const rekord r1, const rekord r2)
    {
        if( 
    strcmp("\0"r1->personi) == ) return 1;  // zeron e vendosim ne fund
        
    if( strcmp("\0"r2->personi) == ) return -1// zeron e vendosim ne fund
        
    return strcmp (r1->personir2->personi);       // krahasojme dy fjale
    }

    // fund 

    Kodi n C pr Pemn
    Kodi PHP:
    // Autori: Edi, edspace ET comcast PIKE net
    // Pershkrimi: 
    //     Lexon dhe shkruan rekorde ne nje skedar sipas renditjes alfabetike
    //     Rekordi permban 2 kolona te ndara me tab 
    //
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <string.h> 
    #include <time.h> 

    typedef struct rekord rekord;
    typedef struct nyje nyje;
    typedef nyjepeme;

    struct rekord // struktura e nje rekordi

        
    char personi [20];  // emri i personit deri ne 20 shkronja
        
    int num;            // numri
    }; 

    struct nyje {
       
    rekord  data;
       
    nyje majtas;
       
    nyje djathtas;
    };

    //********************************************************************
    // Hap skedarin db dhe kthe pemen me rekorde
    //
    peme lexo_databaze( const char db []);

    //********************************************************************
    // Shkruaj rekordet e pemes p ne db
    //
    void shkruaj_databaze(FILE dbpeme p);

    //********************************************************************
    // Hidh/ngjit nyjen n ne pemen p sipas rendit alfabetik
    //
    void hidh_ne_pemenyje npeme  p);

    //********************************************************************
    // liro memorjen e nje peme ne menyren rekursive 
    // liro degen majtas, liro degen djathtas, liro renjen
    //
    void liro_memorje(peme p);

        
    //********************************************************************
    // MAIN
    //
    int main (void

       
    clock_t koha1 clock(); 
       
       const 
    char db [] = "databaza.txt"// emri i skedarit ku do ruhet info
       
    const char db1 [] = "databaza2.txt"// emri i skedarit ku do ruhet info
        
       
    peme p NULL;

       
    lexo_databazedb );
       
       if( 
    == NULL )  
       {
           
    printf("GABIM: Nuk mund te lexonim databazen\n");   
           return 
    1;
       }
       
       
    FILE outskedari// tregues per skedarin
       
       
    if(!(outskedari fopen(db1"w+"))) // 
       
    {
           
    printf("GABIM: Nuk mund te hapej skedari %s\n"db1);
           return 
    1;
       }    
       
       
    shkruaj_databaze(outskedarip);
       
       
    fclose(outskedari);
       
       
    liro_memorje(p);
       
       
    printf("Koha e ekzekutimit: %ld"clock() - koha1);
       
       return 
    0;   // mbaruam


    //************************************************************************
    // Lexojme rekordet nga databaza
    //
    peme lexo_databaze( const char db [] )
    {
       
    FILE inskedari// tregues per skedarin
       
    char rresht [100];  // buffer per 1 rresht (maksimumi 100 shkronja)

       
    if(!(inskedari fopen(db"r"))) 
       {
           
    printf("Nuk mund te hapej skedari %s\n"db);
           return 
    NULL
       }    
       
       
    // ************* formojme renjen e pemes ***********************
       // Ky bllok eshte ndare nga While per te shmangur nje kusht (if) brenda while
       //
       
    if( fgetsrresht100inskedari) == NULL )
       {
           
    fclose(inskedari);
           return 
    NULL;
       }    
       if( 
    strlen(rresht) == )
       {
           
    fclose(inskedari);
           return 
    NULL;
       }    
       
       
    peme p calloc(1sizeof(nyje) );
        
       
    // assert(p!=NULL);
       
    strncpyp->data.personistrtok (rresht"\t"), 20 ); 
       
    p->data.num atoistrtok (NULL" \n") );    // marrim numrin        
       
    p->majtas NULL;
       
    p->djathtas NULL;
       
       
    nyje NULL;
       
       
    // ************* formojme nyjet e tjera ***********************
       //
       
    while( fgetsrresht100inskedari)!= NULL )   
       {
           
    // nqs eshte rreshti i fundit, dalim jashte
           
    if( strlen(rresht) == ) break;  
           
           
    calloc(1sizeof(nyje) );
           
           if( 
    == NULL 
           {
               
    liro_memorje);
               
    fclose(inskedari);
               return 
    NULL;
           }        
           
           
    // marrim emrin e personit qe ndahet me tab nga numri
           
    strncpyn->data.personistrtok (rresht"\t"), 20 ); 
           
    n->data.num atoistrtok (NULL" \n") );    // marrim numrin        
           
    n->majtas NULL;
           
    n->djathtas NULL;
           
           
    hidh_ne_peme(np);
           
       }
       
       
    fclose(inskedari);   // mbyllim skedarin
       
       
    return p// kthejme pemen
    }   

    //************************************************************************
    // Shkruaj databazen ne db nga pema p sipas renditjes alfabetike
    //
    void shkruaj_databaze (FILEdbpeme p)
    {
       if (
    != NULL
       {
          
    shkruaj_databaze(dbp->majtas);
          
    fprintf(db"%s\t%d\n"p->data.personip->data.num);
          
    shkruaj_databaze(dbp->djathtas);
       }
    }

    //************************************************************************
    // Hidh/Ngjit nyjen n ne pemen p
    // Programuar me perseritje sepse menyra rekursive eshte me e ngadalte
    //
    void hidh_ne_pemenyje npeme p)
    {     
       while(
    1)
       {
           if( 
    strcmpn->data.personip->data.personi ) <= )
           {
               if( 
    p->majtas == NULL )
               {
                   
    p->majtas n;
                   return;
               }    
               else 
    p->majtas;
           }
           else 
           {
               if( 
    p->djathtas == NULL )
               {
                   
    p->djathtas n;
                   return;
               }    
               else 
    p->djathtas;
           }
       }    
    }    


    //************************************************************************
    // Liro memorjen e pemes p
    //
    void liro_memorje(peme p)
    {
        if( 
    == NULL ) return; // fakultative sepse edhe free(null) ben return 
        
    if(p->majtas != NULLliro_memorje(p->majtas);
        if(
    p->djathtas != NULLliro_memorje(p->djathtas);
        
        
    free(p);
        
    NULL;  // fakultative
    }

    // fund 
    Fotografit e Bashkngjitura Fotografit e Bashkngjitura  
    Skedart e Bashkngjitur Skedart e Bashkngjitur
    Ndryshuar pr her t fundit nga edspace : 08-12-2004 m 14:53
    Edi

  16. #16
    63n700 Maska e werewolf
    Antarsuar
    03-10-2003
    Vendndodhja
    Rome
    Mosha
    38
    Postime
    164
    cool!
    megjithate une qendroj me mendimin se nuk duhet perdorur matrica kur nuk te jepet dimensioni i inputit, pasi sic eshte shkruajtur me lart, nese e ke matricen me 100 rekorde, dhe kur arrin ne fud shef qe duhet te shkruaj 101 , ca do behet?????? do ndryshohet dimensioni i matrices, rikompilohet programi dhe do shkruhen prape 101 rekordet???
    nje nga gjerat qe me kane ngel ne mend ne keto vite eshte se:" Kur nuk e di dimensionin e inputit, DUHET perdorur struktura dinamike(mgjs me vektor & matrice mund te punoj me shpejt programi)". Te dyja kane te mirat dhe te keqijat e tyre........ne kete rast me mire te perdoren pemet.

    hej edi, nuk do ishte me mire qe rekordet, te hidheshin ne peme kur i merr ne input dhe ne fund te shkruheshin ne file? Keshtu i beje All in 1 ?
    . Je madh plako, ke shume durim.....!
    po mos te kisha nje thes me provime dhe projektet(3 projekte), mbase do kisha bere ndo1 code.....
    bye
    Ndryshuar pr her t fundit nga werewolf : 08-12-2004 m 16:58
    The truth may be out there, but lies are inside your head.

  17. #17
    Programues Softueresh Maska e edspace
    Antarsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Mosha
    38
    Postime
    2,573
    Pr eksperimentet q bra un, kufizimi i matrics ishte 1 milion e 500 mij. Kur matrica mund t ket prmasa t tilla nuk sht nevoja ta ndryshosh programin sepse kufizime t tilla nuk arrihen, ose mund t arrihen shum shum rrall. Nj skedar me 1.500.000 rekorde sht rreth 30MB. Skedar t till bhen t pa menaxhueshm dhe sht m mir t ndahen n dy tre skedar. Prandaj edhe programin nuk shte nevoja ta ndryshosh e prpilosh nga fillimi por mjafton t ndash t dhnat n dy skedar.

    Matrica vrtet ka kufizim prmasat, por si tregohet dhe nga rezultatet, pema sht m e ngadalt, edhe pse pun sekondash.


    N lidhje me leximin e rekordeve, ato lexohen dhe hidhen n pem nj nga e nj. Funksioni lexo_databaze lexon rreshtin, formon nyjen, pastaj e hedh nyjen n pem. Kt gj e prsrit deri sa gjen fundin e skedarit ose kompjuteri nuk ka m memorje (calloc = NULL).

    Nuk e kuptova sugjerimin tnd sepse un at q thua ti kam br.

    Suksese me provimet!
    Edi

  18. #18
    63n700 Maska e werewolf
    Antarsuar
    03-10-2003
    Vendndodhja
    Rome
    Mosha
    38
    Postime
    164
    / Hap skedarin db dhe hidh rekordet ne matricen r
    // Kthen numrin e rekordeve ne skedar ose -1 nqs nuk hapet skedari
    //
    int lexo_databaze( const char db [], struct rekord * r);
    per kete e kisha fjalen
    Ti e merr nga skedari inputin (rekordet te pa renditur) apo jo?
    po sikur ti merrje nga perdoruesi dhe ti mbaje te renditura ne peme ose matrice dhe ne fund ti shkruaje ne peme???
    ushtrimi nuk thoshte te merrje skedarin dhe ta rendisje, por ta mbaje te renditur( rekordin e ri qe merje ta vije ne vendin e duhur), par do ishte me mire qe ne file ta shkruaje vetem ne fund, pasi te kishte mbaruar inputi nga perdoruesi, keshtu do evitoje te perdorje funksionin lexo database, por beje nje funksion tjeter qe ti merrte rekordet nga perdoruesi dhe ti vinte ne vendin e duhur

    pse te perdoret nje matrice aq e madhe kur mund te duhen te futen vetem 2 rekorde psh?????
    zgjidhja me matricen mund te jete(pak) eficent nga ana temporale(koha e ekzekutimitte programit) se ai me pemet, por per hapesire le shume per te deshiruar....



    rofsh!
    Ndryshuar pr her t fundit nga werewolf : 08-12-2004 m 19:28
    The truth may be out there, but lies are inside your head.

  19. #19
    i/e regjistruar
    Antarsuar
    11-10-2004
    Postime
    39
    Edi me pelqen shume analiza jote. Urime.
    Werewolf, nuk arrij dot ta kuptoj se cfare do te thuash. A mund te shkruash pak kod qe te qartesohemi?

  20. #20
    63n700 Maska e werewolf
    Antarsuar
    03-10-2003
    Vendndodhja
    Rome
    Mosha
    38
    Postime
    164
    kerkesa e ushtrimit ishte ti merrje rekordet dhe ti vije ne nje file te ordinuara, prandaj i thashe edit qe funksionin lexo_database ta shkruante ne menyre qe ta merte intputin nga perdoruesi, dhe jo nga skedari, jo se kishte ndo1 gje kjo, nuk ndryshon gje, por i pergjigjet me sakte kerkeses(qe thote ta lexoje rekordin dhe ta hedhi ne file te ordinuar).
    dhe tjeter thashe qe 'me pelqen' me shume zgjidhja me peme, se ka komplesitet me te ulet ne lidhje me hapesiren(harxhon me pak memorje ne disa raste, dhe eshte e pershtatshme ne rastet kur nuk dime dimensionin e inputit)

    Kodi eshte shume OK, dhe analiza! Nejse.....
    bye
    The truth may be out there, but lies are inside your head.

Faqja 0 prej 3 FillimFillim 12 FunditFundit

Tema t Ngjashme

  1. Strukturat paralele t Serbiis
    Nga Sabriu n forumin shtja kombtare
    Prgjigje: 1
    Postimi i Fundit: 20-03-2009, 04:27
  2. Listat e Zgjedhesve
    Nga shefqeti11 n forumin Problematika shqiptare
    Prgjigje: 0
    Postimi i Fundit: 14-02-2007, 06:14
  3. Zgjidhet kriza elektorale, arrihet marveshja n zyrn e presidentit Moisiu
    Nga Xhuxh Xhumaku n forumin Tema e shtypit t dits
    Prgjigje: 312
    Postimi i Fundit: 03-02-2007, 14:05
  4. Kuvendi q na la trashgim ADN-n e Dushkut
    Nga Kosovari_78_Ca n forumin Tema e shtypit t dits
    Prgjigje: 1
    Postimi i Fundit: 22-05-2005, 01:24

Ruaj Lidhjet

Regullat e Postimit

  • Ju nuk mund t hapni tema t reja.
  • Ju nuk mund t postoni n tema.
  • Ju nuk mund t bashkngjitni skedar.
  • Ju nuk mund t ndryshoni postimet tuaja.
  •