Категория C4 • задача №4

 
 
 

Условие задачи

Дано:
после единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько баллов набрал.
В районе считается подозрительной ситуация, когда в школе более двух учащихся набирают одинаковый наибольший балл по школе.
Районный методист решила выяснить номера таких школ.
Программа должна вывести номера таких школ в любом порядке.
Если такая школа окажется одна, нужно вывести наибольший балл в этой школе, с указанием того, что это наибольший балл.
Если таких школ не окажется, нужно вывести об этом сообщение.

На   вход  программе  сначала  подается число  учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:

                 <Фамилия> <Имя> <Номер школы> <Количество баллов>, где

<Фамилия>           - строка,  состоящая  не  более  чем  из  30  символов без пробелов;
<Имя>               - строка,  состоящая  не  более  чем  из  20 символов  без пробелов;
<Номер школы>       - целое число в диапазоне от 1 до 99;
<Количество баллов> - целое число в диапазоне  от 0 до 100.

Эти данные записаны через пробел, причем ровно один между каждой парой (то есть, всего по три пробела в каждой строке).

Пример входной строки:
    Иванов Иван 50 87

Пример выходных данных:
    5 50 74 87

Другой вариант выходных данных:
    7
    Наибольший балл = 74

Третий вариант выходных данных:
    Нет таких школ

 

Реализовать:
напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.

 

Решение

Начнем разбираться с задачей на конкретных данных, допустим экзамен сдавало 10 человек. Вся информация является вымышленной и все совпадения случайны.

ФамилияИмя№ школыКоличество
баллов
1ИвановАлексей3587
2ПетроваАнна1278
3ИльинаТатьяна4050
4ХохловИлья1278
5МаксимовАнтон3587
6ПетросянИрина9021
7АндросовВячеслав1278
8ТрубицынаОлеся1234
9КореловАнтон3587
10ФилимоновАртем3510

 

Сформируем массив, содержащий агрегированную информацию о том, какая школа сколько имеет учеников, получивших максимальный балл:

...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.

 
 
Рейтинг:
 
Проголосовало: 0
Количество просмотров: 2161
 
 
 

Категория C4 • задача №4

 

Комментарии

Для комментирования или зарегистрируйтесь
 

Остальные решения из билета №4 для подготовки к ЕГЭ по информатике 2013

 
Условие задачи
(наведите курсор мыши на ссылку)
Аудиовизуальное
решение
Мультимедийная
видеопрезентация
Решение в формате
слайд-шоу
Текстовое
решение
 
© 2011-2024 ООО "СтадиМен". Все права сохранены.
Перепечатка и использование материалов с данного сайта, разрешена только по согласию с владельцем.
Владелец оставляет за собой право воспользоваться 146 статьей УК РФ при нарушении авторских и смежных прав.
 
 
 
 
Авторизация на сайте
 
 
 
Обнаружили
ошибку на сайте?