Losowanie bez powtórzeń, pętla nie działa

0
 #include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

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

bool sprawdzanie(int losowanie,int losowanietab[], int ile)
{
    int licznik=0;
if (ile<=0)
return 1;

do
{
    if(losowanie=losowanietab[licznik])
    return 0;
    licznik++;
}
while(licznik<=ile);
return 1;

}




int main()
{
    srand(time(NULL));
int wczytane[3];
int ile=0;
do
{
    cout<<"Podaj liczbe:";
    cin>>wczytane[ile];
    ile++;
}
while(ile<3);



int wylosowane[2];
int losowanietab[2];
 ile=0;
 int losowanie;
 int a;
do
{
     losowanie=losowanie1();
  if(sprawdzanie(losowanie,losowanietab,ile)==1)
  {
      a=wczytane[losowanie];
      wylosowane[ile]=a;
      losowanietab[ile]=losowanie;
 cout<<"wczytane"<<wczytane[losowanie]<<"a"<<a<<"losowanie"<<losowanie<<"losowanie[tab]"<<losowanietab[ile]<<"ile"<<ile<<"sprawdzanie"<<sprawdzanie(losowanie,losowanietab,ile);
      ile++;
  }



}
while (ile<2);

do
{
    cout<<wylosowane[ile]<<endl;
    ile++;
}
while(ile<2);
} 

Pętla działa tylko raz, dlaczego? mógłby mi ktoś pomóc? :)

2

*Sformatuj poprawnie kod.
*Która pętla? Jest ich kilka.
*Używaj debuggera do szukania takich błędów.

0

Dodatkowo:

nazywaj sensownie funkcje i zmienne. Wiem, że to jedna z trudniejszych rzeczy w tej dziedzinie, ale serio, losowanie i losowanie1 uważasz za sensowne nazwy?

0
 

/*
Program ma wczytaæ 3 liczby a nastêpnie wylosowaæ 2 z nich bez powtórzeñ i wypisaæ je na ekran
*/
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int funkcjalosowanie() //losowanie liczby z przedzia³u 0-3
{
return (rand() % 3);
}

bool sprawdzanie(int losowanie, int losowanietab[], int ile) //sprawdzanie czy nie by³o powtórzenia
{
int licznik = 0;
if (ile <= 0)
return 1;

do {
    if (losowanie = losowanietab[licznik])
        return 0;
    licznik++;
} while (licznik <= ile);
return 1;

}

int main()
{
srand(time(NULL));
int wczytane[3]; //tablica na liczby wczytane
int ile = 0;
do //wczytywanie
{
cout << "Podaj liczbe:";
cin >> wczytane[ile];
ile++;
} while (ile < 3);

int wylosowane[2]; //tablica na liczby wylosowane
int losowanietab[2]; //tablica na numery kolejnoœci liczb wylosowanych
ile = 0;
int losowanie;
int a;

do //wadliwa pêtla, wykonuje siê tylko raz
{
    losowanie = funkcjalosowanie();
    if (sprawdzanie(losowanie, losowanietab, ile) == 1) {
        a = wczytane[losowanie];
        wylosowane[ile] = a; //przekazanie liczby z tablicy wczytane do wylosowane
        losowanietab[ile] = losowanie; //przekazywanie do tablicy numeru wylosowanej liczby
        cout << "wczytane" << wczytane[losowanie] << "a" << a << "losowanie" << losowanie << "losowanie[tab]" << losowanietab[ile] << "ile" << ile << "sprawdzanie" << sprawdzanie(losowanie, losowanietab, ile); //linijka pomocnicza
        ile++;
    }

} while (ile < 2);

do {
    cout << wylosowane[ile] << endl;
    ile++;
} while (ile < 2);

}

 

Dodałem komentarze i sformatowałem kod, proszę o wytłumaczenie dlaczego pętla wykonuje się tylko raz

3

Kod koszmarny, nie wiem co źle działa, wydaje mi się, że z rok temu ten sam kod już tu widziałem, ale błąd na pewno jest tu:

 
if (losowanie = losowanietab[licznik])

A dokładniej błędne działanie, bo w zasadzie można tak zrobić, ale nie sądzę, że o to chodziło twórcy wątku...

0
 

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int funkcjalosowanie()
{
return (rand() % 3);
}
int sprawdzanie(int losowanietab[], int liczba, int losowanie)
{

if (liczba == 0) {
    return 1;
}

int licznik = 0;
do {

    if (losowanie == losowanietab[licznik]) //ta linijka zatrzymuje pętle!
    {

        return 0;
        licznik++;
    }

} while (licznik <= liczba);
return 1;

}

int main()
{
srand(time(NULL));
int wczytane[3];
int liczba = 0;
int losowanietab[3];
do {
cout << "Podaj liczbe:";
cin >> wczytane[liczba];
liczba++;
} while (liczba < 3);
liczba = 0;

int losowanie = funkcjalosowanie();
do {
    losowanie = funkcjalosowanie();
    if (sprawdzanie(losowanietab, liczba, losowanie) == 1)

        cout << wczytane[losowanie];
    losowanietab[liczba] = losowanie;
    liczba++;

} while (liczba < 3);

}

 

Dzięki kaczus, rzeczywiście w tym miejscu coś jest nie tak.
Dokładnie program ma wczytać 3 liczby po czym wylosować i wypisać 2 z nich bez powtórzeń.
Napisałem program robiący to samo ale mniej koszmarny, jest w nim dokładnie ten sam problem, dlaczego ta linijka w funkcji zatrzymuje pętle i jak to naprawić?

0

Rzeczywiście program nie działał przez licznik postawiony w złym miejscu, poprawiłem i wszystko działa wielkie dzięki kaczus :)

0
int losowanietab[3]; 

Ta tablica jest za duża. Losujesz tylko dwa elementy.

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