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

Odpowiedz Nowy wątek
2016-07-31 16:41
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? :)

edytowany 4x, ostatnio: kq, 2018-04-11 16:51

Pozostało 580 znaków

2016-07-31 16:49
2

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


edytowany 1x, ostatnio: carlosmay, 2016-07-31 16:49

Pozostało 580 znaków

2016-07-31 16:51
kq
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?


Pozostało 580 znaków

2016-08-01 10:45
0
</code></pre>
<p>/<em><br />
Program ma wczytaæ 3 liczby a nastêpnie wylosowaæ 2 z nich bez powtórzeñ i wypisaæ je na ekran<br />
</em>/<br />
#include <iostream><br />
#include <cstdlib><br />
#include <ctime><br />
using namespace std;</p>
<p>int funkcjalosowanie() //losowanie liczby z przedzia³u 0-3<br />
{<br />
return (rand() % 3);<br />
}</p>
<p>bool sprawdzanie(int losowanie, int losowanietab[], int ile) //sprawdzanie czy nie by³o powtórzenia<br />
{<br />
int licznik = 0;<br />
if (ile <= 0)<br />
return 1;</p>
<pre><code>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

edytowany 4x, ostatnio: śmieszekxd, 2016-08-01 11:00

Pozostało 580 znaków

2016-08-01 10:49
1

Dlaczego nikt nie odpowiada w moim wątku?

Pozostało 580 znaków

2016-08-01 11:33

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...


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2016-08-01 12:41
0
</code></pre>
<p>#include <iostream><br />
#include <cstdlib><br />
#include <ctime><br />
using namespace std;</p>
<p>int funkcjalosowanie()<br />
{<br />
return (rand() % 3);<br />
}<br />
int sprawdzanie(int losowanietab[], int liczba, int losowanie)<br />
{</p>
<pre><code>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ć?

edytowany 3x, ostatnio: śmieszekxd, 2016-08-01 12:45
Nie zatrzymuje pętli tylko się na nie j w pewnych przypadkach zapętla popatrz jak miałeś nawiasy (a w zasadzie ich nie miałeś) wcześniej, a jak teraz napisałeś, gdzie zwiększasz zmienna licznik... - kaczus 2016-08-01 12:48

Pozostało 580 znaków

2016-08-01 13:20
0

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

Pozostało 580 znaków

2016-08-01 21:37
0
int losowanietab[3]; 

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


wczytuje 3 a z nich pewnie powinien wylosować 2, ale faktycznie cos zostało przekombinowane, dodatkowo - chyba powinien w takim razie sprawdzać, czy dodawane liczny się nie powtarzają. Ale tak na prawdę nie znam zadania, więc nie wiem, co tam tak na prawdę być powinno, a że cos jest nie tak, to widać. - kaczus 2016-08-02 10:30

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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