Delphi 7 - несколько других, если не отображается правильная метка - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь выполнить проверку категории артериального давления в 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.

Это может быть какая-то распространенная ошибка, но я все еще не могу понять это, любая помощь очень поможет, спасибо.

Ответы [ 2 ]

5 голосов
/ 16 марта 2019

Ваш код неверен.Он проверяет только два значения: < 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;

(все диапазоны действительноВы должны будете скорректировать мой код, чтобы он соответствовал вашим фактическим требованиям диапазона, но то, что я опубликовал, должно помочь вам начать.значение точки (маловероятно, что ваш BP будет 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;
2 голосов
/ 17 марта 2019

Что делает оператор IF? Проверяет состояние. Если условие TRUE, выполняется условие THEN. Если условие FALSE, выполняется условие ELSE, если оно есть.

Когда вы пишете последовательность IF - ELSE - IF - ELSE - IF - ELSE -... ничего особенного не происходит. Состояние первого IF проверено. Если это TRUE, выполняется условие THEN, если нет, то оно продолжается до предложения ELSE. Предложение ELSE может содержать любой оператор . Это может быть 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'.

Фактически, эти примеры показывают все возможные пути через ваш код. Ни один из 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 игнорируются.

...