R. 21 Zadanie domowe, czy poprawnie podszedłem do zadania, losowanie "rand"
Ostatnio zmodyfikowano 2019-02-22 22:04
Matheyas Temat założony przez niniejszego użytkownika |
R. 21 Zadanie domowe, czy poprawnie podszedłem do zadania, losowanie "rand" » 2019-02-22 20:09:40 Hej! Oszczędzając czas: Pytania: 1) Czy zadanie z rozdziału 21. "Losowanie liczb bez powtórzeń" wykonałem poprawnie? (liczby wylosowane z tablicy się nie powtarzają, lecz powtarzają się liczby ogólnie wylosowane.) 2) Z tego co wyczytałem z kursu, to rand losuje z przedziału liczb. od-do. Więc jak ustalić żeby losował z konkretnych liczb? 3) Popełniłem błędy pod względem merytorycznym? Jak wam się czyta ów kod? Co mogę poprawić, aby pisać "czytelniej". kod: #include "pch.h" #include <iostream> #include <string> #include <ctime> #include <cstdlib>
using std::endl; using std::cin; using std::cout; int losuj() { return( rand() % 10000 ) + 1; } bool czyByla( int iLiczba, int iWylosowana[], int iKolejka ) { int i = 0; do { if( iWylosowana[ i ] == iLiczba ) { return true; } i++; } while( i < iKolejka ); return false; } bool sprawdz( int iLiczba, int iPodana[], int ile ) { int i = 0; do { if( iLiczba == iPodana[ i ] ) { return false; } i++; } while( i < ile ); return true; } void losowanie( int iPodane[], int iIleLiczb, int iIleLiczbWylosowac ) { int wylosowana[ 10000 ]; int i = 0; int kolejka = 0; int nr = 0; do { int liczba = losuj(); nr++; if( sprawdz( liczba, iPodane, iIleLiczb ) == false ) { if( czyByla( liczba, wylosowana, kolejka ) == false ) { wylosowana[ kolejka ] = liczba; kolejka++; } nr++; i++; } } while( kolejka < iIleLiczbWylosowac ); cout << "Wylosowane liczby to: "; int h = 0; do { cout << wylosowana[ h ] << " "; h++; } while( h < iIleLiczbWylosowac ); }
int main() { int podaneLiczby[ 10000 ]; int ileLiczb; int ileLiczbWylosowac; int i = 0; srand( time( NULL ) ); cout << "Podaj ile liczb do wczytania "; cin >> ileLiczb; cout << "Ile liczb wylosowac "; cin >> ileLiczbWylosowac; cout << "Podaj liczby od 1 do 10000 "; do { cin >> podaneLiczby[ i ]; i++; } while( i < ileLiczb ); losowanie( podaneLiczby, ileLiczb, ileLiczbWylosowac ); return 0; }
|
|
pekfos |
» 2019-02-22 20:17:24 Czy zadanie z rozdziału 21. "Losowanie liczb bez powtórzeń" wykonałem poprawnie? |
Nie. Poprawne rozwiązanie nie powinno narzucać ograniczeń na wprowadzane przez użytkownika liczby. Z tego co wyczytałem z kursu, to rand losuje z przedziału liczb. od-do. Więc jak ustalić żeby losował z konkretnych liczb? |
Musisz znaleźć jakiś sposób, by przetłumaczyć liczbę z jednego zakresu na inny, niekoniecznie ciągły. |
|
Matheyas Temat założony przez niniejszego użytkownika |
» 2019-02-22 21:35:51 Wielkie dzięki! Teraz mi to zajęło niecałą godzinkę (Kod powyżej zajął mi około 10h) Teraz musi być ok. #include <iostream> #include <string> #include <ctime> #include <cstdlib>
using std::endl; using std::cin; using std::cout; int los() { return( rand() % 10 ); }
bool sprawdz( int iLosuj, int iWylosowana[], int iIle ) { int i = 0; do { if( iLosuj == iWylosowana[ i ] ) { return false; } i++; } while( i < iIle ); return true; } int main() { srand( time( NULL ) ); int a[ 10 ]; int i = 0; int x = 0; do { cin >> a[ i ]; i++; } while( i < 10 ); int wylosowana[ 10 ]; int ile = 0; do { int losuj = los(); if( sprawdz( losuj, wylosowana, ile ) == true ) { cout << a[ losuj ] << " "; ile++; } wylosowana[ x ] = losuj; x++; } while( ile < 8 ); return 0; }
|
|
pekfos |
» 2019-02-22 21:49:38 Potencjalnie przekraczasz zakres tablicy wylosowana. |
|
Matheyas Temat założony przez niniejszego użytkownika |
» 2019-02-22 22:00:06 Więc wystarczy, że zwiększę wartość tablicy? Gdy tak zrobiłem, to żaden komunikat mi się nie wyświetla. W kursie jeszcze nie miałem o dowolnej wielkości zmiennej w tablicy, określonej przez użytkownika. |
|
pekfos |
» 2019-02-22 22:04:13 Nie wystarczy. |
|
« 1 » |