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

Lekcja 21: Losowanie bez powtórzen - Praca domowa

Ostatnio zmodyfikowano 2015-07-15 18:15
Autor Wiadomość
Wadim
Temat założony przez niniejszego użytkownika
Lekcja 21: Losowanie bez powtórzen - Praca domowa
» 2015-07-14 13:18:47
Nie mogę poradzić sobie z praca domową z lekcji 21. Siedzę nad nią już kilka godzin. Liczby się wczytują, losuje mi się 2 z nich, ale występują powtórzenia.
Oto co do tej pory zrobiłem:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int f1( int a[] )
{
    int i = 0;
   
    cout << "Podaj 3 liczby: " << endl;
    do
    {
        cin >> a[ i ];
        i++;
    }
    while( i < 3 );
   
    return 0;
}

int f2()
{
    return( rand() % 2 ) + 1;
}

bool f3( int a[], int b, int z )
{
    if( z <= 0 )
         return true;
   
    int i = 0;
    do
    {
        if( a[ i ] == b )
             return false;
       
        i++;
    } while( i < z );
   
    return true;
}

int main()
{
    srand( time( NULL ) );
    int x[ 2 ];
    int z = 0;
    f1( x );
    f2();
    do
    {
        int y = f2();
        if( f3( x, y, z ) == true )
        {
            x[ z ] = y;
            cout << x[ z ] << ' ';
            z++;
        }
    }
    while( z < 2 );
   
    return 0;
}

Kompletnie się pogubiłem i zaczynam mieć dosyć programowania, a chciałbym dalej się uczyć.
Z góry dziękuje za pomoc.
P-134646
carlosmay
» 2015-07-14 13:54:47
Programowanie wymaga cierpliwości.
Zmienna
int y;
 jest niezainicjalizowana przed użyciem.
int i =( rand() % 2 ) + 1;
 losujesz indeks, a indeksy startują od zera
więc liczby też losuj od zera
int i = rand() % 3;
Zacznij od nowa ten program:
- stosuj nazwy zmiennych sugerujących ich przeznaczenie np,
int liczby[ 3 ]
,
int losuj_liczbe( int tab[], int liczba );
,
bool czy_liczba_byla( int tab[], int liczba );

edit:
i jeszcze tablica ma trzy elementy, nie dwa
int x[ 3 ];
P-134647
carlosmay
» 2015-07-14 14:44:57
C/C++
//ZADANIE DOMOWE LOSOWANIE BEZ POWTORZEN
/* 1. losuje liczbe i zapisuje do tab1[] - (trzy liczby bez powtorzen)
2. sprzwdzam czy taka liczba juz istnieje, jesli tak wroc do krok 1
3. jesli nie to zaoisz ja do tab1[]
4. sprawdz czy tab1[] jest pelna, jesli nie to wroc od krok 1
5. gdy pelna wypisz ja na ekran
6. losuj indeks tab1[] - (dwie liczby bez powtorzen)
7. sprawdz czy juz taki jest wylosowany, jesli tak krok 6
8. jesli nie zapisz go do tab2[]
9. sprawdz czy tab2[] jest pelna, jesli nie krok 6
10. jesli tak wypiisz ja */

#include <iostream>
#include <cstdio>
//#include <cstdlib>
#include <ctime>
using namespace std;

/************funkcja losujaca elementy tab1[]********************************/
int losujTab1()
{
    return( rand() % 10 ) + 1;
}

/*************funkcja sprawdza czy liczby powtarzaja sie*********************/
bool czyByloTab1( int liczba, int t1[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do {
        if( t1[ i ] == liczba )
             return true;
       
        i++;
    } while( i < ile );
   
    return false;
}

int losujTab2( int ile )
{
    return( rand() % ile );
}

bool czyByloTab2( int liczba, int t2[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do {
        if( t2[ i ] == liczba )
             return true;
       
        i++;
    } while( i < ile );
   
    return false;
}

int main()
{
    srand( time( NULL ) );
    int tab1[ 3 ];
    int tab2[ 2 ];
    int t_indeks[ 2 ];
    int liczbaTab1;
    int wylosIndeks;
   
    /****************zapis losowanych liczb do tab1[]************************/
    int i = 0;
    do {
        liczbaTab1 = losujTab1();
        if( czyByloTab1( liczbaTab1, tab1, 3 ) == false )
        {
            tab1[ i ] = liczbaTab1;
            i++;
        } //if
    } while( i < 3 );
   
    /**************wypisanie tablicy tab1[]********************************/
    i = 0;
    do {
        cout << tab1[ i ] << ", ";
        i++;
    } while( i < 3 );
   
    cout << endl << endl;
   
    /**************zapis wylosowanych indeksow z tab1[] do t_indeks[]*******/
    i = 0;
    do {
        wylosIndeks = losujTab2( 3 );
        if( czyByloTab2( wylosIndeks, t_indeks, 3 ) == false )
        {
            t_indeks[ i ] = wylosIndeks;
            i++;
        } //if
    } while( i < 2 );
   
    /***************wypisanie t_indeks[]***********************************/
    /*i = 0;
    do{
    cout << t_indeks[i] << ", ";
    i++;
    } while (i < 2);
    cout << "\n\n";*/
   
    /***************przypisanie do tab2[] elementow o wylosowanych elem
    ****************do tab2[]**********************************************/
    i = 0;
    do {
        tab2[ i ] = tab1[ t_indeks[ i ] ];
        i++;
    } while( i < 2 );
   
    /**********wypisanie wyniku wlasciwego*************************/
    i = 0;
    do {
        cout << tab2[ i ] << ", ";
        i++;
    } while( i < 2 );
   
    cout << "\n\n";
   
    system( "pause" );
    return 0;
}

Przeanalizuj ten kod, może coś z niego ci się przyda.
To jest to samo zadanie, tylko zamiast wprowadzać liczby ręcznie,
program sam je wybiera, a później z tych wybranych wybiera
dwie bez powtórzeń.
P-134648
Wadim
Temat założony przez niniejszego użytkownika
» 2015-07-14 19:40:56
Siedzę od 10 godzin nad tym zadaniem i nie mogę go zrobić. Oto co mam do tej pory:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int wczytaj_liczby( int liczby[] )
{
    cout << "Podaj 3 liczby: " << endl;
    int i = 0;
    do
    {
        cin >> liczby[ i ];
        i++;
    }
    while( i < 3 );
   
    return 0;
}

int losuj_liczby( int liczby[] )
{
    int i = rand() % 3;
    return liczby[ i ];
}

bool czy_byla_wylosowana( int liczby[], int wylosowane_liczby[], int wylosowanych )
{
    if( wylosowanych <= 0 )
         return true;
   
    int i = 0;
   
    do
    {
        if( liczby[ i ] == wylosowane_liczby[ i ] )
             return false;
       
        i++;
    }
    while( i < wylosowanych );
   
    return true;
}

int main()
{
    srand( time( NULL ) );
    int liczby[ 3 ];
    int wylosowane_liczby[ 3 ];
    int wylosowanych = 0;
    int i = 0;
    wczytaj_liczby( liczby );
   
    do
    {
        wylosowane_liczby[ i ] = losuj_liczby( liczby );
        i++;
    }
    while( i < 3 );
   
    do
    {
        if( czy_byla_wylosowana( liczby, wylosowane_liczby, wylosowanych ) == true )
        {
            wylosowanych++;
        }
       
    }
    while( wylosowanych < 3 );
   
    wylosowanych = 0;
   
    do
    {
        cout << wylosowane_liczby[ wylosowanych ] << ' ';
        wylosowanych++;
    }
    while( wylosowanych < 2 );
   
    return 0;
}
 
P-134667
carlosmay
» 2015-07-14 20:42:13
Taki algorytm:
1. Zapis trzech liczb do tablicy
2. Losuj liczbę od 0 do 2, reprezentujące indeks.
3. Tworzysz drugą tablicę dwuelementowa do zapisania finalnych liczb (wyzeruj ją)
4. Następnie sprawdź czy liczba o wylosowanym indeksie z pierwszej
tablicy jest już w drugiej. Jeśli jest losuj ponownie, jeśli nie
ma zapisz do drugiej.
5. Na koniec wypisz liczby z drugiej tablicy.

Ps. Piszę mobilnie, jak siądę do blaszaka to dam coś więcej.
Powodzenia.
P-134670
carlosmay
» 2015-07-14 21:19:30
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void wypelnijLiczbyUzytkownika( int tab[] )
{
    int i = 0;
    int liczba = 0;
    do {
        cin.clear();
        cin.sync();
        cin >> liczba;
        tab[ i ] = liczba;
        ++i;
    } while( i < 3 );
   
}

void zerowanie( int tab[] )
{
    int i = 0;
    do {
        tab[ i ] = 0;
        ++i;
    } while( i < 2 );
   
}

void wypiszWyniki( int tab[] )
{
    int i = 0;
    do {
        cout << tab[ i++ ] << "\t";
    } while( i < 2 );
   
    cout << endl;
}

bool porownaj( int tab_uzyt[], int tab_los[], int ind )
{
    int i = 0;
    do {
        if( tab_los[ i ] == tab_uzyt[ ind ] )
             return false;
       
        ++i;
    } while( i < 3 );
   
    return true;
}

int main()
{
    srand( time( NULL ) );
    int liczby_uzytkownika[ 3 ];
    int liczby_losowane[ 2 ];
    int i = 0;
    int indeks = 0;
    wypelnijLiczbyUzytkownika( liczby_uzytkownika );
    zerowanie( liczby_losowane );
   
    i = 0;
    do {
        indeks = rand() % 3;
        if( porownaj( liczby_uzytkownika, liczby_losowane, indeks ) )
        {
            liczby_losowane[ i ] = liczby_uzytkownika[ indeks ];
            ++i;
        }
    } while( i < 2 );
   
    wypiszWyniki( liczby_losowane );
    return 0;
}

Ten działa jak trzeba. Popatrz i pomyśl.
Dobrze kombinujesz.
Musisz porównać liczbę z tablicy liczb wprowadzonych z każdą
z tablicy losowanych, zmieniaj tylko indeks losowanych.

Ps. Nie ma się co łamać. Czasami musi przyjść olśnienie, aby pójść  dalej.
Każdy to przerabiał.
P-134671
Wadim
Temat założony przez niniejszego użytkownika
» 2015-07-14 22:32:33
Baaardzo dziękuję za pomoc. Już odchodziłem od zmysłów. Przeanalizuje sobie dokładnie ten kod kilka razy, ustawie go sobie na tapecie i postaram się go napisać od nowa aby utrwalić sobie to wszystko. Trochę się źle czuje z tym że samodzielnie sobie z tym nie poradziłem, bo jak twierdzi autor kursu, wszystkie potrzebne informację są podane. No cóż... jeszcze raz bardzo dziękuję :)
P-134677
Wadim
Temat założony przez niniejszego użytkownika
» 2015-07-15 12:47:36
Gdy dzisiaj robiłem jeszcze raz to zadanie, aby je sobie dobrze przećwiczyć, znowu wczytywało mi liczby i nić się dalej nie działo, więc porównałem mój program z programem użytkownika carlosmay i zauważyłem jedną (myślałem, że nie mającą znaczenia) różnicę. Otóż we fragmencie:
C/C++
int main()
{
    srand( time( NULL ) );
    int liczby[ 3 ];
    int wylosowane[ 2 ];
    int index = 0;
    int i = 0;
    wczytaj_liczby( liczby );
    do
    {
        index = rand() % 3;
        if( czy_byla_wylosowana( liczby, wylosowane, index ) == false )
        {
            wylosowane[ i ] = liczby[ index ];
            i++;
        }
    }
    while( i < 2 );
początkowo zamiast
wylosowane[ i ] = liczby[ index ];
 miałem
liczby[ index ] = wylosowane[ i ];
Myślałem że to nie ma znaczenia, bo w matematyce np. nie ma znaczenia czy napiszemy x = 5, czy 5 = x.
Taka mała rzecz a psuję cały program.
Oczywiście to nie był jedyny błąd, ale najważniejsze, że wróciła mi chęć do programowania :)
PS. Nie wiem jeszcze tylko czemu nigdy nie losuje mi pierwszej liczby. Zawsze tylko drugą i trzecią w losowej kolejności.
P-134696
« 1 » 2
  Strona 1 z 2 Następna strona