/
Author: Ускова О.Ф.
Tags: компьютерные технологии программирование языки программирования язык программирования паскаль
ISBN: 5-318-00553-5
Year: 2005
Text
Под редакцией
О. Ф. Усковой
'П№ @
Программирование
" паскаль
ЗАДАЧНИК
• для студентов и преподавателей
высших учебных заведений
• теоретические вопросы,
упражнения и задачи, задания
для самостоятельной работы
проектирование алгоритмов
и разработка программных
систем
•ОЙ
СЕРИЯ
С^ППТЕР
Под редакцией
О. Ф. Усковой
Программирование
.. .эЫИ паскаль
Допущено Министерством образования Российской Федерации
в качестве учебного пособия для студентов высших учебных заведений,
обучающихся по направлению подготовки бакалавров
и магистров «Информатика и вычислительная техника»
и по направлениям подготовки дипломированных специалистов
«Информатика и вычислительная техника»
и «Информационные системы»
С^ППТЕР
Москва • Санкт-Петербург - Нижний Новгород * Воронеж
Ростов-на-Дону * Екатеринбург * Самара
Киев - Харьков * Минск
2005
ББК 32.973-018я 7
УДК 681.3.06(075)
П78
Рецензенты:
Львович Я. Е., профессор, доктор технических наук, начальник Главного управления
образования Администрации Воронежской области, заслуженный деятель науки РФ
Сидоркин А. С., профессор, доктор физико-математических наук, проректор по научной работе
Воронежского госуниверситета
Денисова А. Л., профессор, доктор педагогических наук, зав. кафедрой Тамбовского
государственного технического университета
П78 Программирование на языке Паскаль: задачник / под ред. Усковой О. Ф. — СПб.:
Питер, 2005. — 336 с.: ил.
ISBN 5-318-00553-5
Эта книга представляет собой не просто задачник с набором примеров и упражнений различной
степени сложности. Основные цели предлагаемого учебного пособия — придать курсу программирования
научно обоснованный базис, сформировать на его основе определенную культуру проектирования и
разработки программ, структурировать соответствующим образом учебный процесс. Авторы старались
большую часть практических заданий посвящать не столько синтаксическим особенностям языка
программирования, сколько методам программирования, технологии проектирования алгоритмов и
разработки программных систем. Книга предназначена студентам и преподавателям вузов, а также всем,
кто хотел бы научиться программировать на языке Паскаль.
ББК 32.973-018я7
УДК 681.3.06(075)
ISBN 5-318-00553-5
© ЗАО Издательский дом «Питер», 2005
Краткое содержание
Введение .................................................. 13
Рекомендации читателю.......................................15
Глава 1. Числовые типы данных..............................19
Глава 2. Оператор присваивания, ввод и вывод информации....24
Глава 3. Логический тип....................................31
Глава 4. Условный оператор.................................35
Глава 5. Операторы цикла...................................40
Глава 6. Литерный тип......................................55
Глава 7. Перечислимый тип, ограниченный тип, оператор варианта.58
Глава 8. Регулярные типы данных............................69
Глава 9. Процедуры и функции...............................94
Глава 10. Рекурсивные подпрограммы....................... 108
•Глава 11. Строковый тип.................................. 116
Глава 12. Записи, оператор присоединения................. 121
Глава 13. Множества...................................... 135
Глава 14. Файлы...........................................145
Глава 15. Динамические структуры данных.................. 158
Приложение 1. Ответы и решения............................ 169
Приложение 2. Задачи по информатике, предлагавшиеся
на олимпиадах прошлых лет.................................280
Приложение 3. Интегрированная инструментальная среда
Turbo Pascal (Borland International).......................311
Приложение 4. Зарезервированные слова Turbo Pascal 7.0.321 Приложение
5. Комбинации клавиш быстрого управления
в среде Turbo Pascal.......................................324
Приложение 6. Некоторые сообщения об ошибках
периода компиляции.........................................328
Литература..................................................332
Содержание
Введение...............................................13
Структура книги........................................13
От издательства........................................14
Рекомендации читателю................................. 15
Вы получили задачу.................................... 15
Решение задачи........................................ 16
Чтобы программа была наглядной........................ 17
Глава 1. Числовые типы данных..........................19
Теоретические вопросы..................................19
Упражнения.............................................21
Глава 2. Оператор присваивания,
вводи вывод информации...........,....................24
Теоретические вопросы..................................24
Упражнения, задачи, линейные программы .................26
Задания для самостоятельной работы.....................28
Глава 3. Логический тип................................31
Теоретические вопросы..................................31
Упражнения.............................................32
Линейные программы.....................................33
Глава 4. Условный оператор.............................35
Теоретические вопросы..................................35
Упражнения.............................................35
Задания для самостоятельной работы..................... 38
8 Содержание
Глава 5. Операторы цикла.................................. 40
Теоретические вопросы......................................40
Упражнения, задачи, программы............................. 42
Задания для самостоятельной работы.........................50
Глава 6. Литерный тип......................................55
Теоретические вопросы......................................55
Упражнения, задачи, программы..............................56
Глава 7. Перечислимый тип, ограниченный тип,
оператор варианта.........................................58
Перечислимый тип...........................................58
Теоретические вопросы............................... 58
Упражнения............................................59
Ограниченный тип...........................................61
Теоретические вопросы.................................61
Упражнения........................................... 61
Оператор варианта..........................................62
Теоретические вопросы.................................62
Упражнения............................................63
Упражнения, задачи, программы..............................65
Глава 8. Регулярные типы данных ...........................69
Теоретические вопросы......................................69
Векторы. Задачи, программы................................ 70
Задания для самостоятельной работы....................80
Матрицы................................................... 82
Задачи, упражнения....................................82
Глава 9. Процедуры и функции...............................94
Теоретические вопросы......................................94
Задачи, программы..........................................95
Задания для самостоятельной работы....................... 105
ГлаваЮ. Рекурсивные подпрограммы..........................108
Теоретические вопросы.................................... 108
Задачи, программы........................................ 108
Задания для самостоятельной работы....................... 111
Содержание 9
Глава 11. Строковый тип....................................116
Теоретические вопросы..................................... 116
Задачи, программы......................................... 117
Глава12. Записи, оператор присоединения....................121
Теоретические вопросы..................................... 121
Задачи, упражнения, программы............................. 122
Глава13. Множества......................................... 135
Теоретические вопросы..................................... 135
Упражнения, задачи, программы............................. 136
Задания для самостоятельной работы........................ 142
Глава14. Файлы.............................................145
Теоретические вопросы..................................... 145
Упражнения, задачи, программы............................. 146
Задания для самостоятельной работы........................ 154
Описание файлов....................................... 154
Варианты заданий...................................... 155
Глава15. Динамические структуры данных.....................158
Теоретические вопросы..................................... 158
Задачи, решения........................................... 159
Списки............................................... 159
Двоичное дерево...................................... 163
Дерево двоичного поиска............................... 164
Очередь.............................................. 164
Стек................................................. 165
Задания для самостоятельной работы........................ 167
Приложение 1. Ответы и решения ............................169
Глава 1. Числовые типы данных............................. 169
Упражнения........................................... 169
Глава 2. Оператор присваивания, ввод и вывод информации... 170
Упражнения, задачи, линейные программы............... 170
10 Содержание
Глава 3. Логический тип.................................... 171
Упражнения............................................ 171
Линейные программы.................................... 172
Глава 4. Условный оператор................................. 173
Упражнения............................................ 173
Глава 5. Операторы цикла................................... 175
Упражнения, задачи, программы......................... 175
Глава 6. Литерный тип...................................... 184
Упражнения, задачи, программы .:...................... 184
Глава 7. Перечислимый тип, ограниченный тип, оператор варианта. 188
Перечислимый тип. Упражнения.......................... 188
Оператор варианта. Упражнения......................... 188
Упражнения, задачи, программы......................... 191
Глава 8. Регулярные типы данных..........................:..... 192
Векторы. Задачи, программы............................ 192
Матрицы. Задачи, упражнения............................201
Глава 9. Процедуры и функции................................208
Задачи, программы......................................208
Глава 10. Рекурсивные подпрограммы..........................216
Задачи, программы................................... 216
лава 11. Строковый тип......................................218
Задачи, программы.................................... 218
Глава 12. Записи, оператор присоединения....................224
Задачи, упражнения, программы..........................224
Глава 13. Множества........................................ 232
Упражнения, задачи, программы..........................232
Глава 14. Файлы.............................................244
Упражнения, задачи, программы........................ 244
Глава 15. Динамические структуры данных.....................255
Списки. Задачи, решения............................... 255
Двоичное дерево. Задачи, решения.......................264
Дерево двоичного поиска. Задачи, решения...............265
Очередь. Задачи, решения.............................. 267
Стек. Задачи, решения..................................271
Приложение 2. Задачи по информатике, предлагавшиеся
на олимпиадах прошлых лет..................................280
Задачи для самостоятельного решения.........................280
Задача 1. «Абракадабра»................................280
Задача 2. «Divide et impkra!»...........................281
Задача 3. «Два конвейера».............................. 281
Задача 4. «Антивирус»...................................282
Задача 5. «Новые гвозди»................................283
Задача 6. «Телефонная связь»............................284
Задача 7. «Функция».................................... 284
Задача 8. «Считалка»....................................284
Задача 9. «Многоугольник»...............................285
Задача 10. «Метеостанции»...............................285
Задача 11. «Скобки».....................................286
Задача 12. «Криптограмма».............................. 286
Задача 13. «Зоны».......................................287
Задача 14. «Лист бумаги»................................288
Задача 15. «Система счисления»..........................288
Задача 16. «Электрическая цепь».........................289
Задача 17. «Точки»......................................290
Задача 18. «Выражение»..................................290
Задачи с комментариями и решениями...........................291
Задача 1. «Монеты»......................................291
Задача 2. «Функция».....................................293
Задача 3. «Лабиринт»....................................294
Задача 4. «Прямоугольники»..............................301
Задача 5. «Трубопровод».................................303
Задача 6. «Телебашня»...................................306
Приложение 3. Интегрированная инструментальная среда
Turbo Pascal (Borland International)........................311
Экранный редактор............................................312
Клавиши перемещения курсора.............................313
Клавиши поиска фрагментов...............................313
Клавиши вставки и удаления информации...................314
Клавиши работы с блоками текста.........................314
Прочие клавиши..........................................315
Отладка и тестирование.......................................315
Ошибки обращения к данным...............................316
Ошибки вычисления.......................................316
Ошибки при сравнении....................................316
12 Содержание
Ошибки интерфейса................................317
Исправление ошибок...............................317
Использование отладчика..........................317
Приложение 4. Зарезервированные слова
Turbo Pascal 7.0.................................. 321
Приложение 5. Комбинации клавиш быстрого управления
в среде Turbo Pascal................................324
Приложение 6. Некоторые сообщения об ошибках
периода компиляции...................................328
Литература......................................... 332
Введение
Развитие и широкое распространение информационных технологий, основанных
на применении компьютеров, сопровождается изданием весьма значительного
числа учебных и методических пособий по различным направлениям информаци-
онных и коммуникационных технологий, а также отдельным приложениям. Про-
граммирование, как особый род деятельности человека, по-прежнему остается важ-
нейшей составляющей в подготовке высококвалифицированных специалистов в
сфере компьютерных наук. Выработка определенного стиля профессионального
проектирования и разработки программной системы базируется на ряде основопо-
лагающих принципов, сформулированных в работах Э. Дейкстры, Н. Вирта и других
авторов. В разные исторические периоды на основе этих принципов формирова-
лись соответствующие парадигмы программирования. Дать курсу программиро-
вания научно обоснованный базис, сформировать на его основе определенную куль-
туру проектирования и разработки программ, структурировать соответствующим
образом учебный процесс — таковы основные цели предлагаемого учебного посо-
бия. Авторы старались большую часть практических заданий посвящать не столько
синтаксическим особенностям языка программирования, сколько методам про-
граммирования, технологии проектирования алгоритмов и разработки программ-
ных систем. В этом аспекте предлагаемая книга существенно отличается от всех
практических пособий по программированию, изданных к настоящему времени.
Структура книги
Книга состоит из пятнадцати глав.
Каждая глава начинается с раздела, содержащего теоретические вопросы. Если
вы затрудняетесь ответить на них, мы рекомендуем обратиться к любому справоч-
ному или учебному пособию по программированию на языке Паскаль.
Далее следует раздел, в котором приведены упражнения и задачи. Некоторые
задачи сопровождаются программами на языке Паскаль. Мы рекомендуем не спе-
шить заглядывать в решение, а попытаться сначала самостоятельно составить про-
грамму и только после этого сравнить ее с приведенной в книге. Все задачи и упраж-
нения, кроме тех, для которых даны решения, помечены специальными символами,
идентифицирующими уровень сложности:
— легкие задачи;
♦ — задачи средней сложности;
* — сложные задачи.
14 Введение
Последний раздел каждой главы содержит задания для самостоятельной рабо-
ты, которые необходимо выполнить на компьютере.
Ответы на задачи вы найдете в первом из приложений, приведенных в конце
книги. В других приложениях приводятся примеры задач, предлагавшихся на раз-
нообразных олимпиадах по информатике (для некоторых задач приведены реше-
ния-программы победителей олимпиад), описание интегрированной инструмен-
тальной среды Turbo Pascal (Borland International), зарезервированные слова Turbo
Pascal 7.0, описание клавиш быстрого вызова в среде Turbo Pascal и сообщения
о некоторых ошибках компилятора.
От издательства
Ваши замечания, предложения, вопросы отправляйте по адресу электронной
почты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Подробную информацию о наших книгах вы найдете на web-сайте издатель-
ства http://www.piter.com.
Рекомендации читателю
Вы получили задачу
Прежде чем писать программу, уясните себе смысл задачи.
Какова цель программы?
Какие данные она требует?
& Откуда поступают данные?
& Какие результаты должна выдавать программа?
То есть определите внешние спецификации программы.
Не существует какого-то фиксированного набора правил, который можно было
бы рекомендовать при разработке программ и выполнение которого обеспечило
бы составление правильной программы. Чаще всего люди, создающие програм-
мы, стараются представить их в таком виде, который обеспечивал бы наибольшие
удобства в модификации программы на этапах тестирования и отладки. Исходя-
щая из этого технология программирования направлена на создание удобочитае-
мых, высокоэффективных, легко модифицируемых программ и в ряде случаев по-
зволяет доказывать правильность их разработки.
Когда задача четко понята, можно приступать к составлению проекта програм-
мы на алгоритмическом языке или псевдокоде.
Проектирование осуществляется как последовательность шагов, направленных
на решение задачи. Сначала набрасывается план решения задачи в общем виде.
Далее описание составляется более детально. Большие этапы разбиваются на бо-
лее мелкие. В ходе этого процесса выделяются относительно независимые части —
модули, и дальнейшее уточнение каждого такого модуля может производиться тем
же методом пошаговой разработки «сверху вниз».
$ На каждом шаге детализации программа должна оставаться структурированной.
& Каждый модуль должен быть достаточно простым и обозримым.
& Делайте наглядными связи между модулями.
& Каждый модуль должен выполнять единственную функцию, но делать это
хорошо.
$ После того как проект программы готов, переведите ее на язык Паскаль.
аз Никаких трюков и заумного программирования — пишите программы просто.
S3 Используйте содержательные обозначения.
& Сдвигайте строки так, чтобы выделить логическую структуру программы.
16 Рекомендации читателю
При разработке алгоритма решения задачи вам могут помочь общие правила
решения, сформулированные, например, в одном из лучших руководств по реше-
нию задач — книге Пойа «Как решать задачу». Применительно к проектированию
программ схема метода Пойа может быть представлена следующим образом.
Решение задачи
1. Поймите задачу, для этого:
а) изучите данные;
Ь) изучите неизвестные;
с) определите, достаточно ли данных для решения;
d) проверьте, не противоречивы ли они.
2. Составьте план. Обратите внимание на следующие моменты:
а) цель решения задачи;
Ь) методы проектирования, которые будут использоваться;
с) вспомните, встречалась ли вам уже такая задача;
d) подумайте, не знаете ли вы близкой задачи, алгоритмом решения которой
можно воспользоваться;
е) определите, можете ли вы решить более узкую или аналогичную задачу;
f) установите, можете ли вы решить часть задачи.
3. Выполните план:
а) следуйте своему плану решения задачи;
Ь) проверяйте правильность каждого шага.
4. Проанализируйте решение:
а) определите, все ли данные вы использовали;
Ь) проверьте правильность решения;
с) подумайте, можете ли вы воспользоваться полученным результатом или
примененным методом при решении других задач;
d) проверьте вводимые данные на обоснованность и правдоподобие;
е) выведите результаты в удобной для чтения форме;
f) помните, что программа должна быть самодокументируемой, то есть каж-
дому модулю должно предшествовать словесное описание цели и внешних
спецификаций, а комментарии должны пояснять смысл операторов на со-
держательном уровне в терминах постановки задачи.
Об отладке и тестировании создаваемых программ необходимо помнить, начи-
ная с первых шагов разработки алгоритма решения задачи. Поэтому приведем здесь
некоторые рекомендации по тестированию программ.
£ Перед тестированием программы убедитесь в том, что в тексте программы всем
переменным присваиваются значения. Экспериментальное тестирование про-
грамм может служить доказательством наличия ошибок, но никогда не дока-
жет их отсутствия.
Чтобы программа была наглядной 17
$ Тесты нужно разрабатывать таким образом, чтобы проверить, корректно ли
реагирует программа не только на допустимые входные данные, но и на заведомо
неправильные.
« Тестирование производится согласно общему принципу «сверху вниз». На каж-
дом этапе функции модулей более низкого уровня моделируются упрощенными.
$ Хорошим считается текст, который имеет высокую вероятность обнаружения
ошибки.
« Ив заключение приведем еще один практический совет: не исправляйте пло-
хую программу — лучше перепишите ее.
Чтобы программа была наглядной
Остановимся на некоторых деталях написания программы, которые помогут об-
легчить дальнейшую работу с ней.
1. При именовании величин идентификаторы следует выбирать так, чтобы они
отражали смысловое значение этих величин. В дальнейшей работе это изба-
вит автора программы или ее пользователя от необходимости всякий раз на-
прягать память для выяснения, что же этот идентификатор обозначает. Вме-
сте с тем выбираемое имя не должно быть слишком длинным.
2. Программу следует разумно снабдить комментариями. Прежде всего, тексту
программы должен предшествовать комментарий, дающий краткое, но пол-
ное описание ее функционального назначения, входных и промежуточных
величин и их спецификаций, характеристики алгоритма, фамилии автора и
его координат. Комментарии бывают особейно полезными при описании и
использовании процедур: краткое описание их действий и характеристика
формальных параметров сделают более понятным назначение процедуры.
3. Основой при разработке программы должен служить структурный подход,
базирующийся на методе последовательного уточнения действий и на ис-
пользовании управляющих структур трех типов: следования, ветвления и по-
вторения. На начальных этапах проектирования допускается использование
абстрактных операторов, последующая детализация которых приводит к со-
зданию процедур. Не следует спешить сразу писать программу в терминах
операторов Паскаля: уточнение действий должно быть постепенным. Это важ-
но и потому, что на каком-то этапе может обнаружиться ошибка в выборе
действия на предыдущем шаге, тогда придется переработать детализацию
только этого действия. В противном случае пришлось бы «ворошить», а иног-
да просто заново разрабатывать всю программу.
Расположение текста программы на экране или на бумаге должно быть та-
ким, чтобы подчеркивался структурный характер программы: следует выде-
лять, например, отступом от левого края строки те операторы или группы
операторов, которые образуют вложенную часть другого составного опера-
тора. Например:
{ пример 1 }
while А<0 do
begin
18 Рекомендации читателю
х:=х+1;
УДАЛИТЬ(В.х)
end;
{ пример 2 }
if prise and (i<=N)
then
begin
1
ВКЛЮЧИТЬ(А,1)
end
else 1:=1+2;
Приступая к очередному шагу уточнения действий, следует продумывать сра-
зу несколько вариантов алгоритма, во-первых: для того, чтобы выбрать наи-
более оптимальный или подходящий; во-вторых, на случай, если придется
внести изменения в проект программы на предыдущем шаге детализации.
4. Программы следует писать сразу с защитой от ошибок при вводе. Это дости-
гается проверкой вводимого значения, а при ошибочном вводе параметра —
запросом повторного ввода.
И ввод исходных данных, и вывод результата и промежуточных величин обя-
зательно должны сопровождаться печатью пояснительного текстового сооб-
щения: при вводе это должен быть запрос, для каких величин требуется зна-
чение, при выводе — значения каких величин выводятся. В последнем случае
предметом особого внимания должно стать размещение выводимых значе-
ний на экране или листе бумаги. Выводимые значения размещаются так, что-
бы обеспечивалось наилучшее их восприятие, дабы было понятно, какие
из них имеют более важное значение, а какие второстепенное.
5. Набирая программу на клавиатуре терминала ЭВМ, следует иметь в виду,
что буквы и символы, имеющие сходные изображения на экране на разных
раскладках клавиатуры (например, буквы А в латинской и русской расклад-
ках), по-разному представляются в памяти компьютера. В большинстве слу-
чаев замена одного символа другим, сходным с ним, приводит в дальней-
шем к сообщениям компилятора об ошибках. Обращаем ваше внимание на
следующие попарно похожие символы: А-А, В-В, Е-Е, К-К, М-М, 0-0
(цифра ноль изображается с перечеркиванием), Р-Р, С-С, Т-Т, Х-Х.
Рекомендуем также для большей наглядности размещать по возможности мень-
шее число операторов на одной строке.
Глава 1
Числовые типы данных
Теоретические вопросы
1. Существуют ли ограничения на множество целых чисел, используемых в язы-
ке? Если да, то чем они определяются?
2. Перечислите основные операции, определенные для данных целочисленно-
го типа.
3. Перечислите основные стандартные функции, определенные для данных це-
лочисленного типа. Каков тип результата, возвращаемого каждой функцией?
4. Для представления кйкой информации в языке Паскаль используется тип
real?
5. В чем отличие двух типов числовых данных real и integer?
6. Какие две формы записи вещественных чисел используются в языке Пас-
каль?
7. Поясните понятия диапазона и точности как важных характеристик вещест-
венных переменных?
8. Перечислите основные стандартные функции, определенные для данных ве-
щественного типа. Каков тип результата, возвращаемого каждой функцией?
9. Что называется мантиссой числа?
10. Что называется порядком числа?
И. Какие стандартные тригонометрические функции, реализованные в языке
Паскаль, вы знаете?
12. Почему в языке Паскаль аргумент стандартной функции всегда записывается
в скобках?
13. Почему знак умножения всегда выписывается явно?
14. Можно ли аргумент стандартной тригонометрической функции задать в гра-
дусах?
15. К каким типам числовой информации применимы функции sqr(x) и sqrt(x)?
16. Для какого типа данных определены операции +,-,*,/?
20 Глава 1. Числовые типы данных
17. Назовите две операции, которые определены для данных целого типа, но не
определены для данных вещественного типа?
18. Назовите операции отношения, которые применимы к данным вещественного
типа.
19. Назовите операции отношения, которые применимы к данным целого типа.
20. Каков приоритет выполнения арифметических операций?
21. К данным какого типа применимы функции trunc(x) и round(х)?
22. Почему запись формул на языке Паскаль линейна?
23. Почему в языке Паскаль факториал от 9 нельзя записать как 9! ?
24. Назовите функцию, которая вычисляет модуль вещественного числах.
25. Какая функция возвращает натуральный логарифм числа х?
26. К каким типам данных применимы арифметические операции di v и mod?
27. Что делает стандартная функция trunc(x)?
28. Каков результат работы стандартной функции round(х)?
29. При каких значениях аргумента стандартные функции trunc(x) и round(x) воз-
вращают одинаковый результат?
30. Для каких чисел определены стандартные функции succ(x) и pred(x)?
31. При каком значении аргумента х не определен результат работы функции
1п(х)?
32. Пусть а и b — два вещественных числа, ос и Р — их машинное представление.
Верно ли, что а < Р, если а < Ь. Если нет, объясните почему.
33. Чему равен результат вычисления выражения (a div b)*b+(a mod Ь)?
34. Как записать величину основания натурального логарифма, если вы забыли
цифры этого числа?
35. Каков результат вычисления выражения s1n(3.141592*х/180)?
36. Может ли пробел входить в число символов, составляющих идентификатор?
37. Приведите пример унарной арифметической операции.
38. Чему равен результат целочисленного деления, если делимое меньше дели-
теля?
39. Приведите примеры составных специальных символов.
40. Как называются слова, имеющие фиксированное начертание и раз и навсег-
да определенный смысл?
41. Из каких символов может состоять идентификатор?
42. Как называются элементы данных языка, значения которых установлены в
описательной части программы и не изменяются в процессе ее выполнения?
43. Можно ли ключевые слова использовать в качестве имен переменных?
44. Как называются величины, которые могут менять свое значение в процессе
выполнения программы?
45. Можно ли при записи арифметических выражений на языке Паскаль исполь-
зовать фигурные скобки?
Упражнения 21
46. Можно ли при записи арифметических выражений на языке Паскаль исполь-
зовать квадратные скобки?
47. Какие функции преобразуют вещественный аргумент в целое число?
48. Что такое «выражение», «операция», «операнд»?
49. Как называется некоторый конечный набор операций (действий, предписа-
ний), выполнение которых одна задругой за конечное число шагов приводит
к намеченной цели (искомому результату, решению поставленной задачи)?
50. Можно ли при записи идентификаторов использовать буквы русского алфа-
вита?
Упражнения
1. Ниже приведены два столбца чисел. Подберите из правого столбца соответ-
ствующее представление на языке Паскаль для чисел левого столбца.
7,9985
п
-1/3
106
-1/10000000
32782,82
<2~
-0,3(3)
6!
LXXIV
10
74
1Е6
О.3278282Е5
720
1*2*3*4*5*6
74
7.9985
.-0.3333
-1Е-7
0.1414Е1
1Е1
3.1416
1.4142
2. Запишите на языке Паскаль следующие формулы:
-b + ylb2 -4ас
а) -------z-------;
2а
b) {[(ax-Z>)x + c]x+d}x-e;
sin2 (х) — cos2 (х)
__^|cosx|+sinx
d)
22 Глава 1. Числовые типы данных
0 y}p(j>-а)2(р-ь){р-с)2;
107+Vlg4!
♦ j) + ln(l + e)log2tg2.
3. Запишите на языке Паскаль следующие формулы:
a) 21og2-^;
b) arcsinx;
с) sin 15° cos 15°;
d) х4 * * * 8;
е) х250;
) ) при x=l. y=-2:
4. Вычислите значение выражений:
а) ( sin ( sqr ( х ) - 1 ) + 2*abs ( у ) / cos ( 2 + у
b) trunc ( 6.9 ) - trunc ( 6.2 ) - 1:
с) round ( 1.9 ) + round ( 1.2 ) + 1;
d) trunc ( -1.9 ) + trunc ( -1.9.) + abs ( 3 );
e) round ( 0.5 ) + round ( -0.5 ) + abs ( -3 ):
f) 3.1415 - trunc ( 3.1415 );
g) 30 div 6 - 30 mod 5 + succ ( 2 );
h) 3 * 7 div 2 mod 7 / 3 - trunc ( sin ( 1 ) );
i) succ ( round (17 / 4) ) - pred ( 3 );
j) 4 * arctan ( 1 ) - 1 + abs ( -1 ).
Упражнения 23
5. В выражении a/b*c/d*e/f*h расставьте скобки так, чтобы
выражению со скобками соответствовала дробь
а
6. Определите тип следующих числовых выражений:
а) 1 + sqrt ( 4 ) + sin ( 0 ) + 0.0;
b) sqr ( 2.0 ) + sqrt ( 121 ) - succ ( -11 );
с) pred ( 32700 ) + round ( 10 / 3 );
d) trunc ( sin ( 0 ) ) + 1;
e) succ ( round ( 5 / 2) - pred ( 3 ) ).
Глава 2
Оператор присваивания,
ввод и вывод информации
Теоретические вопросы
1. Допустимо ли присваивание переменной вещественного типа значения вы-
ражения целого типа?
2. Допустимо ли присваивание переменной целого типа значения выражения
вещественного типа?
3. Как называются алгоритмы, в которых используется только структура сле-
дования?
4. С какого служебного слова начинается программа, написанная на языке Пас-
каль?
5. Каким символом заканчивается текст программы?
6. Из каких двух основных частей состоит программа?
7. Какое служебное слово используется для описания раздела констант?
8. Каким служебным словом начинается раздел описания переменных?
9. Чем вызвана необходимость использования комментариев в программе?
10. Где в программе можно написать комментарий?
11. Какими символами ограничивается текст комментария?
12. Какое влияние оказывает комментарий на выполнение программы?
13. Какая часть блока, описательная или исполнительная, является обязатель-
ной?
14. Приведите пример самой короткой программы.
15. Верно ли, что в программе, на языке Паскаль надо описывать все используе-
мые переменные?
16. Какой из перечисленных разделов обязателен в программе:
а) раздел van;
b) раздел const;
Теоретические вопросы 25
с) раздел type;
d) раздел begin ... end;
е) раздел label?
17. Для чего используется указание типа величины?
18. Какие значения имеют переменные в начале выполнения программы?
19. Можно ли в процессе выполнения программы изменять значения констант?
20. Как называется процесс передачи информации от внешнего носителя в опе-
ративную память?
21. Как называется процесс передачи данных из основной памяти во внешнюю?
22. Назовите внешние носители информации.
23. В какой стандартный файл программа на языке Паскаль помещает результат
обработки данных?
24. Какое устройство назначено стандартному файлу Input?
25. Какое устройство назначено стандартному файлу Output?
26. Назовите процедуру ввода информации.
27. Каково назначение процедур write и writein?
28. Следующую последовательность операторов ввода замените одним операто-
ром: read(xl); read(y2): read(x3); read(x4).
29. Одинаков ли результат выполнения операторов read(x) и read(Input. х)?
30. Сколько аргументов могут иметь процедуры read и readln?
31. Верно ли, что аргументом процедуры read может быть список переменных
и элементы этого списка разделяются запятыми?
32. Сколько процедур read может быть в программе?
33. Чем различаются процедуры read и readln?
34. Пусть в программе есть процедура read(xl, х2..хп). Должны ли пере-
менные списка ввода иметь одинаковый тип?
35. Как набираются на клавиатуре значения переменных xl, х2, ..., хп для опера-
тора read (xl, х2.....хп)?
36. Какой оператор используется для того, чтобы вводимые данные читались
с новой строки?
37. Может ли быть пустым список ввода?
38. Надо ли описывать тип переменных, входящих в список ввода?
39. Какое соответствие должно быть между типами переменных списка ввода
и типами данных, вводимых с терминала?
40. С помощью каких стандартных процедур осуществляется вывод на дисплей?
41. Замените следующую последовательность операторов вывода одним опера-
тором: write(’Зарплата отца = '); write(z): writein.
42. Может ли элементом списка вывода быть константа?
43. Можно ли с помощью процедуры write напечатать значение выражения?
26 Глава 2. Оператор присваивания, ввод и вывод информации
44. Что будет напечатано в результате работы процедуры write(arctan(l))?
45. Пусть I — величина целого типа. Что напечатается в результате работы сле-
дующего фрагмента программы:
I := 123:
write(I. I. I):
write(I-12);
46. Какова ширина поля десятичного представления величины х при печати в ре-
зультате выполнения оператора wri te (х: 7) ?
47. Чем отличаются действия процедур write и writein?
48. В чем состоит действие процедуры wri tel п без параметров?
49. Для чего в прбцедурах вывода write и writein определяется ширина поля
вывода?
50. Какие обозначения используются в форматах вывода?
Упражнения, задачи, линейные программы
♦ 1. Задайте в виде оператора присваивания следующие действия:
а) переменной вещественного типа х присвоить значение, равное полусум-
ме значений аиЬ;
Ь) удвоить значение переменной х;
с) переменной целого типа х присвоить значение на 1 меньшее исходного;
d) сменить знак у переменной х на противоположный.
2. Дано целое положительное число п. Присвойте переменной т последнюю
цифру этого числа.
3. Пусть р и п — целые положительные числа и п - 123 456. Чему равно зна-
чение р после выполнения оператора присваивания:
а) р:= n div 100 mod 10;
b) р:= n div 100 mod 10 + n mod 10.
4. Пусть m — целое число, x - 123,45. Каков результат выполнения оператора
присваивания:
a) m := trunc ( х * 1000 ) mod 10 + round ( х * 100 ) mod 10;
b) m := pred ( round ( x * 100 ) ) mod 10 + succ ( round ( x * 1000 ) ) mod 10.
♦ 5. Целой переменной x присвойте значение суммы цифр заданного трехзначного
числа.
6. Определите число, полученное выписыванием в обратном порядке цифр за-
данного целого трехзначного числа х. Присвойте это число переменной т.
♦7. Пусть идет k-я секунда суток. Определите, сколько целых часов h и целых
минут т прошло к этому моменту.
*8. Пусть п — целое число от 1 до 365. Присвойте целой переменной т значение
1,2,..., 6 или 7 в зависимости от того, на какой день недели (понедельник,
Упражнения, задачи, линейные программы 27
вторник, ...» субботу или воскресенье) приходится n-й день невисокосного
года, в котором 1 января — среда.
9. Поменяйте местами значения вещественных переменных х и у.
10. Поменяйте местами значения целых переменных т и и, не используя допол-
нительные переменные.
И. Пусть даны длины сторон треугольника. Вычислите его площадь.
12. Вычислите расстояние между двумя точками на плоскости с данными коор-
динатами (х1,у1) и (х2, у 2).
13. Вычислите дробную часть среднего арифметического и дробную часть сред-
него геометрического трех заданных чисел.
14. Найдите сумму п членов арифметической прогрессии, первый член которой
равен а, а разность равна d.
15. Вычислите значение первой производной функции л/1 в заданной точке а при
заданном значении п.
16. Введите положительное число а. Вычислите:
. а) площадь равностороннего треугольника со стороной а;
Ь) площадь квадрата со стороной а\
с) площадь круга, радиус которого равен а,
17. Вычислите длину окружности, площадь круга, объем шара заданного радиуса.
18. Пусть даны числа а, 6, у. Найдите площадь треугольника, две стороны которо-
пэ равны а и Ь, а угол между этими сторонами равен у. Считайте, что у — это:
а) радианная мера угла;
Ь) градусная мера угла.
19. Пусть даны четыре целых числа (hour, min, sec, time). Первые три из них (hour,
min, sec) — это время запуска ракеты в часах, минутах и секундах, четвертое
(time) определяет время полета в секундах. Найдите и напечатайте время воз-
вращения ракеты на землю.
20. Пусть дано натуральное число и, состоящее из шести цифр. Определите чис-
ло сотен и тысяч в нем.
21. Товар до деноминации (до 1 января 1998 года) стоил г рублей. Какова его
цена после деноминации (в рублях и копейках) при условии, что г > 10 ?
22. Определите f—угол (в градусах) между положением часовой стрелки в начале
суток и ее положением в h часов,т минут и s секунд ( 0 < h < 11, т > 0, 5 < 59 ).
23. Введите два вещественных числа. Напечатайте коэффициенты приведенно-
го квадратного уравнения, корнями которого являются эти числа.
24. Пусть дано число/ — угол в градусах. Определите смежный к нему угол в ра-
дианах.
25. В бригаде, работающей на уборке сена, имеется п косилок. Первая из них ра-
ботала т часов, а каждая следующая на 10 мин больше, чем предыдущая.
Сколько часов работала вся бригада?
28 Глава 2. Оператор присваивания, ввод и вывод информации
*26 . Пусть даны целые числа т, п (часы, минуты), 0 < т < 11 > 0 < и < 59, опреде-
ляющие время суток. Определите наименьшее время (число полных минут),
которое должно пройти до того момента, когда часовая и минутная стрелки
на циферблате:
а) совпадут;
Ь) расположатся перпендикулярно друг другу.
Задания для самостоятельной работы
1. Составьте программу для решения системы двух линейных уравнений
ах + by = с,
dx + ey = f
с двумя неизвестными х, у. Значение неизвестных находятся по формулам:
. . , ce-bf af-cd
Д = ae-bd, х =-—, у = —--
Д Д'
Считайте, что Д 0.
2. Подсчитайте, сколько очков набрала команда «Динамо» в первом круге чем-
пионата России по хоккею, если известно, что т встреч она выиграла, ц встреч
проиграла, k встреч закончились ничьими, полагая, что за выигрыш команда
получает 2 очка, за ничью — 1 очко, за проигрыш — 0 очков.
3. Пусть известны длины сторон а, &, с треугольника. Вычислите высоты этого
треугольника по формулам:
ha = - Vp(p-a)(p-*)(p-c) >
а
hb=T ylp(p-a)(p-b)(p-c),
b
hc = -> где p = a+b+c .
c 2
4. Составьте программу для вычисления времени t встречи автомобилей, дви-
жущихся равноускоренно навстречу друг другу, если известны их скорости Vt
и У2, ускорения ах и а2 и начальное расстояние S между ними. Расстояние 5Р
пройденное первым автомобилем, вычисляется по формуле
расстояние 52, пройденное вторым автомобилем, вычисляется по формуле
Задания для самостоятельной работы 29
Время t встречи автомобилей определяется из уравнения
г тт м а + b Ь-с
5. Найдите х из пропорции-----------
х а + с
6. Сколько процентов от А 4- В - С приходится на А? На В? На С?
7. Составьте программу вычисления идеального веса человека по его росту, при
условии, что идеальный вес (кг) = рост (см) - 100.
8. Даны координаты вершин некоторого треугольника. Вычислите его пло-
щадь.
9. Розничная цена мужского костюма составляет R рублей. Торговое наложе-
ние магазина составляет Т% от оптовой цены. Составьте программу опреде-
ления оптовой цены костюма.
10. Зарплата сотрудника частной фирмы составляет г рублей в месяц. Сколько
денег он получит за полгода после вычета налогов в размере t % ежемесячно
и s % за полГода?
И. Даны координаты вершин некоторого треугольника. Вычислите его пери-
метр.
12. Пусть смешано литров воды температуры t{ с V2 литрами воды температу-
ры t2. Составьте программу вычисления объема и температуры образован-
ной смеси.
13. Определите стоимость набора, в который входят следующие конфеты (сто-
имость упаковки составляет U руб.):
Название Вес Стоимость
Петровские 200 г /Сруб. (1 кг)
Воронежские 300 г Рруб. (1 кг)
Чародейка 250 г R руб. (1 кг)
Факел 150 г В руб. (1 кг)
Ласточка 200 г L руб. (1 кг)
Упаковка — U руб. (1 кг)
14. Сколько времени в минутах затратит школьник на дорогу от школы до стадио-
на, если это расстояние составляет S км, а средняя скорость движения школь-
ника — V км/ч.
15. В квадрат вписана окружность (рис. 2.1). Определите площадь заштрихован-
ной части фигуры, если известна длина стороны квадрата.
30 Глава 2. Оператор присваивания, ввод и вывод информации
16. В квадрат вписана окружность (рис. 2.1). Определите площадь заштрихован-
ной части фигуры, если известен радиус окружности.
Рис. 2.1. Два «уголка»
17. В квадрат вписана окружность (рис. 2.2). Определите площадь заштрихован-
ной части фигуры, если известна длина стороны квадрата.
Рис. 2.2^ «Уголок» и квадрат
18. В квадрат вписана окружность (рис. 2.3). Определите площадь заштрихован-
ной части фигуры, если известна длина стороны квадрата.
Рис. 2.3. Круг и два «уголка»
Глава 3
Логический тип
I
Теоретические вопросы
1. Какое служебное слово используется для описания данных логического типа?
2. Какие значения могут принимать данные логического типа?
3. Почему логический тип относится к порядковым типам?
4. Верно ли, что true > false?
5. Верно ли, что succ ( false ) = true?
6. Верно ли, что ord ( false ) = О?
7. Верно ли, что ord ( true ) = 1?
8. Верно ли, что pred ( true ) = false?
9. Верно ли, что pred ( false ) = О?
10. Перечислите логические операции в порядке убывания приоритета.
11. Верно ли, что результат операции логического умножения возвращает true,
если оба операнда истинны?
12. Верно ли, что операция and дает false, если хотя бы один операнд имеет зна-
чение false?
13. Верно ли, что результат логического сложения истинен, если хотя бы один
операнд имеет значение true?
14. Какой тип должна иметь переменная в левой части оператора присваивания,
если в его правой части стоит выражение логического типа?
15. Может ли булево выражение содержать круглые скобки?
16. Может ли булево выражение содержать несколько операций?
17. Влияют ли круглые скобки на порядок вычисления значений логических опе-
раций в булевых выражениях?
18. Могут ли в булевы выражения входить операции сравнения?
19. Верно ли, что в булевом выражении, содержащем несколько операций, сна-
чала определяются значения всех операций сравнения?
32 Глава 3. Логический тип
20. Пусть в левой части оператора присваивания находится переменная логи-
ческого типа. Может ли в его правой части стоять операция сравнения чис-
ловых типов?
21. С помощью какой функции можно проверить целочисленную переменную
на нечетность?
Упражнения
1. Пусть заданы переменные а, Ь, с логического типа. Доказать тождества:
a) true or а = true
b) a and false н false
c) a or ( not a ) s true
d) a and ( not a ) н false
e) a or ( b or с ) н ( a or b ) or c
f) a or ( b or c ) = ( a or b ) or ( a or c )
g) a and ( a or b ) s a
h) a or ( a and b ) = a
i) not not a s a
j) a = ( a and b ) or ( a and not b )
2. Чему равно значение логического выражения (a and not b) or с, если:
а) все значения переменных равны true;
b) все значения переменных равны fа 1 se;
с) а = true, b = true, с = false;
d) а = true, b = false, с = true;
e) a = false, b = true, c = false.
3. Вычислите значение логического выражения, считая, что х и у являются пе-
ременными вещественного типа:
♦a) d/x>x) and not (1+х*х>0) or (132<13.2*10) or ((х*х-2*х+1) < 0); '
♦b) not (12.5>25/2) and (x<x*x) and not (-5*6=( 7.5*(-4)));
c) (x or (not x)) and odd(32767-2) or (sqr(x)+sqr(y)<=4).
4. Запишите на языке Паскаль выражения, истинные при выполнении указан-
ного условия и ложные в противном случае:
а) х = min(x, у, z);
b) x принадлежит отрезку (-1,1);
с) х лежит вне интервала (-1,1);
d) х принадлежит интервалу (2,10) или (-2,2);
е) х лежит вне полуинтервалов (-2,0) и (2,5);
f) каждое из чисел х, yt z положительно;
g) только одно из чисел х, yf z положительно;
Линейные программы 33
h) хотя бы одно из чисел х, yf z положительно;
i) год с порядковым номером k является високосным (год високосный, если
его порядковый номер кратен 4, однако из кратных 100 високосными яв-
ляются лишь кратные 400).
♦5. Нарисуйте на плоскости область, в которой истинны выражения:
а) (у >= х) and (у+х >= 0) and (у <= 1);
b) (abs(x) <= 1) > (abs(y) >= 1);
с) (у >= -х-1) and (X <= 0) and (у <= 0) or ((х = у) and (х >= 0));
d) (у = 0) and ((х >= -2) and (х <= -1) or (х >= 1) and (х <= 2) or (х = 0) and
(у >= 2)).
Линейные программы
♦1. Напишите программу, в результате выполнения которой выводится значе-
ние true, если ел > ле. Возможны следующие варианты:
а) числа е и л описать как константы с точностью 10~5;
Ь) числа е и л представить с машинной точностью.
2. Для произвольных чисел a, Ь, с определите, имеет ли уравнение аг2 + Ьх + с = О
хотя бы одно вещественное решение.
♦3. Для заданных чисел р, а, b (а < Ь) определите, имеет ли уравнение arctan(2* -
- |р|) = V2~KopeHb на отрезке [а, Ь].
4. Даны три положительных числа а, Ь, с. Определите, можно ли построить тре-
угольник с такими длинами сторон.
5. Определите, есть ли среди цифр некоторого трехзначного числа повторяю-
щиеся.
‘6. Определите, равна ли сумма крайних цифр некоторого четырехзначного числа
сумме его средних цифр.
♦7. Пусть (k, Г), (т, п) — поля шахматной доски: k, т — номера по горизонтали;
1,п — номера по вертикали (1 < k, т, п < 8). Определите:
а) можно ли с поля (k, I) попасть на поле (т, п) одним ходом пешки;
Ь) можно ли с поля (k, I) попасть на поле (т, п) одним ходом ладьи;
с) можно ли с поля (k, Г) попасть на поле (т, п) одним ходом слона;
d) можно ли с поля (£, Z) попасть на поле (т, п) одним ходом ферзя.
♦8. Пусть дано вещественное число а. Вычислите /(а), где f — периодическая
функция с периодом 2, совпадающая на отрезке [-1,1] с функцией (-х2 + 1).
9. Напишите оператор присваивания, в результате выполнения которого логи-
ческая переменная t принимает значение true, если выполняется указанное
условие, и значение false в противном случае:
а) числа х, г/, z равны между собой;
Ь) из чисел х, у, z только два равны между собой;
2 Зак. 906
34 Глава 3. Логический тип
с) целые числа т и п имеют одинаковую четность;
d) только одна из двух заданных логических переменных имеет значение true;
е) х — положительное число;
f) цифра 7 входит в десятичную запись трехзначного целого числа k хотя бы
один раз;
g) из чисел х, г/, z хотя бы два числа положительные;
h) точка (хр z/j) попадает внутрь круга радиуса г;
i) точка (хр у{) попадает внутрь кольца с центром в начале координат, вне-
шний радиус которого равен /, а внутренний — г, если / и г (I > г > (^зада-
ны.
j) поля шахматной доски (g1, с1) и (g2, с2) имеют одинаковый цвет (g7, g2,
d, с2 — целые числа от 1 до 8);
к) ферзь, расположенный на поле (g/, с1) шахматной доски, «бьет» фигуру,
расположенную на поле (g2, с2);
I) конь за один ход может перейти с поля (g1, с1) на поле (g2, с2).
Глава 4
Условный оператор
Теоретические вопросы
1. Какие служебные слова могут использоваться при записи условного опера-
тора?
2. Какой тип должно иметь выражение, стоящее в условном операторе между
словами 1 f и then?
3. Пусть дана следующая последовательность операторов:
if <выражение> then <оператор1> else <оператор2>:
<0ператор3>:
Установите:
а) значение <выражения>, при котором выполняется <операторЗ>;
Ь) возможность записи после слова then нескольких операторов;
с) условие выполнения оператора <оператор1>;
d) значение <выражения>, при котором выполняется <оператор2>;
е) может ли <выражение> содержать знаки операций сравнения;
f) может ли <выражение> содержать знаки логических операций;
g) могут ли быть операторы if быть вложенными.
4. Приведите пример составного оператора.
5. Как называются программы, в основе которых лежит структура следование?
6. Какие операторы входят в состав разветвляющихся программ?
Упражнения
Как найти минимальное из двух чисел а и Ь.
Как найти максимальное из трех чисел а, b и с.
Переменной х присвойте значение корня уравнения arcsin (1 + In х) = а, если
такой существует.
При заданном значении х вычислить значение функции у = -
2
36
Глава 4. Условный оператор
♦5. Составьте программу вычисления функции f(x) вида:
х3 -Зх + 8,
/•(*)= 1
х3 - Зх + 8
X2 - X < 1,
х2 -х > 1;
х < О,
с) /(х) = ^х2-х, 0<х<1,
x2-sinnx2, х>1.
ь
6. Для заданных значений х, у напишите программу вычисления числа
min(x,y )+0,5
1 + шах2(х,у )
ПРИМЕЧАНИЕ Здесь и далее min(x, у) обозначает минимальное из чисел хи у, шах(х, у) —
максимальное из чисел х и у.
♦7. По заданным значениям х, у, z вычислить значение и\
a.) u = тах(х + у + z, xyz);
ах + bye [с, J)
ах + by < с , где a, b,c,d— известные величины;
ах + by > d
с) u = min(x, max(y, z));
8. Найдите полярные координаты г и ф точки на плоскости по ее прямоуголь-
ным координатам х и у. При этом воспользуйтесь формулами:
Упражнения 37
у
arctg— , х>0 , у>0,
х
у
2ft+arctg— , х>0
х
9. Перераспределите значения переменных хи у таким образом, чтобы перемен-
ная х получила меньшее из этих значений, а у — большее.
♦10. Считая, что стандартные функции sin и cos применимы только к аргументам
изотрезка[0, л/2], вычислите z/1 - sinx,y2 = cosхдля произвольного числах.
11. Замените оператором присваивания следующий условный оператор:
if а
then х : = true
else
if b
then x := c
else x := false;
12. Составьте программу для определения корней квадратного уравнения.
13. Напишите программу, которая проверяет, не приведет ли суммирование двух
заданных целых чисел к переполнению.
* 14. Напишите программу, которая проверяет, не приведет ли перемножение двух
заданных целых чисел к переполнению.
* 15. Пусть даны вещественные числа х1, х2, х3, у1, у2, у3. Принадлежит ли начало
координат треугольнику с вершинами (х1, у1), (х2, у2), (х\у3)?
16. Сколько общих точек у прямой у = kx + b и окружности х2 + у2 = 7?2?
17. Пусть даны вещественные положительные числа а, 6, с, d. Выясните, можно
ли прямоугольник со сторонами а, b разместить внутри прямоугольника со
сторонами с, d так, чтобы каждая из сторон одного прямоугольника была па-
раллельна или перпендикулярна каждой стороне второго прямоугольника.
♦ 18. Составьте программу, которая проверяет, пройдет ли кирпич с ребрами а, Ь, с
в прямоугольное отверстие со сторонами х и у. Просовывать кирпич в отвер-
стие разрешается только так, чтобы каждая из его граней была параллельна
или перпендикулярна плоскости отерстия каждой из его сторон.
* 19. Пусть дано целое k, 1 < k < 180. Определите, какая цифра находится в k-и
позиции последовательности 101112131415...9899.
* 20. Составьте программу нахождения корней биквадратного уравнения ах4 +
+ Ьх2 + с = 0.
38 Глава 4. Условный оператор
♦ 21. Дано положительное число а. Найдите:
а) наибольшее число вида 1/2”, п > 0, меньшее а\
Ь) наибольшее число вида 1/3”, п > 0, меньшее а.
Задания для самостоятельной работы
1. Введите три числа. Если они могут быть длинами сторон прямоугольного
треугольника, выведите их в порядке возрастания и вычислите площадь по-
лученного треугольника.
2. Введите три числа. Если они могут быть длинами сторон остроугольного тре-
угольника, выведите их в порядке убывания и вычислите площадь получен-
ного треугольника.
3. Введите три числа. Если они могут быть длинами сторон тупоугольного тре-
угольника, выведите их в порядке убывания и вычислите площадь получен-
ного треугольника.
4. Введите три числа. Если они могут быть сторонами равностороннего тре-
угольника, вычислите его площадь и длину высоты. Выведите длины сторон
треугольника, площадь и длину высоты в порядке возрастания.
5. Введите три числа. Если они могут быть длинами сторон равнобедренного
треугольника, вычислите длины его высот. Выведите длину основания и дли-
ны высот в порядке возрастания.
6. Введите три числа. Если они могут быть длинами сторон разностороннего
тупоугольного треугольника, выведите их в порядке возрастания и вычислите
площадь полученного треугольника.
7. Введите три числа. Если они могут быть длинами сторон равнобедренного
тупоугольного треугольника, вычислите его площадь. Выведите длины сто-
рон и площадь в порядке возрастания значений.
8. Введите три числа. Если они могут быть длинами сторон равнобедренного
остроугольного треугольника, вычислите его площадь. Выведите длины сто-
рон и площадь в порядке возрастания значений.
9. Введите три числа. Если они могут быть длинами сторон разностороннего
остроугольного треугольника, выведите их в порядке возрастания и вычи-
слите площадь полученного треугольника.
10. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами прямоугольного треугольника, вычислите его площадь.
11. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами остроугольного треугольника, вычислите его площадь.
12. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами тупоугольного треугольника, вычислите его площадь. Выведите дли-
ны сторон в порядке убывания.
13. Пусть даны координаты трех точек на плоскости. Если они могут быть верши-
нами равностороннего треугольника, вычислите его площадь и длину высоты.
Задания для самостоятельной работы 39
Выведите длины сторон, площадь и длину высоты в порядке возрастания
значений.
14. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами равнобедренного треугольника, вычислите длины его высот. Выве-
дите длины основания и высот в порядке возрастания значений.
15. Пусть даны координаты трех точек на плоскости. Если они могут быть верши-
нами разностороннего тупоугольного треугольника, вычислите его площадь.
16. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами равнобедренного тупоугольного треугольника, вычислите его пло-
щадь. Выведите длины сторон и площадь в порядке возрастания значений.
17. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами равнобедренного остроугольного треугольника, вычислите его пло-
щадь. Выведите длины сторон и площадь в порядке возрастания значений.
18. Пусть даны координаты трех точек на плоскости. Если они могут быть верши-
нами разностороннего остроугольного треугольника, вычислите его площадь.
19. Пусть даны три числа. Если они могут быть длинами сторон треугольника,
определите его вид (разносторонний, равнобедренный, равносторонний). Вы-
числите длины его высот и напечатайте их в порядке убывания.
20. Пусть даны три числа. Если они могут быть длинами сторон треугольника,
определите его вид (прямоугольный, тупоугольный, остроугольный). Вычи-
слите длины его высот и напечатайте их в порядке убывания.
21. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами треугольника, определите его вид (разносторонний, равнобедрен-
ный, равносторонний). Вычислите длины его высот и напечатайте их в по-
рядке убывания.
22. Пусть даны координаты трех точек на плоскости. Если они могут быть вер-
шинами треугольника, определите его вид (прямоугольный, тупоугольный,
остроугольный). Вычислите длины его высот и напечатайте их в порядке
убывания.
23. Составьте программу для определения вида треугольника (равносторонний,
равнобедренный, разносторонний, прямоугольный, тупоугольный, остро-
угольный), если по данным трем отрезкам его можно построить.
24. Пусть даны координаты трех точек на плоскости. Составьте программу для
определения вида треугольника (равносторонний, равнобедренный, разно-
сторонний, прямоугольный, тупоугольный, остроугольный), если данные ко-
ординаты вершин позволяют его построить,
25. Пусть даны координаты вершин четырехугольника. Составьте программу,
которая определяла бы, является ли этот четырехугольник прямоугольником.
26. Пусть даны координаты трех вершин прямоугольника. Определите коорди-
наты четвертой вершины.
Глава 5
Операторы цикла
Теоретические вопросы
1. Как называются программы, в основе которых лежит структура повторения?
2. Сколько операторов цикла вам известно?
3. Как называется оператор, синтаксическая диаграмма которого приведена
на рис. 5.1.
Рис. 5.1. Синтаксическая диаграмма оператора
4. Каков тип выражения в операторе цикла с предусловием?
5. Верно ли, что в теле цикла с предусловием должен находиться один оператор?
6. Что нужно сделать, чтобы-циклически выполнялись несколько операторов?
7. Когда проверяется истинность выражения в цикле while?
8. Верно ли, что истинность выражения в цикле с предусловием является усло-
вием продолжения цикла?
9. Сколько раз выполнится оператор в теле цикла while, если с самого начала
значение выражения равно false?
10. Верно ли, что цикл while используется при вычислениях всякого рода сумм
и произведений, когда заранее не известно число повторений?
И. Как называется оператор, синтаксическая диаграмма которого приведена
на рис. 5.2?
Рис. 5.2. Синтаксическая диаграмма оператора
Теоретические вопросы 41
12. Сколько операторов можно записать между ключевыми словами repeat
и until?
13. Когда проверяется истинность выражения в операторе цикла repeat?
14. Какой тип имеет выражение в операторе цикла с постусловием?
15. Почему в цикле repeat тело цикла всегда будет выполнен хотя бы один раз?
16. Верно ли, что истинность выражения в цикле repeat является условием окон-
чания цикла?
17. С помощью каких служебных слов записывается цикл с параметром?
18. Верно ли, что цикл с параметром применяется в тех случаях, когда заранее
известно число повторений?
19. Пусть цикл записан в виде:
for v:=El to Е2 do S:
а) Как называется El?
b) Как называется^?
с) Как называется v?
20. Сколько раз выполнится оператор S, если Е1=Е2, а цикл записан в виде:
for v:=El to Е2 do S;
21. Сколько раз выполнится оператор S и можно ли изменить значение пере-
менной v в теле цикла, если Е1>Е2, а цикл записан в виде:
for v:=El to Е2 do S;
22. Сколько раз выполнится оператор S, если Е1=Е2, а цикл записан в виде:
for v:=El downto Е2 do S;
23. Сколько раз выполнится оператор S, если Е1<Е2, а цикл записан в виде:
for v:=El downto Е2 do S;
24. Верно ли, что в качестве параметра цикла for используется простая перемен-
ная, описанная в текущем блоке?
25. Какой тип должен иметь параметр цикла в цикле for?
26. Какой тип должны иметь начальное и конечное значения в цикле for?
27. Чему равно значение параметра цикла for после завершения цикла?
28. Можно ли войти в тело цикла for, минуя его заголовок?
29. Можно ли войти в тело цикла while, минуя его заголовок?
30. Можно ли войти в тело цикла repeat, минуя его заголовок?
31. Допустим ли выход из тела цикла for?
32. Допустим ли выход из тела цикла while?
33. Допустим ли выход из тела цикла repeat?
34. Какие циклы называются вложенными?
35. Верно ли, что цикл, содержащий в себе другой цикл, называется внешним?
36. Какой цикл называется внутренним?
42 Глава 5. Операторы цикла
37. Какому условию должны удовлетворять вложенные циклы?
38. Может ли внешний цикл быть циклом for, а внутренний — циклом repeat?
39. Могут ли внутренний и внешний циклы быть циклами разных видов?
40. Могут ли внутренний и внешний циклы быть циклами одного вида?
41. Может ли вещественная переменная быть параметром цикла for?
42. Можно ли в качестве параметров вложенных циклов for использовать одну
и ту же переменную?
43. Какие утверждения являются верными (проиллюстрируйте ответ соответ-
ствующими примерами):
а) любой цикл for можно записать при помощи цикла while;
b) любой цикл while можно записать при помощи цикла for;
с) не любой цикл for можно записать при помощи цикла while;
d) не любой цикл while можно записать при помощи цикла for.
Упражнения, задачи, программы
1. Чему равно число повторений цикла for i:=A to В, если:
а) В>=А-1;
Ь) В<А.
2. Чему равно число повторений цикла for i:=A downto В, если:
а) А>вВ-1;
Ь) А<В.
3. Пусть дан фрагмент программы:
У 1:
1 := 2;
while 1 <= 5 do
begin
у := у * 1:
i := 1 + 1
end;
write ( у );
а) Что будет выведено в результате работы программы?
Ь) Замените цикл while циклом for.
с) Замените цикл while циклом repeat.
4. Для заданных значений хим вычислите у = х”, где п — натуральное число.
5. Составьте программу вычисления значения М:
[/I9 к>9
м = Г
[£! Д <9.
Упражнения, задачи, программы 43
♦6. Составьте программу вычисления величины К:
,п<9
К = 1229~п,9<п<29
1, п = 29
7. Напишите программу вычисления значения функции у для десяти вводи-
мых пользователем значений х.
[х2 4- 2х - 2, - 2 < х < 1
У = <
I х, (х < - 2) или (х > 1).
8. Составьте программу для вычисления самого большого числа, для которого
можно вычислить факториал на имеющемся компьютере.
9. Пусть дано натуральное число п (запись числа п в десятичной системе есть
akak-iak-2 ••• ао)- Составьте фрагменты программ для ответа на следующие во-
просы.
а) Сколько цифр в числе и?
Ь) Чему равна сумма его цифр?
♦ с) Чему равна первая цифра числа п?
d) Как выглядит запись цифр числа п в обратном порядке?
* е) Читается ли число п слева направо и справа налево одинаково?
♦ f) Чему равна знакочередующаяся сумма цифр числа п?
g) Чему равно выражение ak - ak_x + ak_2- ... +(-1)*а0?
10. Составьте программу для нахождения всех автоморфных чисел в отрезке
[т, п\. Автоморфным называется целое число, запись которого сопадает с
последними цифрами его квадрата. Например: 52= 25,62в36, 252= 625.
И. Пусть дано натуральное число п. Требуется:
♦ а) выяснить, является ли оно степенью числа 3;
* Ь) переставить первую и’ последнюю цифры числа п\
♦ с) выяснить, входит ли цифра 3 в запись числа п2\
d) добавить 1 к последней цифре числа. Пример: 37 —> 38,49 -» 410;
♦ е) добавить 2 к первой цифре числа. Пример: 49 —> 69,92 —» 112;
f) удвоить первую цифру числа. Пример: 49 89,89 -> 169;
g) добавить 1 к первой и последней цифрам числа. Пример: 489 —>5810.
12. Вычислите наибольший общий делитель двух натуральных чисел.
13. Составьте программу нахождения наименьшего общего кратного двух нату-
ральных цисел.
44 Глава 5. Операторы цикла
14. Составьте программу, которая проверяет, является ли заданное число совер-
шенным. Совершенным называется натуральное число, равное сумме всех
своих делителей (исключая само число). Например: 28 = 1 + 2 + 4 + 7 + 14.
15. Выведите все простые трехзначные числа.
16. Вычислите первый отрицательный член последовательности cos(ctg(n)),
« = 1,2,3,... Отрицательные члены в этой последовательности обязательно
есть.
17. (Доставьте программудля ычисления и вывода п первых чисел Фибоначчи.
Числа Фибоначчи получаются с помощью следующих рекуррентных соот-
ношений:/! =/2 = + fn-2, и > 3, где fn — целое.
♦ 18. Заданное натуральное число п представьте в виде суммы различных чисел
Фибоначчи. Сколько слагаемых будет входить в эту сумму?
19. Найдите первое число Фибоначчи, большее заданного п.
20. Вычислите сумму всех чисел Фибоначчи, которые меньше 1000.
21. Для заданного значения х вычислите п-й многочлен Чебышева, если извест-
ны следующие соотношения: Го = 1; Г1(х) - х; Гп+1(х) = 2хГ„(х) - Гл-1(х).
22. Пусть дано целое k > 0. Напечатайте k-й член последовательности, задавае-
мой формулами:
х0 — 1,
Хп = ПХп-\ + ~,П>\.
П
23. Пусть дано натуральное число п (п > 3). Получите у„, если v0 = Vj = 0; v2 = 1,5;
f + 1 • ? л
Vi = ту—V,-! - V^v^ , z = 3,4 ...
I +1
24. Пусть даны вещественные числа q, г, b, с, d, натуральное число n(n> 2).
Вычислите хл, если Хо = с, Xi = d, Xk = qxk-t + rXk-2 + b,k>2.
25. Пусть дано натуральное число п (п > 3). Получите v„, если щ = щ = 0, vi = v2 = 1,
ai-\
♦ 26. Пусть aQ = = 1, 4 - 4-2 + *= 2,3,... Для заданного п найдите произве-
дение ах -а2-а^
♦ 27. Составьте программу вычисления суммы вида:
/
. , 1 1 1
а) 1ч—— ч—— Ч-...Ч---—;
23 З3 503
1 1 1 1
' 22 42 + 62 + " + 1282 ’
28. Пусть Хо = z/o = Ю и x,+i = 0,1 yly y,+i = 0,1х, - 0,12г/,, для i > 1. Требуется найти
наименьшее г, такое, что |л7г | < е, |г/, | < е для заданного е > 0.
Упражнения, задачи, программы 45
29. Пусть дано 100 вещественных чисел, которые вводятся по одному. Найдите
количество положительных, отрицательных и нулевых чисел.
•30. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычисли-
те среднее арифметическое положительных и среднее арифметическое от-
рицательных чисел.
31. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычисли-
те разность между максимальным и минимальным числами.
>32. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычислите
среднее арифметическое чисел, больших полусуммы первых двух.
>33. Пусть дано 100 целых чисел, которые вводятся по одному. Получите сумму
тех из них, которые:
а) кратны 5;
Ь) нечетны и отрицательны;
с) меньше по абсолютному значению квадрата порядкового номера вводи-
мого числа.
>3 4. Пусть дано натуральное число п и вещественные числа аи а2>..., ап, которые
вводятся по одному. Получите:
а) их произведение;
Ь) их среднее арифметическое;
с) + 2 а2 + 3 а3 + ... + п
d) d2 4" 4-... 4- dn_^ dn (п > 1),
e) |a, -a„|;
f) последовательность av dxa2, a{a2ay ..., a1a2...an.
>35. Пусть дано натуральное число п и последовательность из п вещественных
чисел, среди которых есть хотя бы одно отрицательное. Найдите наибольшее
среди отрицательных чисел этой последовательности.
36. Составьте программу вычисления при заданных х и а значения функции у
вида:
а) у = ((((((((х + а)1 + а)2 + а)2 + а)2 + а)2 + а)2 + а)2 + а)2;
♦Ь) у = а + (а + (а + (а + (а + (а + (а + (а + х)2)2)2)2)2)2)2;
,с) (х-2)(х-4)(х-6)...<х-64).
У (х-1)(х-3)(х-5)...(х-63) ’
d) у = (((((х - а)х - а)х - а)х - а)х - а)х - а.
37. По заданному значению х вычислите значение г/, представив многочлен в виде
у = (.. .(((х 4-2)х 4-3) 4-4)х 4-... 4-10)х 4-II
а) у = х'6’ + 2х9 + Зх3 + ... + Г0х + П;
♦Ь) у = 11х1° + 10х9 + 9х8 + ... + 2х + 1.
38. Вычислите значение многочлена /(х) = аах" + а.х"'1 +... + а„чх + а„ и его про-
изводной в точке х = Г2 + 0,5 для заданного значения t. Числа п, t, а0, at,..., а„
определяются вводом.
46 Глава 5. Операторы цикла
39. Вычислите:
109 +
1
111
♦40. Напишите программу вычисления при заданном х величины у по формуле:
2 256
X +-?-
X
41. Вычислите:
а) у = cos х + cos х + cos х + ... + cos х ;
b) у e 1! + 2! + 3! + ... + п!, и > 1;
с) у - sinl + sinl,l+ sinl,2 + ... + sin2;
d) первое из чисел sin х, sin sin x, sin sin sin x..., меньшее по модулю, чем 10’4.
♦42. Вычислите сумму квадратов всех целых чисел, попадающих в ийтервал
(1пх, ех), х > 1.
♦43. Напишите программу нахождения первого члена последовательности
а„=(-1)л(1 + | + ... + -)•(« = 1.2,...),
2 п
который не принадлежит заданному отрезку [а, Ь].
44. Используя метод деления отрезка пополам, с точностью до 10"4 найдите наи-
меньший положительный корень уравнения tg х = х.
45. Пусть дан прямоугольник, длины сторон которого а и b — натуральные числа.
На сколько квадратов, стороны которых выражены натуральными числами,
можно разрезать данный прямоугольник, если от него каждый раз отрезать
квадрат максимально возможной площади?
♦46. Составьте программу для нахождения всех прямоугольников заданной пло-
щади. Считайте, что длины сторон прямоугольников и площадь выражаются
натуральными числами.
47. Составьте программу для нахождения и выода всех пифагоровых чисел, не
превышающих 20.
Упражнения, задачи, программы 47
48. Выведите на экран одну из строк формулы
для заданного натурального У; первая строка выводится, еслиЛГ — четное,
вторая — если N — нечетное.
49. Пусть вводится последовательность из целых чисел, оканчйвающаяся нулем.
Найдите:
а) номер последнего из наибольших чисел последовательности;
♦ Ь) наименьшее из всех положительных чисел последовательности;
с) два наименьших числа последовательности;
* d) номер меньшего из двух наибольших чисел последовательности;
♦ е) сумму тех из них, порядковые номера которых — числа Фибоначчи.
50. Пусть вводится последовательность вещественных чисел, оканчивающаяся
нулем и состоящая более чем из одного ненулевого элемента. Определите:
а) содержит ли последовательность хотя бы одну пару равных соседних эле-
ментов;
Ь) сколько раз в последовательности меняется знак при переходе к следую-
щему элементу;
с) является ли эта последовательность возрастающей;
♦d) номер числа по абсолютной величине самого близкого к своему номеру.
* 51. В соревнованиях по фигурному катанию оценки выставляют несколько су-
дей. При выведении единой оценки за выступление одного спортсмена из
всей совокупности оценок удаляется наиболее высокая и наиболее низкая,
и для оставшихся оценок вычисляется среднее арифметическое. Если не-
сколько судей выставили наиболее низкую или наиболее высокую оценки,
то из совокупности оценок удаляется только одна такая оценка. Напишите
программу для вычисления оценки спортсмена.
♦ 52. Пусть х0= a,Xk = qxk-\ + b (k = 1,2,...). Дано неотрицательное целое п и вещест-
венные a, Ь, с, d,q{c < d). Сколько чисел Xk (k < п) принадлежит интерва-
лу (с, d)?
53. Пусть дано натуральное число л и вещественные числа а, Л, Ь, Вычислите
сумму:
1 + 2(b - а) + 3(6 - a)(b - а - h) + ... + (п + 1)(6 - а) ... (6 - а - (п - 1)6).
54. Имеется целое k > 0, Вычислите 6-й член последовательности Х1,Хг, ...,х*, где
хо=1,хя=пхл-1+1/и прип - 1,2,3,...
♦55. Пусть дано натуральное число п. Вычислите значения выражений:
48 Глава 5. Операторы цикла
*56. Пусть даны натуральное число п и вещественное число х. Вычислите:
е) sin х + sin2 х + ... + sin" х;
f) sin х + sin x2 + ... + sin x";
g) sin x + sin sin x 4-... 4- sin sin sin... sin x.
♦57. Пусть даны натуральное число п и вещественные числа х{, у1, х2, у2, •••, хп, уп.
Рассматривая пары х„ как координаты точек на плоскости, определите ра-
диус наименьшего круга с центром в начале координат, внутрь которого по-
падают все эти точки.
♦58. Даны натуральное число п (п > 2) и вещественные числа ах, Ьх, а2, Ь2,ап, Ьп.
Рассматривая пары aif bi как координаты левых и правых концов отрезков
числовой прямой, определите концы отрезка, являющегося пересечением всех
этих отрезков.
*59. Пусть дано натуральное число k. Выведите А-ю цифру последовательности:
а) 12345678910111213..., в которой выписаны подряд все натуральные числа;
Ь) 149162536..., в которой выписаны подряд квадраты всех натуральных чисел;
с) 1123581321..., в которой выписаны подряд все числа Фибоначчи.
♦60. Вычислите Xi 4- х2 4-... 4- Х20, если последовательность Xi, Хг,... образована по сле-
дующему закону:
b) X] =1; х2 =0.3; х, = (»+1)-х/_2, 1 = 3,4,...;
с) X] = х2 = х3 = 1; х, = (i + 3)(х,_| -1) + (х + 4)х,_3, i = 4,5,...
61. Каждая бактерия делится на две в течение одной минуты. В начальный мо-
мент времени имеется одна бактерия. Составьте программу для расчета ко-
личества бактерий через заданное целое количество минут.
ь
62. Вычислите приближенное значение jx2dx, используя формулу прямоуголь-
а
ников, если известно, что отрезок [af fe] разбит на п частей. Формула прямо-
угольников для вычисления интеграла записывается в виде:
ь
J f (x)dx = h
а
где h -
b-a
п
Упражнения, задачи, программы 49
63. Вычислите определенные интегралы:
0.5
a) |4cos2xdi;
о
64. Используя приближенное интегрирование, найдите значение л. Для этого
вычислите площадь четверти единичного круга, а затем увеличьте ее в четы-
ре раза.
65. Выведите таблицу значений функции у = /(х). Таблица должна иметь две
колонки: в первую заносятся значения х„ а во вторую — г/,.
а) /(х)= cosV2x, х, = л + -—-i, i = 0,1,..., л; а,Ь,п — вводятся;
п
— Зх + 2
Ь) /(х)= —. ,X; = 1 + ih, i = 0,1,...,л; h,n — вводятся.
V 2х3 -1
66. Получите таблицу температур по шкале Цельсия от 0 до 100 градусов и их
эквивалентов по шкале Фаренгейта, используя для перевода формулу
tF = — tc + 32.
67. Пусть интервал (а, Ь) разбит точками на п равных частей; в каждой точке
вычисляется значение функции
V1X3 -1
Найдите точку, в которой функция достигает наибольшего значения.
68. Пусть отрезок [а, Ь] разбит точками на п равных частей. В каждой точке вы-
числяется значение функции
•Jlx* -1 ’
Найдите наибольшее и наименьшее значения функции в этих точках.
69. Пусть отрезок [а, 6] разбит точками на п равных частей. В каждой точке вы-
числяется значение функции
Найдите те точки, в которых функция принимает наибольшее и наименьшее
значения.
50 Глава 5. Операторы цикла
70 . Найдите то значение х, при котором значение суммы (х) + р2 (х) + р3 (х) мак-
симально, если
Зх2 -1 5х2 - Зх
р,(х) = X , р2(х) = , Л(х) = —
Аш Л*
ах = 0; 0,5; 0,1;... 20.
♦71. Билет называют «счастливым», если в его номере сумма первых трех цифр
равна сумме последних трех цифр. Подсчитайте число тех «счастливых» би-
летов, у которых сумма первых трех цифр равна 13.
Задания для самостоятельной работы
/
1.
Пусть
ак-\
где k = 2,3,...
Найдите произведение ауаг...-ап.
2. Вычислите длину кривой, соответствующей функции у = /(х) на отрезке
[a, i], приближенно заменив кривую ломаной, полученной в результате раз-
биения отрезка [а, Ь] на п равных частей.
3. Пусть даны вещественные числа а, b (Ь > а), натуральное п. Получите
\ , b-a r a + (i-Q3\h , о
W +/2 +... + Л)-Л, где h =-, z = \ л ’1 = lj 21 ”•
п 1 +(а+ (/-0,5)* Л/
4. Пусть дано целое число т > 1. Получите наибольшее целое k, при котором
4к< т.
5. Определите, в какую наибольшую целую положительную степень можно воз-
вести число 6, чтобы результат не превосходил заданной величины а (Ь< а).
6. Пусть дано вещественное число х и натуральное число п. Вычислите:
(х-2)(х-4)...(х-2и)
(х-1)(х-3)...(х-2и-1)
7. Пусть даны вещественные числа а, А, натуральное число п. Вычислите:
f(a)+ f(a + h)+ f(a + 2h)+... + f(a + nh), где /(x) = (x2+l)cosx.
8. Корень некоторого уравнения находится последовательными приближения-
ми по формуле
о з
2“Х„
хл+1=—Г-2--
Напишите программу для нахождения такого приближения корня, при ко-
тором разность по модулю между двумя соседними приближениями не пре-
восходит 10’5, а начальное приближение х0 = 1.
9. Сторона правильного вписанного в окружность многоугольника с удвоен-
ным числом сторон выражается через сторону исходного многоугольника ап
и радиус описанной окружности R в виде формулы
Задания для самостоятельной работы 51
2Л2-2Л. Л2-^- •
V 4
Вычислите длину стороны правильного вписанного 48-угольника.
10. Цилиндр объема 1 имеет высоту h. Определите радиус основания цилиндра
для значений Л, равных 0,5; 1; 1,5;...; 4,5; 5.
И. Способ последовательных приближений позволяет находить корень пятой
степени из положительного числа а приближенно по формуле
При этом разность между хп и >[а по абсолютной величине не превосходит
5 ।
-ахя+1-хй
4
Составьте программу вычисления корня пятой степени из числа а с точно-
стью до 10~* с заданным значением k, принимая
min(2a, 0,95), а <1,
*о
я/5,1<а<25,
а/25, а>25.
ь
12. Пусть дано натуральное число п. Получите наименьшее число вида 2*, пре-
восходящее п.
13. Пусть дано натуральное число п. Вычислите: 1.2 + 2 • 3 • 4 + ... + л •... • 2л.
14. Напишите программу для вычисления корня n-й степени из положительно-
го числа а, пользуясь последовательными приближениями
k = 0,1,2,... до совпадения соседних приближений с точностью е, если задано
начальное приближение хо.
15. Пусть дано натуральное число п. Удалите из записи этого числа цифры 3 и 7,
оставив прежним порядок остальных цифр. Например, из числа 3171 507 377
должно получиться 1150.
16. Пусть дано натуральное число и. Найдите наименьшее среди чисел
k3 sin
k - 1,2,..., п.
17. Пусть дано натуральное число п. Найдите Q\b\ + а2Ь2 +... + апЬп =
52 Глава 5. Операторы цикла
18. Пусть даны целые числа Х(, х2 у х3,х55. Вычислите величину:
19. Пусть х1 = 0,3; хг - -0,3; х, = i 4- sin(x,_|), i - 3,4,... Среди чисел *j, х2,х100
найдите ближайшее к какому-нибудь целому числу.
z 1 (i 1У
20. Пусть а, =---4-sin-—'—9 * " U,..., п, где n задано.
/4-1 i 4-1
Найдите сумму всех положительных чисел а,.
21. Пусть дано натуральное число п и вещественное число х. Среди чисел:
ecos(?‘) .sjn(x3/* j, где k = 1,2..п,
найдите ближайшее к какому-нибудь целому числу.
22. Последовательность чисел fl2,...,aioo задана формулой
ак =sin2(3£4-5)-cos(fc2-15},£ = 1,2,..., 100.
Определите, сколько членов последовательности с номерами 1, 2, 4, 8,16,...
имеют значение, меньшее 0,25.
23. Дано вещественное положительное число Ь. Последовательность аь а2> аз,...
образована по закону:
Найдите первый отрицательный член последовательности.
24. Дано вещественное отрицательное число Ь. Последовательность а2, аз,...
образована по закону:
^Ь.а^а^ —U/ = 2, 3, ....
Найдите первый неотрицательный член последовательности.
25. При некоторых заданных х, ЛГи £, определяемых вводом, вычислите сумму N
слагаемых заданного вида, затем сумму тех слагаемых, которые по абсолют-
ной величине больше Е. Для второго случая выполните суммирование для
двух значений Е, отличающихся на порядок, и при этом определите количе-
ство слагаемых, включенных в сумму. Сравните результаты с точным значе-
нием функции, для которой данная сумма определяет приближенное значе-
ние при х, лежащем в интервале (-7?, R).
Задания для самостоятельной работы 53
1-3
2-4
(/? = 1).
е)
d) arctg(x) = х - — + —
arcsin(x) = х + —
(R “ 1).
(R -1).
(R -1).
(R -1).
54 Глава 5. Операторы цикла
t) ех
{R = оо).
(7? - «).
и)
(-1)'+| • sin(x) • ln(z • х)
i2 0+1)!
(-1)' -(cosCx))'72 •/!!
0 + 1)!
если i — нечетно
если i — четно.
ч (—1) -sin'(x) ... fl-3-5-...-z, еслиi — нечетно,
w) ai = -— -------—», где z!! = <
(z + !)!•/!! [2-4-6-...-z, если i — четно.
если i — нечетно,
если г — четно.
V'» „ _(-1)'+1-1п0-х)
ai -----Z-2 ---•
Глава 6
Литерный тип
Теоретические вопросы
1. Верно ли, что литерный (символьный) тип относится к скалярным типам
данных?
2. Как задается описание переменных литерного типа?
3. Каково множество значений литерного типа?
4. Какой объем памяти требуется для хранения переменной символьного типа?
5. Приведите примеры символьных констант.
6. Верно ли то, что значением литерного типа является множество всех симво-
лов кодовой таблицы ПЭВМ?
7. Что такое код символа?
8. Верно ли то, что каждому символу ставится в соответствие целое число в диа-
пазоне 0...255?
9. Можно ли к данным символьного типа применять операции отношения?
10. Верно ли, что в программе значения символьного типа должны быть заклю-
чены в апострофы?
И. Каков результат работы функции ord(c), где с — переменная символьного
типа?
12. Верно ли утверждение, что ord(’ 0') = О?
13. Верно ли, что ' а ’ = 'А'?
14. Верно ли утверждение, что если end — литеры, то c<d тогда и только тогда,
когда ord(c)<ord(d)?
15. Как работает стандартная функция ch г (1), где 1 — целочисленная переменная?
16. Каковы особенности кодировки цифр, латинских и русских букв?
17. Какие операции применимы к символьным данным?
18. Какие встроенные функции можно применить к символьным данным?
19. Верно ли, что chr(ord(c)) = с, где с — переменная символьного типа?
56 Глава 6. Литерный тип
20. Верно ли, что ord(chrd)) = 1, где 1 — переменная целого типа?
21. Как работают стандартные функции pred(с), succ(c), где с — переменная ли-
терного типа?
22. Верно ли, что pred(c) - chr(ord(c)-l), где с— переменная символьного типа?
23. Верно ли, что succ(c) = chr(ord(c)+l), где с— переменная символьного типа?
24. Можно ли переменные и константы символьного типа использовать в вы-
ражениях?
25. Можно ли к переменным символьного типа применять стандартные проце-
дуры ввода-вывода?
Упражнения, задачи, программы
1. Напишите программу, которая по введенному символу определяет его по-
рядковый номер, а также предыдущий и последующий символы.
2. Напечатайте все буквы латинского алфавита.
3. Пусть вводится последовательность символов длиной 10. Подсчитайте, сколь-
ко среди них цифр?
4. Пусть вводится последовательность символов длиной не более 20. Признак
конца последовательности — точка. Верно ли, что в последовательности со-
держится четное количество строчных латинских букв?
5. Подсчитайте, сколько раз среди последовательности символов встречается
символ, задаваемый вводом. Количество вводимых символов также опреде-
ляется вводом.
6. Напечатайте заданную последовательность символов, заменяя каждую точку
многоточием.
7. Пусть входной поток литер содержит по крайней мере одну цифру. Считая
первую из них началом записи числа (целого или вещественного с фиксиро-
ванной точкой), по правилам языка Паскаль выполните преобразование этой
записи в число, присвойте его значение переменной и выведите результат.
8. Пусть дана последовательность литер, имеющая вид dx ±d2 ±...±dn (d, —
цифры, п > 1), за которой следует точка. Вычислите значение этой алгебраи-
ческой суммы.
9. Пусть даны целое число и, символы sp s2,..., sn. Выясните, имеются ли в этой
последовательности такие члены, что s. — это запятая, a sl+1 — тире.
♦ 10. Пусть даны символы sp s2,sn. Известно, что символ отличен от восклица-
тельного знака и что среди символов s2, s3,... есть по крайней мере один вос-
клицательный знак. Пусть sp s2,..., sn — символы данной последовательности,
предшествующие первому восклицательному знаку (п заранее неизвестно),
а) определите количество пробелов в последовательности sp s2,..., sn;
b) выясните, имеется ли среди sp s2,..., sn пара соседних символов но или он;
с) выясните, имеется ли среди sp s2,sn пара соседних одинаковых символов.
Упражнения, задачи, программы 57
♦ 11. Пусть даны целое число и, символы sp s2,sn. Удалите из данной последова-
тельности все группы букв, образующих запись abed, то есть получите новую
последовательность, не содержащую этих групп литер.
12. Пусть даны целое число п, символы sp s2,..., sn. Преобразуйте последователь-
ность sp52, ..., sn, удалив каждый символ звездочки (*) и повторив каждый
символ, отличный от звездочки.
♦ 13. Пусть даны целое число п, символы sp s2,..., sn, среди которых есть двоеточие.
Получите все символы, расположенные:
а) до первого двоеточия включительно;
Ь) между первым и вторым двоеточием; если второго двоеточия нет, то по-
лучите все символы, расположенные после имеющегося двоеточия.
14. Напечатайте заданный непустой текст, удалив из него все буквы Ь, непосред-
ственно перед которыми находится буква с.
15. Заданный текст распечатайте по строкам, понимая под строкой либо очеред-
ные 60 литер, если среди них нет запятой, либо часть текста до запятой вклю-
чительно.
♦ 16. Пусть в заданный непустой текст входят только цифры и буквы. Определите,
удовлетворяет ли он следующему условию:
а) текст начинается с некоторой ненулевой цифры, за которой следуют толь-
ко буквы, и их количество равно числовому значению этой цифры;
Ь) текст начинается с k букв (1 <k< 9), за которыми следует только одна
литера — цифра с числовым значением k,
с) сумма числовых значений цифр, входящих в текст, равна длине текста.
17. Пусть задан текст, за которым следует точка. Поменяйте все строчные латин-
ские буквы, которые встречаются в тексте, на прописные.
• "18. Пусть дан непустой текст из заглавных латинских букв, за которым следует
точка. Определите, упорядочены ли эти буквы по алфавиту.
♦19. Пусть задан текст, состоящий из слов. Под словом понимается последова-
тельность литер, не содержащая пробелов и знаков препинания. Если слово
начинается с латинской строчной буквы, замените ее на прописную.
20. Пусть дан текст, каждый символ которого может быть латинской буквой,
цифрой или одним из знаков «+», «-», «*». Группой букв будем называть
такую совокупность последовательно расположенных букв, которой непо-
средственно не предшествует и за которой непосредственно не следует буква.
Аналогично определим группу цифр и группу знаков:
а) выясните, верно ли, что в данном тексте больше групп букв, чем групп
знаков;
Ь) найдите число таких групп букв, которые начинаются и заканчиваются
одной и той же буквой;
с) определите длину самой длинной группы цифр.
Глава 7
Перечислимый тип,
ограниченный тип,
оператор варианта
Перечислимый тип
Теоретические вопросы
1. Как определяется перечислимый тип?
2. Какие значения может принимать переменная перечислимого типа?
3. Что представляет собой значение перечислимого типа?
4. Могут ли встречаться одинаковые значения при описании двух различных
перечислимых типов?
5. Применимы ли операции сравнения к переменным перечислимого типа. Если
да, то каков результат различных операций?
6. Может ли переменная перечислимого типа быть параметром цикла for?
7. Какие стандартные функции применимы к переменным перечислимого типа?
8. В чем отличие показанного ниже перечислимого типа от стандартного типа
boolean?
type
boolean = ( false, true ):
9. Что будет напечатано в результате выполнения цикла в следующем фраг-
менте программы:
type
colour = ( green, yellow, red );
van
c: colour;
begin
for c green to yellow do
Перечислимый тип 59
write( ord( с ) );
end.
10. Измените фрагмент программы из предыдущего вопроса, заменив цикл for
циклом while.
11. Ко всем ли значениям перечислимого типа применимы функции succ и pred?
12. Что будет напечатано в результате выполнения следующих программ:
program А;
begin
if true > false
then writeln( 'true > false’ )
else writeln( 'true <= false' )
end.
program B;
type
z = ( true, false );
begin
if true > false
then writeln( 'true > false' )
else writeln( 'true <= false’ )
end.
13. Можно ли к данным перечислимого типа применить стандартные процеду-
ры ввода-вывода?
14. Какие средства имеются в языке Паскаль для ввода-вывода значений пере-
менных перечислимого типа?
Упражнения
♦1. Пусть имеются описания:
type
day = ( monday, tuesday, Wednesday, thursday,
friday, Saturday. Sunday);
pmonth = ( m28, m29, m30, m31 );
var
wday, weekday: day:
kday; pmonth;
а) установите, какие значения могут принимать переменные weekday, kday;
b) определите, допустимы ли следующие присваивания:
weekday : = friday
kday := m27
weekday := m30
kday := ord( thursday )
с) вычислите значения выражений или укажите на наличие ошибки;
monday < Sunday
tuesday « m28
Wednesday <= Wednesday
tuesday <> m29
succ( 29 )
pred( Saturday )
60 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта
pred( т28 )
ord( tuesday )
ord( tuesday ) + pred( 30 )
succ( kday ) + 1 + ord( pmonth )
d) Что будет напечатано в результате выполнения следующих операторов:
wday := succ( friday );
if wday = Sunday
then writelnC 'yes' )
else writelnC 'no' ):
writelnC ord( monday ) );
for wday : = monday to friday do
writeC ord( wday ) );
e) Допустимы ли следующие операции ввода-вывода:
readC wday )
writeC monday )
writelnC 'Sunday' )
writelnC ord( Wednesday ) )
writelnC succC tuesday ) )
writelnC ’pmonth»', ord( m28 ) )
f) Допустимы ли следующие заголовки цикла:
for wday := monday to Saturday do
for wday :» Sunday downto monday do
for kday m28 to m30 do
for kday 1 to 31 do
2. Пусть дан представленный ниже фрагмент программы. Присвойте перемен-
ной t значение true, если месяц ml предшествует месяцу m2, и значение fа 1 se
в противном случае. Месяцы ml и m2 принадлежат одному году.
type
month » (Jan. Feb, Mar, Apr.
May, Jun. Jul. Aug.
Sep. Oct, Nov. Dec);
var
ml, m2: month:
t: boolean;
3. Пусть дан следующий фрагмент программы:
type
month » (Jan. Feb. Mar, Apr,
May, Jun. Jul, Aug,
Sep. Oct, Nov, Dec);
var
ml, m2: month;
i: integer;
Присвойте переменной ml:
а) название месяца, следующего за месяцем m2 (считайте, что за декабрем
идет январь);
Ь) название &-го месяца после месяца т;
с) название n-го месяца года.
Ограниченный тип 61
Ограниченный тип
Теоретические вопросы
1. Верно ли то, что ограниченный тип называется также интервальным типом?
2. Почему интервальный тип называется диапазоном?
3. Верно ли, что интервальный тип используется тогда, когда заранее по смыслу
задачи известен диапазон изменения переменных?
4. Что делает компилятор при каждой операции с переменной интервального
типа?
5. Могут ли константы, определяющие границы интервального типа, иметь тип
real?
6. Верно ли, что значение первой констанТы, определяющей интервальный тип
данных, должно быть меньше второй?
7. Какие символы разделяют константы, определяющие тип диапазон?
8. Где определяется тип диапазон?
9. Можно ли границы диапазона задать не значениями констант, а их именами,
определенными в разделе описания констант?
10. Какие значения могут принимать переменные типа диапазон?
И. Можно ли стандартные функции ord, succ, pred применять к переменным
интервального типа?
12. Можно ли к переменным интервального типа применять процедуры ввода-
вывода?
13. Как описываются переменные ограниченных типов?
14. Можно ли операцию, применимую к переменной некоторого типа, приме-
нять к переменной, относящейся к соответствующему диапазону?
15. Могут ли в одном выражении встречаться переменные, относящиеся к раз-
личным диапазонам одного основного типа?
16. Может ли переменная интервального типа фигурировать в левой части опе-
ратора присваивания?
17. Может ли переменная интервального типа фигурировать в правой части опе-
ратора присваивания?
18. Верно ли, что функции, определенные для базового скалярного типа, могут
применяться и к ограниченному типу?
Упражнения
1. Пусть даны описания:
type Days=l..31;
var
RabDay, BolnDay: Days;
t: boolean;
k; Integer:
62 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта
а) может ли переменная RabDay принимать значения 1,2,30,0?
Ь) могут ли значения переменных RabDay и BolnDay быть одинаковыми?
с) допустимы ли представленные ниже операторы?
RabDay :» 25
BolnDay := 1
t := RabDay = BolnDay
for RabDay := 5 to 30 do
k : = ord( RabDay ) - 2
k : = succ( BolnDay )
k := pred( RabDay )
2. Пусть даны описания:
var
z: 'a*..’z’;
date: 1..31;
digit: ’O’..’9':
month: 1..12:
Допустимы ли операторы?
Date := 1:2:31
month := ord( digit )
month := ord(month )
for z := 'a' to 'z' do
for month := 6 to 31 do
readCmonth )
writeln( z )
3. Пусть дано описание:
var масштаб: ( дюйм, фут. стадия, миля ):
Равнозначны ли фрагменты программ?
a) for масштаб : = дюйм to миля do
преобразовать:
Ь) масштаб :« дюйм:
while масштаб <= миля do
begin
преобразовать:
масштаб : = succ( масштаб )
end:
Оператор варианта
Теоретические вопросы
1. Что общего у операторов case и if?
2. Чем различаются операторы case и if?
3. Верно ли, что выражение после служебного слова case называется селекто-
ром или переключателем?
4. Верно ли, что список констант называют списком меток?
5. Чем метка в операторе case отличается от обычной программной метки?
6. Может ли список констант в операторе case состоять из одной константы?
Оператор варианта 63
7. Какой символ разделяет константы в списке констант оператора case?
8. Каким служебным словом заканчивается оператор case?
9. Верно ли, что оператор case выполняется следующим образом: сначала вы-
числяется значение выражения селектора, затем выполняется тот оператор,
константа которого равна значению селектора?
10. Может ли присутствовать ветвь el se в операторе case?
11. Как будет выполняться оператор case, если ни одна из констант не равна те-
кущему значению селектора?
12. Какой тип может иметь селектор оператора case?
13. Верно ли, что все константы в списке меток должны иметь тип, совместимый
с типом селектора?
14. Как записывается список меток альтернатив, если метки имеют тип диа-
пазон?
15. Что означает фраза «константы в альтернативах должны быть уникальными
в пределах оператора варианта»?
16. Могут ли в операторе пересекаться метки, тип которых — диапазон?
17. Могут ли метки, тип которых — диапазон, содержать константы, указанные
в данной или других альтернативах?
18. Сколько операторов может содержать каждая альтернатива?
19. Каким символом заканчивается каждая альтернатива?
20. Может ли альтернатива быть пустым оператором?
21. Сколько операторов может содержать ветвь el se в операторе case?
Упражнения
1. Замените вложенный условный оператор оператором варианта:
i f Ch = '1' then N : = 1 else
if Ch = * J' then N := 5 else
if Ch = 'k' then N := 10 else
if Ch = ’I’
then N := 100
else N := 500:
2. Определите значения переменных p и d после выполнения операторов:
р := true:
d := 1:
case k mod 10 of
3. 2. 7. 5: d := k;
1::
4, 8:
begin
p :- false:
d := 2
end;
9. 6:
begin
p := false:
64 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта
d :» 3
end
end;
если переменная k имеет значение:
а) 6;
Ь) 235;
с) 71.
3. Что будет напечатано в результате выполнения следующего фрагмента про-
граммы:
var
season: ( winter, spring, summer, autumn );
begin
case season of
winter: writelnC ’Winter’ ):
spring: writelnC 'Spring' );
summer: writelnC 'Summer' ):
autumn: writelnC 'Autumn' )
end
end;
если переменная season принимает значение:
a) spring;
b) summer;
с) зима;
d) ord( winter ).
4. Восстановите условие задачи:
program Day_Week;
var
Day: 1..7;
begin
write ( 'Введите номер дня недели: ');
readln ( Day );
case Day of
1: writein ( 'Понедельник' );
2: writein ( 'Вторник' );
3: writein (' Среда' );
4: writein ( 'Четверг' );
5: writein ( 'Пятница' );
6: writeln ( 'Суббота' );
7: writeln ( 'Воскресенье' )
end
end.
5. Напишите фрагмент программы для определения величины dayscount, зна-
чение которой равно количеству дней в заданном месяце 1998 года.
6. Восстановите условие задачи:
program symbols;
var
n. kO. kl. k2: integer;
ch: char:
Упражнения, задачи, программы 65
begin
kl := 0:
kl := 0:
к2 := 0:
read( Ch );
while Ch <> ’do
begin
n := ord(Ch) - ord(’A');
case n of
0: k0 := kO + 1;
1: kl := kl + 1;
2: k2 ;= k2 + 1
end;
read( Ch )
end:
readin;
writeln( kO, kl. k2 )
end.
7. Что будет напечатано в результате работы следующей программы:
program WhatIsIt;
var
kl. k2. k3. n. m: integer;
begin
m ;= 1989;
kl := 0;
k2 := 0;
k3 := 0;
while m <> 0 do
begin
n := m mod 10;
m := m div 10;
n ;= n-6;
case n of
1; kl := kl + 1;
2; k2 ;= k2 + 1;
3: k3 := k3 + 1
end
end;
writelnC kl. k2. k3 )
end.
8. Составьте программу вычисления по заданному радиусу и значению пере-
менной k площади круга (если k = 1), длины окружности (если k = 2) или
объема шара (если k = 3).
9. Пусть текст вводится с клавиатуры. Известно, что в тексте встречаютогком-
ментарии, которые расположены между знаками (* и *). Исключите все ком-
ментарии из текста.
Упражнения, задачи, программы
1. В следующем фрагменте программы по значению переменной типа Country
(название страны) присвоить переменной типа Capi tai название столицы этой
страны.
3 Зак. 906
66 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта
type
Country = ( Австрия. Болгария. Греция.
Италия. Норвегия. Франция.ФРГ );
Capital = ( Вена. София. Афины. Рим,,
Осло. Париж. Бонн );
2. В следующем фрагменте программы по значению переменной Р (русское на-
звание языка программирования) присвоить переменной А английское на-
звание этого языка.
var
Р: (Ада. Бейсик. Модула2. Лисп.
Паскаль. Пл1. Фортран );
А: ( ada, basic, pascal. modula2.
lisp, pascal, pll. fortran );
3. В следующем фрагменте программы по значению литеры-цифры d присво-
ить переменной п название этой цифры.
type
название - (ноль. один. два. три. четыре, пять);
van
d: ’О’..’5':
п: название;
4. В следующем фрагменте программы определите 1 — интервал, образованный
нотами nl и n2 (nl п2): секунда — это интервал из двух соседних (по кругу)
нот (например, ре и ми, си и до), терция — интервал через ноту (например,
фа и ля, си и ре) и т. д.
type
нота = ( до. ре, ми. фа. соль, ля. си );
интервал = ( секунда, терция, кварта.
квинта, секста, септима );
var
nl, п2; нота;
i; интервал;
5. В следующем фрагменте программы замените значение переменной х, озна-
чающее некоторую длину в единицах р, значением в метрах.
type
единица = (дециметр, километр, метр.
миллиметр, сантиметр );
длина = real;
var
х; длина;
р; единица;
6. В следующем фрагменте программы выведите название цвета, отвечающее
значению переменной с.
type
цвет » ( черный, белый, синий );
var
с: цвет;
7. В следующем фрагменте программы введите литеру и присвойте перемен-
ной х соответствующее этой литере значение типа letter.
type
letter = ( a, b, с, d );
Упражнения, задачи, программы 67
van
х: letter;
♦8 . Для значений целого числа k от 1 до 99 напечатайте фразу «мне k лет», учи-
тывая при этом, что при некоторых значениях k слово «лет» надо заменить
словом «год» или «года».
*9 . Для натурального числа k напечатайте фразу «мы нашли k грибов в лесу»,
согласовав окончание слова «гриб» с числом k.
10. В следующем фрагменте программы определите новый курс К2 корабля, если
корабль сначала шел по курсу К1, а затем его курс был изменен согласно при-
казу ПР.
type
курс = ( СЕВЕР. ВОСТОК. ЮГ. ЗАПАД );
приказ = ( ВПЕРЕД. ВЛЕВО. ВПРАВО. НАЗАД );
var
KI. К2: курс;
ПР; приказ;
11. В следующем фрагменте программы переменной t присвойте значение true,
если тройка у, m, d образует правильную дату, и значение false в противном
случае (например, 31 июня и т. п.).
type
месяц = ( янв. фев. мар. апр. май. июн.
июл, авг. сен. окт, ноя. дек );
var
у; 1900..2000;
т: месяц;
d; 1..31;
t; boolean;.
12. В следующем фрагменте программы по дате d, m, у определите дату следую-
щего дня — dl, ml, yl.
type
месяц = ( янв. фев. мар. апр. май. июн.
июл. авг. сен. окт. ноя. дек );
var
d. dl; 1..31;
m. ml; месяц;
у; 1901..2000;
yl; 1901..2001;
13. Пусть дан фрагмент программы:
type
месяц = ( янв. фев. мар. апр. май. июн.
июл. авг. сен, окт, ноя. дек );
var
k; 1..366;
d: 1..31;
m: месяц;
а) определите к — порядковый номер того дня високосного года, который
имеет дату d, m.
Ь) определите d, m — дату k-го по счету дня високосного года.
68 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта
*14. Пусть дан фрагмент программы:
type
число = 1..31:
месяц = ( янв, фев. мар, апр, май. июн,
июл, авг, сен. окт, ноя. дек ):
день_недели = ( вс, пн, вт. ср, чт, пт. сб ):
var
d: число;
m: месяц:
wdl, wd: день_недели:
k: 0..12:
Считая, что год високосный и его 1 января приходится на день недели wdl,
определите:
a) wd — день недели, на который приходится день с датой d, m;
b) k — количество понедельников в году, приходящихся на 13-е число.
♦ 15. Пусть значение функции f(n) равно количеству букв в записи числа п рус-
скими словами f(l)=4 (один), f(3)=3 (три), f(42)=8 (сорокдва) ит. п. Напеча-
тайте все натуральные числа п, меньшие 100, для которых f (п)=п.
16. По дате (месяц и день) рождения определите знак Зодиака.
♦ 17. В старояпонском календаре был принят 60-летний цикл, состоявший из пяти
12-летних подциклов. Подциклы обозначались названиями цвета: зеленый,
красный, желтый, белый, черный. Внутри каждого подцикла года носили на-
звания животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы,
обезьяны, курицы, собаки и свиньи (1984 год — год зеленой крысы — был
началом очередного цикла). Напишите программу для ввода номера некото-
рого года нашей эры и вывода его названия по старояпонскому календарю.
♦ 18. Напечатайте календарь заданного месяца 1998 года, зная, что 1 января 1998 го-
да — четверг.
* 19. Пусть число записано римскими цифрами: М — 1000, D — 500, С — 100,
L — 50, X — 10, V — 5,1 — 1. Выведите его запись арабскими цифрами.
♦20. Пусть на шахматной доске заданы два поля: р1 и р2. Определите, какая из
шахматных фигур при установке на поле р 1 бьет фигуру, стоящую на поле р2.
Координаты на шахматной доске определяются по горизонтали от а до Л и
по вертикали от 1 до 8. Белые фигуры двигаются от 8-й горизонтали к 1-й,
а черные — от 1 -й к 8-й.
Глава 8
Регулярные типы данных
Теоретические вопросы
1. Дайте определение массива.
2. Верно ли, что массив — это структурированный тип данных, состоящий из
фиксированного числа элементов, имеющих один и тот же тип?
3. Какие типы данных не допустимы для компонентов массива? Почему?
4. В каком разделе (разделах) программы допустимо описание данных регу-
лярного типа?
5. Где и как определяется общее число элементов массива?
6. Можно ли размерность массива определить с помощью типа диапазон?
7. Дайте определение индекса. Какие типы данных можно использовать при
описании индекса?
8. Может ли левая граница индексов массива быть меньше правой?
9. Может ли левая граница индексов массива быть положительной?
10. Может ли левая граница индексов массива быть равной нулю?
11. Может ли левая граница индексов массива быть отрицательной?
12. Как осуществляется доступ к каждому элементу массива?
13. Когда индекс элемента в массиве совпадает с порядковым номером этого эле-
мента?
14. Верно ли, что название регулярный тип массивы получили за то, что в них
объединены логически однородные элементы, упорядоченные по индексам,
определяющим положение каждого элемента в массиве?
15. Что называется базовым типом?
16. Верно ли, что могут существовать массивы массивов?
17. Верно ли, что элементами массива могут быть данные любого типа, включая
структурированные?
18. Может ли индекс в правильно составленной программе выходить за пределы,
определенные типом диапазон?
70 Глава 8. Регулярные типы данных
19. Может ли индекс быть выражением целого типа?
20. Может ли индекс быть выражением вещественного типа?
21. Может ли индекс быть выражением любого порядкового типа?
22. Какой массив называется одномерным?
23. Какой массив называется двумерным?
24. Какой массив называется и-мерным?
25. Верно ли, что одномерный массив соответствует понятию линейной табли-
цы (вектора)?
26. Верно ли, что двумерный массив соответствует понятию прямоугольной таб-
лицы (матрице, набору векторов)?
27. Существуют ли ограничения на размерность массива?
28. Можно ли в описании массива использовать предварительно определенные
константы?
29. В какой последовательности располагаются в памяти элементы одномерно-
го массива?
30. Верно ли, что элементы с большими значениями индекса хранятся в боль-
ших адресах памяти?
31. Верно ли, что двумерные массивы располагаются в памяти таким образом,
что второй индекс изменяется быстрее, чем первый?
32. Верно ли, что матрица расположена в памяти по строкам?
33. Всегда ли работа с массивом сводится к работе с его компонентами?
34. Обязательно ли количество элементов массива должно быть фиксирован-
ным, то есть определяться при трансляции программы?
35. Может ли процедура read(x) ввести весь массив х целиком?
36. Можно ли с помощью стандартной процедуры wr 11е (х) вывести весь массив х
целиком?
37. Как можно сымитировать работу с массивом переменной длины?
38. Возможно ли следующее описание:
var a: array[integer]
39. Предложите способы вывода элементов двумерного массива.
Векторы. Задачи, программы
1. Используя следующий фрагмент:
const
п = 41;
van
х: array El..n] of real:
у: real:
напишите программы для вычисления перечисленных формул:
Векторы. Задачи, программы 71
а) у - Vi xi 'х2 I >
Ь) у = max xz;
с) г/ = Л -х2 +х3 -...-х^ + хл;
d) У = *iX„+*2*n-\+- + xnxx-,
е)у = xj2 + х3 + Х5 +... + хл;
О У = *п (*п + *„-! )(*л + *л-1 + *и-2 ) • • • (*л + • • • + Xj ) .
2. С помощью следующего фрагмента программы по заданному массиву С полу-
чите массив В, используя правило: элементу В[1 ] присвоить true, если С[1 ] —
цифра, и fа 1 se — в противном случае.
const
m - 50;
var
С: array [0..m] of char;
B; array [0..m] of boolean;
3. Пусть дан фрагмент программы с заданными массивами Пол и Вес:
type
имя = ( Валя. Гена, Женя, Коля, Маша,
Нина. Саша, Таня, Федя, Шура );
var
Пол array [имя] of ( муж. жен );
Вес ; array [имя] of 30..150;
.И ; имя;
Ср ; real;
а) определите имя самого полного мужчины И;
Ь) определите средний вес женщин Ср.
4. С помощью следующего фрагмента программы зашифруйте текст t, заменив
в нем каждую литеру значением элемента массива к, индексом которого явля-
ется эта литера.
type
текст = array [1..72] of char;
шифр = array [char] of char;
var
t; текст;
k; шифр;
5. Пусть дано 100 целых чисел. Распечатайте их в обратном порядке по 6 чисел
в строке.
6. Пусть дано 50 чисел. Определите, сколько среди них отличных от последне-
го числа.
7. Пусть дано 100 чисел. Напечатайте сначала все отрицательные из них, за-
тем — все остальные.
8. По заданным вещественным числам a0,al,...9a20,t вычислите значение мно-
гочлена Дго*20 + Я|9х19 +... + AjX + а0 и его производной в точке t.
9. Напечатайте все буквы русского алфавита.
72 Глава 8. Регулярные типы данных
10. Пусть вводится последовательность символов, длина которой не больше на-
перед заданного числа п_тах. Замените каждую из рядом стоящих групп
точек одной точкой. Решите эту задачу в двух вариантах:
а) полученная последовательность просто выводится на печать, а массив,
в котором хранится исходная последовательность, не изменяется;
♦Ь) преобразованная последовательность должна заместить исходную в мас-
сиве.
11. Известно, что длина последовательности символов не превышает наперед
заданного числа п_тах. Подсчитайте максимальное количество идущих под-
ряд пробелов.
12. Пусть дано натуральное число п и вещественные числа ах,..., ап. В последова-
тельности Дь..., ап все отрицательные члены увеличьте на 0,5, а все неотрица-
тельные, меньшие среднего арифметического, замените на 0,1.
13. Пусть даны натуральное число п, целые числа ..., ап. Получите сумму по-
ложительных, число отрицательных и число нулевых членов последователь-
ности ах,ап,
♦ 14. Пусть вводится последовательность символов, длина которой не превыша-
ет 80. Напечатайте те русские буквы (в алфавитном порядке), которые встре-
чаются в заданной последовательности.
15. Пусть дан текст из 80 литер. Напечатайте сначала все цифры, входящие в не-
го, а затем все остальные литеры, сохраняя при этом взаимное расположение
литер в каждой из этих двух групп.
16. Пусть дан текст, содержащий от 1 до 70 букв. Напечатайте буквы текста в об-
ратном порядке.
♦ 17. Пусть дан непустой текст из прописных русских букв, за которым следует
точка. Определите, упорядочены ли эти буквы по алфавиту.
♦ 18. Пусть дан текст, за которым следует восклицательный знак. Замените все
прописные русские буквы, встречающиеся в тексте, строчными.
* 19. Пусть дан текст, состоящий из слов. Под словом понимается последователь-
ность литер, не содержащая пробелов и знаков препинания. Напечатайте все
слова, состоящие из неповторяющихся символов.
20. Пусть вводится последовательность символов. Напечатайте те строчные ла-
тинские буквы, которые не вошли во введенную последовательность.
♦ 21. Пусть дан непустой текст из цифр, за которым следует точка. Напечатайте
цифру, наиболее часто встречающуюся в этом тексте (если таких цифр не-
сколько, напечатайте любую из них).
♦ 22. Пусть даны целые числа ах, ..., аюо. Получите новую последовательность из
100 целых чисел, заменяя а, нулями, если значение \at\ не равно максималь-
ному из ai,..., йюо, и заменяя а, единицей — в противном случае (г = 1,..., 100).
♦ 23. Пусть даны целые числа аь..., а25, Ьх,b2s. Преобразуйте последовательность
bi,..., 625 по правилу, согласно которому если а, < 0, то bi увеличивается в 10 раз,
иначе bi заменяется нулем (i - 1,..., 25).
Векторы. Задачи, программы 73
24. Пусть даны вещественные числа аьа25. Требуется умножить каждый член
последовательности a, (i=l,25) на квадрат ее наименьшего члена, если а, >
О, и на квадрат ее наибольшего члена, если ai< 0.
25. С помощью следующего фрагмента программы вычислите сумму s тех эле-
ментов массива х, индексы которых совпадают со значениями элементов мас-
сива а (я, * а, при i * j).
var
х: array [1..100] of real;
a: array [1..30] of 1..100;
s: real;
26. Пусть даны целые числа ab ..., £99. Получите новую последовательность, вы-
бросив из исходной максимальный и минимальный члены.
27. Пусть даны целые числа аь ..., ап, каждое из которых отлично от нуля. Если
в последовательности отрицательные и положительные члены чередуются,
то ответом должна служить сама исходная последовательность. Иначе — по-
лучите все отрицательные члены последовательности, сохранив порядок их
следования.
28. Пусть задан текст размером не более одной строки. Напечатайте, сколько раз
в тексте встречается каждая буква латинского алфавита.
29. Пусть дана последовательность из 100 различных целых чисел. Найдите
среднее арифметическое чисел этой последовательности, расположенных
между максимальным и минимальным числами (в сумму включить и оба этих
числа).
30. Пусть даны координаты п точек на плоскости: хь у\,хп, уп (и - 20). Найдите
номера двух точек, расстояние между которыми наибольшее (считайте, что
такая пара точек единственная).
31. С помощью следующего фрагмента программы напечатайте литеры мас-
сива s в виде таблицы:
ЗД52...5л_25л_]
const
п ж 20;
var
s; array [1..n] of char;
32. Используя следующий фрагмент программы, преобразуйте массив х по ука-
занному ниже правилу ( хк — значение &-го элемента массива после преобра-
зования):
const
п = 100;
var
х: array [1..n] of real;
74 Глава 8. Регулярные типы данных
а) хк = max х, при 1 < i < k;
b) элементы массива расположите в обратном порядке;
с) х} = xbx' = хп,х'к =(**_! +xk +x*+i)/3 приб = 2, 3,n-1;
d) элементы массива циклически сдвиньте на одну позицию влево: х' = Х],
= xk+i при k - 1, 2,п-1;
е) элементы массива циклически сдвиньте на две позиции влево.
33. Пусть в массиве содержатся результаты измерений температуры воздуха, ко-
торые проводились ежедневно в течение декабря месяца. Определите:
а) среднемесячную температуру декабря;
Ь) сколько раз температура была выше 0°С;
с) день, когда температура была наибольшей;
d) день, когда первый раз температура поднялась выше нуля, и увеличьте
эту температуру на 1°С;
е) любой из самых холодных дней декабря;
f) сколько дней в декабре температура была выше средней;
g) день, когда температура была ближе всего к средней температуре в декабре;
h) минимальную температуру второй декады декабря;
i) минимальную температуру тех дней декабря, которые следуют после по-
следнего из самых теплых дней в этом месяце;
j) температуры любого из самых холодных и самых теплых дней и поменяйте
их местами;
к) среднюю температуру тех дней, которые предшествуют первому из самых
холодных дней в декабре;
1) любые два самых холодных дня;
ш) сколько раз в декабре температура меняла знак;
п) первую из минимальных температур и вытесните ее на последнее место,
сдвинув все остальные к началу массива.
♦34. Используя следующий фрагмент программы, преобразуйте массив х по ука-
занному ниже правилу, воспользовавшись массивом у как вспомогательным:
var
х. у: array [1..70] of real:
k: 1..69:
а) все отрицательные элементы массива х перенесите в его начало, а все ос-
тальные — в конец, сохраняя исходное взаимное расположение как среди
отрицательных^ так и среди остальных элементов;
Ь) элементы массива х циклически сдвиньте на к позиций влево.
♦35. Пусть элементы массива х упорядочены по неубыванию, а элементы мас-
сива у — по невозрастанию. Используя следующий фрагмент программы,
объедините элементы этих двух массивов в один массив z так, чтобы они ока-
зались упорядоченными по неубыванию:
Векторы. Задачи, программы 75
const
к = 50;
m = 20;
п = к + m;
var
х: array [1. .к] of real;
у; array [1..m] of real;
z; array [1..n] of real;
♦36. Пусть даны вещественные числа ..., х101 д ..., у101. Получите последова-
тельности jq, •••, *п)1, Я, Ди , преобразовав для получения члены
х,, у, по правилу: если они оба отрицательны, то каждый из них увеличива-
ется на 1,25; если отрицательно только одно число, то отрицательное число
заменяется его квадратом; если оба числа неотрицательны, то каждое из них
заменяется средним арифметическим исходных значений.
37. Пусть даны вещественные числа 01, ..., а3о. Получите:
а) шах(б11+азо, 02+029,015+01б);
Ь) min(0i0i6, 02017, ..., 0150зо)«
38. Пусть даны вещественные числа 0Ь ..., 020. Преобразуйте эту последователь-
ность по правилу: большее из а, и 0ю+1 (i = 1,..., 10) примите в качестве нового
значения 0,, меньшее — в качестве нового значения ш
39. Пусть даны целые числа 0Ь..., ап. Если в данной последовательности ни одно
четное число не расположено после нечетного, то напечатайте все отрица-
тельные члены последовательности, иначе — все. положительные. Порядок
следования чисел в обоих случаях замените обратным.
40. Пусть дан фрагмент программы:
var
к: 0..9999:
d: array [1..4] of ’О’..’9’:
♦ а) запишите в массив d цифры числа к;
Ь) получите целое к, составленное из цифр массива d.
♦ 41. Напечатайте заданный текст из 100 литер, удалив из него повторные вхож-
дения каждой литеры.
♦ 42. Определите, сколько различных литер входит в заданный текст, содержащий
не более 100 литер и оканчивающийся точкой (в сам текст точка не входит).
43. В массиве из 20 целых чисел найдите наибольший элемент среди отрицатель-
ных (считайте, что такой элемент один) и поменяйте его местами с первым
элементом.
44. Пусть даны натуральные числа п, 0Ь ..., ап. Определите количество членов аь
последовательности 0Ь..., ап:
а) являющихся нечетными числами;
Ь) кратных 3 и не кратных 5;
с) являющихся квадратами четных чисел;
d) удовлетворяющих условию: а < ;
2
76 Глава 8. Регулярные типы данных
е) удовлетворяющих условию 2к < ak < k\\
f) имеющих четные порядковые номера и являющихся нечетными числами.
45. С помощью следующего фрагмента программы присвойте каждому элемен-
ту массива КД значение, равное количеству дней в соответствующем месяце
високосного года.
type
месяц = ( янв. фев. мар, апр. май. июн,
июл, авг. сен. окт, ноя. дек );
var
КД: array [месяц] of 28..31;
46. Пусть даны вещественные числа ах,..., ап1 Ьх,..., Ьп. Вычислите произведение
(al+bn){a2+bn_i)...{an+bl).
47. Используя следующий фрагмент, напишите программы для решения пере-
численных ниже задач:
const
п = 40;
var
х: array [1..nJ of integer;
у, k: integer;
t: boolean;
♦ а) переменной t присвоить значение true, если элементы массива х упорядо-
чены по возрастанию, иначе значение fа 1 se;
♦b) переменной t присвоить значение true, если в массиве х нет нулевых эле-
ментов и при этом положительные элементы чередуются с отрицатель-
ными, иначе значение false;
с) переменной к присвоить либо номер первого вхождения у в массив х, либо
число п+1, если у не входит в х;
♦ d) вычислить у = х1 + х1х2 + х1х2х3 + ••• + *1х2...хда, где т — либо номер пер-
вого отрицательного элемента массива х, либо число п, если в массиве х
нет отрицательных элементов.
48. Пусть дан текст из 80 литер. Определите, симметричен ли он, то есть читает-
ся ли он одинаково слева направо и справа налево.
ПРИМЕЧАНИЕ В последующих шести задачах рекомендуете^ не использовать вспомога-
тельный массив.
49. Пусть дан массив из N элементов. Каждый отрицательный элемент замените
полусуммой тех двух элементов, которые стоят рядом с ним справа и слева.
50. Пусть дана последовательность из Nэлементов. Увеличьте ее, вставив после
каждого минимального элемента максимальный.
51. Пусть дана последовательность из У элементов. Уменьшите ее, удалив пер-
вый из отрицательных и минимальный из положительных (считайте, что та-
кой элемент один) и сдвинув все остальные к началу.
♦ 52. Пусть дана последовательность из N элементов. Уменьшите ее, удалив все
минимальные и максимальные элементы и сдвинув все остальные к началу
последовательности.
Векторы. Задачи, программы 77
53. Пусть дана последовательность из Nэлементов. Увеличьте ее, вставив после
каждого элемента такой же.
54. Замените каждый элемент массива средним арифметическим всех предшест-
вующих ему элементов.
55. С помощью следующего фрагмента программы по массиву t, где^указана тем-
пература каждого дня некоторого невисокосного года, определйте m — назва-
ние месяца с наибольшей среднемесячной температурой:
type
месяц = (янв. фев. мар. апр. май. июн, июл. авг,
сен. окт. ноя. дек);
var
t : array [1..365] of real;
m ; месяц;
56. Пусть даны вещественные числа аи ..., а15. Получите:
57. Пусть даны вещественные числа а1954, а1955,..., а2ооз ~ количество осадков (в мил-
лиметрах), выпавших в Воронеже в течение последних 50 лет. Вычислите
среднее количество осадков и отклонение от среднего для каждого года.
58. Пусть даны вещественные числа аи..., а20. Получите числа Ьиi20, где 6, —
среднее арифметическое всех членов последовательности аи ..., а20, кроме я,
(г-1,2,..., 20).
59. Пусть даны натуральные числа n3Q, вещественные числа хи..., х30. Вычи-
слите:
M^+... + ЛзоХзо
«i + ... + пзо
60. Используя следующий фрагмент программы, упорядочьте массив х по не-
убыванию (то есть переставьте его элементы так, чтобы для всех k выполня-
лось условие xk < хЬ1) в соответствии с перечисленными ниже алгоритмами
сортировки (упорядочения):
const
п = 100;
var
х : array [1..n] of real;
♦а) сортировка выбором — отыскивается максимальный элемент и перено-
сится в конец массива; затем этот метод применяется ко всем элементам,
кроме последнего (он уже находится на своем месте) и т. д.;
Ь) сортировка обменом (пузырьковая сортировка) — последовательно срав-
ниваются пары соседних элементов xk и (k = 1, 2,3, ..., п-1), и если
хь>хы> то они переставляются; тем самым наибольший элемент ока-
зывается на своем месте в конце массива; затем этот метод применяется
ко всем элементам, кроме последнего, и т. д.;
78 Глава 8. Регулярные типы данных
♦ с) сортировка вставками — пусть первые k элементов массива уже упорядо-
чены по неубыванию; берется (k + 1)-й элемент и размещается среди пер-
вых k элементов так, чтобы упорядоченными оказались уже k + 1 первых
элементов; этот метод применяется при k от 1 до п - 1.
♦61. Пусть элементы массива х упорядочены по возрастанию. С помощью пред-
ставленного ниже фрагмента программы присвойте переменной к номер эле-
мента массива х, равного числу у, или 0, если такого элемента нет. При этом
использовать следующий метод двоичного (бинарного) поиска: сравнить у
со средним элементом массива (или элементом около середины); если эти
числа равны, поиск завершается, если же у меньше среднего элемента, то у надо
искать в левой половине массива, а иначе — в правой. Далее к выбранной
половине применяется этот же алгоритм.
const
п = 500:
var
х : array [l..n] of integer:
у : integer:
k : 0..n:
62. Пусть даны две последовательности по 30 целых чисел в каждой. Найдите
наименьшее среди тех чисел первой последовательности, которые не входят
во вторую последовательность, считая, что хотя бы одно такое число есть.
♦63. Пусть дана последовательность из 20 целых чисел. Определите количество
инверсий в этой последовательности (то есть таких пар элементов, в кото-
рых большее число находится слева от меньшего: х, > Xj при i <j).
64. Пусть дан текст из строчных латинских букв, за которым следует точка. Напе-
чатайте в алфавитном порядке все буквы, которые входят в этот текст по од-
ному разу.
♦65. Пусть даны натуральное число п и символы st,..., s„, среди которых есть двое-
точие. Получите все символы:
а) расположенные до первого двоеточия включительно;
Ь) расположенные после первого двоеточия;
с) расположенные между первым и вторым двоеточием; если второго двое-
точия нет, то получите все символы, расположенные после единственно-
го имеющегося двоеточия.
66. Пусть даны натуральное число п и символы ..., sn. Исключите из последо-
вательности ..., sn группы символов, расположенные между открывающей
и закрывающей скобками. Сами скобки тоже должны быть исключены. Пред-
полагается, что внутри каждой пары скобок нет других скобок.
♦ 67. Пусть даны вещественные числа аи ..., ап. Если в результате замены отрица-
тельных членов последовательности aif..., ап их квадратами члены будут обра-
зовывать неубывающую последовательность, то получите сумму членов ис-
ходной последовательности; в противном случае получите их произведение.
* 68. Пусть даны вещественные числа rif..., г17, среди которых заведомо есть как отри-
цательные, так и неотрицательные. Получите#^ +... +xsys, гдех1?..., хр — отри-
Векторы. Задачи, программы 79
дательные члены последовательности rt,г17, взятые в порядке их следования,
Уь •••> Уч — неотрицательные члены, взятые в обратном порядке, s = min(p, q).
69. Пусть даны вещественное число а и массив вещественных чисел Q[l...n].
Выберите два числа b и с из массива Q таким образом, чтобы числа a, i, с мог-
ли быть длинами сторон:
♦ а) треугольника (если таких чисел в массиве Q несколько, выберите первые
йз них);
♦ Ь) треугольника (если таких чисел в массиве Q несколько, выберите послед-
ние из них); вычислите площадь этого треугольника;
♦ с) треугольника; подсчитайте, сколько пар таких чисел а и b в массиве Q;
* d) остроугольного треугольника; вычислите его площадь;
* е) равнобедренного тупоугольного треугольника; вычислите его площадь;
♦ f) треугольника, площадь которого максимальна среди всех площадей;
♦ g) прямоугольного треугольника, площадь которого максимальна среди всех
площадей;
♦ h) треугольника; определите вид этого треугольника: равносторонний, рав-
нобедренный, разносторонний;
* i) треугольника; определите вид этого треугольника: прямоугольный, тупо-
угольный, остроугольный;
* j) треугольника, площадь которого максимальна среди всех площадей; опре-
делите вид этого треугольника: равносторонний, равнобедренный, разно-
сторонний, прямоугольный, тупоугольный, остроугольный.
♦70. Используя следующий фрагмент программы, выберите из массива А подмас-
сив В с заданной суммой элементов s или сообщите, что такого подмассива
не существует:
const
m = 50:
var
А : array Cl..m] of Integer:
В : array of integer:
S : integer:
‘71.Используя следующий фрагмент программы, введите:
type
слово » array Cl..5] of char:
список » array [1..60] of слово:
var
С : список:
а) все слова из списка С, отличные от слова hello\
b) то слово из списка С, которое лексикографически (по алфавиту) предшест-
вует всем другим словам этого списка (считайте, что все слова различны);
с) текст, составленный из последнйх литер всех слов списка С;
d) все слова из списка С, содержащие ровно две буквы d.
72. Пусть во входном файле input задано от 1 до 6 букв, за которыми следует точка.
I
80 Глава 8. Регулярные типы данных
Используя следующий фрагмент программы, введите эти буквы и запишите
их в начало строки s, дополнив конец этой строки пробелами:
var s : array Cl..6] of char;
73. Используя следующий фрагмент программы, определите, сколько раз (к)
в строку s входят литеры, перечисленные в константе v:
const
v = 'aeiou';
type
строка = array [1..200] of char;
var
s: строка;
k 0..200;
♦74. Пусть дан текст из 60 литер. Напечатайте только строчные русские буквы,
входящие в этот текст.
♦75. Пусть дан текст из строчных русских букв, за которым следует точка. Напе-
чатайте этот текст заглавными русскими буквами.
76. Известно, что в начале строки s находится не более 40 латинских букв, за кото-
рыми следуют пробелы. Напечатайте эту строку, предварительно преобразо-
вав ее так, как показано ниже, и используя следующий фрагмент программы:
type
строка = array [1..80] of char;
var
s ; строка;
♦ а) все последовательности abc замените последовательностями def\
♦ b) удалите первое вхождение да, если такое есть (образовавшуюся «дыру»
заполните последующими буквами, а в конец добавьте пробел);
♦ с) удалите все вхождения th\
d) замените последовательностью ks первое вхождение х, если такое есть;
е) после каждой буквы q добавьте букву и;
♦ f) замените все последовательности ph буквой /, а все последовательности
е d — последовательностями ing.
Задания для самостоятельной работы
1. Пусть даны вещественные числа xif х2,..., хп, yif у2,уп, rlf r2t..., гп. Выясните,
есть ли на плоскости точка, принадлежащая всем кругам clf с2,..., с„, где с, имеет
центр с координатами х„ г/, и радиус г,.
2. Пусть даны вещественные числа aif а2,..., а2п. Эти точки определяют п интерва-
лов числовой оси (aif а2), (а3, (а2п_ь а2п). Является ли интервалом объеди-
нение этих интервалов? Если да, то указать концы объединенного интервала.
3. Пусть даны вещественные числа alf а2,..., а2п. Эти точки определяют п интер-
валов числовой оси (at, а2), (дз> яД •••> (я2л-1, а2п)- Имеются ли точки числовой
оси, принадлежащие по крайней мере трем каким-нибудь из данных интер-
валов? Если да, то выести любую из этих точек.
Матрицы 81
4. Пусть даны целые числа аи a2f..., ап. Пусть М — наибольшее, т — наимень-
шее из них. Получите в порядке возрастания все целые числа из интервала
(ти, М), которые не входят в последовательность аи а2,ап.
5. Пусть даны координаты центров п окружностей и их радиусы. Определите
число пересекающихся окружностей.
6. Присвойте переменной t значение true, если в некотором массиве нет нуле-
вых элементов и при этом положительные элементы чередуются с отрица-
тельными, в противном случае присвойте значение false.
7. Пусть имеются десять гирь весом aif а2,aiQ. Обозначим через ck число спо-
собов, которыми можно составить вес k, то есть ck — это число решений урав-
нения а2х2+...+ Я1о*1о= k, где xi может принимать значения 0 или 1
(i - 1,..., 10). Получите Ср с2,..., с10.
8. Прямая на плоскости может быть задана уравнением ах + by = с, где а, b од-
новременно не равны нулю, а, Ь, с — целые. Пусть даны коэффициенты не-
скольких прямых ар bp си а2, b2, с2, ...,а„, Ь„, с„. Определите, имеются ли среди
этих прямых совпадающие или параллельные.
9. Прямая на плоскости может быть задана уравнением ах + by = с, где a, b qr-
новременно не равны нулю, a, Ь, с — целые. Пусть даны коэффициенты не-
скольких прямых ait Ьр Ср а2, b2, с2,..., ап, Ьп, с„. Определите, имеются ли среди
этих прямых три, пересекающиеся в одной точке.
10. Пусть даны натуральное число п, целые числа а, Хр х2,..., х„. Если в последо-
вательности Хр х2,..., хп есть хотя бы один член, равный а, то получите сумму
всех членов, следующих за первым таким членом, иначе найдите минималь-
ный среди нечетных чисел последовательности Хр х2,..., х„.
И. Пусть даны целые чйсла а{) а2, ..., ап, среди которых могут быть повторяю-
щиеся. Составьте новый массив из чисел, которые входят в последователь-
ность по одному разу.
12. Пусть даны целые числа аи а2, ..., ап, среди которых могут быть повторяю-
щиеся. Составьте новый массив из чисел, взятых по одному из каждой груп-
пы равных членов данной последовательности.
13. Пусть даны натуральные числа k, и, вещественные числа ар а2,..., а^. Получите
последовательность min^, а2,..., ak), min(aH, а*+2,..., a2k\..., ..., а^).
14. Пусть даны натуральные числа k, п, вещественные числа аи а2,..., а^. Получите
последовательность max(at, а2,..., ak), max(ak+p ak+2,..., а2А),..., max(a^„_1)+i,..., а^).
15. Пусть даны натуральные числа и, вещественные числа ау а2,..., а^. Получите
min(#i+ 472+...“Ь ak, а^^ д^+2+...“Ь 02^..., a^n_^+i +...+ 0^).
16. Пусть даны натуральные числа k, п, вещественные числа аи а2,..., а^. Получите
max(fli+ а2+...+ ak, 0^+1+ а^+2+...+ a2kf..., ak(n_^+i +... + akn).
17. Пусть даны натуральные числа А, и, вещественные числа аи а2)аы. Получите
min(max(ah а2,ak), тах(лж+ ak+2+...+ a2k),..., тах(яЛ(л_1)+1+...+ 0^)).
82 Глава 8. Регулярные типы данных
18. Пусть даны натуральные числа Л, и, вещественные числа аи а2,..., akn. Получите
max(min(a„ а2,a*), min(aH1+ а*+2+...+ аи),min(at(„_1)+1+...+ а*л)).
19. Пусть дана последовательность чисел. Все ее элементы, не равные нулю, пе-
ренесите, сохраняя их порядок, в начало данной последовательности, а нуле-
вые — в конец.
20. Пусть числовая прямая разбита на произвольные отрезки точками ait а2,..., ап.
Выясните, какому из отрезков принадлежит данная точка х.
21. В массиве из п элементов подсчитайте количество четверок aif ai+{, ai+2, ai+3
идущих подряд членов, в которых:
а) все члены равны;
Ь) все члены различны.
22. Произвольный выпуклый многоугольник задан координатами своих вершин
на плоскости. Найдите самую длинную диагональ данного многоугольника.
23. Вычислите площадь произвольного выпуклого многоугольника, заданного
координатами своих вершин на плоскости, разбив многоугольник на тре-
угольники.
Матрицы
Задачи, упражнения
1. Пусть даны целые числа , а2, а3. Получите целочисленную матрицу В раз-
мером 3x3, для которой Ьу = at - Зау.
2. Пусть даны вещественные числа aif..., b2Q. Получите вещественную
матрицу С размером 10 х 20, для которой су = а, /(1 + Ь}).
3. Получите целочисленную матрицу А размером 8 х 14, для которой atJ - i+2f.
4. Получите вещественную матрицу А размером 23 х 17, для которой:
у
♦5. Пусть дана вещественная матрица А. Получите матрицу Л'вВ*С, где
Матрицы 83
6. Получите вещественную матрицу А размером 7x7, первая строка которой
задается формулой = 2j+3 (j = 1,7), вторая строка — формулой
а каждая следующая строка есть сумма двух предыдущих.
7. Пусть дано натуральное число п и вещественная матрица размером п х 9. Най-
дите среднее арифметическое элементов:
а) каждого из столбцов;
Ь) каждого из столбцов с четным номером.
8. Пусть дано натуральное число п. Выясните, сколько положительных элемен-
тов содержит матрица А размером п х п при выполнении перечисленных ниже
условий:
a) aj = sin(f + j/2);
b) а.. = cos(z2 + л • j);
9. Пусть дана вещественная матрица размером п х т, в которой не все элементы
равны нулю. Получите новую матрицу путем деления всех элементов дан-
ной матрицы на ее наибольший по модулю элемент.
10. Пусть даны натуральное число т, целые числа аиат и целочисленная квад-
ратная матрица порядка т. Строку с номером i назовем отмеченной, если
а, > 0, и неотмеченной — в противном случае:
а) все элементы, расположенные в отмеченных строках матрицы, преобра-
зуйте по правилу: отрицательные элементы заменить на -1, положитель-
ные — на 1, а нулевые оставить без изменения;
Ь) подсчитайте число отрицательных элементов матрицы, расположенных
в отмеченных строках.
И. Пусть дана вещественная квадратная матрица порядка 12. Замените нулями
все ее элементы, расположенные на главной диагонали и выше ее.
12. Пусть даны вещественные числа xlf..., х8. Получите квадратную матрицу по-
рядка 8, образованную по правилу:
84
-13.
14.
15.
16.
17.
18.
19.
20.
21.
Глава 8. Регулярные типы данных
Пусть дана вещественная матрица размером т х п. Определите числа alf..., ат,
равные соответственно:
а) суммам элементов строк;
Ь) произведениям элементов строк;
с) наименьшим значениям элементов строк;
d) значениям средних арифметических элементов строк;
е) разностям наибольших и наименьших значений элементов строк.
Все элементы с наибольшим значением в данной целочисленной квадратной
матрице порядка 10 замените нулями, если эти элементы не принадлежат
первой или последней строкам.
Пусть дана вещественная матрица размером 6x9. Найдите среднее арифме-
тическое наибольшего и наименьшего значений ее элементов, расположен-
ных ниже главной диагонали.
Пусть дана вещественная матрица размером 18 х п. Найдите значение наиболь-
шего по модулю элемента матрицы и укажите его местоположение в матрице.
В данной вещественной квадратной матрице порядка п найдите сумму эле-
ментов строки, в которой расположен элемент с наименьшим значением.
Предполагается, что такой элемент единственный.
В данной вещественной матрице размером 6x9 поменяйте местами строку, со-
держащую элемент с наибольшим значением, со строкой, содержащей элемент
с наименьшим значением. Предполагается, что эти элементы единственные.
В данной квадратной целочисленной матрице порядка 17 укажите индексы
всех элементов с наибольшим значением, не принадлежащих главной и по-
бочной диагоналям.
Пусть дана вещественная матрица размером п х ти, все элементы которой раз-
личны. В каждой строке выберите элемент с наименьшим значением, затем
среди этих чисел выберите наибольшее. Укажите индексы найденного эле-
мента.
Пусть дана вещественная матрица размером п х т. Получите последователь-
ность by..., bn, где bk — это:
а) наибольшее из значений элементов А-й строки;
Ь) сумма наибольшего и наименьшего из значений элементов й-й строки;
с) количество отрицательных элементов в &-й строке;
d) произведение квадратов тех элементов &-й строки, модули которых при-
надлежат отрезку [1; 1,5].
Матрицы 85
22. Пусть дана целочисленная квадратная матрица порядка 8. Найдите наимень-
шее из значений элементов столбца, который обладает наибольшей сум-
мой модулей элементов. Если таких столбцов несколько, надо взять первый
из них.
23. Пусть дано натуральное число п и целочисленная квадратная матрица по-
рядка п. Получите by ..., Ью где 6, — это:
а) значение первого по порядку положительного элемента i-й строки (если
таких элементов нет, то принять 6.- 1);
Ь) сумма элементов, расположенных за первым отрицательным элементом
в i-й строке (если все элементы строки неотрицательны или отрицатель-
ный элемент на последнем месте, то принять Ь.- 100);
с) сумма элементов, предшествующих последнему отрицательному элементу
i-й строки (если все элементы строки неотрицательны, то принять fe, = -1).
24. Пусть дана целочисленная квадратная матрица порядка п. Найдите номера
строк:
а) все элементы которых — нули;
Ь) элементы в каждой из которых одинаковы;
с) все элементы которых четны;
d) элементы каждой из которых образуют монотонную последовательность
(монотонно убывающую или монотонно возрастающую);
е) элементы которых образуют симметричные последовательности.
25. Пусть даны натуральное число п, вещественное число х, вещественная мат-
рица размером п х 2п. Получите последовательность by..., bn из нулей и еди-
ниц, где 6, = 1, если элементы i-й строки матрицы не превосходят х, и &, = 0
в противном случае.
26. Пусть дана вещественная квадратная матрица порядка п. Постройте после-
довательность вещественных чисел а{, ..., ап по правилу: если в i-й строке
матрицы элемент, принадлежащий главной диагонали, отрицателен, то эле-
мент я, равен сумме положительных элементов i-й строки, в противном слу-
чае а, равен произведению отрицательных элементов i-й строки.
27. Пусть дана вещественная квадратная матрица порядка 10. В строках с отри-
цательным элементом на главной диагонали найдите:
а) сумму элементов;
Ь) наибольший из элементов.
28. Пусть дана вещественная квадратная матрица порядка п. Относительно эле-
ментов, расположенных в строках, начинающихся с отрицательного элемен-
та, найдите суммы тех из них, которые расположены соответственно ниже,
выше и на главной диагонали.
29. Пусть дана вещественная квадратная матрица порядка 9. Получите целочи-
сленную квадратную матрицу того же порядка, в которой элемент равен
единице, если соответствующий ему элемент исходной матрицы больше
86 Глава 8. Регулярные типы данных
-30.
•31.
-32.
•33.
•34.
элемента, расположенного в его строке на главной диагонали, и равен нулю —
в противном случае.
Пусть дана вещественная квадратная матрица порядка п. Получите
Х|ХЛ +*2xn-i + ••• + *„*!, где хк — наибольшее значение элементов k-й строки
данной матицы.
Пусть даны натуральное число п > 2 и вещественная квадратная матрица
порядка п. Постройте последовательность by..., Ьп из нулей и единиц, в кото-
рой bi - 1 тогда и только тогда, когда:
а) элементы i-й строки матрицы образуют возрастающую последователь-
ность;
Ь) элементы i-й строки матрицы образуют возрастающую или убывающую
последовательность.
Пусть дана целочисленная квадратная матрица порядка 15. Выясните, име-
ются ли в матрице ненулевые элементы, и если имеются, то укажите индексы:
а) одного из нулевых элементов;
Ь) всех нулевых элементов.
Пусть даны натуральные числа i,j (1 < i < 24,1 < j < 24) и вещественная мат-
рица размером 18 х 24. Поменяйте в матрице местами i-й и j-й столбцы.
Пусть даны натуральное число п и вещественная квадратная матрица по-
рядка п. Постройте последовательность 6h..., bn из нулей и единиц, в которой
bi = 1 тогда и только тогда, когда в i-й строке матрицы есть хотя бы один от-
рицательный элемент.
Пусть даны натуральные числа пит, вещественное число г, вещественная
матрица размером п х т. Получите значение bxf~x + b2f2•+... + Ьп, где bk — пер-
вый по порядку положительный элемент в k-й строке матрицы (k = 1,..., и);
если в k-й строке нет положительных элементов, то bk = 0,5.
Найдите сумму квадратов тех элементов ау квадратной матрицы А поряд-
ка 10, для которых выполняются условия: 2 < i < 9,2 < j< 9,
а 1 • 4- а •. 4- а . 4-
> /-1 j ij—\ **/+1 j у+1
a‘J - 4
Пусть дана вещественная квадратная матрица порядка 9. Вычислите сумму
тех из ее элементов, расположенных на главной диагонали и выше ее, кото-
рые превосходят по величине все элементы, расположенные ниже главной
диагонали. Если на главной диагонали и выше ее нет элементов с указанным
свойством, то ответом должно служить сообщение об этом.
Пусть дана целочисленная квадратная матрица A(atJ) размерности п. Полу-
чите by ..., bn, где элемент 6, равен:
п
a)
п
Матрицы 87
с) ГК;
;=1
п
d) ПЫ;
7=1
♦ е) шаха,.,-minа,,.
J \Zj<M J
39. Будем называть соседями элемента с индексами z, j некоторой матрицы та-
кие элементы, соответствующие индексы которых отличаются от i,j не более
чем на единицу. Для данной целочисленной матрицы A(atj) размером т х т
найдите матрицу В, состоящую из нулей и единиц, элемент которой Ьу равен
единице, когда:
а) все соседи ау меньше самого элемента а/у;
Ь) все соседи ау и сам элемент atj равны нулю;
с) среди соседей atj есть не менее двух элементов, совпадающих с ау.
40. Пусть дана символьная квадратная матрица порядка 10. Замените буквой а
все ее элементы, расположенные выше главной диагонали.
41. Пусть даны натуральное число п и символьная квадратная матрица порядка п.
Получите последовательность Ь{, ..., Ьп из нулей и единиц, в которой = 1
тогда и только тогда, когда в z-й строке число символов звездочки ( *) не мень-
ше числа пробелов.
42. Пусть дана символьная матрица размером 13 х 18. Найдите номер:
а) первой по порядку строки, содержащей наибольшее число цифр;
Ь) первого по порядку столбца, содержащего наименьшее число пробелов на
пересечении со строками, номера которых четны;
с) последней по порядку строки, содержащей наибольшее количество букв
ш и щ\
d) последнего по порядку столбца, в котором содержится наибольшее коли-
чество различных символов.
43. Введите квадратную вещественную матрицу 4-го порядка, элементы кото-
рой заданы для ввода построчно, и распечатайте ее по столбцам.
44. Используя следующий фрагмент программы, вычислите перечисленные ниже
соотношения:
const п = 20;
var
А. В. С : array [l..n, l..n] of real;
x. у ; array [1.,n] of real;
а) С = Л+В;
b) y = Ax\
♦ c) C = A-B;
♦ d) B = В7 (транспонировать).
88 Глава 8. Регулярные типы данных
45. Используя следующий фрагмент программы, присвойте переменной t зна-
чение true, если массивы С и D равны, и значение fа 1 se — в противном случае:
var
С. D : array [0..9, -5..3] of integer;
t : boolean;
♦46. Пусть даны натуральное число п и (построчно) элементы квадратной веще-
ственной матрицы А 5-го порядка. Вычислите n-ю степень этой матрицы
(Л = Л, Лг = Л • Л, Л3 = Л2 • Л и т. д.).
47. Используя следующий фрагмент, напишите программы для решения пере-
численных ниже задач:
type
vector = array [1..20] of integer;
matr = array [1..20] of vector;
var
A ; matr;
x : vector;
В : array [1..20. 1..20] of integer;
а) нечетные строки матрицы А замените вектором х;
b) четные столбцы матрицы А замените вектором х;
с) первые шесть строк массива В замените вектором х;
d) в матрице А поменяйте местами 1-ю и 2-ю строки, 3-ю и 4-ю строки,..., 19-ю
и 20-ю строки (воспользуйтесь вектором х как вспомогательным массивом).
♦ 48. Пусть дана (построчно) вещественная матрица размером 7x4. Переставляя
ее строки и столбцы, добейтесь того, чтобы наибольший элемент (один из них)
оказался в верхнем левом углу.
♦ 49. Используя следующий фрагмент программы, найдите наибольшее расстоя-
ние (D) между точками, рассматривая элементы массива М как координаты
точек на плоскости:
type
точка = array [(х. у)] of real;
var
М : array [1..40] of точка;
D : real;
50. Используя следующий фрагмент программы, найдите сумму элементов s
из заштрихованной области массива А (рис. 8.1):
var
А ; array [1..9. 1..9] of real;
s ; real;'
a) <b) c)
Рис. 8.1. Заштрихованные области
Матрицы 89
51. Используя следующий фрагмент программы, вычислите:
var
D : array [1..10. 1..10] of real:
S real:
io
s = V max Da
52. Используя следующий фрагмент программы, заполните массив А так, как по-
казано ниже:
var А : array [1..10. 1..10] of integer;
Го о 0...0A
fl 2...10
0 1 0...0
1112...20
a)
0 0 2...0
b)
2122...30
0 0 0...9
0 1 2... 9
9192...100
k 7
(0 ...0 010
0 ...0 9 0
1 2 З.-.Ю^
c)
0 0 1... 8
d)
0 ...8 0 0
0 0 0... 1
1 ...0 0 0
53. Используя следующий фрагмент программы, заполните массив А по правилу
А : array [1..6. 1..9] of real:
X : array [1..9] of real:
54. Используя следующий фрагмент программы, получите массив В из массива А
удалением п-и строки и &-го столбца:
А : array [1..20. 1..20] of boolean:
В : array [1..19. 1..19] of boolean:
n, k : 1..20:
55. Используя следующий фрагмент программы, из массива А получите массив В,
присвоив его £-му элементу значение true, если выполнено указанное ниже
условие, в противном случае присвойте значение false:
А : array [1..20. 1..20] of integer:
В : array [1..20] of boolean;
а) все элементы &-го столбца массива А нулевые;
Ь) элементы £-й строки массива А упорядочены по убыванию;
с) k-я строка массива А симметрична.
90 Глава 8. Регулярные типы данных
56. Используя следующий фрагмент программы, определите количество «осо-
бых» элементов к массива С, считая элемент «особым», если выполняются
перечисленные ниже условия:
const
п = 10;
m ж 12;
var
к : integer;
С : array [1.,n. l..m] of Integer;
а) элемент больше суммы остальных элементов своего столбца;
Ь) в строке слева от элемента находятся элементы, меньшие его, а справа —
большие.
57. Используя следующий фрагмент программы, определите количество к раз-
личающихся элементов массива С (то есть повторяющиеся элементы считайте
один раз):
var
к ; integer;
С ; array [1..13. 1..18] of char;
58. Пусть дана вещественная матрица размером 20 х 30. Упорядочьте ее строки
по неубыванию:
♦ а) первых элементов строк;
Ь) суммы элементов строк;
♦ с) наибольших элементов строк.
♦59. Используя следующий фрагмент программы, преобразуйте массив S, осущест-
вив поворот элементов вокруг его центра на 90° против часовой стрелки:
const
п = 256;
type
screen = array [l..n. l..n] of 0..1;
var
S screen;
60. Определите, является ли некоторая целая квадратная 10-го порядка матрица
симметричной (относительно главной диагонали).
♦ 61. Элемент матрицы назовем седловой точкой, если он является наименьшим
в своей строке и одновременно наибольшим в своем столбце йли, наоборот,
является наибольшим в своей строке и наименьшим в своем столбце. Для
заданной целой матрицы размером 10x15 напечатайте индексы всех ее сед-
ловых точек.
62. Пусть дана вещественная матрица размером 7x7, все элементы которой раз-
личны. Найдите скалярное произведение строки с наибольшим элементом
матрицы и столбца с наименьшим элементом.
♦ 63. Определите, является ли заданная целая квадратная матрица 10-го порядка
ортонормированной, то есть такой, в которой скалярное произведение каж-
Матрицы 91
дой пары различных строк равно 0, а скалярное произведение каждой стро-
ки на себя равно 1.
64. Определите, является ли заданная целая квадратная матрица 9-го порядка
магическим квадратом, то есть такой, в которой суммы элементов во всех
строках и столбцах одинаковы.
65. Пусть дана непустая последовательность слов из строчных латинских букв;
слова разделяются запятой, за последним словом стоит точка. Среди всех
пар я, и bh где а, — первая; a bi — последняя буквы г-го слова последователь-
ности, определите наиболее часто встречающуюся пару.
66. По заданным коэффициентам ап, а12, ain, ..., а22, а23,-..., а2п, ..., апп, (п - 20,
0) и правым частям bif b2t..., bn найдите решение «треугольной» системы
линейных уравнений:
«1 + а12х2 + а13х3 +... + аХпхп = ,
*22*2 + «23*3 + • • • + &2пХп = *2>
* ^33*3 + • • • + а3пх3 =^3»
>
67. Известно, что в следующем фрагменте программы массив матрица содержит
оценки студентов группы, фамилии которых перечислены в типе фамилия:
type
фамилия = (Иванова. Просветкин. Лемин. Михайлов.
Маслова. Юрьева. Беляев. Малащенко.
Нагайцев. Семыкин):
Предмет = (матанализ, алгебра, информатика,
история, матлогика. механика,
педагогика, дифуравнения. статистика):
var
матрица array [фамилия, предмет] of Integer;
i) найдите средний балл всех студентов группы;
Ь) напечатайте фамилию первого студента списка, средний балл которого
максимален;
с) поменяйте местами оценки любого студента, средний балл которого ми-
нимален, с оценками первого из студентов списка, который не имеет не-
удовлетворительных отметок;
d) измените на «3» все неудовлетворительные оценки (если такие имеются)
у студента с минимальным средним баллом;
♦ е) напечатайте фамилии любых двух студентов, средний балл которых яв-
ляется наибольшим;
f) найдите количество студентов группы, которые учатся без троек (только
на «4» и «5»);
92 Глава 8. Регулярные типы данных
g) выясните, сколько студентой группы имеют средний балл, наименее от-
клоняющийся по абсолютному значению от среднего балла всей группы;
h) напечатайте названия предметов, по которым студенты учатся без двоек;
i) определите, по какому предмету самая высокая успеваемость;
j) переставьте оценки всех студентов группы по механике и педагогике;
к) составьте список отличников группы;
1) составьте список хорошистов группы;
ш) составьте упорядоченный по неубыванию средних баллов список студен-
тов группьь
68. Пусть во входном файле input задана последовательность строчных латинс-
ких букв, за которой следует пробел. Если это правильная запись значения
типа color, то, используя следующий фрагмент программы, присвойте это
значение переменной х, иначе — сообщите об ошибке:
type
color = (red. blue, green, yellow, black, white);
var
x : color;
69. Пусть дана последовательность, содержащая от 1 до 30 слов, в каждом из ко-
торых от 1 до 5 строчных латинских букв; между соседними словами — запя-
тая, за последним словом — точка. Выведите:
а) эту же последовательность слов, но в обратном порядке;
♦ Ь) те слова, перед которыми в последовательности находятся только мень-
\ шие (по алфавиту) слова, а за ними — только большие;
♦ с) эту же последовательность слов, удалив из нее повторные вхождения слов;
♦ d) все слова, которые встречаются в последовательности по одному разу;
♦ е) все различающиеся слова, указав для каждого из них число его вхожде-
ний в последовательность;
♦ f) все слова в алфавитном порядке.
♦70. Пусть дана последовательность, содержащая от 2 до 50 слов, в каждом из ко-
торых от 1 до 8 строчных латинских букв; между соседними словами — не
менее одного пробела, за последним словом — точка. Напечатайте те слова
последовательности, которые отличны от последнего слова и удовлетворяют
следующему свойству:
а) слово симметрично;
Ь) первая буква слова входит в него еще раз;
с) буквы слова упорядочены по алфавиту;
d) длина слова максимально;
е) в слове нет повторяющихся букв;
f) каждая буква входит в слово не менее двух раз;
g) в слове гласные буквы (а, е, i, о, и) чередуются с согласными.
Матрицы 93
71. Пусть дана последовательность, содержащая от 2 до 30 слов, в каждом из ко-
торых от 2 до 10 строчных латинских букв; между соседними словами — не
менее одного пробела, за последним словом — точка. Напечатайте все слова,
отличные от первого слрва, предварительно преобразовав каждое из них по
следующему правилу:
а) перенести первую букву в конец слова;
Ь) перенести последнюю букву в начало слова;
с) удалить из слова первую букву;
d) удалить из слова последнюю букву;
♦ е) удалить из слова все последующие вхождения первой буквы;
♦ f) удалить из слова все предыдущие вхождения последней буквы;
♦ g) оставить в слове только первые вхождения каждой буквы;
♦ h) если слово нечетной длины, то удалить его среднюю букву.
72. Известно, что астрологи делят год на 12 периодов и каждому из них ставят
в соответствие один из знаков Зодиака (табл. 8.1). Напишите программу для
ввода даты некоторого дня года и печати названия соответствующего знака
Зодиака.
Таблица 8.1. Знаки Зодиака
Период Знак Зодиака
20.01 - 18.02 Водолей
19.02 - 20.03 Рыбы
21.03-19.04 Овен
20.04 - 20.05 Телец
21.05-21.06 Близнецы
22.06 - 22.07 Рак
23.07 - 22.08 Лев
23.08 - 22.09 Дева
23.09-22.10 Весы
23.10-22.11 Скорпион
23.11-21.12 Стрелец
22.12 - 19.01 Козерог
73. Пусть дана последовательность, содержащая от 1 до 90 слов, в каждом из ко-
торых от 1 до 10 строчных русских букв; между соседними словами — не ме-
нее одного пробела, за последним словом — точка. Напечатайте эти слова по
алфавиту.
Глава 9
Процедуры и функции
Теоретические вопросы
1. Дайте определение подпрограммы.
2. Что лежит в основе метода программирования сверху вниз?
3. Существуют ли подпрограммы без параметров?
4. Дайте определение параметра.
5. Как называются параметры, определяемые в заголовке подпрограммы?
6. Какие параметры называются фактическими?
7. Чем синтаксически отличается описание процедуры от описания функции?
8. Какое количество значений возвращает функция?
9. Как определить тип значения, возвращаемого функцией?
10. Существуют ли ограничения на тип возвращаемого функцией значения?
И. Каким образом осуществляется обмен данными между основной програм-
мой и подпрограммой без параметров?
12. Сколько элементов может содержать список формальных параметров?
13. Сколько элементов должен содержать список фактических параметров?
14. Могут ли фактические параметры быть выражениями?
15. Могут ли фактические параметры быть именами переменных?
16. Могут ли фактические параметры быть именами других процедур или функ-
ций?
17. Каково соответствие между фактическими и формальными параметрами?
18. Могут ли имена формальных параметров совпадать с именами фактических?
19. Могут ли имена формальных параметров не совпадать с именами факти-
ческих?
20. Какие переменные называются локальными?
21. Чем глобальные переменные отличаются от локальных?
22. Что такое время жизни переменной?
Задачи, программы 95
23. Что такое область видимости переменной?
24. Может ли имя локальной переменной совпадать с именем глобальной?
25. Можно ли утверждать, что одноименные глобальные и локальные перемен-
ные — это разные переменные?
26. Какие два способа передачи параметров вы знаете? В чем их отличие?
27. При каком способе передачи параметров изменение соответствующего фор-
мального параметра внутри процедуры изменяет и фактический параметр?
28. Может ли в качестве параметра при вызове подпрограммы, имеющей фор-
мальный параметр-значение, выступать: переменная, выражение, константа?
29. Может ли в качестве параметра при вызове подпрограммы, имеющей фор-
мальный параметр-переменную, выступать: переменная, выражение, кон-
станта?
30. Может ли в основной программе функция вызываться внутри выражения?
31. Наличие какого оператора необходимо для возвращения значения из функ-
ции в вызывающую программу?
32. Что называется побочным эффектом при вызове подпрограммы?
33. Почему следующее описание процедуры недопустимо?
procedure S ( A array [1..10] of real );
34. Может ли элемент массива быть формальным параметром?
35. Почему недопустимо следующее описание функции?
function F( s : char ) string[10];
36. Может ли быть функция или процедура параметром подпрограммы?
Задачи, программы
/
1. Вычислите выражение z(x) = (sign(x) + sign(y)) • sign(x + у). При решении за-
дачи определите и используйте функцию sign:
-1,х<0,
sign(x) = < 0, х = О,
1,х>0.
2. Даны вещественные числа s, t. Получите:
H(s,t) + (max(H2 (s-t,s*t),H4 (s-t,s +1)) + H( 1,1)),
где H(a,b) = - Аг + -Ц- - (a - b)3.
1+b2 l + a2
3. Напишите функцию, вычисляющую sh(x), и для заданного значения пере-
менной х вычислите следующее выражение:
sh (х) + tg(x+l) - tg2(2+sh(x-l)).
96 Глава 9. Процедуры и функции
♦4. Пусть даны натуральные числа k, /, m, вещественные xitx2t ...,xk1 у^у2^ -Уь
zu z2,..., zm. Получите:
fmin(y1,...,y/) + max(z1,...,zw), если max(xi,...,xk)>2,
' = ] 2
[l + Onax^,...,**)) , если тах(х15...,х*)<2.
♦5. Пусть даны вещественные числа щ, и2, v2f wlf w2. Получите:
2 + w-v
где u,v,w — комплексные числа. Определите процедуры для работы с комп-
лексными числами.
6. Пусть даны три последовательности вещественных чисел а0, aifа30; b0, bif
^зо; cQ, с{,..., с30. Вычислите значение выражения для заданного х\
30 , 29 . ,
алх +atx +... + а2дх + азо . ,.30 ,.79 ч
—-------30--------—(с0(2х + 1Ги +q(2x + l/y +... + С29(2х + 1) + сзо) .
60(х- 1) +Z?i(x-1) +... + Z>jQ
7. Для следующих программ определите, что будет напечатано:
a) program One;
var с, d : Integer;
procedure P( x, у ; integer );
begin
у ;= x + 1
end;f p }
procedure Q( x ; integer; var у : integer );
begin
у ;= x. + 1
end;f Q }
begin
C := 2; d ;= 0;
P( sqr( c ) + d. d ); writeln( c. d );
c ;= 2; d ;= 0;
Q( sqr( c ) + d, d ); writelnC c, d )
end.{ One }
b) program Two;
var X. Y ; integer;
procedure A( Z : integer; var X integer );
var Y ; integer:
procedure B( X, W : integer);
begin
Z ;= X + Y + W;
X 2 * W
end;{ В }
begin
Y Z + X;
B( Y. Z );
end;f A }
begin
X :» 1;
Y :» 2:
A( X + Y. Y );
A( 2 * Y. X );
Задачи, программы 97
writeln( X. Y )
end.{ Two }
c) program Three;
var U, W : integer;
procedure At( var К ; integer; T ; integer );
var Z ; integer;
procedure C( var X, W ; integer );
begin
Z ;= X + T + W;
X := 2 * W
end;{ C }
begin
К ;= Z + 4;
C( К. К );
T := T + К + Z
end;{ At }
begin
U :» 11;
W ;= 3;
At( U. W + 4 );
At( W. U ):
writeln( U. W )
end.{ Three }
8. Определите наибольший общий делитель трех чисел, написав функцию для
определения наибольшего общего делителя N0D(x, у), используя алгоритм
Евклида.
9. Напишите процедуру сложения двух дробей, результатом которой является
несократимая правильная дробь. Используйте функцию для нахождения наи-
большего общего делителя.
♦ 10. Вычислите результат выражения
в виде правильной дроби, где А, В, С, Е, F— целые числа. Воспользуйтесь
функцией сложения двух дробей.
И. Для двух представленных ниже квадратных уравнений определите, имеют
ли они одинаковые корни. Напечатайте те корни уравнений, которые не сов-
падают.
а{х2 +bix + c} = 0,
а2х2 + Ь2х + с2 = 0.
12. Для заданного натурального Nопределите первые Nпростых чисел.
♦13. Определите все общие делители двух заданных натуральных чисел.
*14. В трех автопарках работают по 20 машин с заданными госномерами и ука-
занными марками: ГАЗ, ЗИЛ, ЛИАЗ и т. д. Каждый водитель сдает сводку о
том, сколько километров прошла его машина в каждый день недели, и о раз-
мере выручки. Подсчитайте общий километраж в каждом автопарке по каж-
дому дню отдельно. В каком из автопарков самый больший автопробег? Какой
4 Зак. 906
98 Глава 9. Процедуры и функции
день недели соответствует самой большой прибыли, полученной автохозяй-
ством? Автомобили какой марки приносят наибольшую прибыль?
*15. На заправочной станции для каждого автомата известно количество отпу-
щенного топлива каждого вида (А76, А93, А95, DIZ ...) и количество обслу-
женных машин в каждый из дней недели. Вычислите общий объем топлива,
проданный в указанный период недели. В какой день недели было обслуже-
но больше всего машин? Из какого автомата было продано наибольшее ко-
личество топлива? Какой вид топлива пользуется наибольшим спросом?
16. Определите, исходя из данного фрагмента программы:
type
country = (Австрия, Канада. Китай. Италия.
Перу. США);
continent = (Америка. Африка. Азия. Европа);
а) функцию, которая по заданной стране определяет континент, на котором
находится страна;
Ь) для двух стран, находятся ли они на разных континентах.
17. Напишите функцию, проверяющую, является ли заданная литера гласной
русской буквой.
*18. На плоскости координатами своих вершин заданы два треугольника. Опре-
делите, одинакового ли они типа (прямоугольный, тупоугольный, остро-
угольный).
19. В двух последовательностях aif..., а„ и Ьи ..., Ь„ замените все элементы, следую-
щие за элементом с максимальным значением, на значение минимального
элемента.
♦ 20. Дана последовательность вещественных чисел аи а2,..., а„. Для каждого эле-
мента последовательности а, подсчитайте количество элементов слева, кото-
рые по модулю меньше и количество элементов справа, которые по моду-
лю больше а,. Используйте подпрограмму, производящую вычисления для
одного элемента последовательности.
♦ 21. Для заданных А и В (А < В) и последовательности целых чисел определите
количество чисел, которые принадлежат интервалам [-<», А], [А, В], [В, <»].
♦ 22. Заданный массив целых чисел делится на три части двумя элементами: мак-
симальным и минимальным. Определите сумму элементов в каждой части
массива. Используйте функции для нахождения индексов минимального и
максимального элементов и подсчета суммы элементов в указанной части
массива.
23. Пусть дана матрица А размером п х т, состоящая из вещественных чисел.
Необходимо получить матрицу В размером п х т, каждый элемент btJ кото-
рой равен true, если сумма соседних с элементов меньше указанной вели-
чины 5, и fа 1 se — в противном случае. Воспользуйтесь функцией для нахож-
дения суммы соседних элементов.
*24. Пусть даны две матрицы А(п х ти), В(п х т), состоящие из вещественных
чисел. Необходимо получить матрицу С(п х ти), где элемент равен сумме
Задачи, программы 99
элементов i-й строки матрицы А, которые отсутствуют в j-м столбце матри-
цы В. Напишите функцию вычисления С,7, использующую функцию провер-
ки наличия числа вj-м столбце матрицы В.
♦ 25. Пусть задано У параллелограммов координатами своих вершин. Определи-
те номер параллелограмма, у которого площадь максимальна. Напишите
функцию для определения площади параллелограмма по его заданным ко-
ординатам вершин.
♦ 26. Пусть дана матрица А(п х т). Постройте матрицу В(п х ти), каждый элемент
которой равен произведению сумм элементов, расположенных Bi областях,
показанных на рис. 9.1. Напишите функцию для вычисления суммы элемен-
тов в указанной области.
A[ij]
A[j,i]
Рис. 9.1. Девять областей
* 27. Пусть даны две вещественные матрицы порядка п. Получите новую матрицу
следующим способом (для нахождения минимального элемента и произве-
дения элементов в указанной строке используйте функции):
а) умножением минимального элемента каждой строки первой матрицы на
наибольший элемент соответствующего столбца второй матрицы;
Ь) прибавлением к элементам каждого столбца первой матрицы произведе-
ния элементов соответствующих строк второй матрицы.
28. Допустимым преобразованием матрицы назовем перестановку двух сосед-
них строк или двух соседних столбцов. Пусть дана вещественная квадратная
матрица порядка N. С помощью допустимых преобразований получите матри-
цу, в которой один из элементов с наибольшим значением располагался бы в
левом верхнем углу. Напишите функции, осуществляющие соответствую-
щие преобразования строк и столбцов.
♦ 29. Пусть дана вещественная матрица А(п х т). В каждой строке переместите в ко-
нец строки все элементы, у которых соседние элементы в строке разные по
знаку. Используйте функцию для перемещения указанного элемента строки.
♦ 30. Пусть дана матрица А(п х т), состоящая из натуральных чисел. В каждом
столбце обнулите минимальное количество элементов так, чтобы сумма эле-
ментов столбца не превышала заданную.
100 Глава 9. Процедуры и функции
* 31. Для заданной вещественной матрицы определите, образуют ли ее элементы
упорядоченную последовательность при их переборе по схеме, представлен-
ной на рис. 9.2. Для определения факта упорядоченности части строки (столб-
ца) используйте функции.
Рис. 9.2. Схема расположения последовательности
* 32. Пусть дана вещественная квадратная матрица порядка 2п, Получите новую
матрицу, переставляя ее блоки размером п так, как показано на рис. 9.3. Для
обмена четырех заданных фрагментов матрицы напишите функцию.
а)
Рис. 9.3. Переставляемые блоки матрицы
33. Пусть дана прямоугольная матрица А(п х тп), элементами которой являются
целые числа. Определите, в какой строке матрицы находится наибольшее
количество симметричных чисел. Составьте функцию, проверяющую сим-
метричность числа.
34. Пусть дана прямоугольная матрица А(п х тп), элементами которой являются
вещественные числа. Определите для каждой строки, все ли ее элементы яв-
ляются симметричными. Составьте функцию, проверяющую симметричность
числа.
35. Пусть дана прямоугольная матрица А(п х т), элементами которой являются
целые числа. Определите для каждого элемента позиции элементов матрицы
с такой же суммой цифр.
36. Пусть дана прямоугольная матрица А(п х тп), элементами которой являются
целые числа. Замените все положительные четные числа на числа, являю-
щиеся их «перевертышами». Составьте подпрограмму, получающую для за-
данного числа его «перевертыш» (число а будем считать «перевертышем»
числа 6, если, читая число а справа налево, получаем число Ь).
Задачи, программы 101
37. Пусть даны N шестизначных номеров троллейбусных билетов — ХХХХХХ.
Определите те билеты, номера которых являются «счастливыми», то есть сум-
ма первых трех цифр совпадает с суммой последних трех цифр. Используйте
функцию для определения, является ли номер «счастливым».
* 38. В квадратной матрице определите количество строк, отвечающих следую-
щему условию (для определения типа каждой строки используйте функцию):
а) упорядоченных по возрастанию;
Ь) упорядоченных по убыванию;
с) состоящих из равных элементов;
d) неупорядоченных.
♦39. Пусть дан список учащихся и для каждого из них У оценок по М предметам.
Переместите в конец списка тех учащихся, у которых средний балл меньше,
чем средний балл в классе. Напишите функции для перемещения одной стро-
ки в конец списка для вычисления среднего балла.
40. Пусть даны три слова. Необходимо определить буквы, которые встречаются
(для нахождения множества символов, образующих слово, используйте про-
цедуру):
♦ а) во всех словах;
♦ Ь) только в 1-м и 2-м словах;
♦ с) только в 1-м и 3-м словах;
♦ d) только во 2-м и 3-м словах;
ё) только в 1-м слове;
♦ f) только во 2-м слове;
♦ g) только в 3-м слове.
♦ 41. Пусть даны два предложения, которые оканчиваются точкой и содержат оди-
наковое количество слов. Определите для первых слов каждого предложе-
ния множество одинаковых букв, а для последних — те буквы, которые встре-
чаются только в одном из них. Для определения буквенного состава слова
используйте процедуру.
42. Найдите все слова в предложении, которые содержат только заданные бук-
вы. Для определения буквенного состава слова используйте процедуру.
♦ 43. Среди нескольких предложений найдите то, которое содержит наибольшее
количество разных букв.
44. В заданном тексте удалите все слова, которые начинаются с нечетной пози-
ции. Для удаления слова используйте функцию.
45. По заданной строке текста напечатайте строкукоторой все гласные буквы
удваиваются, а двойные согласные заменяются одиночными.
46. Напишите функцию, которая в заданной строке определяет количество вхож-
дений в нее заданной подстроки. Для заданных строки и слова определите
количество вхождений слова в строку.
102 Глава 9. Процедуры и функции
* 47. Пусть задан текст, состоящий из нескольких предложений, разделенных точ-
кой. Выполните следующие преобразования: первые слова в каждом предло-
жении преобразуйте к виду, в котором первая буква прописная, а остальные
строчные; в словах, которые содержат более чем одну прописную букву, все
буквы замените прописными; в остальных словах все буквы должны быть
строчные. Используйте функцию для преобразования одного слова в пред-
ложении.
♦ 48. Пусть дан текст в виде символьной строки, оканчивающейся точкой. Необ-
ходимо определить количество слов, которые являются «перевертышами»
(например: казак, шалаш), то есть читаются одинаково с начала и с конца
слова. Слова в предложении отделяются одним либо несколькими пробелами.
♦ 49. Составьте подпрограмму, которая в строке текста определяет позицию само-
го правого вхождения указанной подстроки. Для указанной строки опреде-
лите позицию подстроки END.
♦ 50. Напишите процедуру, которая для заданного целого числа получает его пред-
ставление в п-й системе счисления в виде строки символов.
♦ 51. Составьте процедуру вычисления значения целого числа по заданной строке
символов, являющейся записью этого числа в n-й системе счисления (п < 16).
Найдите сумму чисел, записанных в виде строки, для указанного основания
системы счисления.
52. Для заданной строки текста определите слова, которые содержат символы,
отличные от букв. Напишите функцию, определяющую тип символа строки.
53. Пусть дано п треугольников. Посчитайте количество треугольников, лежа-
щих в каждой координатной четверти и не пересекающих оси координат. Ис-
пользуйте функцию для определения координатной четверти, в которой ле-
жит треугольник.
♦ 54. Пусть дано п вещественных чисел (п = 100). Упорядочить их по неубыванию
методом фон Неймана:
а) завести два массива А и В и занести все элементы в Л;
Ь) упорядочить пары соседних элементов и Л2, А3 и Л4 и т. д.) и записать
их в В;
с) взять из массива В упорядоченные пары и, слив их в упорядоченные чет-
верки, снова записать в Л;
d) затем взять из массива В четверки элементов, восьмерки и т. д.
♦ 55. Составьте процедуру «сжатия» исходной последовательности символов, ко-
торая заменяет последовательность, состоящую из одинаковых символов,
текстом вида х(&), где х — символ последовательности, k — число вхожде-
ний. Определите для указанной последовательности коэффициент сжатия
(отношение исходной длины последовательности к полученной).
♦ 56. Пусть дано п треугольников, заданных координатами своих вершин. Найдите
пару треугольников, максимально удаленных друг от друга.
Задачи, программы 103
57. Пусть дано п треугольников, заданных координатами своих вершин. Найдите
треугольник с максимальной площадью. Напишите функцию для нахожде-
ния площади одного треугольника.
58. Пусть дано п произвольных четырехугольников, заданных координатами сво-
их вершин. Найдите четырехугольник с максимальной площадью. Исполь-
зуйте функцию для вычисления площади четырехугольника.
♦ 59. Пусть дано п прямоугольников, заданных координатами левой верхней и пра-
вой нижней вершины. Стороны прямоугольников параллельны осям коор-
динат. Определите пару прямоугольников с максимальной площадью пере-
сечения. Напишите функцию для определения площади пересечения двух
прямоугольников.
♦ 60. Пусть дано п треугольников. Определите координаты центра и минималь-
ный радиус круга, который содержит все треугольники.
♦ 61. Составьте процедуру выравнйвания строки, которая преобразует строку
к строке указанной длины путем равномерного добавления пробелов между
всеми словами.
62. Пусть дано п треугольников. Определите количество треугольников, кото-
рые пересекают границы заданного квадрата. Используйте функцию для опре-
деления, пересекает ли треугольник границы квадрата.
♦ 63. Пусть дано п отрезков на интервале [Л, В]. Определите часть интервала, ко-
торый покрывается наибольшим количеством отрезков. Напишите функцию
для определения количества отрезков, покрывающих заданный интервал.
* 64. Определите минимальное количество отрезков из числа заданных, которые
покрывают заданную часть прямой. Напишите функцию, определяющую, по-
крывает ли заданный набор отрезков необходимую часть прямой.
65. Напишите процедуру сложения двух многочленов. Представьте каждый мно-
гочлен в виде массива коэффициентов, где Л, — коэффициент перед х,-.
♦ 66. Найдите многочлен, полученный в результате умножения (а0 + а{х + + ... +
+ апх?) х (fe0+ b{x + Ь2х*+... + Ьпх?). Напишите функцию для умножения мно-
гочлена на число и х*.
* 67. Составьте процедуру деления с остатком для многочленов. Вычислите:
____________Q0+aix + a2x2 +... + flwxw___ 2т <п.
(bQ + b[x + b2X2 4-... + bmxm )(bm + bm_ix + bm_2x2 + - + bQXm) ’
* 68. Напишите процедуру, которая для заданного полинома определяет полином,
являющийся производной исходного полинома по указанной переменной.
Вычислите:
( 2 п \
а$ + а\х + а2х +... + апх
(Ъ^+Ь^х + Ь^ + ... + bmx )(bm + bm_\x + bm_2x +;.. + Ijqx ),
Вычислите интегралы:
f 1 b
| sin2 х-----j-dx и jc
а
а
104 Глава 9. Процедуры и функции
Для этого напишите функцию, вычисляющую интеграл по формуле наимень-
ших прямоугольников для заданного интервала, количества разбиений и функ-
ции, передаваемой как параметр. Формула наименьших прямоугольников:
ь
j f(x)dx = min(/(a = а0), f(at)) + min(/(a (), f(a2)) + ...+
a
+min(/(an_|), f(b = an)).
70. Вычислите интеграл:
ю
j*3sin(x2 4-1)бзЬс
2
Для этого напишите функцию, которая вычисляет интеграл по формуле тра-
пеций для заданного интервала, количества разбиений и функции, передава-
емой как параметр. Формула трапеций:
ь h
J /(х) dx = - (/(ао) + 2/(aj)+2Да2) + 2/(а3)+... + 2/(ап_|) + Дап)).
а
71. Напишите подпрограмму, которая вычисляет интеграл по формуле Симпсо-
на для заданного интервала, количества разбиений и функции, передавае-
мой как параметр.
ь h
J/(x)A»j(/(ao)+4/(el)+2/(a2)+4/(e3)+...+4/(a„_1)+/(e„)).
а
♦ 72. Напишите процедуру, которая по заданному интервалу и функции определяет
«ноль» функции с заданной точностью, используя метод деления отрезка
пополам. Известно, что на границах интервала функция принимает значе-
ния, отличные по знаку. Определите «ноль» функции Лх2 + Вх + С для за-
данных Л, В, С.
♦ 73. В квадратной матрице А(п х п) найдите строки, представляющие вектор с мак-
симальной нормой в каждой из следующих метрик (напишите функцию для
подсчета нормы вектора в указанной метрике):
H = Val +
IH=hl+-+kl
||а|| = max^l,/ = .
* 74. По вещественным числам Е > 0 и t вычислите с точностью Е величину:
J, cos41 J arctg t I 1
V 4 V 2 Ъ + t2’
Для вычисления корней используйте следующий ряд Тейлора:
/1 ха 1 а а(а-1) 2 а(а-1)(а-2) 3
(1 + х)а = 1 + -х + —--х2 +—-----------xJ+..., х <1, а>0.
1! 2! 3!
Задания для самостоятельной работы 105
*75. Пусть даны вещественные числа а,Ь,Е(а<Ь,Е> 0). С точностью Е вычис-
лите интеграл:
Ь [/(х)
jh(x,y)dy dx,h(x,y) = е Уух ',g(x) = 1,/(х) = 1 + х2,
a [g(x)
используя формулу трапеций (см. выше задачу 70). Для обеспечения нуж-
ной точности воспользуйтесь следующим правилом Рунге: если приближен-
ное значение интеграла In вычислять при п= nQ, 2я0,4и0,8и0... и т. д. (где п0 —
некоторое начальное число отрезков разбиения, например по=1О), тогда при
|72я“4| /3 <Е за искомую величину можно взять 12п.
Задания для самостоятельной работы
В каждом из предложенных ниже заданий используйте процедуры ввода и вывода
элементов матрицы по строкам.
1. Проверьте свойство (Ат)т = Л, где А — исходная матрица (п х и), Т означает
транспонирование. Используйте процедуру транспонирования.
2. Пусть задана вещественная матрицами х п). Упорядочить элементы матрицы:
а) по неубыванию значений максимальных элементов в строках;
Ь) по неубыванию сумм элементов строк.
3. В заданной матрице А(п х п) определите количество строк, которые упоря-
дочены по возрастанию. Используйте подпрограмму проверки упорядочен-
ности строки.
4. В матрице А(п х и) определите количество строк, элементы которой образуют
арифметическую прогрессию. Используйте подпрограмму проверки строки.
5. В заданной матрице А(п х п) найдите максимум из всех минимальных эле-
ментов матрицы по столбцам.
6. В заданной матрице А(п х п) найдите минимум всех сумм абсолютных вели-
чин элементов матрицы по столбцам. Для нахождения суммы абсолютных
величин столбца используйте функцию.
7. Подсчитайте количество строк матрицы А(п х и), элементы которых образу-
ют монотонную последовательность. Для определения факта монотонности
используйте подпрограмму.
8. Уплотните матрицу А(п х п) влево и вверх. Для выявления нулевых строк
и столбцов используйте подпрограмму.
9. Упорядочьте строки матрицы по возрастанию их евклидовых норм.
10. Проверьте, есть ли в матрице А(п х п) строки, не содержащие более двух отри-
цательных элементов. Для проверки строки используйте подпрограмму.
И. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого
содержит наименьший по абсолютной величине элемент строки.
106 Глава 9. Процедуры и функции
12. Составьте программу поиска минимального элемента, расположенного под
главной диагональю, и максимального элемента, расположенного над глав-
ной диагональю заданной вещественной матрицы А(п х и).
13. Пусть задана вещественная матрица. Рассматривая ее как вектор строк, упо-
рядочьте ее по количеству нечетных элементов в каждой строке.
14. Определите номера строк в матрице, в которых элементов, принадлежащих
отрезку [Л, В], больше, чем элементов, принадлежащих отрезкам [-«>, А], [В, ©о].
15. Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент
которого принимает значение true, если среди элементов i-й строки матри-
цы А есть хотя бы два равных, и значение false — в противном случае. Вос-
пользуйтесь логической функцией, которая для i-й строки выполняет ука-
занную проверку.
16. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого
равен наибольшему количеству равных элементов в соответствующей строке
матрицы А. Воспользуйтесь функцией, которая определяет это количество
в i-й строке матрицы А.
17. Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент
которого равен true, если в строке существует элемент, делящий весь массив
на две части с одинаковой суммой элементов в каждой.
18. Проверьте, верно ли, что количество строк матрицы А(п х и), в которой все
числа нечетные, кратно заданному числу х.
19. Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент
которого равен true, если среди элементов соответствующей строки матри-
цы А есть хотя бы один элемент, принадлежащий отрезку [0,5; 1], и false —
в противном случае. Воспользуйтесь логической функцией, делающей соот-
ветствующую проверку в i-й строке.
20. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого
равен количеству элементов в i-й строке матрицы А, не принадлежащих от-
резку [0, 10]. Воспользуйтесь функцией, делающей соответствующую про-
верку в i-й строке.
21. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого
равен сумме элементов i-й строки матрицы А, больших, чем значение мини-
мального элемента в этой строке. Воспользуйтесь функцией, определяющей
соответствующую операцию в каждой строке матрицы А.
22. Пусть дана матрица А(п х п). Упорядочьте строки по неубыванию сумм цифр
элементов этой строки. Воспользуйтесь функцией, определяющей для каж-
дого числа сумму его цифр.
23. Напечатайте строки и столбцы матрицы W(n х п), на пересечении которых
находятся максимальные и минимальные элементы, если элементы матри-
цы вычисляются по формулам:
Задания для самостоятельной работы 107
24.
Элементы матрицы А(п х п) вычисляются по формуле:
4j = / * sin(y) + sin(z) (ij = 1,2,3,..., п).
Требуется:
а) сформировать матрицу В:
вм = ; ,4,у;—г’ =1’2’3’ •••’
A,+i +j
b) вывести на печать сформированные матрицы Л, В и их произведение А *В.
25. Пусть дана матрица А(п х п), где AhJ = (-1)' */ * у. Постройте и выведите на
печать матрицу В, элементы которой определяются по правилу:
В. . = А: : * max 4 к
J l,J \<k<n l'K
26. Выведите на печать матрицу К(п х п). Вычислите и выведите на печать ска-
лярное произведение i-й строки на г-й столбец (всего п произведений). Эле-
менты матрицы вычисляются по формуле:
27.
Элементы матрицы А(п х п) вычисляются по формуле:
4,у = sin(z *у), (z, j = 1,2,3,..., п).
Требуется:
а) построить матрицу В, каждый элемент которой вычисляется по формуле:
J к=\
Ь) вывести на печать матрицы А и В.
Глава 10
Рекурсивные
подпрограммы
Теоретические вопросы
1. Как называются процедуры или функции, которые вызывают сами себя?
2. Для каких целей создаются рекурсивные алгоритмы?
3. Что называется стеком?
4. Верно ли, что значения всех локальных переменных при очередном вызове
рекурсивной процедуры или функции помещаются в стек?
5. В какой последовательности происходит заполнение стека и выбор элемен-
тов из стека?
6. Всегда ли в рекурсивном алгоритме должно присутствовать условие выхода
из рекурсии?
7. Что произойдет, если рекурсивный алгоритм будет вызывать сам себя «бес-
конечное» число раз?
8. Верно ли, что решение задачи, реализуемое рекурсивным алгоритмом, мож-
но выразить нерекурсивным алгоритмом?
Задачи, программы
1. Напишите рекурсивную функцию для нахождения биномиальных коэффи-
циентов (для заданного М > i >j > 0 вычислите все С/ ):
1, при т = 0,п > 0 или т = п > О,
< 0, при т > п > О,
СХ-'+СЛ иначе.
♦2. Пусть задано конечное множество имен жителей некоторого города, причем
для каждого жителя перечислены имена его детей. Перечислите все пары жи-
телей города, которые являются родственниками, причем жители А и Б на-
зываются родственниками, если:
Задачи, программы 109
а) А — это ребенок Б;
Ь) Б — это ребенок А;
с) существует некий В такой, что А является родственником В,ъВ является
родственником Б.
*3. Подсчитайте количество различных представлений заданного натурального
числа Wb виде суммы не менее двух попарно различных положительных сла-
гаемых. Представления, отличающиеся порядком слагаемых, различными не
считаются.
♦4. Вычислите определитель заданной матрицы, пользуясь формулой разложе-
ния по первой строке (матрица В получается вычеркиванием из А первой
строки и &-го столбца):
п
det А= £(-1)к+| А1>к detBk,
к=1
5. Постройте синтаксический анализатор для понятия идентификатор.
<Идентификатор> :: = <буква> | <идентификатор> (<цифра> | <буква>).
* 6. Постройте синтаксический анализатор для понятия простое—выражение.
<простое_выражение> ::= <простой_идентификатор> |
(<простое_выражение><знак_операции><простое_выражение>);
<простой_идентификатор> <буква>;
<знак_операции> :: = + | - | *.
* 7. Напишите процедуру, которая по заданному простому логическому выраже-
нию вычисляет его значение.
<логическое_выражение> ::=TRUE | FALSE | NOT <логическое_выражение> |
(<логическое_выражение><знак_операции><логическое__выражение>):
<знак_операции> ::=AND | OR.
♦ 8. Расставьте на шахматной доске 8 ферзей таким образом, чтобы ни один не
угрожал другому.
* 9. Получите расстановки 8 ладей на шахматной доске, при которых ни одна
ладья не угрожает другой.
* 10. Получите все перестановки элементов 1,..., 6.
* 11. Получите все размещения из 10 элементов 1,2,..., 10 по 3 в каждом. Размеще-
нием называется выборка из п указанных элементов т неповторяющихся
элементов.
* 12. На шахматной доске определите поля, в которые может попасть конь за п хо-
дов из указанной позиции.
* 13. Пусть имеются п городов. Некоторые из них соединены дорогами известной
длины. Найдите:
а) кратчайшие маршруты из заданного города в остальные;
Ь) кратчайший маршрут, начинающийся в заданном городе и проходящий
через все остальные.
110 Глава 10. Рекурсивные подпрограммы
* 14. Найдите расстановку 5 ферзей, при которой каждое поле шахматной доски
будет находиться под ударом хотя бы одного из них.
* 15. «Задача о рюкзаке». Пусть имеется М различных предметов, известны вес
каждого предмета и его стоимость. Определите, какие предметы надо поло-
жить в рюкзак, чтобы общий вес не превышал заданной границы, а общая
стоимость была максимальной.
* 16. Пусть даны целое п от 2 до 20 и вещественное Е > 0. Найдите с точностью Е
все корни n-го многочлена Чебышева Тп(х), определяемого формулами:
Г0(х) = 1; 7](х) = х; Tk (х) = 2xTk_}(x)-Tk_2(x)9 (k = 2, 3,...).
ПРИМЕЧАНИЕ Многочлен ТЛ(х) имеет k различных корней в интервале [-1,1]; если
xt<x2<... <xk — корни многочлена Тк(х), то многочлен ТЬ1(х) имеет по
одному корню в каждом из интервалов [-l,xj, [xhx2[,..., [х*, 1].
17. «Ханойские башни». Пусть имеются три колышка А, В, Сип дисков разно-
го размера, перенумерованных от 1 до п в порядке возрастания их разме-
ров. Сначала все диски надеты на колышек А в виде пирамиды. Требуется
перенести все диски с колышка А на колышек В, соблюдая следующие пра-
вила: диски можно переносить только по одному, диск большего размера нель-
зя ставить на меньший. Диск С можно использовать в качестве промежу-
точного.
* 18. Напишите программу перевода инфиксной записи арифметического выра-
жения в постфиксную.
♦ 19. Напишите программу вычисления выражения, записанного в постфиксной
форме.
20. Пусть дана строка текста, оканчивающаяся точкой. Напечатайте этот текст в
обратном порядке.
21. Опишите рекурсивную логическую функцию, которая проверяет, является
ли симметричной часть заданной строки, начинающаяся г-м и кончающаяся
j-м символом.
♦ 22. Напишите две функции вычисления z-ro числа Фибоначчи (рекурсивную и не
рекурсивную) и напечатайте таблицу для сравнения времени вычисления
i-го числа. Вычислите/(Л), k - 15,20,30,40.
ПРИМЕЧАНИЕ Функция /(и) определена для целых чисел следующим образом:
1,л = 1
п
. 2
/(«) =
div 2), п > 2.
23. Проверьте, является ли вводимая последовательность символов констант-
ным—выражением.
Задания для самостоятельной работы 111
<конст_выр> :: = <целое_без_знака>|
(<целое_без_знака><знак_операции><конст_выр>)
<целое_без_знака> :: = <цифра>[<цифра>]
<знак_операции> ::= + | - *
<цифра> ::= 0 | 1 | 2 | 3 4 | 5 | 6 | 7 | 8 | 9
* 24. Напишите программу, которая по заданному правильному константному
выражению (см. условие предыдущей задачи) вычисляет значение этого вы-
ражения либо печатает сообщение об ошибке, если происходит переполне-
ние в результате вычислений.
♦ 25. Проверьте, соответствует ли вводимая последовательность символов поня-
тию скобки:
<скобки> :: = <круглые> | <квадратные>
<круглые> ::= (<квадратные><квадратные>) | +
<квадратные> :: = [<круглые><круглые>] | -
♦ 26. Проверьте, соответствует ли вводимая последовательность символов поня-
тию список_списков:
<список_списков> ::= <список>[:<список>]
<список> ::= <элемент>[,<элемент>]
<элемент> ::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
♦ 27. Проверьте, соответствует ли вводимая последовательность символов поня-
тию скобки'.
<скобки> ::= <круглые>|<квадратные>
<круглые> :: = А|((<круглые>)[<квадратные>])
<квадратные> ::= В|[[< квадратные >](<круглые>)]
* 28. Вводимая последовательность символов представляет собой формулу пока-
занного ниже вида (М означает функцию max, am — min). Вычислите значение
данной формулы:
<формула> ::=<цифра> М(<формула>.<формула>)|
т(<формула>.<формула>)
<цифра> ::=0|1|2|3|4|5|6|7|8|9
♦ 29. Проверьте, удовлетворяет ли вводимая последовательность символов поня-
тию текст'.
<текст> ::= <элемент>|<элемент><текст>
<элемент> ::= а | b | (<текст>) | [<текст>] | {<текст>}
♦ 30. Опишите рекурсивную функцию, которая по заданным границам а и Ь, за-
данной функции f(x) и заданной точности е методом деления отрезка попо-
лам находит с точностью е корень уравнения f(x) = 0 на отрезке [а, 6]. Счи-
тать, что е > 0, а < Ь,/(а) х/(6) < 0,/(х) — непрерывная и монотонная на [а, 6].
Задания для самостоятельной работы
1. Для заданного целого п вычислите значение суммы:
п п п ,
п
/i=l/2=1 i„
112 Глава 10. Рекурсивные подпрограммы
Опишите рекурсивную функцию, которая по заданным вещественному хи це-
лому п вычисляет величину х" согласно формуле:
1, л = 0,
п
Напишите программу вычисления функции Аккермана для всех неотрица-
тельных целых аргументов т и и:
А(09п) = л + 1,
А(т9 п) = ’ А(т9 0) = А(т -1,1), т > 0,
А(т9п) = А(т~1, А(т9п-1))9 т9п>0.
Напишите рекурсивную функцию, которая вычисляет у = у/х по следую-
щей формуле:
л = 1; к.+1 =
п = 0,1,2,.... За ответ принять приближение, для которого выполняется уело-
вие |у„ - г/я+1| < е, где е - 0,0001.
По вещественному числу а > 0 вычислите величину:
а2
1+
Корни у = >[х вычислять с точностью Е - 0,00001 по следующей итерацион-
ной формуле:
k-\ Уп
Уп
9
п = 0,1,2,..., приняв за ответ приближение г/л+1, для которого |z/n+1 - уп\ < Е.
Для заданных границ интегрирования а и b вычислите значение определен-
ного интеграла следующего вида:
_ sin" !xcosx п -1
п п
X 1 . _
------sin2x, п = 2,
2 4
-cosx, и = 1;
Задания для самостоятельной работы 113
cos" xsinx п —1
п
п
cos” xdx = ( — + — sin 2х,
2 4
sinx, л = 1;
п = 2,
1 cosx
л 1 sin X
п-2 г dx
п -1 J sin"-2 х
1 х х
lntg-,H = l,
х, п = 0;
d)f
1 sinx п-2 е dx
п -1 cos'*”1 х п -1 J cos”"2
dx
cos” x
x, n = 0;
—(ах-Ци = 1;
. fl
e™ cos'1"1 x(acosx + nsinx) л(и-1)р
a2 + n2 a2 +n2
cos'1"2 x dx,
9
C ax n i
le cos x dx =
g)
-e" (sin x+a cos x)
-------------------L n = 1
2 2 ’
a +n*
е<гп n
—, « = 0;
l a
114 Глава 10. Рекурсивные подпрограммы
I е" sin” bx dx =
h)
easin'* 1 1 bx (a sin x-nb cos bx)
+
+ —--2Tje sin 2 bx dx, n>2,
„2 .1,2
CL + и
Л
—, И = О;
I а
, я = 1,
xln" х-и|1пл 1 X
|x In x - x9 n = 1;
dx9 n > 1,
dx = ' -ln|cosx|, « = 1,
X, n = fy
m) pg"*
dx = < ln|sinx|, n = 1,
x, n = 0;
Задания для самостоятельной работы 115
xm m cos ax +— [xw'1 cosaxJx, m > 1,
n) Jx^sinax = < a aJ cosax ,m = 0; a
cosax = х
—sin ax
а
sinaxdx, m > 1,
sin ax
------, m = 0.
a
Глава 11
Строковый тип
Теоретические вопросы
1. Является ли тип strl ng структурированным типом данных? Обоснуйте свой
ответ.
2. Что представляет собой тип string:
а) последовательность английских букв;
Ь) последовательность русских букв;
с) последовательность символов ПЭВМ?
3. Какое максимально возможное количество символов может содержать
строка?
4. Каково функциональное назначение типа strl ng?
5. Как при описании строкового типа указывается длина строки?
6. Может ли пользователь задать длину строки? Если да, то каким образом?
7. Всегда ли фактическая длина строки равна объявленной в описании?
8. Перечислить типовые операции над строками.
9. Каким образом в переменную типа string можно поместить какое-то кон-
кретное значение?
10. Может ли в процессе выполнения программы изменяться фактическая дли-
на строки?
11. Может ли в процессе выполнения программы фактическая длина строки стать
больше, чем объявлено в описании? Что произойдет в этом случае?
12. Если длина строки не указана при объявлении типа stri ng, то чему она равна
по умолчанию?
13. Могут ли переменные строкового типа быть операндами выражений?
14. Верно ли, что тип string аналогичен одномерному массиву символов
array [0..n] of char?
15. Чем отличается тип string от одномерного массива символов array [0..п]
of char?
Задачи, программы 117
16. Верно ли, что к любому символу в строке можно обратиться точно так же,
как к элементу одномерного массива?
17. Какие операции отношения можно применять к переменным типа string?
Каков их приоритет?
18. Как происходит сравнение строк:
а) одинаковой длины;
Ь) разной длины?
19. Пусть s — переменная типа strl ng. Что является результатом действия стан-
дартных операторов read(s), write(s), readln(s), writeln(s)?
20. Перечислите основные процедуры и функции для обработки строк.
Задачи, программы
1. Напишите программу, которая включала бы в себя подпрограммы, имитирую-
щие основные стандартные процедуры и функции работы со строками.
2. Выясните, имеются ли среди вводимых символов все буквы, входящие в слово
«змея».
*3. Для большинству существительных, оканчивающихся на -онок и -енок, мно-
жественное число образуется от другой основы. Как правило, это происходит
по образцу: цыпленок — цыплята, мышонок — мышата и т. д. (в новой основе
перед последней буквой т пишется а или я в зависимости от предыдущей
буквы: если это шипящая, то а, иначе — я). Имеются слова-исключения, из
которых укажем следующие: ребенок (дети), бесенок (бесенята), опенок (опя-
та), звонок (звонки), позвонок (позвонки), подонок (подонки), колонок (ко-
лонки), жаворонок (жаворонки), бочонок (бочонки). Есть еще ряд малоупо-
требительных слов-исключений, которые мы не рассматриваем. Пусть дан
текст, среди символов которого имеется пробел. Группа символов, пред-
шествующая первому пробелу, представляет собой русское слово, оканчиваю-
щееся на -оцок или -енок. Получите это слово во множественном числе.
*4. Пусть дан русский текст, слова которого разделены пробелами, запятой или
точкой. Все слова, оканчивающиеся на -онок или -енок, представьте во мно-
жественном числе.
*5. Вводится строка. Если она является записью римского числа, то преобра-
зуйте ее в целое число.
6. Напишите программу, позволяющую перемещать курсор в пределах экрана
вверх-вниз, влево-вправо и допускающую ввод и отображение только рус-
ских букв независимо от того, осуществлялось ли переключение на русскую
раскладку клавиатуры.
ПРИМЕЧАНИЕ Такие приемы удобно использовать для ввода информации в тех приклад-
ных задачах, которые работают только с русскими текстами, чтобы не тра-
тить время на переключение с латинской раскладки на русскую, что осо-
бенно актуально для неквалифицированного пользователя.
118 Глава 11. Строковый тип
* 7. Пусть вводится 10 произвольных имен. Необходимо распечатать их в алфа-
витном порядке. Попытайтесь решить задачу, не сортируя сами имена. По-
скольку требуется просто распечатать их в алфавитном порядке, заведите
массив, содержащий порядковые номера имен. При необходимости пере-
становки переставляйте не сами имена, а их порядковые номера. Такой под-
ход особенно удобен, когда приходится сортировать сложные и «громозд-
кие» объекты.
♦ 8. Напишите функцию revpositn, которая получает два параметра strl и str2
типа string и возвращает позицию начала первого появления в strl текста,
содержащего литеры str2 в обратном порядке. Например, revpositn('внеш-
ность '. ’ сон') должно возвратить 5, потому что подстрока ' нос' (переверну-
тое 'сон') содержится в слове 'внешность' начиная с 5-й позиции. Заметим
также, что revposltn(' внешность ’. ' нос') дает 0.
♦ 9. Напишите функцию rightposition, которая получает два параметра strl и str2
типа string и возвращает позицию начала последнего появления str2 в strl.
Например, rightpos1t1on( 'Миссисипи', 'си') дает значение 6.
♦ 10. Напишите функцию count, которая получает два параметра strl и str2 типа
string и возвращает число, указывающее, сколько раз str2 встречается в strl.
Функция не должна изменять свои параметры. Кроме того, любая литера в
strl может учитываться не более чем в одном вхождении str2. Например,
count(' балалайка', ' ала') должна возвращать 1, а не 2.
И. Напишите функцию nonalpha, которая получает параметр str типа string и
возвращает позицию его первой литеры, не являющейся буквой (как латин-
ского, так и русского алфавитов) строчной или прописной. Например, поп-
alpha(' stev7n') дает 5.
♦ 12. Напишите функцию splite( name: string; var first, last: string), которая из
параметра name, хранящего имя и фамилию человека, извлекает их в пере-
менные fl rst (имя) и 1 a st (фамилия). Имя и фамилия разделены некоторым
числом пробелов. Например, после обращения spl 1 te(' Вася Иванов'. strl, stг2)
в strl должно оказаться слово 'Вася', а в str2 — 'Иванов'. Необходимо также
предусмотреть обнаружение и обработку некорректных данных. В частно-
сти, если в name вообще не окажется ни одного пробела, процедура должна
установить в обоих выходных параметрах специальное значение 'error'
(ошибка). Какие еще ошибочные ситуации следует учесть?
♦ 13. Пусть даны две строки strl и str2. Выясните, можно ли из strl путем пере-
становки литёр получить строку str2. Напишите подпрограмму, которая ре-
шала бы указанную задачу.
♦ 14. Напишите процедуру sortml d, которая сортировала бы ряд из п строк в алфа-
витном порядке, основываясь на k-й литере каждой строки, где k является
параметром, передаваемым процедуре sortml d. Например, если k = 3, то эле-
менты ряда должны быть отсортированы по возрастанию значения в третьей
литере каждой строки. Если длина строки меньше k, то будем предполагать,
что его k-й литерой, реально не существующей, служит пробел.
♦ 15. Напишите процедуру сортировки строк в обратном алфавитном порядке.
Задачи, программы 119
16. Напишите подпрограммы encode (зашифровать) и decode (расшифровать),
которые получают два параметра str и alpha типа st г 1 ng. В первом параметре
задается слово, подлежащее шифрованию (дешифровке), второй представ-
ляет собой некоторую перестановку 26 латинских букв алфавита. Принцип
преобразования для шифрации состоит в следующем. Если некоторая буква
в str является А?-й буквой в обычном алфавите, то вместо нее должна быть
взята буква из k-и позиции «нового» алфавита alpha. Для подпрограммы де-
шифровки используется обратный принцип.
17. Расширим предыдущую задачу. Напишите программу для тестирования под-
программ encode и decode. Она должна начинаться с ввода ключа для шифро-
вания и дешифровки — 26-буквенной строки. Затем вводится серия строк,
подлежащих обработке. Над каждой строкой применяется сначала операция
шифрования, а затем дешифровки. При этом необходимо контролировать не-
которые ошибочные ситуации. Например, каждая содержащаяся в ключе
буква должна быть представлена только один раз.
18. Напишите программу, которая будет вводить значения типа string и опре-
делять, является ли каждое из них правильным идентификатором, удовле-
творяющем требованиям языка Турбо Паскаль. Напомним вкратце правила
построения имен. Всякое имя может содержать от 1 до 127 литер; первой ли-
терой должна быть латинская буква (строчная или прописная); любая дру-
гая литера (начиная со второй) может быть буквой, цифрой (от 0 до 9) или
знаком подчеркивания. Если обнаружена ошибка, необходимо выдать сооб-
щение, квалифицирующее ее.
19. Усовершенствуйте программу из предыдущей задачи, чтобы она умела рас-
познавать служебные слова языка Турбо Паскаль и отвергать попытки их
предъявления. Для простоты ограничьте набор служебных слов, взяв за осно-
ву только некоторые из них.
20. Усовершенствуйте программу из задачи 18, сделав возможным автоматиче-
ское преобразование неправильных идентификаторов в синтаксически до-
пустимые. Если исходная строка имеет слишком большую длину, укоротите
ее до допустимого размера путем отбрасывания избыточных литер; если она
пуста, добавьте букву х. Если первая литера не является буквой, то вставьте
перед ней букву х. Если в строке присутствуют какие-то «незаконные» лите-
ры, удалите их.
21. Напишите процедуру convert (преобразовать), получающую один параметр
date (дата) типа string, содержащий значение календарной даты в форме
мм/дд/гг (месяц/день/год). Например, 14 декабря 1960 г. будет изображено
как 12/14/60. Задача процедуры convert состоит в преобразовании получен-
ного значения к форме 'Месяц день. год'. Так, результатом преобразования
только что приведенной даты должно стать'Декабрь 14. I960* (предполага-
ется, что все даты относятся к XX веку).
22. Усовершенствуйте процедуру convert из задачи 21 так, чтобы месяц и (или)
день в параметре date могли быть изображены не только двумя, но и при необ-
ходимости однойдцифрой. Например, 17 мая 1929 г. может быть с одинако-
вым успехом представлено как 05/17/29 или как 5/17/29.
120 Глава 11. Строковый тип
* 23. Усовершенствуйте процедуру convert из задачи 21 так, чтобы любое некор-
ректное значение даты отвергалось. В каких случаях исходную строку, опре-
деляющую дату, можно считать некорректной?
♦ 24. Пусть задан текст, представляющий собой последовательность строк. При-
знак конца текста вводится пользователем. Выведите на печать количество
каждой из содержащихся в строке латинских и русских прописных букв
в порядке частоты их появления.
♦ 25. Пусть задан текст, представляющий собой последовательность строк. При-
знак конца текста вводится пользователем. Выведите на печать заданный
- текст в порядке возрастания длин строк.
♦ 26. Пусть текст представляет собой последовательность строк. На каждой стро-
ке находится имя, фамилия и отчество. Распечатайте все отчества по алфа-
виту, а также текст, содержащий строки, состоящие только из имен и фами-
лий.
27. Пусть задано десять русских имен. Проверьте, все ли эти имена написаны
с прописной буквы; если нет, то исправьте ситуацию.
Глава 12
Записи,оператор
присоединения
Теоретические вопросы
lf Верно ли, что запись относится к структурированным типам данных?
2. Дайте определение поля записи.
3. Верно ли, что поля записи должны иметь один и тот же тип?
4. Как осуществляется ссылка на компоненты записи?
5. Может ли компонент записи быть помечен более чем одним именем?
6. Может ли типом поля записи быть массив?
7. Могут ли записи иметь вложенную структуру?
8. Каков максимально допустимый уровень вложенности записей?
9. Могут ли во вложенных записях имена полей повторяться на разных уров-
нях вложенности?
10. Верно ли, что значения переменных типа запись можно присваивать пере-
менным того же типа?
11. Могут ли совпадать имена полей различных записей?
12. Могут ли совпадать имена, полей одной и той же записи?
13. Как можно оценить объем памяти, необходимой для хранения записи?
14. Можно ли значения полей записи использовать в выражениях?
15. Дайте определение составного имени. Из каких частей оно состоит и как за-
писывается?
16. Чем запись отличается от массива?
17. Какой оператор используют для упрощения доступа к полям записи?
18. Когда применяется запись с вариантами?
19. Из каких частей состоит запись с вариантами?
20. Сколько вариантных частей может быть в любой записи с вариантами?
122 Глава 12. Записи, оператор присоединения
21. Верно ли то, что вариантная часть расположена за всеми фиксированными
полями?
22. Что такое поле признака? Для чего оно используется в записи с вариан-
тами?
23. Как описываются компоненты каждого варианта записи?
24. Сколько вариантов может иметь вариантная часть записи?
25. Как можно оценить объем памяти, выделяемой для записи с вариантами?
26. Почему в вариантной части записи не ставится слово end, закрывающее опе-
ратор case... of?
27. Верно ли, что ключ выбора должен быть стандартным или предварительно
объявленным порядковым типом?
28. Как влияет ключ выбора на количество следующих ниже вариантных полей?
29. Можно ли ключу выбора в исполняемой части программы присвоить неко-
торое значение и таким образом повлиять на выбор полей?
30. Пусть Zap — переменная типа запись, состоящая из нескольких полей. Мож-
но ли инициализировать значение этой переменной с помощью стандартной
процедуры ввода read (Zap)?
31. Верно ли, что все поля записи должны быть разных типов?
32. Почему при описании записи ее поля могут перечисляться в любом порядке?
33. Верно ли, что названия полей записи могут совпадать с именами переменных,
констант и других объектов программы, но не могут совпадать с названиями
полей других записей?
34. Почему при обращении к полю записи имя поля должно указываться явно
и не может быть задано в виде выражения?
Задачи, упражнения, программы
1. Опишите комбинированный тип для определения следующего понятия:
а) цена в рублях и копейках;
Ь) время в часах, минутах и секундах;
с) дата (число, месяц, год);
/
d) адрес (город, улица, дом, квартира);
е) семинар (предмет, преподаватель, номер группы, день недели, часы заня-
тия, аудитория);
f) бланк требования на книгу (сведения о книге: шифр, автор, название; све-
дения о читателе: номер читательского билета, фамилия, дата заказа);
g) экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 стро-
чек с полями: фамилия студента, номер его зачетной книжки, экзаме-
национная оценка).
Задачи, упражнения, программы 123
2. Опишите следующее понятие в виде массива или записи, а если возможно,
то и в том и другом виде:
а) обозначение поля шахматной доски (а5, h8 и т. п.);
Ь) комплексное число;
с) точка в 50-мерном пространстве.
3. Пусть дан фрагмент программы:
type
точка1 = array [ (х. у) ] of real:
точка2 = record
х. у: real
end:
var
pl: точка1;'
p2: точка2;
d: real:
а) объясните, почему допустим данный раздел типов, хотя в нем одними и те-
ми же именами (х и у) обозначены разные объекты (индексы и поля);
Ь) присвойте переменной d значение расстояния между точками pl и р2;
с) подумайте, допустимы ли конструкции pl[succ(х)] и p2.succ(x).
4. Пусть дан фрагмент программы. Требуется переменной К присвоить значе-
ние, соответствующее кругу радиуса 2,5 с центром в точке (0; 1,8). В каких из
перечисленных ниже операторов присоединения правильно решается эта за-
дача, а в каких нет?
type
круг = record
радиус: real:
центр: record
х. у real
end
end:
var
К: круг:
a) with К do
begin
радиус := 2.5:
х := 0:
у :» 1.8
end:
b) with К do
begin
радиус := 2.5;
with центр do
begin
x := 0;
У := 1.8
end
end;
124 Глава 12. Записи, оператор присоединения
с) with К, центр do
begin
радиус := 2.5;
х 0;
у:= 1.8
end;
/
d) with центр. К do
begin
радиус ;= 2.5;
х ;= 0;
у ;= 1.8
end;
5. Используя следующий фрагмент программы, опишите логическую функцию
Бьет (KI. К2, КМ), проверяющую, «бьет» ли карта К1 карту К2, с учетом того, что
масть КМ является козырной.
type
масть = (пики, трефы, бубны, червы);
достоинство = (шесть, семь, восемь, девять.
десять, валет, дама, король, туз);
карта = record
м: масть;
д: достоинство
end;
6. Используя следующий фрагмент программы, опишите логическую функцию
ПравильныйРяд(г), которая проверяет, правильно ли выставлены кости доми-
но в ряду г (равна ли правая цифра очередной кости левой цифре следую-
щей кости).
type
КостьДомино = record
левая, правая; 0 .. 6
end;
ряд = array [1..28] of КостьДомино;
7. Используя следующий фрагмент программы, опишите перечисленные ниже
функции:
type
поле = record
вертикаль; (a. b. с. d. е. f. g. h);
горизонталь: 1 .. 8
end;
а) функция ХодСлона(п1, п2) проверяет, находится ли фигура с поля п2 под
боем у слона, который стоит на поле nl;
Ь) функция ХодЛадьи(п1, п2. пЗ) проверяет, может ли ладья за один ход пе-
рейти с поля nl шахматной доски на поле п2. Если нет, надо указать про-
межуточное поле пЗ, через которое ладья может попасть на поле п2 за два
хода;
с) функция ХодКоня(п1, п2) проверяет, можно ли конем с поля nl объявить
шах, если король находится на поле п2;
d) функция ХодФерзя (n 1. п2) проверяет, может ли ферзь за один ход перейти
с поля nl шахматной доски на поле п2.
Задачи, упражнения, программы 125
8. Используя следующий фрагмент программы, найдите самую длинную реку
из списка С и напечатайте ее название.
type
строка = array [1..15] of char;
река = record
название: строка;
длина: integer
end;
список = array [1..30] of река;
9. Пусть дан фрагмент программы. Используя оператор присоединения, при-
свойте переменной Ад pl значение, соответствующее адресу: Воронеж, ул. Осту-
жева, д. 1, кв. 70. Кроме того, переменной Адр2 присвойте такое же значение,
заменив в нем номер квартиры на 99.
type
строка = array [1..15] of char;
адрес = record
город, улица: строка;
дом. квартира: 1..999
end;
var Адр1. Адр2: адрес;
ч
10. Определите комбинированный тип для представления анкеты школьника,
включающий в себя его возраст, номера школы и класса и оценки по каким-
либо пяти предметам. Опишите некоторую переменную данного типа и при-
свойте ей значение, соответствующее следующей анкете: Петров Иван Иль-
ич, 16 лет, 194-я школа, класс 96, оценки: 5,3,4,5,2.
И. Используя следующий фрагмент программы, опишите перечисленные ниже
функции:
type
имя = (Аня, Валя, Женя. Петя.
Саша. Таня. Шура. Юра);
данные = record
пол: (муж. жен);
рост: 140..200
end;
группа = array [имя] of данные;
а) функция СредРост( ГР ) определяет средний рост женщин из группы ГР;
Ь) функция Высокий( ГР ) определяет имя самого высокого мужчины из груп-
пы ГР;
с) логическая функция ОдинРост ( ГР ) проверяет, есть ли в группе ГР хотя бы
два человека одинакового роста.
12. Используя следующий фрагмент программы, опишите процедуру ИронияСудь-
бы ( С ), которая печатает фамилии двух (любых) жителей из списка С, живу-
щих в разных городах по одному адресу.
type
строка = array [1..20] of char;
житель = record
фамилия, город: строка;
адрес: record
126 Глава 12. Записи, оператор присоединения
улица: строка:
дом. квартира: 1..999
end
end:
var
список: array Cl..15] of житель:
13. Используя следующий фрагмент программы, опишите перечисленные ниже
процедуры:
type
строка = аггау[1..16] of char:
дата = record
число: 1..31:
месяц: 1..12:
год: 1901..1997
end;
анкета = record
фамилия : строка;
пол : (муж. жен);
день рожд : дата
end;
группа = аггау[1..25] of анкета;
а) процедура Старший(Гр, Фам) присваивает строке Фам фамилию самого стар-
шего мужчины из группы Гр (считать, что такой есть и он единственный);
Ь) процедура Печать (Гр. Бук) печатает все фамилии людей из группы Гр, на-
чинающиеся с литеры Бук, и даты рождения этих людей.
♦ 14. В массиве содержится информация о зимней сессии 3-го курса. Сведения
о каждом студенте (максимальное число студентов — 150) содержат следую-
щие данные: фамилию (до 12 символов), номер группы (от 1 до 7), оценки по
трем предметам (функциональный анализ, численные методы и экономика
соответственно). Напишите программу, которая вводит эту информацию и пе-
чатает следующие данные:
а) фамилии студентов, имеющих задолженность хотя бы по одному предмету;
Ь) процент студентов, сдавших все экзамены на 5 и 4;
с) название предмета, который был сдан лучше всего;
d) номера групп в порядке убывания средней успеваемости их студентов.
♦15. Сведения о студентах вуза записаны в массиве и содержит следующую ин-
формацию: фамилия, имя, отчество, пол (М или Ж), возраст (от 16 до 35),
курс (от 1-го до 5-го). Напишите программу, которая вводит эту информа-
цию и печатает следующие данные:
а) номер курса, на котором наибольший процент мужчин;
Ь) самые распространенные мужские и женскце имена;
с) фамилии (в алфавитном порядке) и инициалы всех студенток, возраст
и отчества которых являются одновременно самыми распространенными.
16. Пусть дан фрагмент программы:
type
complex = record
Задачи, упражнения, программы 127
re, Im: real
end:
point = record
x. у: real
end;
var
z, w: complex;
p: point;
re: real:
Определите, какие значения будут иметь переменные z, w, р и ге после выпол-
нения следующих операторов:
with z do
begin
re := 0;
Im ;= 1
end;
w := z;
re := 2;
with z do
re := 1;
z.lm := -w.lm;
with p do
begin
x := re;
У := 2
end:
17. Используя следующий фрагмент программы, опишите перечисленные ниже
подпрограммы:
type
рац = record
числ: integer;
знам: 1..maxint
end;
массив = array[l..20] of рац;
а) логическая функция Равно( а. b ) проверяет на равенство два рациональ-
ных числа а и Ь;
Ь) процедура Слож( а, b ) складывает рациональные числа а и Ь;
с) процедура Сокр( г ) приводит рациональное число г к несократимому
виду;
d) процедура Мах( х. m ) присваивает параметру m наибольшее из рацио-
нальных чисел массива х.
18. Используя следующий фрагмент программы, опишите процедуру Value( р.
х. у ), которая вычисляет у — значение квадратного трехчлена ах2 +6х + с с
коэффициентами из р в комплексной точке х.
type
complex = record
re. Im: real
end:
coeff = record
a, b. c complex { a<>0 }
end:
128 Глава 12. Записи, оператор присоединения
19. Пусть даны комплексное число г (пара вещественных чисел) и веществе!
ное число е > 0. Вычислить с точностью е значение следующей комплексно
функции:
1 Z Z
sn Z = Z +-------1----
3! 5!
2л+1
Z
4* + • • •,
(2л +1)!
+ (2л)! + "';
♦ с) ch
(~l)"z2,,+l
+ (2л+ 1)!
♦ е)
cos
, С-iy *2я ! .
(2л)!
f) ln(l + z) =
2л+1
(|z| < 1);
arctg z =
2
2л + 1
20. Используя следующий фрагмент программы, опишите перечисленные ни»
подпрограммы:
const
MaxN = 30: к
type
ВещТип = record
знак: boolean;
мантисса, порядок: real;
end;
список = array[l..MaxN] of ВещТип;
а) функция MaxNeg(C) предназначена для нахождения минимального отр]
цательного числа из списка чисел С;
Ь) функция MaxDI (С) предназначена для нахождения максимального поря;
ка числа из списка вещественных чисел С;
с) процедура EqualDec(C, р) приводит все числа из списка С к единому п<
рядку р.
21. Используя следующий фрагмент программы, опишите процедуру flfl(d, р
преобразующую координаты точки на плоскости из декартовых d в поля]
ные р, и процедуру ПД(р, d), выполняющую обратное преобразование.
type
декарт = record
х, у: real
end:
Задачи, упражнения, программы 129
поляр
record
г. fl: real { г >= 0. -pi < fi >= pi }
end:
22. Используя следующий фрагмент программы и считая, что все даты даются
по григорианскому календарю (в «новом стиле»), опишите перечисленные
ниже функции:
type
число = 1..31:
месяц = 1..12:
год = 1..2000:
дата e record
ч:
м:
г:
число:
месяц:
год
end:
ДеньНедели = (пн. вт. ср. чт. пт. сб. вс):
а) функция ПослЧисло (d) вычисляет количество дней в том месяце, которому
принадлежит дата d;
b) логическая функция ВернаяДата(d) проверяет правильность даты d;
с) функция ЧислоДней(d) подсчитывает, сколько дней прошло с 1 января
1-го года нашей эры до даты d;
d) функция flH(d) предназначена для определения дня недели, на который
приходится дата d (учтите, что 1 января 1-го года нашей эры было поне-
дельником);
е) функция riHTHHual3(d) определяет количество дней до даты d, которые были
пятницами 13-го числа.
23. Пусть дан массив, содержащий даты. Каждая дата — это число, месяц, год.
Найти:
а) год с наименьшим номером;
Ь) все весенние даты;
с) самую позднюю дату. '
24. Сведения об ученике состоят из его имени и фамилии, названия класса (года
обучения и буквы), в котором он учится, оценок, полученных учеником за
последнюю четверть. Пусть дан массив, содержащий сведения об учениках
школы:
а) выясните, имеются ли в школе однофамильцы;
Ь) выясните, имеются ли однофамильцы в каких-либо параллельных клас-
сах;
с) ответьте на первые два вопроса, но в отношении учеников, у которых сов-
падают и имя, и фамилия;
d) выясните, в каких классах насчитывается более 15 учащихся;
е) выясните, на сколько человек в восьмых классах больше, чем в десятых;
♦ f) соберите все сведения об учениках 9-х и 10-х классов, упорядочив их по
году обучения и букве;
5 Зак. 906
130 Глава 12. Записи, оператор присоединения
g) выясните, сколько учеников школы имеют оценки не ниже «четырех»;
h) сформируйте массив из лучших учеников школы, то есть из учеников, не
имеющих отметок ниже «четырех» и по сумме баллов не уступающих дру-
гим ученикам своего и параллельных классов;
i) проверьте правильность заполнения массива: всегда ли год обучения ле-
жит в пределах от 1 до 11.
25. Багаж пассажира характеризуется количеством вещей и общим весом вещей.
Пусть дан массив, содержащий информацию о багаже нескольких пассажиров:
а) найдите багаж, средний вес каждой вещи которого отличается не более
чем на 0,3 кг от среднего веса вещей всех пассажиров;
Ь) найдите число пассажиров, имеющих более двух вещей, и число пасса-
жиров, количество вещей которых превосходит среднее число вещей;
с) определите, имеются ли два пассажира, багажи которых совпадают по
числу вещей и отличаются по весу не более чем на 0,5 кг;
d) выясните, имеется ли пассажир, багаж которого превышает багаж каждо-
го из остальных пассажиров и по количеству вещей, и по весу;
е) выясните, имеется ли пассажир, багаж которого состоит из одной вещи
весом не менее 30 кг;
f) дайте сведения о багаже, число вещей в котором не меньше, чем в любом
другом багаже, а вес вещей не больше, чем в любом другом багаже с этим
же количеством вещей;
g) упорядочьте сведения о багаже по невозрастанию веса багажа;
h) удалите сведения о багаже, общий вес вещей в котором меньше чем 10 кг.
♦2 6. Пусть дан массив, содержащий сведения о книгах. Сведения о каждой кни-
ге — это фамилия автора, название и год издания:
а) найдите названия книг данного автора, изданных с 1977 года;
Ь) определите, имеется ли книга с названием «Информатика»; если да, то
сообщите фамилию автора и год издания книги, если таких книг несколь-
ко, то сообщите имеющиеся сведения обо всех этих книгах.
♦27. Пусть дан массив, содержащий сведения об экспортируемых товарах: указы-
вается наименование товара, страна, импортирующая товар, и объем постав-
ляемой партии в штуках. Составьте массив стран, в которые экспортируется
товар (наименование задается пользователем), и общий объем его экспорта.
28. Пусть дан массив, содержащий сведения об игрушках: указывается название
игрушки (например, кукла, кубики, мяч, конструктор и т. д.), ее стоимость в
копейках и возрастные границы детей, для которых игрушка предназначена
(например, для детей от 2 до 5 лет). Получите информацию:
♦ а) о названиях игрушек, цена которых не превышает 4 рублей и которые под-
ходят детям до 5 лет;
Ь) о цене самого дорогого конструктора;
♦ с) о названиях наиболее дорогих игрушек (цена которых отличается от цены
самой дорогой игрушки не более, чем на 1 рубль);
Задачи, упражнения, программы 131
♦ d) о названиях игрушек, которые подходят как детям 4 лет, так и детям 10 лет;
♦ е) о ценах всех кубиков;
♦ f) можно ли подобрать игрушку, любую, кроме мяча, подходящую ребенку
3 лет, и дополнительно мяч так, чтобы суммарная стоимость игрушек не
превышала 5 рублей;
♦ g) имеется ли мяч ценой 2 рубля 50 копеек, предназначенный детям от 3
до 8 лет; если да, то выведите сведения об этой игрушке.
29. Пусть даны два массива М1 и М2. Массив М1 — это инвентарный массив,
содержащий сведения о том, сколько изделий каких видов хранится на скла-
де (вид продукции задается ее порядковым номером). Массив М2 — это вспо-
могательный массив, содержащий сведения о том, на сколько уменьшилось
или увеличилось количество изделий по некоторым видам продукции. Вспо-
могательный массив может содержать несколько сведений по продукции
одного вида или не содержать такого сообщения. Обновите инвентарный
массив на основе вспомогательного.
30. Пусть дан массив, содержащий сведения о претендентах на руку и сердце.
Сведения могут содержать следующие данные: фамилию, имя, отчество, воз-
раст, рост, цвет глаз, цвет волос, зарплату, наличие квартиры, наличие маши-
ны и т. п' Сформулируйте несколько критериев, по которым претенденты бу-
дут отбираться. Напишите программу, предназначенную для ввода данных
о претендентах и печати сведений о наиболее подходящих кандидатах в за-
висимости от того или иного критерия.
31. Пусть дан массив, который содержит сведения о продаваемых квартирах.
Сведения могут содержать следующую информацию: общая площадь, жи-
лая площадь, площадь кухни, наличие санузла и его характеристики (совме-
щенный'или нет), наличие лоджии, панельный или кирпичный дом, общее
количество этажей в доме, этаж, на котором расположена квартира, район, в
котором она находится, адрес, стоимость квартиры и т. п. Сформулируйте
несколько критериев, по которым можно отобрать ту или иную квартиру для
покупки и, основываясь на этих критериях, выведите сведения о ней. Если
подходящих квартир несколько, то выведите сведения обо всех.
32. Пусть дан массив, содержащий сведения о жителях, обслуживаемых данной
поликлиникой. Сведения содержат следующую информацию: фамилию, имя,
отчество жителя, адрес, место работы, наличие прививки от дифтерии, дату
прохождения последней флюорографии:
а) напечатайте фамилии и адреса тех жильцов, которые не сделали привив-
ку от дифтерии;
Ь) сформируйте массив с данными о жильцах, у которых на данный момент
просрочена дата флюорографии (дата просрочена, если с ее момента про-
шло больше года).
33. Сведения о каждой машине включают в себя следующую информацию: мо-
дель (строка длиной 10 символов), номер (код региона, цифровой код, бук-
венный код), цвет, сведения о владельце (фамилия, имя, отчество), дата по-
следнего техосмотра:
132 Глава 12. Записи, оператор присоединения
а) выберите данные обо всех машинах, не прошедших техосмотр в текущем
году;
Ь) напечатайте информацию обо всех владельцах «Волг» черного цвета;
с) по номеру машины выдайте всю имеющуюся информацию о ней.
34. Пусть дан фрагмент программы:
type
Строка = array [1..20] of char:
ДеньНедели = (пн, вт. ср, чт, пт. сб, вс);
Время e record
часы: 0..23:
минуты: 0..59
end;
Семинар = record
предмет, преподаватель: Строка:
день: ДеньНедели;
часы: record
начало, конец: Время
end;
номер_группы: 1..300;
аудитория: Integer;
end;
а) напечатайте расписание группы с номером п;
Ь) опишите логическую функцию РасписаниеНеВерно, которая проверяет, нет
ли «накладок» (одновременно проходят занятия у разных преподавате-
лей в одной и той же аудитории или один преподаватель ведет занятия
в разных аудиториях в одно и то же время);
с) напечатайте названия предметов, которые ведет преподаватель с фами-
лией Fam;
d) выясните, в какое время проходит больше всего занятий;
е) определите, есть ли занятия по субботам;
f) определите, сколько преподавателей ведет занятия у группы с номером т;
g) напечатайте названия тех предметов, занятия по которым проводятся
по средам;
h) определите количество занятий в неделю по каждому из предметов.
35. На факультете ПММ ВГУ существует две специализации: прикладная мате-
матика (номера групп с 1-го по 6-й) и механика (группа 7). Сведения о препо-
давателях имеют следующий вид:
const
Кол_воПреподавателей = 100;
type
Группа = 1..7;
Группы_курса = array [Группа] of boolean;
Группы_факультета = array[1..5] of Группы_курса;
Преподаватель = record
ФИО: string;
Специализация: (математика, механика);
{ Обучаемые преподавателем группы }
Задачи, упражнения, программы 133
Список_групп: Группы_факультета
end:
Все_преподаватели = array [1..Кол_воПреподавателей]
of Преподаватель:
а) найдите всех преподавателей, которые ведут занятия только у студентов
со специализацией «механика»;
Ь) посчитайте количество преподавателей, у которых количество обучаемых
групп максимально;
с) напишите логическую функцию, которая определяет, есть ли преподава-
тель, ведущий занятия только в одной группе, и, если такой есть, выведи-
те его фамилию;
d) напечатайте фамилии преподавателей, которые ведут занятия у студен-
тов 2-го курса по обеим специальностям;
е) выясните, есть ли преподаватели, которые ведут занятия у групп со спе-
циализацией, отличной от собственной.
36. Точка задается своими координатами, которые могут быть полярными или
декартовыми. Напишите функцию, которая определяет расстояние между
двумя точками.
37. Пусть дан фрагмент программы:
type
Person = record
Surname.
Name,
Address.
City: string [20]:
Post_index: string [4]:
Telephone: string [12]:
case hobby: (Computer. Music) of
Computer: (type_computer: string [20]:
Mbyte: byte):
Music: (Instrument: array[1..3]
of string [10])
end:
tList = array [1..20] of Person:
var
List: tList:
а) напечатайте фамилии всех людей, у которых имеется компьютер IBM
PC XT;
b) посчитайте количество людей, которые увлекаются музыкой;
с) напечатайте данные обо всех различных музыкальных инструментах, ко-
торые есть в списке List.
38. Пусть дан фрагмент программы:
type
tFigure = (circle, rectangle, triangle):
tColor = (red. green, blue):
Point = record
x. y: real
end;
134 Глава 12. Записи, оператор присоединения
Figures = record
color: tColor:
case FigureType: tFigure of
circle: (center: point:
radius real ):
rectangle: (si. s2 : point):
triangle: (tl. t2. t3: point)
end:
tlist = array [1..20] of Figures:
var
List: tlist;
Определите:
♦ а) суммарную площадь всех фигур;
* b) лежит ли хотя бы один круг внутри какого-нибудь прямоугольника;
♦ с) количество треугольников голубого цвета;
♦ d) на сколько количество прямоугольников красного цвета превышает сум-
марное количество кругов и треугольников зеленого цвета;
Глава 13
Множества
Теоретические вопросы
1. Верно ли, что множество — это набор объектов, сгруппированных по како-
му-либо признаку или группе признаков?
2. Дайте определение элемента множества.
3. Что называется базовым типом множества?
4. Может ли базовый тип множества быть вещественным?
5. В каких пределах можно изменять количество элементов, входящих во мно-
жество?
6. Может ли множество не содержать ни одного элемента?
7. Как обозначается пустое множество?
8. Какой объем памяти занимает один элемент множества?
9. Каково внутреннее представление множества?
10. Может ли множество содержать элементы различных типов?
11. Может ли множество содержать несколько одинаковых элементов?
12. Что называется мощностью множества?
13. Какова мощность множества, базовый тип которого boolean?
14. Может ли тип диапазон быть базовым типом множества?
15. Могут ли два множества содержать одинаковые элементы?
16. Верно ли, что два множества эквивалентны тогда и только тогда, когда все их
элементы одинаковы, причем порядок следования элементов во множестве
не имеет значения?
17. Какие операции допустимы над множествами?
18. Как работает операция in?
19. Какие множества считают равными; неравными? Имеет ли значение для срав-
ниваемых множеств порядок следования элементов?
20. Каково назначение операций «больше или равно», «меньше или равно», при-
мененных к данным множественного типа?
136 Глава 13. Множества
21. Что называется объединением множеств?
22. Что называется пересечением множеств?
23. Что называется разностью множеств?
24. Верно ли, что спецификациями элементов конструктора множеств могут быть
константы или выражения базового типа, а также тип диапазон того же базо-
вого типа?
25. Может ли конструктор множества стоять в правой части оператора присваи-
вания?
26. Можно ли конструктор множества использовать в выражении?
Упражнения, задачи, программы
1. Пусть дан фрагмент программы.
type
bits = set of 0..1;
var
x: bits;
y: set of ( a, b. c );
z: set of
Определите:
а) базовый тип каждого из указанных множественных типов;
Ь) сколько и каких значений может принимать каждая из переменных х, у и z.
2. Если в базовом типе п различных значений, то сколько различных значений
в построенном на его основе множественном типе?
3. Пусть дан фрагмент программы:
type ДеньНедели = ( пн. вт. ср. чт. пт. сб. вс );
Опишите множественный тип, включающий в себя множества из перечи-
сленных ниже элементов:
а) названия любых дней недели;
Ь) названия рабочих дней недели.
4. Какие из следующих описаний не верны и почему?
type
точки = set of real;
байт = array [ 1..8 ] of 0..1;
данные = set of байт;
месяц = ( янв. фев. мар. апр. май. июн, июл. авг. сен. окт. ноя-, дек );
Ml = set of месяц;
М2 = set of июн..авг;
М3 = set of дек..фев;
М4 = set of ( июн. июл. авг );
5. Какие из следующих конструкций являются множествами (в смысле языка
Паскаль), # какие нет?
а) [ 7. 15. 2, 4 ];
Ь) [ 3 9, 12. 45 ];
с) [ 7 ..15 . 9 25 ];
Упражнения, задачи, программы 137
d) [ '!' .. '!' ];
е) [ 1 .. 1 ];
f) [ true .. false ];
g) [.3 .. sqrt( 25 ) ];
h) [ •>='. ’>• ];
i) [ [ ]. [ 5 ] ];
j) [ odd( 9 ). 0<2 ].
6. Пусть дан фрагмент программы:
var
р: set of 0..25:
1, j: Integer;
Если 1 - 4 и j = 7, то какие значения получит переменная р при выполнении
перечисленных ниже операторов присваивания:
а) р := [ 1 + 5. j div 3. j .. sqr( i ) - 8 ];
b) p := [ i .. 3*j ];
c) p := [ 1. j. 5*1. 3*j ].
7. Пусть дан фрагмент программы:
var
s: set of char:
c. d: char:
Присвойте переменной s перечисленные ниже множества:
а) пустое множество;
Ь) множество из строчных гласных латинских букв (а, е, i, о, и);
с) множество из всех цифр;
d) множество литер, которые больше с, но меньше d(c<d).
8. Вычислите значения отношений:
а) [ 6 ] <> [ 6. 6. 6 ];
Ь) [ 'Г. '8' ] = [ '8'. 'Г ];
с) [ 6. 7, 8 ] = [ б .. 8 ];
d) [ 'п', 'пГ ] = [ 'п' .. 'ш' ];
е) [ 1, 7 ] <- [ 1 .. 9 ];
f) [ 2. 5 .. 8 ] <= [ 1 .. 6. 9 ];
g) [ ] <= [ 0 .. 9 ];
h) 'д' in [ 'а' .. 'z' ];
i) trunc( 6.7 ) in [ 1. 5. 6 ];
j) odd( 8 ) in [ ];
k) [ 6 ] < [ 4 .. 9 ].
9. Эквивалентны ли выражения:
a) p in [ 6, 7. 35 ] и ( p=6 ) or ( p=7 ) or ( p=35 );
b) p in [ 2 .. 57 ] и ( p >= 2 ) and ( p <= 57 ).
138 Глава 13. Множества
10. Пусть дан фрагмент программы. Присвойте переменной t значение true, если
wd — рабочий день, и значение false — в противном случае. Какими из пере-
численных ниже операций правильно решается эта задача?
type
ДеньНедели = ( пн. вт. ср. чт. пт. сб. вс ):
РабочийДень = пн..пт:
var
wd: ДеньНедели;
t: boolean:
a) t := wd In РабочийДень;
b) t := wd = РабочийДень;
c) t := wd In [ РабочийДень ];
d) t := wd in [ пн .. пт ];
e) t := [ wd ] <= [ пн .. пт ];
f) t := [ wd ] = [ пн .. пт ].
♦И. Вычислите значения выражений:
a) [ 4. 6. 8 ]+[ 5. 7 ];
b) [ 4. 6. 8 ]*[ 5. 7 ];
c) [ 4. 6. 8 ]-[ 5. 7 ];
d) [ 7 ...12 M 9 .. 18 ];
e) [ 7 .. 12 ]*[ 9 .. 18 ];
f) [ 7 .; 12 ]-[ 9 .. 18 ];
g) [ 4, 7 ]+[ 1 .. 9 ];
h) [ 4. 7 ]*[ 1 .. 9 ];
i) [ 4. 7 ]-[ 1 .. 9 ];
j) [ ]+[ 23 ];
k) [ ]*[ 23 ];
1) [ ]-[ 23 ].
12. Вычислите значения выражений:
a) [ 2 .. 13 ]*[ 3. 13 .. 60 ]+[ 4 .. 10 ]-[ 5 .. 15 ]*[ 6 ];
b) [ 2 .. 10 ]-[ 4. 6 ]-[ 2 .. 12 ]*[ 8 .. 15 ];
c) ( [ JO’ .. '7' ]+[ '2' .. ’9' ] )*( [ ’a' ]+[ ’z‘ ]).
13. Упростите (А и В — множества):
a) A*B-A\
b) A-(A-B);
c) (A + В) - (A - B) - (B - A);
d) (А -В) + (B - A) + A*B.
14. Пусть дан фрагмент программы. Присвойте переменной В множество, полу-
ченное из А перечисленными далее способами:
var
А. В: set of char:
Упражнения, задачи, программы 139
х: char;
а) добавлением элемента х;
Ь) удалением элемента х.
15. Найдите все ошибки в следующем фрагменте программы:
type М = set of char;
function f( a. b; M; x; char ); M;
begin
if a * b = 0 then a:= [ x ] else
if a < b thpn a;= b + x else
if ord (x) in a - b
then a:e a - [ x..'<=' ];
f:= a + b
end;
16. Пусть дан текст. Посчитайте общее число вхождений английских букв в текст.
17. Пусть дан текст. Верно ли, что в нем имеются буквы, входящие:
а) в слово «шина»;
♦Ь) в слово, задаваемое пользователем?
18. Напишите процедуру, которая осуществляет ввод текста, состоящего из не-
повторяющихся букв.
19. Пусть дан текст. Распечатайте те буквы, которые встречаются в каждом сло-
ве текста только один раз.
20. Пусть дан текст. Найдите наибольшее количество цифр, идущих подряд.
21. Пусть вводится последовательность символов длиной не более 4. Если все
вводимые символы — цифры, то выполните преобразование данной после-
довательности в целое число.
22. Пусть дан текст. Определите, содержит ли он символы, отличные от букв и
пробелов.
23. Пусть дан фрагмент программы. Опишите процедуру Print (А), печатающую
в алфавитном порядке все элементы множества А типа TLetter.
type TLetter = set of ’a’..'z *;
24. Пусть дан текст, состоящий из строчных латинских букв и цифр. Определи-
те, каких букв — гласных (а, е, i, о, и) или согласных — больше в этом тексте.
25. Пусть дан текст, оканчивающийся точкой. Напечатайте:
♦ а) первые вхождения символов в текст, сохраняя их исходный порядок;
* Ь) символы, входящие в текст не менее двух раз;
с) симолы, ходящие текст только один раз в порядке их пояления;
♦ d) символы, входящие в текст только один раз, в порядке их кодов.
26. Пусть дана непустая последовательность слов из строчных русских букв.
Между соседними словами присутствует запятая, за последним — точка. На-
печатайте в алфавитном порядке:
♦ а) гласные буквы, которые входят в каждое слово;
Ь) согласные буквы, которые не входят ни в одно слово;
с) все звонкие согласные буквы, которые входят хотя бы в одно слово;
♦ d) все глухие согласные буквы, которые не входят хотя бы в одно слово;
140 Глава 13. Множества
♦ е) все глухие согласные буквы, которые не входят только в одно слово;
f) все звонкие согласные буквы, которые входят более чем в одно слово;
♦ g) все гласные буквы, которые не входят более чем в одно слово;
♦ h) все звонкие согласные буквы, которые входят в каждое нечетное слово
и не входят ни в одно четное слово;
* i) все глухие согласные буквы, которые входят в каждое нечетное слово и не
входят хотя бы в одно четное слово.
ПРИМЕЧАНИЕ Буквы а, е, и, о, у, ы, э, ю, я — гласные; все остальные — согласные, кроме й,
ь, ъ. Звонкие согласные — б, в, г, д, ж, з, л, м, н, р; глухие согласные — к, п, с,
т, ф, х, ц, ч, ш, щ.
27. Пусть дано натуральное число п (п > 2). Найдите все меньшие п простые числа,
используя решето Эратосфена. Решетом Эратосфена называют следующий
способ определения простых чисел. Выпишем подряд все целые числа от 2
до п. Первое простое число 2. Подчеркнем его, а все большие числа, кратные 2,
зачеркнем. Первое из оставшихся чисел — 3. Подчеркнем его, а все большие
числа, кратные трем, зачеркнем. Первое число из оставшихся теперь — 5, так
как 4 уже зачеркнуто. Подчеркнем его как простое, а все большие числа, крат-
ные пяти, зачеркнем и т. д.
♦28. С помощью решета Эратосфена (см. предыдущее задание) найдите четверки
меньших п простых чисел, принадлежащих одному десятку (например, И,
13,17,19).
29. Пусть дано 100 целых чисел от 1 до 50. Определите, сколько среди них чисел
Фибоначчи и сколько чисел, первая значащая цифра в десятичной записи
которых — 1 или 2.
30. Пусть дан фрагмент программы. Опишите функцию QuantDays(m), определя-
ющую количество дней в месяце m невисокосного года.
type month = 1..12;
31. Пусть дан фрагмент программы. Опишите функцию Gard (А), подсчитываю-
щую количество элементов во множестве А типа М. Например, Card([5. 8,
23])=3.
type М - set of 1..99;
32. Пусть дан фрагмент программы. Опишите функцию Sum(A, SI. S2), вычи-
сляющую сумму тех элементов матрицы А, номера строк и номера столб-
цов которых принадлежат соответственно непустым множествам S1 и S2
типа num.
const n = 10;
type
number = 1..n;
matrl*» array [ number, number ] of real;
num = set of number;
33. He используя дополнительных переменных, поменяйте местами значения А
и В множественного типа (предполагается, что множествах и В не содержат
общих элеиентов ).
Упражнения, задачи, программы 141
34. Пусть дан фрагмент программы. Определите х, у, z, где х — множество целых
чисел от 5 до 33, у — множество простых чисел, z — множество составных
чисел.
var х. у. z: set of 5..33:
35. Пусть дан фрагмент программы. Опишите перечисленные ниже подпро-
граммы:
type NatDig = 1..Maxint:
а) функция Dlgit(n) подсчитывает количество различных значащих цифр
в десятичной записи числа;
Ь) процедура Print(n) печатает в возрастающем порядке все цифры, не вхо-
дящие в десятичную запись числа п.
36. В возрастающем порядке напечатайте все целые числа из диапазона 1... 10 000,
представимые в виде п2 + ти2, где т, п > 0.
37. В порядке убывания напечатайте все целые числа из диапазона 1 ...4900, кото-
рые представимы в виде п2 + 2k2, но не представимы в виде lij + j + 3 (и, k, i,j > 0).
38. Пусть дан фрагмент программы. Опишите процедуру НаличиеСМа г, А. В, С),
которая по информации из массива Маг типа магазины присваивает парамет-
рам А, В, С типа ассортимент значения, перечисленные ниже.
type
продукт « ( хлеб, масло, молоко, мясо. рыба. соль. сыр. колбаса, сахар, чай. кофе ):
ассортимент - set of продукт:
магазины « array El..20] of ассортимент:
а) А — продукты, которые есть во всех магазинах;
Ь) В — продукты, которые есть хотя бы в одном магазине;
с) С — продукты, которых нет ни в одном магазине.
39. Пусть дан фрагмент программы. Опишите логическую функцию Везде(ГР),
определяющую, есть ли в группе ГР хотя бы один человек, побывавший в гос-
тях у всех остальных из группы (ГР[х] — множество людей, побывавших
в гостях у человека с именем х; х ё ГР[х]).
type
имя = ( Вася. Володя. Ира. Лида, Марина. Миша. Наташа. Олег. Оля. Света. Юля ):
гости = set of имя:
группа = array [ имя ] of гости;
40. Пусть дан фрагмент программы. Опишите процедуру МожноПопасть(Р, Н. К),
которая по рейсам Р (Р[х] — множество городов, в которые можно за один
рейс доехать из города х) определяет К — множество городов, в которые мож-
но попасть автобусом (за один рейс или через другие города) из города Н.
type
город = ( а .Ь .с ,d .е ,f . g. h ):
города = set of город:
рейсы - array [город] of города;
41. Вычислите определитель заданной квадратной матрицы А n-го порядка
(п = 15), используя формулу:
л
det(^) = £(-1) + аи • det(^t),
к=\
142 Глава 13. Множества
где Ak — матрица, полученная удалением первой строки и k-vo столбца. Для
этого определите рекурсивную функцию от параметров I и s, которая по фор-
муле вычисляет определитель матрицы, полученной из А удалением первых
/ строк и всех столбцов, номера которых принадлежат множеству s.
Задания для самостоятельной работы
1. Составьте программу вычисления суммы номеров мест, на которых в слове S
стоят гласные буквы.
2. Пусть вводится последовательность чисел в диапазоне от 1 до 255. Признак
конца последовательности — 0. Определите переменные min и max как мини-
мальное и максимальное из введенных чисел. Напечатайте по одному разу
все числа из интервала (min, max), которые не были введены.
3. Пусть вводится последовательность символов. Признак конца последователь-
ности — точка. Напечатайте все латинские буквы, которые есть в данной по-
следовательности символов.
4. Пусть задана произвольная последовательность символов. Признак конца
последовательности — точка. Напечатайте те символы, которые встречают-
ся в данной последовательности более одного раза.
5. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен-
ных пробелами. Слова представляют собой произвольную последователь-
ность символов, отличных от пробела. Напечатайте все слова, которые со-
стоят из тех же литер, что и последнее слово текста.
6. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен-
ных пробелами. Слово представляет собой последовательность латинских
букв. Напечатайте те слова, в которые не входит ни одна из букв первого
слова.
7. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен-
ных пробелами. Слово — последовательность русских букв (как строчных,
так и прописных). Напечатайте слова, имеющие четный номер, которые со-
стоят только из повторяющихся букв.
8. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен-
ных пробелами. Слово — последовательность латинских букв. Напечатайте
слова текста, имеющие нечетный номер, в которых нет ни одной повторяю-
щейся буквы.
9. Пусть задана целочисленная квадратная матрица размерности п. Напечатайте
все значения i (1 < i < и), при которых i-я строка симметрична, а i-й столбец
упорядочен по убыванию.
10. Пусть задана целочисленная квадратная матрица размерности п. Элементы
матрицы находятся в диапазоне от 1 до 100. Напечатайте все цифры из за-
данного диапазона, которых нет ни в одной из строк заданной матрицы.
И. Пусть задана целочисленная квадратная матрица размерности п. Известно,
что значения элементов матрицы не меньше 0 и не больше 30. Напечатайте
Задания для самостоятельной работы 143
номера тех строк матрицы, которые содержат все целочисленные элементы,
лежащие в диапазоне от минимального элемента рассматриваемой строки до
ее максимального элемента. Например, рассмотрим строки матрицы размер-
ности 5. Если строка состоит из элементов 1,3, 2, 5,4, то ее минимальный
элемент равен 1, а максимальный — 5. Значения 2,3,4 как раз составляют все
те числа, которые попадают в промежуток от 1 до 5, поэтому номер такой стро-
ки необходимо напечатать. Если же строка состоит из элементов 7, 6,3,2,5,
то весь диапазон от минимального элемента 2 до максимального элемента 7
не заполняется имеющимися в строке значениями. Не хватает значения 4.
Поэтому номер такой строки печатать не следует.
12. Пусть задана символьная квадратная матрица размерности п. Напечатайте
элементы матрицы, лежащие на ее главной диагонали, если все они отличны
от элементов, принадлежащих побочной диагонали. Если это условие не вы-
полняется, то напечатайте элементы побочной диагонали данной матрицы.
13. Пусть задана символьная матрица размерности п х т. Напечатайте все сим-
волы, находящиеся в столбцах, элементы которых симметричны.
14. Напечатайте все целые числа, лежащие в диапазоне от 5 до 2500, которые
представимы в виде 5п + 7т, где п и т — целые числа (т, п > 0).
15. Напечатайте все целые числа в диапазоне от 1 до 3600, которые представи-
мы в виде п2 + т2, но которые нельзя представить как 5/ + 5k (т, n,k,l> 0).
16. Напечатайте все целые числа в диапазоне от 1 до 1600, которые представимы
в виде х2 + у2, но которые нельзя представить в виде ху - с2, где с изменяется
от 1 до 5.
17. Пусть заданы п отрезков с целочисленными координатами концов. Коорди-
наты концов находятся в диапазоне от 0 до 100 включительно. Определите,
существует «ли точка с целочисленными координатами, которая принадле-
жит всем этим отрезкам.
18. В классе учатся 25 учеников. Каждому ученику были выставлены оценки за
четверть по 15 предметам. Определите, сколько в классе отличников, хоро-
шистов и троечников.
19. Известны результаты анкетирования ста человек. Анкета состоит из 150 пунк-
тов, на которые предлагалось ответить утвердительно, отрицательно или «нет
определенного мнения по данному вопросу». Напечатайте номера тех пунк-
тов анкеты, на которые были получены только утвердительные и только от-
рицательные ответы всех опрошенных (если, конечно, такие пункты есть).
20. В городе У имеется 100 кондитерских магазинов. Известно, что в каждом из
этих магазинов не более 20 видов сластей в ассортименте. Какие виды слас-
тей есть во всех имеющихся магазинах? Существует ли магазин, торгующий
уникальной продукцией? Перечислите 5 видов сластей, которые есть в боль-
шинстве магазинов города ЛГ(ассортимент кондитерских магазинов рассмат-
ривайте как данные перечислимого типа).
21. Пусть заданы два предложения, слова в которых разделены запятыми или
пробелами. Каждое предложение заканчивается точкой. Можно ли из букв
144 Глава 13. Множества
первого предложения составить второе предложение и наоборот? Если нельзя
ни то ни другое, то перечислите буквы, которых не хватает в первом (вто-
ром) предложении, чтобы составить второе (первое).
22. В столовой имеются отдельные меню на завтрак, обед и ужин. Известно, что
в каждом из этих меню не более 10 видов блюд. Определите, какие виды блюд
имеются и на завтрак, и на обед, и на ужин, если такие есть. Определите виды
блюд, которые есть только на завтрак, только на обед, только на ужин (виды
блюд рассматривайте как данные перечислимого типа).
23. Вводится последовательность слов. Определите, какое количество слов по-
требуется, чтобы задействовать все буквы английского (русского алфавита).
Ввод слов оканчивается, когда задействованы все буквы.
24. Вводится слово-образец. Затем вводится список слов (не более 100). Опре-
делите слова, в которых нет хотя бы одной буквы из слова-образца. Выведи-
те такие слова, а также буквы, которых нет в слове-образце.
Глава 14
Файлы
Теоретические вопросы
1. Что такое последовательный файл?
2. Какого типа могут быть компоненты файла?
3. Сколько компонентов может содержать файл?
4. Как определяется длина файла?
5. Нужно ли при определении файла заранее указывать его длину?
6. Могут ли одновременно быть доступны несколько компонентов последова-
тельного файла?
7. Могут ли быть записями одного и того же файла следующие значения: "1",
-5,1.73?
8. Куда помещается при записи очередной компонент файла?
9. Какая запись будет прочитана по команде чтения?
10. Какие действия выполняются системой по команде «открыть файл»?
11. Отличаются ли действия, соответствующие командам reset и rewrite?
12. Можно ли открыть одновременно для чтения и записи:
а) типизированный файл?
б) текстовый файл?
13. Можно ли прочитать файл, открытый для записи?
14. Можно ли изменить какую-то запись уже существующего последовательно-
го файла?
15. Приведите описание и фрагмент программы для формирования последова-
тельного файла из целых чисел и последующего его считывания.
16. Можно ли добавить новую запись в файл после того, как он был прочитан
до конца?
17. Что произойдет при попытке чтения файла после того, как все записи про-
читаны?
18. В каких случаях стандартная функция eof принимает значение true, а в ка-
ких false при чтении файла и при записи?
146 Глава 14. Файлы
19. Может ли файл не содержать ни одной записи? Если может, то как об этом
узнать?
20. В чем отличие процедур read и write?
21. В чем отличие процедур read и readln, write и writein? Какие из этих проце-
дур применимы к:
а) текстовым файлам?
б) типизированным файлам?
22. Каково назначение операции close?
23. Что делает следующая программа?
program WhatIsIt;
var
f: file of integer;
i: i nteger;
begin
reset( f );
while not eof( f ) do
begin
read( f. i );
writeln( i )
end;
close(f)
end. {Whatlslt}
Каковы действия программы в случае пустого файла f? Изменится ли смысл
программы, если использовать следующий цикл?
repeat
read( f. i );
writeln( i )
until eof( f );
24. Пусть дано описание файла. Можно ли из описания определить, какие опе-
рации (чтение, запись) над этим файлом разрешены?
25. Пусть файл открыт для записи. Можно ли по состоянию флага eof(f) опре-
делить, была ли сделана хотя бы одна запись в файл f ?
26. Как осущестить прямой доступ к компоненту файла?
27. Какой номер имеет первый компонент файла?
28. Какова структура текстового файла?
29. Каким образом можно дополнить данными:
а) текстовый файл?
б) типизированный файл?
30. Можно ли организовать прямой доступ к символам текстового файла?
Упражнения, задачи, программы
1. Создайте файл целых чисел /. Числа считываются из стандартного устрой-
ства ввода. Признаком конца ввода является число 9999.
2. Создайте файл целых чисел, занося в него числа Фибоначчи, не превос-
ходящие заданного числа N.
Упражнения, задачи, программы 147
3. Пусть даны два файла целых чисел j\ и f2. Найдите в файле /2 число, самое
близкое по величине к минимальному значению файла/Р
♦ 4. Пусть даны два файла целых чисел. Определите, в каком из них больше по-
ложительных, отрицательных и нулевых значений.
♦ 5. Пусть дан файл целых чисел. Определите, являются ли числа в файле упоря-
доченными по возрастанию.
♦ 6. Пусть дан файл целых чисел. Определите, являются ли числа в файле упоря-
доченными (по возрастанию или по убыванию).
♦ 7. Пусть дан файл, хранящий последовательность целых чисел. Определите,
является ли последовательность знакопеременной.
8. Пусть дан файл целых чисел. Выберите наибольшее из них, принадлежащее
интервалу [а, Ь]. Концы интервала a, b вводятся со стандартного устройства
ввода.
* 9. Пусть дан файл целых чисел. Создайте новый файл, значения в который за-
писываются по следующему правилу: суммируются подряд идущие значе-
ния одного знака; вместо группы нулей записывается один нуль. Например:
исходный файл: 20 10 4 -1 -2 0 0 0 -10 41 62;
ш файл-результат: 34 -3 0 -10 103.
* 10. Пусть дан файл целых чисел. Определите, сколько раз в нем повторяется
максимальное значение.
* 11. Пусть дан файл целых чисел. Определите, сколько в нем интервалов воз-
растания.
12. Пусть дан файл целых чисел/. Создайте два новых файла/2 и /3 из положи-
тельных и отрицательных чисел соответственно. Если какой-то из создан-
ных файлов окажется пустым, сообщите об этом.
13. Пусть дан файл целых чисел. Сформируйте два выходных файла целых чи-
сел, записывая поочередно числа, образующие возрастающую последователь-
ность, то в один то в другой файл. Например:
зй исходный файл: fl: 2 4 3 8 15 -1 -3 10 1;
первый файл-результат: f2: 2 4-11;
второй файл-результат: f3: 3 8 15 -3 10.
14. Пусть дан файл целых чисел. Определите, где больше нулей — на четных
или на нечетных позициях.
15. Пусть дан файл целых чисел. Создайте файл вещественных чисел,
компонентами которого будут средние арифметические значения каждой
пятерки подряд идущих чисел. Последняя группа может содержать меньше
пяти значений.
16. Пусть в файлах^ и/2 целые числа упорядочены по возрастанию. Создайте
файл /3, объединив/ и /2 и сохранив упорядоченность.
* 17. Пусть дан файл целых чисел. Определите длину наибольшего интервала воз-
растания и среднее арифметическое чисел этого интервала.
148 Глава 14. Файлы
/
* 18. Пусть дан файл целых чисел. Определите наибольшую сумму подряд иду-
щих чисел, образующих возрастающую последовательность.
♦ 19. Пусть дан файл целых чисел. Определите, образуют ли числа арифмети-
ческую прогрессию.
20. Пусть дан файл целых чисел. Значения в нем имеют следующий смысл:
п\ fw /12 — Л», ni fn /22 — fin2 •••» где ~ количество оценок первого сту-
дента, /, fn ... / — оценки первого студента, п2 — количество оценок второ-
го студента, /21 f22 ... f2n^ — оценки второго студента и т. д. Задание:
а) найдите номер студента, имеющего наибольшую среднюю оценку;
Ь) создайте файл вещественных чисел со средними оценками каждого сту-
дента.
♦ 21. Пусть даны два файла целых чисел. Определите, сопадают ли они.
♦ 22. Пусть даны два файла целых чисел. Определите, больше ли минимальное
значение первого файла, чем максимальное значение второго.
23. Пусть дан файл целых чисел с диапазоном значений от а до Ь. Определите,
сколько раз встречается каждое значение в файле.
♦ 24. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай-
ле. Определите, есть ли в ней нулевые строки.
♦ 25. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай-
ле. Определите, является ли она единичной.
♦ 26. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай-
ле. Перенесите в новый файл т-й столбец матрицы (т задается вводом).
*27. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай-
ле. Определите, упорядочены ли значения m-го столбца по возрастанию (т
задается вводом).
♦ 28. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай-
ле. Найдите значение первого максимального элемента, а также номер стро-
ки и номер столбца, соответствующие этому значению.
♦ 29. Пусть матрица Л целых чисел размером п х п записана по строкам в файле/.
Создайте новый файл /2, в который перепишите ненулевые строки в следую-
щем формате: kaki ak2... akkn, где k — номер ненулевой строки, kaki ak2... akk„ -
значения k-й строки.
♦ 30. См. условие задания 13. Пусть дан файл /2. Создайте файл/.
31. Студентам 5-го курса была предложена анкета о том, знание каких из прочи-
танных курсов могут потребоваться в будущей работе. Результаты анкети-
рования были занесены в файл. Напишите программу создания файла анке-
тирования. Список прочитанных курсов:
ав математический анализ;
88 алгебра;
8g информатика;
as численные методы;
& дифференциальные уравнения;
Упражнения, задачи, программы 149
& теория вероятности;
& функциональный анализ.
32. См. условие задания 31. Напишите программу обработки файла анкетиро-
вания: по заданному предмету определите, сколько студентов назвали его
полезным.
33. См. условие задания 31. Напишите программу обработки файла анкетирова-
ния: выберите и напечатайте название предмета, получившего наибольшую
оценку (если таких несколько — перечислите все).
34. См. условие задания 31. Напишите программу обработки файла анкетиро-
вания: сколько студентов не оценили положительно ни один из предметов
и сколько студентов оценили все предметы как полезные.
35. См. условие задания 31. Напишите программу обработки файла анкетирова-
ния: определите, сколько студентов назвали полезными k и более предметов.
36. См. условие задания 31. Напишите программу обработки файла анкетирова-
ния: распечатайте названия предметов в порядке убывания их рейтинга.
37. См. условие-задания 31. Напишите программу обработки файла анкетирова-
ния: определите количество студентов, оценивших положительно все семь
предметов, шесть предметов и т. д.
38. См. условие задания 31. Создайте новый файл, в который перенесите записи
в следующем порядке: сначала ответы со всеми положительными оценками,
затем ответы, в которых шесть положительных оценок, и т. д.
39. См. условие задачи 31. Напишите программу обработки файла анкетирова-
ния: перенесите в новый файл записи с положительными оценками заданно-
го предмета.
40. Полугодовая информация о подписных изданиях по каждому подписчику
имеет следующую структуру: ФИО, участок доставки, адрес, количество
выписанных изданий, список изданий. Адрес в свою очередь состоит из сле-
дующих компонентов: улица, номер дома, номер квартиры. Список изданий
состоит из следующих компонентов: название, вид, то есть газета или жур-
нал, месяцы, на которые оформлена подписка. Список изданий представляет
собой массив структур, содержащий У элементов, из которых заполнены К —
количество выписанных изданий. Если подписчик оформил подписку на
более чем N изданий, то для него имеется две или более записи, идущие под-
ряд. Информация о месяцах подписки может, например, быть представлена
в виде массива из двенадцати логических элементов. Создайте файл с ин-
формацией о подписных изданиях.
41. См. условие задания 40. Напишите программу обработки файла подписных
изданий: по заданному номеру месяца и заданному изданию найдите коли-
чество экземпляров, подлежащих доставке.
42. См. условие задания 40. Напишите программу обработки файла подписных
изданий: по заданному номеру месяца и названию издания распечатайте
количество экземпляров, необходимых для каждого участка. Считайте, что
записи в файле упорядочены по номеру участка доставки.
150 Глава 14. Файлы
43. См. условие задания 40. Напишите программу обработки файла подписных
изданий: по заданным ФИО распечатайте список подписных изданий дан-
ного подписчика (записей, относящихся к одному подписчику, может быть
несколько).
44. См. условие задания 40. Напишите программу обработки файла подписных
изданий: по заданному названию издания и номеру месяца определите учас-
ток, получающий больше всего экземпляров.
* 45. См. условие задания 40. Напишите программу обработки файла подписных
изданий: по заданному участку доставки и месяцу определите издание, на
которое подписалось наибольшее число подписчиков.
46. См. условие задания 40. Напишите программу обработки файла подписных
изданий: распечатайте ФИО подписчиков, оформивших подписку на наи-
большее число изданий, независимо от количества месяцев.
I
♦ 47. См. условие задания 40. Напишите программу обработки файла подписных
изданий: определите участок доставки, на котором наибольшее число под-
писчиков (учесть, что записей, относящихся к одному подписчику, может
быть несколько). Пусть записи упорядочены по номеру участка.
♦ 48. См. условие задания 40. Напишите программу обработки файла подписных
изданий: по заданным ФИО, участку доставки, адресу, названию издания
выполните исключение данного издания из списка подписных изданий, то
есть создайте новый файл, который будет соответствовать новому состоя-
нию. Если указанное издание было единственным в записи, исключите запись.
♦ 49. См. условие задания 40. Напишите программу обработки файла подписных
изданий: по заданным ФИО, участку доставки, адресу, названию издания,
виду, месяцам, на которые оформлена подписка, добавьте информацию в
файл, то есть создайте новый файл, который будет соответствовать новому
состоянию информации. Если список изданий в записи заполнен, создайте
новую запись.
50. Пусть дан файл, содержащий сведения об абонентах телефонной станции:
ФИО, номер телефона, содержащий номер АТС и собственно номер. Пусть за-
писи упорядочены по номеру телефона. Напишите программу создания фай-
ла сведений об абонентах телефонной станции.
* 51. См. условие задания 50. Добавьте новую запись в файл, сохраняя упорядо-
ченность по номеру телефона.
♦ 52. См. условие задания 50. Распечатайте свободные номера по каждой АТС
в виде интервалов, например: 45671-46000 46007 47000-47100...
* 53. См. условие задания 50. Отсортируйте записи по полю ФИО. Реализуйте
алгоритм внешней сортировки простым слиянием.
& Используются один входной и два выходных файла.
$ Z-проход (Z = 1,2,3,...) состоит из двух фаз: разделения и слияния. Разделе-
ние — отсортированные серии длиной L из входного файла поочередно пе-
реписываются в два выходных. Слияние — выходные файлы становятся
входными, а входной — выходным, упорядоченные серии длиной L слива-
Упражнения, задачи, программы 151
ются в упорядоченные серии длиной 2L и записываются в выходной файл.
Так продолжается до тех пор, пока длина серии после слияния не станет
большей или равной по общему числу сортируемых записей.
Результат помещается на место исходного файла.
54. Пусть файл Wages содержит сведения о заработной плате сотрудников пред-
приятия в формате: № отдела, ФИО, Сумма к получению. Записи упорядоче-
ны по полю № отдела. Напишите программу создания файла W^ges.
55. См. условие задания 54. Напишите программу распечатки ведомости по от-
делам.
♦ 56. См. условие задания 54. Найдите отдел с самой высокой средней заработной
платой.
57. См. условие задания 54. Найдите отдел с самой большой общей суммой вы-
платы.
58. Пусть файл Ma rk содержит оценки учащихся класса за год в формате: Фамилия,
Оценки по 10 предметам. Пусть таблица Name содержит названия предметов
в том же порядке, в котором перечислены оценки в файле Mark. Задание:
а) распечатайте фамилии отличников;
♦ Ь) по заданному названию предмета определите среднюю оценку класса по
этому предмету;
♦ с) сравните средние оценки класса по двум заданным предметам;
♦ d) распечатайте название предмета с наилучшей средней оценкой.
♦59. Пусть файл содержит сведения о билетах спортлото, участвующих в тираже.
Используя следующий фрагмент программы, напишите процедуру, которая
по файлу типа Lottery (сведения о билетах, участвующих в тираже) и масси-
ву типа Gain (выигрышные номера тиража) определяет количество билетов,
в которых угадано три номера, четыре номера и все пять номеров.
type
Nom = 1..36:
Rec - set of Nom;
Lottery = file of rec;
Gain = array Cl..5] of Nom;
ПРИМЕЧАНИЕ В заданиях с 60-го по 84-е предполагается, что текстовый файл содержит
строки длиной не более 80 символов. Строка состоит из слов, разделен-
ных произвольным количеством пробелов.
60. Создайте текстовый файл. Текст вводится со стандартного устройства ввода.
61. Пусть дан текстовый фацл. Подсчитайте количество пустых строк.
62. Пусть дан текстовый файл Перепишите его содержимое в файл /2, сохра-
няя строчную структуру и удаляя пустые строки.
63. Пусть дан текстовый файл. Слова не переносятся с одной строки на другую.
Напечатайте строку с наибольшим количеством слов. Если таких строк не-
сколько, напечатайте первые десять.
152 Глава 14. Файлы
* 64. Пусть дан текстовый файл. Перенесите в новый файл все строки, содержа-
щие заданное слово.
* 65. Пусть дан текстовый файл. Перенесите в новый файл все строки, не содер-
жащие заданного слова.
♦ 66. Пусть дан текстовый файл. В новый файл перенесите каждое слово как от-
дельную строку. Переход к новой строке в исходном файле соответствуем
пустой строке в новом файле. Пустых строк в заданном файле нет.
67. По файлу, содержащему строки-слова (см. условие предыдущего задания),
получите первоначальный файл, в котором слова разделены одним пробелом.
* 68. Пусть дан текстовый файл. Распечатайте первую строку, содержащую наи-
большее число различных слов.
♦ 69. Пусть дан текстовый файл. Для каждой строки распечатайте слово наиболь-
шей длины. Если их несколько, то распечатайте все.
70. Пусть дан текстовый файл. Распечатайте строку с заданным номером.
♦ 71. Пусть дан текстовый файл. Удалите строку с заданным номером. Если строки
с указанным номером нет, сообщите об этом.
72. Пусть дан текстовый файл. Распечатайте все строки, начинающиеся с задан-
ного слова.
♦ 73. Пусть дан текстовый файл. Распечатайте все строки, оканчивающиеся за-
данным словом.
74. Пусть дан текстовый файл. Найдите строку максимальной длины.
* 75. Пусть дан текстовый файл. Создайте новый файл на основе данного, оставив
в каждой группе подряд идущих строк, отличающихся между собой только
количеством пробелов между словами, одну с минимальным числом про-
белов.
76. Пусть дан текстовый файл. Определите, сколько строк файла имеют длину,
большую, равную и меньшую, чем заданное значение k.
♦ 77. Пусть дан текстовый файл. Создайте два выходных файла: в один перепи-
шите из каждой строки первые р слов (р задается вводом), в другой — остав-
шиеся. Если в строке меньше чем р слов, то во втором файле соответствую-
щая строка должна быть пустой.
78. Пусть даны файлы, созданные по условию предыдущего задания. Выполни-
те объединение двух файлов: из соответствующих двух строк входных фай-
лов получите одну строку выходного файла путем их конкатенации.
♦ 79. Пусть дан текстовый файл. Распечатайте строки, предшествующие строкам,
начинающимся с заданного слова.
* 80. Пусть дан текстовый файл. Напечатайте первое из слов, в котором наиболь-
шее число различных букв. Если длина слова больше 20, то распечатайте пер-
вые 20 букв.
* 81. Пусть дан текстовый файл. Для каждой строки распечатайте первое из слов,
содержащее наибольшее число различных букв.
Упражнения, задачи, программы 153
♦ 82. Пусть дан текстовый файл. Для каждой строки распечатайте слово с номе-
ром (п + 1) div 2, где п — количество слов в строке.
83. Пусть дан текстовый файл. Создайте файл целых чисел, в котором каждой
строке исходного файла соответствует в выходном файле число, равное коли-
честву слов в строке. Пустой строке или строке, состоящей из одних пробе-
лов, соответствует число 0.
♦ 84. Пусть дан текстовый файл. Максимальная длина слова в этом файле равна
пяти символам. Создайте пять файлов. Каждой строке входного файла соот-
ветствует одна строка в каждом из пяти файлов, в которые переписаны через
пробел слова соответствующей длины: в первом файле — слова длины 1, во
втором — слова длины 2 и т. д. Если слов длины k нет, то соответствующая
строка k-ro должна быть пустой.
85. Пусть даны два текстовых файла. Определите, равны ли они. Равенство по-
нимается в смысле совпадения соответствующих символов и одинакового
деления на строки.
♦ 86. Пусть дан текстовый файл. Заменить последовательность Р1 подряд идущих
символов последовательностью Р2. Последовательности Р1 и Р2 задаются
пользователем.
87. Создайте файл информации по итогам сессии result.dat. Для каждой группы
каждого курса в файл заносится следующая информация (количество кур-
сов и групп на курсе фиксировано, сами номера курсов и групп в записи не
хранятся):
ss количество студентов в группе;
& количество допущенных к сессии;
& количество сдавших на «отлично»;
$ количество сдавших на «отлично» и «хорошо»;
& количество получивших «неудовлетворительно».
88. Используя прямой доступ к файлу result.dat (см. задание 87), распечатайте
по заданному номеру курса и номеру группы информацию о результатах
сессии.
89. Используя прямой доступ к файлу result.dat (см. задание 87), найдите и рас-
печатайте информацию о количестве отличников на заданном курсе.
90. Напишите программу создания файла прямого доступа result3 итогов сес-
сии факультетов ПММ (1), физического (2), математического (3). Структу-
ру записи см. в задании 87. Названия (номера) факультетов, курсов и групп
в запись не включайте. Считайте, что количество курсов и групп фиксировано.
91. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданному
номеру факультета, номеру курса и номеру группы распечатайте информа-
цию о результатах сдачи сессии группой.
92. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданному
номеру факультета найдите группу с наименьшим числом неуспевающих.
93. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданным
154 Глава 14. Файлы
номерам факультетов сравните успеваемость заданных курсов (по количест-
ву отличников и количеству неуспевающих).
♦94. Пусть в файле фамилий ffam находятся фамилии студентов (одна запись -
одна фамилия), в файле оценок fnote — в том же порядке оценки студентов
(одна запись — массив оценок одного студента), в файле fchg — изменения
к файлу оценок (структура записи: номер студента, совпадающий с номером
фамилии в файле ffam, номер измененной оценки, новая оценка). Записи упо-
рядочены по номеру студента. Распечатайте список фамилий студентов, по-
лучающих стипендию, то есть сдавших сессию на «хорошо» и «отлично». Фай-
лы ffam, fnote, fchg читаются один раз.
♦95. Пусть заданы файлы ffam, fnote, fchg (см. задание 94). Используя прямой до-
ступ, по заданной фамилии распечатайте оценки студента, учитывая возмож-
ные пересдачи.
96. Создайте копию файла a.dat, скопировав его содержимое в файл b.dat.
97. Создайте нетипизированный файл info.dat, содержащий текстовую инфор-
мацию о сотрудниках:
& ФИО;
& дата рождения: число, месяц, год;
& адрес: улица, дом, квартира.
98. Используя нетипизированный файл info.dat (см. задание 97), распечатайте
список сотрудников, у которых в заданном месйце день рождения.
99. Используя нетипизированный файл info.dat (см. задание 97), напечатайте
список сотрудников, проживающих на заданной улице.
* 100. Используя нетипизированный файл info.dat (см. задание 97), напечатайте
список улиц, на которых проживают сотрудники (в списке названия не долж-
ны повторяться).
♦ 101. Используя нетипизированный файл info.dat (см. задание 97), напечатайте фа-
милии самого старшего и самого младшего сотрудников.
Задания для самостоятельной работы
Описание файлов
Файл Студент
Структура записи:
& ФИО (40 знаков1);
® номер курса (1 знак);
& номер группы (1 знак);
& успеваемость — 5 экзаменов в каждой из 10 сессий;
& форма обучения (целевая, договорная) (1 знак);
1 Число знаков здесь и далее рекомендуется, но не является обязательным.
Задания для самостоятельной работы 155
ss экзамен:
— наименование предмета (10 знаков);
— оценка (1 знак).
Записи упорядочены по номеру курса, внутри курса — по номеру группы, в груп-
пе — по ФИО.
Файл Телефонный справочник
Структура записи:
« ФИО (40 знаков);
ю адрес:
— улица (20 знаков);
— номер дома (4 знака);
— квартира (3 знака);
вв номер телефона (6 знаков).
Записи упорядочены по ФИО.
Файл Каталог файлов
Структура записи:
вв имя файла (8 знаков);
спецификация (3 знака);
as дата создания:
— день (2 знака);
— месяц (2 знака);
— год (2 знака);
зв количество блоков (4 знака).
Записи упорядочены по именам файлов.
Файл Каталог книг
Структура записи:
® автор (40 знаков);
& название (80 знаков);
& год издания (4 знака);
зв специальность (40 знаков).
Записи упорядочены по фамилиям авторов.
Варианты заданий
1. Создайте файл Студент. Напечатайте количество студентов, обучающихся на
каждом курсе в Каждой группе. Информацию представьте в виде таблицы.
2. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент,
добавив оценки заданной групры за последнюю сессию. Считать, что зимняя
сессия сдана, а добавляются оценки за летнюю сессию.
156 Глава 14. Файлы
3. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент,
добавив сведения о новых студентах.
4. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент,
исключив сведения об отчисленных студентах. Студент считается отчислен-
ным, если он имеет хотя бы одну неудовлетворительную оценку.
5. Создайте файл Студент. Из файла Студент занесите в отдельный файл записи
об отличниках.
6. Создайте файл Студент. Из файла Студент занесите в отдельный файл записи
о неуспевающих студентах.
7. Создайте файл Студент. Подсчитайте средний балл по заданному предмету на
заданном курсе.
8. Создайте файл Студент. Подсчитайте средний балл каждой группы по задан-
ному номеру курса и средний балл курса.
9. Создайте файл Студент. На каждом курсе найдите группу (группы), в кото-
рой больше всего отличников.
10. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент
о студентах, имеющих не более одной четверки за последнюю сессию.
И. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент
о студентах 5-го курса, упорядочив их по убыванию сумм баллов за все вре-
мя обучения (ФИО, балл).
12. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент,
выполнив перевод студентов на следующий курс. Данные о студентах 5-го
удалить.
13. Создайте файл Студент. Занесите в отдельные файлы записи о студентах раз-
личных форм обучения.
14. Создайте файл Студент. Подсчитайте количество студентов, имеющих хоро-
шие и отличные оценки за весь период обучения, по каждому курсу, по каж-
дой форме обучения.
15. Создайте файл Каталог книг. Занесите в отдельный файл все произведения
заданного пользователем автора.
16. Создайте файл Каталог книг. По заданному значению года издания занесите
в отдельный файл сведения о произведениях, изданных в указанном году.
17. Создайте файл Каталог книг. По заданной специальности занесите в отдель-
ный файл сведения обо всех изданиях (ФИО, название, год издания).
18. Создайте файл Каталог книг. Найдите специальность, по которой имеется наи-
большее число книг. Считать, что различных специальностейне более 100.
19. Создайте файл Каталог файлов. Выберите и занесите в отдельный файл сведе-
ния о файлах, размер которых превышает заданное число блоков.
20. Создайте файл Каталог файлов. Перепишите его в отдельный файл, упорядо-
чив записи по количеству блоков.
Задания для самостоятельной работы 157
21. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах
с заданной спецификацией.
22. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах
с заданным именем.
23. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах,
созданных ранее указанной даты.
24. Создайте файл Каталог файлов. Найдите такие файлы, которые есть в трех
модификациях — со спецификациями .PAS, .OBJ, .EXE.
25. Создайте файл Телефонный справочник. Выберите и занесите в отдельный файл
по заданному адресу (улица, номер дома) сведения об абонентах, имеющих
телефоны.
26. Создайте файл Телефонный справочник. Выберите и занесите в отдельный файл
сведения об абонентах, имеющих телефоны, номера которых начинаются
с заданных двух цифр.
27. Создайте файл Телефонный справочник. Найдите по ФИО номера телефонов
и адреса абонентов.
28. Создайте файл Телефонный справочник. Найдите номер АТС (первые две циф-
ры номера телефона), имеющей наибольшее число абонентов.
29. Создайте файл Телефонный справочник. По номеру телефона найдите ФИО
и адрес владельца.
30. Напечатайте в произвольном порядке все разные слова, встречающиеся в дан-
ном текстовом файле. Словами считать последовательности (длиной не бо-
лее 20) прописных и строчных латинских букв. Для накопления слов исполь-
зовать таблицу.
31. Напечатайте все разные числа из файла целых чисел в порядке их первого
появления.
32. Пусть даны три упорядоченных по возрастанию файла целых чисел. Напе-
чатайте наименьшее из чисел, встречающихся во всех трех файлах. Файлы
должны быть прочитаны не более одного раза.
Глава 15
Динамические структуры
данных
Теоретические вопросы
1. У кажите принципиальное отличие статических переменных от динамических.
2. Приведите примеры нерационального использования оперативной памяти
при применении статических переменных.
3. На каком этапе (компиляции, выполнения) происходит выделение памяти
под динамические структуры данных?
4. На каком этапе (компиляции, выполнения) происходит выделение памяти
под статические структуры данных?
5. Укажите причины использования динамических переменных.
6. Что называется указателем?
7. Какой объем памяти необходим для хранения указателя.
8. В каких случаях память под указатель выделяется статически, а в каких ди-
намически?
9. Когда происходит выделение памяти для указателей, а когда для данных,
на которые они указывают?
10. Что описывается в первую очередь — тип указателя или тип данных, на ко-
торый он указывает?
11. Определено ли значение по умолчанию для переменных ссылочного типа?
12. Поясните роль базового типа при работе с указателями.
13. Для чего необходимо значение nl 1 при работе с указателями?
14. Что такое базовый тип?
15. Можно ли в качестве базового типа использовать тип, определяемый поль-
зователем?
16. Что является значением переменной ссылочного типа?
Задачи, решения 159
17. Какое универсальное значение может быть присвоено любой переменной ссы-
лочного типа?
18. Назвать операции, которые допускаются над значениями ссылочного типа.
19. Какие стандартные процедуры реализуют основные действия над динами-
ческими переменными?
20. Каково назначение стандартных процедур new, dispose? Сколько параметров
они имеют? Каков тип этих параметров?
21. К чему приводит «потеря» указателя на данные, хранимые в динамической
памяти?
22. Ограничена ли динамическая память?
Задачи, решения
Списки
Односвязный (однонаправленный) список
1. Реализуйте следующие операции для списков без заглавного (рис. 15.1) эле-
мента и с заглавным (рис. 15.2) звеном (элементом):
& инициализация списка;
» добавление элемента в начало списка;
& добавление элемента в конец списка;
% удаление первого вхождения заданного элемента в список;
переворот списка, то есть такая переустановка ссылок в списке, при кото-
рой элементы списка следуют друг за другом в обратном порядке;
«8 печать элементов списка;
аз удаление всех элементов списка.
Рис. 15.1. Список без заглавного звена
4 Заглавное звено
Рис. 15.2. Список с заглавным звеном
♦2. Реализуйте процедуру удаления всех вхождений элемента Е в список L.
3. Подсчитайте число вхождений элемента Е в список L.
160 Глава 15. Динамические структуры данных
4. Упорядочьте элементы списка по убыванию, используя сортировку посред-
ством выбора максимального элемента. Используйте список без заглавного
элемента.
5. В решении предыдущей задачи (см. приложение 1) при сортировке списка
обмен двух элементов списка реализован как обмен информационных час-
тей. В реальных задачах обмен информационных частей неэффективен из-за
их большого размера. Поэтому выгоднее переустанавливать указатели в спис-
ке, не затрагивая информационных частей. На основе этого замечания реали-
зуйте процедуру, упорядочивающую элементы списка по убыванию.
6. Слейте два упорядоченных по невозрастанию списка в один (также упоря-
доченный по невозрастанию):
а) построив новый список;
Ь) поменяв соответствующим образом указатели в исходных списках.
7. Упорядочьте по возрастанию только:
а) положительные элементы списка;
Ь) элементы с четными порядковыми номерами в списке;
♦ с) элементы с порядковыми номерами, являющимися простыми числами.
♦ 8. В результате проведенного анкетирования Иванова Ивана Ивановича были
определены ответы на поставленные вопросы (табл. 15.1). Представьте по-
лученную информацию в виде списка характеристик, каждой из которых со-
ответствует список значений характеристики. Определите процедуры добав-
ления и удаления для характеристик и их значений.
Таблица 15.1. Анкетные данные Иванова Ивана Ивановича
Вопрос (характеристика) Ответ (список значений характеристики)
Год рождения 1961
Семейное положение холост
Увлечения программирование, футбол
Любимые времена года весна, лето
♦ 9. Пусть дан упорядоченный список названий книг. Необходимо добавить ин-
формацию о новой книге, сохранив упорядоченность списка.
♦ 10. Пусть дан список, хранящий слова некоторого предложения. Удалите из
списка те вхождения слова «программирования», которым предшествует
слово «языки».
♦ И. Пусть дан список. После каждого элемента добавьте предшествующую ему
часть списка.
* 12. Пусть элементы списка хранят следующие друг за другом символы некоторого
предложения. Замените в списке каждое рхождение слова «тысячелистник»
на словосочетание «лекарственное растение».
13. Проверьте, совпадают ли два списка А и В,
Задачи, решения 161
♦ 14. Проверьте, содержатся ли элементы списка А в списке В в указанном спис-
ком А порядке.
♦ 15. Упорядочьте элементы списка, используя сортировку простыми вставками.
16. Вычислите сумму тех элементов списка, значения которых меньше значе-
ний всех элементов, непосредственно следующих за ними.
17. Пусть дан список Л, содержащий целые числа. Занесите в список В поряд-
ковые номера максимальных элементов списка Л.
18. Определите, что является результатом работы следующей процедуры:
procedure ZZZ( hl: TList ):
var
h2. h3 : TLIst:
f: boolean:
begin
while hl <> nil do
begin
h2 := hl*.next:
h3 := hl:
f := true:
while (h2 <> nil) and f do
if hl*.info = h2*.info
then f := false
else
begin
h3 := h2:
h2 := h2*.next
end:
if not f
then
begin
h2 := hl*.next:
new( hl*.next ):
hl*.next*.info := h3*.info:
hl*.next*.next : = h2;
hl := hl*.next
end:
hl := hl*.next
end
end: { ZZZ }
19. Пусть дан список студентов. Элемент списка содержит: фамилию, имя, отче-
ство, № курса, № группы, оценки по пяти экзаменам последней сессии. Вы-
полните перечисленные ниже операции:
а) предполагая, что фамилии студентов в списке упорядочены по алфавиту,
удалите подсписок студентов, начиная с фамилии Петров и заканчивая
фамилией Сидоров включительно;
Ь) предполагая, что информация о студентах в списке упорядочена по но-
меру курса, перенесите студентов 2-го курса в конец списка;
♦ с) удалите информацию о студентах 5-го курса и переведите остальных сту-
дентов на следующий курс;
б Зак. 906
162 Глава 15. Динамические структуры данных
d) выведите информацию о начисленной стипендии, предполагая, что от-
личникам выплачивается сумма S1, студентам, имеющим только «четвер-
ки» и «пятерки», выплачивается сумма 52, троечникам стипендия не вы-
плачивается.
♦ 20. Вычислите среднее арифметическое элементов непустого списка.
♦ 21. Опишите процедуру, которая формирует список L, включив в него по одно-
му разу элементы, которые входят хотя бы в один из списков L1 и 12.
♦ 22. Опишите подпрограмму, которая в списке L из каждой группы идущих под-
ряд равных элементов оставляет только один.
23. Многочлен Р(х) = апхп +апЧп~1 +... + а,х + а0 с вещественными коэффициен-
тами можно представить в виде списка (рис. 15.3), причем если я, я 0, то соот-
ветствующее звено в список не включается. Опишите:
а) функцию Vai ue( Р, х), вычисляющую значение многочлена — списка Р в точ-
ке х;
♦ Ь) подпрограмму, рассчитывающую производную многочлена — списка Р
по переменной х;
♦ с) подпрограмму, интегрирующую многочлен — список Р по переменной х.
Рис. 15.3. Представление многочлена в виде списка
24. Опишите подпрограмму, которая проверяет, есть ли в списке Хотя бы два
одинаковых элемента.
25. Пусть в файле хранятся записи со сведениями об автомобилях и их владель-
цах (марка, номер ГАИ, фамилия владельца). Необходимо:
а) для каждой марки автомобиля составить список, содержащий фамилии
владельцев автомобилей данной марки;
Ь) для каждой фамилии владельца составить список, содержащий инфор-
мацию об автомобилях, принадлежащих данному владельцу..
Двусвязный (двунаправленный) список
1. Пусть дан текстовый файл. Создайте двусвязный список, каждый элемент
которого содержит количество символов в соответствующей строке текста.
♦ 2. Пусть с клавиатуры вводится последовательность хи х2,..., хп вещественных
чисел, где п — заранее не известная величина. Ввод завершается символом
перевода строки. Вычислите сумму произведений: 5 - хрсп + х2хп_1 +... + х^.
Кольцевой список
♦ 1. «Считалка». N ребят располагаются по кругу. Начав отсчет от первого, уда-
ляют каждого Х-го, смыкая круг после каждого удаления. Определите поря-
док удаления ребят из круга.
Задачи, решения 163
♦ 2. Пусть имеется кольцевой двусвязный список, содержащий целые числа из
диапазона [0...1000]. Произвольный элемент выбирается в качестве рабочего.
Для работы со списком определены только 4 перечисленные ниже операции:
а) ШагВлево — смена рабочего элемента. Рабочим становится левый сосед те-
кущего рабочего элемента;
Ь) Ша гВправо — рабочим становится правый сосед текущего рабочего элемента;
с) Прочитать — поместить в заданную переменную значение рабочего элемента
списка;
d) Записать — записать в рабочий элемент списка значение заданной пере-
менной (значение переменной принадлежит диапазону 0... 1000).
Необходимо определить число элементов кольцевого списка.
Двоичное дерево
1. Реализуйте процедуру ввода двоичного дерева.
2. Реализуйте процедуру копирования двоичного дерева.
3. Подсчитайте число листьев (терминальных элементов) в заданном двоич-
ном дереве.
4. Определите высоту заданного двоичного дерева.
5. В заданном двоичном дереве подсчитайте число элементов, равных макси-
мальному.
6. Замените в заданном двоичном дереве все отрицательные элементы их абсо-
лютными величинами.
♦ 7. Поменяйте местами максимальный и минимальный элементы заданного
двоичного дерева, все элементы которого различны.
* 8. Пусть для дерева А была сделана копия — дерево В, и из дерева В были уда-
лены некоторые из ветвей. Необходимо сформировать список указателей
на удаленные ветви дерева Л.
9. Проверьте, является ли заданное двоичное дерево сбалансированным.
♦ 10. Опишите процедуру, которая для заданного значения Устроит дерево сле-
дующего вида: корнем является узел, информационная часть которого рав-
на У; второй уровень содержит узлы со значениями У-1 и У-2; третий уро-
вень — У-3, У-4, У-5, У-6; й т. д. Последний уровень может быть неполным
и содержать узел с конечным значением — 1.
11. Формулу, описание которой дано ниже, можно представить в виде двоично-
го дерева по следующим правилам: формула из одного терминала (цифры
или переменной) представляется деревом из одной вершины с этим терми-
налом, а формула вида (f{ s f2) — деревом, в котором корень — это знак 5, а
левое и правое поддеревья — это соответствующие представления формул
Л и/2-
<формула>::=<терминал>|(<формула><знак><формула>)
<знак>::= + | - | ★ | /
164 Глава 15. Динамические структуры данных
<терминал>::=<переменная>|<цифра>
<переменная>::=a|b|c|d|e|f|g|h|1|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
<цифра>::=0|1|2|3|4|5|6|7|8|9
Опишите подпрограмму, которая решает перечисленные ниже задачи:
а) вычисляет значение дерева-формулы (считайте, что значения перемен-
ных заданы массивом Value: array ['a’./z'] of real);
* b) по формуле, содержащейся в текстовом файле, строит соответствующее
дерево-формулу;
♦ с) печатает дерево-формулу в виде формулы;
d) проверяет, является ли заданное двоичное дерево деревом-формулой;
* е) упрощает дерево-формулу, заменяя в нем все поддеревья, соответствую-
щие формулам (/+ 0), (0 +/),(/- 0), (/*1) и (1*/), поддеревьями, соот-
ветствующими формуле/; поддеревья, соответствующие формулам (/*0)
и (0*Д — с вершиной 0; поддеревья (а + ft), (а - 6), (а*й), (а/й), где а и b —
константы, вершиной с, равной а + Ь, а - Ь, а*Ь, а/b соответственно;
♦ f) преобразует дерево-формулу, заменяя в нем все поддеревья, соответствую-
щие формулам ((/У ± f2)*f3) и (J1*(f2 ±/3)), поддеревьями, соответствую-
щими формулам (<J1*f3) ± (J2*f3)) и <SJ1*f2) ± (f1*f3))}
* g) находит производную дерева-формулы по заданной переменной.
Дерево двоичного поиска
1. Пусть задано дерево двоичного поиска. Реализуйте подпрограмму:
а) добавления элемента в дерево двоичного поиска;
♦ Ь) удаления элемента из дерева двоичного поиска;
с) поиска элемента в дереве двоичного поиска;
* d) преобразования данного дерева в сбалансированное дерево двоичного
поиска;
е) подсчета числа элементов, больших заданного.
2. Пусть дан файл, содержащий целые числа. Сформируйте из них дерево поиска
и выведите элементы дерева в порядке убывания значений.
3. Проверьте, является ли данное двоичное дерево деревом поиска.
* 4. Пусть дан текстовый файл, содержащий слова, разделенные одним или не-
сколькими пробелами. Слова содержат не более 20 символов. Определите
частоту использования каждого слова в тексте. Результат оформить в виде
таблицы, содержащей слова в лексикографическом порядке. Для хранения
слов и ускорения поиска использовать дерео двоичного поиска.
* 5. В заданном дереве найти поддерево двоичного поиска с максимальным коли-
чеством элементов.
Очередь
1. Реализуйте операции работы с очередью, построенной на основе:
а) массива;
Задачи, решения 165
b) динамических структур.
♦ 2. Пусть дан текстовый файл А. Перепишите его содержимое в файл В, удалив
при этом слова, длина которых меньше заданной.
♦ 3. Пусть дан текстовый файл А. Перепишите его содержимое в файл В, пере-
нося при этом в конец каждой строки все входящие в нее знаки препинания.
♦ 4. Пусть задан массив Name[l. .N] (элементы имеют тип аггау[1. .15] of char),
содержащий имена людей, и массив Chi 1 dren[l. .N, 1. .N] (элементы имеют
тип bool еап), в котором Chi 1 dren[x, у]=true, если человек под номером у явля-
ется ребенком человека под номером х. Для человека с заданным номером к
напечатайте сначала имена всех его детей, затем — всех его внуков, затем —
всех правнуков и т. д.
* 5. Напечатайте элементы двоичного дерева в следующем порядке: сначала —
элементы первого уровня, затем — элементы второго уровня, затем — эле-
менты третьего уровня и т. д.
♦ 6. Пусть имеется три конвейера. Конвейеры работают независимо друг от друга.
Изначально на первом конвейере располагаются детали N типов, а второй и
третий — пусты. Время обработки детали каждого типа с каждого конвейера
задается матрицей T1me[l..N,1..3]. После обработки детали с конвейера к она
поступает на конвейер к+1. Назовем обработанную деталь с третьего конвейера
изготовленной. Требуется по начальному расположению деталей на первом
конвейере определить время, через которое все детали будут изготовлены.
♦ 7. Пусть даны две очереди X и У, содержащие вещественные числа. Из каждой
очереди одновременно извлекается по одному числу х и у соответственно.
Если х < у, то число (х + у) помещается в конец очереди X, иначе число (х - у)
помещается в конец очереди У. Необходимо определить число шагов, через
которое одна из очередей станет пустой.
Стек
1. Реализуйте операции работы со стеком, построенным на основе:
а) массива;
Ь) динамических структур.
2. Распечатайте в обратном порядке символы введенной пользователем стро-
ки, длина которой может превышать 255 символов.
♦3. Пусть в текстовом файле записана без ошибок показанная ниже формула
(М обозначает функцию max, a m — mi п). Вычислите значение данной формулы
(например, М(5.т( 6,8)) =>6).
<формула>::=<цифра> | М(<формула>.<формула>) |
т(<формула>,<формула>)
<цифра>::»0|1|2|3|4|5|6|7|8|9
♦4. Проверьте, является ли содержимое заданного текстового файла правиль-
ной записью формулы следующего вида:
<формула>::=<терм> | <терм> + <формула> | <терм> - <формула>
166 Глава 15. Динамические структуры данных
<терм>::=<переменная>|<цифра>|(<формула>)
<переменная>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
<цифра>::=0|1|2|3|4|5|6|7|8|9
5. Пусть в текстовом файле записано без ошибок логическое выражение следую-
щего вида: <ЛВ>: :=*true | false | (not <ЛВ>) | (<ЛВ> and <ЛВ>) | (<ЛВ> or <ЛВ>),
где not, and и or обозначают соответственно отрицание, конъюнкцию и дизъ-
юнкцию. Вычислите значение этого выражения.
*6. Преобразуйте арифметическое выражение в постфиксную форму. В выра-
жение входят:
а) переменные;
Ь) целые числа;
с) знаки плюс (+), минус (-), умножить (*) и разделить (/);
d) круглые скобки.
♦7. Вычислите значение арифметического выражения, хранящегося в постфикс-
ной записи. В выражение входят:
а) целые числа;
Ь) знаки плюс (+), минус (-), умножить (*), разделить (/) и унарный ми-
нус (-).
♦ 8. Преобразуйте выражение из постфиксной формы в инфиксную.
* 9. Карту, определяющую прямоугольную область моря, представили матрицей
с логическими элементами (false — море, true — суша). Островом будем на-
зывать совокупность соприкасающихся (вертикальной или горизонтальной
стороной) клеток матрицы со значениями true. Рассчитайте число островов
на матрице-карте.
♦ 10. Пусть даны два стека. Используя операции Извлечь, Занести и функцию Пуст-
ЛиСтек (проверка факта очистки стека), подсчитайте общее число элементов
в стеках. В качестве вспомогательных структур разрешается использование
переменных целых типов. Алгоритм должен предусматривать восстановле-
ние исходного расположения элементов в стеках.
11. Пусть дана логическая матрица, описывающая лабиринт (true — стена, false —
проход) и начальное положение человека в лабиринте (х, у). Необходимо
предложить вариант обхода всех доступных клеток лабиринта:
♦а) любой;
*Ь) оптимальный.
* 12. Распечатайте возрастающие серии последовательности целых чисел в обрат-
ном порядке (серия — упорядоченная подпоследовательность максимальной
длины).
13. Проверьте правильность расстановки скобок трех типов (круглых, квадрат-
ных и фигурных) в выражении.
Задания для самостоятельной работы 167
Задания для самостоятельной работы
1. Реализуйте функцию поиска элемента Е в односвязном списке L.
2. Реализуйте процедуру Swap_Elems(Pl, Р2: TList), где Р1 и Р2 — указатели на
звенья в двусвязном списке. Процедура предназначена для обмена местами
двух звеньев путем переустановки ссылок в списке.
3. Подсчитайте число максимальных элементов списка.
4. Пусть в списке А хранится информация о людях (фамилия, имя, отчество,
профессия). Имеется список В, содержащий перечень профессий. Удалите
из списка А тех людей, чья профессия не указана в списке В.
5. Пусть дан список штучных товаров, хранящихся на складе (наименование,
цена). В списке могут присутствовать одинаковые товары. Задание:
а) составьте прайс-лист на товары (список, содержащий перечень различ-
ных товаров и цен на них);
Ь) вычислите среднюю цену на каждый товар;
с) выведите перечень наименований товаров, чья цена ближе всего к сред-
ней.
6. Пусть имеется У городов и задан список пар городов (i,j), между которыми
существует прямая дорога. Напечатайте список городов, которые напрямую
сообщаются более чем с тремя городами.
7. Пусть дан список слов. Из каждой группы подряд идущих одинаковых слов
оставить только одно.
8. Пусть дан текстовый файл. Распечатайте слова, имеющие максимальную
длину.
9. Пусть дан список вещественных чисел. Проверьте, упорядочены ли числа
по возрастанию или по убыванию.
10. Пусть дан список вещественных чисел. Для каждого элемента списка напе-
чатайте число отрицательных элементов, следующих за ним.
И. Пусть дан список вещественных чисел. Проверьте, образуют ли числа, хра-
нящиеся в списке, арифметическую или геометрическую прогрессию.
12. Опишите процедуру, вставляющую в список Z, элементы которого упорядо-
чены по неубыванию, новый элемент так, чтобы сохранялась упорядочен-
ность.
13. Опишите процедуру, формирующую список I, включив в него по одному разу
элементы, которые входят в список L1, но не входят в список L2.
14. Опишите функцию, подсчитывающую количество элементов списка Z, у ко-
торых равные «соседи».
15. Пусть с клавиатуры вводится последовательность xif х2,..., х„ вещественных
чисел, где п — заранее неизвестная величина. Ввод завершается символом
перевода строки. Вычислите произведение сумм:
S = (х( + х2 + 2х„)(х2 + х3 + 2х„_|).. ,(х„-1 + Х„_2 + 2х2) .
168 Глава 15. Динамические структуры данных
16. Пусть с клавиатуры вводится последовательность xif х2,..., хп вещественных
чисел, где п — заранее неизвестная величина. Ввод завершается символом
перевода строки. Вычислите произведение разностей:
s = (xi2 - х2 )(х2 - х„2_,) • • (х„2 - х2).
17. Подсчитайте число узлов в заданном двоичном дереве.
18. Подсчитайте число узлов на k-м уровне заданного двоичного дерева (корень
считать узлом 1-го уровня).
19. Пусть даны два текстовых файла А и В. Максимальная длина слова — 20 сим-
волов. Слова разделены одним или несколькими пробелами. Занесите в файл
С те слова файла А, которых нет в файле В. Для хранения слов файла В и
ускорения поиска среди них воспользуйтесь деревом двоичного поиска.
20. Реализуйте нерекурсивную процедуру печати всех элементов заданного двоич-
ного дерева.
21. Реализуйте рекурсивную процедуру печати всех элементов заданного двоич-
ного дерева.
22. Опишите логическую функцию, проверяющую на равенство два заданных
двоичных дерева.
23. Опишите логическую функцию, определяющую, есть ли в заданном двоич-
ном дереве хотя бы два одинаковых элемента.
24. Опишите процедуру, строящую для заданного значения N двоичное дерево,
в котором N полных уровней и на каждом уровне i располагаются узлы, ин-
формационные части которых равны г.
Приложение 1
Ответы и решения
Глава 1. Числовые типы данных
Упражнения
Задание 3
Ответы:
а) 2 * In ( х / 15 ) / 1п( 2 );
b) arctan ( х / sqrt ( 1 - sqr ( х ) ) );
с) 0.5 * sin ( 3.1415927 / 6 );
d) sqr ( sqr ( sqr ( х ) ) );
e) exp ( 250 * In ( x ) );
f) 1E3 + betta / ( x2 - gamma * delta ).
Задание 4
Ответы:
a) 4;
b) -1;
c) 4;
d) 1;
e) 3;
Задание 6
Ответы:
a) real;
b) real;
c) integer;
d) integer;
e) integer.
f) 0,1415;
g) 8;
h) 1,0;
i) 3;
j) 3,1415926536.
170 Приложение 1. Ответы и решения
Глава 2. Оператор присваивания,
ввод и вывод информации
Упражнения, задачи, линейные программы
Задание 3
Ответы:
а) 4;
Ь) 10.
Задание 4
Ответы:
а) 5;
Ь) 5.
Задание 6
Ответ:
т:= ( х mod 10 ) * 100 + ( х div 10 mod 10 ) * 10 + х div 100
Задание 9
Ответ:
{ должна быть объявлена вещественная переменная t }
t х;
х := у:
У := t:
Задание 11
Решение:
program Geron:
var
a .b. с: real: { длины сторон треугольника }
р : real: { полупериметр треугольника }
s : real: { площадь треугольника }
begin
write ('Введите длины сторон треугольника: '):
readln ( а, b, с ):
р := ( а + b + с ) / 2:
s := sqrt( p*(p-a)*(p-b)*(p-c) ):
writelnC ’ Площадь треугольника равна s )
end. { Geron }
Задание 19
Решение:
program Rocket:
var
hour. min. sec. time integer:
begin
writeln ( 'Введите время запуска ракеты' ):
Глава 3. Логический тип 171
write ( ’ час в ' ); readin ( hour );
write ( * мин » ' ); readln ( min ):
write ( ’ сек = ' ): readln ( sec ):
write ( ’ Введите время полета = ' ):
readln ( time );
{ вычисление времени возвращения ракеты на Землю }
sec sec + time;
min :» min + sec div 60;
sec ;» sec mod 60;
hour ;= hour + min div 60:
min :« min mod 60;
hour ;- hour mod 24;
writein ( 'Результаты' );
write ( 'Время взлета = ’ );
writein ( hour: 2, ' час, ', min: 2, ' мин,
sec: 2. ’ сек.');
writein ( 'Время полета = ' . time: 3 , 'сек' );
write ( 'Ожидаемое время прибытия = ' );
writein ( hour: 2. ' час. ', min: 2. ' мин,
sec: 2, ' сек.')
end. { Rocket }
Глава 3. Логический тип
Упражнения
Задание 1
Ответы:
d)
а not а a and not a
true false false
false true false
a not a not not a
true false true
false true false
Задание 2
Ответы:
a) true;
b) false;
с) false;
172 Приложение 1. Ответы и решения
d) true;
е) false.
Задание 3
Ответ:
с) true.
Задание 4
Ответы:
а) ( х <= у ) and ( х <= z );
d) ( х > 2 ) and ( х <= 10 ) or abs ( x ) < 2;
i) ( к mod 400 = 0 ) or ( к mod 4 = 0 ) and ( к mod 100 <>0 ).
Линейные программы
Задание 2
Решение:
program Roots;
var
a, b. c. d: real;
begin
write ( ’Введите коэффициенты a.b.c ’);
write ( 'квадратного уравнения: ' );
readln ( a. b. c );
d := sqr ( b ) - 4 * a * c;
writein ( d >= 0 )
end. { Roots }
Задание 4
Решение:
program Triangle:
var
a. b. c: real;
t: boolean;
begin
writein ( 'Введите три числа' );
readln (a, b. c );
t := ( a + b > c ) and
( a + c > b ) and
( b + c > a ):
wri tel n ( t )
end. { Triangle }
Задание 9
Ответы:
a)t := (x=y) and (y=z);
b)t := ((x=y) or (z=x) or (y=z)) and not ((x=y) and (y=z));
c)t := odd(n) = odd(m);
Глава 4. Условный оператор 173
f)t := (к mod 10=7) or (к div 10 mod 10=7) or (к div 100=7);
h)t := sqr(xlM sqr(x2) <= r*r;
i)t : = (r<=xl*xl+x2*x2) and (I>=xl*xl+x2*x2);
j)t := odd(gl+vl) = odd(g2+v2).
Глава 4. Условный оператор
Упражнения
Задание 2
Решение:
program FlndMax:
var
a. b, с, max: real:
begin
if a > b
then Max : = a
else Max := b:
if c > max then max:=c;
writeln ( ’Max = ’. max )
end. { FlndMax }
Задание 3
Ответ (фрагмент программы):
if abs( a ) <= 3.14159/2
then x := exp ( sin ( a ) - 1 ):
Задание 4
Решение:
program YFunction;
var
x. y: real;
begin
write ( ’Введите x: ' );
readln ( x );
у := sqr ( x )+4 * x - 7:
if x >- 2 then у := 1 /у:
write ( 'x = ', x , ' у = '. у ).
end. { YFunction }
Задание 9
Решение:
program Regulating:
var
x, y. z: real:
begin
write ( 'Введите два числа: ’ );
readln ( x. у ):
if x > у then
174 Приложение 1. Ответы и решения
begin
z := х;
х :» у;
У := z
end;
writein ( ’После упорядочения: х, у )
end. { Regulating }
Задание 11
Ответ:
х :e a or b and с
Задание 12
Решение:
program Roots;
var
a, b, с, d: real;
begin
write ( ’Введите коэффициенты a. b. с ’ );
write ( 'квадратного уравнения: ' ):
readln (a. b. c,);
d := sqr ( b ) - 4 * a * c:
if d < 0
then writein ( 'Корней нет.' )
el se
begin
d := sqrt ( d );
writein ( 'xle', (-b + d ) / (2*a),
'x2='. (-b - d ) / (2*a))
end
end. { Roots }
Задание 13
Решение:
program Overflow:
var
a, b: integer;
sign_a, sign_b: integer:
t: boolean;
begin
read ( a, b ):
if a = 0
then sign_a := 0
else sign_a := a div abs ( a );
if b « 0
then sign_b :- 0
else sign_b : = b div abs ( b ):
t := sign_a * sign_b > 0:
if t
then
begin
a :- abs ( a );
b :- abs ( b );
t := Maxint - a < b
end:
Глава 5. Операторы цикла 175
write ( 'Переполнение при суммировании: ' ):
if t
then write ( 'да' )
else write ( 'нет' );
writein
end. { Overflow }
Глава 5. Операторы цикла
Упражнения, задачи, программы
Задание 1
Ответы:
а)В-Л + 1;
Ь) 0.
Задание 3
Ответы:
а) 120;
Ь)
у 1;
for 1 2 to 5 do у у * 1:
write ( у ):
с)
У :» 1:
i :в 2:
repeat
У := у * i:
i i + 1
until i > 5;
write ( у ):
Задание 4
Решение:
program Degree:
var
i, n: integer:
x. y: real:
begin
write ( *n - ’ ): readln ( n ):
write ( 'x » ' ): readln ( x ):
i :» 1:
у 1:
while i <- n do
begin
У у * x;
i :- i + 1
end:
write ( 'y » '. у )
end. { Degree }
176 Приложение 1. Ответы и решения
Задание 8
Решение:
program MaxFactorial:.
var
i. f; integer:
begin
1 := 1;
f := 1:
repeat
1 := i + 1;
f := f * i
until f > Maxint div 2;
writelnC ’FC, 1-1:2, ')=', f )
end. { MaxFactorial }
Задание 9
Решение:
a)
program NumbersCount:
var
n. k: integer;
begin
write ( 'Введите число: ' );
readln ( n ):
к := 0:
repeat
к := к + 1:
n := n div 10
until n = 0:
writeln ( 'В числе ', к . 'цифр' )
end. { NumbersCount }
b)
program NumbersSum;
var
n, s: integer;
begin
write ( 'Введите число: ' );
readln ( n );
s := 0;
repeat
s := s + n mod 10;
n := n div 10
until n = 0:
writeln ( ' Сумма цифр равна '. s )
end. { NumbersSum }
d)
program ReverseOrder;
var
n, m: integer;
begin
write ( 'Введите число: ' );
readln ( n );
m := 0;
repeat
m := m * 10 + n mod 10:
Глава 5. Операторы цикла 177
п :» n div 10
until n = 0;
write ( 'Цифры числа в обратном порядке: т)
end. { ReverseOrder }
Задание 10
Решение:
program Automorphism;
var
т. п. х. d: integer;
begin
write( 'Введите левую и правую ' );
write( 'границу отрезка: ? );
readln ( n . m );
d :» 10;
for x := m to n do
begin
while d <= x do d := d * 10;
if x * x mod d = x then
write ( 'Число '.x. ' автоморфно' )
end
end. { Automorphism }
Задание 12
Решение:
program NOD;
var
x. y, a. b, result: integer;
begin
write ( 'Введите два числа: ’ );
readln ( x. у );
a :- x:
b :- y;
while ( a > 0 ) and ( b > 0 ) do
if a >= b
then a := a mod b
else b := b mod a:
result :- a + b;
writein ( 'xe'. x. ' y='. у. ' НОД='. result )
end. { NOD }
Задание 14
Решение:
program Perfect;
var
i. n. s: integer;
begin
write( 'Введите проверяемое число: ' ):
readln ( n );
s :- 1;
for i :» 2 to n div 2 do
if n mod i = 0 then s :» s + 1;
if s = n
then writeln( 'Число является совершенным' )
else writeln( 'Число не является совершенным' )
end. { Perfect }
178 Приложение 1. Ответы и решения
Задание 16
Решение:
program FirstNegative;'
var
n: integer:
begin
n :» 1:
while cos(cos(n)/sin(n)) >» 0 do
n :« n + 1;
write ( 'Номер отрицательного члена равен n
end. { FirstNegative }
Задание 17
Решение:
program FibSequence;
var
i. n. fnO, fnl. fn2: integer:
begin
fnl 1:
fnO 0:
writein ( fnl ):
for i :e 1 to n - 1 do
begin
fn2 := fnl:
fnl fnO:
fnO fnl + fn2:
writein ( fnO )
end
end. { FibSequence }
Задание 28
Решение:
program FindI:
var
x. y. xm, eps: real:
begin
read ( eps ):
x :» 10:
у :e 10:
i :• 0:
while (abs(x) >- eps) or (abs(y) >« eps) do
begin
xm :- 0.1 * y:
у :» 0.1 *x - 0.12 * y:
x xm:
i :- i+1
end:
write (i)
end. { Findl }
Задание 29
Решение:
program Count:
const
Гпава 5. Операторы цикла 179
п - 100;
var
i, kp. ко. kn: integer;
х: real;
begin
kp :- 0;
kn 0;
for i:- 1 to n do
begin
read ( x );
if x > 0 then kp :- kp + 1;
if x < 0 then kn kn + 1
end;
readln;
ко ;» n - kp - kn;
writelnC 'Число положительных чисел: ’. kp );
writelnC 'Число отрицательных чисел: '. kn );
writelnC 'Число нулей: ', ко )
end. { Count }
Задание 31
Решение:
program MaxMinDifference;
var
x, max. min: real;
i: integer;
begin
read ( x );
min :- x;
max :- x;
for i :- 2 to 100 do
begin
read ( x );
1f x > max then max:- x else
if x < min then min:- x
end;
readln;
write ( 'Разность между максимальным и '.
'минимальным числами: '. max - min )
end. { MaxMinDifference }
Задание 36
Решение:
а)
program YFunction;
var
a. x. у: real;
i: integer;
begin
writeC 'Введите x и a: ' );
readln ( x. a );
У :- x;
for i :- 1 to 8 do
у :- sqr ( у + a );
writeln ( 'Значение функции равно ’. у )
end. { YFunction }
180 Приложение 1. Ответы и решения
Задание 37
Ответ:
а) (фрагмент программы)
У := 1:
for i;= 2 to 11 do
У := у * х + i;
Задание 39
Решение:
Ь)
program YFunction;
var
у: real;
х: integer;
begin
у ;= 1/111;
x ;= 109;
while x > 0 do
begin
у ;» 1 / ( у + x );
x := x - 2
end;
writein ( ‘у = ’. у )
end. { YFunction }
Задание 41
Ответы:
a)
У 0;
n ;= 1;
for i ;= 1 to 30 do
begin
n ;= x * n;
у ;« у + COS ( n )
end;
b)
for i :я 2 to n do
begin
f ;= f * i;
У := у + f
end;
Задание 44
Решение (фрагмент программы):
L ;= 0.0; { левый конец отрезка }
R ;= 1.57; { правый конец отрезка }
repeat
х ;= ( 1_ + R ) / 2; { середина отрезка }
if sin(x)/cos(x) < x
then L ;= x
else R ;= x
until R - L < IE-4
Глава 5. Операторы цикла 181
Задание 45
Решение:
program Rectangle:
var
a. b, { длины сторон прямоугольника }
п. { наименьшее число квадратов }
к. { число одинаковых квадратов }
х: integer;
begin
n :e 0;
write ( 'Введите длины сторон прямоугольника: ' ):
readln ( а, b );
writein ( 'Дан прямоугольник: ', а:2, Ь:2 );
writein ( 'Квадраты: ' ):
repeat
if а < b then
begin
х :» а;
а :в Ь:
b := х
end;
k := a div b;
а ;= a mod Ь;
writein ( b, . Ь. ' ', к );
п := п + к
until ( а » 0 ):
writein ( 'Всего квадратов; ', п )
end. { Rectangle }
Задание 47
Решение:
program PythagoreanNumbers;
var
a. b. с. ex; integer:
begin
for a :» 1 to 20 do
for b := a to 20 do
begin
ex :» a * a + b * b;
c :» sqr( round( sqrt( ex ) ) );
if c e ex then writeln( a. b, c )
end
end. { PythagoreanNumbers }
Задание 48
Решение:
program Line;
var
N. i: integer;
begin
repeat
write ( 'Введите натуральное число N: ' );
readln ( N )
until N > 0;
write ( 'S = ' );
i ;= 2 - ord( odd( N ) ):
182 Приложение 1. Ответы и решения
repeat
if i < 3
then writeC i )
else writeC . i );
i ;= i + 2
until i > N
end. { Line }
Задание 49
Решение:
с)
program DoubleMin;
var
i : integer; { счетчик вводимых чисел }
x : integer;
mini, min2 ; integer;
begin
i ;e 0;
write ( 'Введите x= ' );
read ( x );
{mini ? min2}
while x <> 0 do
begin
i ;» i + 1;
if i » 1
then mini ; = x
el se
begin
if x <» mini
then
begin
min2 ;- mini;
mini x
end
else
if (i » 2) or (x < min2)
then min2 ;= x
end;
write ( 'Введите х» ' );
read ( x )
end;
readln;
if i < 2
then writeln ( 'Было введено менее двух чисел' )
else writeln ( 'Два наименьших числа '. mini,
'. ’. min2 )
end. { DoubleMin }
Задание 50
Решение:
с)
program Increase;
var
old. new; real;
begin
write ( 'x-' ); readlnC old );
Глава 5. Операторы цикла 183
write ( ’х-’ ); readln( new );
while (new <> 0) and (new > old) do
begin
write ( 'x-' );
old new;
readln ( new )
end;
write ( 'Последовательность ’ );
if new <- old
then writein ( ’не является возрастающей' )
else writein ( 'возрастающая' )
end. { Increase }
Задание 54
Решение (фрагмент программы):
х :« 1;
for i ;» 1 to k do
x i*x + 1/i;
Задание 62
Решение:
program IntegralSqrX;
var
a. b. { концы отрезка }
h. {шаг интегрирования }
s, { искомая площадь }
с; real; { промежуточная переменная }
i. {шаг цикла }
n; integer; { количество разбиений отрезка }
begin
write( 'Введите а, Ь. п: ' );
read ( a. b. п );
h :- ( b - а ) / п;
s 0;
с :в а — h / 2;
for i 1 to n do
begin
с ;» c + h;
s s + sqr( c )
end;
S S * h;
writein ( 'Интеграл равен '. s )
end. { IntegralSqrX }
Задание 63
Ответы:
a) -1,84147098;
b) -1,73205090;
c) = 14,6666666.
Задание 67
Решение:
program MaxValue;
var
184 Приложение 1. Ответы и решения
а, Ь, х. у. h. max, xmax: real:
1. n: Integer;
begin
writeC 'Введите a. b, n: ' );
readln ( a, b, n );
h :» ( b - a ) / n;
x := a:
for i := 1 to n - 1 do
begin
x := x + h:
у := ( sqr( x ) - 3 * x + 2 ) /
sqrtC 2 * x * sqr( x ) - 1 ):
if (1 = 1) or (y > max) then
begin
xmax :e x;
max := у
end
end:
write ( *x=', xmax. max=', max )
end. { MaxValue }
Глава 6. Литерный тип
Упражнения, задачи, программы
Задание 1
Решение:
program Symbols:
var
S_pred. S. S_next: char;
n: integer:
begin
write ( 'Введите символ: ' ):
readln( S ):
n := ord( S ):
writelnC 'Порядковый номер символа '. S.
' = ’. n );
if n > 0
then writelnC 'Предыдущий символ = '. pred(S) )
else writelnC 'Предыдущий символ отсутствует’ ):
if n < 255
then writelnC 'Последующий символ = '. succ(S) )
else writelnC 'Последующий символ отсутствует' )
end. { Symbols }
Задание 2
Решение:
program Lati nLetters:
var
sym: char:
begin
writeln ( 'Буквы латинского алфавита:' );
writeln ( '1. Прописные'):
for sym := 'A* to 'Z' do
writeCsym);
Глава 6. Литерный тип 185
writein;
writein('2. Строчные');
for sym := 'a' to 'z' do
write ( sym );
readln
end. { LatinLetters }
Результат работы программы:
Буквы латинского алфавита:
1. Прописные
ABCDEFGHIJKLMNOPQRSTUVWXYZ
2. Строчные
abcdefghijklmnopqrstuvwxyz
Задание 3
Решение:
program Digits;
const
n = 10;
var
c: char;
i. count: i nteger;
begin
count ;= 0;
writein ( 'Введите '. n. ’ символов:');
for i := 1 to n do
begin
read ( c );
if (c >= '0') and (c <= '9')
then count := count + 1
end;
readln;
writein ( 'Во введенной последовательности '.
'символов '. count. ' цифр’ );
readln
end. { Digits }
Задание 4
Решение:
program Test:
const
n = 20;
eot = '.';
var
c: char;
count: integer;
begin
write ( 'Введите не более '. n. ' символов;' ):
writein ( ' признак конца последовательности - '.
eot. "" );
count := 0;
repeat
read ( c );
if (c >= 'a') and (c <= 'z')
then count := count + 1
until c = eot;
if odd( count )
186 Приложение 1. Ответы и решения
then writelп( 'Предположение не верно* )
else writeln( 'Предположение верно' );
readln
end. { Test }
Задание 5
Решение:
program SymbolsCount;
var
c, ch : char;
n. i : integer;
S : integer;
begin
writein ( 'сколько символов будет введено?' );
readln ( n );
writein ( 'вхождения какого символа '.
'будут подсчитываться?’ );
readln ( ch );
S ;- 0;
writein ( 'введите последовательность символов' );
for i ;- 1 to n do
begin
read(c);
if c - ch then S ;- S + 1
end;
writein ( 'количество вхождений символа
ch. S )
end. { SymbolsCount }
Задание 6
Решение:
program Substitution;
var
c; char;
fi rst; boolean; I
begin
write( 'Введите последовательность символов; ');
first true;
while not eoln do
begin
read ( c );
if first then
begin
first :» false;
write ( 'Результат; ' )
end;
write ( c );
if c - '.' then write( ’..' )
end;
writein;
readln
end. { Substitution }
Пример работы программы:
Введите последовательность символов: asf..e.gf.ws.8jh
Результат: asf......е...gf...ws...8jh
I
Глава 6. Литерный тип 187
Задание 7
Решение:
program Convert;
const
nul » 'O';
nine - ’9';
point - '.';
n - 10:
var
result: real;
scale: real;
c: char;
begin
result ;- 0;
writelnC 'Введите последовательность символов:' );
repeat
readC c )
until ( nul <- c) and ( c <- nine );
while ( nul <- c) and ( c <» nine ) do
begin
result :» n * result + ord( c ) - ord( nul );
read( c )
end;
if c - point
then
begin
scale :- 1;
read( c );
while ( nul <- c ) and ( c <- nine ) do
begin
scale :- scale * 10;
read( c );
result :- result +
C ord(c) - ord(nul) ) / scale;
end
end;
writelnC 'Результат - ', result );
readln
end. { Convert }
Задание 8
Решение:
program Summa;
const
eot e '.';
var
s. d: integer:
c. sign: char;
begin
sign :- '+';
s :- 0;
write ( 'Введите выражение в символьном виде: ' );
repeat
readC с );
d :- ord(c) - ord('O');
if sign - '+'
188 Приложение 1. Ответы и решения
then s := s + d
else s := s - d:
read( sign )
until sign = eot:
readln;
writein ( ’Полученная сумма * s ):
readln
end. { Summa }
Пример работы программы:
Введите выражение в символьном виде: 1+1+2+1-4.
Полученная сумма = 1
Глава 7. Перечислимый тип,
ограниченный тип, оператор варианта
Перечислимый тип. Упражнения
Задание 2
Ответ:
t := ml < m2
Задание 3
Ответы:
а)
if m2 = Dec
then ml := Jan
else m2 : = succ( m2 )
b)
ml := m2:
for i := 1 to к mod 12 do
if ml = Dec
then ml := Jan
else ml : = succ( ml )
c)
ml := Jan:
for i := 1 to n - 1 do ml := succ( ml )
Оператор варианта. Упражнения
ч
Задание 1
Ответ:
case Ch of
’i’: N := 1:
‘j’: N := 5:
’k’: N := 10:
’Г: N := 100:
else N := 500
end:
Глава 7. Перечислимый тип, ограниченный тип, оператор варианта 189
Задание 2
Ответы:
а) р = false, d = 3;
b) р = true, d = 235;
с) p = true, d = 1.
Задание 3
Ответы:
a) spring;
b) summer;
с) ошибка;
d) ошибка.
Задание 4
Ответ:
По введенному номеру дня недели напечатать название этого дня недели.
Задание 5
Решение:
type
month = ( January, february, march, april,
may. June. July, august.
September. October, november. december);
var
num: month;
dayscount: 28..31;
begin
case num of
february:
dayscount:= 28
april. June. September:
dayscount := 30;
else dayscount ;= 31;.
end;
end.
Задание 6
Ответ:
Среди символов, вводимых с клавиатуры, подсчитать количество символов ’А', ’В’ и ’С’.
Задание 8
Решение:
program Geometry:
const
pi = 3.1415926:
190 Приложение 1. Ответы и решения
var
г. s, 1, v: real;
к: integer;
begin
writeC 'Введите радиус: ’ );
readlnC г );
writeC 'Введите номер варианта: ' );
readlnC к );
case к of
1:
begin
s :» pi*r*r;
writelnC 'площадь круга - ', s)
end:
2:
begin
1 :» 2*pi*r:
writelnC 'длина окружности - 1)
end;
3:
begin
v :»4 / 3 * pi * sqr( r ) * r;
writelnC 'объем шара - v)
end
end
end. { Geometry }
Задание 9
Решение:
program DeleteComments;
var
state: (copy. beg_comment,comment, end_comment);
i: integer;
c: char;
begin
state := copy;
while not eof do
if eoln
then
begin
readln;
writeln;
end
else
begin
readC c );
case state of
copy:
if c - '('
then state :» beg_comment
else writeC c );
beg_comment:
if c - '*'
then state :- comment
else
if с о (•
then
Глава 7. Перечислимый тип, ограниченный тип, оператор варианта 191
begin
write( . с ):
state copy
end
else write( ’(' );
comment:
if c -
then state :» end_comment;
end_comment:
if c - •)’
then state :« copy
else
if c <> ’*•
then state :- comment
end { case }
end
end. { DeleteComments }
Упражнения, задачи, программы
Задание 16
Решение:
program Zodiac:
var
m: 1..12: { месяц }
d: 1..31: { день }
Zod: ( Ari. Tfcu. Cem. Can. Leo. Vir.
Lib. Seo, Sag. Cap. Aqu. Fis ):
{
знаки Зодиака:
Ari - Овен.
Таи - Телец.
Cem - Близнецы.
Can - Рак.
Leo - Лев.
Vir - Дева.
Lib - Весы.
Sco - Скорпион.
Sag - Стрелец.
Cap - Козерог.
Aqu - Водолей.
Fis - Рыбы
}
begin
write( 'Введите месяц рождения '.
'(целое число от 1 до 12): '):
readln( m ):
write( 'Введите день рождения '.
'(целое число от 1 до 31): '):
readln( d ):
case m of
1: if d <« 20 then Zod » Cap else Zod » Aqu:
2: if d <« 18 then Zod » Aqu else Zod = Fis:
3: if d <« 20 then Zod - Fis else Zod - Ari:
4: Tf d <= 20 then Zod - Ari else Zod » Tau:
5: if d <= 21 then Zod - Tau else Zod e Cem:
6: if d <« 21 then Zod » Cem else Zod - Can:
192 Приложение 1. Ответы и решения
7; if d <= 22 then Zod : »Can else Zod = Leo;
8: if d <= 23 then Zod ; = Leo else Zod “ Vir;
9; if d < == 23 then Zod ; = Vir else Zod = Lib;
10; if d <= 23 then Zod := Lib else Zod :« Sco;
11; if d <= 22 then Zod : = Sco else Zod ;- Sag:
12; if d <“21 then Zod ;- Sag else Zod Cap
end;
write( 'Ваш знак Зодиака: ’ ):
case Zoc i of
Ari; writelnC 'Овен' );
Tau; writeln( 'Телец' );
Cem: writelnC 'Близнецы' );
Can; writelnC 'Рак' ):
Leo: writelnC 'Лев' );
Vir; writelnC 'Дева' ):
Lib: writelnC 'Весы' );
Sco: writelnC 'Скорпион' );
Sag: writelnC 'Стрелец' );
Cap: writelnC 'Козерог' )/
Aqu: writelnC 'Водолей' ):
Fis: writelnC 'Рыбы' )
end
end. { Zodiac }
Глава 8. Регулярные типы данных
Векторы. Задачи, программы
Задание 2
Решение:
program NumbersLocate;
const
m = 50;
var
C; array [0..m] of char;
B: array [0..mJ of boolean;
i: 1nteger;
begin
writelnC 'Введите элементы массива ',
'в количестве ', m+1 );
for 1 0 to m do
read( C[i] );
readln;
for 1 := 0 to m do
B[i] := ( C[i] >= 'O' ) and ( C[i J <= '9' );
for i := 0 to m do
writeC B[i], ' ' )
end. { NumbersLocate }
Задание 5
Решение:
program ReverseAnd6Columns;
const
m = 100; { количество элементов массива }
n = 6: { по n элементов в строке }
Глава 8. Регулярные типы данных 193
van
х: array [l..m] of integer:
i: 1nteger:
begin
writelnC ’Введите '. m. ’ элемента(ов) массива’):
for i :» 1 to m do
readC x[i] );
readln;
for i :e m downto 1 do
begin
writeC x[i], ' ’ );
if ( m - i + 1 ) mod n » 0 then writeln
end
end. { ReverseAnd6Columns }
Задание 8
Решение:
program Derivative;
const
n = 20:
var
a: array [0..n] of real:
x. t: real;
у : real; { значение многочлена в точке t }
yl: real; { значение производной в точке t }
i: integer;
begin
writelnC 'Введите коэффициенты многочлена:' ):
for i :- 0 to n do
readC a[i] ):
readln:
writeC 'Введите значение переменной x: ’ );
readlnC t ):
x ;e t’;
У := 0;
yl := 0:
for i := 1 to n - 1 do
begin
у :e у + a[1] * x;
yl :» yl + (i + 1) * a[i+l] * x;
x :- x * t
end: .
у := у + a[0] + a[n] * x;
yl :« yl + a[l];
writelnC ’y(x)=', y:7:3. ' y” (x)»’. yl:7:3 )
end. { Derivative }
Задание 9
Решение:
program RusLetters;
const
num_letters - 33:
type
set_of_letters: array [1..num_letters] of char:
const
smallJetters: set_of_letters =
C’a'. ’6’. 'в', 'г', ’д’, ’e'. 'e'.
7 Зак. 906
194 Приложение 1. Ответы и решения
'ж' . *3’. ’и’. *й’, ’к’. ’л', ’м’,
'н'. 'О', ’ гГ. 'р'. ’с’, 'т'. 'у',
’ф’. ’х'. 'ц'. 'ч'. 'ш'. 'щ'. 'ъ'.
'ы'. *ь*. 'э'. 'ю'. ’я'):
big_letters: set_of_l etters =
('A'. ’Б'. 'B'. •t . 'Д’. ’E’ . 'E*
'Ж'. ’3'. 'И'. 'Й'. 'К'. 'Л'. 'M',
'H*. ’O'. 'П*. P'. 'C. T. •y.
'Ф'. 'X'. •it. '4'. 'Ш'. 'Щ'. 'b'.
'Ы'. 'b'. 'Э'. •Ю'. 'Я'):
var
1 i: integer;
begin
writeln ( 'Буквы русского алфавита: ' );
writein ( '1. Прописные' ):
for i := 1 to num_letters do
write( big_letters[i] );
writeln:
writeln ( ’2. Строчные' ):
for i := 1 to num_letters do
write( small_letters[i] ):
readln
end. { RusLetters }
Результат работы программы:
Буквы русского алфавита:
1. Прописные
АБВГДЕЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
2. Строчные
абвгдеежзийклмнопрстуфхцчшщъыьэюя
Задание 10
Решение:
а)
program Points:
const
njnax = 80:
var
txt: array [1..njnax] of char:
i, n: i nteger:
point: boolean:
begin
writeln ( 'Введите последовательность символов*.
' длиной не больше n max, ':’):
i :ж 0:
while not eoln and (i < njnax) do
begin
i := i + 1:
read( txt[i] )
end:
readln:
n :- i:
point :- false:
writeln( 'Преобразованная последовательность:' ):
for i :- 1 to n do
. Глава 8. Регулярные типы данных 195
begin
if txt[i] =
then
begin
if not point
then
{ это первая встретившаяся точка }
begin
writeC txt[i] ):
point := true
end
end
el se
begin
writeC txt[i] ):
point := false
end
end { for }
end. { Points }
Задание 11
Решение:
program Spaces:
const
njnax = 80:
ch = ' ’:
var
i, n, max, count: integer:
txt: array [1..njnax] of char:
begin
writelnC 'Введите последовательность символов’,
’ длиной не больше n max,
i := 0:
while not eoln and (i < njnax) do
begin
i := i + 1:
readC txt[i] )
end:
readln:
n := i:
max := 0: \
count := 0:
for i := 1 to n do
if txt[i] = ch
then
begin
count := count + 1:
if count > max then max : = count
end
else count := 0:
writelnC 'Максимальное количество ',
'символов " ', ch. " ’ = ', max );
readln
end. { Spaces }
196 Приложение 1. Ответы и решения
Задание 20
Решение:
program Notin:
var
letters: array ['a'..'z'] of boolean:
c: char;
begin
{ инициализация массива }
for с :» ’a’ to *z' do
letters[c] : = false;
writelnC ’Введите последовательность символов:’ );
while not eoln do
begin
readC c );
if (c >= ’a’) and (c <= 'z')
then lettersEc] := true
end;
readln:
writelnC 'Буквы, которые не вошли в ',
'последовательность:');
for с := 'a' to *z* do
if not letters[c] then writeC c. ’ ’ );
writeln
end. { Notin }
Пример работы программы:
Введите последовательность символов:
sdfkj kjhkjhkJhk235kj кJhkjh346457kjh kjh
Буквы, которые не вошли в последовательность:
abcegi Imnopqrtuvwxyz
Задание 25
Решение:
program Summa:
var
х; array [1..100] of real;
a: array [1..30] of 1..100:
s: real;
1. j: integer;
begin
writeln ( 'Введите значения элементов’,
’ массива х:' );
for 1 := 1 to 100 do
readC x[i] ):
readln;
writelnC 'Введите значения (1..100) элементов'.
' массива а:
for i := 1 to 30 do
readC a[1] ):
readln:
s ;= 0:
for i := 1 to 30 do
s := s + x[ a[i] ];
writelnC 's * ’. s:7:3 )
end. { Summa }
Глава 8. Регулярные типы данных 197
Задание 28
Решение:
program LettersFrequency:
type
1etter = ' a'.. 'z':
var
{ массив счетчиков латинских букв }
counters: array [letter] of integer:
c: char:
begin
{ обнуление счетчиков }
for c :e ’a’ to 'z' do
counters[c] := 0:
writeC 'Введите текст: ' ):
while not eoln do
begin
readC c ):
if (c >= 'a *) and (c <= 'z')
then counters[c] :» counters[c] + 1
end:
readln:
{ вывод на печать результата }
writelnC 'Частота встречаемости ',
'латинских букв:' ):
for с := 'a' to 'z' do
writelnC с, counters[c] ):
readln
end. { LettersFrequency }
Пример работы программы:
Введите текст: my heart is in the highlands, my heart is not here
Частота встречаемости латинских букв:
а-3
b-0
с-0
d-1
е-5
f-0
g-1
h-6
i-4
j-0
k-0
1-1
m-2
n-3
o-l
p-0
q-0
r-3
s-3
t-4
u-0
v-0
w-0
x-0
198 Приложение 1. Ответы и решения
У-2
z-0
Задание 47
Решение:
с)
program Position;
const
n = 40;
var
x; array [l..n] of Integer;
у. к. 1: integer;
t; boolean;
begin
writelnC ’Введите значения элементов’.
' массива х;' );
for i := 1 to n do
readC x[i] );
writeC 'Введите значение у = ' );
readlnC у );
к := 1;
while (к <« n) and (у <> х[к]) do
к ;» к + 1;
writelnC ’к='. к )
end. { Position }
Задание 54
Решение (первый вариант):
program ArithmeticMeanl;
const
n « 100;
var
x; array [1..n] of real;
S, b. c; real;
i: integer;
begin
writelnC 'Введите значения элементов'.
' массива х:' );
for i ;= 1 to n do
readC x[i] );
readln;
b x[l];
S 0;
for i ;= 2 to n do
begin
c ;» x[i];
S :» S + b;
x[i] :» S / (i-1);
b c
end;
writelnC 'Полученный массив x:' );
for i := 1 to n do
writeC x[i]. ' ' )
end. { ArithmeticMeanl }
Глава 8. Регулярные типы данных 199
Решение (второй вариант):
program ArithmeticMean2:
const
n = 100:
var
x: array [1..n] of real:
S. b. c: real:
1: integer:
begin
writeln( 'Введите значения элементов'.
' массива х:’);
S := 0:
for i := 1 to n do
begin
read( x[i] ):
S := S + x[i]
end:
readln:
for i := n downto 2 do
begin
S := S - x[i]:
x[i] := S / (i-1)
end:
writeln( 'Полученный массив x:’ ):
for i := 1 to n do
write( x[i], ' ' )
end. { ArithmeticMean2 }
Задание 60
Решение:
Ь)
program ExchangeSort:
const
n = 100:
var
x : array [l..n] of integer:
y. i. к : integer:
begin
writelnC 'Введите значения элементов массива х:' ):
for к := 1 to n do
read( x[k] ):
readln:
for i := 1 to n - 1 do
for к := 1 to n - i do
if x[k] > x[k+l] then
begin
у := x[k+l]:
x[k+l] := x[k]:
x[k] := у
end:
writeln( 'Упорядоченный массив x:' ):
for к :» 1 to n do
write( x[k].' ' )
end.{ ExchangeSort }
200 Приложение 1. Ответы и решения
Задание 62
Решение:
program Min InAddition;
var
x : array [1..30] of integer;
у : array [1..30] of integer;
min, k. 1 ; Integer;
begin
writelnC ’Введите значения элементов первой
’последовательности х;' );
for к := 1 to 30 do
readC х[к] );
readln;
writelnC 'Введите значения элементов ',
' второй последовательности у:' );
for к ;= 1 to 30 do
readC у[к] );
readln;
min ;= Maxint;
for 1 ;= 1 to 30 do
begin
к ;s 1;
while (k <= 30) and (x[1] <> y[k]) do
к ;= к + 1;
if к > 30 then
{x[i] не входит во вторую последовательность}
if min > x[i] then min ; = x[1]
end;
writeC ’min=’, min )
end.{ MinlnAddition }
Задание 64
Решение:
program Un i queEnt ryIntoText;
var
x ; array [1..26] of char; { массив лат. букв }
s ; array C’a’..'z'] of integer; { счетчик букв }
с ; char;
1, k, j ; 1nteger;
{ k - кол-во встретившихся по одному разу
латинских букв }
begin
for с ;= ’a’ to 'z* do
s[c] := 0:
writelnC 'Введите текст, заканчивающийся ',
'точкой;' );
readC с );
while с <> '.' do
begin
s[c] ;= s[c] + 1;
readC c )
end;
readln;
{ формирование результата }
k ;= 0;
for c ;= 'a' to 'z' do
if s[c] = 1 then
Глава 8. Регулярные типы данных 201
{ буква встретилась один раз }
begin
к ;= к + 1;
х[к] := с
end;
{ вывод результата }
for i := 1 to к do
writeC x[i],' ’
end.{ UniqueEntrylntoText }
Задание 76
Решение:
e)
program Modificationstring;
type
stroka = array [1..80] of char;
var
s : stroka; {s - строка символов}
i, j, к : integer; {к - количество букв}
begin
writelnC 'введите текст, заканчивающийся пробелом' );
k ;= 0;
repeat
k := k + 1;
readC s[k] )
until Cs[k] = ' ') or (k=40);
{заполняем остаток массива пробелами}
for j ;= k + 1 to 80 do s[j] ;= ' ';
i := 1;
while i<=k do
begin
if Cs[i] = 'q')
then
begin
{освобождаем место для буквы u}
for j ;= k downto i + 1 do
s[j + 1] ;e s[j]:
s[i + 1] ;= 'u';
1 := i +2; {т.к. u проверять не нужно}
k ;= k + 1 {увеличилось количество букв}
end
else i ;= i + 1
end;
writelnC s )
end.f Modificationstring }
Матрицы. Задачи, упражнения
Задание 47
Решение:
Ь)
program Substitution;
type
vector = array Cl..n] of integer;
202 Приложение 1. Ответы и решения
matr = array [l..n] of vector;
var
A : matr;
X ; vector;
i.j ; integer;
begin
writelnC 'введите матрицу A;' );
for i ;= 1 to n do
for j : = 1 to n do
read( A[i.j] );
readln;
writelnC 'введите вектор x;' );
for i :• 1 to n do
readC x[i] );
readln;
for j := 1 to n div 2 do
for i ;= 1 to n do
A[i.2*j] ;= x[i];
writelnC 'полученная матрица A;' );
for i ;= 1 to n do
begin
♦for j := 1 to n do
writeC A[i.j],’ ' );
writeln
end
end.{ Substitution }
Задание 50
Решение:
program SumElementInSection;
var
A : array [1..9. 1..9] of real;
S ; real;
i.j; integer;
begin
writelnC 'введите матрицу A;' );
for i ;= 1 to 9 do
for j ;= 1 to 9 do
readC A[i,j] );
readln;
s ;= 0
for i
= 1 to 9 do
s ;» s + A[i,i] + A[i,10-iJ;
{ элемент на пересечении диагоналей суммируется дважды }
s ;= s - А[5.5];
writeC 'сумма элементов из заштрихованной области» s;5;2
end.{ SumElementInSection }
Задание 54
Решение:
program DeleteColRow;
const m = 20;
var
A : array [l..m, l..m] of integer;
В ; array [l..m - 1. l..m - 1] of integer;
Глава 8. Регулярные типы данных 203
к, п, 1. j : 1..m;
begin
writelnC 'введите матрицу A;' );
for 1 := 1 to m do
for j := 1 to m do
read( A[1,j] );
readln;
writeC 'введите номер удаляемой строки (1.. '.
m. '):' );
readlnC n );
writeC 'введите номер удаляемого столбца Cl..', m. '): ' );
readlnC к );
for 1 := 1 to n - 1 do
begin
for j := 1 to к - 1 do B[i.j] := A[1,j];
for j := к to m - 1 do B[1,j] := A[1.j + 1];
end;
for 1 ;= n to m - 1 do
begin
for j ;= 1 to к - 1 do B[1,j] ;= A[i + 1,j];
for j := к to m - 1 do
BC1.j] ;= A[1 + l.j + 1];
end;
writelnC 'полученная матрица В;' );
for 1 ;= 1 to m - 1 do
begin
for j ;= 1 to m - 1 do
writeC B[i J], ' ' );
writeln
end
end.{ DeleteColRow }
Задание 58
Решение:
b)
program Ordering;
const
n = 20;
nl = 30;
var
A ; array [l..n, 1..nl] of integer;
1, j. m. к : 1..nl;
r. s. sjnax ; Integer;
begin
writelnC 'введите матрицу A;' );
for 1 ;= 1 to n do
for j ;= 1 to nl do
readC A[i.j] );
readln;
{сортировка по неубыванию выбором}
for к := n downto 2 do
begin
{m - номер строки с максимальной суммой}
m ;= 1;
sjnax ;= 0;
{sjnax - сумма элементов первой строки}
for j ;= 1 to nl do
204 Приложение 1. Ответы и решения
sjnax sjnax + A[l,j];
for 1 2 to к do
begin
{s - сумма элементов 1-й строки}
s : 0:
for j := 1 to nl do
S :» S + A[i ,j];
if s > sjnax then
begin
sjnax s;
m :» 1
end;
end;
if к <> m then
{перестановка m-й и k-й строк}
for j :» 1 to nl do
begin
г ;« A[k,j];
A[kJ] :-A[mJJ;
A[m.j] ;« r
end;
end;
writelnC 'полученная матрица:' );
for 1 := 1 to n do
begin
for j := 1 to nl do
writeC A[1.j], ' ’ );
writein
end
end.{ Ordering }
Задание 60
Решение:
program Symmetry;
const
n » 10;
var
A : array [l..n, 1..nJ of integer;
1. j : l..n;
b : boolean;
begin
writelnC 'введите матрицу A:' ):
for i 1 to n do
for j :» 1 to n do
readC A[i,j] );
readln;
i :m 1;
b :» true;
while (i < n) and b do
{ 1<n t.k. элемент A[n,n] можно не рассматривать }
begin
{чтобы не рассматривать диагональный элемент}
j i + 1:
while (j <= n) and (a[i.j] « a[j,i]) do
j j + 1:
if j <= n
then b := not b
Глава 8. Регулярные типы данных 205
else 1 := 1 + 1
end;
if b
then writelnC 'матрица А симметрична’ )
else writelnC 'матрица А не является симметричной' )
end.{ Symmetry }
Задание 65
Решение:
program OftenMet;
{ непустая последовательность слов (не более 30) }
type
{ 1-я и последняя буквы слова }
Bukva = array [1..2] of char;
var
В : array [1..30] of Bukva;
{ число появлений пары букв }
А ; arrayz[l..30] of 0..30;
i, j. k. max. i_max : integer;
c. p_c : char;
begin
writelnC 'введите текст, заканчивающийся точкой' );
i := 1;
repeat
readC c );
B[i,1] := c;
while (c <> '.') and (c <> ',') do
begin
p_c := с; {p_c - предыдущий для с символ}
readC с )
end;
B[i,2] ;= p_c; {в с либо точка, либо запятая}
i ;= i + 1
until (с = '.') or (i > n);
k := i - 1; {k - количество слов}
for i ;= 1 to k do A[i] := 0;
for i := 1 to k do
if A[i] = 0 then
{пара букв еще не обрабатывалась}
for j ;= i + 1 to k do
if B[i] = B[j] then
begin
A[i] ;r A[i] + 1;
A[j] := A[j] + 1
end;
max ;= A[l];
ijnax ;= 1;
{нахождение номера максимального элемента в массиве А}
for i := 2 to k do
if max < A[i] then
begin
max ;= A[i];
i_max ;= i
end;
if max = 1
then writelnC 'все пары встречаются по '.
'одному разу’ )
206 Приложение 1. Ответы и решения
else writelnC ’наиболее часто встреч-ся пара:',
B[ijnax.l]. B[i_max.2] )
end.{ OftenMet }
Задание 68
Решение:
program CorrectRecord;
type
color = (red, blue, green, yellow, black, white);
stroka= array [1..6] of char;
var
cl : array [1..6] of stroka; {cl - матрица цветов}
s : stroka; { s - вводимая строка }
x. у : color;
i. j, k : integer;
c : char;
begin
cl[l] := ’red ’;
cl [2] := ’blue ’:
cl[3] := ’green ';
cl[4] ;= ’yellow’;
cl[5] := ’black ’;
cl[6] := 'white ';
writelnC 'введите строку, заканчивающуюся ',
'пробелом:' );
readC с );
i := 0;
while (с <> ' ’) and (i < 6) do
begin
i := i + 1;
S[i] :- c;
readC c )
end;
while (c <> ' ’) do
begin
i := i + 1;
readC c )
end;
readln;
if i > 6
then writelnC 'ошибка' )
el se
begin
{заполнение оставшейся части массива пробелами}
for k := i + 1 to 6 do
S[k]
у :- red;
j :- 1:
while (j <= 6) and (s о cl[j]) do
begin
j j + 1:
у :» succC у )
end;
if j <= 6
then x у
else writelnC 'ошибка' )
end
Глава 8. Регулярные типы данных 207
end.{ CorrectRecord }
Задание 72
Решение:
Таблица 1. Массив Data — даты начала действия знака Зодиака
(индекс — месяц, Data[i] — число)
1 2 3 4 5 6 7 8 9 10 11 12
20 19 21 20 21 22 23 23 23 23 23 22
Таблица 2. Массив D_m — количество дней в месяце (индекс — месяц, D_m[i] — число)
1 2 3 4 5 6 7 8 9 10 11 12
31 29 31 30 31 30 31 31 30 31 30 31
program SignsOfTheZodiac;
type
stroka= array Cl..8] of char:
{ 8 - максимальное количество букв в названии
знака Зодиака }
var
zz : array [1..12] of stroka:
Data : array [1..12] of 19..23:
D_m : array [1.12] of 28..31
m.d : integer:
fl : boolean:
{ верно ли введена дата: true - верно, false - нет }
begin
Data[1]:=20: Data С2]:=19: Data С3]:=21:
Data C4]:=20: Data[5]:=21: Data[6]:=22:
Data[7]?=23: Data[8]:=23: Data[9]:=23:
Data[10]:=23: Data[ll]:=23: Data[12]:=22:
D_m[l]:=31: D_m[2]: =29: D_m[3]:=31:
D_m[4]:=30: Djn[5]:=31: D_m[6]:=30:
D_m[7]:=31: D_m[8]:»31: Djn[9]:=30;
D_m[10]:=31: D_m[ll]:=30: D_m[12]:=31;
zz[l]:='Водолей ';
zz[2]:«’Pbi6bi ':
гг[3]:='0вен
zz[4]:='Телец ':
zz[5]:='Близнецы':
zz[6]:='PaK ’:
zz[7]: = 'JleB ':
zz[8]:='fleBa ':
zz[9]: = 'Becbi ':
гг[10]:='Скорпион':
гг[11]:='Стрелец ':
zz[12]:='Козерог ':
repeat
writeC 'введите месяц в диапазоне 1-12:' ):
readln( m ):
until (m >= 1) and (m <= 12):
repeat
fl := true:
208 Приложение 1. Ответы и решения
wrlte( ’введите день:' );
readlnC d );
{ проверка корректности ввода }
if (d > D_m[m]) or (d < 1) then
begin
fl :» false;
writelnC 'такого дня в '. m. ' месяце нет ! )
end
until fl;
if d>-Data[m]
then writelnC zz[m] )
el se
if m » 1
then writelnC zz[12] )
else writelnC zz[m-l] )
end.{ SignsOfTheZodiac }
Глава 9. Процедуры и функции
Задачи, программы
Задание 1
Решение:
program Calculate!:
var
х, у, func : real;
function SignC x : real ) : integer;
begin
if x < 0
then Sign -1
el se
if x > 0
then Sign :- 1
else Sign ;= 0
end;{ Sign }
begin
writeC 'Введите значения переменных X, Y: ’ ):
readlnC x. у );
func:= (SignC x ) + SignC у ))*Sign( x + у );
writelnC ‘Значение функции: *. func )
end.{ Calculatel }
Задание 2
Решение:
program Calculate2;
var
s, t. func. hl : real:
{ функция нахождения максимума }
function max( x. у : real ) : real;
begin
if x < у
then max : = у
else max ; = x;
end;{ max }
{ функция H(a.b) }
Глава 9. Процедуры и функции 209
function Н( а. b : real ) : real;
var t : real;
begin
t := a - b;
H ;- a / (1 + sqr( b )) + b / (1 + sqr( a )) -
sqr( t ) * t;
end;{ H }
begin
writeC 'Введите1'значения переменных S, T: ’ );
readlnC s, t );
hl ;» H( s - t, s + t );
func H( s. t ) +
max( sqr( H( s - t, s * t ) ),
sqr( sqr( hl ) ) ) +
H( 1. 1 );
writelnC ’Значение функции: ', func );
end.{ Calculate2 }
Задание 7
Ответ:
а) в результате работы программы будет напечатано:
2 О
2 5
Задание 8
Решение:
program CaclculateNOD;
var А. В, C, N : Integer;
function NODC x, у : integer ) : integer;
var t : integer:
begin
if x < у then
{ помещаем в X наибольшее число }
begin
t := x;
x := у;
У := t
end;
while у > 0 do
begin
t := x mod y;
x ;= y;
У := t
end;
NOD :» x
end;{ NOD }
begin
writelnC 'Введите 3 числа’ );
readlnC А. В, C );
N ;= NODC A. В );
N :« NODC C. N );
writelnC 'Наибольший делитель 3 чисел - N )
end.{ CaclculateNOD }
210 Приложение 1. Ответы и решения
Задание 12
Решение:
program SimpleNumbers;
var 1. x, N : integer;
function Test( X ; integer ) ; boolean;
var
i ; integer;
b ; boolean;
begin
i ;= 2;
b ;= true;
while (i <- sqrtC X )) and b do
begin
b ;- X mod I <> 0;
i ;» i + 1
end;
Test ;= b
end;{ Test }
begin
writeC 'Введите количество простых чисел ' );
readlnC N );
i := 0;
X ;= 2;
while (i < N) do
begin
if TestC X ) then
begin
writelnC X );
i ;= i + 1
end;
X ;- X + 1
end
end.{ SimpleNumbers }
Задание 17
Решение:
function vowels ( ch : char ) ; boolean:
const
num_vowels - 20;
vowel : array [1.. num_vowels] of char =
С'а'.’е'.'е'.'и'.'о’.'у'.'ы'.'э'.’ю'.'я'.
'A','E','E','И','O','У','ЬГ ,'Э','Ю','Я');
var
yes ; boolean;
i : integer;
begin
yes ;- false;
i := 1;
while not yes and (i <- num_vowels) do
begin
yes ch - vowel [i];
i i + 1;
end;
vowels yes
end;{ vowels }
Глава 9. Процедуры и функции 211
Задание 19
Решение:
program Repl асе;
const
N = 20:
type
{ тип - последовательность }
Seq - array[l..N] of Integer:
var
A. В : Seq;
{ ввод последовательности }
procedure InputSeqC var X : Seq ):
var
1 : integer:
begin
for 1 :- 1 to N do
begin
write( 'Введите
i. '-и элемент последовательности' );
readlnC X[i] )
end
end;{ InputSeq }
{ печать последовательности }
procedure PrintSeqC X : Seq );
var
1 : integer;
begin
for i :» 1 to N do
writeC X[i] );
writein
end:{ PrintSeq }
{ поиск минимального элемента }
function MinimumSeqC X : Seq ) : integer;
var
i. Min : integer;
begin
Min := X[l];
for i : = 2 to N do
if X[i] < Min then Min : = X[i];
MinlmumSeq :e Min
end;{ MinimumSeq }
{ поиск индекса максимального элемента }
function MaximumSeqC X : Seq ) : integer;
var
i. Max : integer;
begin
Max :» 1;
for i 2 to N do
if X[i] > X[Max] then Max : = i;
MaximumSeq := Max
end;{ MaximumSeq }
{ замена элементов, которые располг
212 Приложение 1. Ответы и решения
procedure ReplaceMaxMin( var X : Seq ):
var
Min. Max : integer;
I : integer;
begin
Min ;= MinimumSeqC X );
Max := MaximumSeqC X ):
for i ;= Max + 1 to N do
X[i] ;= Min
end;{ ReplaceMaxMin }
begin
writelnC ’Введите первую последовательность' );
InputSeqC A );
writelnC 'Введите вторую последовательность' );
InputSeqC В );
ReplaceMaxMin( A );
ReplaceMaxMin( В );
writelnC 'Результаты замены в',
'первой последовательности' );
PrintSeqC А );
writelnC 'Результаты замены во',
' второй последовательности' );
PrintSeqC В )
end.{ Replace }
Задание 23
Решение:
program SummaS;
const
N = 10;
. M = 5;
type
Matr - array[l..N. 1..M] of real:
var
A ; Matr;
В : array [1..N, 1..M] of boolean;
i. j : i nteger;
S : real;
function TestSumC il, jl ; integer;
S ; real ) : boolean;
var
i, j ; integer;
Summa : real;
begin
Summa ;= 0;
for i il - 1 to il + 1 do
for j := jl - 1 to jl + 1 do
if (i >« 1) and (i <= N) and
(j >= 1) and (j <= M)
then Summa : = Summa + A[i,j];
TestSum :e Summa < S
end;{ TestSum }
begin
writelnC 'Введите исходную матрицу' );
for i := 1 to N do { Ввод матрицы A }
begin
for j := 1 to M do
readC A[i,j] ):
Глава 9. Процедуры и функции 213
readln
end;
writeC 'Введите значение суммы' );
readlnC S );
for i 1 to N do { Вычисление матрицы В }
for j := 1 to M do
B[i.j] := TestSumC 1. j, S );
writelnC 'Матрица В' );
for i :s 1 to N do { Печать результатов }
begin
for j :e 1 to M do
writeC B[i,j] );
writein
end
end.{ SummaS }
Задание 28
Решение:
program Change;
const
N = 100;
var
A ; array[l..N, 1..N] of real;
i. j. Maxi, MaxJ ; integer;
procedure InputMatr;
begin
{ ввод матрицы }
end;{ InputMatr }
procedure PrintMatr;
begin
{ печать матрицы }
end;{ PrintMatr }
{ обмен строк }
procedure ExchangeRowsC x, у ; integer );
var
i : integer;
Buffer : real;
begin
for i ;s 1 to N do
begin
Buffer := A[x.i];
A[x.i] ;= A[y.i];
A[y.i] ;= Buffer
end
end;{ ExchangeRows }
{ обмен столбцов }
procedure Exchangecolumns( x, у ; integer );
var
i ; integer;
Buffer ; real;
begin
for i := 1 to N do
214 Приложение 1. Ответы и решения
begin
Buffer := A[i,х];
A[i,х] := A[i.y];
A[i,y] := Buffer
end
end;{ Exchangecolumns }
begin
InputMatr;
Maxi := 1:
MaxJ : 1:
for 1 :=1 to N do
for j :=1 to N do
if A[i.j] > A[MaxI.MaxJ] then
begin
Maxi := i;
MaxJ :* j
end;
for 1 := Maxi - 1 downto 1 do
ExchangeRowsC i. i + 1 );
for i :e MaxJ - 1 downto 1 do
Exchangecolumns (1.1 + 1):
PrintMatr
end.{ Change }
Задание 33
Решение:
program Symetric;
const
N = 100;
M = 10;
var
A : array[l..N, 1..MJ of real;
i. Count. Row. MaxCount : integer;
procedure InputMatr;
begin
{ ввод матрицы }
end;{ InputMatr }
procedure PrintMatr;
begin
{ печать' матрицы }
।
end;{ PrintMatr }
{ проверка, является ли число симметричным }
function TestSym( х ; integer ) : boolean;
var
у . z ; integer;
begin
у ;= 0;
z x;
while z >» 0 do
begin
у := у * 10 + z mod 10;
z ;= z div 10;
end;
TestSym : = x = у
Глава 9. Процедуры и функции 215
end:{ TestSym }
{ подсчет в строке симметричных чисел }
function CalculateRowC х : integer );integer;
var
. i, Count : i nteger;
begin
Count :* 0:
for i := 1 to M do
if TestSymC A[x,i] ) then Count Count + 1;
CalculateRow ;= Count;
end;{ CalculateRow }
begin
InputMatr;
MaxCount ;= 0;
Row := 0;
for i 1 to N do
begin
Count = CalculateRowC i );
If Count > MaxCount then
begin
MaxCount ;= Count;
Row :» i;
end
end;
if Row = 0
then writelnC 'Нет строк с симметричными числами' )
else writelnC 'Строка с максимальным кол-вом симметричных чисел; ', Row )
end.{ Symetric }
Задание 44
Решение:
program DeleteWords;
const
N = 80;
type
str s array [1..N] of char;
var
A ; Str;
I ; integer;
{ удаление в строке слова, начинающегося
с указанной позиции и имеющего 'Заданную длину }
procedure DeleteWC var S : str;
Pos, Length : integer );
var
i : integer;
begin
for i := Pos to N - Length do
S[i] S[i + Length];
for i := N - Length + 1 to N do
S[i] ;- ' ’;
end;{ DeleteW }
begin
i ;= 0;
{ ввод строки }
repeat
216 Приложение 1. Ответы и решения
1 := i + 1;
read( A[i] );
until (1 = N) or (A[i] = ’.'):
1 := 1:
{ просмотр всей строки }
while (1 <= N) and (A[i] <> ’.*) do
begin
{ пропуск пробелов }
while (1 <= N) and (A[i] = ' ') do i ;= i + 1;
Pos := 1;
{ пропуск букв слова }
while (i <= N) and (A[i] <> ' ') do 1 i + 1;
if odd( Pos ) and (1 - Pos > 0) then
begin
DeleteW( A. Pos, 1 - Pos );
1 := Pos
end
end
end.{ DeleteWords }
Задание 65
Решение:
const
N = 10;
type
Poli nonrial = array CO. .N] of real;
{ A[i] коэффициент перед XAi }
procedure Sum ( A, В ; Pol 1 nonrial;
var C ; Poli nomi al );
var
i : integer;
begin
for i ;= 0 to N do
C[i] ;= A[i] + B[i];
end;{ Sum. }
Глава 10. Рекурсивные подпрограммы
Задачи, программы
Задание 5
Решение:
program Identificator;
const
Mien = 20; { максимальная длина идентификатора }
var
Ch ; char;
Id ; array[l..Mien] of char;
IdLen, i : integer;
procedure Idd;
begin
if Ch in [ ’A’.. ’Z’, ’a'./z', ’O’..‘9'] then
begin
Глава 10. Рекурсивные подпрограммы 217
IdLen := IdLen + 1;
IdEIdLen] := Ch;
readC Ch );
Idd
end;
end;{ Idd }
procedure Ident;
begin
if Ch in ['A'./Z', ’a’./z’] then
begin
IdLen ;= 1;
Id[l] ;= Ch;
readC Ch );
Idd
end;
end;{ Ident }
begin
read( Ch );
IdLen ;= 0;
Ident;
writeC ‘Идентификатор; ' );
for 1 := 1 to IdLen do
writeC Id[i] );
readln
end.{ Identlflcator }
Задание 17
Решение задачи удобно сформулировать в виде рекурсии: для того чтобы перемес-
тить п дисков с башни А на башню В, нужно выполнить следующую последова-
тельность шагов.
1. Перёместить и-1-диск с башни А на башню С.
2. Переместить диск с номером п с башни А на башню В.
3. Переместить и-1-диск с башни С на башню В.
Таким образом, решение задачи перемещения п дисков выражается через решение
задачи перемещения п-1-диска.
{ Программа распечатывает порядок перемещения дисков }
program Hanoi;
var
Towl.Tow2.Tow3; char;
n: integer; { количество дисков }
{ процедура перемещения дисков с башни tl на башню t2. }
{ башня t3 - вспомогательная }
procedure Hano1_Tower(tl.t2.t3; char; k; integer);
begin
if k<>l
then
begin
Hano1_Tower(tl. t3. t2. k-1);
writeln(tl:10. t2:10);
Hanoi_Tower(t3. t2. tl. k-1)
end
else writeln(tl;10. t2:10)
218 Приложение 1. Ответы и решения
end: { Hanoi_Tower }
begin
writeC'Введите количество дисков: '):
readln(n):
writelnC’с диска' :10. '- на диск':10):
Towl := 'А':
Tow2 := 'В':
Tow3 := 'С:
Hanoi_Tower(fowl, Tow2, Tow3, n);
writeC'Нажмите клавишу <Enter>... ’):
readln
end. { Hanoi }
Глава 11. Строковый тип
Задачи, программы
Задание 1
Решение:
program test:
const
n = 255:
type
str s array[l..n] of char:
var
ll. 12 : integer:
si. s2 : str:
c : char:
p : integer:
{ ВВОД СТРОКИ (имитация оператора readln) }
procedure readln_string (var S : str:
var length : integer):
begin
length := 0:
while (length < n) and not eoln do
begin
length := length + 1
readC S[length] );
end:
readln
end: { readln_string }
{ ПЕЧАТЬ СТРОКИ (имитация оператора write) }
procedure write_string(var S : str:
length : integer):
var
i : integer:
begin
for i :• 1 to length do
writeC S[i] )
end:{ write_string }
{ ПОИСК СИМВОЛА В ПОДСТРОКЕ
Частный случай поиска подстроки. Результат:
порядковый номер искомого символа в строке.
Если символ не найден, функция возвращает
Глава 11. Строковый тип 219
значение 0 }
function find_char (var S : str;
length : integer;
ch ; char ) ; integer;
var
i ; integer;
no ; boolean;
begin
i := 1;
no true;
while (i <= length) and no,do
begin
no := S[i] <> ch;
i ;= i + 1
end;
if no
then find_char : = 0
else find_char ;= i - 1
end;{ find_char }
{ ПОИСК ПОДСТРОКИ
Здесь S - строка, в которой ищем.
subS - подстрока, которую ищем.
Результат - номер позиции вхождения или 0.
если подстрока не содержится в строке.
Пример.
5=подлесок. subS=nec
результат: 4
Для типа string
p:=pos (искомая подстрока, строка поиска).
где р=0. если подстрока не найдена.
иначе - номер позиции вхождения) }
function find_substring( var S. subS : str;
length_S,
length_subS: integer
) : integer;
var
i. j : integer;
begin
j := 0;
i := 1;
while (i <= length_S - length_subS + 1) and
(j <- length_subS) do
begin
j := 1;
while (j <= length_subS) and
(i + j - 1 <= length_S) and
(S[i + j - 1] = subS[j]) do
j := J + 1:
i := i 1;
end;
if j <= length_subS
then find_substring :» 0
else find_substring i - 1
end;{ find_substring }
{ ПРОВЕРКА НА СОВПАДЕНИЕ
Для string: sl=s2
Результат true, если строки идентичны.
220 Приложение 1. Ответы и решения
иначе false }
function equal_string( var SI, S2 : str;
lengthl,
length2 : integer
) : boolean;
var
1 ; integer;
OK ; boolean;
begin
OK ;= lengthl = length2;
if OK
then
begin
i : 1;
while OK and (i <« lengthl) do
begin
OK ;« Sl[i] « S2[i];
i :e i + 1
end
end;
equal ; = OK
end;{ equal_string }
{ ИСКЛЮЧЕНИЕ ПОДСТРОКИ
Здесь pos - индекс первого исключаемого символа,
num - количество исключаемых символов.
Имитация оператора delete.
Пример.
подлесок, pos=4, num=3
результат; подок }
procedure delete_substring
( var S ; str;
var length .; integer;
pos, num ; integer );
var
i ; i nteger;
begin
if (pos > 0) and
(pos <= length) and (num >= 0) then
begin
.for i ;» pos to length - num do
S[i] :e S[i + num];
if pos + num - 1 <= length
then length := length - num
else if pos <= length
then length := pos - 1
end
end;{ delete_substring }
{ ВСТАВКА ПОДСТРОКИ
Здесь SubS - вставляемая подстрока,
S - принимающая строка,
length_subS. length_S - их длины,
pos - позиция вставки.
Имитация оператора insert.
Пример;
подок
подстрока = лес,
позиция вставки=4
результат; подлесок. }
Глава 11. Строковый тип 221
procedure insert_substring ( var SubS, S : str;
length_subS : integer;
var length_S ; Integer; pos ; Integer );
var
d. 1 : integer;
begin
d ;= length_subS + length_S;
if d <= n
then
begin
for i ;= 0 to length_subS - 1 do
begin
S[ d - i ] ;= S[ length_S - i ];
S[ pos + length_subS - 1 - i ]
SubS[ length_subS - i ];
end;
1ength_S:=d
end •
end; { insert_substring }
{ ИНВЕРСИЯ СТРОКИ
Пример;
подлесок
результат; коселдоп }
procedure inverse_string( var S ; str;
length : integer );
var
k. i ; integer;
c ; char;
begin
k := length div 2;
for i := 1 to k do
begin
c ;= S[i];
S[i] ;= S[length - i + 1];
S[length - i + 1] c
end
end; { inverse_string }
begin
writelnC ’Введите строку и подстроку
'для проверки' );
readln_string( si, 11 );
readln_string( s2, 12 );
writelnC 'Введите символ для поиска’ );
readlnC с );
writeC "" . с, "’ входит в "' );
write_string( si, 11 );
,writelnC '" с позиции ’,
find_char( si, 11, с ) );
writeC );
write_string( s2, 12 ):
writeC '" входит в );
write_string( si. 11 );
writelnC '" с позиции ',
find_substring( si, s2. 11. 12 ) );
if equal_string( si. s2. 11. 12 )
222 Приложение 1. Ответы и решения
then writelnC 'Строки совпадают' )
else writelnC 'Строки не совпадают' ):
р : = find_substring( si, s2. 11, 12 ):
if р = О
then
begin
writeC 'Подстрока '" ):
write_string( s2, 12 ):
writeC '" не содержится в '" ):
write_string( si, 11 ):
writelnC "" )
end
el se
begin
writeC 'Подстрока "' ):
write_string( s2. 12 ):
writeC '" содержится в ):
write_string( si, 11 );
writelnC с позиции N', p ):
delete_substring( si. 11, p. 12 ):
writeC 'После исключения подстроки ',
'имеем '");
wri te_string(sl.U):
writelnC "" )
end:
insert_substring( s2. si, 12, 11, p ):
writeC 'После вставки подстроки имеем '" ):
write_string( si. 11 ):
writelnC "" ):
inverseC si. 11 ):
writeC 'После инверсии: "' ):
write_string( si. 11 ):
writeC "" ):
readln
end. { test }
Задание 2
Решение:
program check:
const
wrd : array [1..4] of char »
( '3', 'm'. 'e'. 'я' ):
var
s : string:
i : integer:
OK : boolean:
begin
writelnC 'Введите последовательность символов:' ):
readlnC s ):
OK true:
i := 1:
while OK and (i <- 4) do
begin
OK := pos( wrd[i], s ) <> 0:
Глава 11. Строковый тип 223
1 := 1 + 1
end:
if OK
then writelnC ’предположение верно’ )
else writelnC 'предположение не подтвердилось' ):
readln
end. { check }
Задание 6
Решение:
program example:
uses Crt:
const
kbEsc = #27:
kbEnter = #13:
kbLeft - #75:
kbRight = #77:
kbUp = #72:
kbDown = #80:
maxX = 80:
maxY = 23:
type
key = (left, right, up. down, symbol):
var
x. у : integer:
c : char:
action : key:
lowX. lowY, highX, highY : integer:
function key_type( var ch : char ) : key:
begin
ch := ReadKey:
if ord( ch ) = 0
then
begin
ch := ReadKey:
case ch of
kbLeft : key_type :e left:
kbRight : key_type := right:
kbUp : key_type := up:
kbDown : key_type := down
else
end: { case }
end { if }
else key_type :- symbol
end:{ key_type }
function replace ( ch : char ) : char:
const
strLen = 92:
charFrom : string[strLen] =
’'1234567890'+
'qwertyuioptlasdfghjkl:’’zxcvbnm'+
',./-»’~!@#$Г&*()’+
'QWERTYUIOP[]ASDFGHJKL:'’ZXCVBNM'+
224 Приложение 1. Ответы и решения
charTo : string[strLen] =
’ё1234567890’ +
'йцукен гшщзхъфывапролджэячсмитьбю.+
’Ё1234567890'+
’ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ?..';
var
Stop : boolean;
i : Integer;
begin
Stop ;= false;
1 :« 1;
while not Stop and (i <= strLen) do
begin
if CcharFrom[i] = ch) or CcharTo[i] = ch)
then Stop :« true
else inc( i );
end;
if Stop
then replace := charTo[i]
else replace : = ’ '
end;{ replace }
begin
x := whereX;-
у := whereY;
lowX ;= 1;
lowY ;= 1;
highX := maxX - lowX + 1;
highY ;= maxY - lowY + 1;
repeat
action ;= key_type( c );
case action of
left : if x > lowX then x := x - 1;
right : if x < highX then x := x + 1;
up : if у > lowY then у := у - 1;
down : if у < highY then у ;= у + 1;
el se
end; { case }
if action = symbol
then writeC replaceC c ) )
else GotoXYC x. у );
until (c = kbEsc) or (c s kbEnter);
end.{ example }
Глава 12. Записи, оператор присоединения
Задачи, упражнения, программы
Задание 1
Ответы:
а)
type Цена = record
рубли: integer;
копейки: 0 .. 99
end;
Глава 12. Записи, оператор присоединения 225
Ь)
type Время - record
часы: 0 .. 23:
минуты, секунды: 0 .. 59
end:
с)
type Дата - record
число: 1 .. 31:
месяц: 1 .. 12:
год: integer
end:
d)
type
Строка = array [1..20] of char;
Адрес “record
город, улица: Строка:
дом. квартира: 1 .. 999
end:
е)
type
Строка = array [1..20] of char;
ДеньНедели = (пн. вт. ср. чт. пт. сб. вс):
Время «record
часы: 0 .. 23:
минуты: 0 .. 59
end:
Семинар = record
предмет, преподаватель: Строка;
день: ДеньНедели;
часы: record
начало, конец: Время
end;
номер_группы: 1 .. 300;
аудитория: integer
end;
Задание 4
Правильный ответ — Ь.
Задание 7
Решение:
type
pole “ record
ver: ( a. b. c. d. e. f. g. h ):
hor: 1 .. 8
end:
c)
{ Ход коня }
function HodKonyaC nl. n2 : pole ): boolean;
begin
HodKonya :“ (abs( ord( nl.ver ) -
ord( n2.ver ) ) - 2) and
(abs( nl.hor - n2.hor ) “ 1) or
(abs( ord( nl.ver ) -
ord( n2.ver ) ) - 1) and
8 Зак. 906
226 Приложение 1. Ответы и решения
(abs( nl.hor - n2.hor ) = 2)
end;{ HodKonya }
d)
{ Ход ферзя }
function HodFerzyaC nl. n2 : pole ); boolean;
begin
HodFerzya (nl.hor = n2.hor) or
(nl.ver = n2.ver) or
CabsC nl.hor - n2.hor ) =
abs( ord( nl.ver ) -
ord( n2.ver ) ))
end;{ HodFerzya }
Задание 8
Решение:
program MaxLengthRiver;
const
MaxLen » 15; {Максимальная длина названия реки}
MaxRiver » 30; {Максимальное количество рек}
type
{ Тип 'Строка’ }
tString = array [0..MaxLen] of char;
tRiver « record { Тип 'Река' }
Name; tString; { название }
Len: Integer { длина }
end;
{ Тип 'Массив рек' }
tAlIRiver e array [1..MaxRiver] of tRiver;
var
Riv: tAlIRiver; { Массив рек }
i. n: 1..MaxRiver;
j; integer;
{ Процедура печати названия самой длинной реки }
procedure MoreLengthC riv : tAlIRiver );
var
i, IndMax: 1..MaxRiver;
j; 1..MaxLen;
begin
{ определение индекса самой длинной реки в массиве }
IndMax 1;
for i 2 to n do
if riv[i].len > riv[IndMax].len then IndMax := i;
{ Печать названия этой реки }
with riv[IndMax] do
for j != 1 to ord( Name[0] ) do
writeC Name[j] );
writeln
end;{ MoreLength }
begin
{ ввод количества рек }
writelnC 'Введите количество рек',
z '(от 1 до '. MaxRiver, ')' );
readlnC n );
{ ввод массива рек }
for i 1 to n do
begin
{ ввод названия реки }
writelnC 'Введите название реки' );
Глава 12. Записи, оператор присоединения 227
j := 0;
while not eoln and (j < MaxLen) do
begin
j :» j + 1:
read( riv[i].name[j] )
end;
readln;
{ определение длины названия реки }
riv[i].name[0] ;- chr( j );
{ ввод длины реки }
writelnC 'Введите ее длину' );
readlnC riv[i].len )
end;
{ вывод результатов }
writeC 'Самая длинная река ' );
MoreLengthC riv );
readln
end.{ MaxLengthRiver }
Задание 11
Решение:
с)
type
{ Имена }
Name e (Vacya. Volodya, Ira, Lida,
Marina, Misha. Natasha,
Oleg, Olya, Sveta. Yulya);
Data = record { Тип 'Данные о человеке' }
sex: (male, female); { пол }
rost: 140..200; { рост }
end;
Group » array [Name] of Data; { Тип 'Группа' }
function EqualRostCvar Gr : Group); boolean;
var
namel, name2; Name;
flag: boolean;
begin
flag := false;
namel : = Vacya;
while ( namel < Yulya ) and not flag do
begin
name2 :e namel;
repeat
name2 succC name2 );
flag :» Gr[namel].rost » Gr[name2]-.rost
until flag or ( name2 = Yulya );
namel :» succC namel )
end;
Equal Rost :» flag
end;{ Equal Rost }
Задание 13
Решение:
a)
const
LenStr - 16:
228 Приложение 1. Ответы и решения
MaxQuantPerson « 10:
type
tString = array [O..LenStr] of char:
date = record
day: 1..31:
month: 1..12:
year: 1901..1997
end:
tPerson = record
SecondName: tString:
Sex: (Male. Female):
Birthday: date
end:
tGroupe = array [1..MaxQuantPerson] of tPerson:
{ Функция для определения самого старшего мужчины в группе Gr. Если мужчины есть,
то возвращается значение true, в противном случае false. Самым старшим считается
мужчина, у которого наименьшая дата рождения. Если таких (старших) мужчин несколько,
то переменной SecName присваивается имя первого из них по списку. }
function Oldest( var Gr: tGroupe:
var SecName: tString ): boolean:
var
1. k: Integer:
{ функция сравнения двух дат:
возвращает значение true, если dl меньше d2 }
function LessThen( dl. d2: date ): boolean:
begin
LessThen := ( dl.year < d2.year ) or
((dl.year = d2.year) and
(dl.month < d2. month)) or
((dl.year = d2.year) and
(dl.month = d2. month) and
(dl.day < d2.day))
end:{ LessThen }
begin
{ поиск первого мужчины из группы }
1 :* 1:
while (1 <e MaxQuantPerson ) and
(Gr[i].Sex <> Male) do
1 := 1 + 1:
{ если мужчина не найден,
присваиваем имени функции false }
if 1 > MaxQuantPerson
then Oldest := false
{ если мужчина найден }
else
begin
{ поиск самого старшего }
for k :- i + 1 to MaxQuantPerson do
if (Gr[k].Sex e Male) and
LessThen( Gr[k].birthday.
Gr[i].birthday )
then i := k:
{ запоминание фамилии }
Oldest := true:
SecName :» Gr[i].SecondName:
end
end:{ Oldest }
Глава 12. Записи, оператор присоединения 229
Задание 16
Ответ:
z = (l,-l)
w = (0,-1)
Р = (2,2)
re = 2
Задание 17
Решение:
с)
type
tNatDig = 1..Maxint:
TracDig » record
chi si: integer:
znam: tNatDig
end:
procedure Sokr( var r: tRacDig ):
var
k: tNatDig:
{ Функция, возвращающая наибольший общий
делитель двух чисел }
function NOD( a, b: tNatDig ): tNatDig:
begin
repeat
if a<b
then b := b-a
else a :- a-b
until a = b:
NOD :» b
end:{ NOD }
begin
if r.chisl о 0 then
begin
with r do
Ijegin
k :- N0D( abs( Chi si ). znam ):
chisl :- chisl div k:
znam := znam div k
end
end
end:{ Sokr }
Задание 19
Решение:
a)
program ComplexExp;
const
CompPrec e le-10:
type
complex - record
re. im: real
end:
230 Приложение 1. Ответы и решения
var
Eps : real:
z, res : complex:
{ Функция для определения модуля комплексного числа }
function AbsComplex( z: Complex ): real:
begin
AbsComplex :» sqrt( sqr( z. re ) + sqr( z. Im ))
end:{ AbsComplex }
{ Процедура сложения двух комплексных чисел }
procedure AddComplexC zl. z2: Complex:
var res:Complex ):
begin
res.re :- zl.re + z2.re:
res.im :- zl.im + z2.im
end:{ AddComplex }
{ Процедура умножения двух комплексных чисел }
procedure MultyComplexC zl. z2: Complex:
var res:Complex );
begin
res.re :- zl.re * z2.re - zl.im * z2.im:
res.im :- zl.re * z2.im + zl.im * z2.re
end:{ MultyComplex }
{ Процедура деления комплексного числа на вещественное }
procedure DivComlToReaK var z: Complex: c: real ):
begin
if c < CompPrec
then writelnC 'На ноль делить нельзя' )
else
begin
z.re := z.re / c:
z.im := z.im / c
end
end:{ DivComlToReal }
{ Процедура вычисления экспоненты комплексного числа }
procedure ExpComplex( z: Complex: Eps: real:
var Res: Complex ):
var
CurZ: Complex:
i: real:
begin
Res.re :- 1:
Res.im :» 0:
CurZ :- z:
i := 1:
while AbsComplexC CurZ ) >» Eps do
begin
AddComplexC Res. CurZ. Res ):
i :-i +1:
MultyComplexC CurZ. Z. CurZ ):
DivComlToReaK CurZ. i )
end
end:{ ExpComplex }
begin
{ Ввод комплексного числа z }
writelnC 'Введите комплексное число' ):
writeC 'Вещественная часть: ' ):
Глава 12. Записи, оператор присоединения 231
readlnC z. re );
writeC ’Комплексная часть: ' );
readlnC z. im ):
{ Ввод точности вычислений }
writelnC ’Введите Eps - точность вычислений’.
’( Eps > 0 )’ ):
repeat
writeC 'Eps -’ );
readlnC Eps ):
if Eps <= 0 then
writelnC 'Неправильно. Повторите ввод.' )
until ( Eps > 0 ):
{ Вычисление экспоненты комплексного числа }
ExpComplexC z. Eps. res ):
{ Вывод результатов }
writeC 'Экспонента равна '. res.re:5:2 );
if res.im >= 0 then writeC ' + ' ):
writeC res.im:5:2 . ’*i’ ):
readln
end.{ ComplexExp }
Задание 20
Решение:
с)
const
MaxN - 20:
type
tReal =record
Sign: boolean:
Mant: real:
Dec: integer
end:
tIndex - 1..MaxN:
tList = array [tlndex] of tReal:
{ Процедура приводит все числа из списка List к виду, в котором порядок равен FixDec }
procedure EqualDecC var List: tList:
FixDec: integer );
var
i: tlndex:
k . Maxk: integer:
begin
for i :- 1 to MaxN do
begin
{ если фиксированный порядок больше текущего }
if FixDec > List[i].Dec
then
{ делим на 10 в нужной степени }
for k :« 1 to FixDec - List[i].Dec do
List[iJ.Mant :» List[i].Mant / 10
else
{ иначе умножаем на 10 в нужной степени }
for k := 1 to List[i].Dec - FixDec do
List[i].Mant :« List[i].Mant * 10:
{ Переопределяем порядок текущего числа }
List[i].Dec :e FixDec
end
232 Приложение 1. Ответы и решения
end:{ Equal Dec }
Задание 36
Решение:
type Coordinate = record
case Kind : (Decant, Polar) of
Decart : (x. y: real);
Polar : (r: real; Fi: real)
end;
function DistanceC a. b; Coordinate ); real;
var
d; real;
begin
case a.Ki nd of
{ Если точка а задана декартовыми координатами }
Decart:
case b.kind of
{ Если точка b задана декартовыми
координатами }
Decart: d : = sqrt( sqr( a.x - b.x ) +
sqr( a.у - b.y ) );
{ Если точка b задана полярными
координатами }
Polar: d := sqrt( sqr( a.x -
b.r * cos( b.fi )) +
sqr( a.у - b.r * sinC b.fi ))):
end;
{ Если точка а задана полярными координатами }
Polar:
case b.kind of
{ Если точка b задана декартовыми
координатами }
Decart: d : = sqrt( sqr( a.r * cos( a.fi ) -
b.x ) + sqr( a.r *
sin( a.fi ) - b.y ) );
{ Если точка b задана полярными
координатами }
Polar: d sqrt( sqr( a.r ) + sqr( b.r ) -
2 * a.r * b.r *
cos( a.fi - b.fi ) )
end
end;
Distance := d
end;{ Distance }
Глава 13. Множества
Упражнения, задачи, программы
Задание 3
Ответы:
а) ВсеДниНедели = set of ДеньНедели;
b) РабочиеДни = set of пн .. пт.
Глава 13. Множества 233
Задание 5
Ответ: множествами являются конструкции a, b, с, d, е, f.
Задание 6
Ответы:
а) [ 9. 2. 7 .. 8 ];
Ь) [ 4 .. 21 ];
с) [ 4. 7. 20. 21 ].
Задание 8
Ответы:
Результатом выполнения отношений b, с, е, g, h, i, к является true.
Результатом выполнения отношений a, d, f, j является false.
Задание 10
Ответы:
а) неправильно;
Ь) не правильно;
с) неправильно;
d) правильно;
е) правильно;
f) неправильно.
Задание 12
Ответы:
а) [ 3 .. 5. 7 .. 10. 13 ];
Ь) [ 2. 3. 5. 7 ];
с) [ ].
Задание 13
Ответы:
а) [];
Ь) А*В;
с) А*В;
d) А+В.
Задание 16
Решение:
program LettersCount:
const
MaxLen = 80: { максимальная длина текста }
eot = *.': { признак окончания ввода }
234 Приложение 1. Ответы и решения
type
TLetter - set of char;
TStr - array [1..MaxLen] of char;
var
Str; TStr;
StrLen; O..MaxLen; { длина введенной строки }
Count; 0..MaxLen; { счетчик букв }
i; O..MaxLen;
Letter; TLetter;
begin
{ инициализация множества }
Letter := [ 'A' .. 7'. ‘a’ .. 'z' ];
{ ввод текста }
writelnC 'Введите текст* );
1 ;= 0:
repeat
1 1 + 1;
readC str[1] )
until ( 1 - MaxLen ) or ( Str [ 1 ] - eot );
if Str[i] - eot
then StrLen := 1 - 1
else StrLen :« 1;
{ обработка текста }
count ;» 0;
for 1:=1 to StrLen do
if Str[1] in Letter then count : = count + 1;
{ вывод результатов }
writelnC 'Количество английских букв
'в тексте равно « count )
end. { LettersCount }
Задание 17
Решение:
а)
program Find;
const
MaxLen » 80; { максимальная длина текста }
eot » '.'; { признак окончания ввода }
type
TLetter = set of char;
TStr - array [I..MaxLen] of char;
var
Str; TStr; { строка }
StrLen: 0..MaxLen; { длина введенной строки
1 : 0..MaxLen; { множество букв слова 'шина' ;
Letter: TLetter;
{ флаг, который принимает значение true, }
{ если в строке есть буквы из слова 'шина', }
{ false - в противном случае }
flag: boolean;
begin
{ инициализация множества }
Letter :» [ 'ш’. 'и'. 'н’, 'а' ];
{ ввод текста }
writelnC 'Введите текст’ );
1 :- 0;
repeat
Глава 13. Множества 235
1 := 1 + 1;
readC str[1] )
until ( 1 = MaxLen ) or ( Str [ i ] = eot ):
if Str[i] = eot
then StrLen := i - 1
else StrLen := i;
{ обработка текста }
1 :» 0;
repeat
1 := 1 + 1;
flag := Str [ 1 ] in Letter
until ( i = StrLen ) or flag:
{ вывод результатов }
if flag
then writelnC 'В тексте есть буквы,
'входящие в слово, "шина"’ )
else writelnC ’В тексте нет букв, ',
'входящих в слово "шина"' )
end. { Find }
Задание 18
Решение:
{ В данном примере строка представлена в виде }
{ массива символов, 0-й элемент, которого }
{ зарезервирован для хранения длины строки }
const
MaxLen = 80: { максимальная длина текста }
eot = ’.': { признак окончания ввода }
type
TStr = array [0..MaxLen] of char:
procedure DifferentLettersC var str: TStr ):
var
InputLetters: set of char:
i: 0..MaxLen:
begin
InputLetters := []:
i := 0:
repeat
i : - 1 + 1;
repeat
readlnC str[i] ):
if str[i] in InputLetters
then writeln
(
'Символ ', str[i],
' был введен ранее. ',
'Повторите ввод.'
):
until not ( str[i] in InputLetters ):
InputLetters InputLetters + [ str[i] ]:
until ( i = MaxLen ) or ( str[i] - eot ):
if str[i] = eot
then str[0] := chr( i-1 )
else str[0] := chr( i )
end: { DifferentLetters }
236 Приложение 1. Ответы и решения
Задание 21
Решение:
program Number:
const
n » 4:
var
error: boolean:
digits: set of 'O’..*9':
c: char:
num, d. 1: i nteger:
begin
writelnC 'Введите последовательность символов: ’):
error := false:
digits := [ 'O'..'9' ]:
num := 0:
1 1:
while not eoln and not error and ( 1 <= n ) do
begin
readC c ):
if c in digits
then
begin
d := ord(c) - ord('O’):
num num * 10 + d
end
else error true:
i 1 + 1:
end: { while }
readln:
if error
then writelnC 'Преобразование невозможно:
'символ " ', с.
"'не является цифрой')
else writelnC 'Полученное число » ', num ):
readln
end. { Number }
Задание 23
Решение:
procedure Print ( A: TLetter );
var ch: char:
begin
for ch :» 'a' to 'z' do
if ch in A then writeC ch )
end:
Задание 24
Решение:
program Greater:
const
MaxLen - 80: { максимальная длина текста }
eot признак окончания ввода }
type
TLetter » set of char:
TStr » array [1..MaxLen] of char:
var
Глава 13. Множества 237
Str: TStr: { строка }
StrLen: 0..MaxLen: { фактическая длина строки }
1: 0..MaxLen:
{ счетчики гласных и согласных букв }
countGL. countSGL: 0..MaxLen;
{ множества гласных и согласных букв }
LetGL. LetSGL: TLetter:
begin
{ инициализация множества гласных букв }
LetGL := [ ’а', 'е'. '1'. 'о'. ’и’ ];
{ инициализация множества согласных букв }
LetSGL := [ ’a'..'z' ] - LetGL:
{ ввод текста }
writelnC ’Введите текст' );
1 := 0:
repeat
i := i + 1;
readC str[1] )
until ( i = MaxLen ) or ( Str [ i ] = eot ):
if Str[i] = eot
then StrLen := 1 - 1
else StrLen := 1;
{ обработка текста }
i := 0:
countGL := 0:
countSGL := 0;
for 1 := 1 to StrLen do
begin
if str[i] in LetGL
then countGL : = countGL + 1:
if Str[i] in LetSGL
then countSGL :» countSGL + 1
end:
{ сравнение и вывод результатов }
if countGL » countSGL
then writelnC 'Количества гласных
'и согласных букв равны')
el se
if countGL > countSGL
then writelnC 'Гласных букв больше' )
else writelnC 'Согласных букв больше' ):
readln
end. { Greater }
Задание 25
Решение:
с)
program Order;
const
MaxLen ” 80; { максимальная длина текста }
eot = '.'; { признак окончания ввода }
type
TLetter = set of char;
TStr = array [1..MaxLen] of char;
var
Str: TStr; { строка }
StrLen: 0..MaxLen; { фактическая длина строки }
i: 0..MaxLen;
238 Приложение 1. Ответы и решения
Once, Twice: TLetter;
begin
{ инициализация множества букв, которые }
{ встречаются один раз в тексте }
Once [];
’ инициализация множества букв, которые }
встречаются 2 и более раз в тексте }
"wice [];
{ ввод текста }
writelnC 'Введите текст' );
i := 0;
repeat
i :e i+1;
readC str[i] )
until ( i e MaxLen ) or ( Str[i] » eot );
readln;
if Str[i] « eot
then StrLen :» i - 1
else StrLen : = i;
{ обработка текста }
for i 1 to StrLen do
begin
if Str[i] in Once
then Twice :- Twice + [ Str[i] ]
else Once ;- Once + [ Str[i] ]
end;
Once Once - Twice;
{ печать результатов }
i :e0;
while Once<>[] do
begin
i i + 1;
if Str[i] in Once then
begin
Once Once - [ Str[i] ];
writeC Str[i]. ’ ' )
end
end;
end. { Order }
Задание 26
Решение:
О
program VowellsAbsent;
const
MaxLen - 80; { максимальная длина текста }
eot - '.'; { признак окончания ввода }
type
TLetter - set of char;
TStr - array [1..MaxLen] of char;
var
Str: TStr; { строка }
StrLen: 0..MaxLen; { фактическая длина строки }
i: 0..MaxLen;
Once, Twice, Words: TLetter;
ch: char;
begin
Глава 13. Множества 239
{ инициализация множества букв, которые }
{ встречались в тексте }
Once
{ инициализация множества букв, которые }
{ встречаются в двух и более словах}
Twice := [];
{ ввод текста }
writelnC 'Введите текст' );
i : = 0;
repeat
i : = i+1;
readC str[i] )
until ( i = MaxLen ) or ( Str[i] = eot );
readln;
if Str[i] = eot
t hen StrLen :» i - 1
else StrLen := i;
{ обработка текста }
i := 1;
repeat
{ пропуск запятых }
while (i <= StrLen) and (str[iJ » ',’) do
i := i+1;
{ обработка слова }
words := [];
while (i <» StrLen) and (str[iJ <> '.') do
begin
words :» words + [ str[i] ];
i:= i+1
end;
twice ;= twice + words * once;
once once + words
until (i >« StrLen);
{ выбор только звонких согласных букв }
twice;» twice * [ 'б', 'в', 'г', 'д', 'ж', 'з', 'л', 'м'. 'н', 'р' ];
{ печать результатов } ;
for ch :» chr(128) to chr(255) do
• if ch in twice then writeC ch. ' ' );
end. { VowellsAbsent }
Задание 29
Решение:
program OneOrTwo;
const
MinDig - 1; { минимально возможное число }
MaxDig - 50; { максимально возможное число }
type
TRange - MinDig..MaxDig;
{ множество возможных чисел }
TSetRange - set of TRange;
var
i, n, Last. Current; integer;
Fib: TSetRange; { множество чисел Фибоначчи }
digit: TRange; { обрабатываемые числа }
CountFib, Count: integer;
; функция определения первой }
значащей цифры числа к }
’unction FirstDig ( к: TRange ): integer;
240 Приложение 1. Ответы и решения
var i: integer;
begin
repeat
i :e к mod 10;
к ;e к div 10
until к = 0;
FirstDig :« i
end;
begin
{ формирование множества чисел Фибоначчи. }
{ принадлежащих заданной границе чисел }
Fib [];
Last 1;
Current :•!;
repeat
Fib :« Fib + [ Current ];
Current ;= Last + Current;
Last ;« Current - Last
until Current > MaxDig:
{ ввод количества чисел, с которыми }
{ пользователь будет работать}
writelnC 'Введите количество чисел (больше 0).' );
repeat
readlnC n );
if n <- 0 then
writeln ( 'Данные введены неправильно.'.
' Повторите ввод.')
until (n > 0);
{ ввод чисел }
Count;-0;
CountFib;-0;
writeC 'Вводите числа в границах от ' );
writelnC MinDig. ' до '. MaxDig );
for i :» 1 to n do
begin
readC digit );
if digit in Fib
then countFib := CountFib + 1;
if FirstDigC digit ) in [1.2]
then count count + 1
end;
{ вывод результатов }
writeln;
writeln ( 'Количество чисел Фибоначчи равно '.
CountFib ):
write ( 'Количество чисел с первой значащей');
' цифрой, равной 1 или 2. равно '.
Count );
readln
end. { OneOrTwo }
Задание 32
Решение:
function Sum (var A: matrix; SI. S2; num): real;
var
summa: real;
i. j: number;
begin
summa :» 0;
Глава 13. Множества 241
for i := 1 to n do
if 1 in SI then
for j := 1 to n do
if j in s2 then
summa := summa + A[i. j]:
Sum := summa;
end:
Задание 33
Ответ:
A :« A + В;
В := A - В;
A :» A - В
Задание 35
Решение:
a)
function Digit( n: NatDig ): integer;
var
count. 1: integer;
SetDig: set of 0..9;
begin
SetDig := []; { инициализация* множества }
count;= 0;
{ обработка числа }-
repeat
i ;= n mod 10:
n := n div 10;
if not (i in SetDig) then
begin
count := count + 1;
SetDig := SetDig + [ i ]
end
until n = 0:
Digit := count
end; { Digit }
Задание 36
Решение:
program InRange:
const
MinDig = 1; { минимально возможное, число }
MaxDig = 10000; { максимально возможное число }
MaxSizeSet = 256; { максимальный размер мн-ва }
SizeSet = MaxDig div
MaxSizeSet; { размер массива множеств }
MinM = 0;
MinN = 0;
type
TRange = MinDig..MaxDig:
TSet = set of 0..MaxSizeSet - 1:
TArraySet = array [0..SizeSet] of TSet:
var
ArraySet: TArraySet; { массив множеств }
242 Приложение 1. Ответы и решения
т, п: 0..MaxDig:
МтпМ, МахМ. Digit, j: integer:
{ определение максимального N }
function MaxN ( т: integer): integer:
var h: integer:
begin
h := round( sqrt( MaxDig - sqr(m) ) ):
if m > h
then MaxN : = h
else MaxN := m
end:
begin
{ инициализация массива множеств }
for j := 0 to SizeSet do
ArraySetEj]
{ определение максимально возможного значения х }
МахМ := round( sqrt( MaxDig ) ):
{ перебор всех чисел, которые попадают в }
{ заданные границы, причем без повторений. }
{ которые могут получиться из-за перестановки }
{ значений тип}
for m:=MinM to МахМ do
for n:= Mi nN to MaxN(m) do
begin
{ вычисление числа }
digit := sqr(m) + sqr(n);
if (digit >e MinDig) and
(digit <= MaxDig) then
begin
{ вычисление индекса элемента массива. }
{ в котором содержится данное число }'
j := digit div MaxSizeSet:
{ вычисление положения чисра }
{ в множестве }
digit :e digit mod MaxSizeSet:
ArraySetEj] : = ArraySetEj] + E digit ]
end
end:
{ печать элементов множества }
for Digit :- MinDig to MaxDig do
begin
{ вычисление индекса элемента массива. }
{ в котором содержится данное число }
j :- digit div MaxSizeSet:
{ вычисление положения числа в множестве }
digit :- digit mod MaxSizeSet:
'{ есть ли элемент в множестве? }
if digit in ArraySetEj]
then writeC digit + j * MaxSizeSet. ’ ’ )
end:
readln
end. { InRange }
Задание 39
Решение:
type
Name - ( Vacya. Volodya. Ira, Lida. .
Marina. Misha. Natasha. Oleg.
Глава 13. Множества 243
Olya, Sveta, Yulya );
Guests = set of Name;
Group - array [Name] of Guests;
function Everywhere ( Gr: Group ): boolean;
var
namevar; Name;
result; Guests;
begin
result ;= [ Vacya .. Yulya ];
for namevar :» Vacya to Yulya do
result ;= result * ( Grfnamevar] + [namevar] );
Everywhere := ( result <> [] )
end; { Everywhere }
Задание 41
Решение:
{ Вычисление определителя матрицы }
program Determinant;
const
MaxN - 15; { максимальный размер матрицы }
type
Index - l..MaxN; { индекс матрицы }
TMatrix - array [Index. Index ] of real;
TIndexes = set of Index; { множество индексов }
var
matrix: TMatrix;
n, i. j: Index;
{ рекурсивная функция для вычисления определителя }
{ матрицы, полученной удалением 1 первых строк и }
{ тех столбцов, номера которых есть в множестве s }
function Det( L: integer; S: TIndexes ): real;
var
j ; Index;
c ount: real;
c oef; -1 .. 1;
begin
{ если осталась матрица размерности 1x1 }
i f L - n - 1
then
begin
j :- 1;
while j in S do j :- j + 1;
Det matrix[n, j];
end
else
{ если матрица размерности больше 1 }
begin
count :- 0;
Coef :- -1:
{ вычисление по формуле }
for j :- 1 to n do
if not (j 1n s) then
begin
coef -coef;
count:- count + coef *
matrix[ 1+1, j ] *
244 Приложение 1. Ответы и решения
DetC 1+1. s+[j] )
end;
Det:= count
end
end;
begin
{ ввод реальной размерности матрицы }
writelnC ‘Введите размерность матрицы'.
‘ (от 1 до '. MaxN. ')’ );
readlnC n );
{ ввод матрицы }
writelnC 'Введите матрицу’ );
for 1 ;= 1 to n do
for j :=1 to n do
readC matrix[i,j] );
readln;
{ подсчет и печать значения определителя }
writelnC 'Определитель равен '.
DetC 0. [] ); 5; 2 );
end. { Determinant }
Глава 14. Файлы
/
Упражнения, задачи, программы
Задание 1
Решение:
program CreatelntegerFiIе;
const
Marker = 9999;
var
f; file of integer; { создаваемый файл }
a; integer; { буфер для ввода }
begin
rewriteC f );
writeln
(
'Введите числа. '.
'Признаком конца последовательности '.
'является число '. Marker
);
readlnC а );
while а <> Marker do
begin
writeC f. a );
readlnC a )
end;
closeC f );
writelnC 'файл создан' )
end. { CreatelntegerFiIe }
Задание 8
Решение:
program MaxInAB;
Глава 14. Файлы 245
var
f; file of integer; { заданный файл }
a. b: Integer; { заданный интервал поиска }
x: integer; { буфер для ввода }
max; integer; { искомое максимальное значение }
fl; boolean; { флаг для поиска }
begin
reset(f);
repeat
writelnC 'Введите интервал для поиска' );
writeC 'а = ' ); readlnC а );
writeC 'b= ’ ); readlnC b );
until а < b;
{ поиск первого числа из [а, Ь] }
fl ;= true;
while not eof( f ) and fl do
begin
readC f, x );
if ( x >= a ) and ( x <= b )
then { нашли первое число из [а. b] }
begin
max ;= х;
fl := false
end
end;
{ поиск максимального числа, принадлежащего }
{ [а. Ь]. в оставшихся числах файла }
while not eof( f ) do
begin
readC f. x );
if ( x >= a ) and ( x <= b ) then
if max < x then max : = x
end;
closeC f );
if fl
then writelnC ’чисел из интервала [’.
a. '. '. b, '] в файле нет')
else writelnC ’максимальное значение. ’.
'принадлежащее интервалу [’.
а. ’. ' , Ь. ']. равно ’, max)
end. { MaxInAB }
Задание 12
Решение:
program NegativPositivFiles;
var
fl. { входной файл }
f2. f3: file of integer; { выходные файлы }
a: integer; { буфер для ввода }
emf2. emf3: boolean; { флаги пустого файла }
begin
{ инициализация }
reset( fl );
rewrite( f2 );
rewriteC f3 );
emf2 := true; { файл f2 пуст ;
emf3 := true; { файл ТЗ.пуст
{ чтение и анализ значений входного файла }
246 Приложение 1. Ответы и решения
while not eof( fl ) do
begin
readC fl. a );
if a > 0 then
begin
writeC f2. a ):
emf2 := false
end;
if a < 0 then
begin
writeC f3. a );
emf3 := false
end
end:
closeC fl );
closeC f2 );
closeC f3 );
{ вывод результатов }
if not emf2 and not emf3
then writelnC 'оба файла созданы' )
else
begin
if emf2 then
writelnC 'положительных чисел в исходном файле нет'):
if emf3 then
writelnC 'отрицательных чисел в исходном файле нет')
end
end. { NegativPositivFi1es }
Задание 16
Решение:
program Merge;
var
fl. f2. { входные файлы }
f3: file of integer; { файл-результат }
rdfl, rdf2: boolean; { флаги прочтения записи }
al. a2. a3: integer;
begin
{ инициализация }
reset( fl ):
reset( f2 );
rewriteC f3 );
if not eof( fl )
then
begin
readC fl. al );
rdfl := true
end
else rdfl := false:
if not eof( f2 )
then
begin
readC f2. a2 );
rdf2 := true
end
else rdf2 ; = false;
{ объединяем значения, если файлы непустые }
while rdfl and rdf2 do
Глава 14. Файлы 247
begin
{ выбираем из двух очередных }
{ значений меньшее }
if al < а2
then
begin
аЗ := al;
if not eof( fl )
then read( fl. al )
el se
begin
rdfl := false;
writeC f3, a3 );
аЗ ;= a2
end
end
el se
begin
a3 := a2;
if not eof( f2 )
then readC f2. a2 )
else
begin
rdf2 := false;
writeC f3. a3 );
аЗ := al
end
end;
writeC f3. a3 )
end;
while not eof( fl ) do
begin
readC fl. al );
writeC f3. al )
end;
while not eof( f2 ) do
begin
readC f2. a2 );
writeC f3. a2 )
end;
closet fl );
closet f2 );
closet f3 )
end. { Merge }
Задание 31
Решение:
program Anketa;
const
{ максимальная длина названия предмета }
Inname = 26;
type
sub « ( MA. A. I. NM. DE. PT. FA );
{ тип предметов: }
{ MA - математический анализ }
{ А- алгебра }
{ I - информатика }
248 Приложение 1. Ответы и решения
{ NM - численные методы }
{ DE - дифференциальные уравнения }
{ РТ - теория вероятности }
{ FA - функциональный анализ }
quest = array [sub] of boolean;
name = string [Inname]; { название предмета }
var
ans: quest; { заполняемый экземпляр анкеты }
fin; char; { флаг*окончания ввода }
names; array [sub] of name; { названия предметов }
fquest: file of quest; { создаваемый файл }
res; char; { ответ }
k: sub;
begin
{ инициализация }
rewriteC fquest );
names[MA] : = 'математический анализ';
names[A ] := 'алгебра';
names[I ] := 'информатика';
names[NM] := 'численные методы’f
names[DE] := 'дифференциальные уравнения':
names[PT] := 'теория вероятности';
names[FA] ^’функциональный анализ';
writelnC 'добавить запись в файл?' );
writelnC 'д - да, любое другое значение - нет' );
readlnC fin );
while fin в 'д’ do
begin
- writelnC 'вводите ответы очередной анкеты:'-):
writelnC 'д - да, любое другое '.
'значение - нет' );
for k := МА to FA do
begin
writeC names[k], ' -> ' );
readlnC res );
ans[k] ;= ( res = 'д’ )
end;
writeC fquest. ans );
writelnC 'добавить запись в файл?' );
writelnC 'д - да, любое другое значение - нет' );
readlnC fin )
end;f{ while }
closeC fquest )
end. { Anketa }
Задание 33
Решение:
program PopularSub;
const
{ максимальная длина названия предмета }
Inname = 26;
type
sub = ( MA. A, I. NM, DE. PT. FA );
{ тип предметов: }
{ MA - математический анализ }
{ А - алгебра }
{ I - информатика }
Глава 14. Файлы 249
{ NM - численные методы }
{ DE - дифференциальные уравнения }
{ РТ - теория вероятности }
{ FA - функциональный анализ }
quest = array [sub] of boolean;
name = string [Inname]; { название предмета }
var
ans; quest: { заполняемый экземпляр анкеты }
fquest; file of quest; { обрабатываемый файл }
{ счетчики для каждого предмета }
count:.array [sub] of integer;
all: integer; { общее количество анкет }
{ максимальное число положительных оценок }
max: integer;
names: array [sub] of name: { названия предметов }
cm: integer; { счетчик максимальных значений }
k. j: sub;
begin
{ инициализация }
reset( fquest );
names[MA] : = 'математический анализ';
names[A ] := 'алгебра';
names[IJ : = 'информатика';
names[NM] : = 'численные методы’;
names[DE] : = 'дифференциальные уравнения':
names[PT] : = 'теория вероятности’:
names[FA] := 'функциональный анализ';
for k := МА to FA do
count[k] := 0:
all := 0;
{ вычислить количество положительных }
{ оценок для каждого предмета }
while not eof( fquest ) do
begin
read( fquest. ans );
all := all + 1;
for k ;• MA to FA do
if ans[k] then count[k] : = count[k] + 1
end;
closeC fquest );
{ найти максимальное число }
{ положительных ответов }
max := 0;
cm := 0:
for k := MA to FA do
if count[k] > max
then
begin
max :e count[k];
cm := 1;
j := k
end
else
if count[k] = max then cm := cm + 1;
if max = 0
then
writelnC 'ни один предмет не получил положительной оценки')
el se
if cm = 1 then
250 Приложение 1. Ответы и решения
{ предмет с максимальной оценкой один }
begin
writeC 'Наилучшую оценку получил ' );
writelnC 'курс , names[j], "" )';
writelnC 'Всего ответов '. all*,
' из них положительных - '. max )
end
el se
{ предметов несколько }
begin
writelnC 'Наилучшую оценку '. max, из '.all,
' получили предметы:' );
for k := МА to FA do
if count[к] » max
then writelnC names[k] )
end
end. { PopularSub }
Задание 61
Решение:
program EmptyLines:
var
f : text; { исходный файл }
count : integer; { счетчик пустых строк }
begin
reset( f );
count 0;
while not eof( f ) do
begin
if eolnC f ) then count :- count + 1;
readlnC f ) { пропуск строки }
end;
writelnC 'Количество пустых строк в файле равно ', count );
closet f )
end. { EmptyLines }
Задание 62
Решение:
program Copy;
var
fl, { входной файл }
f2: text; выходной файл }
ch: char: буфер для ввода символа }
begin
{ инициализация }ч
reset( fl );
rewrite( f2 );
{ обработка }
while not eof( fl ) do
begin
{ пропуск пустых строк }
while eolnC fl ) do readlnC fl );
{ копирование непустой строки }
while not eoln(fl) do
begin
readC fl, ch );
writeC f2, ch )
Глава 14. Файлы 251
end;
readlnC fl ); пропуск конца строки в fl }
writelnC f2 ) запись конца строки в f2 }
end;
closeC fquest )
end. { Copy }
Задание 63
Решение:
program PowerLines:
var
f; text; { исходный файл }
max; integer; { максимальное количество слов в строке }
count: integer; { количество слов в очередной строке }
{ список номеров строк с максимальным количеством слов }
list: array [1..10] of integer;
klist: integer; { указатель списка номеров }
num: integer: { номер строки }
ch: char; { очередной символ }
i. p: integer; { индексы }
begin
{ инициализация }
resetC f );
max := 0;
num := 0;
klist := 0;
while not eof( f ) do
begin
count := 0;
num := num + 1;
while not eoln( f ) do
begin
{ пропустить пробелы }
repeat
read( f. ch )
until ( ch о ' ' ) or eoln( f );
if ch <>' ’ then count := count + 1;
{ пропустить слово }
while not eoln( f ) and ( ch<>' ’ ) do
read( f, ch )
end;
{ закончилась строка }
if count > max
then
begin
max := count;
klist ;= 1;
list[l] • = num
end
else
if count « max then
if klist < 10 then
begin
klist := klist + 1;
list[klist] := num
end;
{ пропуск конца строки }
readlnC f )
252 Приложение 1. Ответы и решения
end;
{ распечатать первые kl1st строк с }
{ максимальным количеством слов }
reset( f );
num := Г.
for i := 1 to kl1st do
begin
{ найти строку с номером 11st[1J }
p := listfi];
while p о num do
begin
readlnC f );
num := num + 1
end;
{ распечатать строку с номером 1ist[i] }
while not eolnC f ) do
begin
readC f, ch );
writeC ch )
end;
{ пропустить конец строки }
readlnC f ):
num ;= num + 1;
{ перейти на новую строку на печати }
writein
end;
closeC f )
end. { Powerlines }
Задание 87
Решение:
program Create;
const
nc = 5; { количество курсов }
ng = 6; { количество групп на курсе }
num = 30; { максимальное количество студентов в группе }
type
tree = record
num_stud; O..num; { количество студентов в группе }
num_admit; O.;num; { количество допущенных к сессии }
num_ex; 0..num; { количество сдавших на "отлично" }
{ количество сдавших на "отлично" и "хорошо" }
num_ex_good: O..num;
{ количество получивших "неудовлетворительно" }
num no sat; 0..num
end;
var
f; file of tree; { создаваемый файл }
ic; l..nc;
1g: 1..ng;
rec : tree;
begin
assignCf,'result.dat');
rewriteCf);
writelnC’ вводите информацию по итогам сессии');
for ic;=l to nc do
begin
writelnC’курс ’.ic);
Глава 14. Файлы 253
for 1g:=l to ng do
begin
writelnC‘группа 1g);
writeC'количество студентов; ');
readl n( rec. num_stiid);
writeC'допущены к сессии; ');
readlnCrec.num_adm1t);
writeC'сдали на "отлично"; ');
readln(rec.num_ex);
writeC'сдали на "хорошо" и "отлично": ');
readln(rec.num_ex_good);
writeC'неуспевающих: '):
readln(rec.num_no_sat);
writeCf.rec)
end
end:
close(f);
writelnC'файл создан')
end. { Create }
Задание 88
Решение:
program PrintInfo;
const
nc = 5; { количество курсов }
ng = 6; { количество групп на курсе }
{ максимальное количество студентов в группе }
num = 30; ' 1
type
tree = record
num_stud: O..num; { количество студентов в группе }
num_adm1t: O..num; { количество допущенных к сессии }
num_ex: O..num; { количество сдавших на "отлично" }
{ количество сдавших на "отлично" и "хорошо" }
num_ex_good: O..num:
{ количество получивших "неудовлетворительно" }
num_no_sat : 0..num
end;
var
f: file of tree; { обрабатываемый файл }
ic: 1..nc;
1g: 1..ng;
rec : tree;
Irec: byte; { номер записи о нужной группе в файле}
begin
assignCf.'result.dat');
reset(f);
writeC'курс: ');
readln(lc);
writeC'группа: '):
readln(lg):
if 1c>nc
then writelnC'неверно задан номер курса')
el se
if 1g>ng
then writelnC'неверно задан номер группы')
el se
begin
254 Приложение 1. Ответы и решения
irec : = (iic-l)*ng+(ig-l);
seek(f.irec);
read(f.rec);
writelnC'информация о результатах сессии
ig, ' группы ic. ’ курса');
writelnC'количество студентов '.
rec.num_stud);
wri teln('допущены к сессии '. rec.num_admi t);
writelnC'сдали на "отлично" '. rec.num_ex);
writelnC'сдали на "хорошо" и "отлично" '.
rec.num_ex_good);
wri teln('неуспевающих '. rec.num_no_sat);
end
end. { PrintInfo }
Задание 89
Решение:
program PrintBestlnfo;
const
nc = 5; { количество курсов }
ng « 6; { количество групп на курсе }
num = 30; { максимальное количество студентов в группе }
type
tree = record
num_stud: O..num; { количество студентов в группе }
num_admit: O..num; { количество допущенных к сессии }
пш_ех: O..num; { количество сдавших на "отлично" }
{ количество сдавших на "отлично" и "хорошо" }
num_ex_good: O..num;
{ количество получивших "неудовлетворительно" } •
num_no_sat; 0..num
end;
var
f; file of tree; { обрабатываемый файл }
ic; l..nc;
ig: l..ng;
rec ; tree;
irec; byte; { номер записи о нужной группе в файле}
num_ex_c : O..num; { искомое число отличников }
begin
{$!-}{ отключить проверку ошибок ввода-вывода }
assign(f.'result.dat');
reset(f);
{$!+} { отключить проверку ошибок ввода-вывода }
if IOResult<>0
then writelnC'файла нет')
el se
begin
writeC'курс; ');
readln(ic);
if ic>nc
then writelnC'неверно задан номер курса')
else
begin
irec:=(ic-l)^ng;
seekCf.irec);
num_ex_c;-0;
for ig:=l to ng do
Гпава 15. Динамические структуры данных 255
begin
read(f.rec);
num_ex_c:=num_ex_c+rec.num_ex
end;
writelnC'Ha '.ic, ' курсе сдали сессию на "отлично"'.
num_ex_c.' студентов')
end
end
end. { PrintBestlnfo }
Задание 96
Решение:
{ Прообраз решения взят из справочной }
{ системы Turbo Pascal }
program CopyFile;
const
BufSize = 2048;
var
FromF. ToF: file;
{ для типа file размер записи указывается }
{ при открытии файла на чтение-запись }
NumRead. NumWritten; Word;
{ Word - тип для представления целых }
{ неотрицательных чисел }
Buf; array[l..BufSize] of Char;
begin
assignCFromF. ’a.dat');
{ открываем входной файл }
resetCFromF, 1); { Размер записи = 1 байт }
assignCToF. 'b.dat');
{ создаем выходной файл }
rewrite(ToF. 1); { Размер записи = 1 байт }
writelnC'Копирование '. FileSize(FromF), ’ байт...');
repeat
BlockReadCFromF. Buf. BufSize. NumRead);
BlockWriteCTof. Buf, NumRead. NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
closeCFromF);
close(ToF);
writelnC'Копирование завершено.');
end. { CopyFile }
Глава 15. Динамические структуры данных
Списки. Задачи, решения
Задание 1
Решение:
program List_Proc;
type
TElem = integer; { Тип информационной части }
TList = ATNode; { Представление списка }
TNode = record { Звено списка }
Info; TElem; { Информационная часть }
Next; Tlist { Следующий элемент, списка }
256 Приложение 1. Ответы и решения
end;
{ 1. Инициализация списка }
{ Список без заглавного звена }
procedure BL1st_Init (var L: TList);
begin
L := nil
end;
{ Список с заглавным звеном }
procedure ZList_Init (var L; TList);
var N; TH si; { заглавный элемент }
begin
new( N );
hT.Next ;= nil;
L ;» N
end;
{ 2. Добавление элемента в начало спйска }
{ Список без заглавного звена }
procedure BL1st_AddFirst (var L: TList; E: TElem);
var N: TList; { добавляемое звено списка }
begin
new( N );
NMnfo ;= E;
N^.Next ;= L;
L := N
end;
{ Список с заглавным звеном }
procedure ZL1st_AddF1rst (L; TList; E; TElem);
var N: TList; { добавляемое звено списка }
begin
BL1st_AddF1rst( Lx.Next, E )
end;
{ 3. Добавление элемента в конец списка }
{ Список без заглавного звена }
procedure BList_AddLast (var L: TList; E: TElem);
var
N; TList; { добавляемое звено списка }
{ вспомогательный указатель для }
{ поиска последнего элемента списка }
Р; TList;
begin
new( N );
NMnfo ;= E;
NA.Next ;= nil;
if L - nil
then L ;- N
el se
begin
{ поиск последнего элемента списка }
Р := L;
while P\Next <> nil do P P*.Next;
{ добавление в список нового звена }
P*.Next ;= N
end
Глава 15. Динамические структуры данных 257
end;
{ Список с заглавным звеном }
procedure ZL1st_AddLast (L: TList; E: TElem);
begin
{ поиск последнего элемента списка }
while LA.Next <> nil do L :» LA.Next;
{ добавление в список нового звена }
new( LA.Next );
L :» LA.Next;
LMnfo := E;
LA.Next ;= nil
end;
{ 4. Удаление первого вхождения элемента Е в список L }
{ Результат функции: }
{ true - элемент найден и удален }
{ false элемент в списке не найден }
{ Список без заглавного звена. Решение 1 }
function BList_DelEleml(var L: TList; E; TElem): boolean;
var
N; TList; { указатель на удаляемое из списка звено }
{ вспомогательный указатель для поиска звена списка. }
{ предшествующего удаляемому }
Р: TList;
{ признак: найден ли элемент Е }
{ в списке ? }
found: boolean;
begin
found :- false;
if L <> nil then { если список не пуст }
if LA.Info - E
then { если первое звено является удаляемым }
begin
found ;- true;
' запоминаем указатель на }
удаляемое звено }
N ;- L;
L :e LA.Next; { удаляем звено из списка }
dispose( N ) { освобождаем память }
end
el se
begin
{ ищем звено, предшествующее удаляемому }
Р :- L;
while not found and (PA.Next <> nil) do
if PA\NextA.Info » E
then found :«true
else P :- PA.Next;
if found then
{ если найдено удаляемое звено }
begin
{ запоминаем указатель }
{ на удаляемое звено }
N :« PA.Next;
{ удаляем звено из списка }
PA.Next := NA.Next;
{ освобождаем память }
disposeC N )
9 Зак. 906
258 Приложение 1. Ответы и решения
end
end;
BList_DelEl eml :« found
end;
{ Список без заглавного звена. Решение 2 }
{ Рекурсивный вариант }
function BL1st_DelElem2(var L; TLIst; E; TElem); boolean;
var
N; TList; { указатель на удаляемое звено списка }
begin
if L <> nil
then { если список не пуст }
if LA.Info « E
then
{ если первое звено является удаляемым }
begin
{ запоминаем указатель на удаляемое звено }
N ;- L:
L :» LA.Next; { удаляем звено из списка }
disposeC N ); { освобождаем память }
BList_DelElem2 true
end
el se
BList_DelElem2
BList_DelElem2( LA.Next, E )
else BLIst_DelElem2 false;
end;
{ Список с заглавным звеном }
function ZL1st_DelElem(L; TList: E; TElem); boolean;
var
N; TLIst; { указатель на удаляемое звено списка }
{ вспомогательный указатель для поиска звена списка, }
{ предшествующего удаляемому }
Р: TList;
признак; найден ли элемент Е в списке? }
round: boolean;
begin
{ ищем звено, предшествующее удаляемому }
found false;
Р L;
while not found and ( PA.Next <> nil ) do
if PA.Next*.Info - E
then found :-true
else P P*.Next:
if found then { если найдено удаляемое звено }
begin
{ запоминаем указатель на удаляемое звено }
N P*.Next;
PA.Next NA.Next; { удаляем звено из списка }
disposeC N ) { освобождаем память }
end;
ZList-DelElem ;- found
end;
{ 5. Переворот списка }
{ Список без заглавного звена }
procedure BList_Invert (var L; TList);
Глава 15. Динамические структуры данных 259
van
Н: TList; { вспомогательный указатель }
Р: TList; { указатель на обработанный элемент списка }
begin
Р := nil;
while L<>nil do
begin
{ запоминаем указатель на следующий }
Н :« LA.Next;
{ теперь следующим за текущим будет звено Р }
LA.Next г- Р;
{ текущий становится предыдущим }
{ для следующего шага }
Р := L;
{ перемещаемся к следующему элементу списка }
L := Н
end;
L := Р { самый последний становится первым }
end;
{ Список с заглавным звеном }
procedure ZList_Invert (L; TList);
begin
BL1st_Invert ( LA.Next )
end;
{ 6. Печать элементов списка }
{ Список без заглавного звена }
p rocedure BL1st_Print ( L: TList );
begin
writeC'< ’):
while L <> nil do
begin
writeC LA.Info );
if LA.Next <> nil then writeC’.');
L ;- LA.Next
end;
writelnC' >')
end;
{ Список с заглавным звеном }
procedure ZList_Print (L: TList);
begin
BList_Print ( LA.Next )
end;
{ 7. Удаление всех элементов списка }
{ Список с заглавным звеном и без него }
procedure L1st_Clear ( var L; TList );
var
N: TList; { указатель на удаляемое звено списка }
begin
while L <> nil do
begin
N L;
L LA.Next;
disposeC N )
end
end;
260 Приложение 1. Ответы и решения
{ Процедура демонстрирует работу приведенных }
’ выше процедур. Параметр isB позволяет выбрать }
тип списка: с заглавным звеном или без него }
procedure TestC IsB: boolean ):
const
FirstElem » 4444:
{ Сообщение о результате выполнения }
{ операции удаления }
procedure DelMessaged b: boolean ):
begin
if b
then writelnC 'Элемент в списке найден и удален' )
else writelnC 'Заданный элемент в списке не найден' )
end:
var
L: TList: { список }
{ вводимая пользователем информационная часть }
Е : TElem:
begin
if isB
then BListJnit ( L )
else ZListJnit ( L ):
writelnC 'Список инициализирован' );
if isB
then BList_AddFirst ( L, FirstElem )
else ZList_AddFirst ( L, FirstElem );
writelnC 'В список добавлен элемент’,
' co значением '. FirstElem );
writeC 'Введите значение элемента, ',
'добавляемого в начало списка: ' ):
readlnC Е ):
if isB
then BList_AddFirst ( L, E )
else ZList_AddFirst ( L. E ):
writeC 'Введите значение элемента, '.
'добавляемого в конец списка: ' ):
readlnC Е ):
if IsB
then. BL1st_AddLast ( L. E )
else ZList_AddLast ( L. E ):
writeC 'Элементы списка: ' ):
{ Печать списка }
if isB
then BList_Print ( L )
else ZList_Print ( L ):
{ Переворот списка }
if isB
then BList_Invert ( L )
else ZListJnvert ( L );
writeC ’Элементы списка в обратном порядке: ’ ):
{ Печать списка }
if IsB
then BL1st_Print ( L )
else ZList_Print ( L ):
writeC 'Введите значение элемента, ',
'удаляемого из списка: ' ):
readlnC Е ):
Глава 15. Динамические структуры данных 261
if IsB
then
begin
DelMessageC BList_DelElemi ( L. E ) ):
writeC 'Введите значение элемента,
'удаляемого из списка: ' );
readlnC Е ):
DelMessageC BList_DelElem2 ( L, E ) )
end
else DelMessageC ZList_DelElem ( L. E ) );
writeC 'Элементы списка: ' ):
{ Печать списка }
if isB
then BList_Print( L )
else ZList_Print( L );
L1st_Clear( L ):
writelnC 'Элементы списка удалены' ):
writeC'Нажмите <Enter> ... '): readln
end:
begin
writelnC 'Список без заглавного звена' );
TestC true ):
writelnC 'Список с заглавным звеном’ ):
TestC false ):
end. { List_Proc }
Задание 4
Решение:
procedure List_Sort( L: TList ):
{ обмен информационных частей двух звеньев списка }
{ L.R - указатели на звенья }
procedure SwapInfoC L, R: TList ):
begin
with LA do Info :» RA.Info - Info:
with RA do Info :- Info - LA.Info:
with LA do Info :e RA.Infq + Info:
end:
var
{ указатель, используемый при поиске максимума }
R: TList:
Max: TList: { указатель на максимальный элемент }
begin
if L<>nil then { если список не пуст }
begin
while LA.Next <> nil do
{ сортируем подсписок, если в }
{ нем более одного элемента }
begin
{ сначала считаем, что первый элемент }
{ подсписка является максимальным }
Max :e L:
R := LA.Next:
{ ищем максимальный элемент }
while R о nil do
begin
if RA.Info > MaxA.Info
{ запоминаем указатель }
{ на максимальный }
262 Приложение 1. Ответы и решения
then Мах :« R;
{ переходим к следующему }
{ элементу подсписка }
R :- RA.Next
end:
if Max <> L
{ обмениваем информационные части }
then SwapInfoC L, Max );
{ переходим к следующему элементу списка }
L LA.Next
end
end
end; { L1st_Sort } .
Задание 6
Решение:
program Merge:
type
TElem = integer; { Тип информационной части }
TList - ATNode: { Представление списка }
TNode » record { Звено списка }
Info: TElem: { Информационная часть }
Next: TList { Следующий элемент списка }
end:
{
Предполагается, что здесь описаны
следующие процедуры:
procedure List_Sort(L: TList)
procedure BList_Print(L: TList)
procedure BList_InitCvar L: TList)
procedure BList_AddLast(var L: TList: E: TElem)
procedure List_Clear(var L: TList)
Ввод пользователем элементов списка }
procedure List-Input(var L: TList):
var E: TElem: { введенное число }
begin '
BList_Init ( L ): { Инициализируем список }
writeC 'Введите элементы списка
'( эл1 эл2 ... 3nN<Enter> ): '):
while not eoln do
begin
readC E ):
{ заносим новый элемент в конец списка }
BList_AddLast ( L. Е )
end:
readln { считываем символ перевода строки }
end;
{
Процедура сливает два упорядоченных по
невозрастанию списка А и В в список С.
также упорядоченный по невозрастанию.
Исходные списки не удаляются
}
procedure L1st_Merge( А.В: TList: var С: TList );
Глава 15. Динамические структуры данных 263
var
Н: TList; { указатель на конец списка }
{ Процедура добавляет элемент из }
{ списка L в результирующий список С }
procedure AddFromList(var L; TList);
begin
{ является ли добавляемый элемент }
{ первым в списке? }
if С - nil
then
begin
new( С );
H С
end
el se
begin
new( K.Next );
H HA.Next
end;
FT.Info LA.Info;
{ переходим к следующему элементу списка }
L LA.Next
end;
begin
С ;» nil;
H ;» nil;
{ пока есть хотя бы один элемент }
{ вчисходных списках }
while ( А <> nil ) or ( В <> nil ) do
begin
{ список А пуст, добавляем из В }
if А - nil
then AddFromList(В)
else
{ список В пуст, добавляем из А }
if В e nil
then AddFromList(А)
else
if AA.Info > BA.Info
then AddFromList( A )
else AddFromList( В )
end:
if H <> nil
then HA.Next nil { завершаем список }
end;
{ Ниже приведен пример работы }
{ с процедурой List_Merge }
var
А, В ; TList; { сливаемые списки }
С : TList; {результат слияния двух списков }
begin
{ ввод исходных списков }
Li St-Input( А );
List-Input( В );
{ отсортируем списки по невозрастанию }
List_Sort( А );
List_Sort( В );
264 Приложение 1. Ответы и решения
{ слияние списков А и В в список С }
List_Merge( А, В. С );
{ напечатаем результат слияния }
writeC ‘Результат слияния: ’ );
BList_Print( С ):
{ очищаем списки }
List_Clear( А );
L1st_Clear( В );
L1st_Clear( С );
writeC 'Нажмите <Enter> ... ' );
readln
end. { Merge }
b)
{ Процедура производит слияние двух упорядоченных }
{ по невозрастанию списков А и В в список С. }
{ также упорядоченный по невозрастанию, путем }
{ перестановки указателей в исходных списках. }
procedure List_Join ( А, В: TList: var С: TList );
var h: TList: { указатель на конец списка }
procedure Joint var S: TList );
begin
{ если список-результат пуст }
if С = nil
{ запоминаем указатель на "голову” списка }
then С S
{ подсоединяем элементы к концу списка }
else h\Next : S:
h :» S;
{ переходим к следующему элементу списка }
S := SA.Next
end;
begin
С := nil;
{ пока оба списка не пусты, сравниваем ;
{ первые элементы и минимальный из них
{ помещаем в список-результат }
while (А <> nil) and (В <> nil) do
if AA,info < BA.info
then Joint A )
else Joint В );
{ добавляем элементы непустого списка к списку-результату }
if А о nil
then Joint А )
else
.if Во nil then Joint В )
end; { List_Join }
Двоичное дерево. Задачи, решения
Задание 2
Решение:
type
TElem = integer; { Тип информационной части }
TTree = ATNode; { Представление дерева }
TNode = record { Узел дерева }
Info: TElem; { Информационная часть }
Глава 15. Динамические структуры данных 265
Left: ТТгее: Указатель на левое поддерево }
Right: ТТгее Указатель на правое поддерево }
end:
{ Функция создает копию двоичного дерева А }
{ Результатом функции является указатель }
{ на копию дерева А }
function TreeCopy( А: ТТгее ): ТТгее:
var Tree: ТТгее: { Указатель на копию дерева }
begin
if А о nil
then
begin
{ создаем новое звено дерева }
new( Tree ):
{ копируем информационную часть }
Tree*.Info :- A*.Info;
{ сохраняем указатель на копию }
{ левого поддерева } ’
Tree*.Left :- TreeCopy(AA.Left):
{ сохраняем указатель на копию.}
{ правого поддерева }
Tree*.Right :e TreeCopy(A*.Right)
end
else Tree nil:
TreeCopy := Tree
end: { TreeCopy }
Задание 4
Решение:
type
TElem - integer: { Тип информационной части }
ТТгее » *TNode: { Представление дерева }
TNode » record { Узел дерева }
Info: TElem; { Информационная часть }
Left: ТТгее: { Указатель на левое поддерево }
Right: ТТгее { Указатель на правое поддерево }
end:
{ Функция вычисляет высоту }
{ заданного двоичного дерева А }
function TreeHeightC А: ТТгее ): integer;
var
lh: integer; { высота левого.поддерева }
rh: integer; { высота правого поддерева }
begin
if А = nil
then TreeHeight :- О
else
begin
lh :- TreeHeightC A*.Left );
rh :» TreeHeightC A*.Right );
if lh > rh
' then TreeHeight lh + 1
else TreeHeight :- rh + 1
end
end: { TreeHeight }
266 Приложение 1. Ответы и решения
\ ' •
Дерево двоичного поиска. Задачи, решения
Задание 2
Решение:
program FindTree;
type
TElem * record { Тип информационной части }
Number: integer: { Число }
Count: Integer { Количество повторений }
end:
TTree - *TNbde: { Представление дерева }
TNode » record { Узел дерева }
Info : TElem: { Информационная часть }
Left : TTree: { Указатель на левое поддерево }
Right: Ttree { Указатель на правое поддерево }
end:
{ Процедура добавляет в дерево двоичного поиска }
{ новый элемент i. Если элемент i в дереве уже }
{ присутствует, увеличивается счетчик числа }
{ вхождений элемента i в соответствующем узле дерева }
procedure Add ( var Tree: TTree: i: integer );
begin
if Tree <> nil
then
with Tree* do
begin
if Info.Number < i
then Add( Right, i )
else
if Info.Number > i
then Add( Left, i )
el se
{ элемент i в дереве }
{ присутствует, увеличиваем }
{ счетчик числа вхождений }
{ элемента }
Infо.Count := Infо.Count + 1
end
el se
begin
{ Добавляем новый узел }
new( Tree ):
with Tree* do
begin
Info.Number : = i:
Info.Count :- 1:
Left :- nil;
Right nil
end
end
end:
{ Процедура печати элементов дерева }
{ в порядке убывания значений }
procedure Print ( Tree: TTree ):
begin
if Tree <> nil
then
with Tree* do
Глава 15. Динамические структуры данных 267
begin
{ обходим дерево справа налево }
PrintC Right );
writeCInfo.Number, '(’, Info.Count. *p) ');
PrintC Left )
end
end;
{ Процедура удаления дерева. После выхода }
{ из процедуры значение Tree не определено }
procedure Delete ( Tree: TTree );
begin
if Tree <> nil
then
begin
{ удаляем правое поддерево }
DeleteC Tree*.Right );
{ удаляем левое поддерево }
DeleteC Tree*.Left ):
{ удаляем корень }
disppseC Tree )
end
end;
var
F: file of integer; { исходный файл }
FileName: string; { имя файла }
Number: integer; { считываемое из файла число }
Tree: TTree: { дерево двоичного поиска }
begin
writeC 'Введите имя обрабатываемого файла: ' );
readlnC FileName );
AssignC F. FileName );
{$!-} Reset(F); {$!+}
{ при открытии файла возникали }
{ ошибки ввода-вывода? }
if lORdsult о 0 then
begin
writelnC 'Возникла ошибка при
'открытии файла! Выполнение *,
'программы прекращено.' );
Exit
end;
Tree :- nil;
{ заполняем дерево двоичного поиска }
while not eof( F ) do
begin
readC F. Number );
AddC Tree, Number )
end;
CloseC F );
if Tree = nil
then writelnC 'Исходный файл пуст' )
el se
begin
writelnC 'Элементы дерева в порядке убывания значений' );
{ печатаем элементы в порядке }
{ убывания значений }
PrintC Tree );
writeln;
DeleteC Tree ) { освобождаем память }
268 Приложение 1. Ответы и решения
end;
end. { FindTree }
Очередь. Задачи, решения
Задание 1
Решение:
а)
const
{ Максимальное число элементов очереди + 1 }
MaxN = 100;
type
TElem = Integer; { Тип элементов очереди }
TElements = array [l..MaxN] of TElem;
TQueue = record { Представление очереди }
{ Массив для хранения элементов очереди }
Elements: TElements;
Head: Integer; { "Голова" очереди }
Tail : integer { "Хвост" очереди }
end;
{ Инициализация очереди Q }
procedure Queue_Init( var Q : TQueue);
begin
{ Изначально очередь не содержит элементов }
Q.Head : = 1;
Q.Tail := 1
end;f Queue_Init }
•’ Проверка очереди Q на пустоту }
Результат функции: }
true - очередь пуста }
{ false - очередь не пуста }
function Queue_IsEmpty( Q: Tqueue ): boolean;
begin
Queue_IsEmpty := ( Q.Head = Q.Tail )
end;{ Queue_IsEmpty }
{ Поместить элемент E в очередь Q }
procedure Queue_Push( var Q : TQueue; E : TElem);
const
ErrorCode = 255;
begin
with Q do
begin
{ заносим новый элемент в очередь }
Elements[Tail] := Е;
{ вычисляем значение индекса для следующего }
{ элемента очереди }
Tail := (Tail mod MaxN) + 1;
if Tail = Head then
begin
writelnC 'Переполнение очереди !’!' );
{ Аварийное завершение программы }
Halt( ErrorCode )
end
end
end;{ Queue_Push }
{
возможна другая реализация операции
Глава 15. Динамические структуры данных 269
помещения значения в очередь
}
{ Поместить элемент Е в очередь Q }
{ Результат функции: }
{ true - операция выполнена успешно }
{ false - переполнение очереди }
function Queue_Push_Func( var Q: TQueue;
E: TElem): boolean:
var
newTail: integer: { индекс для следующего }
{ элемента очереди }
begin
newTail := (Q.Tail mod MaxN) + 1;
with Q do
if newTail <> Head then
begin
Tail := newTail:
Elements[Tail] := E:
Queue_Push_Func := true
end
else { Переполнение очереди }
Queue_Push_Func := false
end:f Queue_Push_Func }
{ Извлечь элемент из “головы" очереди Q }
{ Результат функции: }
{ Извлеченный из очереди элемент }
function Queue_Pop( var Q : TQueue): TElem:
const
ErrorCode = 255:
begin
if Queue_IsEmpty( Q ) then
begin
writelnC 'Извлечение элемента из пустой очереди !!!' );
{ Аварийное завершение программы }
HaltC ErrorCode )
end
else
with Q do
begin
Queue_Pop := Elements[Head]:
Head := (Head mod MaxN) + 1:
end
end:{ Queue_Pop }
{
возможна другая реализация операции
извлечения значения из очереди
Извлечь элемент из "головы" очереди Q }
procedure Queue_Pop_Proc( var Q : TQueue:
var E : Telem );
const
ErrorCode e 255;
begin
if Queue_IsEmpty( Q )
then
begin
writelnC 'Извлечение элемента из пустой очереди !!!’);
{ Аварийное завершение программы }
HaltC ErrorCode )
270 Приложение 1. Ответы и решения
end
else
with Q do
begin
E Elements[Head];
Head (Head mod MaxN) + 1;
end
end; { Queue_Pop_Proc }
b)
type
TElem - integer; { Тип элементов очереди }
TList - ATElement: { Список, предназначенный для хранения элементов очереди
TElement - record { Элемент списка }
Info; TElem; { Информационная часть }
Next; TList { Указатель на следующий элемент списка }
end;
TQueue - record { Представление очереди }
Head; TList; { "Голова” очереди }
Tail; TList { "Хвост" очереди }
end;
{ Инициализация очереди Q }
procedure Queue_Init( var Q: TQueue );
begin
{ Изначально список, хранящий }
{ элементы очереди, пуст }
Q.Head ;- nil
end; { QueueJnit }
{ Проверка очереди Q на пустоту }
{ Результат функции: }
{ true - очередь пуста }
{ false - очередь не пуста }
function Queue_IsEmpty( Q: TQueue ): boolean;
begin
Очередь пуста, если пуст }
соответствующий список }
Queue_IsEmpty ( Q.Head - nil )
end; { Queue_IsEmpty }
{ Поместить элемент E в "хвост" очереди Q }
procedure Queue_Push( var Q: TQueue; E: TElem );
var Z: TList;
begin
new( Z ); { Создаем новое звено списка }
ZA.Info E;
ZA.Next nil;
if Queue_IsEmpty( Q )
then Q.Head Z
else Q.Tail*.Next Z;
Q.Tail Z
end; { Queue_Push }
{ Извлечь элемент из очереди Q }
{ Результат функции: }
{ Извлеченный из "головы" очереди элемент }
function Queue_Pop( var Q: TQueue ): TElem;
const ErrorCode - 255;
var Z: TList;
begin
if Queue_IsEmpty( Q ) then
begin
writelnC 'Извлечение элемента из пустой очереди ’!! ' );
Глава 15. Динамические структуры данных 271
{ Аварийное завершение программы }
HaltC ErrorCode )
end else
begin
{ Сохраняем указатель на звено списка }
Z :» Q.Head;
{ Перемещаемся к следующему звену }
Q.Head : = ZA.Next;
Queue_Pop : = ZA.Info;
disposeC Z ) { Удаляем звено списка }
end
end; { Queue_Pop }
Стек. Задачи, решения
Задание 1
Решение:
а)
const
MaxN = 100; { Максимальное число элементов стека }
type
TElem = Integer; { Тип элементов стека }
TElements = array [1..MaxN] of TElem;
TStack = record { Представление стека }
Elements: TElements; { Элементы стека }
Top: integer { Индекс вершины стека }
end;
{ Инициализация стека S }
procedure Stack_Init ( var S: TStack );
begin
{ Изначально стек не содержит элементов }
S.Top := 0
end;
{ Проверка стека S на пустоту }
{ Результат функции: }
{ true - стек пуст }
{ false - стек не пуст }
function Stack_IsEmpty( S: TStack ):_ boolean;
begin ' x
{ Стек пуст, если он не содержит элементов }
Stack_IsEmpty :« ( S.Top » 0 )
end;
{ Поместить элемент Е в стек S }
procedure Stack_Push ( var S: TStack; E: TElem ):
const ErrorCode = 255;
begin
with S do
if Top < MaxN
then
begin
Top := Top + 1;
Elements[Top] := E
end
el se
begin
writelnC 'Переполнение стека !!!’ );
{ Аварийное завершение программы }
HaltC ErrorCode )
272 Приложение 1. Ответы и решения
end
end;
{
возможна другая реализация операции
помещения значения в стек
Поместить элемент Е в стек S }
Результат функции: }
true - операция выполнена успешно }
false - переполнение стека }
wetion Stack_Push_Func ( var S: TStack;
E: TElem ): boolean;
begin
with S do
if Top < MaxN
then
begin
Top Top + 1;
Elements[Top] E;
Stack Push Func :- true
end
else
{ Переполнение стека }
Stack Push Func :- false
end;
’ Извлечь элемент с вершины стека S }
’ Результат функции: }
Извлеченный из стека элемент }
wetion Stack_Pop ( var S: TStack ): TElem;
const ErrorCode - 255;
begin
if Stack_IsEmpty( S )
then
begin
writelnC ’Извлечение элемента из пустого стека !’!’ );
{ Аварийное завершение программы }
HaltC ErrorCode )
end
else
with S do
begin
Stack_Pop :- Elements[Top]:
' Top :- Top - 1
end
end;
{
возможна другая реализация операции извлечения значения из стека
*
Извлечь элемент Е с вершины стека S }
procedure Stack_Pop-Proc( var S: TStack; var E: TElem );
const ErrorCode - 255;
begin
if Stack_IsEmpty( S )
then
begin
writelnC ’Извлечение элемента из пустого стека !!!’ );
{ Аварийное завершение программы }
HaltC ErrorCode )
Глава 15. Динамические структуры данных 273
end
el se
with S do
begin
E := Elements[Top];
Top :* Top-1
end
end;
b)
type
TElem = integer; { Тип элементов стека }
TStack = *TElement; { Представление стека }
{ Элемент списка, предназначенного для }
{ хранения элементов стека }
TElement = record
Info; TElem; { Элемент списка }
Next; TStack { Указатель на следующий элемент списка }
end;
{ Инициализация стека S }
procedure Stack_Init ( var S: TStack );
begin
{ Изначально список, хранящий }
{ элементы стека, пуст }
S := nil
end;
{ Проверка стека S на пустоту }
{ Результат функции; }.
{ true - стек пуст }
{ false - стек не пуст }
function Stack_IsEmpty(S; TStack): boolean;
begin
{ Стек пуст, если пуст }
{ соответствующий список
Stack—IsEmpty := ( S = nil )
end;
{ Поместить элемент E в стек S }
procedure Stack_Push (var S: TStack; E: TElem);
var'Z: TStack;
begin
new( Z ); { Создаем новое звено сгг^ска }
ZA.Next := S: { Присоединяем новое звено }
{ к имеющемуся списку }
Z\Info := Е;
S := Z { Новая вершина стека }
end;
’ Извлечь элемент с вершины стека S }
’ Результат функции: }
Извлеченный из стека элемент }
function Stack_Pop ( var S: TStack ): TElem;
const ErrorCode = 255;
var Z: TStack;
begin
if Stack_IsEmpty( S )
then
begin
writelnC 'Извлечение элемента из '.
'пустого стека !!!' );
{ Аварийное завершение программы }
10 Зак. 906
274 Приложение 1. Ответы и решения
HaltC ErrorCode )
end
el se
begin
Z := S; { Сохраняем указатель }
{ на звено списка }
{ Перемещаемся к следующему звену }
S : = S*.Next;
Stack_Pop := Z^.Info;
disposeC Z ) { Удаляем звено списка }
end
end;
ПРИМЕЧАНИЕ Приведенные выше реализации стека (на основе массива и динамических
структур) позволяют однообразно обращаться к данной логической струк-
туре, а также использовать стек без знания его внутреннего представле-
ния (хотя, конечно, имеется множество случаев, когда та или иная реали-
зация предпочтительней при обработке конкретной информации).
Ниже демонстрируется функционирование подпрограмм для работы со стеком,
program StackTest:
var
Stack: TStack; { Стек }
E: TElem; { Помещаемый в стек элемент }
begin
{ Пример использования стека }
{ Инициализация стека }
Stack_Init ( Stack );
{ Проверка стека на пустоту }
writeln ( 'Stack-IsEmpty = Stack_IsEmpty( Stack ) );
writeC 'Введите 1-й элемент стека: ' ):
readlnC Е );
{ Помещение элемента в стек }
Stack_Push( Stack. Е );
{ Проверка стека на пустоту }
writeln ( ’Stack-IsEmpty = Stack_IsEmpty( Stack ) ):
writeC ’Введите 2-й элемент стека: ' );
readlnC Е );
{ Помещение элемента в стек }
Stack_Push( Stack, Е ):
writelnC 'Извлечение и печать элементов стека:' ):
while not Stack_IsEmpty( Stack ) do
writelnC Stack_Pop( Stack ) );
writeC 'Нажмите <Enter> ... ' );
readln
end. { StackTest }
Задание 2
Решение:
program Inversestring;
type
TElem = char; { Тип элементов стека }
TStack = *TElement; { Представление стека }
{ Список, предназначенный для хранения элементов стека }
TElement = record
Info : TElem; { Элемент списка }
Глава 15. Динамические структуры данных 275
{ Указатель на следующий элемент списка }
Next : TStack
end;
{
Предполагается, что здесь описаны следующие подпрограммы работы со стеком,
реализованным на основе динамических структур:
procedure Stack_Init ( var S: TStack );
procedure Stack-Push ( var S: TStack; E: TElem );
function Stack_IsEmpty( S.; TStack ): boolean;
function Stack_Pop ( var S: TStack ); TElem;
}
var
Stack: TStack; { Стек }
E; TElem; { Помещаемый в стек элемент }
begin
{ Инициализация стека }
Stack_Init ( Stack );
writeC 'Введите строку текста: ' );
{ Помещение символов строки текста в стек }
while not eoln do { Пока не конец строки }
begin
{ Читаем следующий символ }
readC Е );
{ Помещаем его в стек }
Stack_Push( Stack, Е )
end;
readln; { Читаем признак конца строки }
writeC 'Символы строки в обратном порядке: ' );
while not Stack_IsEmpty( Stack ) do
{ Пока стек не пуст, извлекаем }
{ символ из стека и выводим его }
writeC Stack_Pop( Stack ) );
writeln;
writeC 'Нажмите <Enter> ... ' );
readln
end. { Inversestring }
Задание 5
Решение:
program Logical Expression;
const
TerminateChar = chr(O):
type
TSymbol = ( sNone, sTerminate. sTrue. sFalse.
sNot, sAnd. sOr. sLParen. sRParen );
TElem = TSymbol; { Тип элементов стека }
TStack = ATElement; { Представление стека }
{ Список, предназначенный для хранения элементов стека }
TElement = record
Info : TElem; { Элемент списка }
Next : TStack { Следующий элемент списка }
end;
{
Предполагается, что здесь описаны следующие подпрограммы:
procedure Stack_Init (var S: TStack):
function Stack_IsEmpty(S: TStack): boolean:
procedure Stack_Push (var S: TStack; E: TElem);
276 Приложение 1. Ответы и решения
function Stack_Pop (var S: TStack): TElem:
}
{ функция рассчитывает значение выражения. }
{ хранящегося в текстовом файле F }
function BooleanExpressionC var F: Text )
: boolean:
var
Sym : TSymbol:
Ch : char:
procedure NextSym;
{ процедура читает следующий символ из файла }
procedure NextChar:
begin
if eof( F )
then Ch :- TerminateChar
else
if eoln( F )
then
begin
readlnC F ):
Ch := ' '
end
else readC F. Ch ):
end:
{ процедура пропускает конец текущего слова }
procedure Ski pWordTail:
begin
while Ch in ['a*..’z’] do
NextChar
end:
begin
while Ch=' ' do NextChar: { пропускаем пробелы }
Sym := sNone:
case Ch of
')': begin Sym := sRParen; NextChar end:
'(': begin Sym := sLParen: NextChar end:
*t*: begin Sym := sTrue; SkipWordTail en0:
’f’: begin Sym := sFalse: SkipWordTail end:
’n’: begin Sym := sNot: SkipWordTail end:
’a': begin Sym : = sAnd: SkipWordTail end;
’o': begin Sym := sOr: SkipWordTail end;
TerminateChar: Sym := sTerminate
end
end:
var
{извлекаемые из стека операнды и операция }
opl. ор2. fun : TSymbol:
{ вспомогательный массив для преобразования }
{ false в sFalse, a true в sTrue }
B2Sym : array [false..true] of TSymbol:
{ стек для хранения операций и операндов }
S : TStack:
begin
StackJnitC S ):
B2Sym[false] := sFalse;
B2Sym[true] := sTrue:
Ch := ' ':
NextSym: { читаем первый символ }
while Sym <> sTerminate do
Глава 15. Динамические структуры данных 277
begin
case Sym of
sTrue, sFalse, sNpt, sAnd, sOr :
Stack_Push(S,Sym);
sRParen :
begin
{ при чтении правой скобки извлекаем операцию и операнд(ы). }
{ и производим вычисления }
ор2 : = Stack_Pop( S ):
fun := Stack_Pop( S ):
case fun of
sNot:
Stack_Push
(
S.
B2Sym[op2 = sFalse]
):
sOr :
begin
opl := Stack_Pop( S ):
Stack Push
( S,
B2Sym[(op.l = sTrue) or
(op2 = sTrue)]):
end:
sAnd :
begin
opl := Stack_Pop( S ):
Stack Push
( S.
B2Sym[(opl = sTrue) and
Cop2 = sTrue)]):
end
end
end
else : { пропускаем '(' }
end: *
NextSym { читаем следующий символ }
end:
BooleanExpression := (Stack_Pop( S ) = sTrue)
end:
var
F: Text: { файл, хранящий логическое выражение }
FileName : string: { имя файла }
begin
writeC 'Введите имя файла, содержащего логическое ',
’выражение заданного формата: '):
readlnC FileName ):
AssignC F. FileName ):
{$!-} Reset(F): {$!+}
{ при открытии файла возникали ошибки ввода-вывода? }
if lOResult <> О
then
begin
writelnC 'Возникла ошибка при открытии файла!
Выполнение программы прекращено.' ):
Exit-'
end:
writelnC 'Значение выражения равно ’,
278 Приложение 1. Ответы и решения
BooleanExpression( F ) ):
Close( F ):
write( 'Нажмите <Enter> ... ' ):
readln
end. { LogicalExpresslon }
Задание 13
Решение:
program TestBrRIght:
const
{ Максимальная длина вводимой строки }
MaxStrLen « 80:
{ Максимальное число элементов стека }
MaxN = MaxStrLen:
type
TElem = char: { Тип элементов стека }
TElements » array [l..MaxN] of TElem:
TStack = record { Представление стека }
{ Массив для хранения элементов стека }
Elements : TElements:
{ Вершина стека }
Тор : integer
end:
{ Строка символов }
TStrlng - array [1..MaxStrLen] of char:
{
Предполагается, что здесь описаны следующие подпрограммы работы со стеком,
реализованном на основе массива:
procedure Stack_Init ( var S: TStack ):
procedure Stack_Push ( var S: TStack: E: TElem ):
function Stack_IsEmpty( S: TStack ): boolean:
function Stack_Pop ( var S: TStack ): TElem:
Функция проверяет правильность расстановки }
; скобок в выражении, хранимом в строке s }
{ ExprLen - длина выражения }
{ Результат функции: }
{ true - скобки расставлены правильно }
{ false - несоответствие скобок }
function TestExpresslonC s: TStrlng:
ExprLen: integer ): boolean:
var
Stack: TStack: { Стек для хранения открывающих скобок }
curChar: TElem; { Обрабатываемый символ выражения }
1: Integer:
Good: boolean: { Признак соответствия скобок в выражении }
{ Определение символа левой скобки для данной правой }
function ToLeft( г: char ): char:
begin
case r of
' '}’: ToLeft ;= '{':
')': ToLeft := '(':
']': ToLeft :=
end
end:
begin
{ Инициализация стека }
Глава 15. Динамические структуры данных 279
Stack_In1t ( Stack );
{ Изначально будем считать. }
{ что скобки расставлены верно }
Good : = true;
{ Начинаем обработку с первого }
{ символа выражения }
1 := 1:
while (1 <= ExprLen) and Good do
begin
curChar :» s[i];
case curChar of
'{’. ’[’. ’(’:
{ Открывающую скобку заносим в стек }
Stack-Push( Stack. curChar ):
1}1 * J * 1)1 *
begin
Good := false;
{ Проверим ситуацию, когда }
{есть закрывающая скобка. }
{ но нет открывающей }
if not Stack_IsEmpty( Stack )
then
{ Проверим соответствие }
{ левой и правой скобок }
if Stack-Pop( Stack ) =
ToLeftC curChar )
then Good ;= true
end
end;
1 :• i+1 { Переходим к следующему символу }
end;
{ Проверяем ситуацию незакрытых левых скобок }
Good ;= Good and Stack_IsEmpty( Stack );
{ Очищаем стек в случае ошибки }
if not Good then
while not Stack_IsEmpty( Stack ) do
curChar := Stack_Pop( Stack );
{ Возвращаем результат выполнения функции }
TestExpression : = Good;
end;
var
s: TString; { Введенное пользователем выражение }
ExprLen; integer; { Число символов в выражении }
begin
{ Ввод выражения }
writeC ’Введите проверяемое выражение; ' );
ExprLen ;= 0;
while (ExprLen < MaxStrLen) and not eoln do
begin
ExprLen ;= ExprLen + 1;
readC s[ExprLen] );
end;
if not eoln then
{ Если пользователь ввел более }
{ MaxStrLen символов }
writelnC 'Обрабатываемое выражение-усечено до '.
MaxStrLen,' символов !' );
readln;
{ Сейчас в ExpLen хранится длина }
{ выражения в символах }
{ Проверка правильности расстановки скобок }
Приложение 2
Задачи по информатике,
предлагавшиеся
на олимпиадах прошлых лет
Задачи для самостоятельного решения
Задача 1. «Абракадабра»
Последовательность из латинских букв строится следующим образом. На первом
шаге она пуста. На каждом последующем шаге последовательность удваивается,
после чего к ней слева дописывается очередная буква латинского алфавита (а, Ь,
с,...). Ниже приведены первые шаги построения последовательности.
Пустая последовательность:
Шаг 1. а
Шаг 2. baa
ШагЗ. cbaabaa
Шаг 4. dcbaabaacbaabaa
Задача состоит в том, чтобы по заданному числу Доопределить символ, который
стоит на ЛО-м месте в последовательности, получившейся после 26-го шага.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
Во входном файле записано одно натуральное число У (1 <N< 226).
Формат выходных данных
Запишите в выходной файл символ, стоящий в позиции У получившейся последо-
вательности.
Задачи для самостоятельного решения 281
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
4 w
Задача 2. «Divide et impkra!»
На плоскости задано N прямых. Напишите программу, которая определяет, на
сколько кусков разбивают плоскость эти прямые.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
Исходные данные во входном файле записаны в следующем порядке: N, alf bucbdu
..., aN, bN, cN, dN, где 1 < N< 100, а пары чисел (a„ />,) и (c„ rf,) — целочисленные коор-
динаты двух различных точек, через которые проходит прямая с номером i. Все
данные разделяются пробелами и/или символами перевода строки.
Формат выходных данных
В выходной файл необходимо вывести одно целое число — искомое количество
кусков.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
3 7
0 0 0 2
0 2 2 0 2 0 0 0
Задача 3. «Два конвейера»
В цехе по производству напитков работают два конвейера. На первом конвейере
напиток разливается по бутылкам, а на втором происходит закупоривание буты-
лок. После схода с первого конвейера очередной бутылки она сразу же поступает
на второй. Поскольку тара используется различная, каждая бутылка имеет свое
время заполнение и время закупорки. Требуется написать программу, которая для
заданной последовательности бутылок:
а) определяет время, через которое последняя бутылка в этой последовательно-
сти будет закупорена (закупоривать можно лишь наполненные бутылки);
Ь) находит такую перестановку заданных бутылок, при которой суммарное время
разлива и закупорки бутылок было бы минимально, и определяет это время.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
282 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Формат входных данных
В первой строке входного файла содержится целое число У(1 <N< 1000) — коли-
чество бутылок. Далее идут N пар чисел: Х2 Y2, ..., XNYN. Здесь X, означает
время разлива, a Yt — время закупорки бутылки с номером i. Xi и Yt — неотрица-
тельные целые числа, не превосходящие 1 000 000. Все числа разделяются пробе-
лами и/или символами перевода строки.
Формат выходных данных
Первая строка выходного файла должна содержать время, требуемое для исход-
ной последовательности бутылок, вторая — минимально возможное время для
пункта b задачи. Третья строка должна содержать перестановку номеров бутылок
от 1 до ЛГ, для которой достигается минимальное время.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
3 490
200 40 370
100 100 321
30 90
Задача 4. «Антивирус»
Для распознавания различных вирусов программа HIVTEST использует набор
сигнатур. Если сигнатура вируса встречается в файле (последовательности литер),
то файл считается зараженным этим вирусом. Напишите программу, которая по
заданному набору сигнатур определяет, какими вирусами инфицирован анализи-
руемый файл.
Сигнатура вируса формально описывается следующим образом:
<сигнатура>::= <байт>|| | <сигнатура> <сигнатура>
<байт>::= <шестнадцатеричная цифра>
<шестнадцатеричная цифра>
<шестнадцатеричная цифра>::='0’|'Г ’2’ '3' ’4' '5' *6' '7'
’8' '9' ’А’ ’В' ’С ’D' ’Е’ ’F’
Например, 1F71E* — сигнатура, a *?FFF — не является сигнатурой. Байт (две
шестнадцатеричные цифры) в сигнатуре означает, что на этом месте в файле дол-
жен быть именно этот байт. Символ ' ?' означает, что на соответствующем месте
может быть любой байт. Символ ' * ’ заменяет любую, в том числе и пустую, после-
довательность байтов. Считается, что сигнатура присутствует в файле, если она
может быть правильно прочитана, начиная с некоторой позиции этого файла.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
Первая строка входного файла содержит количество различных вирусов N( 1 < N < 10).
В каждой из следующих N строк указано имя одного из вирусов, а через пробел —
Задачи для самостоятельного решения 283
соответствующая ему сигнатура. Имена вирусов не повторяются и состоят не более
чем из 20 латинских букв и цифр. Длина сигнатуры не превышает 100 символов.
В (N + 2)-й строке записан анализируемый файл (последовательность литер) в
шестнадцатеричном представлении (байты последовательно записаны как пары
шестнадцатеричных чисел). Длина анализируемого файла не превышает
10 000 байт.
Формат выходных данных
Выведите в выходной файл имена вирусов, которыми инфицирован заданный
анализируемый файл. Имена вирусов должны разделяться символами перевода
строки.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
4 small virus
small virus 2F3E?4F/ polymorph
bigvirus A5*FF?00*A6*23??24
vIRusamarlNA 1F?O7?5F
polymorph 22*33
22312F3E454F763318
Задача 5. «Новые гвозди»
На прямоугольный стол разложили У одинаковых листков бумаги со сторонами,
параллельными краям стола. Необходимо прибить листки к столу гвоздями так,
чтобы в каждый листок был вбит ровно один гвоздь, а каждым гвоздем прикреп-
лялся к столу хотя бы один листок. Гвозди нельзя забивать в границы листков
бумаги.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
В файле исходных данных записано количество листков N (1 < N< 100), длина
листка L и его ширина W (1 < L; W < 1000). Далее следуют описания АГ листков,
заданных координатами левого нижнего угла. Оси координат расположены по кра-
ям стола, начало координат находится в левом нижнем углу стола. Координаты
точек — пары неотрицательных целых чисел, не превосходящих 1000. Все числа
разделяются пробелами и/или символами перевода строки.
Формат выходных данных
Если вбить гвозди требуемым в условии способом невозможно, то необходимо
поместить в выходной файл строку вбить гвозди невозможно. Если искомый способ
существует, то программа должна вывести в выходной файл координаты гвоздей в
произвольном порядке. Координаты гвоздей — вещественные числа. Числа в вы-
ходном файле должны разделяться пробелами и/или символами перевода строки.
284 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
3 6 6
10 10 13 7.5
0 0 5 5 12 3
ПРИМЕЧАНИЕ Следующая группа задач предлагалась на университетской олимпиаде
студентов по информатике в 1997 году.
Задача 6. «Телефонная связь»
Поселок состоит из ЛГ домов, расположенных вдоль прямой дороги с одной сторо-
ны на равных расстояниях. Дома пронумерованы последовательно: 1, 2, 3, N.
В поселке проводят телефонную связь. В таблице Т указано, сколько телефонных
аппаратов надо установить в каждом доме. Расстояние между двумя соседними
домами считается равным единице.
Создать программу для определения номера дома, в котором надо установить
АТС, чтобы суммарное расстояние от АТС до всех телефонных аппаратов было
минимальным. Если таких домов несколько, достаточно найти любой. Каждый
телефон связан с АТС отдельным проводом.
Под расстоянием до телефонного аппарата подразумевается расстояние до дома,
в котором будет установлен аппарат. Расстояние от АТС до телефонного аппарата,
установленного в доме, где стоит АТС, считается равным нулю.
Технические требования
Входные данные берутся из текстового файла inputl.txt, первая строка которого
содержит число домов, вторая — линейную таблицу Т. Исходные данные коррект-
ны, их проверка не требуется.
Выходные данные — номер дома, где нужно поставить АТС, и суммарное рас-
стояние до всех телефонных аппаратов — выводятся на экран.
Пример файлов входных и выходных данных
6 АТС - в доме 4
10 3 113 Суммарное расстояние - 13
Задача 7. «Функция»
Целое положительное число М записывается в двоичной системе счисления, за-
тем разряды переставляются в обратном порядке. Получившееся число принима-
ется за значение функции В(М).
Создать программу для вывода в текстовой файл OUT.TXT значений функции
В(М) на отрезке [512,1023].
Задача 8. «Считалка»
Вокруг считающего стоят У человек, один из которых назван первым, а остальные
пронумерованы по часовой стрелке числами от 2 до N. Считающий ведет счет до М
начиная с первого. Человек, на котором остановился счет, выходит из круга. Счет
Задачи для самостоятельного решения 285
вновь начинается со следующего за выбывшим человека (при этом выбывшие
из круга не считаются), и так до тех пор, пока не останется один человек.
Определить начальный номер оставшегося человека.
Технические требования
Входными данными являются числа N и М, которые вводятся с клавиатуры. Ре-
зультат — номер оставшегося человека — выводится на экран.
Пример файлов входных и выходных данных
5 3 Номер оставшегося - 4
ПРИМЕЧАНИЕ Следующие задачи предлагались на городской студенческой олимпиаде
по информатике в 1997 году.
Задача 9. «Многоугольник»
Выпуклый многоугольник на плоскости задан целочисленными координатами
своих вершин. Требуется подсчитать количество точек с целочисленными коор-
динатами, лежащих на границе многоугольника.
Технические требования
Входными данными являются число вершин многоугольника и их координаты в по-
рядке обхода по часовой стрелке. Координаты вершин — целые числа и по модулю
не превосходят 1 000 000.
Входные данные берутся из текстового файла INPUT4.TXT, в первой строке кото-
рого указывается число вершин многоугольника, в каждой следующей строке —
пара координат. Результаты выводятся на экран.
Исходные данные корректны, их проверка не требуется.
Пример файлов входных и выходных данных
4 80
-10 -10
-10 10
10 10
10 -ГО
Задача 10. «Метеостанции»
На Южном полюсе расположены N пронумерованных метеорологических стан-
ций. Каждая станция соединена с другими станциями линиями связи. В результа-
те стихийного бедствия некоторые линии связи оказались нарушенными. Исправ-
ность линии связи между I-й и K-й станциями определяется из целочисленной
таблицы NET: элемент с индексами (/, К) равен 1, если связь между I-й и K-й стан-
циями не нарушена, и 0 — в противном случае.
Требуется определить, между какими парами станций связь невозможна даже
через цепочки других станций.
Создать программу для определения пар станций, между которым невозможно
установить связь.
286 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Технические требования
Входными данными являются число станций N и целочисленная таблица NET раз-
мером NxN.
Входные данные берутся из текстового файла INPUT5.TXT, в первой строке кото-
рого указывается число станций, в каждой следующей строке — очередная строка
таблицы. Результаты — пары номеров станций — выводятся построчно на экран.
Исходные данные корректны, их проверка не требуется.
Пример файлов входных и выходных данных
4
1 1 0 11 3
1 1 0 02 3
0 0 1 03 4
10 0 1
Задача 11. «Скобки»
Дано арифметическое выражение, состоящее из букв, однозначных чисел, знаков
арифметических операций и скобок, записанное в общепринятой форме. Требует-
ся удалить из выражения лишние пары скобок (то есть пары, не влияющие на по-
рядок выполнения операций).
Создать программу для удаления из заданного выражения лишних пар скобок.
Технические требования
Исходная строка с выражением вводится с клавиатуры.
Результат — упрощенное выражение — выводится на экран.
Пример файлов входных и выходных данных
((6/2)*А+(8-5))/(Е) (6/2*А+8-5)/Е
Задача 12. «Криптограмма»
Текст закодирован с помощью сетки, представленной ниже, где цифрой 0 обозна-
чено отверстие. Для того чтобы декодировать сообщение (криптограмму), нужно
наложить сетку на текст так, чтобы в отверстия можно было видеть символы зако-
дированного текста. Первый раз сетка накладывается так, чтобы сторона, отмечен-
ная знаком «+», была верхней, затем сетка поворачивается по часовой стрелке
на 90 градусов, читается следующий набор символов и так далее до полного обо-
рота сетки на 360 градусов.
10 10 10
11110 1
110 111
10 110 1
111110
1110 11
Создать программу для ввода закодированного текста по строкам и расшиф-
ровки его с помощью данной сетки.
Задачи для самостоятельного решения 287
Технические требования
Исходные данные — текст и сетка — задаются в виде квадратных таблиц в тексто-
вых файлах inpl.txt и inp2.txt, каждая строка таблицы размещается в отдельной
строке файла. Результат выводится на экран.
у
Пример файлов входных и выходных данных
ж б в у н р бурямглоюнебокроетвихриснежныекрутя
и ы н е я е
к х м б р р
о г у р л к
т и р я о о
с е н ю е т
10 10 10
11110 1
110 111
10 110 1
111110
1110 11
Задача 13. «Зоны»
Двумерная таблица Р[1:М, 1:7V] заполнена нулями и единицами. Цепочкой будем
называть последовательность единичных элементов таблицы, в которой последо-
вательно расположенные пары элементов таблицы являются соседними по гори-
зонтали, вертикали или диагонали. Смыкаясь концами друг с другом и с краями
таблицы, цепочки делят таблицу на «зоны», заполненные нулями. Своими индек-
сами Р и Q задается элемент таблицы. Требуется заполнить единицами зону таб-
лицы, в которой находится заданный элемент. Если заданный элемент окажется
единичным, то таблица не преобразуется.
Создать программу для получения из заданной таблицы другой таблицы, в ко-
торой зона с указанным элементом заполнена единицами, если указанный эле-
мент — нулевой.
Технические требования
Входными данными являются число строк Ми столбцов ЛГтаблицы, значения эле-
ментов таблицы и индексы задаваемого элемента.
Входные данные берутся йз текстового файла INP5.TXT, в первой строке которо-
го указываются числа М nN, в каждой следующей строке — очередная строка таб-
лицы, в последней строке файла — числа Р и Q.
Результат — новая таблица — выводится на экран.
Пример файлов входных и выходных данных
12 12
000000000000
011000000000
010111110000
010000001000
010011000100
010101000010
010011011110
010000010000
000000000000
011000000000
011111110000
011111111000
011111111100
011101111110
011111111'110
011111110000
288 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
010010011000
010101001000
011000110000
000000000000
5 8
011111111000
011101111000
011000110000
000000000000
Задача 14. «Лист бумаги»
Имеется прямоугольный лист бумаги, длина которого равна У см, а ширина М см.
С листом можно производить следующие операции: сгибать лист пополам, совме-
щая противоположные стороны листа; сгибать лист, совмещая одну строну с па-
раллельной ей линией сгиба; разгибать лист, при этом оставляя на нем линию сгиба.
Написать программу, которая определяет, можно ли свернуть лист так, чтобы
получился прямоугольник длиной Р см и шириной Q см. В случае утвердительно-
го ответа программа должна выдавать минимальное количество операций с лис-
том, необходимых для этого.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 5 секунд.
Формат входных данных
В первой строке входного файла содержатся вещественные числа ЛГ, А/, Ри Qb ви-
де десятичных дробей.
Формат выходных данных
Если лист можно свернуть, то первая строка текста должна содержать слово YES и
минимальное число операций, необходимых для этого. В противном случае пер-
вая строка текста должна содержать слово No.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
1 2 1 0.75 YES 4
Задача 15. «Система счисления»
Множество символов Z-ричной системы счисления (2 < 1< 36) образуют символы
О,..., 9, А, В,..., Z. Если I < 36, то соответствующее количество последних букв ла-
тинского алфавита в качестве цифр не используются. Если 1< 10, то не использу-
ются соответствующие цифры. Необходимо написать программу, которая по двум
текстовым строкам, означающим одно и то же число в Z-ричной и J-ричной систе-
ме счисления, определяет минимальные значения Z и J.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 10 секунд.
Задачи для самостоятельного решения 289
Формат входных данных
Во входном файле хранятся две строки символов, означающих первое и второе
числа. Длина строки — не более 40 символов.
Формат выходных данных
В выходном файле в текстовом виде должны содержаться пары чисел I и J или
слово No, если заданные числа не равны ни в каких из указанных (2 < I < 36 и
2 <J < 36) системах счисления.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
10 2 3
2
Задача 16. «Электрическая цепь»
В электрическую цепь включено N устройств. Устройство с номером I реагирует
на поступающие в сеть сигналы определенной частоты (частота — неотрицатель-
ное вещественное число), причем само тоже генерирует сигналы и посылает их в
цепь. Для каждого устройства задан диапазон частот сигналов (Л(7), В(Г)) (А(Г) и
В(Т) — неотрицательные вещественные числа, причем А(Г) < В(1)), на которые это
устройство реагирует (исключая эти числа) и посылает в цепь сигнал с частотой,
равной С(Г)*Х + D(I) (С(Г) и D(I) — вещественные числа), где X — частота посту-
пившего сигнала. Диапазоны различных устройств могут пересекаться, в этом слу-
чае все генерируемые сигналы распространяются одновременно. Работа цепи за-
канчивается, если ни один из распространяемых по ней сигналов не попадает
в диапазон ни одного устройства.
Напишите программу, определяющую по описанию всех устройств сети мно-
жество всех сигналов X, при подаче которых работа цепи никогда не закон-
чится.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
В первой строке входного файла содержится число устройств Х(1 < N< 20). В по-
следующих строках файла указываются четверки вещественных чисел Л(7), В(Г),
С(1), D(I) в виде десятичных дробей. Каждая четверка занимает отдельную строку
файла.
Формат выходных данных
В выходном файле указываются пары вещественных чисел — начала и концы диа-
пазойов частот сигналов, при подаче которых цепь никогда не закончит свою работу.
Если таких сигналов нет, то файл должен содержать слово No.
290 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
2
О 5 2 10 05
10 15 1 -10 10 15
Задача 17. «Точки»
Имеется ЛГ точек и известны расстояния между некоторыми из них. Нужно напи-
сать программу, которая проверяет, можно ли эти точки расположить на плоско-
сти так, чтобы указанные расстояния между ними сохранились.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
В файле исходных данных записано количество точек N (1 < ЛГ< 100) и расстояния
между некоторыми из них в виде: номер первой точки, номер второй точки, расстоя-
ние. Расстояние — вещественное неотрицательное число, не превосходящее 1000.
Номер точки — целое число из отрезка Все числа разделяются пробелами
и/или символами перевода строки.
Формат выходных данных
Ответом должно быть слово Yes или No (Yes — точки можно расположить, No — точ-
ки нельзя расположить).
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
3 No
1 2 10
2 3 20
3 1 100
Задача 18. «Выражение»
Заданы два математических выражения, содержащие целые числа, знаки сложе-
ния, вычитания и умножения, круглые скобки и переменные, длина которых не
более одного символа. Нужно написать программу, которая по заданным выраже-
ниям определяет, равны ли они тождественно при всех значениях переменных.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
В файле исходных данных записаны в отдельных строках два выражения.
Задачи с комментариями и решениями 291
Формат выходных данных
Ответом должно быть слово Yes или No (Yes — выражения тождественно равны,
No — выражения тождественно не равны).
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
a+b*(c+d) Yes
b*d+a+b*c
Задачи с комментариями и решениями
Задача 1. «Монеты»
Задача была предложена на Красноярской краевой олимпиаде школьников, а так-
же на Воронежской городской студенческой олимпиаде 2000 года. Одним из при-
зеров олимпиады был студент 3-го курса факультета прикладной математики и ме-
ханики Максим Сергеевич Ефремов. Ниже приводится его вариант решения задачи.
Условие задачи
В сундуке у мистера Z имеется У монет. На следующий год мистер Z взял из сун-
дука М монет. В каждый следующий год мистер Z добавлял в сундук столько мо-
нет, сколько у него было два года назад. Известно, что наХ-й год в сундуке мистера Z
было Y монет. Требуется определить, сколько монет было в сундуке изначально
и сколько монет мистер Z взял на второй год.
Формат входных данных
Файл Input.txt содержит числа X и У.
Формат выходных данных
Файл Output.txt содержит числа У и М.
Алгоритм решения
Алгоритм решения — чисто математический. Рассмотрим последовательность чисел:
А(1),А(2), ...,А(и),...
Здесь A(k) — число монет в сундуке на k-и год. Из условия задачи получаем:
А(1)=У,
А(2)=Х-М,
А(3) = 2N - М,
А(4) = 3N - 2М,
А(5) = 5N - ЗМ,
А(6) = 8N - 5М,
А(Х) = F(X)N - F(X - 1)М - У.
Здесь F(n) — последовательность чисел Фибоначчи, которые определяются
рекуррентными соотношениями:
292 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
F(l) = l
F(2) = 1
F(K) = F(K- 1) + F(X-2),X>2
Вполне очевидно, что для нахождения Ми Nдостаточно найти целочисленное
решение уравнения:
F(X)N - F(X-1)M « Y
Такое уравнение, вообще говоря, имеет счетное множество решений. Однако
в данном случае это множество конечно, поскольку А(п) > 0 для всех п. Следова-
тельно:
Л(Х)>Л(Х-2)дляК>2.
Таким образом:
M<N<Y
Программная реализация
Программная реализация сводится к нахождению целочисленного решения урав-
нения F(X)N - F(X-V)M - Y при условии М< N< Y. Программа находит все воз-
можные варианты ответа или выдает сообщение о том, что решения нет.
Program MoneY;
Var
F;Text;
X.Y;Integer;
Procedure Init; {ввод из файла}
Begin
As s1gn(F.’Input.txt');ReSet(F);
ReadLn(F.X.Y);
Close(F)
End;
Function GetValueCK;Integer);Integer; {получение F(k)}
Var I.A.B.C;Integer;
Begin
If K<=2 Then GetValue;=l
Else
Begin
A;=1;B;=1;
For I:=3 To К Do
Begin
C:=B;
B:=B+A;
A:=C
End;
GetValue:=B
End
End;
Procedure Run;{решение уравнения}
Var
M.N;Integer;
A,В;Integer;
T:Boolean: {флаг разрешимости уравнения; true - если решение есть}
Begin
Assign(F.'Output.txt');ReWrite(F);
A:=GetValue(X);
B:=GetValue(X-l);
Задачи с комментариями и решениями 293
T:=False;
For N;=l То Y Do
For М:ь0 To N Do
If A*N-B*M=Y Then
Begin
T:=True;
WriteLn(F.N,' \M)
End;
If Not T Then WriteLn(F.'Задача не имеет решения!');
Close(F)
End;
Begin
Init;
Run
End.
Задача 2. «Функция»
Задача была предложена на Московской олимпиаде школьников в 1991 году и на
Олимпиаде первокурсников факультета ПММ в 1998 году. Ниже приводится про-
грамма, разработанная студентом 4-го курса факультета ПММ ВГУ Олегом Вик-
торовичем Гладышевым.
Условие задачи
Функция F(n) для целых неотрицательных п определена так:
F(0) = О, F(l) = 1, F(2ri) = F(rc), F(2n + 1) = F(n) + F(w+1)
Для данного N нужно найти и напечатать F(ri). Обязательное условие: N столь
велико, что недопустимо заводить массив из У чисел.
Алгоритм решения
Основная идея алгоритма заключается в том, что при разложении F(2n + 1) на F(n)
и F(n + 1) мы должны вычислить 2 значения функции. Либо п, либо п + 1 окажется
нечетным, и для его вычисления понадобится опять вычислять 2 значения функ-
ции, а для четного аргумента еще одно. На первый взгляд кажется, что теперь нам
надо вычислить значения F для 3 аргументов, но на самом деле 2 из аргументов
всегда совпадут! То есть количество вычислений функции на каждом шаге не уве-
личивается. Пример:
F(26) = F(13) = F(6) + F(7) - F(3) + F(3) + F(4) = 2F(3) + F(4) =
« 2(F(1) + F(2)) + F(2) = 2F(1) + 3F(2) = 5F(1) = 5
Программная реализация
Program func; {Автор - Гладышев 0. В.}
var
с. {Текущий четный аргумент}
пс. {Текущий нечетный аргумент}
кс, {Коэффициент при четном аргументе}
кпс, {Коэффициент при нечетном аргументе}
n;LongInt;
{В переменной с всегда должен быть четный аргумент, а в пс - нечетный. Эта процедура
меняет местами значения переменных с и пс. если это необходимо}
Procedure Correct;
294 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
var Temp:LongInt;
Begin
if odd(c) then
Begin
Temp;=c;
c:=nc;
nc:=Temp;
Temp;=kc;
kc:=knc;
knc:=Temp;
End;
End;
Begin
WriteC'Введите число ');
ReadLn(N);
n:=abs(n); {Вычислим модуль n}
if n=0 then WritelnC’0’) else
Begin
while n mod 2 = 0 do
n;=n div 2; {уменьшаем n до нече'тного числа}
c:=n div 2; {Разложим n на четное}
nc;=n-c; {и нечетное числа}
if с=0 then kc;e0 else kc;el;
knc;=l;
while (c>2) or (nc>2) do
Begin
Correct; {поменяем с и nc, если нужно}
c;=c div 2; {получим новый аргумент}
kc;=kc+knc; {получим коэфф, при нем}
пс;=пс-с; {вычислим второй аргумент}
End;
WriteLn(Kc+knc); {Выведем результат}
ReadLn;{Подождем}
End;
End.
Задача 3. «Лабиринт»
Задача была предложена на общеуниверситетской олимпиаде по программирова-
нию, посвященной дню рождения факультета ПММ (март 2001 года). Ниже при-
ведено решение победителя олимпиады, студента 4-го курса факультета ПММ ВГУ
Антона Александровича Клинских.
Условие задачи
В результате рейда налоговой полиции города Обломова в фирму «Real» в одном
из небоскребов был обнаружен секретный уровень, на который вела только одна
лестница, а в некоторых местах были аварийные выходы (в виде люков в полу).
Согласно агентурным данным уровень представляет собой прямоугольник из М х N
комнат одинакового размера (М комнат вдоль западной стены, — вдоль север-
ной), причем между некоторыми парами соседних комнат есть двери. Положение
осложняется тем, что точные координаты входа и выходов неизвестны.
На разведку были отправлены обезьянки из местного зоопарка. Каждая из них
поднималась по лестнице и ходила по уровню, пока не натыкалась на какой-ни-
будь выход. После этого она спускалась по нему и сообщала свой маршрут началь-
Задачи с комментариями и решениями 295
ству. При этом первая обезьянка в начальной точке смотрела на север, а осталь-
ные — неизвестно куда. Маршрут каждой обезьянки представлен в виде последо-
вательности символов, представляющих движения и повороты:
* F— шаг вперед;
w R — поворот направо;
$ L — поворот налево;
& В — разворот;
я W — впереди стена, движения не было;
& Е — выход, конец маршрута (мржет идти только непосредственно после F).
Задача состоит в том, чтобы построить план обследованной части уровня, со-
держащий всю собранную информацию: стенки, проходы, выходы.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Время тестирования: 20 с/тест.
Входные данные
В первой строке входного потока задаются числа М и У, разделенные пробелами.
На следующей строке задается общее количество маршрутов. Далее идут мар-
шруты, представляющие собой последовательность символов F, R, L, В, W, Е, воз-
можно разделенных символами пробела. Каждый маршрут заканчивается симво-
лом Е, после которого начинается следующий маршрут.
Ограничения
Входные данные удовлетворяют следующим ограничениям: 1 < М < 50,1 < ЛГ< 50,
общее количество маршрутов — не более 100, общее количество символов в запи-
си маршрутов — не более 255.
Результат
Программа должна напечатать карту уровня размером (2М + 1) х (2^+ 1), нарисо-
ванную символами:
« пустая комната или проход обозначаются пробелом;
$ угол комнаты — знак +;
« северная/южная стенка — знак -;
* западная/восточная стенка — знак |;
& вход — знак *;
» выход — знак #;
я неизвестное состояние комнаты или стенки — знак ?.
Если существует несколько планов уровней, удовлетворяющих условиям зада-
чи, достаточно напечатать любой, если план построить не удается, программа долж-
на напечатать строку N0.
296 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Алгоритм решения
Для построения плана необходимо соотнести донесения всех обезьянок так, что-
бы они не противоречили друг другу. Используется бэк-трэкинг, расшифровываю-
щий маршрут очередной обезьянки, и, если это приводит к конфликту, последний
маршрут отменяется и производится попытка согласовать маршрут этой обезьян-
ки, предположив, что в начальный момент она смотрела в другую сторону, и т. д.
Если все четыре начальных направления обезьянки приводят к конфликтам, счи-
тается, что план для этой обезьянки построить не удается, что вызовет изменение
начального направления предыдущей обезьянки, и так далее до первой. Откат реа-
лизуется путем рекурсии, а состояния плана хранятся в стеке.
Если при ка^ой-либо комбинации начальных состояний всех обезьянок план
построен, он и является ответом. Если такой комбинации нет, плана не существует.
Программная реализация
Program Labirint; {Автор - Клинских А. А.}
const
MaxN=50;
МахМ=50;
type
TPolnt=record
x.y:integer
end;
PPlan=ATPlan;
TPlan=array[-2*MaxN..2*MaxN,-2*MaxM..2*MaxM] of char; {План}
TStack=ATElem;
TE1em=record
Plan;TPlan;
L,R.T.B:1nteger;
Next;TStack
end;
var
Stack;TStack; {Стек}
Input,Output:Text; {Файлы ввода-вывода}
M.N:integer; {Размеры поля}
NOfM:integer; {Число маршрутов}
L,R,T,В:integer; {Текущие границы поля}
Cur.Next.Dir:TPoint; {Текущая и следующая точки и направление,
куда смотрит обезьяна}
Р1ап:ТР1ап; {План}
Monkeys:аггау[1..10] of string; {Маршруты}
Тл лллядлкХХкХХлллXХХХлХлХХдX I
{Процедуры работы со стеком}
{Инициализация стека}
procedure InitStack;
begin
Stack;=nil
end;
{Добавление в стек}
procedure PushStack(var Pl an:TP1anJ.B.L.R:integer);
var
p:TStack;
begin
p:=Stack;
new(Stack);
Задачи с комментариями и решениями 297
Stack*.Plan;=Plan;
Stack*.Т:=Т;
Stack*.L;=L;
Stack*.R;=R;
Stack*.B;=B;
Stack*.next:=p
end;
{Извлечение из стека}
procedure Popstack(var Plan;TPlan;var T.B.L.R;Integer);
var
p:TStack;
begin
p;=Stack;
Stack;=Stack*.next;
T;=p*.T;
L:=p*.L;
R;=p*.R;
B;=p*.B;
Plan:=p*.Plan;
dispose(p)
end;
{Проверка стека на пустоту}
Function Empty;boolean;
begin
Empty:'Stack=nil
end;
лТлдлдлХллХХХлкЖкХХХХХдХХХХлХХккI
{Процедура чтения}
procedure InitlO;
var
1;1nteger;
begin
assignCinput,’input.txt’);
ass1gn(output,’output.txt’);
reset(input);
rewrite(output);
readd nput.M);
readln(input.N);
readln(input.NOfM);
For i:=l to NofM do
readln(1nput,Monkeys[1])
end;
{ - » I - « 11 i t I — 1.1-1-11 -I I i-_ t-_l--l .it—1_ I — l.l__l i__l^l l l l t l--l.ll l.i l-1 \
XXXXkXXXдлХХХХХХХлХХХХХХХХХддХХкХХХХкХХхХI
/----------------Алгоритм---------.---------}
Функция, "пытающаяся” расшифровать очередной маршрут}
Если удалось Построить план,возвращает true}
Function GetNextMonkey(norndnteger);boolean;
var
index;byte;
c:char;
begin
GetNextMonkey;=False;
index;=l; {Номер очередного символа в маршруте}
repeat
с:'Monkeys[nom][1ndex];
case c of
’F’.begin {Если был шаг вперед}
if (Plan[Next.x.Next.y] in [‘ ’,’?’]) then {Если впереди стенка,}
298 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
begin {шагать туда нельзя}
Cur:=Next;
Next.x:=Cur.x+D1r.x; Next.у:“Cur.y+D1r.y;
Plan[cur.x.cur.y]: = ' ':
if Monkeys[nom][1ndex+1’E’ then {Обезьянка здесь вышла}
begin i
GetNextMonkey:=Plan[Next.x,Next.y] in ['?'.'#']; {если это невозможно}
if [Plan[Next.x.Next.y]]*[’?’,'#']“[] then exit; {запоминаем ошибку}
Plan[Next.x.Next.y]:“'#' {иначе устанавливаем выход}
end;
if Plan[Next.x,Next.y] in ['?’] then
Plan[Next.x,Next.y]:=' ’;
Cur:“Next;
Next.x:“Cur.x+Di r. x; Next.у:=Cur.y+Di г.у;
if cur.y>“T then T:“cur.y+1; {Изменяем местоположение обезьянки}
if cur.y<=B then B:ecur.y-1: {и габариты плана(если нужно)}
if cur.x>=R then R:“cur.x+1:
if cur.x<=L then L:ecur.x-1;
if ((T-B+1)>2*M+1) or ((R-L+l)>2*N+1) then
exit; {План слишком большой}
if РТапЕсиг.х.сиг.у]’'#' then
begin {Пришли на выход:проверим сообщение обезьянки}
GetNextMonkey:=FMonkeys[nom][index+l]“'E’; {и выйдем}
exit
end
end
else
exit
end;
’L':begin {Повернем обезьянку налево}
if dir.x=0 then
begin
dir.x:“-dir.y;
dir.y:e0
end
el se
begin
dir.y:“dir.x;
dir.x:“0
end;
Next.x:*Cur.x+Di г.x; Next.y:=Cur.y+Di г.у
end;
'R’:begin {Повернем обезьянку направо}
if dir.x-0 then
begin
dir.x:“dir.y;
dir.y:=0
end
else
begin
dir.y:“-dir.x;
dir.x:“0
end;
Next.x:“Cur.x+Di r.x; Next.y:-Cur.y+Di г.у
end;
'B^begin {Развернем обезьянку}
dir.x:e-dir.x;
dir.y:“-dir.y;
Задачи с комментариями и решениями 299
Next.х:=Cur.x+Di г. х; Next.у:=Cur.y+Di г.у
end;
'W: begin {Впереди стенка}
if Pl an[Next.х.Next.у] in |then
begin
if dir.x=0
then Plan[Next.x.Next.y]:=’-' {вертикальная или горизонтальная}
else Plan[Next.x.Next.y]:='Г:
if Next.y>T then T:=Next.y;
if Next.y<B then B:=Next.y;
if Next.x>R then R:=Next.x; {Изменяем габариты плана(если нужно)}
jf Next.x<L then L:=Next.x
end
el se
exit
end
end;
inc(index)
until c='E':
GetNextMonkey;=True {Если не было аварийных выходов.все в порядке}
end;
{Функция, находящая план по всем маршрутам начиная с рог.}
{Рекурсивно вызывает саму себя, пока не использует все маршруты}
{Если удалось построить план.возвращает true}
Function GetMonkeys(рог;i nteger);boolean;
var
tO.b0.10.r0:integer;
D;TPoint;
p;PPlan;
OK:boolean;
Count:integer;
begin
if por>NOfM then
begin {Все маршруты согласованы}
GetMonkeys:=True; {Запоминаем.что план построен}
new(p);
while not Empty do {Очищаем стек}
PopStack(px.TO.BO.LO.RO);
exit
end;
Count;=1;
d.x:=0; d.y:=l;
repeat
Dir:=D;
Cur.x:=0; Cur.y:=0:
Next.x:=Cur.x+Dir.x: Next.y:=Cur.y+Dir.y;
PushStack(Plan.T.B.L.R): {Сохраняем настройки}
OK:=GetNextMonkey(por) and GetMonkeys(por+1); {Добавляем маршрут}
if OK then break: {Если OK. выходим}
PopStack(Plan.T.B.L.R); {иначе восстановим настройки}
if d.x=0 then {и повернем обезьянку}
begin
d.x:=d.y; d.y:=0
end
el se
begin
d.y;=-d.x;d.x:=0
end;
300 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
inc(Count)
until (Count=5) or OK;
GetMonkeys;=0K
end;
it**********************************
{Инициализация поля}
procedure Clear;
var
i. j; i nteger;
begin
For i;=-MaxN to MaxN do
For j;=-MaxM to MaxM do
if oddCabsCi)) and oddCabsCj)) then
Plan[i,else Plan[i.;
PlanEO.O]:»’*'
end;
{Вывод плана}
procedure ShowPTan;
var
i .j integer;'
begin
For i:=T downto T-2*M do
begin
For j;=L to L+2*N do
begin
if (i=T) or (i=T-2*M) then
if odd(j-L) then
writeCoutput.
el se
writeCoutput,’+’)
el se
if (j=L) or (j=L+2*N) then
if odd(T-i) then
writeCoutput.'|')
el se
writeCoutput.'+’)
el se
writeCoutput.Plan[j.1]);
end;
writeln(output);
end
end;
{Вывод,сообщения об ошибке}
procedure ShowError;
begin
writelnCoutput.’NO’)
end;
{Закрываем использованные файлы}
procedure CloselO;
begin
close(input);close(output)
end;
begin {Основная программа}
InitIO;
Clear;
if GetMonkeys(l) then
ShowPlan
el se
Задачи с комментариями и решениями 301
ShowError:
CloselO
end.
Задача 4. «Прямоугольники»
Задача предлагалась в 1998 году на олимпиаде первокурсников факультета ПММ
ВГУ. Автор решения — одна из призеров олимпиады, Лусине Азатовна Мхитарян,
в настоящее время студентка 5-го курса факультета ПММ.
Условие задачи
На плоскости задано У прямоугольников с координатами вершин (XU, YU), (X2i,
Y2i), (X3i, Y3i), (X4i, У40, i - 1,2, 3, ...tN. Известно, что все стороны прямоуголь-
ников параллельны осям координат. Все прямоугольники являются замкнутыми
множествами, то есть содержат свою границу. Будем считать, что прямоугольники
пересекаются, если они имеют хотя бы одну общую точку (в том числе и на границе).
Необходимо определить количество фигур, образованных в результате нало-
жения прямоугольников.
Входные данные
В первой строке (1 < N < 100) — число прямоугольников.
В каждой последующей — их координаты, заданные целыми числами:
-1000<Х17. Г17 ,Х21 ,Y2i ,X3i ,Y3i Mi. Г47<1000) 7=1. 2. 3.N.
Выходные данные
Число фигур.
Алгоритм решения
Задача решается с использованием элементов теории графов.
Строится матрица инцидентности М, где M[I,J] - 1, если /-й прямоугольник
пересекается с J-м. Остается лишь определить число компонентов связности по-
лученного графа.
Программная реализация
Program Rectangular: {Автор - Мхитарян Л. А.)
Const MaxN=100:
Type TRec=Record
XA.YA.XB.YB:Integer
End:
Var PA:Array [l..MaxN] of TRec:
M:Array[l..MaxN.1..MaxN] of Boolean:
N.FC:Integer:
BA:Array[1..MaxN] of Boolean:
Function Min(A.В:Integer):Integer:
Begin
If A>B Then Min:=B
Else Min:=A
End:
Functi on Max(A.В:Integer):Integer:
Begin
302 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
If А<В Then Мах—В
Else Мах—А
End;
Procedure Init;
Var F:Text;I,X1,Y1,X2,Y2,X3,Y3,X4.Y4:integer;
Begin
AssignCF,’input.txt’);ReSet(F);
ReadLn(F.N);
For I—1 to N do
Begin
ReadLn(F,Xl,Yl,X2,Y2,X3,Y3,X4,Y4);
PA[I].XA—Min(Min(Xl,X2) ,Min(X3.X4));
PA[I].YA—Min(Min(Yl,Y2) ,Min(Y3,Y4));
PA[I] .XB—Max(Max(Xl,X2) ,Max(X3,X4));
PA[I].YB—Max(Max(Yl,Y2) ,Max(Y3,Y4));
End;
For I—1 to N do
For Xl—1 to N do
M[I ,X1J—False;
For I—1 to N do
BA[IJ—False;
Close(F)
End;
Function Check (I, J; Integer) -.Boolean;
{Проверка: пересекаются ли I-й и J-й прямоугольники}
Var Rl,R2:TRec;
Begin
Check—False;
If PA[I].XA<PA[J].XA Then Begin R1 -PA[I];R2-PA[J] End
Else Begin R1-PA[J];R2-PA[I] End;
If R1.XB>=R2.XA Then Begin
If (Rl.YB>=R2.YA) and (R1.YB<=R2.YB) Then Check-True;
If (R2.YB>=R1.YA) and (R2.YB<=R1.YB) Then Check-True
End
Else
End;
Function GetPodGraph:Boolean;
{Выделение компонента связности графа}
Var U.К,Т:Integer;
Begin
Т—-1;
For I—1 to N do
If not BA[I] Then Begin T—I;Break End;
If T=-l Then Begin GetPodgraph—False; Exit End;
. M[T.T]—True;
For I—1 to N do
For J—1 to N do
For К—1 to n Do
If M[J.J] Then
If M[J.K] Then M[K,K]:-True:
For I—1 to N do
If not BA[I] and MCI.I] Then BA[I]-True;
GetPodGraph—True
End;
Procedure Run;
{Вычисление количества подграфов}
Var I.J:Integer;
Begin
FC—0;
Задачи с комментариями и решениями 303
For I:=l to N do
For J:=l to N do
If I<>J Then M[I,J]:=Check(I,J);
While GetPodgraph do
Begin
Inc(FC);
For I:=l to N do
If M[I.I] then M[I.I]-False;
End;
End;
Procedure Done;
{Вывод результатов}
Var F;Text;
Begin
Assign(F,’output.txt');ReWrite(F);
WriteLn(F.FC);
Close(F);
End;
Begin
Ini t;
Run;
Done
End.
Задача 5. «Трубопровод»
В основу условия положена задача, которая предлагалась на четвертьфинале ми-
рового первенства по программированию 2000 года (г. Саратов). Автор програм-
мы — член сборной ВГУ по программированию, в настоящее время студент 5-го
курса факультета ПММ ВГУ Андрей Евгеньевич Поляков.
Условие задачи
Пусть имеется трубопровод, заданный прямой линией на плоскости Ах + By + С = О,
и два города с координатами (XI, Yl), (Х2, Y2). Необходимо соединить эти два города
трубопроводом, истратив при этом наименьшее число труб; указать суммарную
длину использованных труб и две точки, где происходит соединение трубопроводов.
Входные данные
Целые числа -100 000 < А,В,С < 100 000 — параметры трубопровода.
Целые числа -100 000 < XI, У1 < 100 000 — координаты первого города.
Целые числа -100 000 < Х2,У2 <• 100 000 — координаты второго города.
Выходные данные
В первой строке указывается суммарная длина использованных труб.
Во второй и третьей соответственно — координаты точек соединения трубопро-
водов.
Алгоритм решения
Рассмотрим две возможности.
« Точки лежат с разных сторон от прямой. Тогда для их соединения достаточно
опустить на прямую перпендикуляры из этих точек. На выходе получим сумму
длин этих перпендикуляров и их точки пересечения с прямой.
304 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
& Точки лежат по одну сторону от прямой. Здесь возможны три случая.
□ Одна точка соединяется с другой, из которой затем опускается перпендику-
ляр на прямую. На выходе: длина перпендикуляра плюс расстояние между
точками, координаты точки пересечения перпендикуляра и прямой, коор-
динаты самой ближней к прямой точки.
□ Существует третья точка, для которой выполняется условие: перпендику-
ляр из этой точки к прямой и отрезки, соединяющие эту точку с двумя за-
данными, образуют угол 120 градусов. На выходе — длина перпендикуля-
ра + сумма расстояний, координаты третьей точки и ее проекции на прямую.
□ Для соединения точек достаточно Спустить из них перпендикуляры на пря-
мую.
Программная реализация
Program Tubes; {Автор - Поляков А. Е.}
Var XI.Yl.Х2.Y2.А,В.С;Longlnt;
Procedure Init;
{Инициализация}
Var F;Text;
Begin
Assign(F.’input.txt');ReSet(F);
ReadLn(F.A.B.C);
ReadLn(F.Xl.Yl);
ReadLn(F.X2.Y2);
Close(F)
End;
Function TestLocation;Boolean;
{Проверка местонахождения заданных точек. Возвращает True, если точки расположены с
одной стороны, и False - в противном случае }
Begin
TestLocation;=(A*Xl+B*Yl+C)*(A*X2+B*Y2+C)>0
End;
Function Dest(X.Y:Double):Double;
{Вычисление длины вектора}
Begin
Dest:=Sqrt(Sqr(X.)+Sqr(Y))
End;
Procedure Proj(X,Y:Double;Var TX.TY:Double);
{Вычисление проекции точки (X.Y) на прямую}
Begin
TX:=(-C*A+Sqr(B)*X-A*B*Y)/(Sqr(A)+Sqr(B));
TY;=(-C*B-A*B*X+Sqr(A)*Y)/(Sqr(A)+Sqr(B));
End;
Function FindDifferentSideDest(Var txl.Ту1.Tx2.ty2;Double);Double;
{Решение задачи для случая 1}
Var D;Double;
Begin
Proj(Xl.Yl.Txl.Tyl);
D:=Dest(TXl-Xl.TY1-Y1);
Proj(X2.Y2.Tx2.Ty2);
Fi ndDi fferentSi deDest:=D+Dest(TX2-X2.TY2-Y2)
End;
Procedure FindPoint(PX.PY.X.Y.D:Double;Var TX,TY:Double);
Задачи с комментариями и решениями 305
{Нахождение координат точки на прямой, из которой точка (х.у) видна под углом 30
градусов
Var TX1.TX2.TY1.Ty2.Sq;Double;
Begin
Sq:=sqrt(3)*D/Sqrt(Sqr(A)+Sqr(B));
TXl;=PX+B*sq;TYl:=PY-A*Sq;
TX2:=PX-B*Sq;TY2:=PY+A*Sq;
PX:-Dest(TXl-X.Tyl-Y);
PY:=Dest(TX2-X.Ty2-Y);
If Px<Py Then Begin Tx:=Txl;Ty:=Tyl End
Else Begin Tx:=Tx2;Ty:=Ty2 End
End;
Function FindOneSideDest(Var txl.Tyl.Tx2.ty2;Double):Double;
{Решение задачи для случая 2
Var DI.D2.РХ1.PY1.Px2.Py2.LX1.LY1.LX2.LY2. T.Res:Doubl e;
Begin
Proj(Xl.Yl.PXl.PYl);
Dl;=Dest(PXl-Xl,PYl-Yl);
F1ndPoint(PXl.PYl.X2.Y2.Dl.Lxl.Lyl);
Proj(X2,Y2.PX2.PY2);
D2;»Dest(PX2-X2.PY2-Y2):
FindPoint(PX2,PY2.Xl,Yl.D2,Lx2.Ly2);
{Случай 2 в}
Res;=Dl+D2:
Txl;=Pxl;Ту1;=Pyl;Tx2:=Px2;Ty2:=Py2;
{Случай 2 a}
T:=Dest(X2-Xl.Y2-Y1);
If (D2>T) or (D1>T) Then
If D1>D2 Then Begin Txl;=x2;tyl;«Y2;Tx2:=Px2;Ty2;=Py2;Res;=D2+T End
Else Begin Txl;»xl;tyl:=Yl;Tx2:=Pxl;Ty2:=Pyl;Res:=Dl+T End;
Случай 2 6}
T;=Dest(LXl-LX2.LYl-LY2)/2;
T;=T/sqrt(3):PXl;»Dest(Lxl-Xl.Lyl-Yl);PYl;«Dest(Lx2-X2.Ly2-Y2);
If (2*T < PX1) and (2*T < PY1) and
(Dest(Lx2-Xl.Ly2-Yl)<PYl) and (Dest(Lxl-X2.Lyl-Y2)<PXl) then
Begin
Pxl;=(Lxl+Lx2)/2;Pyl:=(Lyl+Ly2)/2;
Px2;»Pxl-T*A/Sqrt(Sqr(A)+Sqr(B));Pxl;-Pxl+T*A/Sqrt(Sqr(A)+Sqr(B));
PY2;=Pyl-T*B/Sqrt(Sqr(A)+Sqr(B));PYl;=Pyl+T*B/Sqrt(Sqr(A)+Sqr(B));
T;»2*(D1+D2)-3*T;
If Res>T Then Begin
Res;=T;
If (A*PXl+B*PYl+C)*(A*X2+B*Y2+C)>0 Then
Begin Tx2;=Pxl;Ty2;=Pyl End
Else Begin Tx2;=Px2;Ty2:=Py2 End;
Txl;=(Lxl+Lx2)/2;Tyl;=(Lyl+Ly2)/2
End
End;
F i ndOneSi deDest:=Res
End;
Procedure Done;
{Вывод результатов}
Var F;Text;Txl.Tyl.tx2.ty2.D;Double;
Begin
AssignCF.’output.txt’);ReWrite(F);
If not TestLocation Then D;=F1ndD1fferentSideDest(Txl.Tyl.Tx2.Ty2)
Else D:eFindOneSideDest(Txl.Туl.Tx2.Ty2);
WriteLn(F.D:l:4);
11 Зак. 906
306 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Wr1teLn(F,Txl:l:4,’ ’,Ту1:1:4):
WriteLn(F,Tx2:l:4,' ',Ту2:1:4);
Close(F)
End:
Begin
Init;
Done
End.
Задача 6. «Телебашня»
Задача была предложена на общеуниверситетской олимпиаде по программирова-
нию, посвященной дню рождения факультета ПММ (март 2001). Ниже приводится
решение победителя олимпиады, студента 4-го курса факультета ПММ ВГУ Ми-
хаила Михайловича Ширяева.
Условие задачи
В результате пожара полностью сгорела телевизионная башня города Обломова,
и все население города осталось без телевидения. Чтобы восстановить телевеща-
ние в кратчайшие сроки, мэр города распорядился разместить передатчики на кры-
шах некоторых домов. Однако ситуация осложняется наличием в городе нескольких
небоскребов, владельцы которых установили у себя на крыше антенну спутнико-
вой системы See++ и поэтому не дают согласия на установку там передатчиков.
Более того, эти небоскребы являются преградой на пути распространения сигна-
ла, поэтому установки одного передатчика может оказаться недостаточно. Мэр
хочет установить минимальное количество передатчиков так, чтобы зоны распро-
странения сигнала покрывали весь город, исключая, возможно, территорию, зани-
маемую упомянутыми выше небоскребами.
Город Обломов представляет собой прямоугольник кварталов. Все кварта-
лы имеют форму квадрата равной площади, а ширина улиц незначительна по срав-
нению с размерами квартала. Каждый небоскреб занимает полностью один квар-
тал.
Каждый квартал (кроме небоскребов) имеет единственную телевизионную ан-
тенну точно в центре и считается охваченным телевещанием, если существует ка-
кой-нибудь передатчик, который находится в прямой видимости от антенны. Пере-
датчики могут располагаться только точно в центре квартала.
Сигнал распространяется строго по прямой. Если на пути от передатчика к ан-
тенне сигнал лишь касается небоскреба, сигнал доходит до антенны. Других не-
боскребов в городе нет. Квартал, в котором установлен передатчик, считается охва-
ченным телевещанием.
Программа должна найти минимальное количество необходимых передатчи-
ков и указать места их размещения.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Время тестирования: 20 с/тест.
Задачи с комментариями и решениями 307
Входные данные
Первыми задаются два числа от 1 до 14, которые определяют количество кварта-
лов в городе с запада на восток по оси х и с юга на север по оси у соответственно.
Далее идет число от 1 до 195, задающее количество кварталов, занятых небоскре-
бами, после чего перечисляются пары х, у координат кварталов. Координаты квар-
талов отсчитываются от 1.
Все числа во входных данных разделяются произвольным количеством про-
бельных символов. В городе существует хотя бы один квартал (дом мэра), не являю-
щийся небоскребом.
Результат
Программа должна напечатать минимально необходимое число передатчиков, по-
сле чего перечислить координаты кварталов, в которых они должны быть установ-
лены.
Алгоритм решения
Алгоритм основан на рекурсии. На каждом ее шаге на карту ставится антенна и вы-
числяются кварталы, охваченные вещанием. Если до всех кварталов доходит сиг-
нал, то расположение антенн запомцнается, при условии, что до этого не найдено
расположение с меньшим числом антенн.
Для хранения информации о расположении антенн, небоскребов и кварталов,
охваченных вещанием, используются множества. Кроме того, информация о рас-
положении небоскребов дублируется в массиве, что позволяет ускорить работу
программы.
Программная реализация
program Town; {Автор - Ширяев М. М.}
const
Nmax=14; {макс, число кварталов по горизонтали<=16}
Мтах=14; {по вертикали<=16}
Lmax=Nmax*Mmax; {макс, число кварталов}
type
TNum=l..Lmax; {тип индексов кварталов}
TSet=set of TNum; {тип множества кварталов}
TRec=record {координаты квартала}
х.у:integer
end;
TArr=array[TNum]of TRec;
var
neb. {множество небоскребов}
ant;TSet; {множество антенн}
arr_neb;TArr; {массив небоскребов}
n.m, {число кварталов по горизонтали и вертикали}
neb_num, {число небоскребов}
ant_num:integer; {число антенн}
function Getlndex(x,y:integer):integer;{индекс квартала}
begin
GetIndex:=(y-l)*Nmax + x
end;
308 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
procedure GetCoordCa:integer;var x.у integer): {поиск координат квартала}
begin
х:=(а-1) mod Nmax + 1;
y:=(a-l) div Nmax + 1
end;
procedure Load;{загрузка карты}
var
f;text;
1:integer;
begin
neb:=[]:
Assign(f.'input.txt’):Reset(f);
read(f.n.m.nebjnum);
for i;=l to neb_num do with arr_neb[i] do
begin
read(f,x,y);
neb;=neb+[GetIndex(x. у)]
end:
Close(f)
end;
procedure Save:{запись числа и расположения антенн}
var
f:text;
i.x.y:integer;
begin
Assign(f.’output.txt');Rewrite(f);
write!n(f,’Число антенн:');
write!n(f,ant_num);
writeln(f.’Координаты антенн:');
for i;=l to Lmax do
if i in ant then
begin
GetCoord(i,x,y);
writeln(f,x.’ ’ .y)
end:
Close(f)
end;
function Wave(al.a2:integer):boolean:
{проходит ли волна между кварталами al и а2}
const
eps=O.01;{допустимое отклонение от угла квартала}
half=0.5-eps;
var
xl.у1,х2,у2.х.у.{координаты кварталов al. а2 и проверяемого небоскреба}
i.t:integer:
^коэффициент наклона прямой},р1.р2{точки пересечения с небоскребом}:real;
begin
Wave:=true:
GetCoord(al.xl.yl);
GetCoord(a2.x2.y2);
if xl=x2 then
begin
if yl>y2 then
begin
t:=yl: yl:=y2: y2:=t
end;
for i:=l to neb_num do with arr_neb[i] do
Задачи с комментариями и решениями 309
if (x=xl)and(yl<=y)and(y<=y2)then begin Wave:=false: Exit end
end
el se
if yl=y2 then
begin
if xl>x2 then
begin
t:-xl; xl:=x2; x2:=t
end;
for i:=l to neb_num do with arr_neb[i] do
if (y=yl)and(xl<=x)and(x<=x2)then begin Wave:=false; Exit end
end
el se
begin
k:=(y2-yl)/(x2-xl);
for i:=l to neb_num do with arr_neb[i] do
begin
k:=(y2-yl)/(x2-xl);
pl:»k*(x-0.5-xl)+yl;
{можно задеть угол}
if (y-half<pl)and(pl<y+half)then begin Wave:=false; Exit end;
p2:=‘k*(x+0.5-xl)+yl;
if (y - half<p2) and (p2<y+half) then begin Wave;=false; Exit end;
if (abs(y-0.5-pl)<eps)and(abs(y+0.5-p2)<eps)or
(abs(y+0.5-pl)<eps)and(abs(y-0.5-p2)<eps)
then begin Wave:=false; Exit end;{проходит через углы небоскреба}
k:=(x2-xl)/(y2-yl);
pl:»k*(y-0.5-yl)+xl;
if (x-half<pl)and(pl<x+half)then begin Wave:=false; Exit end:
p2:«k*(y+0.5-yl)+xl;
if (x-half<p2)and(p2<x+half)then begin Wave:=false; Exit end
end
end;
end;
function Cover(var map;TSet:new_a:integer):boolean;
{покрыть карту map проходящим сигналом из антенны new_a}
var х.у.а:integer;
begin
Cover:=true;
for x:»l to n do
for y;=l to m do
begin
a:»GetIndex(x,y);
if not(a in map) and not(a in neb) then
if Wave(new_a.a) then map:»map+[a] else Cover:=false
end
end;
procedure Think:{расстановка антенн}
var
vspomiTSet;{рабочее расположение}
num:integer;{рабочее число антенн}
procedure Step(map:TSet:new_a:i nteger);
{поставить антенну new_a на карту map}
var x.y:integer:
begin
if not Cover(map,new_a) then
for x:=l to n do
310 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
for у:=1 to m do
begin
new_a:=GetIndex(x.y):
if not(new_a in map)and not(new_a in neb) then
begin
vspom:=vspom+[new_aj; inc(num):
Step(map,new_a):
vspom:=vspom-[new_a]; dec(num)
end
end
else
if num<ant_num then
begin
ant_num:=ni|m;
ant:=vspom
end
end:
var
x.y, a integer:
begin
ant:=[]: ant_num:=Lmax+l:
for x:=l to n do{ciaBHM в качестве 1-й различные антенны}
for у:=1 to m do
begin
a:=GetIndex(x.y):
if not(a in neb) then
begin
vspom:=[a]: num:=l:
Step(CJ.a)
end
end
end:
begin
Load:
Think:
Save
end.
Приложение 3
Интегрированная
инструментальная среда
Turbo Pascal
(Borland International)
После того как вы завершили процесс разработки алгоритма и записали его в виде
программы на языке Паскаль, необходимо поместить этот текст в файл на магнит-
ном диске, перевести на язык машинных команд и загрузить в память ЭВМ для
выполнения с тем или иным набором исходных данных. Каждое из перечислен-
ных действий реализуется с помощью соответствующей компьютерной програм-
мы, относящейся к классу инструментальных, то есть используемых в качестве
средств для создания других программ.
Размещение текста программы (исходного текста) в файле на магнитном диске
осуществляется с помощью программ, называемых текстовыми редакторами. Они
позволяют создавать и корректировать текст, отображая его на экране дисплея.
Программа в виде исходного текста не может быть непосредственно выполнена
компьютером: предварительно она должна быть преобразована в последователь-
ность машинных команд. Это преобразование выполняется специальными про-
граммами компиляции (компиляторами) и компоновки (компоновщиками, или лин-
керами).
Фирмой Borland International (США) была разработана система, объединив-
шая основные инструментальные средства для разработки программ на собствен-
ном диалекте языка Паскаль — языке Turbo Pascal. Эта система получила название
интегрированной инструментальной системы Turbo Pascal. Термин «интегриро-
ванная» указывает на связь всех входящих в нее компонентов. Войдя в среду Turbo
Pascal, вы сможете выполнить все этапы разработки программы начиная от созда-
ния исходного текста до ее отладки. В состав системы входят:
экранный редактор;
& компилятор с языка Паскаль;
312 Приложение 3. Интегрированная инструментальная среда Turbo Pascal
& компоновщик;
отладчик.
Для входа в систему Turbo Pascal необходимо ввести в командной строке ко-
манду turbo.
При использовании средств оболочки Norton Commander то же самое можно
сделать, установив курсор на строку оглавления с именем файла turbo.exe или лю-
бого файла с расширением .pas и нажав затем клавишу Enter.
В обоих случаях сразу после загрузки системы начинает работать экранный
редактор, выводящий на экран терминала окно редактора. При вызове системы
по имени файла с расширением .pas в окне размещается содержимое этого файла,
а в верхней строке окна — его название. При первом способе входа в систему окно
редактора, как правило, бывает пустым, а в строке имени файла указывается NОNА-
MEOO.PAS — неименованный (файл).
Теперь вы можете либо начать редактировать файл, либо, если имеющийся текст
программы вас устраивает, приступить к ее выполнению. Но прежде, чем перейти
к описанию соответствующих действий, обратим ваше внимание на еще одно об-
стоятельство. В первой строке экрана терминала размещается основное меню сис-
темы. Оно представляет собой строку с названиями пунктов меню, каждый из
которых позволяет выполнить определенное действие. Для перехода в меню сле-
дует нажать клавишу F10. С отдельными пунктами меню мы будем знакомиться
по ходу дальнейшего изложения. Пока же отметим, что система Turbo Pascal снаб-
жена справочной подсистемой, обращение к которой осуществляется выбором
пункта Help основного меню. При этом на экране разворачивается окно с кон-
текстной подсказкой, то есть информацией, относящейся к конкретной ситуации,
в которой вы обратились за справкой. К сожалению, справочные тексты даны на
английском языке, что делает их совершенно бесполезными для некоторых пользо-
вателей.
Экранный редактор
Экранный редактор системы Turbo Pascal выполняет разнообразные команды ре-
дактирования, которые условно можно разбить на пять групп:
& команды перемещения курсора;
& команды поиска фрагментов;
команды вставки и удаления;
& команды работы с блоками текста;
& прочие команды.
Язык Паскаль не накладывает жестких требований на формат записи текста
программы. Однако для удобства работы с текстом настоятельно рекомендуем вам
соблюдать следующие правила.
& Использовать систему отступов при записи вложенных операторов или опера-
торов, заключенных в операторные скобки begin и end. Такой способ записи на-
глядно показывает структуру программы.
Экранный редактор 313
Например:
while х<>у do
begin
if х>у
then х := х-у
else у := у-х:
writeln ( х:5, у:5 )
end
Не следует в одной строке записывать несколько операторов, кроме, может быть,
простейших. В противном случае вы рискуете сильно усложнить себе жизнь
при отладке программы.
$ Объектам программы следует давать имена, отражающие их суть. Не избегайте
длинных имен, если они помогают лучше понять смысл программы. За редким
исключением не следует использовать однобуквенные имена вроде А, В и т. д.
® Используйте комментарии для выделения в тексте логически завершенных
фрагментов.
Например:
{ поиск минимального элемента в массиве }
(* сортировка таблицы записей *)
Теперь рассмотрим комбинации клавиш, предназначенные для выполнения
отдельных групп команд.
Клавиши перемещения курсора
& или —> — перемещение на один символ влево или вправо.
? или чк — перемещение на одну строку вверх или вниз.
Ctrl+<--перемещение на одно слово влево.
CtrL+—> — перемещение на одно слово вправо.
& Ноте — перемещение к началу строки.
& End — перемещение к концучСтроки.
Ctrl+Home — перемещение в начало первой строки окна редактора.
Ctrl+End — перемещение в начало последней заполненной строки окна.
зв PgUp — перемещение на одну страницу вверх, то есть сдвиг по тексту на величину
экрана минус одна строка.
PgDn — то же, но перемещение на страницу вниз.
a Ctrl+PgUр — перемещение на начало текста.
Ctrl+PgDn — перемещение в конец (на последний символ) текста.
Клавиши поиска фрагментов
С помощью клавиш этой группы вы имеете возможность производить поиск в тек-
сте любого фрагмента. Это бывает полезно, например, при необходимости провести
замену во всем тексте одного идентификатора другим.
» Ctrl+Q, затем F — открывается окно диалога, в котором нужно задать фрагмент
текста. Затем, после нажатия клавиши Enter, производится поиск первого вхож-
дения этого фрагмента в текст.
/314 Приложение 3. Интегрированная инструментальная среда Turbo Pascal
® Ctrl+Q, затем А — то же, что и в предыдущей команде, но в окне диалога задаются
фрагмент текста поиска и фрагмент текста для замены.
Ctrl+L — осуществляется поиск следующего фрагмента, заданного одним из двух
предыдущих сочетаний.
a Ctrl+Q, затем ] или Ctrl+Q, затем [ — ищется парный к одному из следующих сим-
волов: }. Если парный символ найден, то курсор перемещает-
ся к нему, в противном случае он остается на месте.
Клавиши вставки и удаления информации
Сочетания клавиш этой группы позволяют помещать в текст и удалять из него
символы, слова и строки. Редактор может работать либо в режиме вставки, либо в
режиме замены. В первом случае вновь вводимый символ располагается в месте
нахождения курсора, раздвигая уже существующий текст. Во втором случае вво-
димый символ заменяет тот, на который указывал курсор. Переключение между
режимами вставки и замены осуществляется нажатием клавиши Ins.
Ctrl+N — в текст добавляется пустая строка.
Ctrl+Y — удаление строки.
ж Backspace — удаление символа слева от курсора.
в Del — удаление символа над курсором.
Ctrl+T — удаление слова (части слова) справа от курсора.
Ctrl+Q, затем Y — удаление части строки справа от курсора.
Клавиши работы с блоками текста
Термином «блок» обозначается особым образом выделенный фрагмент текста.
На экране он имеет цвета символов и фона, отличные от остальной части текста.
Блок может иметь любую величину, начиная от одного символа и кончая всем тек-
стом. Блок можно выделить следующими способами:
использованием комбинаций клавиш Shift+<—, Shift+—>, Shift+T, Shift+Ф;
& с помощью клавиш Ctrl+K, затем В, помечающей начало блока, и Ctrl+K, затем К,
помечающей его конец.
Следует иметь в виду, что выделение в тексте нового блока отменяет предыду-
щее выделение.
При выполнении ряда команд этой группы используется промежуточный бу-
фер обмена (Clipboard, иногда называемый «карман»), в который помещаются и
из которого выбираются фрагменты текста. Промежуточный буфер удобно исполь-
зовать для переноса фрагментов текста из одного файла в другой.
Перечислим клавиши этой группы.
a Ctrl+Ins — скопировать блок в промежуточный буфер.
Shift+Del — перенести блок в промежуточный буфер (при этом блок удаляется
из текста).
w Shift+Ins — перенести блок из промежуточного буфера и разместить в тексте,
начиная с позиции, помеченной курсором.
Отладка и тестирование 315
Ctrl+K, затем С — блок копируется в место расположения курсора в окне редак-
тирования.
& Ctrl+K, затем V — блок перемещается в место расположения курсора в окне ре-
дактирования.
& Ctrl+K, затем Y, или Ctrl+Del — удалить блок.
$ Ctrl+K, затем Н — снять-восстановить выделение блока на экране.
& Ctrl+K, затем I — сдвинуть блок вправо на одну позицию.
Ctrl+K, затем U — сдвинуть блок влево на одну позицию.
& Ctrl+K, затем Р — напечатать блок на принтере.
Прочие клавиши
В эту группу включены комбинации клавиш, связанные с чтением и сохранением
редактируемого файла, входом в основное меню и выходом из среды.
ss F10 — войти в основное меню.
® F3 — загрузить файл для редактирования. Это же действие можно выполнить,
выбрав в меню File команду Open. При этом на экране появится окно диалога,
в котором можно выбрать (или задать) имя требуемого файла. В меню File име-
ется команда New. Выбрав эту команду, вы откроете пустое окно редактирова-
ния для ввода текста новой программы. Первоначально файлу с текстом этой
программы присваивается имя NONAMEXX, где XX — порядковый номер файла.
Это имя можно изменить при записи файла на диск.
F2 — сохранить файл на диске. Это же действие можно выполнить, выбрав ко-
манду Save в меню File. По этой команде текст сохраняется в файле на диске.
Окно редактирования остается активным, что позволяет продолжить работу
с текстом.
Alt+X — выход из среды Turbo Pascal. То же можно сделать выбором команды
Exit в меню File.
Отладка и тестирование
Тестирование — один из наиболее трудоемких этапов создания программ. Если
ваша программа выдала правдоподобный результат, то это еще не значит, что сама
по себе она является правильной. Вполне возможно, что при повторном запуске
с новым набором исходных данных вас постигнет разочарование.
Дадим некоторые практические рекомендации, касающиеся отладки и тести-
рования.
Одним из способов тестирования является тестирование по данным или те-
стирование с управлением по входу-выходу. В этом случае знания о внутренней
структуре программы не учитываются, тестовые данные используются лишь в
соответствии со спецификацией программы. При таком подходе для полного тес-
тирования пришлось бы перебрать все возможные наборы входных данных, что,
как правило, недостижимо из-за большого количества вариантов. Однако очень
часто использование при прогоне даже ограниченного числа вариантов исходных
316 Приложение 3. Интегрированная инструментальная среда Turbo Pascal
данных «открывает глаза» на явно неверное в некоторых случаях поведение про-
граммы.
Другой способ тестирования — это тестирование, управляемое логикой програм-
мы. Оно позволяет исследовать внутреннюю структуру программы. При таком те-
стировании можно поступать по-разному. Представляется полезным ответить на
вопросы, которые позволяют выявить специфические для языка программирова-
ния Паскаль ошибки. Разумеется, каждый программист вправе пополнять для себя
подобный список по мере накопления опыта.
Ошибки обращения к данным
Существуют ли в программе обращения к переменным, которым не присвоены
значения?
Если в программе используются массивы, то не выходят ли значения соответ-
ствующих индексов за границы, определенные при описании массива?
Проверьте корректность обращения к памяти с помощью указателей, если та-
кие обращения используются.
Например, следует избегать ситуации, когда указатель существует дольше, чем
память, к которой производится обращение. Такое может произойти, если указа-
тель задает локальную переменную в теле процедуры, его значение присваивается
либо глобальной переменной, либо выходному параметру, а память при выходе
из процедуры освобождается.
Ошибки вычисления
Не используются ли при некоторых вычислениях недопустимые типы дан-
ных?
Не может ли возникнуть переполнение или потеря значимости во время вы-
числения выражения?
& Не может ли делитель в операторе оказаться равным нулю?
& Может ли значение переменной выходить за пределы установленного для нее
диапазона?
& Правильно ли используются приоритеты операций для записи выражения?
Ошибки при сравнении
8 Нет ли в программе бесконечных циклов? Типичные ситуации:
U неверно сформулированное условие цикла (следует всегда помнить, что
для цикла с предусловием while формулируется условие его выполнения,
а для цикла с постусловием repeat формулируется условие его прекраще-
ния)',
□ постоянное значение переменной цикла (циклы типа while, repeat).
ш Нет ли в программе циклов, которые никогда не будут выполняться?
& Правильно ли расставлены операторные скобки begin и end? Ошибка в их рас-
становке может нарушить логику программы.
Отладка и тестирование 317
Ошибки интерфейса
® Правильно ли заданы аргументы при вызове встроенных функций?
« Не портит ли подпрограмма некоторые параметры и глобальные переменные,
которые должны использоваться только как входные величины?
Исправление ошибок
При обнаружении ошибки в программе начинается процесс отладки.
Прежде всего ошибку необходимо локализовать. Для этого, в первую очередь,
следует сделать предположение о характере ошибки и уже исходя из этого при-
нимать меры. Например, предполагая ошибку интерфейса, следует при входе в
процедуры и функции распечатать их имя и значения всех фактических парамет-
ров, которые передаются по значению, а при выходе из процедуры или функции —
значения фактических параметров-переменных, а также глобальных переменных.
При ошибках передачи управления полезно напечатать сообщения о прохожде-
нии тех участков программы, управление на которые передается при любых на-
чальных данных. Можно завести счетчики, которые позволяют контролировать
прохождение различных ветвей программы, и т. д. Если происходит выход за гра-
ницу индекса (а это наиболее распространенная ошибка), то следует обратить вни-
мание на используемые в программе массивы и в циклах, где происходит их обра-
ботка, поставить вывод на печать значений индексов в тех местах, где имеет место
изменение индекса. При обнаружении места ошибки следует внимательно изучить
условие цикла — весьма вероятно, что некорректная формулировка послужила при-
чиной данной ошибки.
Существуют стандартные программы-отладчики. Они существенно облегчают
пользователю поиск и локализацию ошибок.
Использование отладчика
Существует два основных типа программных ошибок:
ж ошибки времени компиляции;
® ошибки времени выполнения.
Синтаксические ошибки легко устранимы, поскольку Turbo Pascal выдает пол-
ный их перечень с указанием местоположения в программе. Процесс компиляции
не будет завершен до полной ликвидации ошибок такого сорта.
Ошибки времени выполнения (семантические ошибки) устраняются не так
легко, поскольку их не всегда просто локализовать и понять причину возникнове-
ния. Особенно незаметны и трудны для прослеживания логические ошибки и ошиб-
ки, связанные с взаимодействием модулей одной большой программы. В этой си-
туации было бы удобно останавливать программу по достижении определенного
места, чтобы проследить, как она проработала данный набор операторов, прона-
блюдать значения некоторых переменных и выражений, может быть, попытаться
изменить их значения и посмотреть на реакцию программы.
Интегрированный отладчик Turbo Pascal имеет все упомянутые возможности
(и не только). Он представляет собой встроенную часть интегрированной усовер-
шенствованной среды Turbo Pascal.
318 Приложение 3. Интегрированная инструментальная среда Turbo Pascal
При отладке программы очень часто возникает потребность просмотра значе-
ния некоторых используемых переменных на определенной стадии выполнения
программы. Традиционно для решения данной проблемы применялась отладоч-
ная печать. Однако отладчик позволяет делать это гораздо проще: достаточно вос-
пользоваться командой Debug ► Watches (запись Debug ► Watches означает, что необ-
ходимо выбрать в меню Debug команду Watches). В окне Watch можно задавать
некоторые объекты (переменные, структуры данных, выражения). При этом про-
сматриваемые данные меняются, отражая текущие изменения при пошаговом вы-
полнении программы.
Добавление объектов в окно просмотра осуществляется путем нажатия клавиш
Ctrl+F7 или выбора в меню Debug команды Add Watch.
Следует заметить, что стандартное расположение окна Watch в нижней части
экрана не всегда удобно, поэтому можно воспользоваться командами управления
окнами, задав размер и расположение окон по своему усмотрению. Это особенно
актуально, когда программа включает в себя набор модулей и когда окна, в кото-
рых отображены тексты соответствующих модулей, перекрывают окно Watch.
Для того чтобы управлять окном, необходимо нажать клавиши Ctrl+F5, а затем
использовать клавиши со стрелками, а также клавиши PageUp, PageDown (для пере-
мещения окна по экрану) или сочетание клавиши Shift и клавиш со стрелками (для
изменения размеров окна). После получения желаемых вида и расположения окна
следует нажать клавишу Enter. Можно для тех же целей использовать меню Window.
Теперь рассмотрим, как можно осуществить пошаговое выполнение (трасси-
ровку) программы. Для этого можно воспользоваться командой Run ► Trace Into или
клавишей F7. Тем самым появляется возможность выполнить одну строку програм-
мы, затем прерваться и посмотреть на результаты.
При вызове процедуры или функции внутри пользовательской программы моле-
но задать режим выполнения вызова как одного шага или режим трассировки этой
процедуры или функции строка за строкой.
При выполнении пошаговой отладки Turbo Pascal будет иногда переключаться
на экран пользователя. Это происходит тогда, когда предусматривается вывод ин-
формации на экран или требуется ввод информации. Затем выполняется возврат
в интегрированную среду.
Можно управлять переключением экрана с помощью установок, выполняемых
по команде Options ► Debugger ► Display Swapping.
Smart. Это режим по умолчанию. Переключение на экран пользователя проис-
ходит при вызове программы или в вышеупомянутой ситуации.
& Always. Переключение на экран пользователя происходит на каждом шаге.
® None. Переключение экранов не происходит. Интегрированная среда остается
видимой все время. При выводе информации текст будет отображаться на экране
среды.
Кроме того, можно установить экран вывода в отдельном окне с помощью ко-
манды Window ► Output.
Построчное выполнение программы может оказаться достаточно неудобным,
когда хочется обойти циклы или другие утомительные участки программы. Кроме
того, отладку программы бывает удобно начать с определенного места. В этом слу-
Отладка и тестирование 319
чае можно воспользоваться клавишей F4 или командой Run ► Go to Cursor. Можно
передвинуть курсор на определенную строку программы, а затем указать отладчи-
ку на необходимость выполнения программы до достижения этой строки.
Для проверки значений переменных, структур данных и выражений в интерак-
тивном режиме пользователь может вызвать окно Evaluate, используя клавиши
Ctrl+F4 или команду Debug ► Evaluate ► Modify.
Используя окно Evaluate, можно изменить значение любой переменной, вклю-
чая строки, указатели, элементы массива и поля записей. Это обеспечит простой
механизм для проверки, как программа реагирует на определенную установку зна-
чений и условий.
С помощью команды Debug ► Breakpoints можно пометить строки в'ттользова-
тельской программе как точки прерывания. Когда в процессе выполнения програм-
мы достигается точка прерывания, выполнение программы останавливается и
отображается исходный текст. Курсор при этом оказывается на строке с точкой
прерывания. После этого можно проверить значения переменных, начать трасси-
ровку или выполнить программу до другой точки прерывания. Можно в любой
точке прервать выполнение программы, нажав клавиши Ctrl+Break. Произойдет
остановка в следующей строке исходной программы, как если бы в этой строке
была установлена точка прерывания.
Точки прерывания являются важным инструментом отладки. Точка прерыва-
ния подобна знаку остановки, введенному в программу пользователя. Когда про-
грамма встречает такую точку, она останавливает свое выполнение и ждет даль-
нейших отладочных инструкций. Пользователь может иметь до 16 активных точек
прерывания.
После задания точек прерывания можно начать выполнение программы с по-
мощью команды Run ► Run (Ctrl+F9). Сначала программа будет выполняться нор-
мально, но, когда встретится точка прерывания, остановится. При этом если ка-
кие-нибудь переменные или выражения были добавлены в окно Watch, то они тоже
выводятся на экран с соответствующими значениями.
Затем пользователь может использовать любой режим отладки:
& можно осуществлять пошаговое выполнение программы, используя команды
Run ► Trace Into, Step Over, Go to Cursor (F7, F8, F4);
& можно проверить или изменить значения переменных;
$ можно добавить или удалить выражения из окна Watch;
& можно назначить или удалить точки прерывания;
& можно просмотреть выходные результаты программы, используя команду Win-
dows ► User Screen (Alt+F5);
& можно перезапустить программу сначала (Run ► Program Reset и затем команду
пошагового выполнения);
£ можно продолжить выполнение до следующей точки прерывания или до конца
программы, выполнив команду Run ► Run (Ctrl+F9).
Для удаления точки прерывания необходимо переместить курсор на данную
строку и выполнить команду Debug ► Toggle Breakpoint (Ctrl+F8) еще раз. Эта коман-
да включает или отключает точку прерывания в строке.
320 Приложение 3. Интегрированная инструментальная среда Turbo Pascal
ПРИМЕЧАНИЕ Следует заметить, что основным элементом в отладчике является строка.
Если на одной строке имеется несколько операторов, они будут выпол-
няться вместе при нажатии клавиши F7. Однако, если один оператор разме-
щен на нескольких строках, то при нажатии клавиши F7 будет выполняться
весь оператор. Все команды выполнения, включая команды пошаговой
отладки и работы с точками прерывания, основываются на строках. Выпол-
няемая строка всегда помечена курсором выполнения.
Пользователь может быстро находить объявления процедур или функций, даже
если программа разбита на несколько модулей: для этого используется команда
Search ► Find ► Procedure. Во время трассировки можно быстро вернуться обратно
из вызовов процедур или функций и проверить параметры каждого вызова — с по-
мощью команды Window ► Call ► Stack.
Если в процессе отладки программы возникает необходимость начать все сна-
чала, то нужно выбрать команду Program reset в меню Run. Система отладки повтор-
но инициализируется, и команда следующего шага вернет пользователя к первой
строке главной программы. При этом производится закрытие всех файлов, кото-
рые были открыты программой, очистка стека всех вложенных программ, осво-
бождение всего использованного пространства кучи.
Turbo Pascal предлагает перезапуск программы, если пользователь произвел
какие-либо изменения в программе во время отладки. Например, если изменена
часть программы, а затем пользователь выбирает любую команду выполнения (F7,
F8, F4, Ctrl+F9 и т. д.), на экране появится сообщение «Исходный модуль модифици-
рован, повторить сборку? Д/Н»:
Source modified, rebuild? (Y/N)
Если пользователь ответит «У», Turbo Pascal перекомпилирует программу и во-
зобновит отладку программы сначала. Если ответ — «N», то сеанс отладки продол-
жается дальше (любые изменения в программе, произведенные пользователем, не
будут влиять на ее выполнение до тех пор, пока он не перекомпилирует программу).
Приложение 4
Зарезервированные слова
Turbo Pascal 7.0
Слово 'Назначение
absolute Признак переменной, расположенной по определенному адресу
and Операция логического умножения
array Тип-массив
asm Начало блока, написанного на ассемблере
assembler Подпрограмма, написанная на ассемблере
begin Начало тела программы, тела подпрограммы или составного оператора
case Оператор выбора или описание вариантной части в записи
const Начало раздела описания констант
constructor Конструктор объекта
destructor Деструктор объекта
idiv Операция целочисленного деления
do Начало операторов цикла for и while или оператора with
downto Признак изменения счетчика цикла for на -1
else Часть «иначе» условного оператора или оператора выбора
end Конец тела программы, подпрограммы, конец составного оператора, конец оператора выбора, конец описания записи или объекта, конец модуля, конец блока на ассемблере
external Директива внешней подпрограммы
far Директива формирования «дальнего» адреса
file Файловый тип
for Оператор цикла с известным числом повторений
forward Директива предварительного описания заголовка подпрограммы
продолжение &
322 Приложение 4. Зарезервированные слова Turbo Pascal 7.0
Продолжение таблицы
Слово Назначение
function Начало заголовка подпрограммы-функции
goto Оператор безусловного перехода
if Условный оператор
implementation Начало исполнительной части модуля
in Операция проверки элемента на вхождение в множество
inherited Наследуемый метод
inline Директива, разрешающая включение в программу блока на ассемблере
interface Начало интерфейсной части модуля
interrupt Директива процедуры, обрабатывающей прерывания
label Начало раздела описания меток
mod Операция вычисления остатка от целочисленного деления
near Директива формирования «ближнего» адреса
nil Пустая ссылка
Not Операция логического отрицания
object Тип-объект
of Начало типа элементов в описании массива, множества или файла, начало перечисления констант в операторе выбора
or Операция логического сложения
packed Признак упакованного массива
private Начало секции описания скрытых методов объекта
procedure Начало заголовка подпрограммы-процедуры
program Начало заголовка программы
public Начало секции методов объекта, доступной другим модулям
record Тип-запись
repeat Цикл с постусловием
set Тип-множество
shl Операция сдвига битов влево
shr Операция сдвига битов вправо
string Строковый тип
then Часть «тогда» в условном операторе
to Признак изменения счетчика цикла for на +1
type Начало раздела описания типов
unit Начало модуля
until Конец цикла с постусловием
Зарезервированные слова Turbo Pascal 7.0 323
Слово Назначение
uses Начало раздела описания используемых модулей
var Начало раздела описания переменных или описание параметров-переменных
virtual Директива виртуального метода
while Начало цикла с предусловием
with Оператор присоединения
xor Логическая операция исключающего «ИЛИ»
Приложение 5
Комбинации клавиш
быстрого управления
в среде Turbo Pascal
Команда (комбинация клавиш) Назначение
Стрелка влево Ctrl+S Перемещение курсора на одну позицию влево
Стрелка вправо Ctrl+D Перемещение курсора на одну позицию вправо
Ctrl+стрелка влево Ctrl+A Перемещение курсора на первый символ слова, находящегося слева от текущей позиции курсора, или, в случае отсутствия такого слова, на конец предыдущей строки
Ctrl+стрелка вправо Ctrl+F Перемещение курсора на первый символ слова, находящегося справа от текущей позиции курсора, или, в случае отсутствия такого слова, на конец строки
Стрелка вверх Ctrl+E Перемещение курсора на одну строку вверх
Стрелка вниз Ctrl+X Перемещение курсора на одну строку вниз
Ctrl+W Перемещение экрана на одну строку вверх (если такая строка существует)
Ctrl+Z Перемещение экрана на одну строку вниз (если такая строка существует)
PgUp Перемещение экрана на одну страницу вверх (если эта страница существует)
PgDn Перемещение экрана на одну страницу вниз (если эта страница существует)
Home Ctrl+QS Перемещение курсора в первую позицию текущей строки
Комбинации клавиш быстрого управления в среде Turbo Pascal 325
Команда (комбинация клавиш) Назначение
end Ctrl+QD Перемещение курсора в конец текущей строки
Ctrl+Home Ctrl+QE Перемещение курсора на первую строку окна
Ctrl+end Ctrl+QX Перемещение курсора на последнюю строку окна
Ctrl+PgUp Ctrl+QR Перемещение курсора на начало текста
Ctrl+PgDn CtrlH-QC Перемещение курсора на конец текста
Ctrl+QB Перемещение курсора на начало выделенного блока
Ctrl+QK Перемещение курсора на конец выделенного блока
Ctrl+QP Возврат курсора на предыдущую позицию
Ctrl+QW Перемещение курсора в место обнаружения последней ошибки и вывод сообщения об ошибке в верхней строке
Ctrl+Kn Установить маркер с номером п в текущей позиции курсора
Ctrl+Qn Перемещение курсора в позицию, помеченную маркером с номером п
Ctrl+QF Поиск фрагмента текста
Ctrl+QA Поиск и замена фрагмента текста
Ctrl+QL Повтор поиска фрагмента текста <
Ctrl+Ql Поиск парной скобки для скобки вида: ([{<”’>}]) вперед по тексту
Ctrl+Q] Поиск парной скобки для скобки вида: ([{<”’>}]) назад по тексту
Ins Ctrl+V Изменение режима вставки. Возможны два режима: 1) добавляемые символы помещаются в место текущего положения курсора, уже имеющиеся символы сдвигаются; 2) добавляемые символы помещаются в место текущего положения курсора, уже имеющиеся символы заменяются на вводимые
Tab Ctrl+I Поместить знак табуляции (величина табуляции по умолчанию — 8 символов)
Enter 1 Переход на новую строку
Ctrl+N Вставка строки
Ctrl+Y Удаление строки
Ctrl+QO Поместить в текст программы ключи компиляции, используемые по умолчанию
Backspace Ctrl+H Удаление символа слева от курсора
Del Ctrl+G Удаление символа в месте текущего положения курсора
Ctrl+T Удаление слова или части слова, находящегося справа от курсора
продолжение &
326 Приложение 5. Комбинации клавиш быстрого управления в среде Turbo Pascal
Продолжение таблицы
Команда (комбинация клавиш) Назначение
Ctrl+QY Удаление части строки от текущего положения курсора до конца строки
Ctrl+KB Пометить начало выделяемого блока
Ctrl+KK Пометить конец выделяемого блока
Ctrl+KT Пометить блок в одно слово, на котором находится курсор
Ctrl+Ins Скопировать помеченный блок в буфер обмена (Clipboard)
Shift+Del Перенести помеченный блок в буфер обмена (Clipboard)
Shift+Ins Перенести блок из буфера обмена (Clipboard) в файл и поместить в текущей позиции курсора
Ctrl+KC Скопировать помеченный блок в текущую позицию курсора
Ctrl+KV Перенести помеченный блок в текущую позицию курсора
Ctrl+Del Ctrl+KY Удаление помеченного блока из файла
Ctrl+KH Погасить (высветить) выделение помеченного блока
Ctrl+KW Сохранить помеченный блок на диске (имя файла запрашивается)
Ctrl+KR Вставить в текст блок из файла на диске (имя файла запрашивается)
Ctri+KP Вывод помеченного блока на принтер
Ctrl+KI Сдвиг помеченного блока вправо на одну позицию
Ctrl+KU Сдвиг помеченного блока влево на одну позицию
Fl Вызов контекстной помощи
F2 Сохранение редактируемого файла на диске
F3 Открыть существующий файл
F4 Выполнить программу до строки, в которой находится курсор
F5 Расширение окна до полного экрана
F6 Активизация следующего окна
F7 Пошаговая трассировка с заходом в подпрограммы
F8 Трассировка без захода в подпрограммы
F9 Компиляция программы начиная с основного файла
F10 Выход в меню
Alt+Fl Вывод предыдущего окна помощи
Alt+F3 Закрыть окно
Alt+F5 Открыть окно пользователя
Alt+F7 Переход к предыдущей строке окна сообщений
Комбинации клавиш быстрого управления в среде Turbo Pascal 327
Команда (комбинация клавиш) Назначение
Alt+F8 Переход к следующей строке окна сообщений
Alt+F9 Компиляция программы из окна редактирования
Alt+F10 Вызов подменю
Alt+Backspace Отмена изменений в текущей строке
Alt+C Вызов меню Compile
Alt+D Вызов меню Debug
Alt+E Вызов меню Edit
Alt+F Вызов меню File
Alt+H Вызов меню Help
Alt+O Вызов меню Options
Alt+R Вызов меню Run
Alt+S Вызов меню Search
Alt+T Вызов меню Tools
All+W Вызов меню Window
Alt+X Выход в операционную систему
Alt+O Вывод списка открытых окон
Ctrl+Fl Предметный поиск помощи к слову, на котором находится курсор
Ctrl+F2 Прекращение выполнения программы
Ctrl+F3 Вызов окна используемых подпрограмм
Ctrl+F4 Вычисление или модификация выражения
Ctrl+F5 Изменение размера или положения окна
Ctrl+F7 Добавить проверяемое значение в окно Watch
Ctrl+F8 Поставить (удалить) в текущей строке точку прерывания
Ctrl+F9 Запуск программы
Shift+Fl Вывод словаря контекстной помощи
Shift+F6 Активизация предыдущего окна
Esc Выход из меню или информационного окна
Приложение 6
Некоторые сообщения
об ошибках периода
компиляции
№ Сообщение Комментарий
1 Out of memory Выход за границы памяти
2 Identifier expected Ожидается идентификатор
3 Unknown identifier Неопределенный идентификатор
4 Duplicate identifier Повторное описание идентификатора
5 Syntax error Ошибка в синтаксисе (обнаружен недопустимый символ)
6 Error in real constant Ошибка в вещественной константе
7 Error in integer constant Ошибка в целой констан те
8 String constant exceeds line Строковая константа превышает допустимые размеры
10 Unexpected end of file Не найден конец файла
И Line too long Слишком длинная строка
12 type identifier expected Не указан тип идентификатора
14 Invalid file name Неверное имя файла
15 File not found Файл не найден
16 Disk full Диск заполнен
20 Variable identifier expected Не указан идентификатор переменной
21 Error in type Ошибка объявления типа
22 Structure too large Структура слишком велика
23 Set base out of range Базовый тип множества выходит за допустимые границы
24 File components may not be files Компонентами файла не могут быть файлы
Некоторые сообщения об ошибках периода компиляции 329
№ Сообщение Комментарий
25 Invalid string length Неверная длина строки
26 type mismatch Несоответствие типов
27 Invalid subrange base type Неверный базовый тип для типа диапазон
28 Lower bound greater than upper bound Нижняя граница описания типа диапазон больше верхней
29 Ordinal type expected Необходим порядковый тип
30 integer constant expected Необходима целая константа
31 Constant expected Необходима константа
32 integer or real constant expected Необходима целая или вещественная константа
33 type identifier expected Необходим идентификатор типа
34 Invalid function result type Неверный тип результата функции
35 Label identifier expected Необходим идентификатор метки
36 BEGIN expected Необходим BEGIN
37 END expected Необходим END
38 integer expression expected Необходимо выражение целого типа
39 Ordinal expression expected Необходимо выражение порядкового типа
40 boolean expression expected Необходимо выражение логического типа
"41 Operand types do not match operator Типы операторов не соответствуют операции
42 Error in expression Ошибка в выражении
43 Illegal assigment Неверное присваивание
44 Field identifier expected Необходим идентификатор поля
50 DO expected Необходим DO
54 OF expected Необходим OF
57 THEN expected Необходим THEN
58 TO or DOWNTO expected Необходимы ТО или DOWNTO
59 Undefined forward Неопределенное опережающее описание
60 Too many procedures Слишком много процедур
61 Invalid typecast Неверное преобразование типа
62 Division by zero Деление на ноль
63 Invalid file type Неверный файловый тип
64 Cannot read or write variables of this type Невозможно считать или записать переменные этого типа
65 Pointer variable expected Необходима переменная-указатель
66 String variable expected Необходима строковая переменная
продолжение &
330 Приложение 6. Некоторые сообщения об ошибках периода компиляции
Продолжение таблицы
№ Сообщение Комментарий
67 String expression expected Необходимо выражение строкового типа
74 Constant and case types do not match Тип констант и тип выражения оператора CASE не соответствуют друг другу
75 Record variable expected Необходима переменная-запись
76 Constant out of range Константа выходит за допустимые границы
77 File variable expected Необходима файловая переменная
78 Pointer expression expected Необходимо выражение ссылочного типа
79 integer or real expression expected Необходимо выражение целого или вещественного типа
80 Label not within current block Метка не находится внутри данного блока
81 Label already defined Повторное определение метки
85 «;» expected Необходима «;»
86 «:» expected Необходимо «:».
87 «,» expected Необходима «,»
88 «(» expected Необходима «(»
89 «)» expected Необходима «)»
90 «=» expected Необходимо «=»
91 «:-» expected Необходимо «:в»
92 «[» expected Необходима «[»
93 «]» expected Необходима «]»
94 «.» expected Необходима «.»
95 «..» expected Необходимо «..»
97 Invalid FOR control variable Неверный параметр цикла FOR
98 integer variable expected Необходима переменная целого типа
102 String constant expected Необходима константа строкового типа
103 integer or real variable expected Необходима переменная целого или вещественного типа
104 Ordinal variable expected Необходима переменная порядкового типа
106 Character expression expected Необходимо выражение символьного типа
112 CASE constant out of range Константа CASE выходит за допустимые границы
ИЗ Error in statement Ошибка в операторе
123 Too many symbols Слишком много символов
124 Statement part too large Слишком большой раздел операторов
126 File must be var parameters Файлы должны передаваться как параметры-переменные
Некоторые сообщения об ошибках периода компиляции 331
№ Сообщение Комментарий
133 Cannot evaluate this expression Невозможно вычислить данное выражение
137 Structured variable cannot allowed here Здесь недопустима переменная структурного типа
140 Invalid floating-point operation к Недопустимая операция с плавающей запятой (возможно, произошло переполнение или деление на ноль)
149 VIRTUAL expected Необходимо слово VIRTUAL
150 Method identifier expected Необходим идентификатор метода
151 Virtual constructor not allowed Конструктор не может быть виртуальным
Литература
1. Абрамов С. А.> Гнездилова Г. Г, Капустина Е. Н, Селюн М. И, Задачи по про-
граммированию. — М.: Наука, 1988.
2. Абрамов С. А., Зима Е. В. Начала программирования на языке Паскаль. — М.:
Наука, 1987.
3. Абрамов В. Г., Трифонов Н П., Трифонова Г. И Введение в язык Паскаль. —
М.: Наука, 1988.
4. Бородич Ю. С., Вальвачев А. Н, Кузьмич А. И. Паскаль для персональных
компьютеров: Справочное пособие. — Минск: Высшая школа; БФ ГИТМП
«Ника», 1991.
5. Ван ТасселД. Стиль, разработка, эффективность, отладка и испытание про-
грамм. — М.: Мир, 1981.
6. Вирт Н. Алгоритмы + структуры данных - программы. — М.: Мир, 1989.
7. Горбенко О. Д., Попов В. Б., Ускова О. Ф. и др. Региональный стандарт обще-
го среднего образования по информатике. — Воронеж: ВИПКРО, 1995.
8. Грогоно П. Программирование на языке Паскаль. — М.: Финансы и статистика,
1982.
9. Джонсон Ж., Харроу К. Решение задач в системе Turbo Pascal. — М.: Финансы
и статистика, 1991.
10. Емелина Е. И. Основы программирования на языке Паскаль. — М.: Финансы
и статистика, 1997.
И. Йодан Э. Структурное программирование и конструирование программ. —
М.: Мир, 1987.
12. Йенсен К., Вирт Н. Паскаль: Руководство для пользователя и описание язы-
ка. — М.: Финансы и статистика, 1982.
13. Касьянов В. Н, Сабельфельд В. К. Сборник заданий по практикуму на ЭВМ.
М.: Наука, 1986.
14. Мейер Д., Бодуэн К. Методы программирования: В 2 т. — М.: Мир, 1985.
15. Немнюгин С. A. Turbo Pascal. Учебник. — СПб.: Питер, 2002.
16. Немнюгин С. A. Turbo Pascal. Практикум. — СПб.: Питер, 2002.
17. Немнюгин С. А., ПерколабЛ, В. Изучаем Turbo Pascal. — СПб.: Питер, 2002.
Литература 333
18. Пильщиков В. Н. Сборник упражнений по языку Паскаль. — М.: Наука, 1989.
19. Попов В. Б. Турбо Паскаль для школьников. — М.: Финансы и статистика,
1996.
20. Турбо Паскаль 7.0. Самоучитель. — СПб.: Питер; К.: Издательская группа
BHV, 2002.
21. Ускова О. Ф., Горбенко О. Д. Задачник-практикум по алгоритмическому язы-
ку. — Воронеж: Издательство ВГУ, 1987.
22. Ускова О. Ф., Вощинская Г, Э. Алгоритмический язык: Задачи и решения. —
Воронеж: Издательство ВГУ, 1989.
23. Фаронов В. В. Turbo Pascal 7.0: Учебное пособие. — М.: Нолидж, 1997.
24. Федоренко Ю. П. Алгоритмы и программы на Turbo Pascal. Учебный курс. —
СПб.: Питер, 2002.
25. Хершель Р. Турбо Паскаль. — Вологда: МП МИК, 1991.
26. Юркин А. Г. Задачник по программированию. — СПб.: Питер, 2002.
Ускова Ольга Федоровна, Бакланов Михаил Владимирович,
Воронина Ирина Евгеньевна, Горбенко Олег Данилович,
Вощинская Гильда Эдгаровна, Огаркова Наталья Владимировна,
Мельников Вадим Митрофанович
Программирование на языке Паскаль: задачник
Главный редактор Е. Строганова
Заведующий редакцией А. Кривцов
Руководитель проекта Ю. Суркис
Литературный редактор А. Жданов
Корректоры Н. Лукина, Н. Келле-Пелле
Верстка А. Дорошенко
Лицензия ИД № 05784 от 07.09.01.
Подписано к печати 27.08.04. Формат 70x100 ’Лб-
Усл. п. л. 27,09. Доп. тираже 4000. Заказ 906
ООО «Питер Принт», 194004, Санкт-Петербург, Б.Сампсониевский пр., д. 29а.
Налоговая льгота — общероссийский классификатор продукции ОК 005-93, том 2; 95 3005 — литература.
Отпечатано с готовых диапозитивов в ОАО «Техническая книга»
190005, Санкт-Петербург, Измайловский пр., 29