Rozdział 43 - prośba o zerknięcie na zadanie domowe.
Ostatnio zmodyfikowano 2019-02-05 15:52
Sulik Temat założony przez niniejszego użytkownika |
Rozdział 43 - prośba o zerknięcie na zadanie domowe. » 2019-02-04 21:40:40 Cześć. Prośba jak w temacie. Funkcja sortuj ma u mnie taką postać: void sortuj( int * begin, int * end ) { int temp, * poczatek = begin; while( begin != end ) { if( * begin > *( begin + 1 ) ) { temp = * begin; * begin = *( begin + 1 ); *( begin + 1 ) = temp; sortuj( poczatek, begin ); } begin++; } }
|
|
pekfos |
» 2019-02-04 22:08:06 Po co tam rekurencja? |
|
Sulik Temat założony przez niniejszego użytkownika |
» 2019-02-04 23:19:22 Ok. Już nie jest potrzebna. Nie potrafiłem sobie poradzić z tym, że pierwszy element pozostaje nieposortowany. Nie brałem pod uwagę, że po wykonaniu if'a następuje inkrementacja begin, więc kolejny krok w while zaczynał się od begin+1 - nie wracałem na sam początek tablicy tylko na drugi element: void sortuj( int * begin, int * end ) { int temp = 0, * poczatek = begin; while( begin != end - 1 ) { if( * begin > *( begin + 1 ) ) { temp = * begin; * begin = *( begin + 1 ); *( begin + 1 ) = temp; begin = poczatek; continue; } begin++; } } Edit: Jeszcze jedno zmieniam. Bo poczatek - 1 jest obszarem pamięci, który nie należy do programu więc chyba lepiej, żeby się nie pojawiał w ogóle w programie. Zamieniłem: na begin = poczatek; continue;
|
|
Monika90 |
» 2019-02-05 12:14:22 begin może wskazywać na ostatni element tablicy, wtedy begin+1 to będzie już poza tablicą, a *(begin + 1) to odwołanie się do nieistniejącego elementu. |
|
Sulik Temat założony przez niniejszego użytkownika |
» 2019-02-05 15:52:08 Hmmm... W przypadku ( begin == end ) pętla while się zakończy, więc pętla if wykona się po raz ostatni dla ( begin == (end-1) ). Sprawdziłem kilka skrajnych przypadków i w żadnym z nich program nie odwołuje się do.... AAAA... widzisz... end to już komórka pamięci poza tablicą więc muszę pętlę while wykonywać do ( end - 1 ). Jeszcze sprawdzę czy będzie sortować całą tablicę.
Wprowadziłem do mojej tablicy wartość 1200000000 (bo *end to akurat było u mnie 2686760) i na ostatnie miejsce przesortowanej tablicy wskoczyła wartość spod wskaźnika end (2686760) czyli spoza tablicy. Z (end-1) w while działa jak należy.
Dzięki. |
|
« 1 » |