Поиск наибольшего значения из записи

#pascal #counter #record #records #highest

#pascal #счетчик #запись #записи #наибольшее

Вопрос:

Я пытаюсь закодировать процедуру, которая просматривает запись чисел и находит, какое из них наибольшее, текущий код приведен ниже. Проблема, с которой я сталкиваюсь, заключается в том, что, похоже, в нем просто указан последний результат в записи (не самый высокий). Любая помощь приветствуется.

 Procedure FindTopScore(Var TopScores : TTopScores);
Var
Count : Integer;
Highest : Integer;
Name: String;

Begin
     For Count := 1 to MaxSize Do
          If TopScores[Count].Score > Highest Then
     Highest := TopScores[Count].Score;
     Name := TopScores[Count].Name;
       Writeln('Higest score is by ' ,TopScores[Count].Name, ' of ', TopScores[Count].Score);
End;
  

Ответ №1:

Вы не выводите Highest , но TopScores[Count].Score . Просто используйте

  Writeln('Highest is ', Highest, ' for ', Name);
  

Также вы должны поместить имя в переменную Name внутри if-оператора (на самом деле оно находится снаружи).

Дополнение: Если вам нужны все имена в случае равенства, вы можете использовать, например, следующий код

 Highest := 0;
For Count := 1 to MaxSize Do Begin
     If TopScores[Count].Score = Highest Then Begin
         Name := Name   ' and '   TopScores[Count].Name;
     End;
     If TopScores[Count].Score > Highest Then Begin
         Highest := TopScores[Count].Score;
         Name := TopScores[Count].Name;
     End;
 End;
  

Комментарии:

1. А, понятно, спасибо. Также исправлена проблема с именем. Спасибо, что указали на это. Также скажите, имеют ли два человека одинаковые наивысшие баллы, в любом случае, чтобы вывести их обоих?

2. @Jeff вы можете, например, добавить новое имя к переменной Name if TopScores[Count].Score = Highest внутри вашего цикла и заменить его, если оно действительно больше.

3. Я в замешательстве, не могли бы вы показать мне код? Я сделал это = наивысшему, но на выходе получаются просто случайные символы ASCII.

4. Спасибо, теперь я понимаю. Я был немного сбит с толку, когда вы сказали новое имя переменной. Теперь я понял. Спасибо!

Ответ №2:

В дополнение к ответу Говарда, установите ‘0’ на ‘Highest’ перед началом цикла. Будучи неинициализированным, он имеет произвольное значение, вероятно, превышающее наивысший балл.

Комментарии:

1. Спасибо, но в чем преимущество этого, потому что это прекрасно работает и без него.

2. @Jeff — Неинициализированная локальная переменная содержит значение своей ячейки памяти. Для целого числа это может быть 0 или что-то еще, сейчас это может быть 0, но это может быть что угодно еще при выполнении процедуры в другой раз. Если вы не используете широко используемый компилятор, такой как FPC, Delphi, проверьте документацию по вашим компиляторам, так это или нет..

Ответ №3:

В дополнение к принятому ответу убедитесь, что вы включили предупреждения и подсказки, и вы увидите:

       testhighest.pp(16,39) Warning: Local variable "Highest" does not seem to be initialized
  

что является

         If TopScores[Count].Score > Highest Then
  

строка