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

    C - Strukturat e të dhënave (Matricat, Listat, Pemët)

    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
    Anëtarësuar
    07-06-2002
    Vendndodhja
    Canada
    Postime
    678
    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
    Anëtarësuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Postime
    2,565
    Më duket se problemi qëndron 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 për 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
    Anëtarësuar
    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
    Anëtarësuar
    03-10-2003
    Vendndodhja
    Rome
    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
    Anëtarësuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Postime
    2,565
    Shiko programin më poshtë.
    - Lexon një skedar me dy kollona të ndara me tab '\t'.
    - I hedh rekordet në një matricë (array)
    - Rendit matricën sipas alfabetit
    - Shkruan përsëri 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 dëshirës duke ndryshuar variablën REK_MAX.

    Kam komentuar gjithçka por mos nguro të pyesësh.
    Skedari i bashkëngjitur ZIP ka kodin main.c dhe databaza.txt.

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

    Ja një shëmbull i skedarit para se të përdoret programi:

    Kodi:
    Pashko Vasa	354
    Gjergj Fishta	614
    Ndre Mjeda	459
    Andon Zako Çajupi	130
    Naim Frashëri	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 Frashëri	755
    Ndre Mjeda	459
    Pashko Vasa	354
    Skedarët e Bashkëngjitur Skedarët e Bashkëngjitur
    Ndryshuar për herë të fundit nga edspace : 02-12-2004 më 22:45
    Edi

  8. #8
    i/e regjistruar
    Anëtarësuar
    27-09-2002
    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
    Anëtarësuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Postime
    2,565
    Gjithnjë ka një kufizim sepse kompjuteri nuk ka memorje pa kufi. Çfarëdo strukture të përdorë për ruajtjen e informacionit, qoftë kjo me matrica, vektorë, hash, kapica, lista zinxhir, etj, gjithnjë do ketë një limit.

    30 që kam vënë unë mund të ndryshohet në 3000, ose 30,000 për aq kohë sa sistemi ka memorje të mjaftueshme. Ky numër është për numrin maksimal të rekordeve, por programi lexon dhe shkruan vetëm rekordet që kanë informacion dhe jo ato që janë bosh.

    Nqs skedari ka vetëm 6 rekorde si në shëmbullin më lart, atëherë 24 rekordet e tjera janë bosh dhe programi nuk i shkruan.

    Zgjidhja tjetër për të kursyer memorje (jo për të hequr kufizimet) është me matrica dinamike por ka komplikime të tjera.

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

  10. #10
    Programues Softueresh Maska e edspace
    Anëtarësuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Postime
    2,565
    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 tjetër dhe bëra 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 brënda 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 tënd.
    Edi

Faqja 0 prej 6 FillimFillim 12 ... FunditFundit

Tema të Ngjashme

  1. Strukturat paralele të Serbiisë
    Nga Sabriu në forumin Çështja kombëtare
    Përgjigje: 1
    Postimi i Fundit: 20-03-2009, 04:27
  2. Listat e Zgjedhesve
    Nga shefqeti11 në forumin Problematika shqiptare
    Përgjigje: 0
    Postimi i Fundit: 14-02-2007, 06:14
  3. Zgjidhet kriza elektorale, arrihet marëveshja në zyrën e presidentit Moisiu
    Nga Xhuxh Xhumaku në forumin Tema e shtypit të ditës
    Përgjigje: 312
    Postimi i Fundit: 03-02-2007, 14:05
  4. Kuvendi që na la trashëgim ADN-në e Dushkut
    Nga Kosovari_78_Ca në forumin Tema e shtypit të ditës
    Përgjigje: 1
    Postimi i Fundit: 22-05-2005, 01:24

Regullat e Postimit

  • Ju nuk mund të hapni tema të reja.
  • Ju nuk mund të postoni në tema.
  • Ju nuk mund të bashkëngjitni skedarë.
  • Ju nuk mund të ndryshoni postimet tuaja.
  •