Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Paluks abi C keeles mullsortimisega märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
taurib
HV vaatleja

liitunud: 26.08.2010




sõnum 16.12.2012 17:03:04 Paluks abi C keeles mullsortimisega vasta tsitaadiga

Tere

Mul probleem selline, et mul vaja siin varsti kursusetöö vaja ära esitada, kuid ma olen siin mingi probleemi taga kinni, millest ma väga aru ei saa, miks ta sedasi käitub hetkel. Nimelt Pärast seda, kui see läheb 2. korda mullsoritma, tekitab see mingisuguse segaduse ja ta ei oska enam võrrelda Ajakulu ja AjakuluV omavahel.

See, mis on valik[i] peaks valima sealt kõige väiksema ajakulu. Samuti tõstab ta Ajakulu[i][j] ja [i+1][j] sees millegipärast numbreid ümber, kuid peaks ainult "j" siseselt neid tegema

Ette tänades icon_smile.gif

Kood selline:

#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>


int main()
{
   double ajakulu[2][4];      //Erinevate olude ajakulu
   double ajakuluV[2][4];
   double ajutine;
   int valik[7];                //Milline valik tehtud sai
   int i;
   int j;

      
      ajakulu[0][0] = 10;
      ajakulu[0][1] = 5;
      ajakulu[0][2] = 7;
      ajakulu[1][0] = 15;
      ajakulu[1][1] = 18;
      ajakulu[1][2] = 9;
      /*
      ajakuluV[0][0] = 10;
      ajakuluV[0][1] = 5;
      ajakuluV[0][2] = 7;
      */
      
      for (i = 0; i < 2; i++)
      {
         for (j = 0; j < 3; j++)
         {
            ajakuluV[i][j] = ajakulu[i][j];
         }
      }
      
      printf("%lg %lg %lg", ajakuluV[0][0], ajakuluV[0][1], ajakuluV[0][2]);  //1. masiivi ajakulu (kontroll)
      printf("\n");
      printf("%lg %lg %lg", ajakuluV[1][0], ajakuluV[1][1], ajakuluV[1][2]);  //2. masiivi ajakulu (kontroll)
      printf("\n");
      
for (i = 0; i < 2; i++)    //Mullsort
      {
        for (j = 0; j < 3; j++)
            {
               if (ajakuluV[i][j] < ajakuluV[i][j+1])
                  {
                     ajutine = ajakuluV[i][j];
                     ajakuluV[i][j] = ajakuluV[i][j+1];
                     ajakuluV[i][j+1] = ajutine;
                  }
            }
         
             if (ajakuluV[i][2] == ajakulu[i][0]){valik[i] = 0;}   //Leiab valiku väärtuse
         else if (ajakuluV[i][2] == ajakulu[i][1]){valik[i] = 1;}
         else if (ajakuluV[i][2] == ajakulu[i][2]){valik[i] = 2;}
     }
    
     printf("%lg %lg %lg, %d", ajakuluV[0][0], ajakuluV[0][1], ajakuluV[0][2], valik[0]);printf("\n");  //1. massiivi ajakulu pärast mullsorti
     printf("%lg %lg %lg, %d", ajakuluV[1][0], ajakuluV[1][1], ajakuluV[1][2], valik[1]);  //2. masiivi ajakulu pärast mullsorti
    
     return 0;
}


Pilt sellest, kuidas see mul töötab, esimesed 2 rida on kontroll ja teised 2 rida ongi see koht, kus ta vahetab erinevate tasemete vahel neid numbreid millegi pärast, ma ei tea, milles probleem icon_sad.gif
3. ja 4. reas olevad 4. numbrid näitavad Ajakulu[i][j] kõige väiksemat numberit, kas 0. 1. või 2.


viimati muutis taurib 16.12.2012 19:31:28, muudetud 1 kord
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 16.12.2012 18:49:03 vasta tsitaadiga

Üks viga on kindlasti selles, et jooksed for tsüklis üle massiivide piiride (j=2 puhul ajakuluV[i][j+1] on ajakuluV[i][3]).
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
pota
HV vaatleja
pota

liitunud: 09.12.2005




sõnum 16.12.2012 19:25:55 vasta tsitaadiga

Lisaks sellele pead sa sorteerima kaks korda:

c++:
  1.   for (i = 0; i < 2; i++)    //Mullsort
  2.   {
  3.     for (k = 0; k < 2; k++)
  4.     {
  5.       for (j = 0; j < 2; j++)
  6.       {
tagasi üles
vaata kasutaja infot saada privaatsõnum
taurib
HV vaatleja

liitunud: 26.08.2010




sõnum 16.12.2012 19:41:47 vasta tsitaadiga

Väga hea, see, et mul teine piir peaks ühevõrra suurem olema, lahendas nii mõndagi ära, tänud selle eest icon_smile.gif

Kuid miks ma pean seda mullsorti kolme tsüklina jooksutama?

Samuti on mul tunne, et see, kuidas ma neid valikuid teha üritan, ei ole just kõige targem viis. Selles väikeses tsüklis see küll töötab, kuid siis kui mul seda 7 korda teeb, jookseb see lolliks :/
Sest seal tuleb mul seda sama if ja else if koodiosa muutes selline viga: "Bus error (core dumped)"
tagasi üles
vaata kasutaja infot saada privaatsõnum
pota
HV vaatleja
pota

liitunud: 09.12.2005




sõnum 16.12.2012 19:51:27 vasta tsitaadiga

taurib kirjutas:
Kuid miks ma pean seda mullsorti kolme tsüklina jooksutama?

pane näiteks
c++:
  1. ajakulu[1][2] = 100;

ja vaata mis juhtub sorteerimisega...
tagasi üles
vaata kasutaja infot saada privaatsõnum
taurib
HV vaatleja

liitunud: 26.08.2010




sõnum 16.12.2012 20:14:00 vasta tsitaadiga

Nüüd on asi sedasi, et ma sain selle asja kõik ilusti jooksma, probleem oli suures koodis jagamisega, kuid parandasin selle ära. Ja see, et siin soovitati masiivide suurusi tõsta oli ka väga hea idee icon_smile.gif

pota kirjutas:
taurib kirjutas:
Kuid miks ma pean seda mullsorti kolme tsüklina jooksutama?

pane näiteks
c++:
  1. ajakulu[1][2] = 100;

ja vaata mis juhtub sorteerimisega...


Ma ei saa siiski pihta sellele, et mis see "k" peaks seal olema? ISegi, kui ma panen selle väärtuseks 100, sordib see ikka ilusti ära :I
tagasi üles
vaata kasutaja infot saada privaatsõnum
pota
HV vaatleja
pota

liitunud: 09.12.2005




sõnum 16.12.2012 22:56:52 vasta tsitaadiga

c++:
  1.  
  2.  const int nRows = 10;
  3.  const int nColumns = 10;
  4.  int nDoubleSubArray[nRows][nColumns];
  5.  int nTemp;
  6.  
  7.  for (int nRowCounter = 0; nRowCounter < nRows; nRowCounter++) // 1 - liigub realt reale
  8.   {
  9.    for (int nColumnsPassed = 0; nColumnsPassed < nColumns - 1; nColumnsPassed++) // 2 - liigub veerust veergu
  10.     {
  11.      for (int nColumnCounter = 0; nColumnCounter < nColumns - 1; nColumnCounter++) // 3 - vahetab veergude väärtused
  12.       {
  13.        if (nDoubleSubArray[nRowCounter][nColumnCounter] > nDoubleSubArray[nRowCounter][nColumnCounter + 1])
  14.         {
  15.          nTemp = nDoubleSubArray[nRowCounter][nColumnCounter];
  16.          nDoubleSubArray[nRowCounter][nColumnCounter] = nDoubleSubArray[nRowCounter][nColumnCounter + 1];
  17.          nDoubleSubArray[nRowCounter][nColumnCounter + 1] = nTemp;
  18.         }
  19.       }
  20.     }
  21.   }
  22.  
tagasi üles
vaata kasutaja infot saada privaatsõnum
taurib
HV vaatleja

liitunud: 26.08.2010




sõnum 17.12.2012 01:14:06 vasta tsitaadiga

Sain selle programmi valmis, tänud teile vastuste eest, pota, sinu seda asja ma natuke veel uurin, kuid ma sellest teemast siin minema nüüd. icon_smile.gif

Kuid pota, see 2x mullsort töötab igati hästi, kui on tegemis [x][y]. Seda on pigem nagu siis vaja, kui on [x][y][z], et see sordiks kõiki kolme. Lihtsalt minu puhul oli siin see probleem, et see jooksis piiridest välja ja tuli neid suurendada, et see ilusti töötaks icon_smile.gif
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Paluks abi C keeles mullsortimisega
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.