- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Описание языка PascalABC.NET - W Cat
Шрифт:
Интервал:
Закладка:
Добавим к нашей библиотеке вспомогательный массив фамилий из 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);
TaskText('(M<Год поступления> <Фамилия> <Номер школы>m)',0,3);
TaskText('Номер школы содержит не более двух цифр, годы лежат в диапазоне от 1990',0,4);
TaskText('до 2010. Для каждого номера школы, присутствующего в исходных данных,',0,5);
TaskText('определить связанный с ним минимальный год поступления (вначале указывать',0,0);
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 случайно выбранных номеров школ, после чего номера школ для исходного набора записей выбираются уже из этого набора номеров.
В любом задании, связанном с нахождением набора записей, обычно требуется отсортировать полученный набор. Задание должно быть сформулировано таким образом, чтобы обеспечить однозначный порядок вывода полученных данных. В частности, если поле, по которому выполняется сортировка (главный ключ сортировки), может содержать одинаковые значения, то обязательно следует указать дополнительное поле (подчиненный ключ сортировки), по которому надо сортировать записи с одинаковым главным ключом. При выводе отсортированных данных вначале надо располагать главный ключ, после него -- подчиненные ключи (если они имеются), затем -- остальные поля (такой порядок вывода принят во всех заданиях группы ExamTaskC).
Для упорядочивания результатов во втором задании вместо сортировки массива a по убыванию используется другой алгоритм, связанный с последовательным нахождением максимального элемента, выводом этого элемента и его порчей" (заменой его значения на 0). Обычная сортировка массива в данном случае не позволит получить требуемый набор данных, так как при перемене местами значений элементов в массиве a будет потеряна связь с номером школы (который определяется по индексу элемента). Заметим, что возможен и вариант получения упорядоченного набора данных с помощью сортировки, однако для этого надо использовать массив записей, полями которых являются максимальный год и номер школы.
Во втором задании результаты должны упорядочиваться по набору ключей: первый (главный) ключ -- максимальный год (сортируется по убыванию), второй (подчиненный) ключ -- номер школы (сортируется по возрастанию). Использованный нами способ упорядочивания обеспечивает автоматическую сортировку по подчиненному ключу, так как при поиске очередного максимума массив a перебирается по возрастанию индексов, и поэтому в результате находится номер первого максимального элемента.
Прочие фрагменты процедуры Exam2 дополнительных комментариев не требуют.

