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

Losowanie bez powtórzeń - zadanie domowe nr 1

Ostatnio zmodyfikowano 2015-11-04 21:12
Autor Wiadomość
Lich555
Temat założony przez niniejszego użytkownika
Losowanie bez powtórzeń - zadanie domowe nr 1
» 2015-10-31 10:27:48
Witam.
Chciałbym zapytać, co w tym programie jest źle i czy daleko mu do poprawnego działania? :P Jest to zadanie domowe z rozdziału 21 - Losowanie bez powtórzeń.

C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

bool czybyla( int iKac, int iiLiczba[] )
{
    int i = 0;
    if( iKac <= i )
         return false;
   
    do
    {
        if( iiLiczba[ i ] == iKac )
             return true;
       
        i++;
    } while( i < 2 );
   
    return false;
}

int los( int iLiczba[] )
{
    return( iLiczba[ rand() % 2 ] );
}

int main()
{
    srand( time( NULL ) );
    int liczba[ 3 ];
    int i = 0;
    int wylos = 0;
   
    cout << "Podaj 3 liczby" << endl;
    for( int i = 0; i < 3; i++ )
         cin >> liczba[ i ];
   
    cout << endl;
    int kac = los( liczba );
    do
    {
        if( czybyla( kac, liczba ) == false )
             liczba[ wylos ] = kac;
       
        cout << kac << endl;
       
        wylos++;
    } while( wylos < 2 );
   
    return 0;
}
P-139407
carlosmay
» 2015-10-31 10:30:37
co w tym programie jest źle i czy daleko mu do poprawnego działania?
 a w czym jest problem? Konkretnie.
P-139408
Lich555
Temat założony przez niniejszego użytkownika
» 2015-10-31 10:41:33
Treść zadania jest następująca: "napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje."

Mój program wykonuje się tak, jak to widać na poniższym scnie:
http://imgur.comcRXPWcm.png
P-139410
carlosmay
» 2015-10-31 12:07:14
Nie wstawiłeś obrazka.

Utwórz drugą tablicę do przechowania dwóch wylosowanych indeksów i na koniec wypisz to co pod nimi się kryje.
P-139412
Lich555
Temat założony przez niniejszego użytkownika
» 2015-11-02 11:42:35
Eh... No cóż, myślę, że zbliżam się coraz bardziej do poprawnego działania, ale niestety to jeszcze nie jest to...
Jest taki problem, że wypisuję 3 liczby dajmy na to 1):9, 2):3, 3):1  lecz program wypisuje mi tylko liczby z przedziału 1)-2). Drugi problem jest taki, że niepoprawnie sprawdza mi, czy dana liczba już była, czyli może zdarzyć się sytuacja, kiedy wypisze mi na ekran: 1), 1)...

C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

bool czybyla( int iwylosowane[], int iiLiczba[], int iWylos )
{
    int i = 0;
    if( iWylos <= i )
         return false;
   
    do
    {
        if( iiLiczba[ i ] == iwylosowane[ i ] )
             return true;
       
        i++;
    } while( i < iWylos );
   
    return false;
}

int los( int iWylosowane[], int iLiczba[] )
{
    for( int i = 0; i < 2; i++ )
         iWylosowane[ i ] =( iLiczba[ rand() % 2 ] );
   
    return iWylosowane[ 2 ];
}

int main()
{
    srand( time( NULL ) );
    int liczba[ 3 ];
    int wylos = 0;
    int wylosowane[ 2 ];
   
    cout << "Podaj 3 liczby" << endl;
    for( int i = 0; i < 3; i++ )
         cin >> liczba[ i ];
   
    cout << endl;
    wylosowane[ 2 ] = los( wylosowane, liczba );
    do
    {
        if( czybyla( wylosowane, liczba, wylos ) == false )
             liczba[ wylos ] = wylosowane[ wylos ];
       
        cout << wylosowane[ wylos ] << endl;
       
        wylos++;
    } while( wylos < 2 );
   
    return 0;
}

Przykładowe działania programu:
http://i.imgur.com/V3wG5D3.png.
P-139508
carlosmay
» 2015-11-02 11:58:17
C/C++
int los( int iWylosowane[], int iLiczba[] )
{
    for( int i = 0; i < 2; i++ )
         iWylosowane[ i ] =( iLiczba[ rand() % 2 ] );
   
    return iWylosowane[ 2 ];
}
 ta funkcja zwraca wartość spod iWylosowane[2] a nie całą tablicę.

Losuj dwa indeksy spośród trzech i sprawdzaj czy nr indeksów nie powtarzają się.

Weź pod uwagę że user może podać trzy takie same wartości więc program może działać w niekonieczność, albo sprawdzaj liczby usera (aby były bez powtórzeń).
P-139509
Lich555
Temat założony przez niniejszego użytkownika
» 2015-11-02 13:26:26
Ale przecież ta tablica ma rozmiar 2, do tego momentu się inkrementuje, więc wylosowane wartości zapisywane są do tego też momentu. To po co ma zwracać całą tablicę? Jak ta tablica powiedzmy wygląda w taki sposób [15][41][][][][][][] to przecież można zwrócić tylko 2 pierwsze elementy i powinno być ok.
Co do losowania to właśnie podczas pisania tego posta znalazłem błąd (tak mi się przynajmniej wydaje).
C/C++
for( int i = 0; i < 2; i++ )
     iWylosowane[ i ] =( iLiczba[ rand() % 2 ] );

To powinno przecież wyglądać w ten sposób:
C/C++
for( int i = 0; i < 2; i++ )
     iWylosowane[ i ] =( iLiczba[ rand() % 3 ] );


Ale nadal nie rozumiem, dlaczego jest błąd w sprawdzaniu...
P-139512
carlosmay
» 2015-11-02 13:43:24
to przecież można zwrócić tylko 2 pierwsze elementy
 
return iWylosowane[ 2 ];
 zwraca drugi a nie pierwsze dwa elementy tablicy.

Co do losowania to właśnie podczas pisania tego posta znalazłem błąd (tak mi się przynajmniej wydaje).
C/C++
for( int i = 0; i < 2; i++ )
     iWylosowane[ i ] = rand() % 2;

 
 tutaj iWylosowane[2] możesz użyć jako indeksy dla liczby[3]

C/C++
for( int i = 0; i < 2; i++ )
     iWylosowane[ i ] =( iLiczba[ rand() % 3 ] );

 
 natomiast tego możesz użyć bezpośrednio dla wprowadzonych wartości, po uprzednim zabezpieczeniu liczb wprowadzanych przez użytkownika
P-139514
« 1 » 2
  Strona 1 z 2 Następna strona