rozdzial/lekcja 21, zadanie domowe
Ostatnio zmodyfikowano 2022-04-09 11:46
jebackoze Temat założony przez niniejszego użytkownika |
rozdzial/lekcja 21, zadanie domowe » 2022-04-09 01:10:33 hej, mam nadzieje, ze kod jest sprawny i dziala, ale nurtuje mnie jedna kwestia. na podstawie przykladu nr 1: co jesli wszystkie trzy podane liczby beda takie same? program bedzie dzialal bez konca. tresc zadania nie wskazuje na zadne zabezpieczenie totez nie wiem jak podejsc do zadania. powinno byc czy jednak to jeszcze nie czas na zniszczenie kursanta? #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void podajLiczby( int tablica[ ], int ileWpisac ) { cout << "podaj: " << ileWpisac << " liczby." << endl; int i = 0; do { cin >> tablica[ i ]; ++i; } while( i < ileWpisac ); }
int wylosuj( int tablica[ ], int iWielkosc ) { srand( time( NULL ) ); int i =(( std::rand() % iWielkosc ) + 0 ); return tablica[ i ]; }
bool sprawdzenie( int iLiczba, int tab[ ], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int main() { int wylosowana, losy = 0; int iloscT, iloscL; cin >> iloscT; cin >> iloscL; int podaneLiczby[ iloscT ]; int wylosowaneLiczby[ iloscL ]; podajLiczby( podaneLiczby, iloscT ); do { wylosowana = wylosuj( podaneLiczby, iloscL ); if( sprawdzenie( wylosowana, wylosowaneLiczby, losy ) == false ) { wylosowaneLiczby[ losy ] = wylosowana; ++losy; } } while( losy < iloscL ); losy = 0; do { cout << "\nwylosowana liczba to: " << wylosowaneLiczby[ losy ]; ++losy; } while( losy < iloscL ); return 0; } jesli mialoby byc zabezpieczenie to myslalem o jakiejs funkcji, o dodaniu fragmentow kodow, ale nie moge tego chwycic. ponizej kod dla 1 zadania, gdzie losowalo sie 3 liczby. wiem, ze te ponizsze kody maja bledy i chyba utknalem bool powtorzen( int index, int tab[ ], int ile ) { int i; i = index - 1; do { if( tab[ i ] == tab[ index ] ) return false; --i; } while( i >= 0 ); return true; } oraz ponizszy kod, przed losowaniem int index; index = iloscT; do { --index; if( powtorzen( index, podaneLiczby, 2 ) == false ) --iloscL; } while( index >= 0 );
|
|
pekfos |
» 2022-04-09 11:26:37 co jesli wszystkie trzy podane liczby beda takie same? program bedzie dzialal bez konca. Nie jest wprost powiedziane czym jest tu "powtórzenie". Użytkownik wprowadza 3 zmienne i program ma wybrać dwie z nich bez powtórzeń. Unikalność wartości w tych zmiennych to zupełnie inna sprawa. int wylosuj( int tablica[ ], int iWielkosc ) { srand( time( NULL ) ); int i =(( std::rand() % iWielkosc ) + 0 ); return tablica[ i ]; } Resetujesz tu generator losowy przed każdym losowaniem, a time() ma tylko sekundową precyzję. Losowanie bez powtórzeń będzie tu trochę trwało. |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-09 11:46:48 wiec wszystko jasne, nie ma potrzeby aby wylosowane wartosci byly unikanlne wzgledem siebie. czyli linie srand( time( NULL ) ); lepiej przeniesc do int mainEDYCJA: jednak pierwszy kod byl bledny bo mimo, ze losowalem indeks tablicy to pozniej za pomoca funkcji bool zamiast sprawdzac wylosowane indeksy to sprawdzialem wystapienie danej liczby. wszystko dzialalo dopoki wpisywalem rozne liczby, ale jak podalem te same to program sie nie mogl zakonczyc. #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void podajLiczby( int tablica[ ], int ileWpisac ) { cout << "podaj: " << ileWpisac << " liczby." << endl; int i = 0; do { cin >> tablica[ i ]; ++i; } while( i < ileWpisac ); }
int wylosuj( int iWielkosc ) { return( std::rand() % iWielkosc ) + 0; }
bool sprawdzenie( int iLiczba, int tab[ ], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; ++i; } while( i < ile ); return false; }
int main() { srand( time( NULL ) ); int index, losy = 0; int iloscT, iloscL; cin >> iloscT; cin >> iloscL; int podaneLiczby[ iloscT ]; int tablicaIndexow[ iloscL ]; podajLiczby( podaneLiczby, iloscT ); do { index = wylosuj( iloscL ); if( sprawdzenie( index, tablicaIndexow, losy ) == false ) { tablicaIndexow[ losy ] = index; ++losy; } } while( losy < iloscL ); losy = 0; do { cout << "\nwylosowana liczba to: " << podaneLiczby[ tablicaIndexow[ losy ] ]; ++losy; } while( losy < iloscL ); return 0; } |
|
« 1 » |