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

losowanie liczb z tablicy bez powtórzeń C++

Object Storage Arubacloud
0 głosów
800 wizyt
pytanie zadane 18 października 2018 w C i C++ przez Gadzic Nowicjusz (170 p.)

Bardzo proszę o pomoc! Pogubiłem się pisząc program do losowania liczb z tablicy bez powtórzeń. Próbowałem wyśledzić błąd, ale niestety trochę mi brakuje... Proszę o podpowiedź, a nie gotowca :)

Pozdrawiam!


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

using namespace std;

int losuj(int tablica[])
{
    int i  = rand ()%5;
    return tablica [i];
}

bool czy_byla(int iLiczba, int iWylosowane[], int Ile )
{
    if (Ile ==0)
    return false;

    int i=0;
    do
    {

        if (iLiczba == iWylosowane[i] )
        {
            return true;
        }
        i++;
    }
    while (i<Ile);

    return false;
}

int main()
{
    int tablica[5];
    int wylosowane[3];
    int ile=1; //niewazne
    int i=0;
    int liczba;
    srand (time(0));
    int a = 0;

    for (i=0; i<5; i++) //wypelnienie tablicy
    {
        cout << "prosze podaj " << ile << " liczbe " << endl;
        cin >> tablica[i];
        ile++;
    }

    i=0;

    while (i <3)
    {
        wylosowane[i] = losuj (tablica);
        cout << "wylosowane " << wylosowane[i] << endl;
        liczba = wylosowane[i]; //zbedne?

        while (czy_byla(liczba, wylosowane ,i ));// dlaczego ta pętla zawsze pracuje niezaleznie od wylosowanej wczesniej liczby??
        {

            wylosowane[i] = losuj (tablica);
            liczba = wylosowane [i];
            cout << "nowo wylosowana" << wylosowane [i] << endl; /* wyświetlam to bo szukalem na ktorym etapie pojawia sie blad */
        }
        i++;
    }

    i=0;
    for (i=0; i<3; i++)
    {
        cout << "efekt koncowy " << wylosowane[i] << endl;
    }
    return 0;
}

 

komentarz 19 października 2018 przez j23 Mędrzec (194,920 p.)

Dam gotowca, żebyś wiedział, jak pisać tego typu rzeczy (bo żeś przekombinował):

	for(int i = 0; i < 3; ++i)
	{
		int v  = rand() % ile--;
		wylosowane[i] = tablica[v];
		for(; v < ile; ++v) tablica[v] = tablica[v + 1];
	}

	for (int i = 0; i < 3; ++i)
	{
		std::cout << "efekt koncowy " << wylosowane[i] << '\n';
	}

 

1 odpowiedź

0 głosów
odpowiedź 19 października 2018 przez PanRik Gaduła (4,510 p.)
wybrane 19 października 2018 przez Gadzic
 
Najlepsza

1. Linia 47:

ile++;

To nic tutaj nie robi, najpierw inkrementujesz wartość, żeby zaraz napisać nową.

2. Linia 41:
Po co Ci a, którego nigdzie nie używasz :D?

3. Linia 56:

liczba = wylosowane[i]; //zbedne?

Oczywiście, że zbędne! Do funkcji czy_była możesz przecież użyć: wylosowane[i].

4.  Linia 58:
 

while (czy_byla(liczba, wylosowane ,i ));
{
...
}

Opiszę Ci co się tutaj dzieje: Program wchodzi do pętli while sprawdza warunek i dopóki ten warunek jest prawdziwy to ciągle wykonuje funkcje, to jest OK, ale... Średnik na końcu pętli oznacza koniec instrukcji. Kompilator potraktował blok { ...} jako oddzielną część kodu, a nie jako część bloku while. Gdy while się "skończy" przechodzimy do następnych instrukcji, a następnymi są instrukcje w bloku { ... }.

komentarz 19 października 2018 przez Gadzic Nowicjusz (170 p.)
Ooo Panie Złoty! Nigdy bym tego nie znalazł :D Wielkie dzięki za ten średnik!

Co do inkrementacji "ile" w 47 linii to jest to ozdobnik i wyświetla który numer aktualnie należy podać. Oczywiście nie wpływa to na działanie programu, ale tak sobie to wymyśliłem ;)

Linia 41 i nieużywane "a" - to szczątki z wcześniejszych prób.

Jeszcze raz dzięki!

Podobne pytania

+2 głosów
2 odpowiedzi 3,407 wizyt
pytanie zadane 14 lipca 2015 w C i C++ przez Wadim Początkujący (260 p.)
0 głosów
1 odpowiedź 1,898 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,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...