На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Имя> <оценки>,
где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 3
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.
Заметим, что вместо сравнения средних баллов можно сравнивать суммы баллов. Будем считывать имена, фамилии и суммы оценок в массив из 100 записей. Найдём три наименьших суммы баллов, затем, сравнивая все полученные ыллы с наибольшим из трёх полученных минимумов найдём нужных учеников.
var a:array[1..100]of record
name:string;
point:integer;
end;
n,i,m,e,min,j,min1,min2:integer;
c:char;
begin
min:=20;
min1:=20;
min2:=20;
read(n);
for i:=1 to n do
begin
repeat{считываем имена фамилии}
read(c);
a[i].name:=a[i].name+c;
until c=' ';
a[i].name:=a[i].name+' ';
repeat
read(c);
a[i].name:=a[i].name+c;
until c=' ';
for j:=1 to 3 do {считаем баллы}
begin
read(e);
m:=m+e;
end;
if m < min then {сразу находим троих минимальных}
begin
min2:=min1;
min1:=min;
min:=m;
end
else
if m < min1 then
begin
min2:=min1;
min1:=m;
end
else
if m < min2 then
min2:=m;
a[i].point:=m;
m:=0;
end;
for i:=1 to n do
if a[i].point<=min2 {все те кто меньше min2 будут равны или мин1 или min}
then write(2,a[i].name);
end.
Замечание.
На первый взгляд может показаться, что достаточно хранить только три записи, содержащие учеников с наименьшим количеством баллов. Но, например, если все ученики имеют одинаковый балл нужно вывести имена всех учеников, то есть в ходе программы, так или иначе, нужно запомнить все введённые имена.


В коде присутствуют 3 участка такого плана:
" if m div 3 begin"
Может быть, после 3 что-то должно быть?
Такая программа не проходит компиляцию
Да, это html шалит. Когда пишешь что-то вида <"буква" такая запись считывается, как начало html тега и произвольная часть текста пропадает. Поправили.
Здравствуйте! В задании просят вывести имена тех 3-х учеников, у которых худший средний балл, а не тех, кто набрал "<=min2". Допустим, будет 10 учеников со след. средними баллами:
Ученик1 2;
Ученик2 2;
Ученик3 3;
Ученик4 3;
Ученик5 4;
Ученик6 4;
Ученик7 5;
Ученик8 5;
Ученик9 5;
Ученик10 5.
Тогда нужно будет вывести только первые 4 имени.
Я бы предложил ввести новую переменную k (или использовать старую, более ненужную) и сделать так:
k := 0;
for i := 1 to N do
if a[i].point=min then begin
a[i].point := 21;
writeln(a[i].name);
k := k + 1;
end;
if k<3 then
for i := 1 to N do
if a[i].point=min1 then begin
a[i].point := 21;
writeln(a[i].name);
k := k + 1;
end;
if k<3 then
for i := 1 to N do
if a[i].point=min2 then
writeln(a[i].name);
Сначала я написал программу по тому же принципу, как и показано в пояснении, но потом перечитал задание: строка "выводить на экран фамилии и имена трех худших по среднему баллу учеников" как бы дает понять, что у этих трёх учеников может быть и одинаково худший средний балл.
Пожалуйста, если я ошибаюсь, поправьте - буду учиться на своих ошибках.
Всего доброго!
Здравствуйте! Хороший вопрос. Тут нужно заметить, что в ходе работы программы значения min, min1 и min2 могут стать равными друг другу. Для вашего примера это будут значения 2, 2 и 3 соответственно, поэтому буду выведены именно четыре нужные записи.
Возможен ли такой вариант программы:
var
A: array[1..100]of record
name: string;
m: integer;
end;
N, i, O, O1, O2, sum, Min, j, Min1, Min2: integer;
C: char;
S: string;
begin
j := 1;
min := 16;
min1 := 16;
min2 := 16;
read(N);
for i := 1 to N do
begin
read(c);
while c <> ' ' do{считываем фамилию}
begin
S := S + c;
read(c);
end;
read(c);
S := S + ' ';
while c <> ' ' do {считываем имя}
begin
S := S + c;
read(c);
end;
read(O, O1, O2);{считвааем баллы}
sum := O + O1 + O2;
if sum <= Min then
begin
Min := sum;A[j].name := S;A[j].m := sum;j := j + 1;
end
else if sum <= Min1 then
begin
Min1 := sum;A[j].name := S;A[j].m := sum;j := j + 1;
end
else if sum <= Min2 then
begin
Min2 := sum;A[j].name := S;A[j].m := sum;j := j + 1;
end;
end;
N := j - 1;
for i := 1 to N do if A[i].m = Min then writeln(A[i].name);
for i := 1 to N do if A[i].m = Min1 then writeln(A[i].name);
for i := 1 to N do if A[i].m = Min2 then writeln(A[i].name);
end.
Здравствуйте! Да, такой вариант возможен.