Категория C4 • задача №4
Условие задачи
Дано:
после единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько баллов набрал.
В районе считается подозрительной ситуация, когда в школе более двух учащихся набирают одинаковый наибольший балл по школе.
Районный методист решила выяснить номера таких школ.
Программа должна вывести номера таких школ в любом порядке.
Если такая школа окажется одна, нужно вывести наибольший балл в этой школе, с указанием того, что это наибольший балл.
Если таких школ не окажется, нужно вывести об этом сообщение.
На вход программе сначала подается число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия> <Имя> <Номер школы> <Количество баллов>, где
<Фамилия> - строка, состоящая не более чем из 30 символов без пробелов;
<Имя> - строка, состоящая не более чем из 20 символов без пробелов;
<Номер школы> - целое число в диапазоне от 1 до 99;
<Количество баллов> - целое число в диапазоне от 0 до 100.
Эти данные записаны через пробел, причем ровно один между каждой парой (то есть, всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
5 50 74 87
Другой вариант выходных данных:
7
Наибольший балл = 74
Третий вариант выходных данных:
Нет таких школ
Реализовать:
напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.
Решение
Начнем разбираться с задачей на конкретных данных, допустим экзамен сдавало 10 человек. Вся информация является вымышленной и все совпадения случайны.
№ | Фамилия | Имя | № школы | Количество баллов |
1 | Иванов | Алексей | 35 | 87 |
2 | Петрова | Анна | 12 | 78 |
3 | Ильина | Татьяна | 40 | 50 |
4 | Хохлов | Илья | 12 | 78 |
5 | Максимов | Антон | 35 | 87 |
6 | Петросян | Ирина | 90 | 21 |
7 | Андросов | Вячеслав | 12 | 78 |
8 | Трубицына | Олеся | 12 | 34 |
9 | Корелов | Антон | 35 | 87 |
10 | Филимонов | Артем | 35 | 10 |
Сформируем массив, содержащий агрегированную информацию о том, какая школа сколько имеет учеников, получивших максимальный балл:
... | 78 | ... | 87 | ... | 50 | ... | 21 | ... | Максимальный балл |
... | 12 | ... | 35 | ... | 40 | ... | 90 | ... | № школы |
... | 3 | ... | 3 | ... | 1 | ... | 1 | ... | Количество школьников |
*примечание: хочу обратить внимание на тот факт, что нет необходимости запоминать в массиве информацию об имени или фамилии школьника.
Сейчас необходимо просканировать все элементы сформированного массива и посчитать количество школ, имеющих количество учеников, набравших максимальный балл свыше двух человек.
Очевидно, что только две школы (№12 и №35) имеют по три ученика набравших максимальный балл, следовательно, в качестве ответа необходимо распечатать только номера данных школ.
В результате, ответом для рассмотренных входных данных является следующее:
12 35
Рассмотрим реализацию программы на языке программирования Borland Pascal 7.0 с подробными русифицированными комментариями:
program C4;
{раздел подключения модулей и сторонних расширений}
uses
{подключаем модуль crt. crt - console run time. Данный модуль содержит
специализированные подпрограммы для обработки текста, звука,
клавиатурных событий}
crt;
{радел объявления константных величин}
const
{отвечает за общее количество школ}
SCHOOL = 99;
{раздел декларации переменных}
var
{одномерный массив: индексом элемента выступает номер школы текущего ученика,
а значением элемента, является количество учеников, получивших максимальный
балл в пределах текущей школы}
countPupil : array [1..SCHOOL] of integer;
{одномерный массив: индексом элемента выступает номер школы текущего ученика,
а значением элемента является значение максимального балла, полученного
по данной школе}
maxBall : array [1..SCHOOL] of integer;
{счетчик циклов}
i : integer;
{хранит текущий символ, введенный с клавиатуры пользователем}
ch : char;
{отвечает за максимальный балл единственной школы, в которой более двух
учащихся получили наивысший балл}
nmax : integer;
{хранит номер школы текущего ученика}
currSchool : integer;
{хранит балл, полученный текущим учеником}
curBall : integer;
{хранит количество записей для обработки}
N : integer;
{отвечает за количество школ, в которых имеется больше двух учащихся,
набравших максимальный балл по школе}
k : integer;
{главный блок программы}
begin
{очистка экрана от прошлых выводов}
clrscr;
{устанавливаем желтый цвет тексту на дисплее}
textColor(YELLOW);
{происходит обнуление информации, поскольку ее обработка еще не начиналась}
for i := 1 to SCHOOL do
begin
countPupil[i] := 0;
maxBall[i] := 0;
end;
{диалог пользователю о вводе количества записей / учеников для обработки}
write('Введите количество учеников для обработки и анализа: ');
{считывание с клавиатуры количества записей}
readln(N);
{цикл со счетчиком, в котором происходит запрос информации от пользователя и,
сразу же происходит обработка и анализ полученной информации}
for i := 1 to N do
begin
{посимвольно считываем фамилию текущего ученика, НО! данную информацию
нигде не запоминаем, т к в последующих расчетах она не фигурирует}
repeat
read(ch);
until(ch = ' ');
{посимвольно считываем имя текущего ученика, НО! данную информацию
нигде не запоминаем, т к в последующих расчетах она не фигурирует}
repeat
read(ch);
until(ch = ' ');
{считываем номер школы и балл набранный текущим учеником}
readln(currSchool, curBall);
{если балл текущего ученика больше максимального балла по текущей школе, то
присваиваем текущей школе текущий балл и количество учеников, набравших
максимальный балл выставляем в ЕДИНИЦУ}
if(maxBall[currSchool] < curBall) then
begin
maxBall[currSchool] := curBall;
countPupil[currSchool] := 1;
end
else
{иначе, если балл текущего ученика равен максимальному баллу по текущей
школе, то увеличиваем количество учеников, набравших наивысший балл на ОДИН}
if(maxBall[currSchool] = curBall) then
countPupil[currSchool] := countPupil[currSchool] + 1;
end;
{перед расчетом обнуляем переменную отвечающую за количество школ, в которой
существует более двух учеников набравших максимальный балл}
k := 0;
{вставка пустой строки для повышения читабельности}
writeln;
{просматриваем информацию о всех школах и печатаем номера таких школ,
параллельно выясняя количество подобных школ и запоминая наивысший балл}
for i := 1 to SCHOOL do
{если в текущей школе существует более двух учеников, получивших
наивысший балл по данной школе}
if(countPupil[i] > 2) then
begin
write(i, ' ');
inc(k);
nmax := i;
end;
{физический переход на новую строку в DOS-окне}
writeln;
{если существует только ОДНА школа, имеющая больше двух учеников, получивших
максимальный балл по данной школе, то выпечатываем также и наибольший
балл данной школы}
if(k = 1) then
write('Наибольший балл: ', maxBall[nmax])
else
{иначе, если нет ни одной школы, в которой существует более двух учеников,
набравших наивысший балл, то выводим на дисплей соответствующее сообщение}
if(k = 0) then
writeln('Школ не обнаружено!');
{имитация задержки программы. Программа будет закрыта после нажатия
произвольной клавиши на клавиатуре}
readkey;
{финализирующий оператор программы}
end.
Категория C4 • задача №4
Остальные решения из билета №4 для подготовки к ЕГЭ по информатике 2013
Условие задачи (наведите курсор мыши на ссылку) |
Аудиовизуальное решение |
Мультимедийная видеопрезентация |
Решение в формате слайд-шоу |
Текстовое решение |
---|
Комментарии