Poziom 2 lekcja 21 zadanie nr. 1 losowanie bez powtórzeń.
Ostatnio zmodyfikowano 2017-01-25 22:28
Damfled Temat założony przez niniejszego użytkownika |
Poziom 2 lekcja 21 zadanie nr. 1 losowanie bez powtórzeń. » 2016-12-19 11:25:23 Po długim czasie kombinowania znalazłem błąd ale go nie rozumiem. #include <iostream> #include <cstdlib> #include <ctime>
int losuj() { return(( std::rand() % 3 ) + 0 ); }
void wpisz( int tab[] ) { int licznik = 0; do { std::cin >> tab[ licznik ]; licznik++; } while( licznik < 3 ); }
int main() { srand( time( NULL ) ); const int rozm1 = 3; const int rozm2 = 2; int tab1[ rozm1 ]; int tab2[ rozm2 ]; int wylosowanych = 0; wpisz( tab1 ); do { int losowana = losuj(); tab2[ wylosowanych ] = losowana; wylosowanych++; } while( wylosowanych < 2 ); wylosowanych = 0; do { std::cout << "Wylosowana liczba to: " << tab1[ tab2[ wylosowanych ] ] << std::endl; wylosowanych++; } while( wylosowanych < 2 ); return 0; }
Już rozumiem, warto było na kartce rozpisać. Dziękuję za pomoc. :) |
|
karambaHZP |
» 2016-12-19 11:58:56 Bo w drugiej tablicy trzymasz wylosowane indeksy i to ich używasz jako indeks dla pierwszej tablicy. Weź kartkę o rozłóż na ten zapis na poszczególne elementy i zrozumiesz o co chodzi. |
|
bobby.hl |
» 2017-01-25 22:28:56 Hej, odświeżam, też mam pytanie odnośnie tej części kodu. U mnie wygląda to tak: cout << "Wylosowana liczba to: " << tablicaLiczb[ wylosowane[ licznik ] ] << endl; czy jest możliwość zastąpienia tego zapisu jakimś innym, na przykład poprzez argument w funkcji losującej? i drugie pytanie. po wpisaniu liczb, tak jak w logu, losuje liczbę "1" która nie była podana. sprawdzałem kilka razy, i z różnymi liczbami tak się zdarza, praktycznie za każdym razem. Podaj liczbe: 11 Podaj liczbe: 22 Podaj liczbe: 33 Podaj liczbe: 44 Podaj liczbe: 55 Podaj liczbe: 66 Podaj liczbe: 77 Podaj liczbe: 88 Podaj liczbe: 99 Podaj liczbe: 111 Wylosowana liczba to: 22 Wylosowana liczba to: 11 Wylosowana liczba to: 1 Wylosowana liczba to: 88 Wylosowana liczba to: 55 Wylosowana liczba to: 66 Wylosowana liczba to: 99 Wylosowana liczba to: 33
Process returned 0 (0x0) execution time : 7.953 s Press any key to continue.
poniżej cały kod. #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
int wpisz( int tab[], int ile ) { bool ok; int i = 0; do { cout << "Podaj liczbe: "; cin >> tab[ i ]; ok = cin.good(); cin.clear(); cin.sync(); if( ok == false ) { do { cout << "Podaj poprawna liczbe!"; cin >> tab[ i ]; ok = cin.good(); cin.clear(); cin.sync(); } while( ok == false ); } i++; } while( i < ile ); }
int wylosuj() { return(( rand() % 10 ) + 0 ); }
bool czyBylaWylosowana( int a, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == a ) return true; i++; } while( i < ile ); return false; }
int main() { srand( time( 0 ) ); int tablicaLiczb[ 9 ]; int wylosowane[ 7 ]; wpisz( tablicaLiczb, 10 ); int licznik = 0; do { int liczba = wylosuj(); if( czyBylaWylosowana( liczba, wylosowane, licznik ) == false ) { wylosowane[ licznik ] = liczba; cout << "Wylosowana liczba to: " << tablicaLiczb[ wylosowane[ licznik ] ] << endl; licznik++; } } while( licznik < 8 ); return 0; } EDIT: OK, doszedłem już do tego, był podany za mały rozmiar tablicy (9 zamiast 10). |
|
« 1 » |