polka260 Temat założony przez niniejszego użytkownika |
Praca domowa 21 rodział - Losowanie bez powtórzeń » 2016-11-23 21:52:46 Mam taki mały problemik. To mój kod:
#include <iostream> #include <cstdlib> #include <ctime> #include <conio.h> using namespace std;
bool czy_nalezy_do_glownej_tabeli( int liczba, int tab[] ) { int i = 0; do { if( liczba != tab[ i ] ) return false; if( liczba == tab[ i ] ) return true; i++; } while( i < 3 ); return false; }
bool czy_bylo( int liczba, int tab[] ) { int i = 0; do { if( liczba != tab[ i ] ) return true; else i++; } while( i < 2 ); return false; }
int wczytywanie( int tab[], int ile ) { int i = 0; do { cout << "Wprowadz liczbe z przedzialu 1-10: " << endl; int a; cin >> a; if( a > 0 && a < 11 ) { tab[ i ] = a; i++; } cin.clear(); cin.sync(); } while( i < ile ); return tab[ i ]; }
int main() { srand( time( NULL ) ); int glowna_tablica[ 3 ]; int wynik_tablica[ 2 ]; int wynik; wczytywanie( glowna_tablica, 3 ); cout << "Glowna tablica to " << endl; int i = 0; do { cout << glowna_tablica[ i ] << endl; i++; } while( i < 3 ); i = 0; do { wynik =( rand() % 10 ) + 1; cout << "Wylosowano " << wynik << endl; if(( czy_nalezy_do_glownej_tabeli( wynik, glowna_tablica ) == true ) &&( czy_bylo( wynik, wynik_tablica ) == false ) ) { cout << "Wynik nalezy do tabeli i nie bylo go w wnikach.\n"; wynik_tablica[ i ] = wynik; i++; } } while( i < 2 ); i = 0; cout << "Wylosowane liczby to:\n"; do { cout << wynik_tablica[ i ] << endl; i++; } while( i < 2 ); return 0; }
Wiem, że chaotycznie napisane, poprawię to jak tylko wszystko będzie dobrze działać :) Prawie wszystkie cout'y są wypisane dla pomocy (oczywiście potem uproszczę), dzięki czemu widzę, że program nie działa od tego momentu: if(( czy_nalezy_do_glownej_tabeli( wynik, glowna_tablica ) == true ) &&( czy_bylo( wynik, wynik_tablica ) == false ) )
Wydaje mi się, że problem jest w bool czy_bylo , bo kiedy wcześniej był tylko bool czy_nalezy_do_glownej_tabeli wszytsko było w porządku. Jakieś sugestie? :D |
|
karambaHZP |
» 2016-11-23 23:53:37 do { if( liczba != tab[ i ] ) return false; if( liczba == tab[ i ] ) return true; i++; } while( i < 3 ); |
W tej pętli masz skopaną logikę. Przez te instrukcje warunkowe nic nie przechodzi i pętla kończy działanie na pierwszym obiegu. Pomyśl: jeśli liczba jest równa to wyjdź z true, jeśli liczba jest różna to wyjdź z false. Na tym koniec, bo liczba jest albo nie jest równa. |
|
Dither |
» 2016-11-27 15:59:05 #include <iostream> #include <cstdlib> #include <ctime> int losuj( int tablica[], int ile ) { int i = 0; int liczba; do { do { liczba = std::rand(); if( tablica[ i ] == liczba ) return liczba; i++; } while( i < ile ); i = 0; } while( liczba == tablica[ i ] ); } void wczytaj( int tablica[], int ile ) { int i = 0; do { std::cout << "liczba nr " << i + 1 << ": "; std::cin >> tablica[ i ]; std::cout << std::endl; i++; } while( i < ile ); return; }
void wyswietl( int tablica[], int ile ) { if( ile <= 0 ) { std::cout << "Tablica jest pusta." << std::endl; return; } int i = 0; do { std::cout << tablica[ i ] << ", "; i++; } while( i < ile ); std::cout << std::endl; }
int dopisz( int iLiczba, int tablica[], int ile ) { tablica[ ile ] = iLiczba; ile++; return ile; } bool spr( int iLiczba, int tablica[], int ile ) { if( ile <= 0 ) return true; int i = 0; do { if( tablica[ i ] == iLiczba ) return false; i++; } while( i < ile ); return true; }
int main() { srand( time( NULL ) ); std::cout << "podaj liczby do losowania" << std::endl; int licz = 0; int licznik = 0; int tablicawyn[ 8 ], tablicawej[ 10 ]; wczytaj( tablicawej, 10 ); wyswietl( tablicawej, 10 ); do { licz = losuj( tablicawej, 10 ); if( spr( licz, tablicawyn, licznik ) ) licznik = dopisz( licz, tablicawyn, licznik ); } while( licznik < 8 ); wyswietl( tablicawyn, licznik ); return 0; }
napisałem to w ten sposób - kod działa o ile nie wpiszemy tych samych liczb na wejściu. problem polega na tym, że zawsze losuje i podaje w wyniku liczbę nr 1. czy ktoś ma jakiś pomysł aby to poprawić? |
|
kirito1996 |
» 2016-12-08 11:03:38 też jestem przy tym zadaniu i się zastanawiałem czy tak ma to zadanie wyglądać czy może te 2 liczby ma wylosować ale ma sprawdzić całą tablice ;D czy się nie powtarza xD |
|
carlosmay |
» 2016-12-08 11:11:58 @kirito1996 - albo zadbaj, aby wprowadzane dane były unikatowe, lub zadbaj aby program wylosował unikatowe indeksy. Druga opcja jest łatwiejsza. |
|
kirito1996 |
» 2016-12-08 11:26:56 racja trzeba być ambitnym ;D a o co ci chodzi mówiąc "unikatowe indeksy" pokażesz na przykładzie ? hehe a co do zadania to ma działać w taki sposób "ja podaję 2 3 4 a program wylosuje 2 i 3 ? |
|
carlosmay |
» 2016-12-08 13:41:19 Losowanie indeksów daje gwarancję powodzenia. Np. tablica ma 3 elementy. Losujesz dwa indeksy bez powtórzeń i zawsze masz jakieś wynik. Natomiast dla wprowadzonych liczb 3 3 3 losowanie nigdy się nie skończy. Możesz spróbować sił w takich rozwiązaniach: #include <vector> #include <algorithm> #include <iostream> #include <random> #include <chrono>
int main() { auto seed = std::chrono::system_clock::now().time_since_epoch().count(); std::vector < int > v { 1, 2, 3 }; std::shuffle( v.begin(), v.end(), std::default_random_engine( seed ) ); int nNumsToPrint = 2; for( int i = 0; i < nNumsToPrint; ++i ) { std::cout << v[ i ] << ' '; } } |
|
« 1 » |