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

Rozdział 21 Zadanie domowe - losowanie bez powtórzeń

Ostatnio zmodyfikowano 2017-06-08 19:21
Autor Wiadomość
deni
Temat założony przez niniejszego użytkownika
Rozdział 21 Zadanie domowe - losowanie bez powtórzeń
» 2017-06-08 13:43:35
Witam. Mam problem z uzyskaniem dwóch różnych liczb podczas losowania. Zawsze wypisywane są dwie takie same liczby i niestety nie jestem w stanie znaleźć błędu :(

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void wpisywanie( int wpisane[] )
{
    int i = 0;
    do
    {
        cout << "Podaj liczbe" << endl;
        cin >> wpisane[ i ];
        if( cin.fail() )
        do
        {
            cout << "Sprobuj ponownie" << endl;
            cin.clear();
            cin.sync();
        } while( !( cin >> wpisane[ i ] ) );
       
        i++;
    } while( i < 3 );
   
}
bool powtorzenie( int wylosowane[], int a )
{
    int i = 0;
    if( a > 0 )
    do
    {
        wylosowane[ a ] = wylosowane[ i ];
        if( wylosowane[ a ] = wylosowane[ i ] )
             return true;
        else
             i++;
       
    } while( i < a );
    else
         return false;
   
}
void losowanie( int wpisane[] )
{
    int i = 0;
    int wylosowane[ 2 ];
    int a = 0;
    do
    {
        wylosowane[ a ] =( rand() % 3 );
        if( powtorzenie( wylosowane, a ) == true )
        do
        {
            wylosowane[ a ] =( rand() % 3 );
        } while( powtorzenie( wylosowane, a ) == false );
       
        cout << "WYLOSOWANO " << wpisane[ wylosowane[ a ] ] << endl;
        a++;
    } while( a < 2 );
   
}

int main()
{
    srand( time( NULL ) );
    int wpisane[ 3 ];
    wpisywanie( wpisane );
    losowanie( wpisane );
    return 0;
}
/edit @DieG poprawiłem jednak nic to nie zmieniło
P-162245
DieG
» 2017-06-08 14:44:43
Z tego co widzę, to tablica wylosowane zawiera tylko jedną zmienną, a w kodzie odwołujesz się do dwóch: 0 i 1 (to tylko uwaga po pierwszym wglądzie).
P-162249
Kinexity
» 2017-06-08 15:41:43
Teraz będzie działać:

C/C++
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

void wpisywanie( int wpisane[] )
{
    int i = 0;
    do {
        cout << "Podaj liczbe: ";
        cin >> wpisane[ i ];
        if( cin.fail() ) {
            do
            {
                cout << "Sprobuj ponownie!" << endl;
                cin.clear();
                cin.sync();
            } while( !( cin >> wpisane[ i ] ) );
           
        }
        i++;
    } while( i < 3 );
   
}

void losowanie( int wpisane[] )
{
    int wylosowane[ 2 ];
    wylosowane[ 0 ] = rand() % 3;
    do {
        wylosowane[ 1 ] = rand() % 3;
    } while( wylosowane[ 0 ] == wylosowane[ 1 ] );
   
    cout << "Wylosowano " << wpisane[ wylosowane[ 0 ] ] << " oraz " << wpisane[ wylosowane[ 1 ] ] << endl;
}

int main()
{
    srand( time( NULL ) );
    int wpisane[ 3 ];
    wpisywanie( wpisane );
    losowanie( wpisane );
    return 0;
}
P-162254
deni
Temat założony przez niniejszego użytkownika
» 2017-06-08 19:07:43
Działa, a co jeżeli mam więcej liczb? W 2 zadaniu "Zmodyfikuj program z pierwszego zadania tak, aby użytkownik musiał podać 10 liczb, a 8 z nich będzie losowanych bez powtórzeń. Sprawdź czy wyniki są poprawne.".
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void wpisywanie( int wpisane[] )
{
    int i = 0;
    do
    {
        cout << "Podaj liczbe" << endl;
        cin >> wpisane[ i ];
        if( cin.fail() )
        do
        {
            cout << "Sprobuj ponownie" << endl;
            cin.clear();
            cin.sync();
        } while( !( cin >> wpisane[ i ] ) );
       
        i++;
    } while( i < 10 );
   
}

bool sprawdzenie( int wylosowane[], int a )
{
    int i = 0;
    if( a = 0 )
         return false;
   
    if( a > 0 )
    do
    { if( wylosowane[ a ] == wylosowane[ i ] )
             return true;
       
        if( a > i )
             i++;
       
    } while( a > i );
   
    return false;
   
}

void losowanie( int wpisane[] )
{
    int wylosowane[ 8 ];
    int i = 0;
    int a = 0;
    do
    {
        wylosowane[ a ] =( rand() % 10 );
       
        do
        { if( sprawdzenie( wylosowane, a ) == true )
                 wylosowane[ a ] =( rand() % 10 );
           
        } while(( sprawdzenie( wylosowane, a ) == true ) );
       
        cout << "WYLOSOWANO " << wpisane[ wylosowane[ a ] ] << endl;
        a++;
    } while( a < 8 );
   
}

int main()
{
    srand( time( NULL ) );
    int wpisane[ 10 ];
    wpisywanie( wpisane );
    losowanie( wpisane );
    return 0;
}
Nie jestem w stanie doprowadzić tego do działania :/ Zdarzają się powtórzenia.
P-162265
Kinexity
» 2017-06-08 19:21:59
Musiałem wziąć pętlę for z kolejnego rozdziału, ponieważ inaczej to by trudniej było. Powinno działać.

C/C++
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

void wpisywanie( int wpisane[] )
{
    int i = 0;
    do {
        cout << "Podaj liczbe: ";
        cin >> wpisane[ i ];
        if( cin.fail() ) {
            do
            {
                cout << "Sprobuj ponownie!" << endl;
                cin.clear();
                cin.sync();
            } while( !( cin >> wpisane[ i ] ) );
           
        }
        i++;
    } while( i < 10 );
   
}

void losowanie( int wpisane[] )
{
    int wylosowane[ 8 ];
    bool powtarza;
    for( int i = 0; i < 8; ) {
        powtarza = false;
        wylosowane[ i ] = rand() % 10;
        for( int j = 0; j < i; j++ ) {
            if( wylosowane[ i ] == wylosowane[ j ] ) {
                powtarza = true;
                break;
            }
        }
        if( powtarza ) {
            continue;
        }
        i++;
    }
    cout << "Wylosowano: " << wylosowane[ 0 ];
    for( int i = 1; i < 8; i++ ) {
        cout << " , " << wylosowane[ i ];
    }
}

int main()
{
    srand( time( NULL ) );
    int wpisane[ 10 ];
    wpisywanie( wpisane );
    losowanie( wpisane );
    return 0;
}
P-162268
« 1 »
  Strona 1 z 1