Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozdział 21. Losowanie liczb całkowitych bez powtórzeń - zadanie domowe

Ostatnio zmodyfikowano 2015-07-31 20:32
Autor Wiadomość
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ń.

C/C++
#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;
}

P-135543
carlosmay
» 2015-07-31 15:58:25
Zakładanie tematów.
http://cpp0x.pl/kursy/?nro=483

Utwó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.

C/C++
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.
P-135546
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 !
P-135549
carlosmay
» 2015-07-31 20:32:13
C/C++
int tab[ 3 ]; // tablica trojelementowa
int tab2[ 2 ]; // tabilica dwuelementowa

Pomyliłeś tablicę dwuwymiarową z dwuelementową.
C/C++
int tab[ 3 ][ 2 ]; // tablica dwuwymiarowa

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.
P-135554
« 1 »
  Strona 1 z 1