Autor |
Beitrag |
horsti
      
Beiträge: 44
|
Verfasst: So 19.02.06 13:20
Hi,
ich habe eine Variable x, die ein Element vom Mengentyp XY besitzt.
Nun möchte ich gerne möglichst effizient prüfen, ob ein größeres Element in der Menge existiert und dieses, wenn vorhanden, auch zuweisen.
Wie mache ich das, möglichst elegant?
Danke
Gruß
Henning
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 19.02.06 13:24
Was meinst Du genau? Kannst Du das bitte etwas ausführlicher beschreiben?
Wie ist Menge XY aufgebaut?
Meinst Du sowas hier?
Delphi-Quelltext 1: 2: 3: 4:
| type XY = set of (a,b,c,d,e,f,g,h,i,j); var X: XY;
If a in X Then X := X + [b,c,d,e,f,g,h,i,j); |
???
Oder was meinst Du?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
horsti 
      
Beiträge: 44
|
Verfasst: So 19.02.06 13:34
Oh, ja klar.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type buchstaben = (a,b,c,d,e,f,g,h,i,j) menge = set of buchstaben; var z : menge; x : buchstaben;
If x < high(z) then x := nächst größeres Element; |
Also, ich möchte wissen, ob x bereits das höchste Element in der Menge ist (j), wenn nicht, soll es den Wert des nächst größeren Elementes annehmen.
Beispiel: x ist j - fertig
x ist b -> x ist c
x ist d -> x ist e
Wie mache ich das?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 19.02.06 14:03
Gibt's viele Möglichkeiten:
Eine einfache mit Hilfe einer Schleife (und Elementen in der Menge):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| For X := i downto a do Begin If X in Z Then begin Z := Menge(2 shl Ord(X)); Break; end; end; |
Wenn Menge [a,b,c] enthielt, enthält sie nach der Schleife [d].
Die weitere Version, für einfache Enums geht sogar noch einfacher:
Delphi-Quelltext 1: 2:
| If x < High(Buchstaben) Then x := Succ(X); |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
horsti 
      
Beiträge: 44
|
Verfasst: So 19.02.06 14:22
Joar, an Schleife hab ich auch gedacht, aber ich hätte gedacht, dass es irgendwie einfach geht.
Wie kann ich in meiner Menge das größte Element ermitterln? Also quasi high für Mengen, gibts sowas?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 19.02.06 14:39
Für Mengen (Sets) nimmst Du den ersten Quelltext, für Aufzählungen (Enums) den zweiten Source aus meinem vorigen Posting.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
horsti 
      
Beiträge: 44
|
Verfasst: So 19.02.06 17:03
Leider kann ich das nicht.
Ich habe nämlich festgestellt das noch eine schwierigkeit hinzukommt.
Und deine Schleife mir auch sonst nicht das gewünschte Ergebnis bringt.
Also x ein ist Element der Menge XY, XY ist aber nicht immer die selbe Menge!!
XY kann einmal die Werte: [a..c] haben oder auch nur [a] oder [d..g] alles ist möglich!
aber x ist auf jeden Fall ein Element der Menge, nun muss ich noch herausfinden, ob x das größte Element ist, was ich ja ZUR NOT auch mit einer Schleife machen kann und wenn es NICHT das größte Element ist, dann soll x ein Element aufsteigen, also den NÄCHST größeren Wert annehmen. XY bleibt dabei unverändert.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 20.02.06 14:47
Also Du meinst sowas hier:
Delphi-Quelltext 1: 2: 3:
| var BS: Buchstaben; MB: Menge; |
Wobei wir annehmen, folgendes Beispiel zu haben:
Delphi-Quelltext 1: 2:
| BS := b; MB := [b, d, g, i]; |
Und du willst nun, dass BS = d herauskommt?
Das würde man dann so machen können:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var Tmp : Buchstaben; begin for Tmp := BS to High(BS) do Begin If (Tmp in MB) AND (Tmp <> BS) Then Begin BS := Tmp; Break; end; end; end; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
horsti 
      
Beiträge: 44
|
Verfasst: Mo 20.02.06 15:04
|
|
|