Chowan Temat założony przez niniejszego użytkownika |
rozdzial 21 zadanie domowe » 2017-03-27 00:37:46 nie wiem dlaczego wyrzuca mi 2 liczbę nie wiadomo skąd, pytałem wcześniej o podobne zadanie i zastosowałem się do tamtych wskazówek, sprawdzałem kod częściami i coś jest źle chyba w funkcji sprawdzającej albo w warunku if w funkcji main bo jak wypisze 2 na 3 liczby takie same to sprawdzając kilka razy to losuje mi jednak 2 te same liczby czasem. dodatkowo czasem losuje jakąś duza liczbę, która nie jest zadeklarowana w tablicy. edit z ta liczba duza chyba sobie poradziłem. #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void wczytanie( int tablica[] ) { cout << "Podaj 3 losowe liczby: "; for( int i = 0; i < 3; i++ ) { cin >> tablica[ i ]; } } int losowanie() { return rand() % 3; } bool sprawdzanie( int tablica[], int liczba, int ile_liczb ) { for( int i = 0; i < ile_liczb; i++ ) { if( tablica[ i ] == liczba ) return false; i++; } return true; } int main() { srand( time( NULL ) ); int tablica[ 3 ]; int tab[ 2 ]; wczytanie( tablica ); for( int i = 0; i < 2; ) { int liczba = tablica[ losowanie() ]; if(( sprawdzanie( tablica, liczba, i ) ) == true ) { tab[ i ] = liczba; i++; } } for( int i = 0; i < 2; i++ ) { cout << "liczba " << i + 1 << " = " << tab[ i ]; } return 0; }
|
|
karambaHZP |
» 2017-03-27 00:54:02 for( int i = 0; i < 2; i++ ) { int liczba = tablica[ losowanie() ]; if(( sprawdzanie( tablica, liczba, i ) ) == true ) { tab[ i ] = liczba; i++; } } |
inkrementujesz zmienną i niezależnie od wyniku sprawdzania liczby, a w chwili wykonania instrukcji if inkrementujesz dwukrotnie. |
|
Chowan Temat założony przez niniejszego użytkownika |
» 2017-03-27 01:01:01 poprawiłem to chwile wcześniej zanim napisałeś i załatwiło to problem dziwnych liczb(jak sprawdzałem wcześniej czy wczytywanie i zapis sam działa to mi zostało), ale dalej przy podaniu 2 z 3 liczb takich samych to warunek sprawdzający nie działa i zwraca mi czasem liczby z powtórzeniem w dalszym ciagu. probowalem zamienic petle for na int i = 0; do { int liczba = tablica[ losowanie() ]; if(( sprawdzanie( tablica, liczba, i ) ) == true ) { tab[ i ] = liczba; i++; } } while( i < 2 &&( tab[ 0 ] = tab[ 1 ] ) );
to wywala dziwne liczby |
|
karambaHZP |
» 2017-03-27 10:53:41 bool sprawdzanie( int tablica[], int liczba, int ile_liczb ) { for( int i = 0; i < ile_liczb; i++ ) { if( tablica[ i ] == liczba ) return false; i++; } return true; } |
Ten sam problem z inkrementacją. Sprawdzasz tylko co drugi element tablicy. edti: Co się stanie jeśli użytkownik poda trzy razy tą samą liczbę? Zabezpiecz program przed podawaniem takich samych liczb, lub dopuść taką możliwość i opieraj się na niepowtarzających się indeksach. |
|
Chowan Temat założony przez niniejszego użytkownika |
» 2017-03-29 12:00:54 co do 3 tych samych liczb to bez sensu bo nie o to chodzi w zadaniu, ale tez się nad tym zastanawiałem. A dwie liczby wpisac trzeba takie same bo jak inaczej sprawdzić czy losuje bez powtórzeń. Po posiedzeniu dużo godzin nad tym udało mi sie zrobić i sie nie powarzają. Bład był w funkcji in main(), w warunku sprawdzającym pobrałem tablice 3 elementową. Po zamianie jej na tablice 2 elementowa zawsze losuje dwie różne liczby przynajmniej w tych kilkunastu razach, kiedy odpalałem program dla testu. Sprawdzałem na kolejnym zadaniu i 8/10 elementów losuje bez powtórzeń. |
|
carlosmay |
» 2017-03-29 15:43:20 co do 3 tych samych liczb to bez sensu bo nie o to chodzi w zadaniu |
Czyżby? Trzy elementy tablicy to trzy różne liczby, a że mają taką samą wartość tu już inna sprawa. karambaHZP dał dobry przykład. |
|
Chowan Temat założony przez niniejszego użytkownika |
» 2017-04-05 13:01:37 to w takim wypadku wypadałoby od razu zabezpieczyć przed wprowadzaniem liter itp... przerost formy nad treścią. Wprowadzenie dwóch liczb takich samych jest potrzebne, aby sprawdzić czy funkcja losuje naprawdę bez powtórzeń czyli czy spełnia założenia z zadania. |
|
carlosmay |
» 2017-04-05 14:18:08 to w takim wypadku wypadałoby od razu zabezpieczyć przed wprowadzaniem liter itp |
To nie jest konieczne, ale nie zaszkodzi. Czy zabezpieczenie się przed użytkownikiem "yeti" jest przerostem formy nad treścią sam sobie odpowiedz. Wpisanie trzech takich samych wartości spowoduje zawieszenie programu, więc warto o tym pomyśleć. Wprowadzenie dwóch liczb takich samych jest potrzebne, aby sprawdzić czy funkcja losuje naprawdę bez powtórzeń czyli czy |
Wystarczy wylosować dwie z dwóch, aby to zweryfikować. |
|
« 1 » 2 |