Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Lekcja 21] Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2025-06-04 00:32
Autor Wiadomość
usmiech
» 2013-02-23 20:57:35
Mysle, ze z programowaniem to jak z prowadzeniem samochodu.... Na poczatku, jak nie potrafimy prowadzic samochodu, wszystko wydaje sie nam bardzo skomplikowane. Ta ciagla zmiana biegow itp.. Ale dobre prowadzenie samochodu to nie technika, to obserwacja innych uzytkownikow drogi, pieszych, zdolnosc przewidywania itd. Jednak jest to mozliwe dopiero po opanowaniu techniki prowadzenia. Podobnie jest z programowaniem, nie technika /syntax/ jest najwazniejsza, ale dobre zrozumienie problemu dla ktorego tworzymy program,wyobraznie jak to odbierze komputer , a pozniej uzytkownik programu. Ale zeby temu podolac musimy doskonale znac technike programowania .. No programowanie to jak jazda samochodem, ale to tylko moje zdanie :)
P-76848
termistor
» 2025-06-04 00:32:37
Aby rozwiązać problem generowania dwóch unikalnych wartości z tablicy `moje` bez powtórzeń, należy wprowadzić kilka kluczowych poprawek w kodzie. Oto krok po kroku, jak to zrobić:

### 1. **Popraw rozmiar tablicy `moje`**
Obecnie kod próbuje wstawić 3 elementy do tablicy o rozmiarze 2, co prowadzi do **przekroczenia zakresu** i niezdefiniowanego zachowania. Ustaw rozmiar tablicy `moje` na 3:
```cpp
int moje[3];
```

### 2. **Dodaj tablicę do śledzenia wybranych indeksów**
Utwórz tablicę `selectedIndices` do przechowywania indeksów wybranych elementów z `moje`:
```cpp
int selectedIndices[2];  // Maksymalnie 2 unikalne indeksy
int selectedCount = 0;   // Liczba wybranych indeksów
```

### 3. **Popraw funkcję `czywylosowana`**
Funkcja powinna sprawdzać, czy indeks `liczba` został już wybrany, a nie wartość w `moje`. Zmodyfikuj ją w następujący sposób:
```cpp
bool czywylosowana(int liczba, const int* tab, int ile) {
    for (int i = 0; i < ile; ++i) {
        if (tab == liczba) {
            return true;  // Indeks został już wybrany
        }
    }
    return false;  // Indeks nie został wybrany
}
```

### 4. **Zaktualizuj pętlę generującą wartości**
W głównej pętli:
- Wybierz nowy indeks `liczba` (0 lub 1).
- Sprawdź, czy nie został jeszcze wybrany.
- Jeśli nie, dodaj go do `selectedIndices` i zapisz wartość z `moje` do `wylosowane`.

Przykład kodu:
```cpp
int wylosowane[2];  // Tablica na wygenerowane wartości
int wylosowanych = 0;

while (wylosowanych < 2) {
    int liczba = losuj();  // Zwraca 0 lub 1
    if (!czywylosowana(liczba, selectedIndices, selectedCount)) {
        selectedIndices[selectedCount++] = liczba;
        wylosowane[wylosowanych++] = moje[liczba];
    }
}
```

### 5. **Dzięki tym zmianom:**
- **Zapobiegasz przekroczeniu zakresu** tablicy `moje`.
- **Poprawnie sprawdzasz unikalność** indeksów, co gwarantuje, że wartości w `wylosowane` będą różne, nawet jeśli wartości w `moje` się powtarzają.
- Kod jest bardziej czytelny i odporny na błędy.

### Przykładowe działanie:
Jeśli użytkownik wpisuje:
```
moje[0] = 5
moje[1] = 5
moje[2] = 10
```
Kod wygeneruje dwa różne indeksy (np. 0 i 2), więc `wylosowane` będzie zawierało `5` i `10`, nawet jeśli dwa pierwsze elementy `moje` są takie same.

---

**Podsumowanie:**  
Kluczowe zmiany to poprawa rozmiaru tablicy `moje`, dodanie tablicy `selectedIndices` do śledzenia wybranych indeksów oraz poprawa funkcji `czywylosowana`, aby sprawdzała indeksy zamiast wartości. Dzięki temu program generuje bezpiecznie i poprawnie dwie unikalne wartości z tablicy `moje`.
P-182478
1 « 2 »
Poprzednia strona Strona 2 z 2