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ń. #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; }
|
|
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. |
|
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 |
|
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. |
|
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)... #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. |
|
carlosmay |
» 2015-11-02 11:58:17 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ń). |
|
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). for( int i = 0; i < 2; i++ ) iWylosowane[ i ] =( iLiczba[ rand() % 2 ] );
To powinno przecież wyglądać w ten sposób: for( int i = 0; i < 2; i++ ) iWylosowane[ i ] =( iLiczba[ rand() % 3 ] );
Ale nadal nie rozumiem, dlaczego jest błąd w sprawdzaniu... |
|
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).
for( int i = 0; i < 2; i++ ) iWylosowane[ i ] = rand() % 2;
|
tutaj iWylosowane[2] możesz użyć jako indeksy dla liczby[3] 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 |
|
« 1 » 2 |