Rozdział 21. Losowanie liczb całkowitych bez powtórzeń - zadanie domowe
Ostatnio zmodyfikowano 2015-07-31 20:32
Braile Temat założony przez niniejszego użytkownika |
Rozdział 21. Losowanie liczb całkowitych bez powtórzeń - zadanie domowe » 2015-07-31 15:41:39 Witam, Treść zadania: "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 losuje, ale nadal jest to losowanie z powtórzeniami. Wykonałem to wpisując liczby do tablicy, wypisując tablice, a następnie losowałem z tych trzech indeksów dwa, które wypisuje kodem: cout << "T[" << indeks << "] = " << tablica[losowana] << endl;. Nie mogę się połapać dlaczego nie losuje tych indeksów bez powtórzeń. #include<iostream> #include<cstdlib> #include<ctime> using namespace std;
bool czybylawylosowana( int t[], int rozmiar, int ilewylosowanych, int wylosowanaliczba ) { if( ilewylosowanych <= 0 ) return false; int indeks = 0; do { if( t[ indeks ] == wylosowanaliczba ) return true; indeks++; } while( indeks < rozmiar ); return false; }
void wczytanieliczb( int t[], int rozmiar ) { int indeks = 0; int zostalo = 2; int liczba; cout << "Podaj 3 liczby calkowite" << endl; do { cin >> liczba; t[ indeks ] = liczba; cout << "Podaj jeszcze " << zostalo << " liczby\\liczbe." << endl; zostalo--; indeks++; } while( indeks < rozmiar ); }
void wypisztablice( int t[], int rozmiar ) { int indeks = 0; cout << "\nWczytane liczby to: " << endl; do { cout << "T[" << indeks << "] = " << t[ indeks ] << endl; indeks++; } while( indeks < rozmiar ); }
int losowanie() { return rand() % 3; }
int main() { srand( time( NULL ) ); int tablica[ 3 ]; int wylosowanych = 0; int indeks = 0; wczytanieliczb( tablica, 3 ); wypisztablice( tablica, 3 ); cout << "Program wylosowal nastepujace indeksy tablicy: " << endl; do { int losowana = losowanie(); if( czybylawylosowana( tablica, 3, wylosowanych, losowana ) == false ) { cout << "T[" << indeks << "] = " << tablica[ losowana ] << endl; indeks++; wylosowanych++; } } while( indeks < 2 ); return 0; }
|
|
carlosmay |
» 2015-07-31 15:58:25 Zakładanie tematów. http://cpp0x.pl/kursy/?nro=483Utwórz drugą tablicę dwuelementową i do niej zapisuj wylosowane liczby. Wartość liczby wylosowanej spod danego indeksu porównaj z już zapisanymi wartościami w tablicy wynikowej. Na koniec w pętli wypisz zawartość tablicy wynikowej. do { int losowana = losowanie(); if( czybylawylosowana( tablica, 3, wylosowanych, losowana ) == false ) { cout << "T[" << indeks << "] = " << tablica[ losowana ] << endl; indeks++; wylosowanych++; } } while( indeks < 2 );
tutaj nigdzie nie zapisujesz wyniku losowania i nie masz do czego porównać następnej liczby. |
|
Braile Temat założony przez niniejszego użytkownika |
» 2015-07-31 16:18:44 Teoretycznie wiem jak utworzyć tablice dwuelementową, ale do tego momentu kursu taka wiedza nie została jeszcze przekazana, więc myślę, że można to w inny, prostszy sposób wykonać, dlatego nie chciałbym jak na razie mącić sobie niepotrzebnie w głowie i powoli rozwijać swoją wiedzę. Edit: Czy ten zapis nie zapisuje wyniku losowania od 0 do 3 (indeksów) do zmiennej losowana typu int ? int losowana = losowanie(); @down wprowadziłem delikatne zmiany w funkcji bool czybylawylosowana i program działa tak jak powinien. Dzięki za pomoc ! |
|
carlosmay |
» 2015-07-31 20:32:13 int tab[ 3 ]; int tab2[ 2 ];
Pomyliłeś tablicę dwuwymiarową z dwuelementową. Teraz losujesz indeks 0 do 2 i sprawdzasz czy to co kryje się pod tym indeksem jest już w tablicy int tab2[2], jeśli nie to zapisujesz do niej i losujesz następny indeks. Znow sprawdzasz czy liczba pod kolejnym wylosowanym indeksem jest w tab2[2]. Jeśli nie to zapisujesz do niej kolejną wartość czy indeks. Teraz wyświetlasz co masz w tej drugiej tablicy, bądź jeśli zapisałeś w niej indeksy to używasz tych indeksów. |
|
« 1 » |