Delphi 7 - 多个 else if 没有显示正确的标签
Delphi 7 - Multiple else if does not display the right label
我正在尝试在 Delphi 7 中制作一个血压类别检查器,我才认识 Delphi 几个星期。问题是每次我输入超过 120 的数字时,标签标题总是显示正常。
这是我的代码:
procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
begin
a:=strtofloat(edit1.Text);
if (a<120) then label1.caption:='optimal'
else if (a>120) then label1.caption:='normal'
else if (a<130) then label1.caption:='normal'
else if (a>130) then label1.caption:='normal high'
else if (a<140) then label1.caption:='normal high'
else if (a>140) then label1.caption:='grade 1 hypertension'
else if (a<160) then label1.caption:='grade 1 hypertension'
else if (a>160) then label1.caption:='grade 2 hypertension'
else if (a<180) then label1.caption:='grade 2 hypertension'
else if (a>181) then label1.caption:='grade 3 hypertension'
end;
end.
这可能是一些常见的错误,但我自己仍然无法弄清楚,任何帮助都会有很大帮助,谢谢。
您的代码不正确。它只检查两个值,即 < 120
和 > 120
。没有其他任何东西经过测试。
在范围内查找值时,需要测试范围的两端,如下所示:
procedure TForm1.Button1Click(Sender: TObject);
var
a: real;
begin
a:=strtofloat(edit1.Text);
if (a < 120) then
Label1.Caption := 'Optimal'
else if (a >= 120) and (a < 130) then
Label1.Caption := 'Normal'
else if (a >= 130) and (a < 150) then
Label1.Caption := 'Normal high'
else if (a >= 150) and (a < 160) then
Label1.Caption := 'Grade 1 hypertension'
else if (a >= 160) and (a < 170) then
Label1.Caption := 'Grade 2 hypertension'
else if (a >= 170) and (a < 180) then
Label1.Caption := 'Grade 3 hypertension'
else
Label1.Caption := 'Heart exploded from pressure';
end;
(您的范围真的很混乱。您需要调整我的代码以满足您的实际范围要求,但我发布的内容应该可以帮助您入门。)
由于不太可能有人将血压记录为浮点值(您的血压不太可能是 121.6/97.2),您可能想改用整数,这将使代码更简单。
procedure TForm1.Button1Click(Sender: TObject);
var
a: Integer;
begin
a := StrToInt(Edit1.Text);
case a of
0..119: Label1.Caption := 'Optimal'; // Probably want to test for too low
120..129: Label1.Caption := 'Normal';
130..149: Label1.Caption := 'Normal high';
150..159: Label1.Caption := 'Grade 1 hypertension';
160..169: Label1.Caption := 'Grade 2 hypertension';
else
Label1.Caption := 'Over 170! Danger!'
end;
end;
IF
语句有什么作用?它检查条件。如果条件是 TRUE
,它会执行 THEN
子句。如果条件是 FALSE
,它会执行 ELSE
子句(如果有的话)。
当你写一个序列 IF
-ELSE
-IF
-ELSE
-IF
-ELSE
-...没什么特别的。测试第一个IF
的条件。如果是 TRUE
,它会执行 THEN
-子句,如果不是,它会继续执行 ELSE
-子句。 ELSE
子句可以包含 any 语句。它可以是 FOR
或 WHILE
或赋值或函数调用或 BEGIN
-END
块,或任何其他语句。在这种情况下,ELSE
子句恰好是另一个 IF
语句,因此检查了 IF
的条件,依此类推。
最后,您编写了检查多个条件的代码,并在第一个条件 TRUE
处停止。
选择一个值并手动跟踪您的代码以查看其工作原理。
从 a=100
开始。第一个 IF
问的是 100<120
。这是 TRUE
,因此它将 caption
设置为 'optimal'
。 ELSE
-子句从未执行,到目前为止一切正常。
从 a=200
开始。第一个 IF
问的是 200<120
。答案是否定的,所以执行转到 ELSE
子句。 ELSE
子句由一个 IF
询问是否 200>120
组成。答案是肯定的,所以它将 caption
设置为 'normal'
。这不是您想要的。
考虑 a=120
。第一个 IF
尝试 120<120
。那是 FALSE
所以它继续到 ELSE
子句。在那里我们发现 IF
询问是 120>120
。那也是 FALSE
,所以我们进入下一个 IF
。那个问的是120<130
。那是 TRUE
,所以 caption
设置为 'normal'
。
事实上,这些示例显示了通过您的代码的所有可能路径。 None 的 IF
已经达到。
这是一个应该按您的预期工作的示例。
procedure TForm1.Button1Click(Sender: TObject);
var
a, b : real;
begin
a := strtofloat(edit1.Text);
if a < 120 then label1.caption := 'optimal'
else if a < 130 then label1.caption := 'normal'
else if a < 140 then label1.caption := 'normal high'
else if a < 160 then label1.caption := 'grade 1 hypertension'
else if a < 180 then label1.caption := 'grade 2 hypertension'
else label1.caption := 'grade 3 hypertension'
end;
在 <
和 <=
之间选择时要小心。当 a
恰好是 120
时想要发生什么?
仔细考虑所有可能的值。当您编写原始代码时,您打算在 a=180.5
时发生什么。您有一个条件 <180
,另一个条件 >181
。从 180
到 181
的值将被忽略。
我正在尝试在 Delphi 7 中制作一个血压类别检查器,我才认识 Delphi 几个星期。问题是每次我输入超过 120 的数字时,标签标题总是显示正常。 这是我的代码:
procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
begin
a:=strtofloat(edit1.Text);
if (a<120) then label1.caption:='optimal'
else if (a>120) then label1.caption:='normal'
else if (a<130) then label1.caption:='normal'
else if (a>130) then label1.caption:='normal high'
else if (a<140) then label1.caption:='normal high'
else if (a>140) then label1.caption:='grade 1 hypertension'
else if (a<160) then label1.caption:='grade 1 hypertension'
else if (a>160) then label1.caption:='grade 2 hypertension'
else if (a<180) then label1.caption:='grade 2 hypertension'
else if (a>181) then label1.caption:='grade 3 hypertension'
end;
end.
这可能是一些常见的错误,但我自己仍然无法弄清楚,任何帮助都会有很大帮助,谢谢。
您的代码不正确。它只检查两个值,即 < 120
和 > 120
。没有其他任何东西经过测试。
在范围内查找值时,需要测试范围的两端,如下所示:
procedure TForm1.Button1Click(Sender: TObject);
var
a: real;
begin
a:=strtofloat(edit1.Text);
if (a < 120) then
Label1.Caption := 'Optimal'
else if (a >= 120) and (a < 130) then
Label1.Caption := 'Normal'
else if (a >= 130) and (a < 150) then
Label1.Caption := 'Normal high'
else if (a >= 150) and (a < 160) then
Label1.Caption := 'Grade 1 hypertension'
else if (a >= 160) and (a < 170) then
Label1.Caption := 'Grade 2 hypertension'
else if (a >= 170) and (a < 180) then
Label1.Caption := 'Grade 3 hypertension'
else
Label1.Caption := 'Heart exploded from pressure';
end;
(您的范围真的很混乱。您需要调整我的代码以满足您的实际范围要求,但我发布的内容应该可以帮助您入门。)
由于不太可能有人将血压记录为浮点值(您的血压不太可能是 121.6/97.2),您可能想改用整数,这将使代码更简单。
procedure TForm1.Button1Click(Sender: TObject);
var
a: Integer;
begin
a := StrToInt(Edit1.Text);
case a of
0..119: Label1.Caption := 'Optimal'; // Probably want to test for too low
120..129: Label1.Caption := 'Normal';
130..149: Label1.Caption := 'Normal high';
150..159: Label1.Caption := 'Grade 1 hypertension';
160..169: Label1.Caption := 'Grade 2 hypertension';
else
Label1.Caption := 'Over 170! Danger!'
end;
end;
IF
语句有什么作用?它检查条件。如果条件是 TRUE
,它会执行 THEN
子句。如果条件是 FALSE
,它会执行 ELSE
子句(如果有的话)。
当你写一个序列 IF
-ELSE
-IF
-ELSE
-IF
-ELSE
-...没什么特别的。测试第一个IF
的条件。如果是 TRUE
,它会执行 THEN
-子句,如果不是,它会继续执行 ELSE
-子句。 ELSE
子句可以包含 any 语句。它可以是 FOR
或 WHILE
或赋值或函数调用或 BEGIN
-END
块,或任何其他语句。在这种情况下,ELSE
子句恰好是另一个 IF
语句,因此检查了 IF
的条件,依此类推。
最后,您编写了检查多个条件的代码,并在第一个条件 TRUE
处停止。
选择一个值并手动跟踪您的代码以查看其工作原理。
从 a=100
开始。第一个 IF
问的是 100<120
。这是 TRUE
,因此它将 caption
设置为 'optimal'
。 ELSE
-子句从未执行,到目前为止一切正常。
从 a=200
开始。第一个 IF
问的是 200<120
。答案是否定的,所以执行转到 ELSE
子句。 ELSE
子句由一个 IF
询问是否 200>120
组成。答案是肯定的,所以它将 caption
设置为 'normal'
。这不是您想要的。
考虑 a=120
。第一个 IF
尝试 120<120
。那是 FALSE
所以它继续到 ELSE
子句。在那里我们发现 IF
询问是 120>120
。那也是 FALSE
,所以我们进入下一个 IF
。那个问的是120<130
。那是 TRUE
,所以 caption
设置为 'normal'
。
事实上,这些示例显示了通过您的代码的所有可能路径。 None 的 IF
已经达到。
这是一个应该按您的预期工作的示例。
procedure TForm1.Button1Click(Sender: TObject);
var
a, b : real;
begin
a := strtofloat(edit1.Text);
if a < 120 then label1.caption := 'optimal'
else if a < 130 then label1.caption := 'normal'
else if a < 140 then label1.caption := 'normal high'
else if a < 160 then label1.caption := 'grade 1 hypertension'
else if a < 180 then label1.caption := 'grade 2 hypertension'
else label1.caption := 'grade 3 hypertension'
end;
在 <
和 <=
之间选择时要小心。当 a
恰好是 120
时想要发生什么?
仔细考虑所有可能的值。当您编写原始代码时,您打算在 a=180.5
时发生什么。您有一个条件 <180
,另一个条件 >181
。从 180
到 181
的值将被忽略。