Наша группа ExamDemo к настоящему моменту содержит 12 заданий повышенной сложности, импортированных из группы ExamTaskC. Все эти задания связаны с общей предметной областью; они содержат сведения об абитуриентах и включают их фамилии, номера школ и годы поступления в вузы. Для того чтобы проиллюстрировать некоторые особенности, связанные с разработкой подобных заданий, дополним набор уже имеющихся заданий двумя новыми заданиями из той же предметной области.
Новые задания будут связаны с группировкой абитуриентов по школам: для каждой школы надо найти связанный с ней минимальный (или максимальный) год поступления абитуриента. Второе из двух заданий мы усложним, дополнительно потребовав, чтобы полученные результаты были отсортированы по убыванию максимального года (а для одинаковых годов -- по возрастанию номера школы). Первое задание сделаем более простым: в нем результирующие данные надо располагать по возрастанию номеров школ.
При генерации наборов исходных данных нам потребуются не только числа (номера школ и годы поступления), но и строковые данные -- фамилии абитуриентов (хотя для выполнения этих заданий они не требуются). Проще всего определить массив возможных фамилий достаточно большого размера, из которого выбирать элементы случайным образом. Заметим, что в условии заданий не говорится о том, что все фамилии в исходном наборе должны быть различными, поэтому совпадения фамилий вполне допустимы (если в некоторой группе заданий все фамилии должны быть уникальными, то целесообразно дополнять их инициалами, чтобы обеспечить большее разнообразие; кроме того, для таких заданий при добавлении к набору исходных данных новой фамилии необходимо проверять, что среди уже имеющихся элементов набора отсутствует данная фамилия с теми же инициалами).
Добавим к нашей библиотеке вспомогательный массив фамилий из 40 элементов (обратите внимание на то, что по правилам языка PascalABC.NET между описанием массива и списком инициализирующих значений указывается знак присваивания):
>const
>famcount = 40;
>var
>fam: array[1..famcount] of string :=
>('Иванов', 'Петров', 'Сидоров', 'Кузнецов', 'Филиппов',
>'Сергеев', 'Александров', 'Петухов', 'Пономарев', 'Яшин',
>'Греков', 'Иванова', 'Кузнецова', 'Алексеева', 'Зайцев',
>'Волкова', 'Фролов', 'Юрьев', 'Бондарев', 'Семенов',
>'Семенова', 'Федченко', 'Марченко', 'Борисова', 'Петровский',
>'Беляева', 'Белкин', 'Лысенко', 'Сорокина', 'Пастухов',
>'Юрьева', 'Кондратьев', 'Тимофеев', 'Степанова', 'Якимов',
>'Юсов', 'Степанов', 'Руденко', 'Демидов', 'Леонидов');
Оба новых задания, как и два предыдущих, мы реализуем в виде одной процедуры с параметром m, принимающим значения 1 или 2:
>procedure Exam2(m: integer);
>var
>n, i, y, num, max, k: integer;
>a: array[1..100] of integer;
>nums: array[1..10] of integer;
>begin
>CreateTask('Обработка сложных наборов данных');
>case m of
>1:
>begin
>TaskText('На вход подаются сведения об абитуриентах. В первой строке указывается',0,1);
>TaskText('количество абитуриентов {N}, каждая из последующих {N} строк имеет формат',0,2);