Losowanie bez powtórzeń - problem z zadaniem

0

Witam.
Wykorzystałem już wszystkie możliwości samodzielnego rozwiązania tego problemu. Próbowałem napisać program drugi raz od nowa, jednak występuje ten sam problem. Program zatrzymuje się w pewnym momencie i nie wyświetla na ekranie wylosowanych liczb lub wyświetla liczby z kosmosu. Losowanie jest ok, wczytywanie liczb również, nie działa coś w sprawdzaniu(funkcji do...while). Wiem, że na forum są podobne tematy, jednak nie potrafię wychwycić jaki błąd popełniam, a chciałbym wiedzieć, gdzie jest on w moim programie. Proszę o pomoc, gdzie jest problem?

//Napisz program, który wczyta 3 liczby podane przez u¿ytkownika do tablicy, a nastêpnie wylosuje 2 z nich bez powtórzeñ.
//Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje.

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

using namespace std;

int wczytaj(int tablica[])
   {
   int i=0;
   do
        {
        cout << "Podaj " << i + 1 << " liczbe: ";
        cin >> tablica[i];
        i++;
        }while(i<3);
   }

bool czybylawylosowana(int tab[], int ilewyl, int liczba)
{
    if (ilewyl <= 0)
        return false;

    int i = 0;
    do
    {
        if(liczba==tab[i])
         {
           return true;
            i++;  //tego kodu nie jestem pewien
         }
    }while(i<2);
    return false;
}

int losowanie()
{
   return rand()%3;
}

int main()
{
    int wczytaneliczby[3];
    int ilewyl = 0;
    int wylosowane[2];
    int liczba;
    srand(time(NULL));

    wczytaj(wczytaneliczby);

    do
    {
        liczba = wczytaneliczby[losowanie()];
        if(czybylawylosowana(wczytaneliczby, ilewyl, liczba) == false)
        {
            wylosowane[ilewyl] = liczba;
            ilewyl++;
            cout << wylosowane[ilewyl];
        }
        else
            break;
    }while(ilewyl<2);

    cout << "Wylosowane liczby to: " << wylosowane[0] << " oraz " << wylosowane[1] << endl;
    
    return 0;
}

Dzięki z góry za wszelkie sugestie.

1
    do
    {
        if (liczba == tab[i])
        {
           return true;
           i++;  //tego kodu nie jestem pewien
        }
    }
    while(i<2);

I słusznie, że nie jesteś pewien - masz tutaj nieskończoną pętlę jeśli liczba != tab[i] oraz i < 2
Przenieś inkrementację i++ pod if-a, poza klamry od niego.

0
MasterBLB napisał(a):
    do
    {
        if (liczba == tab[i])
        {
           return true;
           i++;  //tego kodu nie jestem pewien
        }
    }
    while(i<2);

I słusznie, że nie jesteś pewien - masz tutaj nieskończoną pętlę jeśli liczba != tab[i] oraz i < 2
Przenieś inkrementację i++ pod if-a, poza klamry od niego.

Dzięki, program losuje dwie liczby, jednak dalej druga liczba jest z kosmosu. Nie rozumiem też dlaczego napisałeś "liczba !=tab[i]". Czy kod "liczba==tab[i]" jest zły? Wydaje mi się, że ma tu sprawdzić, czy liczba jest taka sama, a nie różna.

1

Tak tutaj zostawię: https://dsp.krzaq.cc/post/1304/zwi-4-jak-wylosowac-elementy-bez-powtorzen/

Jeśli upierasz się przy tym potworku, to po co tutaj ignorujesz przekazaną wartość ilewyl?

bool czybylawylosowana(int tab[], int ilewyl, int liczba)
{
    if (ilewyl <= 0)
        return false;

    int i = 0;
    do
    {
        if(liczba==tab[i])
         {
           return true;
            i++;  //tego kodu nie jestem pewien
         }
    }while(i<2);
    return false;
}

Zobacz jak można to uprościć (i jednocześnie nie bawić się w magiczne liczby):

bool czybylawylosowana(int tab[], int ilewyl, int liczba)
{
    for(int i = 0; i < ilewyl; i++) {
        if(liczba == tab[i])
            return true;
    }
    return false;
}
2

Opisałem tylko warunki w jakich ta pętla nigdy się nie zakończy. Popatrz na ten kod i sam powiedz, co będzie w sytuacji jak liczba nie będzie równa temu, co siedzi w tab[i], oraz i będzie mniejsze niż 2?

0

Dla mnie najlepszym rozwiązaniem na ten problem jest coś takiego:

  1. Tworzysz tablicę z n elementów.
  2. Losujesz liczbę w zakresie od 0 do n - 1
  3. Wypisujesz liczę spod wylosowanego indeksu.
  4. Zamieniasz liczę spod wylosowanego indeksu z ostatnią liczbą.
  5. Losujesz następną liczbę z zakresu od 0 do n - 2
    itd...
0

Dzięki za odpowiedzi. Pętla for działa o wiele lepiej. A tego potworka to wziąłem z rozdziału, który aktualnie przerabiam w kursie. Pętli for jeszcze nie miałem, choć widziałem materiał Zelenta o niej. Zgadzam się, jest o wiele prostsza i czytelniejsza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1