- •Аннотация
- •Условия использования
- •Оглавление
- •Содержание
- •Только для взрослых
- •Десять лет спустя
- •Чему нас учат семья и школа?
- •Крошка сын к отцу пришел
- •Азбучные истины
- •Что я могу ещё сказать?
- •Благодарности
- •Детям до 16-ти
- •Глава 1 Путь далек у нас с тобою…
- •Компьютер
- •Компилятор
- •Личный багаж
- •Компьютерная литература
- •В здоровом теле – здоровый дух
- •Вместе весело шагать по просторам!
- •Повторение – мать учения
- •Соглашения
- •Итоги
- •Глава 2 Вместо теории
- •Миф о думающих машинах
- •Загадочные коды
- •Языки программирования и компиляторы
- •Следующий шаг –
- •Итоги
- •Глава 3 Консольный интерфейс
- •Что такое интерфейс?
- •Консольный интерфейс
- •Прикосновение к консольному интерфейсу
- •А почему не «окна»?
- •Итоги
- •Глава 4 Оружие – к бою!
- •Оружейный прилавок
- •Free Pascal
- •Настройка ярлыка
- •Free Pascal
- •Установка справочной системы
- •Обновление версий Free Pascal
- •Итоги
- •Глава 5 Программа номер один
- •Постановка задачи
- •Создание файла
- •Наполнение файла
- •Компиляция
- •Процедура вывода (печати)
- •Запуск программы
- •Итоги
- •Глава 6 Подготовка к следующему штурму
- •Ещё об исходных файлах
- •Управление окном редактора
- •Борьба с ошибками
- •Итоги
- •Глава 7 Развиваем успех
- •Операторы и разделители
- •Программа, стой!
- •Алгоритмы
- •Блок-схемы
- •Итоги
- •Глава 8 Постоянные и переменные
- •Константы
- •Идентификаторы
- •Переменные
- •Ввод и вывод данных
- •Итоги
- •А слабо?
- •Глава 9 Переменные: продолжение знакомства
- •Представьтесь, пожалуйста!
- •Из пустого в порожнее
- •Сцепление строк
- •Инициализация переменных
- •Типизированные константы
- •Итоги
- •А слабо?
- •Глава 10 Условный оператор
- •Стой! Кто идет?
- •Вопрос ребром
- •Пост номер один
- •Неполный условный оператор
- •Пост номер два
- •Итоги
- •А слабо?
- •Глава 11 Операторный блок
- •Операторные скобки
- •Красиво жить не запретишь
- •Комментарии
- •Итоги
- •Глава 12 Цикл с проверкой в конце
- •Подтянем дисциплину
- •Нанимаем репетитора
- •Вежливый часовой
- •Досрочный выход из цикла
- •Итоги
- •Глава 13 Правда и кривда
- •Есть ли жизнь на Марсе?
- •Информация и её мерило
- •Булевы переменные
- •Ввод и вывод булевых данных
- •Логические выражения
- •С высоты птичьего полета
- •Парад логических операций
- •Итоги
- •А слабо?
- •Глава 14 Дважды два – четыре
- •Поможем братьям нашим меньшим
- •Числа и действия с ними
- •Алгоритм экзаменатора
- •Экзаменатор, первый вариант
- •Итоги
- •А слабо?
- •Глава 15 Айда в Монте-Карло!
- •Куда ни глянь – то процедура, то функция!
- •Госпожа удача
- •Итоги
- •А слабо?
- •Глава 16 Делу время, а потехе час
- •Потемкинская лестница
- •Итоги
- •А слабо?
- •Глава 17 И вновь за парту
- •Цикл со счетчиком
- •Итоги
- •Глава 18 Аз, Буки
- •Символьный тип данных
- •Индексация
- •Длина строки
- •Распечатка строки
- •Итоги
- •Глава 19 Процедуры и функции: разделяй и властвуй
- •Снежный ком
- •Описание процедур
- •Процедуры с параметрами
- •Итоги
- •Глава 20 Процедуры: первый опыт
- •Мухи – налево, котлеты – направо!
- •Сверху вниз
- •Первые раны
- •Глобальные и локальные
- •Локально – это разумно!
- •Неподдающаяся строка
- •Итоги
- •Глава 21 Отладка
- •Отладчик
- •Жучки, вылезайте!
- •Ссылка на переменную
- •Итоги
- •Глава 22 О передаче параметров
- •Процедура обмена
- •Замена символов в строке
- •О передаче строк
- •Итоги
- •Глава 23 Функции
- •Объявление функции
- •Пример функции
- •Подсчет символов в строке
- •Возврат строк
- •Когда результат не важен
- •Неявная переменная Result
- •Итоги
- •Глава 24 Криптография
- •Секреты Юлия Цезаря
- •Суть проблемы
- •О кодировании символов
- •Чудесные превращения
- •Шифрование символа
- •Расшифровка символа
- •Итоги
- •А слабо?
- •Глава 25 Текстовые файлы
- •Файлы хорошие и разные
- •Формат текстовых файлов
- •Доступ к текстовым файлам
- •Чтение из файла
- •Последовательный доступ к файлу
- •Самореклама
- •Цикл с проверкой в начале
- •Итоги
- •Глава 26 Я не читатель, — я писатель!
- •Запись в текстовый файл
- •Пример записи в файл
- •Завершение шпионского проекта
- •Итоги
- •А слабо?
- •Глава 27 Дайте кораблю минутный отдых!
- •Ошибка ошибке рознь
- •Фатальные ошибки
- •«Простительные» ошибки
- •Опции компилятора
- •Обработка ошибок ввода-вывода
- •Директивы компилятора
- •Директиву – в студию!
- •Парад директив
- •Итоги
- •А слабо?
- •Глава 28 Редактор и справочная система
- •Небьющиеся окна
- •Буфер обмена
- •Справочная система
- •Итоги
- •Глава 29 Читайте по-новому
- •Полицейская база данных, версия 1
- •Полицейская база данных, версия 2
- •Итоги
- •Глава 30 Журнальная история
- •Статистика знает всё?
- •Строим планы
- •Барабаним по клавишам
- •Первый блин
- •Блин второй
- •Спецификатор ширины поля
- •«Развесные» числа
- •Итоги
- •Глава 31 Финал журнальной истории
- •Буква за буквой
- •Нелишняя предосторожность
- •Достройка программы
- •Испытание
- •Итоги
- •Глава 32 Порядковые типы данных
- •Типы данных: простые и сложные
- •Целое братство
- •Капля, переполняющая чашу
- •Инкремент и декремент
- •Диапазоны
- •Перечисления
- •Порядковые типы
- •Разумный контроль
- •Итоги
- •Глава 33 Вещественные числа
- •Изображение вещественных чисел
- •Вывод вещественных чисел
- •Типы вещественных чисел
- •Сравнение вещественных чисел
- •Типы данных пользователя
- •Совместимость и преобразование типов
- •Размеры переменных и типов данных
- •Итоги
- •Глава 34 Структура программы
- •Управляющие структуры
- •Структура программы
- •Структура процедур и функций
- •Обмен данными с подпрограммами
- •Встроенные процедуры и функции
- •Что дальше?
- •Итоги
- •А слабо?
- •Глава 35 Множества
- •В директорском кабинете
- •Первым делом, первым делом – оцифровка
- •Множества глазами математика
- •Числовые множества
- •Мощность множества, полные и неполные множества
- •Итоги
- •Глава 36 Множества в Паскале
- •Объявление множеств
- •Присвоение значений множествам
- •Операции с множествами
- •Сравнение множеств
- •Проверка на вхождение элемента в множество (операция IN)
- •Решение директорской задачи
- •Итоги
- •А слабо?
- •Глава 37 Ввод и вывод множеств
- •Вывод множества в текстовый файл
- •Ввод множества из текстового файла.
- •Директорская задача, первый вариант
- •Директорская задача, второй вариант
- •Итоги
- •Глава 38 Множества «в бою»
- •Активисты, шаг вперед!
- •Подвиг контрразведчика
- •В тридевятом царстве
- •Решето Эратосфена
- •Мелочь, а приятно
- •Итоги
- •А слабо?
- •Глава 39 Командная игра (массивы)
- •Снежная лавина
- •А где же волшебная палочка?
- •Массивы вокруг нас
- •Объявление массивов
- •Доступ к элементам (индексация)
- •Ввод и вывод массивов
- •Ошибки индексации
- •Итоги
- •Глава 40 Пристрелка на знакомых мишенях
- •Вопрос-ответ – добиваемся гибкости
- •Полицейская база данных – ускоряем поиск
- •Ещё раз о статистике
- •Итоги
- •Глава 41 По порядку, становись!
- •Пиратская справедливость
- •Пузырьковая сортировка
- •Электронная делёжка
- •Возвращение на футбольное поле
- •Итоги
- •Глава 42 Кто ищет, тот всегда найдет
- •Где эта улица, где этот дом?
- •Последовательный поиск
- •Двоичный поиск
- •Исследование двоичного поиска
- •Ах, время, время!
- •Логарифмы? Это просто!
- •Итоги
- •Глава 43 Сортировка по-взрослому
- •«Фермерская» сортировка
- •Быстрая сортировка
- •Процедура быстрой сортировки
- •О рекурсии и стеке
- •Алгоритмы, на старт!
- •Итоги
- •Глава 44 Строки
- •Строка – особый род массива
- •Укороченные строки
- •Операции со строками
- •Подсчет слов в строке
- •Контекстная замена
- •Итоги
- •Глава 45 Очереди и стеки
- •Вовочка в потоке событий
- •Танцевальный кружок
- •Скитания товарного вагона
- •Сортировочная горка
- •Итоги
- •Глава 46 Огромные числа
- •Сколько звезд на небе?
- •Сложение «в столбик» никто не отменял
- •Великая стройка
- •Длинная арифметика
- •Итоги
- •А слабо?
- •Глава 47 Системы счисления
- •Из тьмы веков
- •Число и его изображение
- •Десятичная система
- •Двоичная система
- •Шестнадцатеричная система
- •Другие системы счисления
- •Изображение числа в заданной системе счисления
- •Обратное преобразование
- •Итоги
- •Глава 48 Железная логика
- •Два взгляда на компьютерные «кирпичики»
- •Логические операции в регистрах
- •Сдвиги влево и вправо
- •Итоги
- •Глава 49 Сложные массивы
- •На поклон к Науке
- •Имперское строительство
- •Крестики-нолики
- •Итоги
- •А слабо?
- •Глава 50 Неспортивные рекорды (записи)
- •Кушать подано!
- •Записи
- •Второй тайм
- •Дополнительное время
- •Итоги
- •Глава 51 Указатели в море памяти
- •Погружение в оперативную память
- •«Планировка» памяти
- •Указатели, первое знакомство
- •Объявление указателей
- •Копирование указателей, пустой указатель
- •Сравнение и проверка указателей
- •Разыменование указателей
- •Нетипичный указатель
- •Примеры с указателями
- •Итоги
- •Глава 52 Динамические переменные
- •Аппетит является к обеду
- •Одолжите памяти немножко!
- •Выделение памяти
- •Освобождение памяти
- •Предупреждён – значит, вооружен
- •Итоги
- •Глава 53 Массив указателей
- •Базу данных – в кучу
- •Сортировка массива указателей
- •Итоги
- •А слабо?
- •Глава 54 Односвязные списки
- •Чудесное сочетание
- •Проблема курицы и яйца
- •Вяжем список
- •Распечатка списка
- •Поиск в несортированном списке
- •Сортированные списки
- •Поиск в сортированном списке
- •Итоги
- •Глава 55 Слова, слова, слова…
- •Частотный анализ текста
- •Слово за слово
- •Структура записи
- •Алгоритм
- •А слабо?
- •Глава 56 И снова очереди, и снова стеки…
- •Шутить изволите?
- •Танцуют все!
- •Итоги
- •Глава 57 Графомания
- •Видимое представление графа
- •Внутреннее представление графа
- •Ввод и вывод графа
- •Итоги
- •Глава 58 По графу шагом марш!
- •Империя номер два
- •Структура узла
- •В рассыпную!
- •Аты-баты
- •Итоги
- •Глава 59 Крупные проекты
- •О модулях и разделении труда
- •Модули
- •Дробление модуля – «смертельный» номер
- •Компиляция проекта
- •Инициализация модуля
- •Структура модуля
- •О совпадении имен
- •Сборочный цех
- •Фирменные библиотеки
- •Динамически загружаемые библиотеки (DLL)
- •Итоги
- •Глава 60 Мелкие хитрости
- •Включаемые файлы
- •Условная компиляция
- •Итоги
- •Глава 61 «Кубики» программиста (ООП)
- •Фокус-покус
- •Вместо паяльника
- •На трех китах
- •Инкапсуляция
- •Наследование
- •Приборостроение
- •Гражданское строительство
- •Динамические объекты
- •Полиморфизм
- •Сокрытие полей и методов
- •Итоги
- •Глава 62 Всё только начинается!
- •Крупицы мастерства
- •Программисты, на старт!
- •Приложение А Установка и настройка IDE Borland Pascal
- •Borland Pascal, состав дистрибутива
- •Borland Pascal
- •Установка
- •Организация рабочей папки
- •Создание и настройка ярлыка
- •Пробный запуск
- •Предварительная настройка
- •Русификация консольного окна
- •Turbo Pascal School Pak
- •Приложение Б Консольная программа в среде Delphi
- •Создание пустого консольного приложения
- •Настройка и сохранение консольного приложения
- •Русификация консольного приложения
- •Приложение В Особенности IDE Pascal ABCNet
- •Приложение Ж Директивы управления компиляцией
- •Приложение З Назначение пунктов меню
- •Приложение И Стандартная кодировка символов MS-DOS
- •Приложение К Некоторые встроенные процедуры и функции
- •Приложение М Пример олимпиадной задачи
- •Библиография
Глава 38 Множества «в бою»
Множества, множества... — заполучив столь острое оружие, удержимся ли не пустить его в ход? Вот ещё несколько задач, — мы изрубим их в капусту!
Активисты, шаг вперед!
Прежде всего, отдадим долги Семену Семеновичу. Мы обещали директору выявить разгильдяев, что отлынивают от кружков, и сдержали слово. Теперь найдем активистов, состоящих в нескольких кружках. Откуда подступиться к этой задаче?
Положим для простоты, что в школе лишь три кружка, их списки представлены множествами S1, S2 и S3. Выявить тех, кто состоит одновременно в кружках S1 и S2 легко, — достаточно найти пересечение S1*S2. Точно так же поступим с другими парами: S1 и S3, S2 и S3. Объединив все три пересечения, мы выявим интересующих нас школяров. Итак, решение задачи выразится формулой.
R := S1*S2 + S1*S3 + S2*S3;
Попадут ли в это множество ученики, состоящие во всех трех кружках? Если да, то, как их отделить от прочих? Придумайте, как выявить тех, кто состоит:
∙в трех кружках:
∙в двух кружках и не более;
∙только в одном из кружков.
Надеюсь, что с этим проектом, назовем его P_38_1, вы справитесь сами, желаю успеха!
Подвиг контрразведчика
Контрразведка некоторого государства обнаружила утечку информации из лабораторий секретного учреждения. Для поимки шпиона позвали сыщика Шерлока Ивановича Холмского. Первым делом, он попросил списки сотрудников лабораторий. Лаборатории именовались латинскими буквами: A, B, C и так далее, причем некоторые сотрудники допускались в несколько лабораторий. Шерлок Иванович оцифровал списки, заменив фамилии сотрудников их табельными номерами, то есть, уникальными числами. Затем сгруппировал эти числа по лабораториям и составил табл. 6.
268
Глава 38 Множества «в бою»
Табл. 6 – Исходные данные для «вычисления» завербованного сотрудника
|
Лабо— |
|
|
|
|
Номера сотрудников, допущенных в лабораторию |
|
|
||||||||||||||||||
|
ратория |
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
1 |
2 |
4 |
5 |
|
9 11 |
|
13 |
15 22 |
23 24 |
25 |
27 30 |
|
31 |
|
37 |
41 42 |
|
43 44 |
|
45 |
|||
|
A |
|
46 |
48 |
|
50 |
51 56 |
|
64 70 |
72 |
73 74 |
75 |
76 77 |
|
82 |
|
84 |
86 87 |
|
89 92 |
|
95 |
||||
|
|
97 |
98 101 102 103 104 105 106 107 108 111 113 116 117 118 124 125 127 |
|||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
|
|
130 132 133 134 138 143 144 145 147 149 150 |
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
16 |
21 |
|
22 |
23 24 |
|
25 26 |
27 |
28 29 |
31 |
33 35 |
|
37 |
|
39 |
41 44 |
|
47 49 |
|
50 |
||||
|
B |
51 |
52 |
|
54 |
55 56 |
|
57 59 |
61 |
62 65 |
66 |
69 70 |
|
71 |
|
72 |
77 78 |
|
79 81 |
|
83 |
|||||
|
84 |
85 |
|
91 |
92 93 |
|
94 95 |
96 |
98 100 101 103 107 108 109 112 113 115 117 |
|||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
118 119 121 122 124 129 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
1 |
3 |
5 |
9 |
12 19 |
22 |
25 33 |
34 41 42 |
46 50 |
52 |
55 |
56 57 |
58 59 |
61 |
||||||||||
|
C |
66 |
69 |
|
72 |
80 81 |
|
82 84 |
87 |
88 94 |
97 |
99 100 101 102 112 119 121 |
123 |
|||||||||||||
|
125 129 134 137 138 139 149 152 153 154 155 |
157 158 165 166 168 171 |
||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
|
|
172 180 184 185 190 193 194 198 199 205 213 |
216 220 |
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
5 |
6 |
7 |
8 |
|
9 10 |
|
11 |
12 13 |
14 16 |
18 |
21 22 |
|
23 |
|
24 |
27 28 |
|
29 30 |
|
31 |
|||
|
D |
|
32 |
34 |
|
35 |
38 40 |
|
41 42 |
43 |
44 45 |
46 |
47 48 |
|
51 |
|
52 |
53 54 |
|
55 57 |
|
58 |
||||
|
|
59 |
60 |
|
61 |
62 63 |
|
64 65 |
66 |
67 70 |
71 |
73 74 |
|
75 |
|
76 |
78 79 |
|
80 81 |
|
82 |
|||||
|
|
|
84 |
85 |
|
86 |
88 89 |
|
91 92 |
93 |
94 95 |
96 |
97 98 |
|
99 100 104 105 106 107 |
|||||||||||
|
|
|
108 111 112 113 115 116 117 118 119 120 |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
10 |
15 |
|
16 |
26 33 |
|
40 42 |
44 |
50 53 |
65 |
67 74 |
|
79 |
|
82 |
83 85 |
|
87 90 |
|
91 |
||||
|
E |
93 |
99 106 108 110 120 121 124 125 132 135 146 148 149 151 156 157 158 |
|||||||||||||||||||||||
|
163 166 168 169 171 175 183 184 189 195 197 |
205 206 207 216 220 221 |
||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
|
|
225 226 227 241 244 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
8 |
12 |
21 25 |
26 |
29 30 |
31 34 48 |
49 50 |
52 |
55 |
59 60 |
62 |
70 71 |
73 83 |
|||||||||||
|
|
|
85 |
90 |
|
91 |
92 93 |
|
94 96 |
97 |
99 100 102 103 104 105 106 108 119 121 122 |
|||||||||||||||
|
F |
124 127 128 130 132 141 142 144 156 160 165 166 169 171 173 176 179 |
||||||||||||||||||||||||
|
|
|
191 192 195 199 200 207 209 220 221 222 224 |
226 229 233 234 236 239 |
||||||||||||||||||||||
|
|
|
240 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
24 |
|
26 |
27 29 |
|
30 35 |
36 |
41 42 |
44 |
45 46 |
|
49 |
|
52 |
55 56 |
|
58 60 |
|
61 |
||||
|
G |
|
63 |
64 |
|
65 |
68 72 |
|
74 76 |
77 |
81 82 |
86 |
87 88 |
|
90 |
|
93 |
94 95 |
|
96 97 |
|
98 |
||||
|
|
100 101 102 107 108 109 112 113 114 115 117 120 123 127 132 133 135 |
||||||||||||||||||||||||
|
|
|
137 138 143 145 146 147 150 152 155 156 159 |
161 162 163 164 165 168 |
||||||||||||||||||||||
|
|
|
170 172 177 178 179 180 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
15 |
17 |
|
19 |
20 21 |
|
22 23 |
26 |
28 29 |
30 |
32 33 |
|
34 |
|
36 |
38 41 |
|
42 44 |
|
45 |
||||
|
|
|
46 |
48 |
|
49 |
52 57 |
|
60 62 |
65 |
66 68 |
73 |
74 77 |
|
78 |
|
83 |
84 85 |
|
88 89 |
|
90 |
||||
|
H |
|
91 |
92 |
|
95 |
96 97 |
|
98 99 100 101 102 103 104 107 |
108 115 116 118 127 |
||||||||||||||||
|
|
128 129 130 131 134 135 136 137 139 145 146 |
150 151 152 154 157 160 |
|||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
|
|
161 164 166 167 172 173 177 178 179 180 182 |
185 188 189 190 193 195 |
||||||||||||||||||||||
|
|
|
197 204 207 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Дальнейшее разбирательство показало, что секреты просачивались только из лабораторий A, D, G и H (в таблице они выделены серым). При этом секреты
269
Глава 38 Множества «в бою»
остальных лабораторий (B, C, E и F) остались нетронутыми. Это направило дедуктивную мысль в правильное русло.
«Очевидно, — рассуждал Шерлок Иванович, — шпионить может тот, кто допущен в «дырявые» лаборатории. Из этого круга исключим тех, кто работает в нетронутых лабораториях, иначе их секреты тоже стали бы известны». Рассудив так, Шерлок Иванович достал ноутбук, и через 30 минут агент был вычислен, — подозреваемым оказался сотрудник с номером 45. Установленная за ним слежка подтвердила подозрение, и шпион был задержан.
Слабо ли вам повторить подвиг контрразведчика? Воспроизведите программу, написанную Шерлоком Ивановичем, я подскажу вам только её первую строку:
{ P_38_2 – подвиг контрразведчика }
В тридевятом царстве
Это случилось на затерянном в океане материке, что носил на себе несколько царств-государств. Жители материка — те ещё скряги — тратили для названий своих стран всего по одной букве: A, B, C и так далее. И мы будем их так называть. Границами стран служили каналы, специально для того прорытые; каналы были пронумерованы. Некоторые страны выходили к океану, берега которого тоже были пронумерованы и служили границами.
Самым могущественным было царство A. Однако, ввиду его обширности и частых политических перемен, тамошний государь никак не мог уяснить точные границы своей страны. Он толком не знал даже ближайших соседей, — сведения были самыми разноречивыми. Когда терпение монарха лопнуло, он повелел своим инженерам запустить спутник, который бы исследовал границы и внес ясность в этот вопрос.
Слово царя — закон, и вскоре спутник кружился на орбите. С высоты ясно наблюдались берега океана и каналы, составлявшие границы царств. Рис. 87 показывает то, что «увидел» спутник. Буквами обозначены названия стран, а числами — участки границ. В центре континента темным цветом выделено обширное царство A. К нему примыкают несколько стран, отмеченные серым, — это его соседи. Страны, примыкающие к царству A уголками своих границ, соседями не считаются. Они и все прочие «не соседи» отмечены белым цветом, а вокруг — океан.
Увы, примитивная техника тех лет не смогла отправить на землю эту фотографию. Спутник передал лишь номера границ каждого государства в виде текстового файла, содержащего строчки чисел.
270
Глава 38 Множества «в бою»
|
1 |
|
|
2 |
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
H |
|
17 |
|
18 |
|
4 |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
16 |
|
28 |
|
B |
|
|
|
14 |
|
|
|
|
|
|||
|
|
|
|
|
29 |
|
C |
|
|
15 |
|
I |
|
|
19 |
||
|
|
32 |
|
|
|
|||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
13 |
27 |
|
|
|
|
|
20 |
5 |
|
|
31 |
|
A |
|
|||
|
G |
|
|
|
|
|
||
|
|
|
|
|
|
21 |
|
|
|
26 |
|
|
30 |
|
|
D |
6 |
12 |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
22 |
|
|
|
|
|
|
23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
E |
|
7 |
|
|
|
|
|
|
|
|
|
|
|
11 |
|
|
|
|
|
|
|
|
|
|
|
25 |
|
|
|
|
|
|
10 |
|
9 |
|
8 |
|
|
|
|
|
|
|
|
|
|
Рис. 87 – Вид на материк из космоса
Выдернув из принтера ещё теплую распечатку файла, первый министр примчался во дворец, протянул листок монарху и покорно припал к подножию трона. Царь встрепенулся, стал разглядывать бумажку, вертеть её так и сяк, и даже на зуб попробовал. Наконец терпение государя иссякло: «Болван, — обратился он к министру, — покажи тут наших соседей. Что? Не можешь? Так проваливай с глаз долой!». И смятая распечатка угодила в лицо министра. «А ведь хотел, как лучше…» — стучало в башке убегающего премьера. «А получилось, как всегда!»
— догнал его вопль взбешённого монарха.
Куда податься бедолаге? Разумеется, к самому умному — к придворному программисту. «Выручай, браток, я тебе премию выпишу!». Инженеры, создавшие спутник, тоже не остались в стороне и растолковали программисту суть проблемы. Расправив скомканную царской рукой бумагу, Ник — так звали придворного программиста — увидел вот что.
271
Глава 38 Множества «в бою»
29 21 30 31 32
17 18 19 29 28
3 4 5 20 19 18
6 7 22 21 20
8 9 25 24 23 22
10 11 26 30 23 24 25
12 13 15 27 26
14 1 2 17 16 15
16 28 32 31 27
Каждая строка этого файла, — объяснили инженеры, — перечисляет границы некоторого царства: первая строка — царства A, вторая — царства B и так далее. Имена стран в файле не указаны, но подразумевается их алфавитный порядок. Надо составить список стран, которые соседствуют с нашей страной A — первой в этом списке.
Друзья, отложите книгу и попытайтесь решить эту интересную задачу. В случае успеха, я похлопочу за вас при дворе!
А пока вы раздумываете, я исполню свой долг перед историей и покажу решение заморского коллеги. Ник сразу понял, что имеет дело с двумя видами множеств: множеством границ, обозначенных числами, и множеством стран, обозначенных буквами (вы помните, что страны именовались буквами?). Парень смекнул, что две страны соседствуют тогда, когда пересечение множеств их границ не пусто (это значит, что у них есть общие границы). Дальше его мысли устремились так быстро, что пальцы едва успевали тыкать по клавишам. Вот плод его труда.
{ P_38_3 – поиск стран–соседей |
} |
type TBoundSet = set of byte; |
{ множество границ } |
TStateSet = set of Char; |
{ множество стран } |
{––––– Распечатка множества стран (символов) –––––}
procedure WriteCharSet(var aFile: text; const aSet : TStateSet);
var c : char; |
|
begin |
|
for c:='A' to 'Z' do |
if c in aSet then Write(aFile, c:2); |
Writeln(aFile); |
|
end; |
|
272