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

[Rozdział 21] Problem z drugą cześcią zadania

Ostatnio zmodyfikowano 2017-02-20 08:35
Autor Wiadomość
Kokotek
Temat założony przez niniejszego użytkownika
[Rozdział 21] Problem z drugą cześcią zadania
» 2017-02-19 23:01:05
Cześć.
Program napisałem z problemami czasami większymi, czasami mniejszymi. Podsyłam kod fukcji, która działa aczkolwiek nie do końca:

C/C++
void przypisanie_indexu_do_liczby( int tablica[], int los[] )
{
    int i, index = 0;
   
    do
    {
        do
        {
            if( los[ index ] == i )
                 cout << "Wylosowana liczba" << index << ": " << tablica[ i ] << endl;
           
            i++;
        } while( i < 10 );
       
        i = 0;
        index++;
    } while( index < 8 );
   

Funcja ma przypisywać dane z jednej tablicy do drugiej. Problem w tym, że czasami pomija pierwszą tablicę.
Byłbym bardzo wdzięczny za pomoc.
Pozdrawiam.
P-158028
latajacaryba
» 2017-02-20 01:26:41
Na początku zainicjalizuj zmienną 'i'.
Wytłumacz proszę jeszcze skąd się wzięły warunki tych pętli do...while (domyslam się, że to rozmiary tablic, jeśli tak to nie rób tak więcej, tylko przesyłaj ich rozmiar w argumencie funkcji - wtedy będzie działało dla tablic o różnych rozmiarach.)

Pomija Ci pierwszy indeks tablicy los. Prześledźmy wykonywanie kodu:

i = śmieci (niezainicjalizowana zmienna, czyli tzw. śmieci - losowe, zwykle duże liczby)
index = 0
poprawnie:
int i = 0, index = 0;

*kod sie wykonuje*

dla: i = 932433(jakieś śmieci), index = 0
 if( los[ index ] == i )
                 cout << "Wylosowana liczba" << index << ": " << tablica[ i ] << endl;

podstawiamy, czyli
if ( los[0] == 932433 )
      cout<<...  - to sie nie wykona, bo warunek (najprawdopodobniej) sie nie zgadza (najprawdopodobniej, bo może masz pod los[0] liczbe 932433 ;) )

Dalsza część kodu to inkrementacja i (i++) - nadal mało możliwe, że
los[0] == 932434
tak więc tu nic nie wyświetli.
Dopiero po wyjściu z pętli
i = 0;
index++;

Z tym, że teraz pętla wykonuje się dla
i = 0
index = 1 !!

A wiec
if(los[1] == 0/1/2/3/4/5/6/7/8/9) ('i' jest z przedziału od 0 - 9 bo je inkrementujesz pod koniec tej pętli, index = 1)
     cout<<cout << "Wylosowana liczba" << index (a index wynosi 1) << ": " << tablica[ i ] << endl;


Dlatego też musisz nadać zmiennej 'i' wartość 0 przy jej deklaracji (czyli zdefiniuj ją)

Frazy, które należy wpisać w wyszukiwarkę google:

Na koniec cytat z wiki o śmieciach:

Język C nie inicjalizuje zmiennych lokalnych. Oznacza to, że w nowo zadeklarowanej zmiennej znajdują się śmieci - to, co wcześniej zawierał przydzielony zmiennej fragment pamięci. Aby uniknąć ciężkich do wykrycia błędów, dobrze jest inicjalizować (przypisywać wartość) wszystkie zmienne w momencie zadeklarowania.
Napisali o c, ale w c++ też to jest. Jedynie zmienne globalne są zawsze od razu inicjalizowane zerem. :)

P-158031
Kokotek
Temat założony przez niniejszego użytkownika
» 2017-02-20 08:35:07
Dzięki bardzo za wskazanie błędu. Wstyd się przyznać ale myślałem, że taki zapis jest poprawny i obydwu zmiennym zostanie przypisane "0". Za porady też dziękuje na pewno je wykorzystam.
Pozdrawiam!
P-158032
« 1 »
  Strona 1 z 1