Сравнение вещественных чисел в массиве - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть массив Marks, который содержит 5 элементов. Я хочу перебрать массив и получить самый высокий элемент в массиве Marks. Когда я запускаю приведенный ниже код, я получаю 23,45

var
 Marks: array[0..4] of real = (42.4,65.34,24.12,23.45,43.24);
 iHighest : real;
 iInt : integer;
begin
 iHighest := Marks[0];
 for iInt:= 0 to 4 do
  begin
   if (iHighest >= Marks[iInt]) then
    iHighest := Marks[iInt];
  end;
end;
ShowMessage('Highest Mark: ' + FloatToStr(iHighest)); // Returns 23.45

Но когда я изменяю оператор if на if (Marks[iInt] >= iHighest), showmessage возвращает правильный ответ 65,34. Пожалуйста, дайте мне знать, в чем разница.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы хотите найти наибольшее число. Для этого ваше состояние не так. Ваш код находит номер наименьший .

Пример того, что происходит в вашем коде: В какой-то момент времени iHighest равно 42.4; iInt равно 2, поэтому Marks[iInt] равно 24.12. Затем iHighest >= 24.12, так что оно становится 24.12! Другими словами, новое значение iHighest на ниже , чем начальное значение.

Но, если вы хотите найти наибольшее число, то только если исследуемое в настоящее время число (Marks[iInt]) на больше , чем текущее iHighest, вы обновляете iHighest.

И так как вы в любом случае инициализируете iHighest первым элементом (индекс 0), вам нужно только проверить others :

for iInt := 1 to 4 do            // not: 0 to 4
  if Marks[iInt] > iHighest then // not the other way around
    iHighest := Marks[iInt];

Обратите внимание, что нет необходимости сверяться с >=. Вы обновляете iHighest только если текущее значение выше , а не равно .


Лучший способ выяснить такие ошибки самостоятельно - отладка. Отладчик Delphi очень прост в использовании и может показать вам шаг за шагом, построчно , как меняются значения. Если бы вы использовали отладчик, вы бы увидели, как в вашем коде iHighest будет принимать более низкое значение, а не более высокое, при каждом обновлении.

Просто прочитайте онлайн-справку по использованию отладчика. Это намного проще, чем вы думаете.

0 голосов
/ 10 сентября 2018

iHighest для маркировки наибольшего числа. Вы должны изменить его, если он меньше Marks[iInt], поэтому истинное условие будет iHighest < Marks[iInt] или Marks[iInt] > iHighest

Надеюсь, ты понял.

...