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

Rozdział 21. Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2015-07-22 14:02
Autor Wiadomość
xKTN
Temat założony przez niniejszego użytkownika
Rozdział 21. Losowanie bez powtórzeń
» 2015-07-22 13:45:13
Witam,
jak zdążyłem zauważyć, rozdział 21. zbiera spore żniwo wśród kursantów. :) Udało mi się napisać program do zadania 1. (oczywiście całość poprzedzona wertowaniem forum oraz kolejnych lekcji kursu) jednak jego działanie nie do końca mnie satysfakcjonuje. Z diagnozy wynika, że przy wpisaniu dwóch takich samych liczb na początku programu, funkcja sprawdzająca liczby zapętla się w nieskończoność (przynajmniej tak to wygląda, dodałem wyświetlenie znaku % do kodu). Dodatkowo przy "prawidłowym" przebiegu na wyjściu zawsze pojawia się 2. i 3. liczba z puli wprowadzanej na początku.
Przy pisaniu sugerowałem się m. in. poradami z tego tematu:
http://cpp0x.pl/forum/temat/?id=20248

Mój kod:
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;


bool czybyla( int tab[], int tab_losowa[], int poz )
{
    int i = 0;
    do
    {
        if( tab_losowa[ i ] == tab[ poz ] )
             return false;
       
        i++;
    } while( i < 3 );
   
    return true;
}

void wczytaj( int tab[] )
{
    int i = 0;
    int j = 1;
    int liczba = 0;
    do
    {
        cout << "podaj " << j << " liczbe: ";
        cin.clear();
        cin.sync();
        cin >> tab[ i++ ];
        j++;
    } while( i < 3 );
   
}


void zapodajwynik( int tab[] )
{
    int i = 0;
    cout << "Wynik: ";
    do {
        cout << tab[ i++ ] << "    ";
    } while( i < 2 );
   
    cout << endl << endl;
}


int main()
{
    srand( time( NULL ) );
    int tablica_uzytkownika[ 3 ];
    int tablica_los[ 2 ] = { };
    int liczba = 0;
    int i = 0;
    wczytaj( tablica_uzytkownika );
    do
    {
        liczba = rand() % 3;
        if( czybyla( tablica_uzytkownika, tablica_los, liczba ) == true )
        {
            tablica_los[ i ] = tablica_uzytkownika[ liczba ];
            i++;
        }
    } while( i < 2 );
   
    cout << endl;
    zapodajwynik( tablica_los );
    return 0;
}


Czy moglibyście mnie naprowadzić, co jest skopane? Ewentualnie pojaśnić mi, jeśli zrozumiałem coś źle z zadania, a sam program był akceptowalny.
PS. Proszę o wyrozumiałość dla żółtodzioba :)
P-135084
pekfos
» 2015-07-22 13:53:12
C/C++
bool czybyla( int tab[], int tab_losowa[], int poz )
{
    int i = 0;
    do
    {
        if( tab_losowa[ i ] == tab[ poz ] )
             return false;
       
        i++;
    } while( i < 3 );
   
    return true;
}
tab_losowa ma 2 elementy, a nie 3. Zawsze sprawdzasz całą, choć jest niezainicjalizowana. Bez sensu przekazujesz tab i poz. Do tego podejście jest złe, bo powinieneś losować indeksy, a nie liczby użytkownika.
P-135086
xKTN
Temat założony przez niniejszego użytkownika
» 2015-07-22 14:02:04
Dzięki za odpowiedź, po poprawieniu 3 na 2 we wskazanym przez Ciebie fragmencie kodu program zaczął funkcjonować dobrze. Tak czy siak chyba przebuduję go całkowicie, zarówno ze względu na Twoje uwagi jak i ze względu na dodatkowe ćwiczenie. :)
P-135088
« 1 »
  Strona 1 z 1