На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: < Фамилия > <Имя> < оценки >, где < Фамилия > — строка, состоящая не более чем из 20 символов, <Имя> — строка, состоящая не более чем из 15 символов, < оценки > — через пробел три целых числа, соответствующие оценкам по пятибалльной системе. < Фамилия > и <Имя>, а также <Имя> и < оценки > разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 4
Требуется написать
программу, которая будет выводить на экран фамилии и имена трех лучших по среднему
баллу учеников. Если среди остальных есть ученики, набравшие тот же средний
балл, что и один из трех лучших, то следует вывести и их фамилии и имена.
Требуемые имена и фамилии можно выводить в произвольном порядке.
Решение задачи №4.
var
p:array [1..100]of record {Задаем массив записи с полями name и sum}
name:string; {В поле name (тип - строка) записи p (p[i].name) будем записывать Фамилию и Имя ученика}
sum:integer; {В поле sum (тип - целочисленный) записи p (p[i].sum) будем записывать сумму балов}
end;
c:char; {задаем символьную переменную, для считывания фамилии и имени ученика по символу}
i,j,n,s1,s2,s3,m:integer; {задаем целочисленные переменные}
begin
readln(n); {Считываем количество учеников - n}
For i:=1 to n do {Задаем цикл от 1 до n для считывания n строк учеников}
begin
p[i].name:=''; {начальное значение записи name массива p будет пустым}
repeat {Открываем цикл для считывания Фамилии ученика}
read(c); {Считываем символ фамилии}
p[i].name:=p[i].name+c; {считанный символ добавляется (с права)к полю name (По символу считываем фамилию ученика)}
until c=' '; {если следующий символ пробел, то выходим из цикла}
repeat {считываем имя ученика аналогично считыванию фамилии (см. выше)}
read(c);
p[i].name:=p[i].name+c;
until c=' '; {запись name массива p (p[i].name) приняло значение Фамилии и Имени ученика}
p[i].sum:=0; {начальное значение записи суммы sum массива p (p[i].sum) равно 0}
for j:=1 to 3 do {задаем цикл от 1 до 3 для считывания трех оценок ученика}
begin
read(m); {считываем оценку}
p[i].sum:=p[i].sum+m; {запись name массива p (p[i].name) увеличивает свое значение на величину оценки}
end;
end; {мы считали все n строк в массив p, запись name содержит Фамилию и Имя ученика, запись sum содержит сумму балов}
s1:=0; {начальное значение суммы балов трех лучших учеников s1 (лучший ученик), s2 (второй лучший ученик), s3 (третий лучший ученик) равны нулю}
s2:=0;
s3:=0;
for i:=1 to n do {задаем цикл от 1 до n, для определения суммы балов трех лучших учеников}
begin
if p[i].sum>s1 then {сравниваем сумму балов каждого ученика (p[i].sum) с суммой балов лучшего ученика (s1)}
begin {если сумма балов текущего ученика больше суммы балов лучшего ученика, то...}
s3:=s2; {сумма балов третьего лучшего ученика становится суммой балов второго лучшего ученика}
s2:=s1; {сумма балов второго лучшего ученика становится суммой балов первого лучшего ученика}
s1:=p[i].sum; {сумма балов первого лучшего ученика становится суммой балов текущего ученика (p[i].sum)}
end
else {если сумма балов текущего ученика меньше или равна суммы балов лучшего ученика, то сравниваем текущего ученика со вторым лучшим учеником}
if (p[i].sum>s2) and (p[i].sum<>s1) then {если сумма балов текущего ученика больше суммы балов второго лучшего ученика и не равна сумме балов лучшего ученика, то...}
begin
s3:=s2; {сумма балов третьего лучшего ученика становится суммой балов второго лучшего ученика}
s2:=p[i].sum; {сумма балов второго лучшего ученика становится суммой балов текущего ученика (p[i].sum)}
end
else {если сумма балов текущего ученика меньше или равна суммы балов второго лучшего ученика, то сравниваем текущего ученика с третьим лучшим учеником}
if (p[i].sum>s3) and (p[i].sum<>s1) and (p[i].sum<>s2) then {если сумма балов текущего ученика больше суммы балов торетьего лучшего ученика и не равна сумме балов первого и второго лучшего ученика, то...}
s3:=p[i].sum; {сумма балов третьего лучшего ученика становится суммой балов текущего ученика (p[i].sum)}
end; {завершив цикл, мы узнали суммы балов трех лучших учеников (s1, s2, s3)}
for i:=1 to n do {задаем цикл от 1 до n, чтобы вывести на экран фамилии и имена учеников, сумма балов которых равна суммам балов трех лучших учеников}
if p[i].sum>=s3 then {так как сумма балов первого и второго лучшего ученика больше суммы балов третьего лучшего ученика, мы сравниваем сумму баллов каждого ученика с суммой балов третьего лучшего ученика, если сумма балов текущего ученика больше или равна сумме балов третьего лучшего ученика, то выводим на экран фамилию и имя текущего ученика}
writeln(p[i].name);
end.

Алгоритм решения задачи
Обратите внимание, что вместо среднего балла каждого ученика мы ищем сумму балов. Так как каждый ученик имеет равное количество оценок, равное трем, следовательно чем больше величина суммы балов, тем больше величина среднего бала.
Возврат к списку задач
Решение задачи №4.
var
p:array [1..100]of record {Задаем массив записи с полями name и sum}
name:string; {В поле name (тип - строка) записи p (p[i].name) будем записывать Фамилию и Имя ученика}
sum:integer; {В поле sum (тип - целочисленный) записи p (p[i].sum) будем записывать сумму балов}
end;
c:char; {задаем символьную переменную, для считывания фамилии и имени ученика по символу}
i,j,n,s1,s2,s3,m:integer; {задаем целочисленные переменные}
begin
readln(n); {Считываем количество учеников - n}
For i:=1 to n do {Задаем цикл от 1 до n для считывания n строк учеников}
begin
p[i].name:=''; {начальное значение записи name массива p будет пустым}
repeat {Открываем цикл для считывания Фамилии ученика}
read(c); {Считываем символ фамилии}
p[i].name:=p[i].name+c; {считанный символ добавляется (с права)к полю name (По символу считываем фамилию ученика)}
until c=' '; {если следующий символ пробел, то выходим из цикла}
repeat {считываем имя ученика аналогично считыванию фамилии (см. выше)}
read(c);
p[i].name:=p[i].name+c;
until c=' '; {запись name массива p (p[i].name) приняло значение Фамилии и Имени ученика}
p[i].sum:=0; {начальное значение записи суммы sum массива p (p[i].sum) равно 0}
for j:=1 to 3 do {задаем цикл от 1 до 3 для считывания трех оценок ученика}
begin
read(m); {считываем оценку}
p[i].sum:=p[i].sum+m; {запись name массива p (p[i].name) увеличивает свое значение на величину оценки}
end;
end; {мы считали все n строк в массив p, запись name содержит Фамилию и Имя ученика, запись sum содержит сумму балов}
s1:=0; {начальное значение суммы балов трех лучших учеников s1 (лучший ученик), s2 (второй лучший ученик), s3 (третий лучший ученик) равны нулю}
s2:=0;
s3:=0;
for i:=1 to n do {задаем цикл от 1 до n, для определения суммы балов трех лучших учеников}
begin
if p[i].sum>s1 then {сравниваем сумму балов каждого ученика (p[i].sum) с суммой балов лучшего ученика (s1)}
begin {если сумма балов текущего ученика больше суммы балов лучшего ученика, то...}
s3:=s2; {сумма балов третьего лучшего ученика становится суммой балов второго лучшего ученика}
s2:=s1; {сумма балов второго лучшего ученика становится суммой балов первого лучшего ученика}
s1:=p[i].sum; {сумма балов первого лучшего ученика становится суммой балов текущего ученика (p[i].sum)}
end
else {если сумма балов текущего ученика меньше или равна суммы балов лучшего ученика, то сравниваем текущего ученика со вторым лучшим учеником}
if (p[i].sum>s2) and (p[i].sum<>s1) then {если сумма балов текущего ученика больше суммы балов второго лучшего ученика и не равна сумме балов лучшего ученика, то...}
begin
s3:=s2; {сумма балов третьего лучшего ученика становится суммой балов второго лучшего ученика}
s2:=p[i].sum; {сумма балов второго лучшего ученика становится суммой балов текущего ученика (p[i].sum)}
end
else {если сумма балов текущего ученика меньше или равна суммы балов второго лучшего ученика, то сравниваем текущего ученика с третьим лучшим учеником}
if (p[i].sum>s3) and (p[i].sum<>s1) and (p[i].sum<>s2) then {если сумма балов текущего ученика больше суммы балов торетьего лучшего ученика и не равна сумме балов первого и второго лучшего ученика, то...}
s3:=p[i].sum; {сумма балов третьего лучшего ученика становится суммой балов текущего ученика (p[i].sum)}
end; {завершив цикл, мы узнали суммы балов трех лучших учеников (s1, s2, s3)}
for i:=1 to n do {задаем цикл от 1 до n, чтобы вывести на экран фамилии и имена учеников, сумма балов которых равна суммам балов трех лучших учеников}
if p[i].sum>=s3 then {так как сумма балов первого и второго лучшего ученика больше суммы балов третьего лучшего ученика, мы сравниваем сумму баллов каждого ученика с суммой балов третьего лучшего ученика, если сумма балов текущего ученика больше или равна сумме балов третьего лучшего ученика, то выводим на экран фамилию и имя текущего ученика}
writeln(p[i].name);
end.

Алгоритм решения задачи
- Считываем количество учеников в переменную N, считываем данные по ученикам в массив записей p, значение Фамилии и Имени в запись name, а значение суммы балов в запись sum
- Находим величину суммы балов первого, второго и третьего лучшего ученика s1, s2, s3
- Выводим на экран Фамилии и Имена всех учеников, сумма баллов которых больше или равна сумме баллов третьего лучшего ученика

