Losowanie bez powtórzeń (21) - zadanie domowe
Ostatnio zmodyfikowano 2018-10-29 06:56
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. #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 ]; int tabLOS[ 3 ]; int wylosowanych = 0; wczytaj( tab ); do { int liczba = wylosuj(); cout << endl << "****** " << liczba << " ********" << endl; 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
|
|
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. |
|
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 |
|
« 1 » |