Szymislaw Temat założony przez niniejszego użytkownika |
[Rozdział 21] Zadanie 1 » 2015-11-12 21:59:18 Witam, treść zadania brzmi: 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. Program kompiluje się, jednakże czasami losuje z powtórzeniami. Starałem się znaleźć błąd jednak, bo wielokrotnej analizie kodu nie mogę zauważyć błędu. Proszę o pomoc :). #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void podajliczby( int t[] ) { int numer = 1; int i = 0; do { cout << "Podaj liczbe " << numer << endl; cin >> t[ i ]; i++; numer++; } while( i < 3 ); } int losowanie( int t[] ) { return t[( rand() % 3 ) ]; } bool czybylawylosowana( int liczba, int t[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( t[ i ] == liczba ) return true; i++; } while( i < ile ); return false; }
int main()
{ srand( time( NULL ) ); int tablica[ 3 ]; int wylosowanych = 0; podajliczby( tablica ); do { int liczba = losowanie( tablica ); if( czybylawylosowana( liczba, tablica, wylosowanych ) == false ); { tablica[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 2 ); wylosowanych = 0; cout << endl; do { cout << tablica[ wylosowanych ] << endl; wylosowanych++; } while( wylosowanych < 2 ); return 0; }
|
|
carlosmay |
» 2015-11-13 05:47:18 Losuj indeksy i zapisuj je do drugiej tablicy. Porównuj wylosowane z elementami z drugiej tablicy. Nie porównuj liczb z tablicy tylko indeksy. Użytkownik może podać trzy takie same liczby i program nigdy nie zakończy działania. return t[( rand() % 3 ) ];
stąd wraca wartość elementu z tablicy. Nadpisujesz nim tablicę źródłową. Zwróć sam wylosowany indeks i zapisz do drugiej tablicy. |
|
Szymislaw Temat założony przez niniejszego użytkownika |
» 2015-11-15 19:51:32 Próbowałem zastosować się do Twoich rad, jednakże dalej coś robię źle. Porównuje indeksy jednakże dalej losuje z powtórzeniami. Wiem również, że można wpisać 3 takie same liczby i program nie zadziała poprawnie lecz to wiem jak poprawić tylko najpierw chciałbym by poprawnie losowało. #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void podajliczby( int t[] ) { int numer = 1; int i = 0; do { cout << "Podaj liczbe " << numer << endl; cin >> t[ i ]; i++; numer++; } while( i < 3 ); } int losowanie() { return( rand() % 3 ) + 0; } bool czybylawylosowana( int liczba, int t[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( ile == liczba ) return true; i++; } while( i < ile ); return false; } int main()
{ srand( time( NULL ) ); int tablica[ 3 ]; int tablica2[ 2 ]; int wylosowanych = 0; podajliczby( tablica ); do { int indeks = losowanie(); if( czybylawylosowana( indeks, tablica, wylosowanych ) == false ); { tablica2[ wylosowanych ] = tablica[ indeks ]; wylosowanych++; } } while( wylosowanych < 2 ); wylosowanych = 0; cout << endl; do { cout << tablica2[ wylosowanych ] << endl; wylosowanych++; } while( wylosowanych < 2 ); return 0; }
|
|
Gibas11 |
» 2015-11-15 20:12:52 Nie czytałem twojego kodu (nigdy nie umiałem ogarniać cudzego kodu bez komentarzy / dokumentacji), więc nie pomogę naprawić twojego rozwiązania ale na pierwszy rzut oka widać, że przekombinowałeś. Zrealizowałem to zadanie (pisząc normalnie, bez chamskiego skracania długości) 26 linijkami, w których były 3 pętle i jedna funkcja - main() . Kodem na razie nie zarzucam, bo zakładam, że chcesz sam rozwiązać zadanie ale potem będę mógł ci pokazać jak do tego podszedłem gdybyś był ciekaw. |
|
carlosmay |
» 2015-11-15 21:25:48 if( czybylawylosowana( indeks, tablica, wylosowanych ) == false );
{ tablica2[ wylosowanych ] = tablica[ indeks ]; wylosowanych++; }
średnik z ifem, oczywisty błąd. Do sprawdzania przekazujesz nie tą tablicę. Po stwierdzeniu niepowtarzalności zapisz w tablicy tylko indeks. Na koniec wypisz wynik w pętli: int indeks = 0; do { cout << tablica[ tablica2[ indeks ] ]; indeks++; } while( indeks < 2 ); |
|
Szymislaw Temat założony przez niniejszego użytkownika |
» 2015-11-16 21:45:44 Rozumiem, że tutaj przekazywałem nie tą tablice: if( czybylawylosowana( indeks, tablica2, wylosowanych ) == false )
Nie za bardzo rozumiem jak mam to zrobić, dalej nie mogę wymyślić nic poza poniższym zapisem: tablica2[ wylosowanych ] = tablica2[ indeks ];
Nie do końca rozumiem również poniższy zapis: cout << tablica[ tablica2[ indeks ] ] << endl;
|
|
carlosmay |
» 2015-11-16 22:07:58 Nie za bardzo rozumiem jak mam to zrobić, dalej nie mogę wymyślić nic poza poniższym zapisem:
tablica2[ wylosowanych ] = tablica2[ indeks ];
|
rozumiemy tak: tablica2[ wylosowanych ] = indeks;
Nie do końca rozumiem również poniższy zapis:
cout << tablica[ tablica2[ indeks ] ] << endl;
|
rozumiemy tak: wylosowanych = 0; do { cout << tablica[ tablica2[ wylosowanych ] ] << endl; wylosowanych++; } while( wylosowanych < 2 );
po prostu intuicyjnie użyłem nazwy 'indeks' (wymowna nazwa). |
|
Szymislaw Temat założony przez niniejszego użytkownika |
» 2015-11-16 22:24:46 Na początku używałem właśnie poniższego zapisu: tablica2[ wylosowanych ] = indeks;
Jednakże program dalej losuje z powtórzeniami. Cały kod wygląda teraz następująco: #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void podajliczby( int t[] ) { int numer = 1; int i = 0; do { cout << "Podaj liczbe " << numer << endl; cin >> t[ i ]; i++; numer++; } while( i < 3 ); } int losowanie() { return( rand() % 3 ) + 0; } bool czybylawylosowana( int liczba, int t[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( ile == liczba ) return true; i++; } while( i < ile ); return false; } int main()
{ srand( time( NULL ) ); int tablica[ 3 ]; int tablica2[ 2 ]; int wylosowanych = 0; podajliczby( tablica ); do { int indeks = losowanie(); if( czybylawylosowana( indeks, tablica2, wylosowanych ) == false ) { tablica2[ wylosowanych ] = indeks; wylosowanych++; } } while( wylosowanych < 2 ); int indeks = 0; cout << endl; do { cout << tablica[ tablica2[ indeks ] ] << endl; indeks++; } while( indeks < 2 ); return 0; }
|
|
« 1 » 2 |