Rozdział 21. Losowanie bez powtórzeń
Ostatnio zmodyfikowano 2015-07-22 14:02
xKTN Temat założony przez niniejszego użytkownika |
Rozdział 21. Losowanie bez powtórzeń » 2015-07-22 13:45:13 Witam, jak zdążyłem zauważyć, rozdział 21. zbiera spore żniwo wśród kursantów. :) Udało mi się napisać program do zadania 1. (oczywiście całość poprzedzona wertowaniem forum oraz kolejnych lekcji kursu) jednak jego działanie nie do końca mnie satysfakcjonuje. Z diagnozy wynika, że przy wpisaniu dwóch takich samych liczb na początku programu, funkcja sprawdzająca liczby zapętla się w nieskończoność (przynajmniej tak to wygląda, dodałem wyświetlenie znaku % do kodu). Dodatkowo przy "prawidłowym" przebiegu na wyjściu zawsze pojawia się 2. i 3. liczba z puli wprowadzanej na początku. Przy pisaniu sugerowałem się m. in. poradami z tego tematu: http://cpp0x.pl/forum/temat/?id=20248 Mój kod: #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
bool czybyla( int tab[], int tab_losowa[], int poz ) { int i = 0; do { if( tab_losowa[ i ] == tab[ poz ] ) return false; i++; } while( i < 3 ); return true; }
void wczytaj( int tab[] ) { int i = 0; int j = 1; int liczba = 0; do { cout << "podaj " << j << " liczbe: "; cin.clear(); cin.sync(); cin >> tab[ i++ ]; j++; } while( i < 3 ); }
void zapodajwynik( int tab[] ) { int i = 0; cout << "Wynik: "; do { cout << tab[ i++ ] << " "; } while( i < 2 ); cout << endl << endl; }
int main() { srand( time( NULL ) ); int tablica_uzytkownika[ 3 ]; int tablica_los[ 2 ] = { }; int liczba = 0; int i = 0; wczytaj( tablica_uzytkownika ); do { liczba = rand() % 3; if( czybyla( tablica_uzytkownika, tablica_los, liczba ) == true ) { tablica_los[ i ] = tablica_uzytkownika[ liczba ]; i++; } } while( i < 2 ); cout << endl; zapodajwynik( tablica_los ); return 0; }
Czy moglibyście mnie naprowadzić, co jest skopane? Ewentualnie pojaśnić mi, jeśli zrozumiałem coś źle z zadania, a sam program był akceptowalny. PS. Proszę o wyrozumiałość dla żółtodzioba :) |
|
pekfos |
» 2015-07-22 13:53:12 bool czybyla( int tab[], int tab_losowa[], int poz ) { int i = 0; do { if( tab_losowa[ i ] == tab[ poz ] ) return false; i++; } while( i < 3 ); return true; }
| tab_losowa ma 2 elementy, a nie 3. Zawsze sprawdzasz całą, choć jest niezainicjalizowana. Bez sensu przekazujesz tab i poz. Do tego podejście jest złe, bo powinieneś losować indeksy, a nie liczby użytkownika. |
|
xKTN Temat założony przez niniejszego użytkownika |
» 2015-07-22 14:02:04 Dzięki za odpowiedź, po poprawieniu 3 na 2 we wskazanym przez Ciebie fragmencie kodu program zaczął funkcjonować dobrze. Tak czy siak chyba przebuduję go całkowicie, zarówno ze względu na Twoje uwagi jak i ze względu na dodatkowe ćwiczenie. :) |
|
« 1 » |