Autor Beitrag
horsti
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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?

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: So 19.02.06 13:34 
Oh, ja klar.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 19.02.06 14:03 
Gibt's viele Möglichkeiten:

Eine einfache mit Hilfe einer Schleife (und Elementen in der Menge):

ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 20.02.06 14:47 
Also Du meinst sowas hier:

ausblenden Delphi-Quelltext
1:
2:
3:
var
    BS: Buchstaben;    // Beliebiger Buchstabe (in M enthalten)
    MB: Menge;         // Menge aller für diesen Fall gültigen Buchstaben


Wobei wir annehmen, folgendes Beispiel zu haben:

ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mo 20.02.06 15:04 
Alles klar, danke dir!