Сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы - PascalABC.NET
Формулировка задачи:
Помогите найти ошибку в моей программе. Не нужно писать свою программу.
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Имя> <оценки>,
где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 3
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.
Решение задачи: «Сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы»
textual
Листинг программы
const LIM = 100;
var Info: array[1..LIM] of record
name: string;
sum: integer;
end;
i, k, N, mark, min1, min2, min3: integer;
c: char;
begin
readln(N);
{ ввод исходных данных }
for i:=1 to N do begin
Info[i].name := '';
for k:=1 to 2 do
repeat
read(c);
Info[i].name := Info[i].name + c;
until c = ' ';
Info[i].sum := 0;
for k:=1 to 3 do begin
read(mark);
Info[i].sum := Info[i].sum + mark;
end;
readln;
end;
{ поиск трех минимальных }
min1 := 20; min2 := 20; min3 := 20;
for i:=1 to N do begin
if Info[i].sum <min1 then begin
min3 := min2; min2 := min1;
min1 := Info[i].sum;
end
else if Info[i].sum <min2 then begin
min3 := min2;
min2 := Info[i].sum;
end
else if Info[i].sum <min3 then
min3 := Info[i].sum;
end;
{ вывод результата }
for i:=1 to N do
if Info[i].sum <= min3 then
writeln(Info[i].name);
end.
Объяснение кода листинга программы
- В начале кода объявляются следующие переменные:
- LIM - целочисленная константа, определяющая максимально возможное количество учеников (100);
- Info - массив записей, содержащих информацию об учениках (имя и сумма баллов);
- i, k, N, mark, min1, min2, min3 - целочисленные переменные для выполнения различных операций;
- c - символ, используемый для чтения имени ученика;
- end - символ, обозначающий конец цикла.
- Затем происходит чтение количества учеников (N) с помощью функции readln.
- В цикле по i от 1 до N происходит заполнение массива Info. Значение переменной name формируется путем чтения двух символов (имя ученика) и добавляется к уже имеющейся строке. Значение переменной sum устанавливается равным 0.
- В цикле по k от 1 до 3 происходит чтение трех оценок для каждого ученика и добавление их к сумме.
- После окончания ввода данных происходит поиск трех минимальных значений сумм. Переменные min1, min2 и min3 инициализируются значением 20.
- В цикле по i от 1 до N происходит сравнение суммы текущего ученика с минимальными значениями. Если сумма текущего ученика меньше min1, то значения min3, min2 и min1 обновляются. Если сумма текущего ученика меньше min2, то значения min3 и min2 обновляются. Если сумма текущего ученика меньше min3, то только значение min3 обновляется.
- В цикле по i от 1 до N происходит проверка условия Info[i].sum <= min3, и если оно выполняется, то выводится имя ученика. Таким образом, данный код выполняет следующие действия:
- Считывает количество учеников.
- Заполняет массив Info информацией об учениках.
- Находит три минимальных значения суммы баллов.
- Выводит имена учеников, сумма баллов которых не превышает минимальное значение.