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

Poziom 2 lekcja 21 zadanie nr. 1 losowanie bez powtórzeń.

Ostatnio zmodyfikowano 2017-01-25 22:28
Autor Wiadomość
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.
C/C++
#include <iostream>    //jest sobie program losujący póki co z powtórzeniami, nie pisałem bez bo nie wiedziałem co jest nie tak
#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++; // w tym miejscu tab1[ tab2 [ wylosowanych ] ] co ten zapis oznacza?
    } while( wylosowanych < 2 ); // zawsze pisałem tab2[ wylosowanych ] i losowało od 0 do 3 dopiero się dowiedziałem że to
    // jest zły zapis ale jeszcze nie wiem dlaczego, proszę o prostą przejrzystą odpowiedź :)    
    return 0;
}

Już rozumiem, warto było na kartce rozpisać. Dziękuję za pomoc. :)
P-155183
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.
P-155185
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.

C/C++
#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).
P-156954
« 1 »
  Strona 1 z 1