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

Algorytm szukający pierwszej dodatniej liczby

Ostatnio zmodyfikowano 2018-01-26 00:02
Autor Wiadomość
grzeso
Temat założony przez niniejszego użytkownika
Algorytm szukający pierwszej dodatniej liczby
» 2018-01-25 22:29:42
Witam

Tworze algorytm wyszukujący pierwszą dodatnią liczbę w zbiorze.

Zbiór zawsze posortowany jest rosnąco, liczby mogą się powtarzać.

przykładowe dane wejściowe:

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,19}

oczekiwany rezultat to: liczba: 2 (jest na 19 miejscu -czyli indeks tablicy to 18)
a w zasadzie indeks tej liczby


w kodzie są odpowiednio prefiksy 'i' dla indeksów i 'l' dla liczb

mój kod:
C/C++
int pierwsza_dodatnia( int * tablica, int i_zero, int i_ostatni )
{
    int i_granica =( i_zero + i_ostatni ) / 2;
    int l_granica = tablica[ i_granica ];
   
    int l_zero = tablica[ i_zero ];
    int l_ostatni = tablica[ i_ostatni ];
   
    //dodatkowe linijki żebym wiedział co się aktualnie dzieje:
    cout << endl << "i_granica " << i_granica;
    cout << endl << "i_zero " << i_zero;
    cout << endl << "i_ostatni " << i_ostatni;
    cout << endl << "l_granica " << l_granica;
    cout << endl << "l_zero " << l_zero;
    cout << endl << "l_ostatni " << l_ostatni << endl;
   
    if( l_granica < 1 && i_zero != i_granica )
    {
        pierwsza_dodatnia( tablica, i_granica, i_ostatni );
    }
   
    if( l_granica > 0 && i_zero != i_granica )
    {
        pierwsza_dodatnia( tablica, i_zero, i_granica );
    }
   
}

i wszystko pięknie i fajnie, ale na samym końcu po podaniu w main-ie takiej linijki:

4cout << "Pierwsza dodatnia to: " << pierwsza_dodatnia( tablica, 0, 19 ) << endl;

wypluwa wynik: 17, czyli indeks liczby na lewo od szukanej

moje pytania:
1. nie mam tam returna ani nic innego, czemu coś wypluwa? (wiem że to int a nie void i musi coś wypluć, ale czemu akurat to?)
2. może ma ktoś pomysł jak zrobić żeby wypluwał indeks pierwszej dodatniej liczby (czyli tej szukanej)

P-168990
geceves
» 2018-01-25 22:50:15
A gdzie
return
? Ciesz się, że nie wypisało 'Hello World' :)
P-168991
grzeso
Temat założony przez niniejszego użytkownika
» 2018-01-25 22:56:40
no właśnie specjalnie nie ma, a pomimo to coś jest wypisywane

z returnem mam problem, bo jak go umieszczę w kodzie to wypisywana jest pierwsza wartość przypisana zmiennej, a funkcja jest rekurencyjna, więć fajnie jakby ostatnia zmienna była wypisana.

jeśli zabezpiecze to czymś na zasadzie:

C/C++
if( i_zero != i_granica )
{
    return i_ostatni;
}

to nie działa
P-168992
geceves
» 2018-01-25 22:58:56
Skoro


no właśnie specjalnie nie ma

To jak myślisz, co zwraca Twoja funkcja w tym użyciu? I dlaczego uważasz, że akurat zwraca wynik czegokolwiek?
cout << "Pierwsza dodatnia to: " << pierwsza_dodatnia( tablica, 0, 19 ) << endl;

Poza tym:
więć fajnie jakby ostatnia zmienna była wypisana.
Dlaczego uważasz, że teraz ją zwraca?
P-168993
pekfos
» 2018-01-25 22:59:49
return musi być. Inaczej dostajesz przypadkową wartość.
C/C++
if( l_granica < 1 && i_zero != i_granica )
{
    pierwsza_dodatnia( tablica, i_granica, i_ostatni );
    // Czy ten wynik powinien być zwrócony?
}

if( l_granica > 0 && i_zero != i_granica )
{
    pierwsza_dodatnia( tablica, i_zero, i_granica );
    // Czy ten wynik powinien być zwrócony?
}

// Co ma być zwrócone, jeśli nic nie zostało zwrócone wcześniej (np gdy żaden z warunków nie został spełniony)?
}
P-168994
grzeso
Temat założony przez niniejszego użytkownika
» 2018-01-25 23:09:18
doskonale wiem że musi być return, ale nie wiem jak go umieścić żeby było dobrze, dlatego go chwilowo nie umieściłem i chciałem zobaczyć co się stanie.

funkcja zawsze zwraca to samo: indeks szukanej liczby -1 czyli zmienna i_granica lub i_zero (mają te same wartości na końcu) - i zakładam że to przypadek, ale tak jak pisałem wcześniej, nie za bardzo wiem jak zrobić return

prefoks
jeżeli żaden z warunków nie został spełniony to funkcja powinna się zakończyć (a przynajmniej tak mi się wydaje)

nie do końca kumam o co chodzi z "Czy ten wynik powinien być zwrócony?"

wynikiem działania funkcji powinna być zmienna i_zero zawierająca indeks pierwszej liczby większej od zera
P-168995
pekfos
» 2018-01-25 23:13:54
nie do końca kumam o co chodzi z "Czy ten wynik powinien być zwrócony?"

wynikiem działania funkcji powinna być zmienna i_zero zawierająca indeks pierwszej liczby większej od zera
Więc pewnie chcesz tą wartość zwrócić. Wychodzisz wtedy z wywołania rekurencyjnego do poziomu wyżej, gdzie masz 2 wywołania rekurencyjne w warunkach, które nie wykluczają się wzajemnie. Masz wtedy z wywołań rekurencyjnych od zera do dwóch wyników. Co zwrócisz wtedy?
//edit: A jednak się wykluczają, z jakiegoś powodu myślałem o floatach. Istnieje else, wiesz..

prefoks
Wtf, takiej wersji jeszcze nie było.
P-168996
geceves
» 2018-01-25 23:24:27
@grzeso,

rozmawianie o tej funkcji bez instrukcji
return
, nie ma żadnego sensu, wynik akurat dla Ciebie jest powtarzalny ale to wynika jedynie z tego jak kompilator zbudował ten kod. Jeżeli chcesz mieć pewność co do zwracanego wyniku to musisz go zwrócić poprzez
return
, inaczej zwracana wartość jest niezdefiniowana.

Musisz określić warunek końca rekurencji i przy napotkaniu tego warunku wykonać
return
.

Przede wszystkim zastanów się też czy podejście rekurencyjne ma tutaj sens, czy może jest wymyślane na siłę.
P-168997
« 1 » 2
  Strona 1 z 2 Następna strona