Losowanie niepowtarzających się liczb w C++Builder 6

Pytanie

Losowanie niepowtarzających się liczb np. (Totolotka 1 z 49) C++Builder6 Obiektowo , VCL




Odpowiedź Sztucznej Inteligencji


Wprowadzenie

Aby zaimplementować losowanie niepowtarzających się liczb w zakresie od 1 do 49 w C++Builder 6, możemy skorzystać z podejścia obiektowego oraz komponentów VCL (Visual Component Library). Poniżej przedstawiam szczegółowe rozwiązanie tego problemu, krok po kroku.

Bezpośrednia odpowiedź na pytanie

Stworzymy program w C++Builder 6, który będzie losował niepowtarzające się liczby, podobnie jak w Totolotku (1 z 49), używając podejścia obiektowego i komponentów VCL.

Szczegółowa analiza problemu

  1. Stworzenie klasy TotolotkGenerator:

    • Klasa ta będzie odpowiedzialna za logikę losowania liczb.
    • Będzie przechowywać dostępne liczby oraz wylosowane liczby.
  2. Implementacja metod klasy:

    • Konstruktor klasy zainicjalizuje generator liczb losowych oraz zresetuje dostępne liczby.
    • Metoda Reset zresetuje listę dostępnych liczb.
    • Metoda DrawNumber wylosuje liczbę i usunie ją z listy dostępnych liczb.
    • Metoda GetDrawnNumbers zwróci wylosowane liczby.
  3. Interfejs użytkownika:

    • Dodanie komponentów VCL do formularza, takich jak przycisk do losowania, lista wyników oraz etykieta informacyjna.

Implementacja

1. Deklaracja klasy TotolotkGenerator

class TotolotkGenerator
{
private:
    std::vector<int> availableNumbers;
    std::vector<int> drawnNumbers;
    int maxNumber;
    int numbersToDrawn;

public:
    TotolotkGenerator(int max = 49, int count = 6);
    void Reset();
    bool DrawNumber();
    std::vector<int> GetDrawnNumbers() const;
};

2. Implementacja metod klasy

#include <algorithm>
#include <ctime>
#include <cstdlib>

TotolotkGenerator::TotolotkGenerator(int max, int count)
    : maxNumber(max), numbersToDrawn(count)
{
    srand(time(NULL));
    Reset();
}

void TotolotkGenerator::Reset()
{
    availableNumbers.clear();
    drawnNumbers.clear();
    for (int i = 1; i <= maxNumber; ++i)
    {
        availableNumbers.push_back(i);
    }
}

bool TotolotkGenerator::DrawNumber()
{
    if (availableNumbers.empty() || drawnNumbers.size() >= numbersToDrawn)
    {
        return false;
    }

    int index = rand() % availableNumbers.size();
    int drawnNumber = availableNumbers[index];

    availableNumbers.erase(availableNumbers.begin() + index);
    drawnNumbers.push_back(drawnNumber);

    return true;
}

std::vector<int> TotolotkGenerator::GetDrawnNumbers() const
{
    return drawnNumbers;
}

3. Dodanie komponentów VCL do formularza

  • TButton o nazwie btnDraw z napisem „Losuj”.
  • TListBox o nazwie lbResults.
  • TLabel o nazwie lblInfo.

4. Deklaracja obiektu TotolotkGenerator w pliku nagłówkowym formularza

private:
    TotolotkGenerator totolotek;

5. Inicjalizacja obiektu TotolotkGenerator w konstruktorze formularza

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner), totolotek(49, 6)
{
}

6. Implementacja metody obsługi zdarzenia kliknięcia przycisku „Losuj”

void __fastcall TForm1::btnDrawClick(TObject *Sender)
{
    totolotek.Reset();
    lbResults->Clear();

    for (int i = 0; i < 6; ++i)
    {
        if (totolotek.DrawNumber())
        {
            lbResults->Items->Add(IntToStr(totolotek.GetDrawnNumbers().back()));
        }
    }

    std::vector<int> results = totolotek.GetDrawnNumbers();
    std::sort(results.begin(), results.end());

    AnsiString resultStr = "Wylosowane liczby: ";
    for (size_t i = 0; i < results.size(); ++i)
    {
        resultStr += IntToStr(results[i]);
        if (i < results.size() - 1)
        {
            resultStr += ", ";
        }
    }

    lblInfo->Caption = resultStr;
}

Wspierające wyjaśnienia i detale

  • Inicjalizacja generatora liczb losowych: srand(time(NULL)); zapewnia, że sekwencja losowych liczb będzie różna przy każdym uruchomieniu programu.
  • Resetowanie dostępnych liczb: Metoda Reset przygotowuje listę liczb od 1 do 49.
  • Losowanie liczby: Metoda DrawNumber losuje liczbę z dostępnych liczb, usuwa ją z listy i dodaje do listy wylosowanych liczb.
  • Wyświetlanie wyników: Wylosowane liczby są wyświetlane w komponencie TListBox oraz w etykiecie TLabel.

Podsumowanie

Powyższe rozwiązanie zapewnia obiektowe podejście do generowania losowych, niepowtarzających się liczb w stylu Totolotka. Klasa TotolotkGenerator enkapsuluje całą logikę losowania, a interfejs użytkownika jest zbudowany przy użyciu komponentów VCL.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.