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

Rozdział 21, Zadanie 1,

Ostatnio zmodyfikowano 2014-06-02 22:54
Autor Wiadomość
Nosferatu272
Temat założony przez niniejszego użytkownika
Rozdział 21, Zadanie 1,
» 2014-06-02 20:19:42
Witam. Kompilator nie wyrzuca żadnych błędów, jednakże aplikacja się wiesza po rozpoczęciu losowania.

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int mod_los( int a, int b, int c )
{
    int wynik;
    wynik =( rand() % 3 ) + 1;
   
    switch( wynik )
    {
    case 1:
        return a;
    case 2:
        return b;
    case 3:
        return c;
    }
   
}

bool czyJuzbyla( int baza[], int ilewbazie, int lwylosowana )
{
    int licznik = 0;
   
    do
    {
        if( baza[ licznik ] == lwylosowana )
             return true;
       
        licznik++;
    } while( licznik < ilewbazie );
   
    return false;
}

void losowanie( int baza[] )
{
   
    cout << endl << "Czas na losowanie!" << endl;;
    system( "pause" );
   
    int ileLosowan = 2;
   
    do
    {
        int wynik = mod_los( baza[ 0 ], baza[ 1 ], baza[ 2 ] );
        if( czyJuzbyla( baza, 3, wynik ) == false )
        {
            cout << "Wylosowano:" << wynik << endl;
            ileLosowan--;
        }
       
    } while( ileLosowan > 0 );
   
}

int main()
{
    srand( time( NULL ) );
   
    int baza[ 3 ];
    int licznik = 1;
    bool czyPoprawnie;
   
    do
    {
        cout << "Wpisz liczbe nr " << licznik << ":";
        cin >> baza[ 0 ];
        czyPoprawnie = cin.good();
        cin.clear();
        cin.sync();
    } while( czyPoprawnie != true );
   
    licznik++;
   
    do
    {
        cout << "Wpisz liczbe nr " << licznik << ":";
        cin >> baza[ 1 ];
        czyPoprawnie = cin.good();
        cin.clear();
        cin.sync();
    } while( czyPoprawnie != true );
   
    licznik++;
   
    do
    {
        cout << "Wpisz liczbe nr " << licznik << ":";
        cin >> baza[ 2 ];
        czyPoprawnie = cin.good();
        cin.clear();
        cin.sync();
    } while( czyPoprawnie != true );
   
    losowanie( baza );
   
    return 0;
}

Jak rozwiązać ten problem?
P-111319
pekfos
» 2014-06-02 20:27:06
czyJuzbyla() tu sprawdza, czy liczba wylosowana z tablicy jest w tej tablicy. Bez sensu.. jak i kilka innych rzeczy w tym kodzie.
P-111321
Nosferatu272
Temat założony przez niniejszego użytkownika
» 2014-06-02 20:48:45
A teraz? Poza tym co jeszcze jest "bez sensu" i dlaczego? Program dalej nie odpowiada dokładnie w tym samym momencie.

C/C++
bool czyJuzbyla( int tablica[], int ilewbazie, int lwylosowana )
{
    int licznik = 0;
   
    do
    {
        if( tablica[ licznik ] == lwylosowana )
             return true;
       
        licznik++;
    } while( licznik < ilewbazie );
   
    return false;
}

void losowanie( int baza[] )
{
   
    cout << endl << "Czas na losowanie!" << endl;;
    system( "pause" );
   
    int ileLosowan = 2;
    int wynik[ 2 ];
    int licznik = 0;
   
    do
    {
        wynik[ licznik ] = mod_los( baza[ 0 ], baza[ 1 ], baza[ 2 ] );
        if( czyJuzbyla( wynik, 2, wynik[ licznik ] ) == false )
        {
            cout << "Wylosowano:" << wynik[ licznik ] << endl;
            licznik++;
        }
       
    } while( licznik < ileLosowan );
   
}
P-111323
Nosferatu272
Temat założony przez niniejszego użytkownika
» 2014-06-02 21:51:33
Dobra, udało mi się rozwiązać problem i program działa, choć dalej jestem ciekaw co w nim jest "bez sensu":
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int mod_los( int a, int b, int c )
{
    int wynik;
    wynik =( rand() % 3 ) + 1;
   
    switch( wynik )
    {
    case 1:
        return a;
    case 2:
        return b;
    case 3:
        return c;
    }
   
}

bool czyJuzbyla( int tablica[], int ilewbazie, int lwylosowana )
{
    int licznik = 0;
   
    do
    {
        if( tablica[ licznik ] == lwylosowana )
             return true;
       
        licznik++;
    } while( licznik < ilewbazie );
   
    return false;
}

void losowanie( int baza[] )
{
   
    cout << endl << "Czas na losowanie!" << endl;;
    system( "pause" );
   
    int ileLosowan = 2;
    int wynik[ 2 ];
    int licznik = 0;
    int proba;
   
    do
    {
        proba = mod_los( baza[ 0 ], baza[ 1 ], baza[ 2 ] );
        if( czyJuzbyla( wynik, 2, proba ) == false )
        {
            wynik[ licznik ] = proba;
            cout << "Wylosowano:" << wynik[ licznik ] << endl;
            licznik++;
        }
       
    } while( ileLosowan > licznik );
   
}

int main()
{
    srand( time( NULL ) );
   
    int baza[ 3 ];
    int licznik = 1;
    bool czyPoprawnie;
   
    do
    {
        cout << "Wpisz liczbe nr " << licznik << ":";
        cin >> baza[ 0 ];
        czyPoprawnie = cin.good();
        cin.clear();
        cin.sync();
    } while( czyPoprawnie != true );
   
    licznik++;
   
    do
    {
        cout << "Wpisz liczbe nr " << licznik << ":";
        cin >> baza[ 1 ];
        czyPoprawnie = cin.good();
        cin.clear();
        cin.sync();
    } while( czyPoprawnie != true );
   
    licznik++;
   
    do
    {
        cout << "Wpisz liczbe nr " << licznik << ":";
        cin >> baza[ 2 ];
        czyPoprawnie = cin.good();
        cin.clear();
        cin.sync();
    } while( czyPoprawnie != true );
   
    losowanie( baza );
   
    return 0;
}
P-111331
PaSaSaP
» 2014-06-02 22:54:47
Nie lubię pętli do..while(). Kod w mainie się powtarza. Mógłbyś zrobić do tego osobną funkcję albo opakować w jakąś pętlę. Po podaniu takich samych wartości program znajduje się w pętli nieskończonej. Użytkownik sam musi martwić się o wprowadzane dane. Funkcja mod_los() mogła by zostać zastąpiona przez losowanie indeksu dla tej całej bazy.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

bool czyJuzbyla( int tablica[], int ilewbazie, int lwylosowana )
{
    for(int i = 0; i < ilewbazie; i++)
        if(tablica[i] == lwylosowana)
            return true;

    return false;
}

void losowanie( int baza[] )
{

    cout << endl << "Czas na losowanie!" << endl;;
    system( "pause" );

    int ileLosowan = 2;
    int wynik[ 2 ];
    int licznik = 0;
    int proba;

    do
    {
        proba = baza[rand() % 3];
        if( czyJuzbyla( wynik, 2, proba ) == false )
        {
            wynik[ licznik ] = proba;
            cout << "Wylosowano:" << wynik[ licznik ] << endl;
            licznik++;
        }

    } while( ileLosowan > licznik );

}

int main(void)
{
    srand( time( NULL ) );

    int baza[ 3 ];
    int licznik = 1;
    bool czyPoprawnie;
    int wartosc;

    while(licznik < 4)
    {
        cout << "Wpisz liczbe nr " << licznik << ":";
        cin >> wartosc;
        if(!cin)
            continue;
        if(czyJuzbyla(baza, 3, wartosc))
            continue;
        baza[licznik - 1] = wartosc;
        licznik++;
    }

    losowanie( baza );

    return 0;
}
P-111336
« 1 »
  Strona 1 z 1