• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Losowanie liczb z tablicy bez powtórzeń

Object Storage Arubacloud
+2 głosów
3,408 wizyt
pytanie zadane 14 lipca 2015 w C i C++ przez Wadim Początkujący (260 p.)
zamknięte 18 listopada 2015 przez Wadim

Witam.

Od kilku ładnych godzin męcze się z programem, który miał działać następująco:

- Wczytać 3 liczby podane przez użytkownika

- Wylosowac 2 z nich bez powtórzeń

- Wypisac wylosowane liczby na ekran

Aktualny problem polega na tym, iż po podaniu 3 liczb program nic nie robi. Oto kod:
 

#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 n = 0;

    do
    {
        int i;
        i = (rand() % 3);
        liczby[i];
        n++;
    }
    while(n < 2);

    return 0;
}

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);
        {
            return false;
            i++;
        }

    }
    while(i < wylosowanych);

    return true;
}

int main()
{
    srand(time(NULL));
    int liczby[2];
    int wylosowanych = 0;
    wczytaj_liczby(liczby);

    do
    {
        int wylosowane_liczby = losuj_liczby(liczby);
        if(czy_byla_wylosowana(liczby, wylosowane_liczby, wylosowanych) == true)
        {
            liczby[wylosowanych] = wylosowane_liczby;
            wylosowanych++;
        }

    }
    while(wylosowanych < 2);

    wylosowanych = 0;

    do
    {
        cout << "Wylosowane liczby to: " << liczby[wylosowanych] << ' ';
        wylosowanych++;
    }
    while(wylosowanych < 2);

    return 0;
}



Z góry dziękuję za pomoc :)

komentarz zamknięcia: Otrzymałem oczekiwaną pomoc.

2 odpowiedzi

0 głosów
odpowiedź 14 lipca 2015 przez Krawiec91 Pasjonat (19,600 p.)

Za mała tablica w programie głównym , powinna być 3 - elementowa, a nie 2 - elementowa
 

int liczby[3];

Funkcja wczytaj_liczby() powinna nie zwracać wartości, bo tylko wczytujesz liczby do tablicy, która jest jest argumentem tej funkcji.
Funkcja losuj_liczby() jest do poprawy, bo cały czas będzie Ci zwracała 0
 

return 0;

 

komentarz 14 lipca 2015 przez Krawiec91 Pasjonat (19,600 p.)
#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);
}

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

int main()
{
    srand(time(0));
    int liczby[3];
    int wylosowane[2];
    wczytaj_liczby(liczby);
    for (int i=0;i<2;i++)
    {
        wylosowane[i]=losuj_liczby(liczby);
    }
    int i = 0;
   
   cout<<"Wprowadzone 3 liczby:"<<endl; 
   do
    {
        cout << liczby[i] << ' ';
        i++;
    }
    while(i < 3);

   cout<<"\nWylosowane 2 liczby:"<<endl;
  for (int i=0; i<2;i++)
  {
       cout<<wylosowane[i]<<" ";
   }
    return 0;
}

Do pełnego rozwiązania brakuje ogarnięcia tematu sprawdzenia czy wylosowana liczba się nie powtarza.

komentarz 14 lipca 2015 przez Wadim Początkujący (260 p.)

Bez funkcji sprawdzającej czy liczba się nie powtarza wszystko działa a po dodaniu jest to co wczesniej, czyli po wczytaniu danych program nic nie robi.

#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)
        {
            wylosowane_liczby[wylosowanych];
            wylosowanych++;
        }

    }
    while(wylosowanych < 2);

    wylosowanych = 0;

    do
    {
        cout << wylosowane_liczby[wylosowanych] << ' ';
        wylosowanych++;
    }
    while(wylosowanych < 2);

    return 0;
}

 

komentarz 14 lipca 2015 przez Krawiec91 Pasjonat (19,600 p.)
#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 wylosowane_liczby[])
{
    if (wylosowane_liczby[0]==wylosowane_liczby[1])
        return true;
    return false;

}

int main()
{
    srand(time(NULL));
    int liczby[3];
    int wylosowane_liczby[2];
    int wylosowanych = 0;
    int i = 0;
    wczytaj_liczby(liczby);

    wylosowane_liczby[0]=losuj_liczby(liczby);

    while (1)
    {
        wylosowane_liczby[1]=losuj_liczby(liczby);
        if (czy_byla_wylosowana(wylosowane_liczby))
            continue;
        break;
    }

    wylosowanych = 0;

    do
    {
        cout << wylosowane_liczby[wylosowanych] << ' ';
        wylosowanych++;
    }
    while(wylosowanych < 2);

    return 0;
}

 

Jeśli losujesz dwie liczby z trzech, to pierwszym losowaniu na pewno nie będzie powtórzenia. Przy drugim losowaniu trzeba sprawdzić, czy się nie wylosowało tego samego. Funkcja do sprawdzania czy się nie powtórzyło, właśnie to wykonuje, porównuje wynik pierwszego losowania z wynikiem drugiego losowania. Jeśli liczby są takie same zwraca true, jeśli różne zwraca false.
Co do wplecenia tego w program główny. Pierwsze losowanie wykonuje się przed pętla, bo nie ma z czym porównać wylosowanej liczby.
W pętli while wykonane jest losowanie, a następnie porównanie wylosowanej liczby z poprzednio wylosowaną, z użyciem funkcji czy_byla_wylosowana().
 

        if (czy_byla_wylosowana(wylosowane_liczby))
            continue;
        break;

Jeśli taka sama liczba została wylosowana poprzednio, wykonywana jest instrukcja continue, program wraca do pierwszego wyrażenia w pętli czyli do ponownego losowania. Jeśli została wylosowana inna liczba niż za pierwszym razem, wykonuje się instrukcja break - program wychodzi z pętli.

Program co ma zrobić, zrobi. Ale przy większym zbiorze liczb i przy większej ilości liczb do wylosowania, funkcję sprawdzającą czy_byla_wylosowana() trzeba by było dopracować.

komentarz 14 lipca 2015 przez 0e85dc6eaf Dyskutant (8,840 p.)
Jeśli się nie mylę to jest to zadanie z kursu cpp0x, a drugim z tego tematu jest właśnie wylosowanie 8 liczb z 10 podanych, więc dobrze byłoby napisać jakąś uniwersalną fukcję sprawdzająca, żeby 2 razy tego samego nie robić. Pamiętam jak sam nad tym zadaniem siedziałem :) Ze 3 godziny chyba, a jedynym błędem było indeksowanie od 1 :/ Poza tym funkcja była zrobiona na switchu, więc kolega tutaj zaproponował o wiele lepsze rozwiązanie z losowaniem indeksu
komentarz 14 lipca 2015 przez Wadim Początkujący (260 p.)
Dziekuję wszystkim za pomoc :)
0 głosów
odpowiedź 14 lipca 2015 przez 0e85dc6eaf Dyskutant (8,840 p.)

Oprócz tego co napisał kolega w funkcji losuj liczby nie rób od razu 2 losowań, bo w funcji main i tak wywołasz funkcję losującą min. 2 razy. Ponadto musisz zwrócić to co wylosowałeś

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

może jeszcze coś jest, ale na razie spróbuj tego + to co kolega napisał

Podobne pytania

+1 głos
2 odpowiedzi 2,012 wizyt
0 głosów
1 odpowiedź 1,901 wizyt
0 głosów
2 odpowiedzi 5,769 wizyt
pytanie zadane 14 sierpnia 2016 w Java przez Patryk Rafał Bywalec (2,700 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...