czajo5 Temat założony przez niniejszego użytkownika |
lekcja21 program ma losować bez powtórzeń z 3 wybranych liczb ale losuje liczby z innego zakresu » 2017-03-14 23:18:41 witam mam taki problem jak opisałem w tytule. Jeżeli ktoś mógłby mi powiedzieć gdzie tkwi błąd byłbym wdzięczny ( podkreślam , że jestem naprawdę początkujący)
#include <iostream> #include <cstdlib> #include <ctime> int wpisujemy( int wybrana[] , int rozmiar ) { int x = 0; do { std::cout << "podaj" << x + 1 << "liczbe" << std::endl; std::cin >> wybrana[x]; x++; }while( x < rozmiar ); return wybrana[rozmiar]; } bool sprawdzam_czy_wylosowana( int kandydat ,int wylosowana[] , int rozmiar ) { if ( rozmiar <= 0 ) return false; int ile = 0; do { if( kandydat == wylosowana[ ile] ) return true; ile++; }while( ile < rozmiar); return false; } int losuj( int wylosowana[] ) { return wylosowana[ rand() % 3 ]; } int main() { srand(time(NULL)); int wybrana[3]; int wylosowana[2]; wybrana[3] = wpisujemy( wybrana , 3 ); int x ; int los; do { los = losuj( wybrana); if( sprawdzam_czy_wylosowana( los , wylosowana , x ) == false ) { los = wylosowana[ x ]; x++; } }while( x < 2); x = 0; do { std::cout << wylosowana[ x ] << ","; x++; }while( x < 2 ); return 0; }
|
|
maly7 |
» 2017-03-15 02:00:13 int losuj( int wylosowana[] ) { return wylosowana[ rand() % 3 ]; } Ty wcale nie losujesz tutaj liczby która później będzie pobierana tylko zwracasz losowy element tablicy 0, 1 lub 2, a tablica wylosowana ma tylko 2 elementy. Nie masz tutaj żadnego innego losowania. |
|
czajo5 Temat założony przez niniejszego użytkownika |
» 2017-03-15 07:45:35 maly7 - taki mialem zamiar, że w połączeniu z tą pętlą będzie ni wybierało 2 liczby z tablicy wybrana[] ma 3 elementy ale przypisuje jakieś duże liczby do { los = losuj( wybrana ); if( sprawdzam_czy_wylosowana( los, wylosowana, x ) == false ) { los = wylosowana[ x ]; x++; } } while( x < 2 );
|
|
maly7 |
» 2017-03-15 09:44:05 Nigdzie nie nadajesz wartości elementom tablicy wylosowana (albo nie zauważyłem) a je pobierasz. I jak pisałem, masz kod wylosowana [rand%3] wiec może wyjść z tego wylosowana[2] a nie ma takiego elementu tej tablicy, maksymalny element to wylosowana[1] bo ma dwa elementy.
Kolejna rzecz, wybrana[3] = wpisujemy( wybrana , 3 ); nie możesz odwołać się do wybrana[3] bo nie ma takiego elementu, a nawet jeśli dasz wybrana[2] = wpisujemy( wybrana , 3 ); to wypełni ci tylko ostatni element a nie całą tablice. Jeśli chcesz edytować tablice w funkcji, przekaż ją po prostu jako wskaźnik w argumencie. @ Popraw na razie te rzeczy, bo to są podstawy i później można myśleć dalej. |
|
czajo5 Temat założony przez niniejszego użytkownika |
» 2017-03-16 23:54:59 więc po poprawkach został mi jeden problem prawdopodobnie ze sprawdzeniem czy nie ma powtórzenia i dlatego nie przypisuje do tablicy wybrane jakiś kosmos podaj1liczbe 0 podaj2liczbe 1 podaj3liczbe 2 podaj4liczbe 3 podaj5liczbe 4 podaj6liczbe 5 podaj7liczbe 6 podaj8liczbe 7 podaj9liczbe 8 podaj10liczbe 9 twoje liczby to--0 twoje liczby to--1 twoje liczby to--2 twoje liczby to--3 twoje liczby to--4 twoje liczby to--5 twoje liczby to--6 twoje liczby to--7 twoje liczby to--8 twoje liczby to--9 2, 9, 2, 2, 5, 6, 3, 8, twoje liczby to---2 twoje liczby to--1959334242 twoje liczby to--1959680964 twoje liczby to--4273392 twoje liczby to--2686760 twoje liczby to--4273494 twoje liczby to--4273392 twoje liczby to--7421136
Process returned 0 (0x0) execution time : 17.684 s Press any key to continue.
a tutaj kod po zmianach #include <iostream> #include <cstdlib> #include <ctime> int wpisujemy( int wybrana[], int rozmiar ) { int x = 0; do { std::cout << "podaj" << x + 1 << "liczbe" << std::endl; std::cin >> wybrana[ x ]; x++; } while( x < rozmiar ); return wybrana[ rozmiar ]; } void wypisz( int tab[], int rozmiar ) { int i = 0; do { std::cout << "twoje liczby to--" << tab[ i ] << std::endl; i++; } while( i < rozmiar ); } bool sprawdzam_czy_wylosowana( int kandydat, int wylosowana[], int rozmiar ) { if( rozmiar <= 0 ) return false; int ile = 0; do { if( kandydat == wylosowana[ ile ] ) return true; ile++; } while( ile < rozmiar ); return false; } int losuj( int wylosowana[], int n ) { return wylosowana[ rand() % n ]; } int main() { srand( time( 0 ) ); int wybrana[ 10 ]; int wylosowana[ 8 ]; wpisujemy( wybrana, 10 ); wypisz( wybrana, 10 ); int x = 0; int los; do { los = losuj( wybrana, 10 ); std::cout << los << "," << std::endl; if( sprawdzam_czy_wylosowana( los, wylosowana, x ) == false ) { los = wylosowana[ x ]; x++; } } while( x < 8 ); wypisz( wylosowana, 8 ); return 0; }
jakieś wskazówki |
|
mateczek |
» 2017-03-17 08:07:41 int losuj( int wylosowana[], int n ) { return wylosowana[ rand() % n ]; }
if( sprawdzam_czy_wylosowana( los, wylosowana, x ) == false ) { los = wylosowana[ x ]; x++; } do testów zmień sobie deklaracje tablicy wylosowana na taką int wylosowana[ 8 ] { 0 };
|
|
czajo5 Temat założony przez niniejszego użytkownika |
» 2017-03-17 14:34:40 dziękuję bardzo za pomoc już działa był bardzo prosty błąd napisałem los = wylosowana[x] , a powinno być wylosowana[x] = los teraz działa. A tak gwoli odpowiedzi na ostatni post int losuj( int wylosowana[], int n ) { return wylosowana[ rand() % n ]; } int main() ma losować liczbe z zakresu n ,który podaję przez zmienną n a to los = losuj( wybrana, 10 ); std::cout << los << "," << std::endl; if( sprawdzam_czy_wylosowana( los, wylosowana, x ) == false ) { wylosowana[ x ] = los; x++; } } while( x < 8 );
w połączeniu z tym bool sprawdzam_czy_wylosowana( int kandydat, int wylosowana[], int rozmiar ) { if( rozmiar <= 0 ) return false; int ile = 0; do { if( kandydat == wylosowana[ ile ] ) return true; ile++; } while( ile < rozmiar ); return false; }
ma losować bez powtórzeń.Dzięki jeszcze raz za pomoc |
|
mateczek |
» 2017-03-17 16:30:22 wpisz do tablicy cztery takie same liczby |
|
« 1 » 2 |