Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozdział 43 - prośba o zerknięcie na zadanie domowe.

Ostatnio zmodyfikowano 2019-02-05 15:52
Autor Wiadomość
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ć:
C/C++
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++;
    }
}
P-173846
pekfos
» 2019-02-04 22:08:06
Po co tam rekurencja?
P-173847
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:
C/C++
void sortuj( int * begin, int * end ) {
   
    int temp = 0, * poczatek = begin;
   
    while( begin != end - 1 ) { //Edit 2: zmieniono granicę pętli while z ( end ) na ( end - 1 )
       
        if( * begin > *( begin + 1 ) ) {
           
            temp = * begin;
            * begin = *( begin + 1 );
            *( begin + 1 ) = temp;
            begin = poczatek; //Edit: było: begin = poczatek-1;
            continue; //bez 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:
C/C++
begin = poczatek - 1;

na

C/C++
begin = poczatek;
continue;
P-173848
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.
P-173856
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.
P-173861
« 1 »
  Strona 1 z 1