vektor szétválogatása önmagában

Kezdőlap Fórumok Programozás vektor szétválogatása önmagában

8 bejegyzés megtekintése - 1-8 / 8
  • Szerző
    Bejegyzés
  • #1986262
    Leslieman
    Felhasználó

      Szia!

      A paroskeres() funkcióban túlszalad a while ciklus a tömbön. Mivel hossz=10 és a while feltétele, hogy ( i <= hossz ), ezért megvizsgálja a tomb[10]-et is, ami már szemét. 🙂
      (A tömb elemei jelen esetben 0-tól 9-ig indexelhetõk.)
      Szerintem módosítsd így:

      Code:
      int paroskeres(int *tomb,int hossz, int kezdoertek)
      {
         int i=kezdoertek;
         while(( i < hossz ) && ( tomb[i] % 2 == 1 ))    {        i++;    }    if( i < hossz )        return(i);    else        return(kezdoertek); }
      #1986263
      emperor
      Felhasználó

        Szia!

        A paroskeres() funkcióban túlszalad a while ciklus a tömbön. Mivel hossz=10 és a while feltétele, hogy ( i <= hossz ), ezért megvizsgálja a tomb[10]-et is, ami már szemét.  🙂
        (A tömb elemei jelen esetben 0-tól 9-ig indexelhetõk.)
        Szerintem módosítsd így:

        Code:
        int paroskeres(int *tomb,int hossz, int kezdoertek)
        {
           int i=kezdoertek;
           while(( i < hossz ) && ( tomb[i] % 2 == 1 ))    {        i++;    }    if( i < hossz )        return(i);    else        return(kezdoertek); }

        [align=right][snapback]99229[/snapback][/align]

        uhh, tényleg… 🙂 nagyon köszi :))
        általában ilyen kis apróságokon szoktam elakadni, ez most sem volt másképp 🙂
        thx

        #1986264
        Leslieman
        Felhasználó

          Egyébkét az algoritmus nem túl hatékony. Persze nem 10 elemû tömböknél, hanem ha ‘élesben’ kellene használni. 😉
          Megpróbálok egy jobbat alkotni, lagalább én is gyakorlok.

          #1986265
          emperor
          Felhasználó

            Egyébkét az algoritmus nem túl hatékony. Persze nem 10 elemû tömböknél, hanem ha ‘élesben’ kellene használni.  😉
            Megpróbálok egy jobbat alkotni, lagalább én is gyakorlok.
            [align=right][snapback]99233[/snapback][/align]

            tudom 🙂
            gondolkozok én is egyen 🙂 ha rájövök leírom és összehasonlítjuk, a Tieddel 😉

            #1986266
            emperor
            Felhasználó

              most hirtelen csak az jutott eszembe, hogy egyszerûen megkeresem az elsõ páros elemet, majd az elsõ páratlan elemet, és kicserélem õket… bár nem biztos, hogy ez hatékonyabb
              vmint melyik hatékonyabb, ha pl több változót használok, kevesebb feltétel kiértékeléssel, vagy az ha több feltételt kevesebb változóval?

              #1986267
              Leslieman
              Felhasználó
                Code:
                #include
                #include

                void parosvalogat(int *tomb,int hossz)
                {
                   //a tomb paros szamait alulra csoportositja (nem rendezi), a paratlanokat felulre
                   int i, a, f, sw;
                   if (hossz>=2)
                   {
                       a = 0;
                       f = hossz – 1;
                       do
                       {
                           while (aa && (tomb[f] & 1) == 1)    //addig lep, amig felul paratlanok vannak
                               f–;
                           if (a!=f)
                           {
                               //ha meg nem ertek el egymashoz ==> csere
                               sw=tomb[a];
                               tomb[a]=tomb[f];
                               tomb[f]=sw;
                           }
                       } while (a!=f);
                   }
                }

                int main()
                {
                   int A[]={0,1,2,3,4,5,6,7,8,9};
                   int elemszam = sizeof(A)/sizeof(int);
                   int i;
                   
                   printf(„Erdeti: „);
                   for(i=0;i

                Közben megcsináltam. Aztán látom, ilyesmire gondoltál te is. Ez alulról felfelé lépked amíg páros van, és felülrõl lefelé amíg ott páratlan, és megcseréli õket ha kell.

                Az algoritmus attól nem volt hatékony, hogy minidg végigmentél a tömbön az aktuális elemtõl a legvégéig, majd léptél egyet, és megint a végéig, stb.

                #1986268
                emperor
                Felhasználó

                  jaja, vmi ilyesmire gondoltam.. bár nem ebben a formában, de ahogy elnézem ez a kód elég logikus amit írtál… ezt a hatékonyságot még csak most kezdem kapizsgálni… így látva ezt a kódot, vmivel tisztább a dolog 🙂

                  #1877182
                  csaba
                  Felhasználó

                    üdv

                    kaptunk ma a suliban egy feladatot, ami a következõképpen szól: adott egy N elemû vektor, s a vektor elemein értelmezett T tulajdonság… szét kell válogatni a tulajdonságfüggvény szerint az elemeket, de a vektoron belül
                    nos az én esetemben 10 elemû a tömb és a T az páros vagy sem… meg is csináltam az algoritmus, ami sztem jó
                    próbaképp lekódoltam c-ben, hogy mûxik-e, nos mûködik is de vmiért tullépi a tömb indexelését…
                    megmutatom a kódot és a kimenetet is, az többet elárul…

                    Code:
                    #include

                    int paroskeres(int *tomb,int hossz, int kezdoertek){
                    int i=kezdoertek;
                    while(( i <= hossz ) && ( tomb[i] % 2 == 1 )){  i++; } if( i <= hossz ) return(i); else return(kezdoertek); } main(){ int A[10]={0,1,2,3,4,5,6,7,8,9}; int s=0,i,j; printf("Erdeti: "); for(i=0;i<10;i++) printf("%d ", A[i]); for( i=0;i<10;i++ ){  j = paroskeres( A , 10 , i );  if( A[i] % 2 == 1 ){   s=A[i];   A[i]=A[j];   A[j]=s;  } } printf("nValogatott: "); for(i=0;i<10;i++) printf("%d ", A[i]); printf("n"); }

                    kimenet:
                    Erdeti: 0 1 2 3 4 5 6 7 8 9
                    Valogatott: 0 2 4 6 8 -1073743224 3 7 1 9

                    nos igen zavaró az a -1073743224 :))
                    bocsi, ha nem teljesen olvasható a kód, de még kezdõ vok 😉

                    tudja valaki, hogy tudnám orvosolni a problémát?

                  8 bejegyzés megtekintése - 1-8 / 8
                  • Be kell jelentkezni a hozzászóláshoz.