abcde Temat założony przez niniejszego użytkownika |
[Lekcja 21] Losowanie z danego przedziału. » 2012-03-18 21:20:46 Witam dawno mnie nie było bo miałem przerwę, ale za długo chyba bo nie potrafię rozwiązać zadania 21.
Podszedłem do tego swoim sposobem i nie wiem czy dobrze.
Ogólnie podstawowe pytanie moje to jak losować z mojej tablicy z wybranymi liczbami. Nie wiem jak to przypisać, aby losowane liczby były właśnie z tej tablicy. Stworzyłem również tablice dla liczb losowanych, aby tam zapisywać wylosowane liczby i potem je porównywać czy już nie była wylosowana. Ale to później na razie jak losować z danego przedziału.
Mój kod:
#include <iostream> #include <cstdlib> #include <ctime>
void wybierz( int tablica[], int ile ) { std::cout << "Podaj trzy liczby: " << std::endl; int licznik = 0; do { std::cin >> tablica[ licznik ]; licznik++; } while( licznik < ile ); }
void wypisz( int tablica[], int ile ) { std::cout << "Podales nastepujace liczby: "; int licznik = 0; do { std::cout << tablica[ licznik ] << ", "; licznik++; } while( licznik < ile ); }
int main() { srand( time( 0 ) ); int tablica[ 3 ]; wybierz( tablica, 3 ); wypisz( tablica, 3 ); std::cout << "Losowanie dwoch liczb z trzech wybranych bez powtorzen." << std::endl; int losowana[ 2 ]; losowana[ 2 ] =(( rand() % 2 ) + 0 ); int licznik = 0; do { std::cout << losowana[ 2 ] << std::endl; licznik++; } while( licznik < 2 ); return 0; }
Widzę, że chyba coraz gorzej mi idzie chociaż nie chcę się poddawać.
|
|
Unlimited |
» 2012-03-18 21:38:52 Losować z tablicy, w której już są podane wartości przez człowieka jest prosto. Losujesz najpierw np wartość dla zmiennej od 0 do 1 (tablica z 2 wartościami) a potem tą zmienną wstawiasz w tablice i zwracasz wartość przez return. Przykład: int a =( rand() % 2 ) + 0; return podawane[ a ];
|
|
jankowalski25 |
» 2012-03-18 21:39:09 losowana[ 2 ] =(( rand() % 2 ) + 0 ); Wychodzisz poza zakres tablicy. Poza tym nie wypełniasz całej tablicy, tylko jeden z jej elementów. std::cout << losowana[ 2 ] << std::endl; Znowu wychodzisz poza zakres tablicy. Oprócz tego wypisujesz ciągle w pętli wartość tego samego elementu tablicy. |
|
abcde Temat założony przez niniejszego użytkownika |
» 2012-03-19 20:34:40 Witam mogę was prosić o więcej jakiś wskazówek. Może jakiś przykład do analizy, albo co mam przeczytać jeszcze chociaż już czytałem kilka razy poprzednie lekcje. Bo siedzę i nic nawet nie wrzucam żadnego kodu bo to nie ma sensu.
Na razie teoretycznie mam:
to w niej zapisuje wybrane liczby.
Teraz jak widzicie zrobiłem tablice dla liczb wylosowanych:
I teraz jak to się zabrać do tego, aby te liczby losowane pochodziły z mojej tablicy wybranej. Na razie bez funkcji i i bez sprawdzania czy się będą powtarzały bo to chce zrozumieć na razie. |
|
jankowalski25 |
» 2012-03-19 21:06:50 losowana[ 2 ] =(( rand() % 2 ) + 0 ); Błędy: 1. Modyfikujesz wartość trzeciego elementu tej tablicy (poza jej zakresem). 2. Próbujesz zapisać do tablicy liczbę 0 lub 1, a masz dokonać losowania spośród trzech liczb a nie dwóch. 3. Nie wypełniasz całej tablicy, ale tylko jeden z jej elementów. Rozwiązania: 1. Zmień indeks tablicy. 2. Podziel wynik funkcji rand() przez 3, a nie przez 2. 3. Umieść wypełnianie tablicy w pętli. std::cout << losowana[ 2 ] << std::endl; Błędy: 1. Wypisujesz wartość trzeciego elementu tablicy (poza jej zakresem). 2. Ciągle wypisujesz wartość tego samego elementu. 3. Wypisujesz numer elementu do wyświetlenia, a nie samą wartość elementu. Rozwiązania: 1. Zmień indeks tablicy. 2. Indeks tablicy musi być zmienną, która będzie zmieniana za każdym obiegiem pętli, aby wyświetlić całą tablicę. 3. Wartość danego elementu tablicy losowana możesz użyć jako indeks tablicy z przechowywanymi danymi. |
|
abcde Temat założony przez niniejszego użytkownika |
» 2012-03-19 21:46:11 Dziękuję za udzielone porady.
Wprowadziłem pierwsze modyfikacje programu.
Aktualnie program losuje mi jedna liczbę, tą która znajduje się na pierwszej pozycji.
#include <iostream> #include <cstdlib> #include <ctime>
void wybierz( int tablica[], int ile ) { std::cout << "Podaj trzy liczby: " << std::endl; int licznik = 0; do { std::cin >> tablica[ licznik ]; licznik++; } while( licznik < ile ); }
void wypisz( int tablica[], int ile ) { std::cout << "Podales nastepujace liczby: "; int licznik = 0; do { std::cout << tablica[ licznik ] << ", "; licznik++; } while( licznik < ile ); }
int main() { srand( time( 0 ) ); int tablica[ 3 ]; wybierz( tablica, 3 ); wypisz( tablica, 3 ); std::cout << "Losowanie dwoch liczb z trzech wybranych bez powtorzen." << std::endl; int losowana[ 2 ]; losowana[ 1 ] =(( rand() % 3 ) + 0 ); int licznik = 0; do { losowana[ licznik ]; licznik++; } while( licznik < 2 ); do { std::cout << losowana[ licznik ] << std::endl; licznik++; } while( licznik < 2 ); return 0; }
Teraz zastanawiam się dlaczego tą z pierwszej pozycji.
Jeśli można prosić o dalszą pomoc i wskazówki, a ja będę do tego czasu sam kombinował może coś się uda.
Dziękuję już podaną pomoc. Pozdrawiam.
|
|
abcde Temat założony przez niniejszego użytkownika |
» 2012-03-20 20:14:14 Po licznych analizach przykładów poprawianych błędach doczytaniu informacji zabrałem się za to jeszcze raz i wyszło coś takiego.
#include <iostream> #include <cstdlib> #include <ctime>
int wybierz() { int liczba = 0; std::cin >> liczba; return liczba; }
int wylosuj( int wybrane[ 3 ] ) { int losowana =( rand() % 3 ) + 0; return wybrane[ losowana ]; }
bool sprawdzanie( int liczba, int losowane[ 2 ], int wylosowane ) { if( wylosowane <= 0 ) return false; int licznik = 0; do { if( losowane[ licznik ] == liczba ) return true; licznik++; } while( licznik < wylosowane ); return false; }
int main() { srand( time( NULL ) ); int wybrane[ 3 ]; int losowane[ 2 ]; int wylosowane = 0; int licznik; std::cout << "Podaj trzy liczby: " << std::endl; licznik = 0; do { wybrane[ licznik ] = wybierz(); licznik++; } while( licznik < 3 ); do { int liczba = wylosuj( wybrane ); if( sprawdzanie( liczba, losowane, wylosowane ) == false ) { losowane[ wylosowane ] = liczba; wylosowane++; } } while( wylosowane < 2 ); licznik = 0; std::cout << "Losowanie dwoch liczb z trzech wybranych bez powtorzen." << std::endl; do { std::cout << losowane[ licznik ] << std::endl; licznik++; } while( licznik < 2 ); return 0; }
Jak dla mnie to wszystko ok. Ale liczę na wasze uwagi bo być może czegoś nie zauważam.
Pozdrawiam.
Edit:
Nikt nie napisał uwag do aktualnego kodu programu także zamykam. |
|
« 1 » |