Menge minus Integer. Wie geht das?

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