#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
ifTopScores[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
строка