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
lekcja 21 losowanie bez powtórzeń
» 2014-03-06 21:55:48
Czy mógłby mi ktoś pomóc zrozumieć zadanie przykładowe z losowania bez powtórzeń ? Nie jest to praca domowa tylko gotowy kod z lekcji, którego niestety nie rozumiem do końca.

Bez większych problemów tworze tablice i losuje liczby (ale z powtórzeniami)
Mam problem ze zrozumieniem funkcji czyBylaWylosowana

Proszę o pomoc poprzez dopisani komentarzy lub jak kto juz woli inaczej. Dzięki

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

bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) //nie kapuje ;/
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( tab[ i ] == iLiczba )
             return true;
       
        i++;
    } while( i < ile );
   
    return false;
}

int wylosuj()
{
    return( rand() % 10 ) + 1;
}

int main()
{
    srand( time( 0 ) );
    int wylosowane[ 5 ];
    int wylosowanych = 0;
    do
    {
        int liczba = wylosuj();
        if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) / tego te ż nie; /
        {
            wylosowane[ wylosowanych ] = liczba;
            wylosowanych++;
        } //if
    } while( wylosowanych < 5 );
   
    wylosowanych = 0;
    do
    {
        std::cout << wylosowane[ wylosowanych ] << std::endl;
        wylosowanych++;
    } while( wylosowanych < 5 );
   
    return 0;
}
P-105781
leon_w
» 2014-03-07 08:46:07
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) //funkcja jest typu bool, więc zwraca true albo false (1 lub 0). Przyjmuje arunenty: 1 typu int (wylosowana liczba), 2. tablice int (tablica gdzie zapisywane są wylosowane i sprawdzone już liczby). 3. Typ int (licznik ile liczb już jest zapisanych w tablicy)
{
    if( ile <= 0 ) //Jeżeli licznik jest mniejszy lub równy 0, funkcja zwraca false i zakańcza działanie (czyli zawsze przy pierwszej liczbie, ponieważ na początlu licznik wskazuje 0
         return false;
   
    int i = 0; //zmienna pomocnicza, zeruje się przy każdym wyjsciu z funkcji
    do
    {
        if( tab[ i ] == iLiczba ) //ta pętla porównuje wylosowaną liczbę, z każdą liczbą zapisaną w tablicy, jeśli znajdzie w tablicy taką samą liczbę jak wylosowana, zwraca true;
             return true;
       
        i++;
    } while( i < ile ); //pętla wykonuje się, dopuki zmienna pomocnicza jest mniejsza od licznika, który zwiększa się z każdym obiegiem pętli
   
    return false; //jeśli pętla zakończy wszystkie obiegi i nie znajdzie w tablicy liczby takiej samej jak wylosowana, zwraca false
}

int wylosuj()
{
    return( rand() % 10 ) + 1; //tutaj chyba nie trzeba nic tłumaczyć, funkcja zwraca losową liczbę
}

int main()
{
    srand( time( 0 ) );
    int wylosowane[ 5 ]; //tablica na wylosowane i sprawdzone liczby
    int wylosowanych = 0; //licznik dla w/w tablicy, pokazuje ile liczb jest zapisanych w tablicy
    do
    {
        int liczba = wylosuj(); //tu chyba wiadomo
        if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) // Jak pisałem wcześniej, funkcja "czyByłaWylosowana()" zwraca albo true albo false. Więc wywołujemy tą funkcję, podając jako argumenty: 1 wylosowaną liczbę, 2 tablicę z zapisanymi, wylosowanymi i sprawdzonymi liczbami, 3 licznik, ile liczb jest juz w tablicy zapisanych
       
             wylosowane[ wylosowanych ] = liczba; //jeżeli funkcja zwróci false, wylosowana liczba jest zapisywana do tablicy, na pozycji podanej przez licznik (wylosowanych)
       
        wylosowanych++; //i licznik jest zwiększany o 1
    } //if
} while( wylosowanych < 5 ); //cała pętla wykonuje się, dopuki licznik jest mniejszy od 5

wylosowanych = 0;
do
{
    std::cout << wylosowane[ wylosowanych ] << std::endl;
    wylosowanych++;
} while( wylosowanych < 5 );

return 0;
}
P-105791
poprawka
Temat założony przez niniejszego użytkownika
Do zadanie 1 z lekcji 21
» 2014-03-08 11:43:28
Mam  pewien problem, którego nie mogę zrozumieć.
Opisałem problem w komentarzach... Czy może mi ktos wyjaśnić czemu tak sie dzieje ?

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

void podajliczbe( int tablica[] ) //podanie liczb i zapisanie ich w tablicy
{
    int i = 0;
    int a;
    int sukces;
    do
    {
        do
        {
            cout << "Podaj liczbe nr " << i + 1 << " ";
            cin.clear();
            cin.sync();
            cin >> a;
            sukces = cin.good();
           
        } while( sukces != true );
       
        {
            if( cin.good() == 1 )
                 tablica[ i ] = a;
           
            i++;
        }
    } while( i != 10 );
   
}

int losowanie( int tablica[] )
{
   
    return tablica[ rand() % 10 ]; //losujemy liczbe z tablicy
   
}

int wypisz( int a, int licznik ) // wypisuje mi dwie liczby z tablicy lecz zawsze te same (nawet jeśli wszystkie liczby są różne od siebie... JEŚLI USUNIEMY FUNKCJĘ LUB ZAKOMENTUJEMY (reszta niżej)
{
    do {
        cout << a << endl;
        licznik++;
    } while( licznik != 2 );
   
}

int main()
{
    srand( time( 0 ) );
    int tablica[ 10 ];
    int licznik = 0;
   
    podajliczbe( tablica );
    int a = losowanie( tablica );
    wypisz( a, licznik );
    //    {                                                                //i skorzystamy z tego to już będzie dobrze i wylosuje mi dwie różne liczby z tablicy Jeśli będzie każda inna. Bo jeszcze nie ma funkcji która blokuje powtarzalność
   
   
    //    int a=losowanie(tablica);
    //    cout<<a<<endl;
    //    licznik++;
    //    }while(licznik!=2);
}

[ / cpp ][ / i ]
P-105839
leon_w
» 2014-03-08 13:08:34
Nie bardzo rozumiem, czego innego się spodziewasz. Pomyśl trochę logicznie. Wywołujesz funkcję wypisz(), z argumentami: 1.wylosowana liczba 2.licznik.
Funkcja wypisz() ma pętlę, która wykonuje się dwa razy (jeżeli licznik = 0), ale ciąglę z tym samym pierwszym argumentem. Wiec choćby pętla wykonywała się i 100 razy, zawsze wypisze tą samą wartość, bo zmienna 'a' się nie zmienia.
W drugim przypadku jest dobrze, ponieważ przy każdym obiegu funkcji przypisujesz do zmiennej 'a' to co zwróci funkcja losowanie().
Trochę logicznego myślenia, to nie boli.
P-105851
poprawka
Temat założony przez niniejszego użytkownika
» 2014-03-09 12:26:28
Dzięki Leon za cenne wskazówki.
Kolejny dzień siedzę i powtórnie czytam lekcje z funkcjami i tablicami.

Mam pewien problem jak widać w kodzie z stworzeniem funkcji ktora zapobiegnie powtarzaniu. Czy da się zrobić osobną funkcję na sprawdzanie czy została wylosowana liczba w nowej tablicy ?
int losowanieDoNowajTablicy( int t[] )

Czy muszę napisać kod który zapobignie powtarzaniu sie w funkcji w której są wylosowane te dwie liczby do nowej tablicy czyli:
int losowanieDoNowajTablicy( int t[] )

Nie chce gotowej odpowiedz bo to mija sie z celem. Lecz podpowiedz która naprowadzi mnie na prawidłowe myślenie i podejście do mojego problemu.

Postanowiłem podejść do tego po przestudiowaniu od nowa i rozpisać sobie to w funkcjach:

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;
}
/************************************/ /************************************/ /************************************/
int losowanieDoNowajTablicy( int t[] ) // stworzenie nowej tablicy i wylosowanie do niej liczb.
{
   
    int nt[ 2 ];
    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 iLiczba)
//{
//}

/************************************/ /************************************/ /************************************/
int main()
{
srand( time( NULL ) );
int tablica[ 3 ];
wypiszLiczby( tablica );
zapiszDoTablicy( tablica, 3 );
losowanieDoNowajTablicy( tablica );




dodaj( tablica );
}
edycja/ Łatwo jest przepisać coś bezmyślnie i cieszyć się że program działa, lecz jak już się czegoś uczymy to najlepiej od początku do końca rozumieć co się pisze. Dzięki za waszą pomoc.

Chodzi mi o to że w programie są funkcje na dwie tablice.
Pierwsza tablica to ta z 3 liczbami,
a druga to ta z dwoma wylosowanymi z tej pierwszej tablicy.

Teraz chciałem aby te liczby losowane nie były powtarzane. I tutaj pytanie jest na początku posta.

Najpierw trzeba napisać funkcję na zapobieganie powtarzaniu, a potem dodać ją do funkcji w której tworzona jest druga tablica i losowane do niej liczby ?
 
P-105913
leon_w
» 2014-03-09 16:57:10
Jeszcze sporo błędów masz, co chyba widzisz, bo kod się nie kompiluje.
Co do pytania to jakieś nie jasne ono dla mnie jest.
Do funkcji sprawdzającej wysyłasz tylko wylosowaną liczbę i tablicę, gdzie ją zapiszesz. Nie wysyłasz do niej tablicy, gdzie masz zapisane liczby, wczytane z klawiatury.
Raczej nie możesz tej tablicy utworzyć w funkcji sprawdzającej, ponieważ całej tablicy funkcja nie zwróci.
P-105932
poprawka
Temat założony przez niniejszego użytkownika
» 2014-03-09 19:51:01
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;
}
/************************************/ /************************************/ /************************************/
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 i = rand() % 3;
    int j = i;
    while( j == i )
         j = rand() % 3;
   
}

/************************************/ /************************************/ /************************************/
int main()
{
    srand( time( NULL ) );
    int tablica[ 3 ];
    wypiszLiczby( tablica );
    zapiszDoTablicy( tablica, 3 );
    sprawdzCzyWylosowana();
    losowanieDoNowajTablicy( tablica );
   
   
   
    dodaj( tablica );
}
eh. Skopiowałem nie ten plik...
Tutaj wszystko chodzi.

Teraz kolejne godziny próbowałem coś napisać.
Napisałem funkcję
int sprawdzCzyWylosowana()
próbowałem ją jakoś zastosować w funkcji
int losowanieDoNowajTablicy( int t[] )
lecz z żadnym skutkiem ;/

Jeśli Leon albo ktoś może mnie naprowadzić jakoś na dobry tok pisania.

Próbowałem też nie pisać funkcji
int sprawdzCzyWylosowana()

Tylko od razu w funkcji
int losowanieDoNowajTablicy( int t[] )
próbowałem poprzez pętle do.. while, while, wymuszać ponowne losowania ale też z żadnym skutkiem.


P-105949
leon_w
» 2014-03-09 21:15:16
..... się nadrukowałem i wszystko znikło.
Daj drugą tablicę w mainie, i obie wysyłaj do funkcji losująco-sprawdzającej.
Jeżeli tylko dwie liczby losujesz, to banał. Losujesz pierwszą, zapisujesz, losujesz drugą i sprawdzasz czy jest różna od pierwszej.
No jeżeli więcej liczb to trochę dłubania będzie, ale też się zrobi.
P-105954
« 1 » 2
  Strona 1 z 2 Następna strona