Hallöle,
nach langer Zeit habe ich Pascal ausgegraben (sonst Delphi).
Man stelle sich die verrückte Idee vor jemand hat ein Behältnis mit nummerierten Kugeln in sich, von 1 bis 49. Sechs davon werden eine nach der anderen gezogen.
Ich würde gerne eine Menge bilden von 1 bis 49 und mit dem random-Befehl eine Integer aus der Menge bestimmen lassen und danach die Menge um die Integer zu reduzieren. So habe ich mir das in etwa
var Zahl:array[1…6]of integer;
var n:integer;
var I:set of 1…49;
var Z:set of 1…49;
var wahl:string;
label anfang,ende;
begin
randomize;
clrscr;
for n:=1 to 6 do
begin
Zahl[n]:=random(I)+1;
write(Zahl[n]);
I:=I-Zahl[n];
end;
Kann mir jemand einen Lösungsvorschlag anbieten?
LG Klabauter
Hallo.
Das geht so nicht.
Du könntest aber die Menge Kugeln in der Trommel simulieren durch eine (doppelt) verkettete Liste, aus der man dann zufällig Elemente entfernt („zieht“). In Delphi ist das natürlich sehr einfach durch TList-Klassen erreichbar, in Pascal muss man wohl etwas mehr Programmierarbeit investieren. Hier ein Beispiel:
const
MaxAnzahl = 49;
AnzZiehen = 6;
type
PKugel = ^TKugel;
TKugel = Record
Nummer: Integer;
Vorige, Naechste: PKugel;
end;
var
i,k: integer;
Aktuelle, Dummi: PKugel;
Gezogen: Array[1..AnzZiehen] of Integer;
begin
// Kugeln erstellen
Aktuelle := New(PKugel);
Aktuelle^.Nummer := 1;
Aktuelle^.Vorige := nil;
Aktuelle^.Naechste := nil;
Dummi := Aktuelle;
for i := 2 to MaxAnzahl do
begin
Aktuelle^.Naechste := New(PKugel);
Aktuelle^.Naechste^.Vorige := Aktuelle;
Aktuelle := Aktuelle^.Naechste;
Aktuelle^.Nummer := i;
end;
Aktuelle^.Naechste := Dummi;
Dummi^.Vorige := Aktuelle;
// Kugeln ziehen
Randomize;
for i := 1 to AnzZiehen do
begin
for k := 1 to Random(MaxAnzahl-i+1)+1 do
Aktuelle := Aktuelle^.Naechste;
// Nummer der gezogenen Kugel merken
Gezogen[i] := Aktuelle^.Nummer;
// Aktuelle Kugel aus der Liste rausnehmen
Aktuelle^.Vorige^.Naechste := Aktuelle^.Naechste;
Aktuelle^.Naechste^.Vorige := Aktuelle^.Vorige;
Dummi := Aktuelle;
Aktuelle := Aktuelle^.Naechste;
Dispose(Dummi);
end;
// Ausgabe der gezogenen Kugeln
for i := 1 to AnzZiehen do
Memo1.Lines.Add(intToStr(Gezogen[i]));
end;
Kann mir jemand einen Lösungsvorschlag anbieten?
LG Klabauter
Hallo,
klar geht das, man muss nur ein paar Schreibregeln einhalten:
procedure SetTest;
type Lottozahl = 1…49;
var ISet : set of Lottozahl;
gezogen : integer;
begin
ISet := [1…49]; { fill }
gezogen := 13;
ISet := ISet - [gezogen];
end;
Gruss Reinhard