TaskText('номер школы, затем минимальный год). Сведения о каждой школе выводить',0,0);
TaskText('на новой строке и упорядочивать по возрастанию номера школы.',0,0);
k := 1;
for i := 1 to 100 do
a[i] := 2100;
end;
2:
begin
TaskText('На вход подаются сведения об абитуриентах. В первой строке указывается',0,1);
TaskText('количество абитуриентов {N}, каждая из последующих {N} строк имеет формат',0,2);
TaskText('\(\M<���Номер школы> <���Фамилия> <���Год поступления>\m\)',0,3);
TaskText('Номер школы содержит не более двух цифр, годы лежат в диапазоне от 1990',0,4);
TaskText('до 2010. Для каждого номера школы, присутствующего в исходных данных,',0,5);
TaskText('определить связанный с ним максимальный год поступления (вначале указывать',0,0);
TaskText('максимальный год, затем номер школы). Сведения о каждой школе выводить',0,0);
TaskText('на новой строке и упорядочивать по убыванию максимального года,',0,0);
TaskText('а для совпадающих годов \= по возрастанию номера школы.',0,0);
k := -1;
for i := 1 to 100 do
a[i] := 0;
end;
end;
StartExam;
if Random(2)=0 then
n := RandomN(50, 100)
else
n := RandomN(10, 20);
case CurrentTest of
1: n := RandomN(10, 20);
2: n := RandomN(50, 100);
end;
if n <= 20 then
for i := 1 to 10 do
nums[i] := RandomN(1, 100);
writeln(f1,n);
for i := 1 to n do
begin
y := RandomN(1990, 2010);
if n <= 20 then
num := nums[RandomN(1, 10)]
else
num := RandomN(1, 100);
case m of
1: writeln(f1, y, ' ', fam[RandomN(1, famcount)],' ', num);
2: writeln(f1, num, ' ', fam[RandomN(1, famcount)],' ', y);
end;
if k*a[num] k*y then
a[num] := y;
end;
case m of
1: for i := 1 to 100 do
if a[i] < 2100 then
writeln(f2, i, ' ', a[i]);
2: while true do
begin
max := 0;
for i := 1 to 100 do
if a[i] max then
begin
max := a[i];
num := i;
end;
if max = 0 then
break
else
begin
writeln(f2, max, ' ', num);
a[num] := 0;
end;
end;
end;
EndExam;
SetTestCount(5);
end;
Обсудим детали реализации этих заданий. Начальная часть их формулировки посвящена описанию предметной области и является стандартной для данной серии заданий. Обратите внимание на то, что поля исходных записей в заданиях указываются в различном порядке. Этот прием используется во всех сериях группы ExamTaskC, чтобы обеспечить большее разнообразие входящих в них задач.
При определении завершающей части формулировки заданий последний параметр процедур TaskText полагается равным 0. Это означает, что в режиме окна с фиксированной компоновкой данные строки при первоначальном отображении задания не видны на экране, однако их можно просмотреть, используя прокрутку раздела с формулировкой задания. В режиме с динамической компоновкой полный текст формулировки задания сразу отображается на экране.
В процедуре используются два массива: массив a предназначен для хранения контрольных (правильных) результатов, а массив nums является вспомогательным (его назначение описывается далее). Для хранения исходных данных массив не предусматривается, поскольку после генерации полей очередной записи они будут немедленно записываться в исходный файл и обрабатываться.
Количество записей в исходном наборе данных записывается в переменную n. Наборы, содержащие небольшое число записей, удобны при отладке программы (благодаря своей "обозримости"), в то время как большие наборы позволяют проверить программу в "реальной" ситуации и тем самым окончательно убедиться в правильности алгоритма. Используя функцию CurrentTest, добавленную в версию 4.11 конструктора PT4TaskMaker, мы обеспечили дополнительную "настройку" процесса генерации исходных данных: при первом тестовом запуске программы с решением задачи ей всегда предлагается набор из небольшого количества записей (что упрощает поиск и исправление ошибок), а при втором тестовом запуске -- большой набор записей (что позволяет проверить предложенный алгоритм "на прочность"). При последующих тестовых запусках (а также при демонстрационном и ознакомительном запуске программы) значение n с равной вероятностью выбирается либо из диапазона 10..20, либо из диапазона 50..100.
В случае генерации исходных данных для указанных заданий при небольших значениях n (10-20) возникает дополнительная проблема: если выбирать случайным образом номера школ из всего допустимого диапазона 1-100, то с большой вероятностью каждый номер школы появится в наборе исходных данных всего по одному разу, что не позволит проверить правильность реализованного в программе алгоритма нахождения минимального/максимального значения. Чтобы решить эту проблему, используется вспомогательный массив nums из 10 элементов, в который заносятся 10 случайно выбранных номеров школ, после чего номера школ для исходного набора записей выбираются уже из этого набора номеров.
Читать дальше