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

lekcja 21 losowanie bez powtórzeń

Ostatnio zmodyfikowano 2014-03-12 20:43
Autor Wiadomość
poprawka
Temat założony przez niniejszego użytkownika
» 2014-03-09 22:10:37
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
/************************************/ /************************************/ /************************************/
int wypiszLiczby( int t[] )
{
    int a;
    bool sukces;
    int i = 0;
    for( i; i != 3; i++ )
    {
        cout << "Podaj liczbe: ";
        cin.clear();
        cin.sync();
        cin >> a;
        sukces = cin.good();
       
        t[ i ] = a;
       
    }
   
   
}
/************************************/ /************************************/ /************************************/
int zapiszDoTablicy( int t[], int iRozmiar )
{
    int i = 0;
    do {
       
        cout << "Podane przez Ciebie liczby i zapisane do tablicy to: " << t[ i ] << endl;
        i++;
    } while( i < iRozmiar );
   
}
/************************************/ /************************************/ /************************************/
int dodaj( int t[] )
{
    int suma = 0;
    int i = 0;
    do
    {
        suma = t[ i ] + suma;
        i++;
    } while( i != 3 );
   
    cout << "Wynik dodawania liczb to: " << suma << endl;
}
/************************************/ /************************************/ /************************************/
//int losowanieDoNowajTablicy( int t[] )
//{
//
//    int nt[ 2 ];
//
//    int i = 0;
//    for( i; i != 2; i++ )
//    {
//        nt[ i ] = t[ rand() % 3 ];
//
//        cout << "Wylosowane liczby do nowej tablicy to: " << nt[ i ] << endl;
//
//    }
//}



/************************************/ /************************************/ /************************************/
int sprawdzCzyWylosowana( int t[] )
{
    int i = t[ rand() % 3 ];
    int j = i;
    while( j == i )
         j = t[ rand() % 3 ];
   
    cout << "Wylosowane liczby do nowej tablicy to: " << i << endl;
    cout << "Wylosowane liczby do nowej tablicy to: " << j << endl;
}

/************************************/ /************************************/ /************************************/
int main()
{
    srand( time( NULL ) );
    int tablica[ 3 ];
    wypiszLiczby( tablica );
    zapiszDoTablicy( tablica, 3 );
   
    //losowanieDoNowajTablicy( tablica );
   
    sprawdzCzyWylosowana( tablica ); // Wystarczylo wyslać tablice do funkcji
    dodaj( tablica );
    return main();
}

Działa.
Ale nie jestem zadowolony z tego kodu. Niby wszystko działa dobrze i wszystko zrobione w funkcjach. Czyli tak jak w zadaniu 1  z Pracy domowej, ale  nie jest tak jak chciałem.

LEON nie musiałem dawać drugiej tablicy do maina, bo była ona bezużyteczna w funkcji losująco sprawdzajacej bez powtórzeń...

Wystarczyło tylko wysłać już uzupełniona tablice do funkcji losująco sprawdzajacej i działa ok.

Co do funkcji losująco-sprawdzajacej:
C/C++
int sprawdzCzyWylosowana( int t[] )
{
    int i = t[ rand() % 3 ];
    int j = i;
    while( j == i )
         j = t[ rand() % 3 ];
   
    cout << "Wylosowane liczby do nowej tablicy to: " << i << endl;
    cout << "Wylosowane liczby do nowej tablicy to: " << j << endl;
}
 
To jest ona dobra tylko do dwóch liczb. Dlatego nie jestem zadowolony. Taką funkcję szczerze miałem na początku kiedy siadłem do tego zadania i z niej zrezygnowałem.

Teraz jesli chciałbym ją wykorzystać do "n" liczb  to dużo roboty i musiałbym się sporo nagłowić żeby taki sposób zastosować. Dlatego tyle pytan z mojej strony jak dobrze podejść do takiej funkcji... Sposobu nadal nie znam.
P-105963
poprawka
Temat założony przez niniejszego użytkownika
» 2014-03-10 22:06:28
C/C++
/************************************/ /************************************/ /************************************/
int sprawdzCzyWylosowana( int t[] )
{
    int nt[ 2 ]; //nowa tablica
    int licznik = 0;
    int i;
   
   
    do {
        if( licznik < 1 ) //przy pierwszej pętli losuje i zapisuje do nowej tablicy bo jest to pierwsza liczba...
        {
            i = t[ rand() % 3 ]; //losowanie z tablicy w której są zapisane 3 liczby
            nt[ licznik ] = i; //wpisanie do nowej tablicy wylosowanej 'pierwszej liczby'
        }
        i = t[ rand() % 3 ]; //kolejne LOSOWANIWE ???
       
        if( licznik >= 1 && nt[ licznik ] == licznik ) //druga kolejka petli.... Kiedy nt licznik == kolejna wylosowana liczba, następuje kolejne losowanie
        {
            i = t[ rand() % 3 ];
        }
        else if( nt[ licznik ] != licznik )
             nt[ licznik ] = i;
       
        licznik++;
    } while( nt[ licznik ] != 2 );
   
    for( licznik = 0; licznik != 2; licznik++ )
         cout << "Wylosowane liczby do nowej tablicy to: " << nt[ licznik ] << endl;
   
}

/************************************/ /************************************/ /************************************/

próbuję rozwiązać teraz drugie zadanie z większą ilością liczb w tablicy.

Napisałem taką funkcję, która może być zastosowana nie tylko do dwóch liczb (lecz próby są przeprowadzane na takiej liczbie).

Oczywiście jeszcze w tej funkcji jest coś nie tak... Ponieważ losują się dwie liczby do nowej tablicy ale moje instrukcje sterujące są najprawdopodobniej z błędem gdyż występują powtórzenia.
Jak zwykle będę wdzięczny za jakieś wskazówki... dzięki.



Cały kod programu do ewentualnego przetestowania.
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
/************************************/ /************************************/ /************************************/
int wypiszLiczby( int t[] )
{
    int a;
    bool sukces;
    int i = 0;
    for( i; i != 3; i++ )
    {
        cout << "Podaj liczbe: ";
        cin.clear();
        cin.sync();
        cin >> a;
        sukces = cin.good();
       
        t[ i ] = a;
       
    }
   
   
}
/************************************/ /************************************/ /************************************/
int zapiszDoTablicy( int t[], int iRozmiar )
{
    int i = 0;
    do {
       
        cout << "Podane przez Ciebie liczby i zapisane do tablicy to: " << t[ i ] << endl;
        i++;
    } while( i < iRozmiar );
   
}
/************************************/ /************************************/ /************************************/
int dodaj( int t[] )
{
    int suma = 0;
    int i = 0;
    do
    {
        suma = t[ i ] + suma;
        i++;
    } while( i != 3 );
   
    cout << "Wynik dodawania liczb to: " << suma << endl;
}

/************************************/ /************************************/ /************************************/
int sprawdzCzyWylosowana( int t[] )
{
    int nt[ 2 ];
    int licznik = 0;
    int i;
   
   
    do {
        if( licznik < 1 ) //przy pierwszej pętli losuje i zapisuje do nowej tablicy bo jest to pierwsza liczba...
        {
            i = t[ rand() % 3 ]; //losowanie z tablicy w której są zapisane 3 liczby
            nt[ licznik ] = i; //wpisanie do nowej tablicy wylosowanej 'pierwszej liczby'
        }
        i = t[ rand() % 3 ]; //kolejne LOSOWANIWE ???
       
        if( licznik >= 1 && nt[ licznik ] == licznik ) //druga kolejka petli.... Kiedy nt licznik == kolejna wylosowana liczba, następuje kolejne losowanie
        {
            i = t[ rand() % 3 ];
        }
        else if( nt[ licznik ] != licznik )
             nt[ licznik ] = i;
       
        licznik++;
    } while( nt[ licznik ] != 2 );
   
    for( licznik = 0; licznik != 2; licznik++ )
         cout << "Wylosowane liczby do nowej tablicy to: " << nt[ licznik ] << endl;
   
}

/************************************/ /************************************/ /************************************/
int main()
{
    srand( time( NULL ) );
    int tablica[ 3 ];
    wypiszLiczby( tablica );
    zapiszDoTablicy( tablica, 3 );
   
    //losowanieDoNowajTablicy( tablica );
   
    sprawdzCzyWylosowana( tablica );
    dodaj( tablica );
    return main();
}
P-106080
pixon
Problem
» 2014-03-11 22:45:46
Również mam problem. Dopiero zaczynam moją przygodę z C++ i w ten sposób napisałem program losujący bez powtórzeń 2 liczby z trzech podanych:

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

using namespace std;
int losEngine(int a, int b, int c)
{
    srand( time( NULL));
    int wynik = (rand() % 3) + 1;
    switch (wynik)
    {
    case 1:
        return a;
    case 2:
        return b;
    case 3:
        return c;
    }
}

int main()
{
    int q;
    int w;
    int e;
    cout << "podaj 3 liczby: " << endl;
    cin >> q;
    cin >> w;
    cin >> e;
    int k[2];
    int p = 0;
    int m = 0;
    do
    {
        if(p = 2)
    {
        m = 1;
        p = 1;
    }
    k[m] = losEngine(q,w,e);
    t++;
    p++;

    }
    while (p != 2 && k[0] != k[1]);

    cout << k[0] << ", " << k[1];

    return 0;
}

I problem pojawia się, gdyż (nie mam pojęcia dlaczego) drugą liczbę losuje poprawnie, a pierwszą zawsze jest 2686672. Proszę o pomoc i wytłumaczenie dlaczego tak się dzieje.
P-106144
poprawka
Temat założony przez niniejszego użytkownika
» 2014-03-11 23:28:40
C/C++
/************************************/ /************************************/ /************************************/
int losujtablice( int t[], int nt[] ) //WYSYŁAMY dwie tablice do funkcji
{
    int i; //zmienna pod ktora jest podstawiana wylosowana liczba
    int tlicznik = 0; //ustawia na pozycji pierwszej licznik do jednej z tablic
    int licznik = 0; //ustawia na pozycji pierwszej licznik do drugiej z tablic
   
    do {
       
        i = t[ rand() % 10 ]; //losujemy liczbe z tablicy
        do {
            while( nt[ licznik ] == i ) //dopoki liczba już wylosowana będzie sie rownac liczbie zapisanej w tablicy, bedzie trwalo losowanie kolejnej.
            {
                i = t[ rand() % 10 ];
                licznik = - 1; //MOŻECIE MI WYJAŚNIC DLACZEGO do licznika przypisywana jest wartość -1 ?
            }
            licznik++;
        } while( licznik != 8 );
       
        nt[ tlicznik ] = i; //TUTAJ korzystamy z naszego DRUGIEGO licznika, MOZECIE MI POWIEDZIEC DLACZEGO ??
        tlicznik++;
       
    } while( tlicznik != 8 );
   
    for( licznik = 0; licznik != 8; licznik++ )
         cout << nt[ licznik ] << endl;
   
}
/************************************/ /************************************/ /************************************/

W końcu sobie poradziłem... Niestety nie sam, a z małą pomocą.

Dobrze myślałem tworząc moje instrukcje i pętle.

Lecz nie wiedziałem że trzeba użyć dwóch LICZNIKÓW do tablicy ;/
Wiadomo było że z jednej tablicy losujemy i zapisujemy do nowej. Lecz nie wpadłem na pomysł, z utowrzenim dwóch liczników i jedne wykorzystać do powtarzających się liczb a drugi do zapisywania tych różnych od siebie...

DLACZEGO DRUGI LICZNIK jest ? I dlaczego sa na nim zapisywane liczby ? przecież wywołuje tablice z innym licznikiem... (jak wywołam z tym 'tlicznik' to źle działa... Proszę o pomoc.

Jeśli ktoś ma sekundę i może mi napisać czy wszystkie komentarze do ww. funkcji dobrze opisałem i co za tym idzie czy DOBRZE ROZUMIEM.

Możecie mi również wyjaśnić dlaczego
C/C++
licznik = - 1; //MOŻECIE MI WYJAŚNIC DLACZEGO do licznika przypisywana jest wartość -1 ?


Albo potwierdzić lub zaprzeczyć.
Kiedy wylosowana liczba jest porównywana z liczbami w tablicy, następnie kiedy jest taka sama jak te w tablicy to zapis licznik= -1 oznacza kasowanie jej ?
I kolejna pętla robi to samo porównuje a potem kasuje aż do skutku ?

Dla osób które chcą przetestować działanie. Cały program:
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
/************************************/ /************************************/ /************************************/
int wypiszLiczby( int t[] )
{
    int a;
    bool sukces;
    int i = 0;
    for( i; i != 10; i++ )
    {
        cout << "Podaj liczbe: ";
        cin.clear();
        cin.sync();
        cin >> a;
        sukces = cin.good();
       
        t[ i ] = a;
       
    }
   
   
}
/************************************/ /************************************/ /************************************/
int zapiszDoTablicy( int t[], int iRozmiar )
{
    int i = 0;
    do {
       
        cout << "Podane przez Ciebie liczby i zapisane do tablicy to: " << t[ i ] << endl;
        i++;
    } while( i < iRozmiar );
   
}
/************************************/ /************************************/ /************************************/
int dodaj( int t[] )
{
    int suma = 0;
    int i = 0;
    do
    {
        suma = t[ i ] + suma;
        i++;
    } while( i != 10 );
   
    cout << "Wynik dodawania liczb to: " << suma << endl;
}
/************************************/ /************************************/ /************************************/
//int losowanieDoNowajTablicy( int t[] )
//{
//
//    int nt[ 2 ];
//
//    int i = 0;
//    for( i; i != 2; i++ )
//    {
//        nt[ i ] = t[ rand() % 3 ];
//
//        cout << "Wylosowane liczby do nowej tablicy to: " << nt[ i ] << endl;
//
//    }
//}



/************************************/ /************************************/ /************************************/
int losujtablice( int t[], int nt[] ) //WYSYŁAMY dwie tablice do funkcji
{
    int i; //zmienna pod ktora jest podstawiana wylosowana liczba
    int tlicznik = 0; //ustawia na pozycji pierwszej licznik do jednej z tablic
    int licznik = 0; //ustawia na pozycji pierwszej licznik do drugiej z tablic
   
    do {
       
        i = t[ rand() % 10 ]; //losujemy liczbe z tablicy
        do {
            while( nt[ licznik ] == i ) //dopoki liczba już wylosowana będzie sie rownac liczbie zapisanej w tablicy, bedzie trwalo losowanie kolejnej.
            {
                i = t[ rand() % 10 ];
                licznik = - 1; // MOŻECIE MI WYJAŚNIC DLACZEGO do licznika przypisywana jest wartość -1 ?
            }
            licznik++;
        } while( licznik != 8 );
       
        nt[ tlicznik ] = i; //TUTAJ korzystamy z naszego DRUGIEGO licznika, i właśnie na jego POZYCJACH w tablicy zapisywane są nie powtarzające się liczby
       
        tlicznik++;
        // licznik=0;
    } while( tlicznik != 8 );
   
   
    licznik = 0;
    for( licznik; licznik != 8; licznik++ )
         cout << nt[ licznik ] << endl;
   
}
/************************************/ /************************************/ /************************************/
int main()
{
    srand( time( NULL ) );
    int tablica[ 10 ];
    int nt[ 8 ];
    wypiszLiczby( tablica );
    zapiszDoTablicy( tablica, 10 );
   
    //losowanieDoNowajTablicy( tablica );
   
    losujtablice( tablica, nt );
    dodaj( tablica );
    return main();
}

[/code][/code]
P-106147
poprawka
Temat założony przez niniejszego użytkownika
» 2014-03-12 20:43:10


Leon możesz mi pomóc ? :) Jeśli tylko masz chwile i możesz odpowiedzieć na moje pytania.
dzięki
P-106220
1 « 2 »
Poprzednia strona Strona 2 z 2