- Аудиовизуальное решение
- Мультимедийная видеопрезентация
- Решение в формате слайд-шоу
- Текстовое
решение - Исходный код программы
Условие задачи
Пояснение к задаче
Здравствуйте!
В данном интерактивном обучающем видеоролике мы детально разберем решение задачи из категории С4 демонстрационного варианта 2012 года.
Необходимо уметь:
создавать собственные программы, высотой 30 – 70 строк кода с командами, для решения задач среднего и повышенного уровня сложности;
реализовывать сложные алгоритмы;
программировать несколькими способами различного плана сортировку данных;
описывать фундаментальные элементы современных языков программирования, такие как циклические конструкции, условные выражения, процедуры и функции.
С уважением, Александр Георгиевич, ведущий эксперт в области подготовки к ГИА и ЕГЭ по информатике и ИКТ
Решение
{заголовок программы}
program demo;
{раздел подключения сторонних модулей и расширений}
uses
{подключаем модуль crt - Console Run Time. Данный модуль содержит
специализированные подпрограммы для
обработки текста, звука, клавиатурных событий}
crt;
{раздел декларации констант}
const
{нетипизированная целочисленная константа, отвечающая
за максимальное количество различных типов задач}
MAX = 11;
{раздел декларации типов}
type
{тип данных "Запись", состоящий из двух полей}
Tdata = record
{отвечает за название задачи}
nameTask : string;
{отвечает за количество задач заданного типа}
countTask : integer;
end;
{раздел декларации переменных}
var
{количество пришедших запросов}
n : integer;
{количество рассмотренных задач разного типа}
numberDifferentTask : integer;
{название текущей задачи}
currentNameTask : string;
{массив, хранящий названия всех пришедших типов задач
и, также их частотность}
data : array[1..MAX] of Tdata;
{временная переменная для обмена двух значений}
tmp : Tdata;
{счетчики циклов}
i, j : integer;
{начало главного блока программы}
begin
{очистка экрана от прошлых выводов}
clrscr;
{предварительная инициализация данных}
for i := 1 to MAX do
begin
data[i].nameTask := '';
data[i].countTask := 0;
end;
{количество разных типов задач равна 0, т к данные еще не поступили}
numberDifferentTask := 0;
{диалог пользователю о предстоящем вводе целого положительного числа}
write('Введите количество запросов: ');
{считываем количество запросов, введенных пользователем}
readln(n);
{цикл со счетчиком, в котором происходит запрос информации от пользователя и,
сразу же происходит обработка и анализ полученной информации}
for i := 1 to n do
begin
{считываем название текущей задачи}
readln(currentNameTask);
{начинается поиск задачи такого типа в массиве с первого элемента}
j := 1;
{пробегаем по массиву задач и сравниваем название текущей задачи
с названиями всех задач, которые были введены пользователем ранее}
while((j <= numberDifferentTask) and (currentNameTask <> data[j].nameTask)) do
j := j + 1;
{задача подобного типа была введена ранее, поэтому увеличиваем
ее частотность на единицу}
if(j <= numberDifferentTask) then
data[j].countTask := data[j].countTask + 1
else
{задача подобного типа не была введена ранее}
begin
{записываем ее название в последний незанятый элемент массива}
data[j].nameTask := currentNameTask;
{поскольку эта задача встретилась впервые, то ее частотность равна 1}
data[j].countTask := 1;
{увеличиваем счетчик количества различного типа задач на единицу}
inc(numberDifferentTask, 1);
end;
end;
{начинаем сортировать методом обмена названия типов задач
по количеству встречаемости, то есть по частотности, по убыванию}
for i := numberDifferentTask downto 2 do
for j := 2 to i do
{если частотность текущей задачи оказывается больше частотности предыдущей
задачи, то меняем их местами, т к сортируем по убыванию частотности задач}
if(data[j - 1].countTask < data[j].countTask) then
begin
tmp := data[j];
data[j] := data[j - 1];
data[j - 1] := tmp;
end;
{вставка пустой строки для повышения читабельности}
writeln;
{если количество различных задач меньше ТРЕХ, то выводим информацию
об имеющихся задачах}
if(numberDifferentTask < 3) then
for i := 1 to numberDifferentTask do
{выводим название задачи и количество пришедших подобных задач}
writeln(data[i].nameTask, ' ', data[i].countTask)
{иначе существует не меньше трех различных задач}
else
begin
{выпечатываем информацию о первых трех наиболее популярных задачах
независимо от их количества}
writeln(data[1].nameTask, ' ', data[1].countTask);
writeln(data[2].nameTask, ' ', data[2].countTask);
writeln(data[3].nameTask, ' ', data[3].countTask);
{позиционируемся на задачу, идующую в списке под номером четыре}
i := 4;
{ВАЖНО!! выводим на экран информацию по задачам, имеющим такую же
частотность как и третья по частоте встречаемости задача}
while(i <= numberDifferentTask) and (data[i].countTask = data[3].countTask) do
begin
writeln(data[i].nameTask, ' ', data[i].countTask);
i := i + 1;
end;
end;
{имитация задержки программы. Программа будет закрыта после нажатия
произвольной клавиши на клавиатуре}
readkey;
{финализирующий оператор программы}
end.
program demo;
{раздел подключения сторонних модулей и расширений}
uses
{подключаем модуль crt - Console Run Time. Данный модуль содержит
специализированные подпрограммы для
обработки текста, звука, клавиатурных событий}
crt;
{раздел декларации констант}
const
{нетипизированная целочисленная константа, отвечающая
за максимальное количество различных типов задач}
MAX = 11;
{раздел декларации типов}
type
{тип данных "Запись", состоящий из двух полей}
Tdata = record
{отвечает за название задачи}
nameTask : string;
{отвечает за количество задач заданного типа}
countTask : integer;
end;
{раздел декларации переменных}
var
{количество пришедших запросов}
n : integer;
{количество рассмотренных задач разного типа}
numberDifferentTask : integer;
{название текущей задачи}
currentNameTask : string;
{массив, хранящий названия всех пришедших типов задач
и, также их частотность}
data : array[1..MAX] of Tdata;
{временная переменная для обмена двух значений}
tmp : Tdata;
{счетчики циклов}
i, j : integer;
{начало главного блока программы}
begin
{очистка экрана от прошлых выводов}
clrscr;
{предварительная инициализация данных}
for i := 1 to MAX do
begin
data[i].nameTask := '';
data[i].countTask := 0;
end;
{количество разных типов задач равна 0, т к данные еще не поступили}
numberDifferentTask := 0;
{диалог пользователю о предстоящем вводе целого положительного числа}
write('Введите количество запросов: ');
{считываем количество запросов, введенных пользователем}
readln(n);
{цикл со счетчиком, в котором происходит запрос информации от пользователя и,
сразу же происходит обработка и анализ полученной информации}
for i := 1 to n do
begin
{считываем название текущей задачи}
readln(currentNameTask);
{начинается поиск задачи такого типа в массиве с первого элемента}
j := 1;
{пробегаем по массиву задач и сравниваем название текущей задачи
с названиями всех задач, которые были введены пользователем ранее}
while((j <= numberDifferentTask) and (currentNameTask <> data[j].nameTask)) do
j := j + 1;
{задача подобного типа была введена ранее, поэтому увеличиваем
ее частотность на единицу}
if(j <= numberDifferentTask) then
data[j].countTask := data[j].countTask + 1
else
{задача подобного типа не была введена ранее}
begin
{записываем ее название в последний незанятый элемент массива}
data[j].nameTask := currentNameTask;
{поскольку эта задача встретилась впервые, то ее частотность равна 1}
data[j].countTask := 1;
{увеличиваем счетчик количества различного типа задач на единицу}
inc(numberDifferentTask, 1);
end;
end;
{начинаем сортировать методом обмена названия типов задач
по количеству встречаемости, то есть по частотности, по убыванию}
for i := numberDifferentTask downto 2 do
for j := 2 to i do
{если частотность текущей задачи оказывается больше частотности предыдущей
задачи, то меняем их местами, т к сортируем по убыванию частотности задач}
if(data[j - 1].countTask < data[j].countTask) then
begin
tmp := data[j];
data[j] := data[j - 1];
data[j - 1] := tmp;
end;
{вставка пустой строки для повышения читабельности}
writeln;
{если количество различных задач меньше ТРЕХ, то выводим информацию
об имеющихся задачах}
if(numberDifferentTask < 3) then
for i := 1 to numberDifferentTask do
{выводим название задачи и количество пришедших подобных задач}
writeln(data[i].nameTask, ' ', data[i].countTask)
{иначе существует не меньше трех различных задач}
else
begin
{выпечатываем информацию о первых трех наиболее популярных задачах
независимо от их количества}
writeln(data[1].nameTask, ' ', data[1].countTask);
writeln(data[2].nameTask, ' ', data[2].countTask);
writeln(data[3].nameTask, ' ', data[3].countTask);
{позиционируемся на задачу, идующую в списке под номером четыре}
i := 4;
{ВАЖНО!! выводим на экран информацию по задачам, имеющим такую же
частотность как и третья по частоте встречаемости задача}
while(i <= numberDifferentTask) and (data[i].countTask = data[3].countTask) do
begin
writeln(data[i].nameTask, ' ', data[i].countTask);
i := i + 1;
end;
end;
{имитация задержки программы. Программа будет закрыта после нажатия
произвольной клавиши на клавиатуре}
readkey;
{финализирующий оператор программы}
end.
- Аудиовизуальное решение
- Мультимедийная видеопрезентация
- Решение в формате слайд-шоу
- Текстовое
решение - Исходный код программы