Wadim Temat założony przez niniejszego użytkownika |
Lekcja 21: Losowanie bez powtórzen - Praca domowa » 2015-07-14 13:18:47 Nie mogę poradzić sobie z praca domową z lekcji 21. Siedzę nad nią już kilka godzin. Liczby się wczytują, losuje mi się 2 z nich, ale występują powtórzenia. Oto co do tej pory zrobiłem: #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
int f1( int a[] ) { int i = 0; cout << "Podaj 3 liczby: " << endl; do { cin >> a[ i ]; i++; } while( i < 3 ); return 0; }
int f2() { return( rand() % 2 ) + 1; }
bool f3( int a[], int b, int z ) { if( z <= 0 ) return true; int i = 0; do { if( a[ i ] == b ) return false; i++; } while( i < z ); return true; }
int main() { srand( time( NULL ) ); int x[ 2 ]; int z = 0; f1( x ); f2(); do { int y = f2(); if( f3( x, y, z ) == true ) { x[ z ] = y; cout << x[ z ] << ' '; z++; } } while( z < 2 ); return 0; } Kompletnie się pogubiłem i zaczynam mieć dosyć programowania, a chciałbym dalej się uczyć. Z góry dziękuje za pomoc. |
|
carlosmay |
» 2015-07-14 13:54:47 Programowanie wymaga cierpliwości. Zmienna int y; jest niezainicjalizowana przed użyciem. int i =( rand() % 2 ) + 1; losujesz indeks, a indeksy startują od zera więc liczby też losuj od zera int i = rand() % 3; Zacznij od nowa ten program: - stosuj nazwy zmiennych sugerujących ich przeznaczenie np, int liczby[ 3 ] , int losuj_liczbe( int tab[], int liczba ); , bool czy_liczba_byla( int tab[], int liczba ); edit: i jeszcze tablica ma trzy elementy, nie dwa int x[ 3 ]; |
|
carlosmay |
» 2015-07-14 14:44:57
#include <iostream> #include <cstdio>
#include <ctime> using namespace std;
int losujTab1() { return( rand() % 10 ) + 1; }
bool czyByloTab1( int liczba, int t1[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( t1[ i ] == liczba ) return true; i++; } while( i < ile ); return false; }
int losujTab2( int ile ) { return( rand() % ile ); }
bool czyByloTab2( int liczba, int t2[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( t2[ i ] == liczba ) return true; i++; } while( i < ile ); return false; }
int main() { srand( time( NULL ) ); int tab1[ 3 ]; int tab2[ 2 ]; int t_indeks[ 2 ]; int liczbaTab1; int wylosIndeks; int i = 0; do { liczbaTab1 = losujTab1(); if( czyByloTab1( liczbaTab1, tab1, 3 ) == false ) { tab1[ i ] = liczbaTab1; i++; } } while( i < 3 ); i = 0; do { cout << tab1[ i ] << ", "; i++; } while( i < 3 ); cout << endl << endl; i = 0; do { wylosIndeks = losujTab2( 3 ); if( czyByloTab2( wylosIndeks, t_indeks, 3 ) == false ) { t_indeks[ i ] = wylosIndeks; i++; } } while( i < 2 ); i = 0; do { tab2[ i ] = tab1[ t_indeks[ i ] ]; i++; } while( i < 2 ); i = 0; do { cout << tab2[ i ] << ", "; i++; } while( i < 2 ); cout << "\n\n"; system( "pause" ); return 0; }
Przeanalizuj ten kod, może coś z niego ci się przyda. To jest to samo zadanie, tylko zamiast wprowadzać liczby ręcznie, program sam je wybiera, a później z tych wybranych wybiera dwie bez powtórzeń. |
|
Wadim Temat założony przez niniejszego użytkownika |
» 2015-07-14 19:40:56 Siedzę od 10 godzin nad tym zadaniem i nie mogę go zrobić. Oto co mam do tej pory: #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
int wczytaj_liczby( int liczby[] ) { cout << "Podaj 3 liczby: " << endl; int i = 0; do { cin >> liczby[ i ]; i++; } while( i < 3 ); return 0; }
int losuj_liczby( int liczby[] ) { int i = rand() % 3; return liczby[ i ]; }
bool czy_byla_wylosowana( int liczby[], int wylosowane_liczby[], int wylosowanych ) { if( wylosowanych <= 0 ) return true; int i = 0; do { if( liczby[ i ] == wylosowane_liczby[ i ] ) return false; i++; } while( i < wylosowanych ); return true; }
int main() { srand( time( NULL ) ); int liczby[ 3 ]; int wylosowane_liczby[ 3 ]; int wylosowanych = 0; int i = 0; wczytaj_liczby( liczby ); do { wylosowane_liczby[ i ] = losuj_liczby( liczby ); i++; } while( i < 3 ); do { if( czy_byla_wylosowana( liczby, wylosowane_liczby, wylosowanych ) == true ) { wylosowanych++; } } while( wylosowanych < 3 ); wylosowanych = 0; do { cout << wylosowane_liczby[ wylosowanych ] << ' '; wylosowanych++; } while( wylosowanych < 2 ); return 0; } |
|
carlosmay |
» 2015-07-14 20:42:13 Taki algorytm: 1. Zapis trzech liczb do tablicy 2. Losuj liczbę od 0 do 2, reprezentujące indeks. 3. Tworzysz drugą tablicę dwuelementowa do zapisania finalnych liczb (wyzeruj ją) 4. Następnie sprawdź czy liczba o wylosowanym indeksie z pierwszej tablicy jest już w drugiej. Jeśli jest losuj ponownie, jeśli nie ma zapisz do drugiej. 5. Na koniec wypisz liczby z drugiej tablicy.
Ps. Piszę mobilnie, jak siądę do blaszaka to dam coś więcej. Powodzenia. |
|
carlosmay |
» 2015-07-14 21:19:30 #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
void wypelnijLiczbyUzytkownika( int tab[] ) { int i = 0; int liczba = 0; do { cin.clear(); cin.sync(); cin >> liczba; tab[ i ] = liczba; ++i; } while( i < 3 ); }
void zerowanie( int tab[] ) { int i = 0; do { tab[ i ] = 0; ++i; } while( i < 2 ); }
void wypiszWyniki( int tab[] ) { int i = 0; do { cout << tab[ i++ ] << "\t"; } while( i < 2 ); cout << endl; }
bool porownaj( int tab_uzyt[], int tab_los[], int ind ) { int i = 0; do { if( tab_los[ i ] == tab_uzyt[ ind ] ) return false; ++i; } while( i < 3 ); return true; }
int main() { srand( time( NULL ) ); int liczby_uzytkownika[ 3 ]; int liczby_losowane[ 2 ]; int i = 0; int indeks = 0; wypelnijLiczbyUzytkownika( liczby_uzytkownika ); zerowanie( liczby_losowane ); i = 0; do { indeks = rand() % 3; if( porownaj( liczby_uzytkownika, liczby_losowane, indeks ) ) { liczby_losowane[ i ] = liczby_uzytkownika[ indeks ]; ++i; } } while( i < 2 ); wypiszWyniki( liczby_losowane ); return 0; }
Ten działa jak trzeba. Popatrz i pomyśl. Dobrze kombinujesz. Musisz porównać liczbę z tablicy liczb wprowadzonych z każdą z tablicy losowanych, zmieniaj tylko indeks losowanych. Ps. Nie ma się co łamać. Czasami musi przyjść olśnienie, aby pójść dalej. Każdy to przerabiał. |
|
Wadim Temat założony przez niniejszego użytkownika |
» 2015-07-14 22:32:33 Baaardzo dziękuję za pomoc. Już odchodziłem od zmysłów. Przeanalizuje sobie dokładnie ten kod kilka razy, ustawie go sobie na tapecie i postaram się go napisać od nowa aby utrwalić sobie to wszystko. Trochę się źle czuje z tym że samodzielnie sobie z tym nie poradziłem, bo jak twierdzi autor kursu, wszystkie potrzebne informację są podane. No cóż... jeszcze raz bardzo dziękuję :) |
|
Wadim Temat założony przez niniejszego użytkownika |
» 2015-07-15 12:47:36 Gdy dzisiaj robiłem jeszcze raz to zadanie, aby je sobie dobrze przećwiczyć, znowu wczytywało mi liczby i nić się dalej nie działo, więc porównałem mój program z programem użytkownika carlosmay i zauważyłem jedną (myślałem, że nie mającą znaczenia) różnicę. Otóż we fragmencie: int main() { srand( time( NULL ) ); int liczby[ 3 ]; int wylosowane[ 2 ]; int index = 0; int i = 0; wczytaj_liczby( liczby ); do { index = rand() % 3; if( czy_byla_wylosowana( liczby, wylosowane, index ) == false ) { wylosowane[ i ] = liczby[ index ]; i++; } } while( i < 2 ); początkowo zamiast wylosowane[ i ] = liczby[ index ]; miałem liczby[ index ] = wylosowane[ i ]; Myślałem że to nie ma znaczenia, bo w matematyce np. nie ma znaczenia czy napiszemy x = 5, czy 5 = x. Taka mała rzecz a psuję cały program. Oczywiście to nie był jedyny błąd, ale najważniejsze, że wróciła mi chęć do programowania :) PS. Nie wiem jeszcze tylko czemu nigdy nie losuje mi pierwszej liczby. Zawsze tylko drugą i trzecią w losowej kolejności. |
|
« 1 » 2 |