Kezdőoldal » Számítástechnika » Programozás » Hol a hiba a programban? C...

Hol a hiba a programban? C nyelvről lenne szó.

Figyelt kérdés

A program célja egy tömb elemeit rendezni. Kétféle rendezést ismerek, a buborék-és gyorsrendezést, úgy tudom, hogy van más is, de puszta kíváncsiságból gondoltam, írok egy saját algoritmust. Ez a következő elven működik: A tömbben megkeresi a legkisebb ill. legnagyobb elemet, ezeket a legelső ill. legutolsó helyre viszi, majd megismétli, ám ezúttal már nem dolgozik a két szélső elemmel. Harmadszor már a széltől számított 2-2 elem nem játszik stb. Ezt elvégzi feleannyiszor, mint ahány elemű a tömb, és így elméletileg minden elem a helyére kerül. Ha páratlan elemszámú tömbről van szó, akkor az elemszám felét lefele kerekíti, és elméletileg így is rendezett kéne legyen. Megjegyzem, hogy mérjem, milyen hatékony a megoldás, beépítettem egy időmérőt is.


A probléma a következő: A program a legnagyobb elemet nem viszi hátra, és a legkisebb elem értékét nem kicseréli a legelső helyen levővel, hanem csak beírja az értékét az első helyre, így elvesztődik az az érték, amit ott tároltam. A kicserélő függvényt külön ellenőriztem, jól működik. Különös módon, az utolsó helyre sokszor bekerül elemnek a 2293616, egy nem kigenerált szám, ami állandó.


Itt a kód, nem a legszebb, de olvasható, és nem tudom, mi okozhatja a problémát.


[link]


Ami a szépségét illeti, ezen tervezek javítani, ám először szeretném működőképessé tenni. A válaszokat köszönöm előre is.


2014. júl. 30. 13:04
1 2
 1/11 iostream ***** válasza:

"felcserel(&min, &t[0+k])"


Itt a min változó címét adod át, ami nem a tömbben van, persze, hogy össze-vissza cserélget. A min vagy legyen az index, és akkor &t[min], vagy legyen pointer, és akkor fentebb min = &t[j]; és a felcserélnél csak simán átadod.

Ugyanez a maxra is.


Azt most hírtelen nem látom, honnan jöhet a memóriaszemét, szóval lehet más probléma is van.

2014. júl. 30. 13:34
Hasznos számodra ez a válasz?
 2/11 anonim ***** válasza:

Ami elsőre szemet szúrt:

Minden kör elején "nullázni" kéne a min és a max értékét (=beállítani az AKTUÁLIS rész első elemére). Ezt csak a legelején, a ciklus előtt teszed meg a 0 indexű elemmel. Így szerintem végig az marad a min és a max...

2014. júl. 30. 13:35
Hasznos számodra ez a válasz?
 3/11 A kérdező kommentje:

iostream ill. #2: Köszönöm a válaszokat, az említett problémát sikerült kiküszöbölni, ám valamiért a rendezés még mindig nem teljes, eleinte nagyon jól megy, sőt, van, hogy végigfut gond nélkül, máskor viszont megbolondul, és összevissza dolgozik. A kódon úgy változtattam, hogy ha talált új maximumot/minimumot, akkor az elem indexét eltárolja, és később felcseréli az indexnek megfelelő elemet a legkisebbel. A fura, hogy a minimumokkal nicnsen semmi baj, viszont a maximumnál van, hogy felcserél valamiket amiket nem kéne, továbbá, megpróbáltam kiíratni a max és min értékeket, és a max időnként ismét felveszi ugyanezt a "memóriaszemét" értéket. Először arra gondoltam, hogy a kelleténél eggyel több lépésszámot adok egy for ciklusnak, és ezért olyan memóriarészlettel dolgozik, ami nem az övé, de ilyenkor a Win megállítja a program futását, úgy tudom. Íme az új kódrészlet, csak a rendezést másolom be, mert csak ott változtattam + a két új változó bejelentése.


[link]

2014. júl. 30. 15:01
 4/11 anonim ***** válasza:
C-ben az oprendszer addig nem "állít meg" semmit, amíg nagyon csúnyán el nem mászkálsz a memóriában, simán túlindexelhetsz jó néhány elemmel.
2014. júl. 30. 15:03
Hasznos számodra ez a válasz?
 5/11 anonim ***** válasza:
100%

Ahogy ezt meg is teszed:

"for (j=(0+k);j<=(ARR-k);j++)"

j=0-ra j ARR-ig megy, ami már nagyobb, mint az utolsó index.

2014. júl. 30. 15:11
Hasznos számodra ez a válasz?
 6/11 anonim ***** válasza:

Ez megint nem jó szerintem.

Az előző elképzelés jó volt: kezdetben a min és a max az 1. elem, és a 2. elemtől keresel újat.

Ugye nem véletlenül hívják maximum KIVÁLASZTÁSnak azt a bizonyos programozási tételt, mivel MINDIG van maximum ÉS minimum, HA legalább 1 elem van.

És tényleg az indexeket kéne eltenni, de akkor azokat kéne újrainicializálni (kinullázni)!


Tehát én így csinálnám:


// k. kör:

min=k;

max=k;

for (j=k+1; j<ARR-k; ++j) {

if (t[j] < t[min]) min=j;

if (t[j] > t[max]) max=j;

}


// kell még:

// csere(t[k],t[min])

// csere(t[ARR-k-1],t[max])


Másik észrevétel: Szerintem a k és az i mindig egyenlő... Tehát felesleges 2 változó.


Most hogy jobban belenéztem, a t[ARR-k]-t cseréled, de az az első körben (k=0) esetén túlindexelés!

2014. júl. 30. 15:14
Hasznos számodra ez a válasz?
 7/11 anonim ***** válasza:
100%

Itt a teljesen agyatlan cserélgetésekkel van a probléma.

Nekem pl kijött ilyen példa:

A generalt tomb:

6, 16, 10, 11, 13, 9, 1, 11, 2, 14,

A reszben rendezett tomb:

1, 14, 10, 11, 13, 9, 6, 11, 2, 16,

A reszben rendezett tomb:

1, 14, 10, 11, 13, 9, 6, 11, 2, 16,


Itt jól látszik, hogy az első lépés után a max pont a második elem, a min pedig pont az utolsó előtti.

Emiatt az történik, hogy először megcseréli őket, majd megint megcseréli, vissza az eredeti, rendezetlen állapotra.

2014. júl. 30. 15:30
Hasznos számodra ez a válasz?
 8/11 A kérdező kommentje:
Hálásan köszöönm a válaszokat, sikerült ezek alapján, ha nem is túl szépen, de működőképesen megoldani. Akit érdekel, itt van a kód, amely még mindig kevesebb időt igényel, mint a buborékrendezés. Ha esetleg valaki igazán kedves, kaphatnék ötleteket ahhoz, hogy hogy szabaduljak meg a Goto parancstól? Elég csúnya, de sajnos semmi jobbat nem tudtam kitalálni. Ezután persze következik a szépítés, függvényekbe rendezés stb.
2014. júl. 30. 20:14
 9/11 anonim ***** válasza:
Lemaradt a link.
2014. júl. 31. 08:31
Hasznos számodra ez a válasz?
 10/11 A kérdező kommentje:

Oh, elnézést.


[link]

2014. júl. 31. 14:33
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!