Größer als und kleiner als
Hallo, ich habe grade eine Denklücke (hab vergessen wie das norrens geht..)
Ich habe eine Zahl, und möchte, wenn sie größer 19 und kleiner 24 (also dazwischen) ist, darauf reagieren. (und das 2 Mal)
Delphi-Quellcode:
ich bekomme als caption IMMEr letzteres :idea:
if (Zahl2 >= 19) and (Zahl1 <= 24)and
(Zahl2 >= 19) and (Zahl2 <= 24) then begin Label1.Caption := 'Zahl1/Zahl2 zwischen 19 und 24'; end else begin Label1.Caption := 'mh ?!'; end; |
Re: Größer als und kleiner als
Zitat:
|
Re: Größer als und kleiner als
Delphi-Quellcode:
so sollte es gehen
if (Zahl1 in [19..24]) and (Zahl2 in [19..24])
|
Re: Größer als und kleiner als
erm.. ne meine variablen heißen eigentlich alle anders, habe das jetzt nur HIER so hingeschrieben, sollte natürlich AUCH Zahl1 sein.
Aber Problem liegt halt noch immer vor, Edit: [Fehler] uMain.pas(870): E2010 Inkompatible Typen: 'Real' und 'Integer' |
Re: Größer als und kleiner als
Delphi-Quellcode:
oder meinste mehr das hier:
if ((Zahl1 > 19) and (Zahl1 < 24)) and ((Zahl2 > 19) and (Zahl2 < 24)) then
begin Label1.Caption := 'Zahl1 UND Zahl2 zwischen 19 und 24'; end else begin Label1.Caption := 'mh ?!'; end;
Delphi-Quellcode:
[edit]
if ((Zahl1 > 19) and (Zahl1 < 24)) or ((Zahl2 > 19) and (Zahl2 < 24)) then // Man beachte das or
begin Label1.Caption := 'Zahl1 UND Zahl2 zwischen 19 und 24'; end else begin Label1.Caption := 'mh ?!'; end; Zitat:
|
Re: Größer als und kleiner als
Delphi-Quellcode:
BMI := Runden(Gewicht / (GroesseM*GroesseM),2);
Alter := StrToFloat(EdAlt.Text); . . if (BMI in [19..24]) and (Alter in [19..24]) then begin Label34.Caption := 'BMI/Alter zwischen 19 und 24'+ FloatToStr(BMI)+'/'+FloatToStr(Alter); end else begin Label34.Caption := 'mh ?!'; end; |
Re: Größer als und kleiner als
Bei mir geht' s:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Zahl1,Zahl2: real; begin Zahl1 := 20.5; Zahl2 := 22.3; if (Zahl1 > 19) and (Zahl1 < 24) and (Zahl2 > 19) and (Zahl2 < 24) then begin Label1.Caption := 'Zahl1 UND Zahl2 zwischen 19 und 24'; end else begin Label1.Caption := 'mh ?!'; end; end; |
Re: Größer als und kleiner als
Inkompatible Typen Real und Integer:
Die Zeilen:
Delphi-Quellcode:
BMI := Runden(Gewicht / (GroesseM*GroesseM),2);
Alter := StrToFloat(EdAlt.Text); . . if (BMI in [19..24]) and (Alter in [19..24]) then begin Label34.Caption := 'BMI/Alter zwischen 19 und 24'+ FloatToStr(BMI)+'/'+FloatToStr(Alter); end else begin Label34.Caption := 'mh ?!'; end; |
Re: Größer als und kleiner als
wieso fürs alter kein byte?
beim BMI wird das alter doch ganzzahlig verwendet oder? |
Re: Größer als und kleiner als
Wenn BMI ein integer ist, musst du IntToStr, nicht FloatToStr nehmen.
|
Re: Größer als und kleiner als
BMI und Alter ist aber Real (Steht oben)
|
Re: Größer als und kleiner als
Welchen Wert haben denn die Zahlen?
|
Re: Größer als und kleiner als
BMI meistens eine Kommazahl (zwischen 0 und X...)
und Alter halt die Eingabe im Edit. (Zum testen gebe ich immer 19 ein) |
Re: Größer als und kleiner als
in welcher Zeile taucht denn der fehler auf? beim if oder bei der ausgabe?
|
Re: Größer als und kleiner als
Fehler in dieser Zeile:
Delphi-Quellcode:
Der Cursor sitzt dann da wo die ² steht:
if (BMI in [19..24]) and (Alter in [19..24]) then
Delphi-Quellcode:
if (BMI in [19..24])² and (Alter in [19..24]) then
|
Re: Größer als und kleiner als
Und wenn Du mal locker ein
Delphi-Quellcode:
vor die Abfrage setzt?
ShowMessage(FloatToStr(BMI));
[Edit]IN geht bei Fließkommazahlen nicht[/Edit] |
Re: Größer als und kleiner als
wenn du
Delphi-Quellcode:
nutzt muss der vergleichstyp (BMI und Alter) auch ordinal sein, denn 19..24 heißt: 19,20,21,22,23,24 also ordinal.
in [19..24]
du vergleichst also inetwa äpfel mit eiern ;) schreib einfach die if's wie oben mit >, =, < |
Re: Größer als und kleiner als
Schreibe ich aber
Delphi-Quellcode:
erhalte ich im label immer nur das mh?!
if (Zahl2 >= 19) and (Zahl1 <= 24)and
(Zahl2 >= 19) and (Zahl2 <= 24) then begin Label1.Caption := 'Zahl1/Zahl2 zwischen 19 und 24'; end else begin Label1.Caption := 'mh ?!'; end; |
Re: Größer als und kleiner als
Setz doch mal einen Breakpoint und schau, welchen Wert die Zahlen haben. Ich tippe auf einen einfachen Rechenfehler.
|
Re: Größer als und kleiner als
also wie vorher schon erwähnt wars ja zahl1 und nicht zahl2 in der ersten zeile, aber eigentlich müsste es so funktionieren, wies dasteht, oder ich überseh was, ich kram gleich mal meine ex raus und schmeiß delphi mal an
|
Re: Größer als und kleiner als
Delphi-Quellcode:
funktioniert wunderbar
procedure TForm2.FormCreate(Sender: TObject);
var zahl1,zahl2:real; begin Zahl1:=19;zahl2:=19; if (Zahl1 >= 19) and (Zahl1 <= 24)and (Zahl2 >= 19) and (Zahl2 <= 24) then begin Label1.Caption := 'Zahl1/Zahl2 zwischen 19 und 24'; end else begin Label1.Caption := 'mh ?!'; end; end; |
Re: Größer als und kleiner als
Das hatte ich in #7 bereits geschrieben. :-D
|
Re: Größer als und kleiner als
oh, stimmt =) kommt davon wenn man nebenher noch psycho lernt...
aber damit ist schonmal gezeigt, dass es hier nicht zu zeitabhängigen ergebnissen kommt wie bei den Kirchhoff'schen regeln *rofl* |
Re: Größer als und kleiner als
also mit dem OR
Delphi-Quellcode:
klappt es schon, aber es wird nur eines von beiden geprüft.
if (BMI >= 19) and (BMI <= 24) or
(Alter >= 19) and (Alter <= 24) then begin Label34.Caption := 'Zahl1/Zahl2 zwischen 19 und 24'; end else begin Label34.Caption := 'mh ?!'; end; beides auf einmal geht nicht oder ? |
Re: Größer als und kleiner als
Ich vermute mal so:
Delphi-Quellcode:
if ((BMI >= 19) and (BMI <= 24)) or ((Alter >= 19) and (Alter <= 24)) then
|
Re: Größer als und kleiner als
Was steht denn in BMI? Wie oft muss ich das eigentlich noch fragen?
|
Re: Größer als und kleiner als
BMI = Body Mass Index
|
Re: Größer als und kleiner als
also wenn du ein or setzt, dann muss BMI im Intervall liegen, Alter im Intervall, oder beides drin liegen.
wenn du anstatt dem or n and setzt, müssen zwngsläufig BMI UND Alter im Intervall liegen, sonst wird else aufgerufen |
Re: Größer als und kleiner als
Mhh.. ist der BMI über 24 wird nicht der else-block angezeigt..
das wird einfach ignoriert.. Edit:
Delphi-Quellcode:
so klappts
if ((BMI >= 19) and (BMI <= 24)) { and hier statt or}and
((Alter >= 19) and (Alter <= 24)) then danke an eure tipps. werd mir das mal alles angucken. @mkinzler: was bedeuten die 2 einklammerungen die du dazugeschrieben hast? was sagen die aus? |
Re: Größer als und kleiner als
Was sollen denn die Alternativen sein?
|
Re: Größer als und kleiner als
Hallo,
wer Probleme mit den Vergleichsoperatoren hat und mindestens über Delphi6 verfügt, der kann auch die (überladene) Funktion InRange aus der Unit Math verwenden:
Delphi-Quellcode:
Gruß Hawkeye
if InRange(BMI, 19, 24) or {and?} InRange(Alter, 19, 24) then ...
|
Re: Größer als und kleiner als
Wenn nur ANDs verwendet werden, muss das auch ohne Klammern funktionieren.
|
Re: Größer als und kleiner als
Zitat:
|
Re: Größer als und kleiner als
Das ist ja das Problem, dass der Fragesteller selbst nicht genau zu wissen scheint, ob beiden Zahlen im angegebenen Bereich liegen müssen. Übrigens hat AFAIK AND eine stärkere Bindung als OR, oder? Somit wären die Klammern in jedem Fall überflüssig, oder bin ich da fehlinformiert?
|
Re: Größer als und kleiner als
M.W. sind sie gleich berechtigt
|
Re: Größer als und kleiner als
Die OH äußert sich dazu mit dem Kurzschlussverfahren =) :
Vollständige Auswertung und Kurzschlussverfahren im Vergleich Der Compiler unterstützt zwei Auswertungsmodi für die Operatoren and und or: die vollständige Auswertung und das Kurzschlussverfahren. Bei der vollständigen Auswertung werden alle Operanden eines and- oder or-Ausdrucks auch dann ausgewertet, wenn das Resultat des gesamten Ausdrucks bereits feststeht. Das Kurzschlussverfahren geht streng von links nach rechts vor und wird beendet, sobald das Ergebnis des gesamten Ausdrucks feststeht. Wenn beispielsweise der Ausdruck A and B im Kurzschlussverfahren ausgewertet wird und A den Wert False hat, wertet der Compiler B nicht mehr aus, da bereits feststeht, dass nach der Auswertung von A auch der gesamte Ausdruck den Wert False haben wird. |
Re: Größer als und kleiner als
AND und OR sind nicht gleichberechtigt! AND entspricht einer Multiplikation ("Punktrechnung"), OR einer Addition ("Strichrechnung"). Es gilt aber immer noch der Satz: Punktrechnung vor Strichrechnung.
Aber warum lange rätseln, wenn man durch gezieltes Setzen von Klammern für Klarheit bei Compiler und Leser sorgen kann? Gruß Hawkeye |
Re: Größer als und kleiner als
Zitat:
|
Re: Größer als und kleiner als
Vielleicht weil immer ein AND/OR ein bool'schen Audruck liefert
|
Re: Größer als und kleiner als
Siehe #29
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 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