[Lekcja 21] Losowanie bez powtórzeń
Ostatnio zmodyfikowano 2025-06-04 00:32
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 :) |
|
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`. |
|
1 « 2 » |