В описании проблемы вы упомянули, что столкнулись с трудностями при выводе максимальных и минимальных значений оценок. В вашем коде есть несколько недочетов, которые не позволяют корректно инициализировать переменные для хранения этих значений. Давайте исправим их.
В функции maksimum вы не инициализируете переменные uts_max, uas_max, и так далее. Вместо этого вы присваиваете значения полям структуры dtmhs. Это неправильно, так как в вашей программе нет необходимости хранить индекс элемента массива с максимальным/минимальным значением — достаточно хранить само значение.
Вот пример исправленной функции utsmax:
function utsmax(): Integer;
var
max:Integer;
begin
max:=0;
var tempMaxValue: Integer;
tempMaxValue := dtmhs[1].uts; // Инициализация максимальным значением из первого элемента массива
for i := 2 to a do
if (dtmhs[i].uts > tempMaxValue) then begin
tempMaxValue := dtmhs[i].uts;
max := i; // Сохраняем индекс текущего максимального значения, но это не нужно для работы программы
end;
end;
utsmax := tempMaxValue;
end;
Аналогичные изменения необходимо внести в остальные функции поиска максимума и минимума.
Также, в функции minimum переменные uts_min, uas_min, akhir_min также должны быть инициализированы:
function utsmin(): Integer;
var
min:Integer;
begin
min := dtmhs[1].uts; // Инициализация минимальным значением из первого элемента массива
for i := 2 to a do
if (dtmhs[i].uts < min) then begin
min := dtmhs[i].uts;
// max := i; - эту строку можно удалить, так как она не используется
end;
end;
utsmin := min;
end;
Не забудьте применить эти изменения ко всем функциям, которые обрабатывают максимальные и минимальные значения.
Теперь давайте исправим проблему с вычислением среднего значения akhir. В функции output после цикла инициализации значений для каждого студента необходимо вызвать функцию rerata_akhir:
procedure output;
begin
clrscr;
tabel;
for i := 1 to a do begin
with dtmhs[i] do begin
akhir := (0.1 * tugas) + (0.3 * uts) + (0.3 * uas) + (0.3 * prak);
if (akhir >= 0) and (akhir < 20) then grade:='E' else
if (akhir >= 20) and (akhir < 40) then grade:='D' else
if (akhir >= 40) and (akhir < 60) then grade:='C' else
if (akhir >= 60) and (akhir < 80) then grade:='B' else
grade := 'A';
end;
end;
rerata_akhir; // Вызов функции для вычисления среднего значения `akhir`
end;
Не забудьте также обновить функцию rerata_akhir, чтобы она корректно вычисляла среднее значение:
function rerata_akhir(): real;
var
temp: real;
begin
temp := 0.0; // Инициализация переменной для суммирования значений
for i := 1 to a do begin
temp := temp + dtmhs[i].akhir;
end;
rerata_akhir := temp / a; // Вычисление среднего значения путем деления на количество элементов
end;
После внесения этих изменений ваша программа должна корректно вычислять максимальные, минимальные и средние значения оценок студентов.
В описании проблемы обсуждается исправление ошибок в коде на Pascal для корректного вычисления максимальных, минимальных и средних значений оценок студентов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.