×
Traktatov.net » Описание языка PascalABC.NET » Читать онлайн
Страница 247 из 252 Настройки

Добавление заданий повышенной сложности

Наша группа 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);