Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lekcja 21 [Losowanie bez powtorzen]

Ostatnio zmodyfikowano 2013-04-08 18:59
Autor Wiadomość
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


C/C++
#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++;
        } //if
    } 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.
P-76890
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
P-76897
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:
C/C++
bool czyBylaWylosowana( int liczba, const int * tab, int ile )
{
    int i = 0;
    while( i < ile )
    if( tab[ i++ ] == liczba )
         return true;
   
    return false;
}
P-76906
kula
» 2013-04-07 12:06:02
Panowie, wytłumaczcie mi jedno w tym kodzie, jeżeli w tym miejscu:

C/C++
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:

C/C++
if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false )
{
    wylosowane[ wylosowanych ] = liczba;
    wylosowanych++;
} //if
} while( wylosowanych < 5 );

trafia wartość true, więc można to przedstawić w ten sposób (oczywiście tylko dla dobrego zrozumienia)

C/C++
if( true == false )
{
    wylosowane[ wylosowanych ] = liczba;
    wylosowanych++;
} //if
} 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 :)
P-80139
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.
P-80150
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 :-)
P-80187
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?
C/C++
#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;
}
P-80224
« 1 »
  Strona 1 z 1