Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mehere Werte auf gleichheit überprüfen (https://www.delphipraxis.net/67483-mehere-werte-auf-gleichheit-ueberpruefen.html)

3_of_8 15. Apr 2006 12:39

Re: Mehere Werte auf gleichheit überprüfen
 
Immer diese Sprachfeatureerweiterungen. Ich bleib bei meinem Delphi 7.

BenjaminH 15. Apr 2006 12:46

Re: Mehere Werte auf gleichheit überprüfen
 
Nehmen wir mal an, D2k5 ist vorhanden, dann wäre diese Lösung doch auch gut:
Delphi-Quellcode:
type TIntegerArray=Array of Integer;
function AreEqual(Values:TIntegerArray):Boolean;
Var Key:Integer;
  FirstKey:Integer;
Begin
  If Length(Values)<1 then
    exit;
  FirstKey:=Values[Low(Values)];
  for Key in Values do
     Result:=Result and (Key=FirstKey);
End;
Oder passt da was nicht?

@sakura: Den Vergleich verstehe ich nicht:
Delphi-Quellcode:
if Length(Value) <= < then
wie kann man mit einem Operator vergleichen?

sakura 15. Apr 2006 12:58

Re: Mehere Werte auf gleichheit überprüfen
 
Zitat:

Zitat von BenjaminH
Nehmen wir mal an, D2k5 ist vorhanden, dann wäre diese Lösung doch auch gut:[delphi]type TIntegerArray=Array of Integer;

Der funktioniert, nur mir persönlich sind da zuviele Zuweisungen (Result := ...), es wird immer der erste Wert wiederholt verglichen (mit sich selbst). Es geht, ist imo aber etwas irreführend. Ausserdem gehst Du immer das gesamte Array durch, auch wenn bereits nach zwei Werten eine Abweichung besteht, yet 998885 to go ;)
Zitat:

Zitat von BenjaminH
@sakura: Den Vergleich verstehe ich nicht:

Tippfehler korrigiert ;)

...:cat:...

Hawkeye219 15. Apr 2006 13:02

Re: Mehere Werte auf gleichheit überprüfen
 
Hallo Benjamin,

Du solltest zu Beginn der Funktion deren Rückgabewert noch initialisieren, sonst liefert sie mehr oder weniger zufällige Ergebnisse. :wink:

Gruß Hawkeye

marabu 15. Apr 2006 13:07

Re: Mehere Werte auf gleichheit überprüfen
 
Hallo.

Für den speziellen Fall hat xZise ja schon die optimale Lösung. Bei der allgemeinen Lösung für beliebige Array-Größen müsste bei leerem array eigentlich eine Exception geworfen werden.

Delphi-Quellcode:
function AllBytesEqual(const a: array of byte): Boolean;
var
  i: Integer;
begin
  Result := false;
  for i := Succ(Low(a)) to High(a) do
    if a[i] <> a[Pred(i)] then
      Exit;
  Result := Length(a) > 0;
end;
Grüße vom marabu

sakura 15. Apr 2006 14:01

Re: Mehere Werte auf gleichheit überprüfen
 
Zitat:

Zitat von marabu
Bei der allgemeinen Lösung für beliebige Array-Größen müsste bei leerem array eigentlich eine Exception geworfen werden.

Würde ich Definitionssache nennen, wurde aber nicht vorgegeben :mrgreen:
Zitat:

Zitat von marabu
if a[i] <> a[Pred(i)] then

Immer auf a[i] zuzugreifen ist nicht optimal, vorher zwischenspeichern ;)

...:cat:...

xZise 15. Apr 2006 14:01

Re: Mehere Werte auf gleichheit überprüfen
 
Danke für die Antworten :)

@ sakura:
Ist bei 0 Items (im Array) alle gleich?
Zitat:

Zitat von sakura
Delphi-Quellcode:
  Result := True;
  if Length(Value) <= 1 then
    Exit;

@ marabu:
Seit wann kann man ein Array direkt übergeben?
Muss man da nicht erstmal ein Typ davon anlegen, oder ist es anderes weil es
  • dynamisch
  • oder eine Konstante
ist?

Ralf Kaiser 15. Apr 2006 14:31

Re: Mehere Werte auf gleichheit überprüfen
 
[quote="emteg"]
Zitat:

So und nicht anders. Wenn du sagtst Result:= dann erwartet delphi da eine zuweisung. Und mit Value[1]=Value[2] erhältst du keinen wert. Du vergleichst nur zwei array werte, aber ohne das ergebnis zu speichern.
Hallo,

natürlich liefert "Value[1]=Value[2]" einen Wert und zwar einen Boolean-Wert der true ist wenn die beiden Werte gleich sind und der false ist wenn beide Werte ungleich sind. Es wird also Result ein Wert zugewiesen (sonst würde dieser Ausdruck ja schon vom Compiler bemängelt.

Also:

Delphi-Quellcode:
if Value[1]=Value[2] then Result := true;
kann man auch so schreiben:

Delphi-Quellcode:
Raesult := Value[1] = Value[2];
Ciao,
Ralf

MStoll 15. Apr 2006 14:39

Re: Mehere Werte auf gleichheit überprüfen
 
Zitat:

Zitat von Alfi001
Also:

Delphi-Quellcode:
if Value[1]=Value[2] then Result := true;
kann man auch so schreiben:

Delphi-Quellcode:
Raesult := Value[1] = Value[2];
Ciao,
Ralf

Hallo,

das kann man nicht unbedingt so schreiben, da bei einer Zuweisung der vorherige Wert von result auf JEDEN Fall ersetzt wird. Eine if-then-else-Konstruktion kann man durch eine Zuweisung ersetzen. Hier fehlt allerdings der else-Zweig. Den Unterschied merkt man, wenn result vorher schon true ist. Bei
Delphi-Quellcode:
if Value[1]=Value[2] then Result := true;
bleibt result true.
Bei
Delphi-Quellcode:
Result := Value[1] = Value[2];
wird es false.

Gruß
Michael

[Edit]Wollte dies nur anmerken, da man (mich eingeschlossen) bei solchen "Optimierungen", sprich if-Konstrukte durch Zuweisungen zu ersetzen, oft kleine Fehler macht, die nachher schwer zu entdecken sind.[/Edit]

negaH 15. Apr 2006 14:46

Re: Mehere Werte auf gleichheit überprüfen
 
deine IF THEN Abfrage ist nichts anderes als eine Implikation des vorherigen Wertes von result.

Geht also auch so

Delphi-Quellcode:
Result := Result or (Value[1] = Value[2]);
oder
Delphi-Quellcode:
Result := Result and (Value[1] = Value[2]);
je nachdem was man erreichen möchte.

Es gibt also in diesem Falle keinen Grund eine unnötige Verkomplizierung durch die IF THEN Abfrage zu machen.
Normalerweise hängt die Schwierigkeit im Verständnis des Programmieres bei solchen Konstrukten von derem "geschmack" ab.

1.) rein mechanisch denkende Menschen bervorzugen strukturierte IF THEN etc. Blöcke, quasi stückchenweises herangehen an ein Problem durch stückchenweises Ausschlußverfahren.

2.) formal denkende Menschen bevorzugen eine Gleichung/Formel zur Lösung eines Problems. Sie "kodieren" also ein Problem im Kopf so um das sie das Problem ansich als Formel darstellen können. Dies ist in den meisten Fällen besser da dadurch auch die Möglichkeiten entstehen um zb. die Komplexität eines Algos. zu errechnen, quasi sein Laufzeitverhalten. Oder durch einfache Umstellungen der Formeln diese zu verbesern. All das geht mit rei mechnischer Vorgehensweise nicht so leicht.


Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz