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 语句。它可以是 FORWHILE 或赋值或函数调用或 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。从 180181 的值将被忽略。