robertn2 Temat założony przez niniejszego użytkownika |
Lekcja 21, Losowanie bez powtórzeń, praca domowa » 2014-07-18 15:38:50 1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje. #include<iostream> #include<cstdlib> #include<ctime>
bool czyByla( int proba, int liczba[], int licznik ) { if( licznik = 0 ) return 0; licznik = 0; do { if( proba == liczba[ licznik ] ) return 1; licznik++; } while( licznik < 2 ); return 0; }
int main() { srand( time( NULL ) ); int liczba[ 3 ]; std::cin >> liczba[ 0 ]; std::cin >> liczba[ 1 ]; std::cin >> liczba[ 2 ]; int licznik = 0; int proba = 0; do { proba = liczba[ rand() % 3 ]; if( czyByla( proba, liczba, licznik ) == 0 ) { std::cout << proba << std::endl; licznik++; } } while( licznik < 2 ); return 0; }
Nie wiem dlaczego, ale gdy podam na wejsciu liczby a, b i c, to na wyjściu otrzymuję zawsze c, c. |
|
robertn2 Temat założony przez niniejszego użytkownika |
» 2014-07-18 15:53:19 Zauważyłem 2 błedy i teraz losuje, ale z powtórzeniami :( Już nie wiem co zrobić. #include<iostream> #include<cstdlib> #include<ctime>
bool czyByla( int proba, int liczba[], int licznik ) { if( licznik == 0 ) return 0; licznik = 0; do { if( proba == liczba[ licznik ] ) return 1; licznik++; } while( licznik < 1 ); return 0; }
int main() { srand( time( NULL ) ); int liczba[ 3 ]; std::cin >> liczba[ 0 ]; std::cin >> liczba[ 1 ]; std::cin >> liczba[ 2 ]; int licznik = 0; int proba = 0; int wynik; do { proba = liczba[ rand() % 3 ]; if( czyByla( proba, liczba, licznik ) == 0 ) { std::cout << proba << std::endl; licznik++; } } while( licznik < 2 ); return 0; }
|
|
unkn9wn |
» 2014-07-18 16:10:24 nie całkiem.
* Podaję 3 liczby: 5 8 5
i za którymś to razem dostaję w odpowiedzi:
8 8
w zadaniu było, że program wylosuje dwie z nich bez powtórzeń.
* Po podaniu trzech takich samych liczb: 8 8 8
program wypisuje jedną z nich i zawiesza się
* zmiennej wynik w ogóle nie używasz
|
|
robertn2 Temat założony przez niniejszego użytkownika |
» 2014-07-18 16:18:57 Tak, zmienna wynik jest nie potrzebna, ale nadal nie mogę zauważyć gdzieś błędu, który powoduje, że raz na ileś razy losuje z powtórzeniami. |
|
unkn9wn |
» 2014-07-18 16:55:19 błąd jest w funkcji sprawdzającej if( licznik = 0 ) return 0;
licznik = 0; do { if( proba == liczba[ licznik ] ) return 1; licznik++; } while( licznik < 1 ); jeżeli wpisujesz np.: 5 8 5 i wylosuje tobie najpierw 8, wypisze ją, gdyż licznik jest 0 za drugim losowaniem wybierze znów 8, przechodzisz do funkcji, licznik ma teraz wartość 1, więc kontynuujesz, licznikowi przypisujesz wartość 0, po czym w pętli w if'ie sprawdzasz czy 8 równa się liczba[0] czyli 5, nie równa się, więc zwiększasz wartość licznik o 1 ( licznik teraz ma wartość 1 ) w związku że licznik nie jest mniejszy od 1 ( licznik < 1 nie jest prawdą) kończy się pętla, a cała funkcja zwraca wartość 0, powróciwszy z funkcji, wypisujesz liczbę 8 po raz drugi Wystarczy po kolei sobie wszystko przelecieć, sprawdzając co krok po kroku twój kod robi ps.: wpisując 3 takie same liczby, np.: 8 8 8 do { proba = liczba[ rand() % 3 ]; if( czyByla( proba, liczba, licznik ) == 0 ) { std::cout << proba << std::endl; licznik++; } } while( licznik < 2 ); licznik nigdy nie osiągnie wartości 2, przez co pętla się nie kończy |
|
robertn2 Temat założony przez niniejszego użytkownika |
» 2014-07-18 20:28:30 Dzięki za pomoc! Jakby ktoś miał taki sam problem to podaję gotowy kod: #include<iostream> #include<cstdlib> #include<ctime>
bool czyByla( int proba[], int liczba[], int licznik ) { if( licznik == 0 ) return 0; int a = 0; do { if( proba[ licznik ] == proba[ a ] ) return 1; a++; } while( a < licznik ); return 0; }
int main() { srand( time( NULL ) ); int liczba[ 3 ]; bool test = 0; do { std::cin >> liczba[ 0 ]; std::cin >> liczba[ 1 ]; std::cin >> liczba[ 2 ]; if( liczba[ 0 ] == liczba[ 1 ] == liczba[ 2 ] ) { std::cout << "Podaj przynajmniej dwie rozne liczby!" << std::endl; test = 1; } else test = 0; } while( test == 1 ); int licznik = 0; int proba[ 2 ]; do { proba[ licznik ] = liczba[ rand() % 3 ]; if( czyByla( proba, liczba, licznik ) == 0 ) { std::cout << proba[ licznik ] << std::endl; licznik++; } } while( licznik < 2 ); return 0; }
|
|
« 1 » |