Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - set of chars: Bestimmen der Länge der Menge und Auslesen


Frankieboy - Mi 16.06.10 16:01
Titel: set of chars: Bestimmen der Länge der Menge und Auslesen
Hallo,

wieder mal eine grundlegende Frage, zu der ich in der Delphihilfe (da schön geordnet :roll:) nichts finde.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  Zeichen: set of chars;
begin
  Zeichen := ['A'..'Z'];
  {[...]}
end;


ich benutze eine Set of chars und weise Ihr danach einige Chars zu (mehr als im Beispiel).
1. Wie bekommt man die Länge einer set (of CHars), also die Menge der Zeichen insgesamt?
2. Wie kann man bestimmte Zeichen, z.B. Zeichen Nr. 5 aus der Menge auslesen?

Vielen Dank schon mal,

Frank


Narses - Mi 16.06.10 16:15

Moin!

user profile iconFrankieboy hat folgendes geschrieben Zum zitierten Posting springen:
1. Wie bekommt man die Länge einer set (of CHars), also die Menge der Zeichen insgesamt?
Das ist (AFAIK) nicht möglich (klar: ausser selbst zählen, was in der Menge ist).
DOH hat folgendes geschrieben:
Mengenoperatoren

Die folgenden Operatoren haben eine Menge als Operanden.

Mengenoperatoren

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Operator  Operation  Operandtyp  Ergebnistyp  Beispiel
+  Vereinigung  Menge  Menge  Set1 + Set2
-  Differenz  Menge  Menge  S - T
*  Teilmenge  Menge  Menge  S * T
<=  Teilmenge  Menge  Boolean  Q <= MySet
>=  Obermenge  Menge  Boolean  S1 >= S2
=  Gleich  Menge  Boolean  S2 = MySet
<>  Ungleich  Menge  Boolean  MySet <> S1
in  Element  Ordinal, Menge  Boolean  A in Set1

Für +, - und * gelten die folgenden Regeln:

Der Ordinalwert O ist nur in X + Y enthalten, wenn O in X oder Y (oder beiden) enthalten ist. O ist nur in X - Y enthalten, wenn O in X, nicht aber in Y enthalten ist. O ist nur in X *Y enthalten, wenn O sowohl in X als auch in Y enthalten ist.
Das Ergebnis einer Operation mit +, - oder * ist vom Typ set of A..B, wobei A der kleinste und B der größte Ordinalwert in der Ergebnismenge ist.

Für <=, >=, =, <> und in gelten die folgenden Regeln:

X <= Y ist nur dann True, wenn jedes Element von X ein Element von Y ist; Z >= W ist gleichbedeutend mit W <= Z. U = V ist nur dann True, wenn U und V genau dieselben Elemente enthalten. Andernfalls gilt: U <> V is True.
Für einen Ordinalwert O und eine Menge S ist O in S nur dann True, wenn O ein Element von S ist.

user profile iconFrankieboy hat folgendes geschrieben Zum zitierten Posting springen:
2. Wie kann man bestimmte Zeichen, z.B. Zeichen Nr. 5 aus der Menge auslesen?
Die Elemente einer Menge haben keine Ordnung. Ob ein Element in der Menge ist, kann man mit dem in-Operator rausfinden, s.o.

cu
Narses


martin300 - Mi 16.06.10 16:27

Hallo,
zu 1)
siehe: http://www.delphipraxis.net/551329-post.html

zu 2)
Aus Wikipedia: "Bei der Beschreibung einer Menge geht es ausschließlich um die Frage, welche Elemente in ihr enthalten sind. Es wird nicht danach gefragt, ob ein Element mehrmals enthalten ist, oder ob es eine Reihenfolge unter den Elementen gibt."

und somit macht 1) auch nicht viel Sinn.


Narses - Mi 16.06.10 17:16

Moin!

user profile iconmartin300 hat folgendes geschrieben Zum zitierten Posting springen:
und somit macht 1) auch nicht viel Sinn.
Vor allem werden dort Annahmen über das Speicherabbild einer Menge gemacht und das ist für eine abstrakte Betrachtung des Sprachfeatures absolut tödlich! :|

cu
Narses


jaenicke - Do 17.06.10 08:44

Außerdem bin ich mir nicht sicher ob das wirklich so viel schneller als die triviale Version ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  TCharSet = set of Char;

function CountSet(const Value: TCharSet): Integer;
var
  i: Char;
begin
  Result := 0;
  for i in Value do
    Inc(Result);
end;


Sinspin - Do 17.06.10 14:03

Das klappt aber nicht mit Delphi7 oder anderen älteren Versionen.
Dort musst du von der maximalen Menge ausgehen also:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function CountSet(const Value: TCharSet): integer;
var
  l: integer;

begin
  Result := 0;
  for l := 0 to 255 do
    if Chr(l) in Value then
     Inc(Result);
end;