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

Problem z zadaniem domowy - Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2014-07-28 21:18
Autor Wiadomość
pekfos
» 2014-07-27 11:35:27
Jest to funkcja w której następuje wczytanie 3 liczb podanych przez użytkownika do tablicy
Że też to nie jest oczywiste by pomyśleć, dlaczego padło pytanie, zamiast dosłownie na nie odpowiedzieć.. Jak chcesz tak wczytać liczbę do tablicy, skoro najpierw przypisujesz, a potem dopiero wczytujesz..? Zmienna a nie jest tu do niczego potrzebna, poza stwarzaniem okazji do takich błędów.

//edit:
Znowu zły zakres losowania.
P-114443
Daedra
Temat założony przez niniejszego użytkownika
» 2014-07-27 12:00:00
C/C++
/*
    Napisz program, który wczyta 3 liczby podane przez uzytkownika do tablicy, a nastepnie wylosuje 2 z nich bez powtórzen.
    Wynik wypisz na ekran. Postaraj sie napisac ten program w oparciu o funkcje.
*/

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void wczytywanie_liczb( int tablica[], int element )
{
    cout << "Podaj 3 liczby" << endl;
    do
    {
        cin >> tablica[ element ];
        cin.clear();
        cin.sync();
        element++;
    } while( element < 3 );
   
    element = 0;
    cout << "Podales ";
    do
    {
        cout << tablica[ element ] << ", ";
        element++;
    } while( element < 3 );
   
    cout << endl;
}

int losowanie_elementu_tablicy()
{
    return(( rand() % 3 ) + 0 );
}

bool sprawdzenie( int wylosowanab, int wylosowana )
{
    if( wylosowana != wylosowanab )
         return false;
    else
         return true;
   
}

int main()
{
    srand( time( NULL ) );
    int tab[ 3 ];
    int ele = 0;
   
   
    wczytywanie_liczb( tab, ele );
   
    int los, losb, nr;
    nr = 1;
   
    los = losowanie_elementu_tablicy();
    cout << nr << ".Wylosowano: " << tab[ los ] << endl;
    do
    {
        losb = losowanie_elementu_tablicy();
        if( sprawdzenie( losb, los ) == false )
        {
            nr++;
            cout << nr << ". Wylosowano: " << tab[ losb ] << endl;
        }
       
    } while( nr < 2 );
   
}



Poprawiłem, działa tak jak działać miało, czyli zgodnie z poleceniem. Ale jak nie trudno zauważyć system sprawdzania czy los się nie powtórzył jest napisany śmiesznie z powodu mojego nierozgarnięcia. Przy kolejnym poleceniu wyglądałby o wiele śmieszniej...

2. Zmodyfikuj program z pierwszego zadania tak, aby użytkownik musiał podać 10 liczb, a 8 z nich będzie losowanych bez powtórzeń. Sprawdź czy wyniki są poprawne.


Zatem ponawiam pytanie, czy ktoś może napisać mi kod który zapewniam że przeanalizuję dokładnie? To nie jest praca domowa którą muszę zrobić... Robię to po to aby się nauczyć, chcę po prostu zrozumieć pewne rzeczy do których nie potrafię dojść sam.
P-114445
pekfos
» 2014-07-27 12:08:05
Zadania domowe powinieneś robić samodzielnie, nie udzielamy gotowych odpowiedzi. Jeśli chcesz zepsuć sobie zadanie, szukaj gotowców w tematach podobnych do tego.

Wczytaj 10 liczb do tablicy i losuj indeksy do drugiej tablicy. Sprawdzanie ma obejmować wszystkie wylosowane już indeksy.
P-114446
Daedra
Temat założony przez niniejszego użytkownika
» 2014-07-28 12:22:29
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int losowanie( int ile )
{
    return( rand() % ile ) + 0;
}

void podawanie( int tab[], int ile )
{
    cout << "Podaj " << ile << " liczb" << endl;
   
    int a, i;
    a = i = 0;
   
    do
    {
        cin >> a;
        cin.clear();
        cin.sync();
        tab[ i ] = a;
        i++;
    } while( i < ile );
   
}

bool sprawdzenie( int los, int tablica[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( los == tablica[ i ] )
             return true;
        else
             ++i;
       
    } while( i < ile );
   
    return false;
}

void wypisywanie( int tab[], int iileLosowac )
{
    int i;
    i = 0;
    do
    {
        cout << tab[ i ] << endl;
        i++;
    } while( i < iileLosowac );
   
}

int main()
{
    srand( time( NULL ) );
   
    int ileLiczb;
    cout << "Ile liczb wczytac?" << endl;
    cin >> ileLiczb;
    cin.clear();
    cin.sync();
    int t[ ileLiczb ];
   
    int ileLosowac;
    cout << "Ile wylosowac?" << endl;
    cin >> ileLosowac;
    cin.clear();
    cin.sync();
   
    podawanie( t, ileLiczb );
   
    int liczba;
    int i;
    int tzl[ ileLosowac ]; // !
    i = 0;
    do
    {
        liczba = losowanie( ileLiczb );
        if( sprawdzenie( liczba, tzl, ileLosowac ) == false )
        {
            tzl[ i ] = liczba; // !
            i++;
        }
       
    } while( i < ileLosowac );
   
    cout << endl;
   
    wypisywanie( tzl, ileLosowac );
   
    return 0;
}


Ktoś ma jakieś uwagi, ewentualne sugestie czy można lub nawet trzeba coś poprawić?
P-114530
pekfos
» 2014-07-28 14:32:15
Działa?


C/C++
if( los == tablica[ i ] )
     return true;
else
     ++i;

else niepotrzebne, return kończy funkcję.

C/C++
int i;
i = 0;
Czasem niepotrzebnie rozdzielasz tworzenie zmiennej od nadania jej wartości.

C/C++
int t[ ileLiczb ];
//..
int tzl[ ileLosowac ];
Tak się nie tworzy tablic. Zadanie zdaje się z góry określało ilości liczb.
P-114553
Daedra
Temat założony przez niniejszego użytkownika
» 2014-07-28 21:18:40
Rozumiem, kod poprawiłem i działa jak należy, większość moich wątpliwości została rozwiana jeżeli chodzi o to zadanie. Dzięki za rady, zamykam.
P-114594
1 « 2 »
Poprzednia strona Strona 2 z 2