Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi If not XY in [...] mit reellen Typen (https://www.delphipraxis.net/46370-if-not-xy-%5B-%5D-mit-reellen-typen.html)

engine 23. Mai 2005 21:42


If not XY in [...] mit reellen Typen
 
Hallo DP,

ich muss einen Radius mit einer Werkzeugliste vergleichen.
Wenn der "Radius" nicht in der Liste vorhanden ist, soll ein Fehler ausgegeben werden.
Zur Zeit verwende ich diesen Code.

Delphi-Quellcode:
var
  Radius : extended;
.
.
.

Radius := StrToFloat(Form1.StringGrid1.Cells[4, i]);
if Radius <> 3.4 then
  if Radius <> 4.25 then
    if Radius <> 5.1 then
      if Radius <> 6 then
        if Radius <> 7 then
          if Radius <> 8.75 then
            if Radius <> 10.5 then
              if Radius <> 13.25 then
                if Radius <> 16 then
                begin
                  Form1.StringGrid1.Cells[9, i] := 'ERROR';
                end;
Der Code funktioniert, die Schreibweise gefällt mir jedoch nicht.
Ich suche eher etwas wie
Delphi-Quellcode:
if not (Radius in [1,2,3]) then ...
Habt ihr eine Idee wie der Code vereinfacht werden kann?

Hansa 23. Mai 2005 21:47

Re: If not XY in [...] mit reellen Typen
 
Das ist "Case". -> OH

JasonDX 23. Mai 2005 21:58

Re: If not XY in [...] mit reellen Typen
 
Zitat:

Zitat von Hansa
Das ist "Case". -> OH

Case funktioniert auch nur mit ordinalen Typen, also nicht mit beispielsweise strings oder floats (=reals)

Was du (mal ganz spezifisch den fall betrachtet) tun könntest wäre folgendes:
statt
Delphi-Quellcode:
Radius := StrToFloat(Form1.StringGrid1.Cells[4, i]);
if Radius <> 3.4 then
  if Radius <> 4.25 then
    if Radius <> 5.1 then
      if Radius <> 6 then
        if Radius <> 7 then
          if Radius <> 8.75 then
            if Radius <> 10.5 then
              if Radius <> 13.25 then
                if Radius <> 16 then
                begin
                  Form1.StringGrid1.Cells[9, i] := 'ERROR';
                end;
dasda
Delphi-Quellcode:
Radius: integer;
Radius := round(StrToFloat(Form1.StringGrid1.Cells[4, i]) * 100);
if not (Radius in [340, 425, 510, 600, 700, 875, 1050, 1325, 1600]) then
  Form1.StringGrid1.Cells[9, i] := 'ERROR';
schreiben

Oder du schreibst dir eine Funktion:
Delphi-Quellcode:
function IsWertIn(Wert: extended; Werte: array of extended): boolean;
begin
  result := true;
  for i := 0 to high(Werte) do
    if Wert = Werte[i] then //vorsicht hier: extendeds vergleichen sollte man nicht, sondern mit einer abweichung von +/- 0.josef vergleichen
      exit;
  result := false;
end;

engine 23. Mai 2005 21:58

Re: If not XY in [...] mit reellen Typen
 
Zitat:

Zitat von Hansa
Das ist "Case". -> OH

Ja, "Case" funktioniert prima mit Ordinale Typen, aber nicht mit "extended".

engine 23. Mai 2005 22:10

Re: If not XY in [...] mit reellen Typen
 
Delphi-Quellcode:
Radius: integer;
Radius := round(StrToFloat(Form1.StringGrid1.Cells[4, i]) * 100);
if not (Radius in [340, 425, 510, 600, 700, 875, 1050, 1325, 1600]) then
  Form1.StringGrid1.Cells[9, i] := 'ERROR';
Das sieht gut aus...

Danke

DGL-luke 23. Mai 2005 22:36

Re: If not XY in [...] mit reellen Typen
 
Zitat:

+/- 0.josef
AHA?! :gruebel:
also wenn du +/-.adolf geschrieben hättest, würd ich mir ja sorgen um dich machen, Chimaira, aber so hab ich einfach null ahung, was du meinst....

Nicodius 23. Mai 2005 22:38

Re: If not XY in [...] mit reellen Typen
 
wen ner aus österreich kommt hats ne bedeutung :)


sagt man so 0 komma josef ;)

leddl 23. Mai 2005 22:39

Re: If not XY in [...] mit reellen Typen
 
Er hätte auch +/- 0.x schreiben können. Hauptsache, du gibst ein bestimmtes Intervall an, in dem sich die Werte befinden müssen.

DGL-luke 23. Mai 2005 22:46

Re: If not XY in [...] mit reellen Typen
 
ah sehr schön. muss ich doch noch ne fremdsprache lernen. :lol:

Nicodius 23. Mai 2005 22:48

Re: If not XY in [...] mit reellen Typen
 
abseits noch ne frage


ordinal und primitiv ist dasselbe oder?

Hansa 23. Mai 2005 23:03

Re: If not XY in [...] mit reellen Typen
 
Wandelt die Typen in integer etc. um und fertig. 8)

alzaimar 24. Mai 2005 20:14

Re: If not XY in [...] mit reellen Typen
 
Das mit dem 'if r in [...]' klappt nicht unbedingt, weil ein Set nur Bytes (0..255) enthalten kann, jedenfalls bei D6.
Ein 'Case' würde gehen, ist aber unschön.
Bleibt noch die Funktion. Das finde ich am Elegantesten, weil man hier nicht nur auf Gleichheit abfragen kann (sollte man bei reelen Typen sowieso nicht, alter Hut).

Nikolas 24. Mai 2005 20:56

Re: If not XY in [...] mit reellen Typen
 
zu 0.Josef:

Da gibts die nette Funktion Delphi-Referenz durchsuchenIsEqual, der man zwei Werte übergibt, und die dann true zurückgibt, wenn sich die beiden Werte kaum unterscheiden.

engine 24. Mai 2005 21:01

Re: If not XY in [...] mit reellen Typen
 
Zitat:

Zitat von alzaimar
Das mit dem 'if r in [...]' klappt nicht unbedingt, weil ein Set nur Bytes (0..255) enthalten kann, jedenfalls bei D6.

Nicht nur bei D6...
Eine Funktion wird wohl die einzige Möglichkeit bleiben. Jedoch bleibt noch das Problem
mit dem Vergleichen. In meinem speziellen Fall sind keine +/- Abweichungen möglich.
Das bedeutet das ein Wert von 10.4999999999999.... (10.5) herausgefiltert werden muss.

Nikolas 24. Mai 2005 21:10

Re: If not XY in [...] mit reellen Typen
 
Hast du meinen Post gesehen? Alternativ geht auch Delphi-Referenz durchsuchenisZero;

Versuch mal
Delphi-Quellcode:
 
uses Math;

if IsZero(15-14.999999999999999999999) then showmessage('Hallo Welt');

engine 24. Mai 2005 21:28

Re: If not XY in [...] mit reellen Typen
 
Ja, zu spät...

Mit "IsZero" kann man eine Funktion bauen.
Hab ich gerade schon ausprobiert.

Super!

engine 30. Mai 2005 20:54

Re: If not XY in [...] mit reellen Typen
 
So, für alle die auch eine Funktion zum Vergleichen einer Reellen Zahl mit einer Werte-Liste benötigen; hier die Lösung...

Delphi-Quellcode:
function IfFloatIn(w : extended; a : array of extended; Tol: extended): boolean;
var
  i : integer;

begin
  result := true;
  for i := 0 to high(a) do
    if SameValue(w, a[i], Tol) then exit;
  result := false;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Radius : extended;

begin
  Radius := StrToFloat(Edit1.Text);
  if IfFloatIn(Radius,[10.5, 11.7, 17.8],0)
    then Label1.Caption := 'true'
    else Label1.Caption := 'false';
end;
Mit "Tol" kann eine Toleranz angegeben werden, innerhalb sich der Wert befinden darf.


Danke an alle, die sich an diesem Tread beteiligt haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.

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