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

[Lekcja 21] Losowanie z danego przedziału.

Ostatnio zmodyfikowano 2012-03-20 20:14
Autor Wiadomość
abcde
Temat założony przez niniejszego użytkownika
[Lekcja 21] Losowanie z danego przedziału.
» 2012-03-18 21:20:46
Witam dawno mnie nie było bo miałem przerwę, ale za długo chyba bo nie potrafię rozwiązać zadania 21.
Podszedłem do tego swoim sposobem i nie wiem czy dobrze.
Ogólnie podstawowe pytanie moje to jak losować z mojej tablicy z wybranymi liczbami. Nie wiem jak to przypisać, aby losowane liczby były właśnie z tej tablicy. Stworzyłem również tablice dla liczb losowanych, aby tam zapisywać wylosowane liczby i potem je porównywać czy już nie była wylosowana. Ale to później na razie jak losować z danego przedziału.

Mój kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

void wybierz( int tablica[], int ile )
{
    std::cout << "Podaj trzy liczby: " << std::endl;
    int licznik = 0;
    do
    {
        std::cin >> tablica[ licznik ];
        licznik++;
    } while( licznik < ile );
   
}

void wypisz( int tablica[], int ile )
{
    std::cout << "Podales nastepujace liczby: ";
    int licznik = 0;
    do
    {
        std::cout << tablica[ licznik ] << ", ";
        licznik++;
    } while( licznik < ile );
   
   
}



int main()
{
    srand( time( 0 ) );
    int tablica[ 3 ];
    wybierz( tablica, 3 );
    wypisz( tablica, 3 );
   
    std::cout << "Losowanie dwoch liczb z trzech wybranych bez powtorzen." << std::endl;
    int losowana[ 2 ];
    losowana[ 2 ] =(( rand() % 2 ) + 0 );
   
    int licznik = 0;
    do
    {
        std::cout << losowana[ 2 ] << std::endl;
        licznik++;
    } while( licznik < 2 );
   
   
   
   
   
    return 0;
}
Widzę, że chyba coraz gorzej mi idzie chociaż nie chcę się poddawać.
P-52886
Unlimited
» 2012-03-18 21:38:52
Losować z tablicy, w której już są podane wartości przez człowieka jest prosto. Losujesz najpierw np wartość dla zmiennej od 0 do 1 (tablica z 2 wartościami) a potem tą zmienną wstawiasz w tablice i zwracasz wartość przez return. Przykład:
C/C++
int a =( rand() % 2 ) + 0;
return podawane[ a ];
P-52890
jankowalski25
» 2012-03-18 21:39:09
losowana[ 2 ] =(( rand() % 2 ) + 0 );
Wychodzisz poza zakres tablicy. Poza tym nie wypełniasz całej tablicy, tylko jeden z jej elementów.
std::cout << losowana[ 2 ] << std::endl;
Znowu wychodzisz poza zakres tablicy. Oprócz tego wypisujesz ciągle w pętli wartość tego samego elementu tablicy.
P-52891
abcde
Temat założony przez niniejszego użytkownika
» 2012-03-19 20:34:40
Witam mogę was prosić o więcej jakiś wskazówek. Może jakiś przykład do analizy, albo co mam przeczytać jeszcze chociaż już czytałem kilka razy poprzednie lekcje. Bo siedzę i nic nawet nie wrzucam żadnego kodu bo to nie ma sensu.

Na razie teoretycznie mam:
int tablica[3]
 to w niej zapisuje wybrane liczby.
Teraz jak widzicie zrobiłem tablice dla liczb wylosowanych:
int losowana[2]
I teraz jak to się zabrać do tego, aby te liczby losowane pochodziły z mojej tablicy wybranej. Na razie bez funkcji i i bez sprawdzania czy się będą powtarzały bo to chce zrozumieć na razie.
P-52954
jankowalski25
» 2012-03-19 21:06:50
losowana[ 2 ] =(( rand() % 2 ) + 0 );

Błędy:
1. Modyfikujesz wartość trzeciego elementu tej tablicy (poza jej zakresem).
2. Próbujesz zapisać do tablicy liczbę 0 lub 1, a masz dokonać losowania spośród trzech liczb a nie dwóch.
3. Nie wypełniasz całej tablicy, ale tylko jeden z jej elementów.
Rozwiązania:
1. Zmień indeks tablicy.
2. Podziel wynik funkcji rand() przez 3, a nie przez 2.
3. Umieść wypełnianie tablicy w pętli.
std::cout << losowana[ 2 ] << std::endl;

Błędy:
1. Wypisujesz wartość trzeciego elementu tablicy (poza jej zakresem).
2. Ciągle wypisujesz wartość tego samego elementu.
3. Wypisujesz numer elementu do wyświetlenia, a nie samą wartość elementu.
Rozwiązania:
1. Zmień indeks tablicy.
2. Indeks tablicy musi być zmienną, która będzie zmieniana za każdym obiegiem pętli, aby wyświetlić całą tablicę.
3. Wartość danego elementu tablicy losowana możesz użyć jako indeks tablicy z przechowywanymi danymi.
P-52957
abcde
Temat założony przez niniejszego użytkownika
» 2012-03-19 21:46:11
Dziękuję za udzielone porady.
Wprowadziłem pierwsze modyfikacje programu.
Aktualnie program losuje mi jedna liczbę, tą która znajduje się na pierwszej pozycji.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

void wybierz( int tablica[], int ile )
{
    std::cout << "Podaj trzy liczby: " << std::endl;
    int licznik = 0;
    do
    {
        std::cin >> tablica[ licznik ];
        licznik++;
    } while( licznik < ile );
   
}

void wypisz( int tablica[], int ile )
{
    std::cout << "Podales nastepujace liczby: ";
    int licznik = 0;
    do
    {
        std::cout << tablica[ licznik ] << ", ";
        licznik++;
    } while( licznik < ile );
   
   
}



int main()
{
    srand( time( 0 ) );
    int tablica[ 3 ];
    wybierz( tablica, 3 );
    wypisz( tablica, 3 );
   
    std::cout << "Losowanie dwoch liczb z trzech wybranych bez powtorzen." << std::endl;
    int losowana[ 2 ];
    losowana[ 1 ] =(( rand() % 3 ) + 0 );
   
   
    int licznik = 0;
   
    do
    {
       
        losowana[ licznik ];
        licznik++;
    } while( licznik < 2 );
   
    do
    {
       
        std::cout << losowana[ licznik ] << std::endl;
        licznik++;
    } while( licznik < 2 );
   
   
   
   
   
    return 0;
}
Teraz zastanawiam się dlaczego tą z pierwszej pozycji.
Jeśli można prosić o dalszą pomoc i wskazówki, a ja będę do tego czasu sam kombinował może coś się uda.
Dziękuję już podaną pomoc. Pozdrawiam.

P-52961
abcde
Temat założony przez niniejszego użytkownika
» 2012-03-20 20:14:14
Po licznych analizach przykładów poprawianych błędach doczytaniu informacji zabrałem się za to jeszcze raz i wyszło coś takiego.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>


int wybierz()
{
    int liczba = 0;
    std::cin >> liczba; //wybieranie liczby
    return liczba;
}

int wylosuj( int wybrane[ 3 ] )
{
    int losowana =( rand() % 3 ) + 0; // losowanie liczby
    return wybrane[ losowana ];
}

bool sprawdzanie( int liczba, int losowane[ 2 ], int wylosowane )
{
    if( wylosowane <= 0 )
         return false;
   
    int licznik = 0;
    do
    {
        if( losowane[ licznik ] == liczba ) //warunki sprawdzania
             return true;
       
        licznik++;
    } while( licznik < wylosowane );
   
    return false;
}

int main()
{
    srand( time( NULL ) );
    int wybrane[ 3 ];
    int losowane[ 2 ];
    int wylosowane = 0;
    int licznik;
    std::cout << "Podaj trzy liczby: " << std::endl;
   
    licznik = 0;
   
    do
    {
        wybrane[ licznik ] = wybierz();
        licznik++; //wypisanie wybranych liczb
    } while( licznik < 3 );
   
    do
    {
        int liczba = wylosuj( wybrane );
        if( sprawdzanie( liczba, losowane, wylosowane ) == false )
       
        {
            losowane[ wylosowane ] = liczba;
            wylosowane++;
        }
    } while( wylosowane < 2 );
   
    licznik = 0;
   
    std::cout << "Losowanie dwoch liczb z trzech wybranych bez powtorzen." << std::endl;
    do
    {
        std::cout << losowane[ licznik ] << std::endl;
        licznik++;
    } while( licznik < 2 );
   
    return 0;
}
Jak dla mnie to wszystko ok. Ale liczę na wasze uwagi bo być może czegoś nie zauważam.
Pozdrawiam.



Edit:
Nikt nie napisał uwag do aktualnego kodu programu także zamykam.
P-52985
« 1 »
  Strona 1 z 1