polskiesmaki Temat założony przez niniejszego użytkownika |
Lekcja 21 [Losowanie bez powtorzen] » 2013-02-24 15:07:03 Ponizej kod.
Nie rozumiem jak dziala tutaj funkcja bool czyBylaWylosowana. Np. dlaczego petla ma sie wykonywac przez czas gdy i < ile. I gdzie sa zapisywane te juz wylosowane i niepowtarzajace sie liczby, no a ze tego nie widze nasuwa sie nastepne pytanie skad program wie ze dana liczba nie zostala wylosowana, w ktorym miejscu jest to zapisane?
Z gory dzieki :D
#include <iostream> #include <cstdlib> #include <ctime>
bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int wylosuj() { return( rand() % 10 ) + 1; }
int main() { srand( time( 0 ) ); int wylosowane[ 5 ]; int wylosowanych = 0; do { int liczba = wylosuj(); if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) { wylosowane[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 5 ); wylosowanych = 0; do { std::cout << wylosowane[ wylosowanych ] << std::endl; wylosowanych++; } while( wylosowanych < 5 ); return 0; }
Np. Ja rozumiem to tak w funkcji czyBylaWylosowana jest argument iWynik. Ten argument jest to wylosowana liczba z funkcji wylosuj. Nie widze gdzie funkcja czyBylaWylosowana ta liczbe zapisuje, widze tylko ze potem znowu bierze liczbe z funkcji wylosuj i wypisuje. Jak ten kod funkcjonuje?
Np. potem rozumiem to tak ze pierwsza liczba jest odrazu wypisywana bez sprawdzania, bo ile = 0, czyli wylosowane [0] nie mam z czym sprawdzic. Gdy przychodzi wylosowane [1] powiedzmy ze program wylosowal taka sama liczbe jak przy wylosowane [0], a liczba ta jest 4, to "4" trafia do funkcji czyBylaWylosowana. Funkcja patrzy czy ile <= 0, ale ile = 1 w tym przypadku wiec "4" trafia do petli do ... while (i < ile) czyli powtorzy sie tylko raz bo i++ i nastepnym razem i=1. W petli jest tab[i] czyli tab [0] na poczatku, czyli tab [0] = 4 no i zwraca true i co wtedy?
Albo gdyby liczby byly rozne to np. wylosowane [0]= 4 a wylosowane [1]= 6. To wtedy "6" trafia do funkcji CzyByloWylosowane i wlazi sobie do petli i mamy if (tab [0] = 6) ma zwrocic true a jak nie jest to co ma zrobic?? ? i tab [0] = 4 tak mysle tylko ze przecie wylosowane [1] jest losowane na nowo to skad program wie ze tab [0] = 4 bylo`?? Mi sie wydaje ze program o tym zapomnial, no ale widocznie nie bo dziala poprawnie. |
|
polskiesmaki Temat założony przez niniejszego użytkownika |
» 2013-02-24 16:51:16 Ma ktos jakas rade bo stoje z tematem i sie nudze :D |
|
Monika90 |
» 2013-02-24 19:25:03 Funkcja czyBylaWylosowana po porostu sprawdza, czy iLiczba znajduje się wśród pierwszych ile elementów tablicy tab . Zresztą dziwnie jest ta funkcja napisna... normalnie to się pisze tak: bool czyBylaWylosowana( int liczba, const int * tab, int ile ) { int i = 0; while( i < ile ) if( tab[ i++ ] == liczba ) return true; return false; }
|
|
kula |
» 2013-04-07 12:06:02 Panowie, wytłumaczcie mi jedno w tym kodzie, jeżeli w tym miejscu: do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); trafi się liczba, która była wcześniej wylosowana, to do pętli: if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) { wylosowane[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 5 ); trafia wartość true, więc można to przedstawić w ten sposób (oczywiście tylko dla dobrego zrozumienia) if( true == false ) { wylosowane[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 5 ); I moje pytanie jeżeli jest true == false, to co się w tym momencie wykonuje ? Mam nadzieję że zrozumiecie o co mi chodzi :) |
|
MrPoxipol |
» 2013-04-07 14:22:21 True nigdy nie będzie równe false. Po prostu to co jest w tym if'ie się nie wykona, proste. |
|
usmiech |
» 2013-04-07 22:54:42 Bool to najprostsza funkcja zwraca tylko falsz lub prawde..... Inne funkcje maja inaczej. Chyba latwiej bedzie zrozumiec ich dzialanie i nie tylko dzialanie funkcji w C++ jesli zacznie sie uczyc tzw solid principles w C++, polecam :-) |
|
kula |
» 2013-04-08 18:59:50 Zrobiłem ten program trochę inaczej, bazując jedynie na tym co do tej pory przerabiałem, proszę o ocenę czy to o to chodziło? #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void wpisz( int tab[] ) { int i = 0; do { cout << "Podaj " << i << " liczbe "; cin >> tab[ i ]; i++; } while( i < 3 ); }
int losuj( int tablica[], int tab[] ) { srand( time( NULL ) ); int liczba; int i = rand() % 3; liczba = tablica[ i ]; } int los( int tablica[], int tab[], int wylosowana ) { int i = - 1; do { i++; if( tablica[ i ] != wylosowana ) tab[ 1 ] = tablica[ i ]; } while( i < 3 ); return tab[ 1 ]; }
int main() { int tablica[ 3 ]; wpisz( tablica ); int tab[ 2 ]; int liczba; tab[ 0 ] = losuj( tablica, tab ); int wylosowana = tab[ 0 ]; tab[ 1 ] = los( tablica, tab, wylosowana ); cout << tab[ 0 ] << ", " << tab[ 1 ]; return 0; } |
|
« 1 » |