Категория C4 • задача №3
Условие задачи
Дано:
после единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал.
Районный методист решила выяснить фамилии учеников, которые набрали наибольший балл, по каждой школе в отдельности, но только если из школы информатику сдавало не меньше трех человек. Если в школе информатику сдавало меньше трех человек, информацию по этой школе выводить не нужно.
Программа должна вывести на экран информацию в виде:
<Номер школы> <Фамилия ученика>
в отдельной строке для каждой школы.
На вход программе сначала подается число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия> <Имя> <Номер школы> <Количество баллов>, где
<Фамилия> - строка, состоящая не более чем из 30 символов без пробелов;
<Имя> - строка, состоящая не более чем из 20 символов без пробелов;
<Номер школы> - целое число в диапазоне от 1 до 99;
<Количество баллов> - целое число в диапазоне от 0 до 100.
Реализовать:
напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна вывести на экран требуемую информацию.
Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.
Эти данные записаны через пробел, причем ровно один между каждой парой (то есть, всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
5 Иванов
50 Петров
74 Сидоров
Решение
Начнем разбираться с задачей на конкретных данных, допустим экзамен сдавало 10 человек. Вся информация является вымышленной и все совпадения случайны.
№ | Фамилия | Имя | № школы | Количество баллов |
1 | Иванов | Иван | 12 | 85 |
2 | Петрова | Ольга | 90 | 43 |
3 | Сидоров | Евгений | 50 | 50 |
4 | Смирнов | Олег | 90 | 87 |
5 | Романова | Елена | 15 | 75 |
6 | Трубин | Михаил | 12 | 46 |
7 | Молодова | Алла | 50 | 10 |
8 | Великанов | Илья | 50 | 95 |
9 | Серебрякова | Мария | 90 | 80 |
10 | Исаков | Леонид | 25 | 63 |
Выпишем номера школ (упорядочим по возрастанию), из которых представлено хотя бы по одному ученику.
Номера школ: 12, 15, 25, 50, 90.
Анализ исходной таблицы для школы №12. Очевидно, что в таблице присутствует два ученика из данной школы:
№ | Фамилия | Имя | № школы | Количество баллов |
1 | Иванов | Иван | 12 | 85 |
2 | Петрова | Ольга | 90 | 43 |
3 | Сидоров | Евгений | 50 | 50 |
4 | Смирнов | Олег | 90 | 87 |
5 | Романова | Елена | 15 | 75 |
6 | Трубин | Михаил | 12 | 46 |
7 | Молодова | Алла | 50 | 10 |
8 | Великанов | Илья | 50 | 95 |
9 | Серебрякова | Мария | 90 | 80 |
10 | Исаков | Леонид | 25 | 63 |
Анализ исходной таблицы для школы №15. Очевидно, что в таблице присутствует один ученик из данной школы:
№ | Фамилия | Имя | № школы | Количество баллов |
1 | Иванов | Иван | 12 | 85 |
2 | Петрова | Ольга | 90 | 43 |
3 | Сидоров | Евгений | 50 | 50 |
4 | Смирнов | Олег | 90 | 87 |
5 | Романова | Елена | 15 | 75 |
6 | Трубин | Михаил | 12 | 46 |
7 | Молодова | Алла | 50 | 10 |
8 | Великанов | Илья | 50 | 95 |
9 | Серебрякова | Мария | 90 | 80 |
10 | Исаков | Леонид | 25 | 63 |
Анализ исходной таблицы для школы №25. Очевидно, что в таблице присутствует один ученик из данной школы:
№ | Фамилия | Имя | № школы | Количество баллов |
1 | Иванов | Иван | 12 | 85 |
2 | Петрова | Ольга | 90 | 43 |
3 | Сидоров | Евгений | 50 | 50 |
4 | Смирнов | Олег | 90 | 87 |
5 | Романова | Елена | 15 | 75 |
6 | Трубин | Михаил | 12 | 46 |
7 | Молодова | Алла | 50 | 10 |
8 | Великанов | Илья | 50 | 95 |
9 | Серебрякова | Мария | 90 | 80 |
10 | Исаков | Леонид | 25 | 63 |
Анализ исходной таблицы для школы №50. Очевидно, что в таблице присутствует три ученика из данной школы:
№ | Фамилия | Имя | № школы | Количество баллов |
1 | Иванов | Иван | 12 | 85 |
2 | Петрова | Ольга | 90 | 43 |
3 | Сидоров | Евгений | 50 | 50 |
4 | Смирнов | Олег | 90 | 87 |
5 | Романова | Елена | 15 | 75 |
6 | Трубин | Михаил | 12 | 46 |
7 | Молодова | Алла | 50 | 10 |
8 | Великанов | Илья | 50 | 95 |
9 | Серебрякова | Мария | 90 | 80 |
10 | Исаков | Леонид | 25 | 63 |
Анализ исходной таблицы для школы №90. Очевидно, что в таблице присутствует три ученика из данной школы:
№ | Фамилия | Имя | № школы | Количество баллов |
1 | Иванов | Иван | 12 | 85 |
2 | Петрова | Ольга | 90 | 43 |
3 | Сидоров | Евгений | 50 | 50 |
4 | Смирнов | Олег | 90 | 87 |
5 | Романова | Елена | 15 | 75 |
6 | Трубин | Михаил | 12 | 46 |
7 | Молодова | Алла | 50 | 10 |
8 | Великанов | Илья | 50 | 95 |
9 | Серебрякова | Мария | 90 | 80 |
10 | Исаков | Леонид | 25 | 63 |
В итоге, среди пяти школ, только из двух школ было представлено не менее трех учеников. Это школа №50 и школа №90. В условии задачи сказано, что необходимо выяснить фамилии учеников, которые набрали наибольший балл по своей школе.
Рассмотрим учеников из школы №50 и выделим запись зеленым цветом того ученика, набравшего максимальный балл:
Фамилия | Имя | Количество баллов |
Сидоров | Евгений | 50 |
Молодова | Алла | 10 |
Великанов | Илья | 95 |
Рассмотрим учеников из школы №90 и выделим запись зеленым цветом того ученика, набравшего максимальный балл:
Фамилия | Имя | Количество баллов |
Петрова | Ольга | 43 |
Смирнов | Олег | 87 |
Серебрякова | Мария | 80 |
В результате, ответом для подобных входных данных является следующее:
50 Великанов
90 Смирнов
Рассмотрим реализацию программы на языке программирования Borland Pascal 7.0 с подробными русифицированными комментариями:
program C4;
{раздел подключения модулей и сторонних расширений}
uses
{подключаем модуль crt – console run time. Данный модуль содержит специализированные подпрограммы для обработки текста, звука, клавиатурных событий}
crt;
{раздел объявления константных величин}
const
{общее количество номеров школ}
NUMBER = 99;
{раздел декларации переменных}
var
{хранит общее количество школьников, принимавших участие в сдаче экзаменов}
n : integer;
{счетчик цикла}
i : integer;
{хранит текущий символ, введенный с клавиатуры от пользователя}
ch : char;
{текущий номер школы, введенный пользователем}
currSchool : integer;
{текущее количество баллов набранных текущим учеником}
currBall : integer;
{хранит текущую фамилию ученика, сдававшего экзамен}
currLastName : string[31];
{хранит количество школьников по каждой школе. Номером школы выступает индекс элемента одномерного массива}
countPupil : array[1..NUMBER] of integer;
{хранит максимальный балл по каждой школе. Номером школы выступает текущий индекс элемента.}
maxBall : array[1..NUMBER] of integer;
{хранит фамилии учеников, набравших максимальный балл по своей школе. Номером школы выступает текущий индекс элемента массива}
FIO : array[1..NUMBER] of string;
{главный блок программы}
begin
{очистка экрана дисплея от прошлых выводов}
clrscr;
{поскольку информации еще нет, то обнуляем характеристики}
for i := 1 to N do
begin
countPupil[i] := 0;
{присваиваем «-1», т к минимально возможный балл равен нулю}
maxBall[i] := -1;
end;
{считываем количество школьников, сдававших экзамен}
readln(n);
{цикл, в котором происходит считывание информации с клавиатуры от пользователя}
for i := 1 to n do
begin
{обнуляем переменную, отвечающую за хранение фамилии}
currLastName := ' ';
{посимвольно считываем фамилию ученика, причем запоминая данную информацию в специальной переменной, поскольку в дальнейшей обработке данная информация может быть использована}
repeat
read(ch);
currLastName := currLastName + ch;
until(ch = ' ');
{посимвольно считываем имя, причем, не запоминая данную информацию, поскольку в дальнейшей обработке данная информация не потребуется}
repeat
read(ch);
until(ch = ' ');
{считываем текущий номер школы ученика и количество баллов, полученных школьником}
readln(currSchool, currBall);
{если величина текущего балла, больше максимального балла в текущей школе}
if(currBall > maxBall[currSchool]) then
begin
{запоминаем «новое» максимальное значение балла в текущей школе}
maxBall[currSchool] := currBall;
{запоминаем фамилию ученика набравшего новый максимальный балл в текущей школе}
FIO[currSchool] := currLastName;
end;
{увеличиваем количество школьников на единицу у той школы, чей номер совпадает с только что считанным номером школы}
countPupil[currSchool] := countPupil[currSchool] + 1;
end;
{вставка пустой строки для повышения читабельности}
writeln;
{в цикле перебираем все школы от первого до 99 номера}
for i := 1 to NUMBER do
{если количество учеников текущей школы больше или равно трем, то печатаем номер данной школы и фамилию ученика из данной школы, получившего наивысший балл на экзамене}
if(countPupil[i] >= 3) then
writeln(i, ' ', FIO[i]);
{имитация задержки программы. Программа будет закрыта после нажатия произвольной клавиши на клавиатуре}
readkey;
end.
Категория C4 • задача №3
Остальные решения из билета №3 для подготовки к ЕГЭ по информатике 2013
Условие задачи (наведите курсор мыши на ссылку) |
Аудиовизуальное решение |
Мультимедийная видеопрезентация |
Решение в формате слайд-шоу |
Текстовое решение |
---|
Комментарии