Losowanie niepowtarzających się liczb np. (Totolotka 1 z 49) C++Builder6 Obiektowo , VCL
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.
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.
Stworzenie klasy TotolotkGenerator
:
Implementacja metod klasy:
Reset
zresetuje listę dostępnych liczb.DrawNumber
wylosuje liczbę i usunie ją z listy dostępnych liczb.GetDrawnNumbers
zwróci wylosowane liczby.Interfejs użytkownika:
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;
};
#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;
}
btnDraw
z napisem „Losuj”.lbResults
.lblInfo
.TotolotkGenerator
w pliku nagłówkowym formularzaprivate:
TotolotkGenerator totolotek;
TotolotkGenerator
w konstruktorze formularza__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner), totolotek(49, 6)
{
}
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;
}
srand(time(NULL));
zapewnia, że sekwencja losowych liczb będzie różna przy każdym uruchomieniu programu.Reset
przygotowuje listę liczb od 1 do 49.DrawNumber
losuje liczbę z dostępnych liczb, usuwa ją z listy i dodaje do listy wylosowanych liczb.TListBox
oraz w etykiecie TLabel
.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.