neferx Temat założony przez niniejszego użytkownika |
Rozdział 21. Problem z zadaniem » 2016-07-13 16:26:30 Mam problem z zadaniem z 21 rozdziału. Udało mi się napisać coś takiego, ale program mimo wszystko losuje liczby, które się powtarzają, a ja nie mogę dojść jak temu zapobiec. #include <iostream> #include <ctime> #include <cstdlib> using namespace std;
int losowanie() { return( rand() % 9 + 1 ); }
bool sprawdzenie( int * liczby, int ktora, bool abc ) { for( int i = 0; i < 5; i++ ) { if( liczby[ ktora ] == liczby[ i ] ) { return abc = true; } } ktora++; return abc = false; }
int main() { srand( time( 0 ) ); bool abc = false; int wylosowane[ 5 ]; int ktora = 0; for( ktora; ktora < 5; ktora++ ) { do { abc = sprawdzenie( wylosowane, ktora, abc ); if( abc == true ) { wylosowane[ ktora ] = losowanie(); } } while( abc == false ); } for( int i = 0; i < 5; i++ ) { cout << wylosowane[ i ] << endl; } return 0; }
|
|
marcolo2307 |
» 2016-07-13 18:03:13 1. Dlaczego deklarujesz ktora przed for, skoro i tak z niej później nie korzystasz? Powinieneś mieć chociaż ostrzeżenie, że for( ktora;...) nie ma efektu. 2. return true albo return false . Zmiana wartości abc i tak ci nic nie da bo to kopia, a nie oryginał. 3. To samo ze zmienną ktora . W funkcji sprawdz inkrementujesz jej kopię, a nie ją samą. Dodatkowo potem inkrementujesz ją w pętli w mainie, tak więc coś pominiesz. Poczytaj sobie o referencjach.4. W funkcji sprawdz robisz coś w stylu: int a = 0; if( tab[ a ] ==[ tab[ 0 ] ) . Popraw to. 5. Popraw co napisałem wyżej i spróbuj jeszcze raz napisać main'a. |
|
neferx Temat założony przez niniejszego użytkownika |
» 2016-07-13 19:03:51 Czy teraz punkty 1-4 są dobrze? #include <iostream> #include <ctime> #include <cstdlib> using namespace std;
int losowanie() { return( rand() % 9 + 1 ); }
bool sprawdzenie( int * liczby, int ktora, bool abc, int i ) { if( liczby[ ktora ] == liczby[ i ] ) { return true; } else { return false; } }
int main() { srand( time( 0 ) ); bool abc = false; int wylosowane[ 5 ]; for( int ktora = 0; ktora < 5; ktora++ ) { do { for( int i = 0; i < 5; i++ ) { abc = sprawdzenie( wylosowane, ktora, abc, i ); } if( abc == true ) { wylosowane[ ktora ] = losowanie(); } } while( abc == false ); } for( int i = 0; i < 5; i++ ) { cout << wylosowane[ i ] << endl; } return 0; }
|
|
marcolo2307 |
» 2016-07-13 19:22:37 if( wylosowane[ ktora ] == wylosowane[ i ] ) zwróci true , jeśli wywołasz ją dla i == ktora . Poprzednia funkcja do sprawdzania była nawet OK, tylko musisz dodać ten warunek i usunąć z argumentów bool abc . Pętla wykonuje się tak długo, jak spełniony jest warunek. Punkt 4 się nie zmienił. Wystarczy w if dodać jeszcze jeden warunek do pierwszej wersji sprawdzenie (po poprawkach, które opisałem w punktach 2. i 3.). Co do main'a, to podpowiem Ci, że musisz losować tak długo, dopóki na nowo wylosowana liczba nie zwróci ci abc == false . |
|
neferx Temat założony przez niniejszego użytkownika |
» 2016-07-13 20:35:50 bool sprawdzenie( int * wylosowane, int ktora ) { for( int i = 0; i < 5; i++ ) { if( wylosowane[ ktora ] == wylosowane[ i ] ) { if( wylosowane[ ktora ] == wylosowane[ ktora ] ) { } else { return true; } } } return false; }
Teraz jesli np. wylosowane[ 0 ] porowna sie do wylosowane[ 0 ] to nie zwroci prawdy, dobrze rozumiem? |
|
marcolo2307 |
» 2016-07-13 21:03:19 if( wylosowane[ ktora ] == wylosowane[ ktora ] ) zwróci zawsze prawdę. Do warunku pierwszego if'a dopisz tylko && ktora != i i jeśli to prawda, zwróć prawdę. Dzięki temu masz gwarancję, że nie pozostaną porównane te same indeksy. |
|
neferx Temat założony przez niniejszego użytkownika |
» 2016-07-13 21:17:31 Niemożliwe :o! Wygląda na to, że działa. #include <iostream> #include <ctime> #include <cstdlib> using namespace std;
int losowanie() { return( rand() % 9 + 1 ); }
bool sprawdzenie( int * wylosowane, int ktora ) { for( int i = 0; i < 5; i++ ) { if( wylosowane[ ktora ] == wylosowane[ i ] && ktora != i ) { return true; } } return false; }
int main() { srand( time( 0 ) ); bool nowaliczbatest; int wylosowane[ 5 ]; for( int ktora = 0; ktora < 5; ktora++ ) { wylosowane[ ktora ] = losowanie(); nowaliczbatest = sprawdzenie( wylosowane, ktora ); if( nowaliczbatest == true ) { do { wylosowane[ ktora ] = losowanie(); nowaliczbatest = sprawdzenie( wylosowane, ktora ); } while( nowaliczbatest == true ); } } for( int i = 0; i < 5; i++ ) { cout << wylosowane[ i ] << endl; } return 0; }
|
|
marcolo2307 |
» 2016-07-13 21:23:31 Tego if'a możesz usunąć, do while zadziała tak samo. I zamknij temat. |
|
« 1 » 2 |