AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IF-Anweisung

Ein Thema von Slashmob · begonnen am 25. Nov 2011 · letzter Beitrag vom 25. Nov 2011
Antwort Antwort
Seite 1 von 2  1 2      
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#1

IF-Anweisung

  Alt 25. Nov 2011, 16:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#2

AW: IF-Anweisung

  Alt 25. Nov 2011, 16:46
Hallo,

dir fehlen Klammern:

If (cos(winkel*10)>0) and (cos(winkel*10)<900) then .

Du solltest aber 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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#3

AW: IF-Anweisung

  Alt 25. Nov 2011, 16:59
Danke!
Du hast vollkommen recht! Die Klammern...oh man ^^

Hat sich erledigt!

Geändert von Slashmob (25. Nov 2011 um 17:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: IF-Anweisung

  Alt 25. Nov 2011, 17:15
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 ???
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Nov 2011 um 17:19 Uhr)
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#5

AW: IF-Anweisung

  Alt 25. Nov 2011, 17:42
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°.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

AW: IF-Anweisung

  Alt 25. Nov 2011, 17:46
Ä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 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;

Geändert von jfheins (25. Nov 2011 um 17:52 Uhr) Grund: Fehler behoben, siehe unten
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: IF-Anweisung

  Alt 25. Nov 2011, 17:49
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

AW: IF-Anweisung

  Alt 25. Nov 2011, 17:52
Ähhhmmm .... irre ich mich oder ist

also wohl eher
Code:
Winkel div 900 + 1
Du irrst nicht, das ist ein klitzekleiner Fehler
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#9

AW: IF-Anweisung

  Alt 25. Nov 2011, 17:57
Ä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 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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: IF-Anweisung

  Alt 25. Nov 2011, 18:30
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.
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