(C++) Nie rozumiem kodu (tablice)

Nie rozumiem do końca przykładu z podręcznika,a mianowicie fragmentu:

for (int i = 0; i < ILOSC_LICZB; ) 

{

// wylosowanie liczby

aLiczby[i] = rand() % MAKSYMALNA_LICZBA + 1;

// sprawdzenie, czy się ona nie powtarza

bool bPowtarzaSie = false; 

for (int j = 0; j < i; ++j) 

{

if (aLiczby[j] == aLiczby[i]) 

{

bPowtarzaSie = true;

break;

}

}

// jeżeli się nie powtarza, przechodzimy do następnej liczby

if (!bPowtarzaSie) ++i;

}

Tutaj cały kod:

#include 

#include 

#include 

#include 


// Lotto - użycie prostej tablicy liczb

const unsigned ILOSC_LICZB = 6;

const int MAKSYMALNA_LICZBA = 49;

int main()

{

// deklaracja i wyzerowanie tablicy liczb

unsigned aLiczby[ILOSC_LICZB];

for (int i = 0; i < ILOSC_LICZB ; ++i) 

aLiczby[i] = 0; // 

// losowanie liczb

srand (static_cast(time(NULL)));


for (int i = 0; i < ILOSC_LICZB; ) 

{

// wylosowanie liczby

aLiczby[i] = rand() % MAKSYMALNA_LICZBA + 1;

// sprawdzenie, czy się ona nie powtarza

bool bPowtarzaSie = false; 

for (int j = 0; j < i; ++j) 

{

if (aLiczby[j] == aLiczby[i])

{

bPowtarzaSie = true;

break;

}

}

// jeżeli się nie powtarza, przechodzimy do następnej liczby

if (!bPowtarzaSie) ++i;

}


// wyświetlamy wylosowane liczby

std::cout << "Wyniki losowania:" << std::endl;

for (int i = 0; i < ILOSC_LICZB; ++i)

std::cout << aLiczby[i] << " ";

// czekamy na dowolny klawisz

getch();

}

Autor podręcznika tłumaczy to tak, ale ja nic z tego nie pojmuje :

Czy mógłby mi ktoś wytłumaczyć to w jakiś bardziej zrozumiały sposób? Bo z tego, co wnioskuję, to autor przypisał wcześniej liczbę z losowania do konkretnego elementu np. aLiczby [element 0] = do wyniku z losowania. Więc skąd te całe porównywanie przez j? Czemu j miałoby być j-tą wartością(indeksem??) z tablicy,a nie elementem?

Ogólnie mówiąc, kod losuje ILOSC_LICZB różnych liczb losowych.

Będąc przy i-tym(gdzie i należy do 0…ILOSC_LICZB) indeksie , losowana jest liczba i przypisywana jest ona do i-tego elementu w tablicy aLiczby. Wewnętrzna pętla(wykonywana dla każdego przebiegu pętli zewnętrznej, czyli dla każdego i z zadanego przedziału) sprawdza, czy j-ty(gdzie j należy do 0…i) element w tablicy nie jest równy wylosowanej liczbie(krótko mówiąc: sprawdza, czy żadna z poprzednio wylosowanych liczb nie jest równa aktualnej). Jeśli wewnętrzna pętla stwierdzi, że taka liczba już istnieje, to nie inkrementuje i - nastąpi ponowna próba wylosowania i-tego elementu , czyli wracamy do początku. Jeśli stwierdzi, że taki element nie istnieje - i zostanie powiększone o 1 i przejdziemy do losowania następnego elementu(czyli wracamy do początku, ale rozpatrujemy inny element). Jeśli zadana ilość elementów zostanie wylosowana, to program się zakończy.

0…ILOSC_LICZB(itp.) to inny zapis przedziału lewostronnie domkniętego OD…DO - Więcej

Bardzo dziękuje, już zrozumiałem :slight_smile: .