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

Losowanie bez powtórzeń (21) - zadanie domowe

Ostatnio zmodyfikowano 2018-10-29 06:56
Autor Wiadomość
wojtas
Temat założony przez niniejszego użytkownika
Losowanie bez powtórzeń (21) - zadanie domowe
» 2018-10-28 22:54:48
Witam,
potrzebuję kogoś bardziej zaawansowanego by mi wytłumaczył następujący problem:
zadanie polega jak wiecie na wylosowaniu 2 niepowtarzających się liczb z podanych 3 przez użytkowania.
Jeśli, tak jak założyłem na początku pisania kodu, tablicę wprowadzonych liczb stworzę z indeksem 2 - tab[2] (czyli trzy pozycje do uzupełnienia 0, 1, 2), a tablicę wylosowanych z indeksem 1 - tabLOS[1] (czyli dwie pozycje 0 i 1) to program czasami błędnie wypisuje wylosowane liczby. Konkretnie pojawia się liczba '2' (przykład logów na końcu)
Poprawnie działa tylko jeżeli obydwie tablice będą miały indeks 3  (czyli 4 pozycje do uzupełnienia).

Czy mógłby mi ktoś wytłumaczyć dlaczego tak się dzieje? Nie widzę logicznego wyjaśnienia, ale jestem świadom, że zapewne ono mi po prostu gdzieś umyka i potrzebuję pomocy.

edit - problem pojawia się tylko gdy tablica podanych przez użytkowania liczb ma indeks 2, indeks tabLOS może wynosić tyle ile zakładałem na początku - 1.

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int wczytaj( int tab[] )
{
    int i = 0;
    do
    {
        cout << "Podaj liczbe: " << endl;
        cin >> tab[ i ];
       
        i++;
    } while( i < 3 );
   
    return 0;
}
int wypisz( int tab[] )
{
    cout << endl << "=====================" << endl;
    cout << "Wylosowane liczby to:" << endl;
    int i = 0;
    do
    {
        cout << tab[ i ] << endl;
        i++;
    } while( i < 2 );
   
    return 0;
}
int wylosuj()
{
    return rand() % 3;
}

bool czyWylosowana( int tab[], int tabLOS[], int ile, int liczba )
{
    if( ile <= 0 )
    {
        return false;
    }
   
   
    int i = 0;
    do
    {
        if( tabLOS[ i ] == tab[ liczba ] )
        {
            return true;
        }
        i++;
    } while( i < ile );
   
    return false;
}

int main()
{
    srand( time( 0 ) );
    int tab[ 3 ]; //tablica z wprowadzonymi liczbami
    int tabLOS[ 3 ]; //tablica z wylosowanymi liczbami bez powtórzeń
    int wylosowanych = 0;
    wczytaj( tab );
    do
    {
        int liczba = wylosuj();
        cout << endl << "****** " << liczba << " ********" << endl; //sprawdzam jakie wylosowałem
        if( czyWylosowana( tab, tabLOS, wylosowanych, liczba ) == false )
        {
            tabLOS[ wylosowanych ] = tab[ liczba ];
            wylosowanych++;
        }
    } while( wylosowanych < 2 );
   
    wypisz( tabLOS );
    return 0;
}



Podaj liczbe:
1
Podaj liczbe:
5
Podaj liczbe:
9

****** 2 ********

****** 2 ********

****** 2 ********

****** 1 ********

=====================
Wylosowane liczby to:
2
5

Process returned 0 (0x0)   exe
P-172715
pekfos
» 2018-10-28 23:29:22
tablicę wprowadzonych liczb stworzę z indeksem 2 - tab[2] (czyli trzy pozycje do uzupełnienia 0, 1, 2)
To nie indeks, tylko rozmiar. tab[2] ma 2 elementy.
P-172716
wojtas
Temat założony przez niniejszego użytkownika
» 2018-10-29 06:56:01
Już widzę mój błąd - pomieszałem rozmiar z indeksem. Dzięki! Na to by sprawdzić poprawność wiedzy odnośnie tabel bym chyba nie wpadł.
Temat zamykam
P-172717
« 1 »
  Strona 1 z 1