Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   IF-Anweisung (https://www.delphipraxis.net/164702-if-anweisung.html)

Slashmob 25. Nov 2011 15:42

IF-Anweisung
 
Hi Leute,

wie schafft man es mit der IF-Anweisung die folgenden vier Bereiche zu unterscheiden?
Es handelt sich quasi um den Einheitskreis und Cosinus.
1.Quadrant: Winkel*10 von 0 bis 900
2.Quadrant: Winkel*10 von 901 bis 1800
3.Quadrant: Winkel*10 von 1801 bis 2700
4.Quadrant: Winkel*10 von 2701 bis 3600

Winkel ist als double deklariert, da ich ihn vorher aus einem maskedit in 1/10° schritten einlesen will.

Hier meine Idee, aber...

Code:
If cos(winkel*10)>0 and cos(winkel*10)<900 then
     Begin
           quadrant:= 1;
           vorzeichen:= 1;
     end;
     If cos(winkel*10)>900 and cos(winkel*10)<1800 then
     Begin
           quadrant:= 2;
           vorzeichen:= -1;
     end;
     If cos(winkel*10)>1800 and cos(winkel*10)<2700 then
     Begin
           quadrant:= 3;
           vorzeichen:= -1;
     end;
     If cos(winkel*10)>2700 and cos(winkel*10)<3600 then
     Begin
           quadrant:= 4;
           vorzeichen:= 1;
     end;
Fehlermeldung:
Error: Operation "and" not supported for types "Double" and "Double".

Die Fehlermeldung ist mir klar, aber ich muss ja den Winkel in 1/10° Schritten einlesen können
(z.B. Winkel= 120,1°)
Ich weiß nicht wie ich mein obiges Problem mit der If-Anweisung lösen kann.

Vielleicht hat der ein oder andere eine sinnvolle Idee oder einen Tipp.

Gruß Slash

Helmi 25. Nov 2011 15:46

AW: IF-Anweisung
 
Hallo,

dir fehlen Klammern:

Delphi-Quellcode:
If (cos(winkel*10)>0) and (cos(winkel*10)<900) then
.

Du solltest aber
Delphi-Quellcode:
cos(winkel*10)
vor den If-Anweisungen einmal rechnen, den Wert in einer Variablen abspeichern und nur die Variable prüfen, ohne ständig das gleiche wieder und wieder zu rechnen

[Edit]
Wen muss man bestechen um eine funktionierende Delphi-Tag-Ausrichtung zu erhalten?

Slashmob 25. Nov 2011 15:59

AW: IF-Anweisung
 
Danke!
Du hast vollkommen recht! Die Klammern...oh man ^^

Hat sich erledigt!

Sir Rufo 25. Nov 2011 16:15

AW: IF-Anweisung
 
so ;)
Delphi-Quellcode:
var
  lCosWinkel : Double;

  lCosWinkel := cos( winkel * 10 );

  If ( lCosWinkel > 0 ) and ( lCosWinkel < 900 ) then
     Begin
           quadrant:= 1;
           vorzeichen:= 1;
     end;
     If ( lCosWinkel > 900 ) and ( lCosWinkel < 1800 ) then
     Begin
           quadrant:= 2;
           vorzeichen:= -1;
     end;
     If ( lCosWinkel > 1800 ) and ( lCosWinkel < 2700 ) then
     Begin
           quadrant:= 3;
           vorzeichen:= -1;
     end;
     If ( lCosWinkel > 2700 ) and ( lCosWinkel < 3600 ) then
     Begin
           quadrant:= 4;
           vorzeichen:= 1;
     end;
Was soll eigentlich passieren, wenn lCosWinkel die Werte 0/3600, 900, 1800, 2700 hat?
Mit deiner Routine sind die dann im Nirwana, oder schlimmstenfalls haben die noch den alten Wert von quadrant, Vorzeichen
Zitat:

Code:
1.Quadrant: Winkel*10 von 0 bis 900
2.Quadrant: Winkel*10 von 901 bis 1800
3.Quadrant: Winkel*10 von 1801 bis 2700
4.Quadrant: Winkel*10 von 2701 bis 3600

So hast du das nicht umgesetzt und falsch ist es auch noch.
Bei einem Kreis ist 0°=360° und nach deiner Vorgabe würde das im Quadrant 1 und 4 liegen.

Und so ein Winkel im Bereich 900 < Winkel < 901 ???

Slashmob 25. Nov 2011 16:42

AW: IF-Anweisung
 
So sollte das jetzt passen oder?

Code:
If (cos(winkel*10)>=0) and (cos(winkel*10)=<900) then
     Begin
           quadrant:= 1;
     end;
     If (cos(winkel*10)>900) and (cos(winkel*10)<=1800) then
     Begin
           quadrant:= 2;
     end;
     If (cos(winkel*10)>1800) and (cos(winkel*10)<=2700) then
     Begin
           quadrant:= 3;
     end;
     If (cos(winkel*10)>2700) and (cos(winkel*10)<=3600) then
     Begin
           quadrant:= 4;
     end;
Und ein Winkel im Bereich 900 < winkel 901 wirds nicht geben. Es werden ja nur 1/10° Schritte eingelesen.
Also wären nur möglich 90° oder 90,1°.

jfheins 25. Nov 2011 16:46

AW: IF-Anweisung
 
Ähhhmmm ... also der Code wird so nicht funktionieren. Keiner der Codes.
Erstmal erwartet die Cos-Funktion einen Winkel in rad, ich lese hier mal raus dass der Winkel in deg eingegeben wird. Zum Anderen ist das Ergebnis des Cosinus eine Zahl zwischen -1 und 1.
Eine Abfrage wie
Delphi-Quellcode:
If (cos(winkel*10)>2700) and (cos(winkel*10)<3600) then
ist also relativ sinnlos.

Wenn der Quadrant und das Vorzeichen des Cosinus ermittelt werden sollen, wäre meine Lösung wie folgt:
Delphi-Quellcode:
uses
  Math
var
  Winkel: Integer; // In Zehntelgrad, d.h. 904 = 90,4°
begin
  Quadrant = Winkel div 900 + 1;
  Vorzeichen = Sign(cos(DegToRad(Winkel/10)));
end;

Sir Rufo 25. Nov 2011 16:49

AW: IF-Anweisung
 
Zitat:

Zitat von jfheins (Beitrag 1137868)
Delphi-Quellcode:
uses
  Math
var
  Winkel: Integer; // In Zehntelgrad, d.h. 904 = 90,4°
begin
  Quadrant = Winkel div 4 + 1;
  Vorzeichen = Integer(Sign(cos(DegToRad(Winkel/10))));
end;

Ähhhmmm .... irre ich mich oder ist
Code:
904 mod 4 + 1 = 1 (90,4°)
905 mod 4 + 1 = 2 (90,5°)
906 mod 4 + 1 = 3 (90,6°)
also wohl eher
Code:
Winkel div 900 + 1

jfheins 25. Nov 2011 16:52

AW: IF-Anweisung
 
Zitat:

Zitat von Sir Rufo (Beitrag 1137869)
Ähhhmmm .... irre ich mich oder ist

also wohl eher
Code:
Winkel div 900 + 1

Du irrst nicht, das ist ein klitzekleiner Fehler :angel2:

Slashmob 25. Nov 2011 16:57

AW: IF-Anweisung
 
Zitat:

Zitat von jfheins (Beitrag 1137868)
Ähhhmmm ... also der Code wird so nicht funktionieren. Keiner der Codes.
Erstmal erwartet die Cos-Funktion einen Winkel in rad, ich lese hier mal raus dass der Winkel in deg eingegeben wird. Zum Anderen ist das Ergebnis des Cosinus eine Zahl zwischen -1 und 1.
Eine Abfrage wie
Delphi-Quellcode:
If (cos(winkel*10)>2700) and (cos(winkel*10)<3600) then
ist also relativ sinnlos.

Wenn der Quadrant und das Vorzeichen des Cosinus ermittelt werden sollen, wäre meine Lösung wie folgt:
Delphi-Quellcode:
uses
  Math
var
  Winkel: Integer; // In Zehntelgrad, d.h. 904 = 90,4°
begin
  Quadrant = Winkel div 4 + 1;
  Vorzeichen = Sign(cos(DegToRad(Winkel/10)));
end;

Ja, die Codes werden so nicht funktionieren, weil das nur Code-Ausschnitte sind.
Der Winkel wird in Deg eingegeben, dann aber in Rad umgewandelt(Ist hier in dem Ausschnitt nicht angegeben und nicht erkennbar, das stimmt). Ja, Cosinus wandert zwischen 1 und -1, korrekt.
Das Problem warum ich das mit IF THEN mache,ist, wir müssen das damit machen. ;-)
Klar gibts noch bessere Methoden, wie du sie auch hier vorgestellt hast.

Sir Rufo 25. Nov 2011 17:30

AW: IF-Anweisung
 
Also wenn man solche Bereiche einteilen will, ohne dass man etwas vergisst, dann ist folgendes Vorgehen ratsam:

Delphi-Quellcode:
function Group( const Value : Extended ) : Integer;
begin

  // man kann die oberen und unteren Grenzen im Vorfeld behandeln
  if ( Value < 0 ) or ( Value >= 360 ) then
  begin
    // alternativ eine Exception werfen lassen
    raise Exception.CreateFmt( 'Wert %f ungültig. (0° <= Wert < 360°)', [ Value ] );
    // oder einfach einen Result zurückgeben, bei dem man weiß, da stimmt was nicht
    Result := -1;
    Exit;
  end;

  // oder wie hier beim Winkel kann man ja auch diesen umrechnen
  while ( Value < 0 ) do
    Value := Value + 360;

  while ( Value >= 360 ) do
    Value := Value - 360;

  // *** ab hier geht der Vergleich los ***

  // obere Grenze abfangen
  if ( Value >= 360 ) then Result := -1

  else if ( Value >= 270 ) then Result := 4 // 270 <= Value < 360
  else if ( Value >= 180 ) then Result := 3 // 180 <= Value < 270
  else if ( Value >= 90 ) then Result := 2 // 90 <= Value < 180
  else if ( Value >=  0 ) then Result := 1 // 0 <= Value < 90

  // untere Grenze abfangen
  else Result := -1;

end;


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

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