Text
                    Файл взят с сайта www.kodges.ru, на котором есть еще много интересной литературы
Под редакцией
О. Ф. Усковой
ПИТЕР
Программирование и. язь», паскаль
ЗАДАЧНИК
СЕРИЯ
ПИТЕР
Под редакцией
О. Ф. Усковой
Программирование
Паскаль
Допущено Министерством образования Российской Федерации в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению подготовки бакалавров и магистров «Информатика и вычислительная техника» и по направлениям подготовки дипломированных специалистов «Информатика и вычислительная техника» и «Информационные системы»
С^ППТЕР*
Москва > Санкт-Петербург  Нижний Новгород • Воронеж Ростов-на-Дону • Екатеринбург  Самара Киев  Харьков  Минск
2003
.973-018я7
1.3.06(075)
г	Рецензенты:
ВЙович Я. Е., профессор, доктор технических наук, начальник Главного управления рразования Администрации Воронежской области, заслуженный деятель науки РФ |Йн А. С., профессор, доктор физико-математических наук, проректор по научной работе I	Воронежского госуниверситета
V 
Дисона А. Л., профессор, доктор педагогических наук, зав. кафедрой Тамбовского государственного технического университета
ограммирование на языке Паскаль: задачник / под ред. Усковой О. Ф. — СПб.: гер, 2003. — 336 с.: ил.
IN 5 318-00553 5
г книга представляет собой не просто задачник с набором примеров и упражнений различной нежности. Основные цели предлагаемого учебного пособия — придать курсу программирования 5осн о ванный базис, сформировать па его основе определенную культуру проектирования и и программ, структурировать соответствующим образом учебный процесс. Авторы старались часть практических заданий посвящать не столько синтаксическим особенностям языка йрования, сколько методам программирования, технологии проектирования алгоритмов и И программных систем Кинга предназначена студентам и преподавателям вузов, а также всем, £>ы научиться программировать на языке Паскаль.
ББК 32.973-018я7
УДК 681.3.06(075)
I-00553-5
© ЗАО Издательский дом «Питер», 2003
Краткое содержание
Введение .................................................. 1;
Рекомендации читателю....................................... 1
Глава	1. Числовые типы данных............................... Т
Глава	2. Оператор присваивания, ввод и вывод информации......2
Глава	3. Логический тип .....................................3
Глава	4. Условный оператор...................................3
Глава	5. Операторы цикла...................................  4
Глава	6, Литерный тип........................................5
Глава	7. Перечислимый тип, ограниченный тип, оператор варианта.5
Глава	8. Регулярные типы данных..............................6
Глава	9. Процедуры и функции.................................9
Глава	10. Рекурсивные подпрограммы......................... 10
Глава	11. Строковый тип.................................... 11
Глава	12. Записи, оператор присоединения................... 12
Глава	13. Множества ....................................... 13
Глава	14. Файлы............................................ 14
Глава	15. Динамические структуры данных.................... 15
Приложение 1. Ответы и решения............................. 16
Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет.................................. 28
Приложение 3. Интегрированная инструментальная среда Turbo Pascal (Borland International) .......................31
Приложение 4. Зарезервированные слова Turbo Pascal 7.0......32
Приложение 5. Комбинации клавиш быстрого управления в среде Turbo Pascal......................................  32
Приложение 6. Некоторые сообщения об ошибках периода компиляции..........................................32
Литература..................................................33
Содержание
Введение...................................................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
Содержание
а 5. Операторы цикла.................................40
ггические вопросы....................................40
кнения, задачи, программы............................42
<ия для самостоятельной работы.......................50
а 6. Литерный тип....................................55
тические вопросы.....................................55
<нения, задачи, программы............................56
7.	Перечислимый тип, ограниченный тип, Ьратор варианта..........................................
вЧИСЛИМЫЙ ТИП.................................г,.........
I.	Теоретические вопросы.................................
^Упражнения..............................................
(ниченныйтип.............................................
 Теоретические вопросы..................................
^Упражнения..............................................
кггор варианта...........................................
^Теоретические вопросы...................................
^Упражнения .............................................
пения, задачи, программы................................
56
56
56
59
61
61
61
62
62
63
65
(а 8. Регулярные типы данных..........................  69
(Этические вопросы......................................69
Ьры. Задачи, программы..................................70
* Задания для самостоятельной работы....................79
Й4ЦЫ....................................................81
; Задачи, упражнения ...................................81
ia 9. Процедуры и функции.............................  94
етические вопросы.......................................94
чи, программы ..........................................95
ния для самостоятельной работы........................ 105
а 10. Рекурсивные подпрограммы.........................108
етические вопросы..................................... 108
чи, программы......................................... 108
нии для самостоя i ельной работы...................... 111
Содержание
V
лава 11. Строковый тип.....................................116
Теоретические вопросы...................................... 116
Задачи, программы.......................................... 117
Глава12. Записи, оператор присоединения....................121
Теоретические вопросы....................................... 121
Задачи, упражнения, программы.............................. 122
Глава 13. Множества........................................135
Теоретические вопросы....................................... 135
Упражнения, задачи, программы............................... 136
Задания для самостоятельной работы.......................... 142
Глава 14. Файлы............................................14f
Теоретические вопросы...................................... 14!
Упражнения, задачи, программы..............................	14(
Задания для самостоятельной работы......................... 15-
Описание файлов....................................... 15-
Варианты заданий...................................... 151
Глава 15. Динамические структуры данных....................151
Теоретические вопросы...................................... 15
Задачи, решения............................................ 15
Списки................................................ 15
Двоичное дерево....................................... 16
Дерево двоичного поиска............................... 16
Очередь.........................................-...... 16
Стек.................................................. 16
Задания для самостоятельной работы......................... 16
Приложение 1. Ответы и решения..............................16
Глава 1. Числовые типы данных.............................. 16
Упражнения............................................ 1(
Глава 2. Оператор присваивания, ввод и вывод информации..... Г
Упражнения, задачи, линейные программы................. Г
IM Э. Логический тип..................................,..171
Упражнения.............................................171
Линейные программы.................................... 172
IM4. Условный оператор...................................173
Упражнения...........................................  173
(Н б. Операторы цикла..................................  175
Упражнения, задачи, программы........................  175
Литерный тип.........................................184
Упражнения, задачи, программы......................... 184
ВТ. Перечислимый тип, ограниченный тип, оператор варианта. 188
!чимый тип. Упражнения................................ 188
3 варианта. Упражнения........................ 188
чин, задачи, программы........................ 191
рные типы данных.............................. 192
Задачи, программы..............................192
. Задачи, упражнения...........................201
;уры и функции.................................208
|рограммы......................................208
сивные подпрограммы............................216
рограммы.......................................216
}выйтип........................................218
рограммы.......................................218
:и, оператор присоединения.....................224
пражнения, программы...........................224
эства..........................................232
1ия, задачи, программы.........................232
J..............................................244
1ия, задачи, программы.........................244
мческие структуры данных.......................255
адачи, решения.................................255
дерево. Задачи, решения........................264
зоичного поиска. Задачи, решения...............265
Задачи, решения................................267
Йк. Задачи, решения..................................271
рйкение 2. Задачи по информатике, предлагавшиеся мимпиадах прошлых лет..................................280
И для самостоятельного решения.........................280
Задача 1. «Абракадабра»...................................280
Задача 2. «Divide et impkra!»............................28
Задача 3. «Два конвейера»..............................  28
Задача 4. «Антивирус»....................................28
Задача 5. «Новые гвозди».................................28
Задача 6. «Телефонная связь».............................28
Задача 7. «Функция»......................................28
Задача 8. «Считалка»...................................  28
Задача 9. «Многоугольник»................................28
Задача 10. «Метеостанции»............................... 28
Задача 11. «Скобки»..................................... 28
Задача 12. «Криптограмма»..............................  28
Задача 13. «Зоны»........................................28
Задача 14. «Лист бумаги».................................28
Задача 15. «Система счисления»...........................28
Задача 16. «Электрическая цепь».........................28!
Задача 17. «Точки»......................................29<
Задача 18. «Выражение»..................................29I
Задачи с комментариями и решениями............................29
Задача 1. «Монеты».......................................29
Задача 2. «Функция».................................... 29»
Задача 3. «Лабиринт»..................................  29<
Задача 4. «Прямоугольники»..............................30'
Задача 5. «Трубопровод»............;....................30<
Задача 6. «Телебашня»..................................    30(
Приложение 3. Интегрированная инструментальная среда
Turbo Pascal (Borland International)........................311
Экранный редактор............................................  312
Клавиши перемещения курсора.............................31С
Клавиши поиска фрагментов.................................31	с
Клавиши вставки и удаления информации....................3V
Клавиши работы с блоками текста.........................314
Прочие клавиши..........................................31Е
Отладка и тестирование.......................................315
Ошибки обращения к данным................................316
Ошибки вычисления...................................... 316
Ошибки при сравнении....................................316
Ошибки интерфейса.............................  317
Исправление ошибок..............................317
Использование отладчика.........................317
Приложение 4. Зарезервированные слова Turbo Pascal 7.0.....................................321
Приложение 5. Комбинации клавиш быстрого управления в среде Turbo Pascal..........................  324
Приложение 6. Некоторые сообщения об ошибках периода компиляции.................................  328
Литература...........................................332
Введение
Развитие и широкое распространение информационных технологий, основан: на применении компьютеров, сопровождается изданием весьма значителы числа учебных и методических пособий по различным направлениям ин форме онных и коммуникационных технологий, а также отдельным приложениям. Г граммирование, как особый род деятельности человека, по-прежнему остается е нейшей составляющей в подготовке высококвалифицированных специалист сфере компьютерных наук. Выработка определенного стиля профессионалы проектирования и разработки программной системы базируется на ряде основ< лагающих принципов, сформулированных в работах Э. Дейкстры, Н. Вирта и др; авторов. В разные исторические периоды на основе этих принципов формир лись соответствующие парадигмы программирования. Дать курсу программ] вания научно обоснованный базис, сформировать на его основе определенную к туру проектирования и разработки программ, структурировать соответствую! образом учебный процесс — таковы основные цели предлагаемого учебного п бия. Авторы старались большую часть практических заданий посвящать не сто; синтаксическим особенностям языка программирования, сколько методам j грамм ирования, технологии проектирования алгоритмов и разработки прогрй ных систем. В этом аспекте предлагаемая книга существенно отличается от практических пособий по программированию, изданных к настоящему време
Структура книги
Книга состоит из пятнадцати глав.
Каждая глава начинается с раздела, содержащего теоретические вопросы. I вы затрудняетесь ответить на них, мы рекомендуем обратиться к любому спра ному или учебному пособию по программированию на языке Паскаль.
Далее следует раздел, в котором приведены упражнения и задачи. Некотс задачи сопровождаются программами на языке Паскаль. Мы рекомендуем не шить заглядывать в решение, а попытаться сначала самостоятельно составить грамму и только после этого сравнить ее с приведенной в книге. Все задачи и уд нения, кроме тех, для которых даны решения, помечены специальными символ идентифицирующими уровень сложности:
	— легкие задачи;
♦	— задачи средней сложности;
*	— сложные задачи.
Последний раздел каждой главы содержит задания для самостоятельной работы, которые необходимо выполнить на компьютере.
Ответы на задачи вы найдете в первом из приложений, приведенных в конце КНИГИ; В других приложениях приводятся примеры задач, предлагавшихся на разнообразных олимпиадах по информатике (для некоторых задач приведены реше-КМЯ*программы победителей олимпиад), описание интегрированной инструмен-ТЫЬНой среды Тurbo Pascal (Borland International), зарезервированные слова Turbo Pucal 7.0, описание клавиш быстрого вызова в среде Turbo Pascal и сообщения 0 ИОХОТОрых ошибках компилятора.
W издательства
ТВ*ШИ замечания, предложения, вопросы отправляйте по адресу электронной RRW COmp@piter.com (издательство «Питер», компьютерная редакция).
Г Мм будем рады узнать ваше мнение!
гЦслробную информацию о наших книгах вы найдете на web-саите издатель-
Ihttp://www.piter.com.
Рекомендации читателю
Вы получили задачу
Прежде чем писать программу, уясните себе смысл задачи.
	Какова цель программы?
	Какие данные она требует?
	Откуда поступают данные?
» Какие результаты должна выдавать программа?
То есть определите внешние спецификации программы.
Не существует какого-то фиксированного набора правил, который можно был бы рекомендовать при разработке программ и выполнение которого обеспечил бы составление правильной программы. Чаще всего люди, создающие програй мы, стараются представить их в таком виде, который обеспечивал бы наиболыш удобства в модификации программы на этапах тестирования и отладки. Исход.' щая из этого технология программирования направлена на создание удобочита! мых, высокоэффективных, легко модифицируемых программ и в ряде случаев ni зволяет доказывать правильность их разработки.
Когда задача четко понята, можно приступать к составлению проекта nporpai мы на алгоритмическом языке или псевдокоде.
Проектирование осуществляется как последовательность шагов, направленнь на решение задачи. Сначала набрасывается план решения задачи в общем вид Далее описание составляется более детально. Большие этапы разбиваются на б лее мелкие. В ходе этого процесса выделяются относительно независимые части модули, и дальнейшее уточнение каждого такого модуля может производиться тс же методом пошаговой разработки «сверху вниз».
	На каждом шаге детализации программа должна оставаться структурированно  Каждый модуль должен быть достаточно простым и обозримым.
	Делайте наглядными связи между модулями.
	Каждый модуль должен выполнять единственную функцию, но делать э хорошо.
	После того как проект программы готов, переведите ее на язык Паскаль.
* Никаких трюков и заумного программирования — пишите программы прост  Используйте содержательные обозначения.
« Сдвигайте строки так, чтобы выделить логическую структуру программы.
)М«НДМ1 (ИН чи t Й f Й Л ИI
ри ралрцбогю' алгоритма решения задачи нам могут помочь общие правила *ния, «-формул»ронанныс, например, к одном из лучших руководстн но рсше-задач - книге 11ойа « Как решать задачу». Применительно к проектированию рамм схема метода Мойа может быть представлена следующим образом.
$
шение задачи
Поймите задачу, для этого:
а)	изучите данные;
Ь)	изучите неизвестные;
С) Определите, достаточно ли данных для решения;
d) Проверьте, не противоречивы ли они.
Составьте план. Обратите внимание на следующие моменты:
цель решения задачи;
Методы проектирования, которые будут использоваться;
Вспомните, встречалась ли вам уже такая задача;
<4) Подумайте, не знаете ли вы близкой задачи, алгоритмом решения которой t МОЖНО воспользоваться;
^определите, можете ли вы решить более узкую или аналогичную задачу; установите, можете ли вы решить часть задачи.
ните план:
уйте своему плану решения задачи;
веряйте правильность каждого шага.
изируйте решение:
едите, все ли данные вы использовали;
(Проверьте правильность решения;
майте, можете ли вы воспользоваться полученным результатом или ененным методом при решении других задач;
верьте вводимые данные на обоснованность и правдоподобие;
(ИВедите результаты в удобной для чтения форме;
Помните, что программа должна быть самодокумеитируемоп, то есть каж-iy модулю должно предшествовать словесное описан и с цели и внешних ^Спецификаций, а комментарии должны пояснять смысл опера торов на со-держательном уровне в терминах постановки задачи.
ЛДДКе и тестировании создаваемых программ необходимо помнить, начи-ВЫх шагов разработки алгоритма решения задач и. II (кич >м у 11 р 111 ц'дсм здесь ipMC рекомендации по тестированию программ.
ИД Тестированием программы убедитесь в том, что н ггк< и - программы всем сменным присваиваются значения. Экспериментальное rri i ирование про-нм может служить доказательством наличия ошибок, но никогда не дока-НХ отсутствия.
Чтобы программа была наглядной	17
 Тесты нужно разрабатывать таким образом, чтобы проверить, корректно ли реагирует программа не только на допустимые входные данные, но и на заведомо неправильные,
я Тестирование производится согласно общему принципу «сверху вниз». На каждом этапе функции модулей более низкого уровня моделируются упрощенными.
и Хорошим считается текст, который имеет высокую вероятность обнаружения ошибки.
« И в заключение приведем еще один практический совет; не исправляйте плохую программу — лучше перепишите ее.
Чтобы программа была наглядной
Остановимся на некоторых деталях написания программы, которые помогут облегчить дальнейшую работу7 с ней,
1.	При именовани и величин идентификаторы следует выбирать так, чтобы они отражали смысловое значение этих величин. В дальнейшей работе это избавит автора программы или ее пользователя от необходимости всякий раз напрягать память для выяснения, что же этот идентификатор обозначает. Вместе с тем выбираемое имя не должно быть слишком длинным.
2.	Программу следует разумно снабдить комментариями. Прежде всего, текст) программы должен предшествовать комментарий, дающий краткое, но полное описание ее функционального назначения, входных и промежуточные величин и их спецификаций, характеристики алгоритма, фамилии автора г его координат. Комментарии бывают особенно полезными при описании i использовании процедур: краткое описание их действий и характеристик; формальных параметров сделают более понятным назначение процедуры.
3.	Основой при разработке программы должен служить структурный подход базирующийся на методе последовательного уточнения действий и на ис пользовании управляющих структур трех типов: следования, ветвления и по вторения. На начальных этапах проектирования допускается использовани абстрактных операторов, последующая детализация которых приводит к со зданию процедур. Не следует спешить сразу писать программу в термина: операторов Паскаля: уточнение действий должно быть постепенным. Это важ по и потому, что на каком-то этапе может обнаружиться ошибка в выбор действия на предыдущем шаге, тогда придется переработать детализации только этого действия. В противном случае пришлось бы «ворошить»-, а иног да просто заново разрабатывать всю программу.
Расположение текста программы на экране или ка бумаге должно быть та ким, чтобы подчеркивался структурный характер программы: следует выдс лять, например, отступом от левого края строки тс операторы или групш операторов, которые образуют вложенную часть другого составного онере тора. Например:
{ пример 1 }
while А<0 do
begin
УДАЛИТЬ(В.х) •nd;
?»	( пример 2 }
1f prise end 0<*N)
thtn
W-	begin
Ж	ВКЛЮНИТЬ(А.1)
•'T	end
S: flee 1:«i+2;
ЛЙрипупая к очередному шаху уточнения действий, следует продумывать сра-Р* несколько вариантов алгоритма, во-первых: для того, чтобы выбрать наи-Дрлее оптимальный или подходящий; во-вторых, на случай, если придется изменения в проект программы на предыдущем шаге детализации.
^ЗИПфаммы следует писать сразу с защитой от ошибок при вводе. Это дости-ТСЯ проверкой вводимого значения, а при ошибочном вводе параметра — вбсом повторного ввода.
КаК©д исходных данных, и вывод результата и промежуточных величин обя-fcKliHO должны сопровождаться печатью пояснительного текстового сооб-вводе это должен быть запрос, для каких величин требуется зна-ВНШ при выводе — значения каких величин выводятся. В последнем случае ВиЙМтом особого внимания должно стать размещение выводимых значе-^^М|^*краие или листе бумаги. Выводимые значения размещаются так, что-^ЯИйепечивалось наилучшее их восприятие, дабы было понятно, какие более важное значение, а какие второстепенное.
программу на клавиатуре терминала ЭВМ, следует иметь в виду, и символы, имеющие сходные изображения на экране на разных клавиатуры (например, буквы А в латинской и русской расклад-^ВшСнразному представляются в памяти компьютера. В большинстве слу-^рМ|йёна одного символа другим, сходным с ним, приводит в дальней-Сообщениям компилятора об ошибках, Обращаем ваше внимание на попарно похожие символы: А-А, В-В, Е-Е, К-К, М-М, 0-0 ыЬ&олъ изображается с перечеркиванием), Р-Р, С-С, Т-Т, Х-Х. ^^пгем также для большей наглядности размещать по возможности мень-^ИКдераторов на одной строке.
Глава 1
Числовые типы данных
Теоретические вопросы
1.	Существуют ли ограничения на множество целых чисел, используемых в языке? Если да, то чем они определяются?
2.	Перечислите основные операции, определенные для данных целочисленного типа.
3.	Перечислите основные стандартные функции, определенные для данных це лочисленноготипа. Каков тип результата^ возвращаемого каждой функцией'
4.	Для представления какой информации в языке Паскаль используется тит real?
5.	В чем отличие двух типов числовых данных real и 1 nteger?
6.	Какие две формы записи вещественных чисел используются в языке Пас каль?
7.	Поясните понятия диапазона и точности как важных характеристик вещест венных переменных?
8.	Перечислите основные стандартные функции, определенные для данных ве шественного типа. Каков тип результата, возвращаемого каждой функцией'
9.	Что называется мантиссой числа?
10.	Что называется порядком числа?
И. Какие стандартные тригонометрические функции, реализованные в язык Паскаль, вы знаете?
12.	Почему в языке Паскаль аргумент стандартной функции всегда записываете в скобках?
13.	Почему знак умножения всегда выписывается явно?
14.	Можно ли аргумент стандартной тригонометрической функции задать в гр; дусах?
15.	К каким типам числовой информации применимы функции sqr(х)и sqrt(x)
16.	Для какого типа данных определены операции +, *, /?
17.	Ннлошпг дне i терапии, которые определены для данных целого типа, но не определены для данных ненцчтнениого типа?
18,	1 hi;и жите операции отношения, которые применимы к данным вещественного типа.
19.	Назоните операции отношения, которые применимы к данным целого типа,
20.	Каков приоритет выполнения арифметических операций?
Ml. К данным какого типа применимы функции trunc(x) и round(x)?
U« Почему запись формул на языке Паскаль линейна?
89. Почему в языке Паскаль факториал от 9 нельзя записать как 9! ?
||i Назовите функцию, которая вычисляет модуль вещественного числах.
К Какая функция возвращает натуральный логарифм числа х?
К К каким типам данных применимы арифметические операции di v и mod?
t Что делает стандартная функция trunc(x)?
К Каков результат работы стандартной функции round(x)?
тЭДри каких значениях аргумента стандартные функции truric(x) и rwnd(x) воз -К* Рращают одинаковый результат?
шЛЯ каких чисел определены стандартные функции succ(x) и pred(x)?
кДри каком значении аргумента х не определен результат работы функции
вЪсть а и b — два вещественных числа, аир — их машинное представление. Мврно ли, что а < Р, если а < Ь. Если нет, объясните почему.
Йму равен результат вычисления выражения (a div b)*b+(a mod Ь)?
записать величину основания натурального логарифма, если вы забыли этого числа?
^ВКОВ результат вычисления выражения sin(3.141592*х/180)?
ли пробел входить в число символов, составляющих идентификатор?
^Ививедиге пример унарной арифметической операции.
^ВЙу равен результат целочисленного деления, если делимое меньше дели-
Мрмведите примеры составных специальных символов.
ЙС называются слова, имеющие фиксированное начертание и раз и навсег-^Определенный смысл?
ИЬ Каких символов может состоять идентификатор?
ММизываются элементы данных языка, значения которых установлены в мСИСательной части программы и не изменяются в процессе ее выполнения? Можно ли ключевые слова использовать в качестве имен переменных?
Как называются величины, которые могут менять свое значение в процессе Выполнения программы?
Можно ли при записи арифметических выражений на языке Паскаль использовать фигурные скобки?
Упражнения 2ПГ
46.	Можно л и 1 j ри записи арифметических выражений на языке Паскаль использовать квадратные скобки?
47.	Какие функции преобразуют вещественный аргумент в целое число?
48.	Что такое «выражение», «операция», «операнд»?
49.	Как называется некоторый конечный набор операций (действий, предписаний), выполнение которых одна за другой за конечное число шагов приводит к намеченной цели (искомому результату, решению поставленной задачи)?
50.	Можно ли при записи идентификаторов использовать буквы русского алфавита?
Упражнения
1. Ниже приведены два столбца чисел. Подберите из правого столбца соответствующее представление на языке Паскаль для чисел левого столбца.
7,9985 п
10е -1/10000000 32782,82
-0,3(3)
6!
LXXIV
10
74
1Е6 0.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+\lb2 -4ас
а) -------------;
7 2а
Ь) {[(ах-Ь )х + с ]х	}х -е ;
-с)
Sin (х) COS (х) Icosil+sm*
С
sin—-2
In х -
х~2х
44,	Что будет напечатано п результате работы процедуры wr i ie(ercten( 1))?
45.	Пусть I — величина целого тина. Что напечатается в результате работы следующего фрагмента программы:
I 123:
writetl. I, 1);
write(I-12):
46.	Какова ширина поля десятичного представления величины х при печати в результате выполнения оператора wr 1 te (х: 7) ?
47.	Чем отличаются действия процедур write и writein?
48.	В чем состоит действие процедуры writein без параметров?
48.	Для чего в процедурах вывода write и writein определяется ширина поля вывода?
№ Какие обозначения используются в форматах вывода?
Упражнения, задачи, линейные программы
.К,
►Д. Задайте в виде оператора присваивания следующие действия:
а) переменной вещественного типа х присвоить значение, равное полусум-ме значений а и А;
0) удвоить значение переменной х;
S:;: с) переменной целого типа л: присвоить значение на 1 меньшее исходного; JL d) сменить знак у переменной х на противоположный.
В Дано целое положительное число п. Присвойте переменной т последнюю Ждифру этого числа.
11№устьр и п “ целые положительные числа и п - 123 456. Чему равно зна-Ноение р после выполнения оператора присваивания:
К>) р:« п div 100 mod 10;
Ej}). Р-“ п div 100 mod 10 + n mod 10.
КДусть m — целое число, х = 123,45. Каков результат выполнения оператора
Ё'Присваивания:
ЦП) m •= trunc ( х * 1000 ) mod 10 + round ( х * 100 ) mod 10;
tn pred ( round ( x * 100 ) ) mod 10 + succ ( round ( x * 1000 ) ) mod 10. ВЦелой переменной x присвойте значение суммы цифр задайного трехзначного £^сла.
^Определите число, полученное выписыванием в обратном порядке цифр за-,данного целого трехзначного числах. Присвойте это число переменной тл.
'• Пусть идетй-я секунда суток. Определите, сколько целых часов h и целых минут т прошло к этому моменту.
L Пусть п — целое число от 1 до 365. Присвойте целой переменной т значение ii 2...6 или 7 в зависимости от того, на какой день недели (понедельник,
Упражнения, задачи, линейные программы 27
вторник...субботу или воскресенье) приходится n-й день невисокосного
года, в котором 1 января — среда.
9.	Поменяйте местами значения вещественных переменных х и у.
* 10. Поменяйте местами значения целых переменных т и к, не используя дополнительные переменные.
11.	Пусть даны длины сторон треугольника. Вычислите его площадь.
	12. Вычислите расстояние между двумя точками на плоскости с данными координатами (х1, у1) а (х2, у2).
♦	13. Вычислите дробную часть среднего арифметического и дробную часть среднего геометрического трех заданных чисел.
	14. Найдите сумму п членов арифметической прогрессии, первый член которой равен а, а разность равна d.
•	15. Вычислите значение первой производной функции У1 в заданной точке а при заданном значении п.
 16. Введите положительное число а. Вычислите:
а)	площадь равностороннего треугольника со стороной а;
Ь)	площадь квадрата со стороной а;
с)	площадь круга, радиус которого равен а.
 17. Вычислите длину окружности, площадь круга, объем шара заданного радиуса.
♦ 18. Пусть даны числа а, Ь, у. Найдите площадь треугольника, две стороны которого равны а и Ь, а угол между этими сторонами равен у. Считайте, что у — это: а) радианная мера угла;
Ь) градусная мера угла.
19. Пусть даны четыре целых числа (hour, min, sec, time). Первые три из них (hour, min, sec) — это время запуска ракеты в часах, минутах и секундах, четвертое (time) определяет время полета в секундах. Найдите и напечатайте время возвращения ракеты на землю.
♦	20. Пусть дано натуральное число и, состоящее из шести цифр. Определите число сотен и тысяч в нем.
	21. Товар до деноминации (до 1 января 1998 года) стоил г рублей. Какова его цена после деноминации (в рублях и копейках) при условии, что г > 10 ?
♦	22. Определите f—угол (в градусах) между положением часовой стрелки в начале суток и ее положением в h часов, т минут и 5 секунд ( 0 < Л 11, m > 0, < 59 ).
	23. Введите два вещественных числа. Напечатайте коэффициенты приведенного квадратного уравнения, корнями которого являются эти числа.
	24. Пусть дано число f — угол в градусах. Определите смежный к нему угол в радианах.
	25. В бригаде, работающей на уборке сена, имеется п косилок. Первая из них работала т часов, а каждая следующая на 10 мин больше, чем предыдущая. Сколько часов работала вся бригада?
Din«n 2 OrwfHiTop пришшиявним, иьод и мымщ информиции
26. 11угп. дины целые числа т, п (часы, минуты), о £ т s 1I, 0 % w < 5У. определяющие время суток. Определите наименьшее время (число полных минут), которое должно пройти до того момента, когда часовая и минутная стрелки на циферблате:
а)	совпадут;
Ь)	расположатся перпендикулярно друг другу.
адания для самостоятельной работы
I, Составьте программу для решения системы двух линейных уравнений ах + by = с, dx + ey- f
С двумя неизвестными х, у. Значение неизвестных находятся по формулам:
Д = ae-bd,
ce-bf
Д
af-cd
Считайте, что Д х 0.
Подсчитайте, сколько очков набрала команда «Динамо» в первом круге чемпионата России по хоккею, если известно, что т встреч она выиграла, п встреч • Проиграла, k встреч закончились ничьими, полагая, что за выигрыш команда $ Получает 2 очка, за ничью — 1 очко, за проигрыш — 0 очков.
[гсть известны длины сторон а, Ь, с треугольника. Вычислите высоты этого ^угольника по формулам:
Ло ~^jp(p-a)(p-b)(p-c),
b
hc = -ylp(p-a	где p = a + b*c .
c	2
ставьте программу для вычисления времени Z встречи автомобилей, дви-щихсяравноускоренно навстречу друг другу, если извести ы их скорости
ускорения ах и а2и начальное расстояние 5 между ними. Расстояние 5Р «^айденное первым автомобилем, вычисляется по формуле
, Ч'2 2
т

расстояние 52, пройденное вторым автомобилем, вычисляется по формуле
f 2^ +
2
2
ДЛЯ ЪШМии IVV11 W-IDFlUn (JBlUVf П
Время t встречи автомобилей определяется из уравнения
„ в/ с L, a/) t -(r. + Pj+Vfa+Kj +(«.+«2)2S
Г| t + -*— = S - 121 + -^— , откуда t = ——-——-------------------•
2	2	a, + fl?
Г Гт м	a + b b~c
5.	Найдите x из пропорции---
x a + c
6.	Сколько процентов от А + В - С приходится на А? На В? На С?
7,	Составьте программу вычисления идеального веса человека по его росту, при условии, что идеальный вес (кг) рост (см) - 100.
8.	Вы положили деньги в Сбербанк, на срочный депозит на квартал из расчета 24 % годовых. Составьте программу, которая вычислит причитающуюся вам сумму через 4 месяца.
9.	Розничная цена мужского костюма составляет R рублей. Торговое наложение магазина составляет Т% от оптовой цены. Составьте программу определения оптовой цены костюма.
10.	Зарплата сотрудника частной фирмы составляет г рублей в месяц. Сколько денег он получит за полгода после вычета налогов в размере t % ежемесячно и s % за полгода?
11.	Даны координаты вершин некоторого треугольника. Вычислите его периметр.
12.	Пусть смешано Vt литров воды температуры с литрами воды температуры t2. Составьте программу вычисления объема и температуры образованной смеси.
13.	Определите стоимость набора, в который входят следующие конфеты (стоимость упаковки составляет U руб.):
Название	Вес	Стоимость
Петровские	200 г	К руб. (1 кг)
Воронежские	300 г	Рруб. (1 кг)
Чародейка	250 г	У? руб. (1 кг)
Факел	150 г	В руб. (1 кг)
Ласточка	200 г	1руб. (1 кг)
Упаковка	—	t/руб. (1 кг)
14.	Сколько времени в минутах затратит школьник на дорогу от школы до стадиона, если это расстояние составляет 5 км, а средняя скорость движения школьника — V км/ч.
L В квадрат ППИГ1НМ окружность (рис. 2.1), Определите площадь заштрихован* ной части фигуры, если известна длина стороны квадрата,
1> В квадрат вписана окружность (рис. 2.1). Определите площадь заштрихованной части фигуры, если известен радиус окружности.
b КВйдрат вписана окружность (рис. 2.2). Определите площадь заштрихован-ф-КОЙ части фигуры, если известна длина стороны квадрата.
Рис. 2.2. «Уголок* и квадрат
В квадрат вписана окружность (рис. 2.3). Определите площадь заштрихованной части фигуры, если известна длина стороны квадрата.
Рис. 2.3. Круг и два «уголка»
Глава 3
Логический тип
Теоретические вопросы
1.	Какое служебное слово используется для описания данных логического типа?
2,	Какие значения могут принимать данные логического типа?
3.	Почему логический тип относится к порядковым типам?
4.	Верноли, что true > false?
5.	Верно ли, что succ ( false ) “ true?
6,	Верно ли, что ord ( false ) = О?
7.	Верно ли, что ord ( true ) я 1?
8.	Верно ли, что pred ( true ) e false?
9.	Верно ли, что pred ( false ) = О?
10.	Перечислите логические операции в порядке убывания приоритета.
И. Верно ли, что результат операции логического умножения возвращает true, если оба операнда истинны?
12.	Верно ли, что операция and дает false, если хотя бы один операнд имеет значение false?
13.	Верно ли, что результат логического сложения истинен, если хотя бы один операнд имеет значение true?
14.	Какой тип должна иметь переменная в левой части оператора присваивания, если в его правой части стоит выражение логического типа?
15.	Может ли булево выражение содержать круглые скобки?
16.	Может ли булево выражение содержать несколько операций?
17.	Влияют ли круглые скобки на порядок вычисления значений логических операций в булевых выражениях?
18.	Могут ли в булевы выражения входить операции сравнения?
19.	Верно ли, что в булевом выражении, содержащем несколько операций, сначала определяются значения всех операций сравнения?
О, Пусть н ясной чигти оператора пригнан нами я находи м я игрсменнм логического типа. Может ли н сп> праной части стоять операция граимения чис-лопых типом?
1, С помощью какой функции можно проверить целочисленную переменную Нй нечетность?
L Пусть заданы переменные а, Ь, с логического типа. Доказать тождества:
*) true or а ® true
Ь) • end false = false
<) • or { not а ) = true
( not a ) s false
( b or c ) = ( a or b ) or c
( b or c ) я ( a or b ) or ( a or c )
1 ( a or b ) = a
( a and b ) =• a
lot a a a
( a and b ) or ( a and not b )
ibho значение логического выражения (a and not b) or с, если:
начения переменных равны true;
качения переменных равны fal se;
rue. b = true, c = false;
rue. b = false, c= true;
ralse. b = true, c = false.
ите значение логического выражения, считая, что х и у являются пе-йми вещественного типа:
'X) and not (1+х2>0) or (132<13.2*10) or ((х2-2х+1) < 0);
12.5>25/2) and (х<х*х) and not (-5*6=( 7.5*(-4)));
L (not х)) and odd(32767-2) or (sqr(x)+sqr(y)<=4).
те на языке Паскаль выражения, истинные при выполнении указан-
ювия и ложные впротивном случае:
пп(х, г/, z);
[надлежит отрезку (-1, 1);
(С) Г лежит вне интервала (-1,1);
d) Xпринадлежит интервалу (2, 10) или (-2, 2);
•	е) х лежит вне полуинтервалов (-2, 0) и (2,5);
•	f) каждое из чисел х, у, z положительно;
•	g) только одно из чисел д; у, z положительно;
Линейные программы 35
h) хотя бы одно из чисел х, у, z положительно;
i) год с порядковым номером k является високосным (год високосный, если его порядковый номер кратен 4, однако из кратных 100 високосными являются лишь кратные 400).
♦5, Нарисуйте на плоскости область, в которой истинны выражения:
а)	(у >= х) and (у+х >= 0) and (у 1);
Ь)	(abs(x) <= 1) > (abs(y) >= 1);
с)	(у >= -х-1) and (х <= 0) and (у <= 0) or ((х *= у) and (х >= 0));
d)	(у = 0) and ((х >= -2) and (х о -1) or (х >= 1) and (х <= 2) or (х = 0) and (у >= 2)).
Линейные программы
♦ 1, Напишите программу, в результате выполнения которой выводится значение true, если ел > ле. Возможны следующие варианты:
а)	числа ей е описать как константы с точностью 10 s;
Ь)	числа е ия представить с машинной точностью.
2. Для произвольных чисел а, Ъ, с определите, имеет ли уравнение ах* + Ьх+с~() хотя бы одно вещественное решение.
♦3. Для заданных чиселр, а, b (а < 6) определите, имеет ли уравнение arctan(2* -- |р|) ^ корень на отрезке [а, 6].
4. Даны три положительных числа а, Ь, с. Определите, можно ли построить треугольник с такими длинами сторон.
	5. Определите, есть ли среди цифр некоторого трехзначного числа повторяющиеся.
	6. Определите, равна ли сумма крайних цифр некоторого четырехзначного числа сумме его средних цифр.
♦	7. Пусть (k, Г), (т, п) — поля шахматной доски: k, т — номера по горизонтали; /, п — номера по вертикали (!<&,/, т, п < 8). Определите:,
а)	можно ли с поля (A, Z) попасть на поле (т, п) одним ходом пешки;
Ь)	можно ли с поля (k, Z) попасть на поле (и. п) одним ходом ладьи;
с)	можно ли с поля (k, I) попасть на поле (т, н) одним ходом слона;
d)	можно ли с поля (k, I) попасть на поле (т, п) одним ходом ферзя.
♦8. Пусть дано вещественное число а. Вычислите /(а), где/ — периодическая функция с периодом 2, совпадающая на отрезке [-1,1] с функцией (-л®+ 1).
9. Напишите оператор присваивания, в результате выполнения которого логическая переменная t принимает значение true, если выполняется указанное условие, и значение fal $е в противном случае:
а)	числа х, у, z равны между собой;
Ь)	из чисел х, у, z только два равны между собой;
с)	целые числа тип имеют одинаковую четность;
d)	только одна из двух заданных логических переменных имеет значение true;
е)	х — положительное число;
О цифра 7 входит в десятичную запись трехзначного целого числа k хотя бы один раз;
g) из чисел х, у, z хотя бы два числа положительные;
h) точка (хр yt) попадает внутрь круга радиуса г;
I) даны / и г (/ £ г > 0), точка (хр z/J попадает внутрь кольца с центром в на-Чале координат, внешний радиус которого равен /, а внутренний — г;
J) ПОЛЯ шахматной доски (gA с1) и (g2, с2) имеют одинаковый цвет (g1, g2, С1>с2 — целые числа от 1 до 8);
ЮФ«рзь, расположенный на поле (g1, с1) шахматной доски, «бьет» фигуру, расположенную на поле (g2, с2);
ft КОНЬ за один ход может перейти с поля (g1t с 1) на поле (g2, с2).
Глава 4
Условный оператор
Теоретические вопросы
1.	Какие служебные слова могут использоваться при записи условного оператора?
2.	Какой тип должно иметь выражение, стоящее в условном операторе между словами if и then?
3.	Пусть дана следующая последовательность операторов:
if «выражением» then «оператор1> else «оператор2>:
«ОператорЗ>:
Установите:
а)	значение «выражениям при котором выполняется «операторЗ>;
Ь)	возможность записи после слова then нескольких операторов;
с)	условие выполнения оператора <оператор!>;
d)	значение выражения, при котором выполняется <сператор2>;
е)	может ли <выражение> содержать знаки операций сравнения;
f)	может ли «выражение* содержать знаки логических операций;
g)	могут ли быть операторы if вложенными.
4.	Приведите пример составного оператора.
5.	Как называются программы, в основе которых лежит структура следование?
6.	Какие операторы входят в состав разветвляющихся программ?
Упражнения
1. Найдите минимальное из двух чисел а и 6.
2. Найдите максимальное из трех чисел а, b и с.
3. Переменной х присвойте значение корня уравнения arcsin (1 + In х) = а, если такой существует.
х2 + 4х-7, х<2,
При заданном значении х вычислить значение функции у = <
laiie ^условный опера wp
. Составьте программу вычисления функции f(x) вида:
х3 — Зх + 8,
») /(*)=
хэ — Зх 4- 8 *
Ь) /(х) = < х2 + 3x4-4, Л 2 , -7. . , л
О,
с) /(х)= х2-х, I х2 — sin лх2,
6. Для заданных значений x, у запишите программу вычисления числа
3-	. /
ЕЧАНИЕ Здесь и далее min(x, у) обозначает минимальное из чисел х и у, шах(х, у) — максимальное из чисел х и у.
По заданным значениям х, у, z вычислить значение м:
и - тах(х + у + z, xyz);
liz'.’ '
Р Ь)
Я
ах у by.
и =
ax + byE [c,rf)
ах 4- by < с	, где a, btc,d— известные величины;
Sr"'c)
и - minfx, тах(у, z));
d)
min
и =-----
,xyz
ft. Найдите полярные координаты г и (р точки на плоскости по ее прямоугольным координатам х и у. При этом воспользуйтесь формулами:
2 , .2 -
Упражнения о f
Ф =
arctg^, л >0, уйО, x
~,x = 0, y>0,
л + arctg—,x<0, x
~,x = 0,y<0,
х
9. Перераспределите значения переменных х и у таким образом, чтобы переменная х получила меньшее из этих значений, а у — большее.
♦10. Считая, что стандартные функции sin и cos применимы только к аргументам из отрезка [0, л/2], вычислите у 1 = sin х, у2 = cos г для произвольного числа х 11. Заменить оператором присваивания следующий условный оператор!
if а
then х := true
el se
if b
then x := c else x := false:
12.	Составьте программу для определения корней квадратного уравнения.
13.	Hai шшите программу, которая проверяет, не приведет ли суммирование двух заданных целых чисел к переполнению.
*	14. Нал ищите программу, которая проверяет, не приведет ли перемножение двух заданных целых чисел к переполнению.
*	15. Пусть даны вещественные числа х1, х2, х3, у\ у2, у*. Принадлежит ли начало координат треугольнику с вершинами (х1, у1}, (х2, у2}, (х3, з/3)?
	16. Сколько общих точек у прямой у = kx + b и окружности х2 + у2 = 7?2?
	17. Пусть даны вещественные положительные числа a, b, ct J. Выясните, можно ли прямоугольник со сторонами a, b уместить внутри прямоугольника со сторонами с, dтак, чтобы каждая из сторон одного прямоугольника была параллельна или перпендикулярна каждой стороне второго прямоугольника.
♦	18. Составьте программу, которая проверяет, пройдет ли кирпич с ребрами а, Ь, с в прямоугольное отверстие со сторонами х и у. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия.
*	19. Пусть дано целое k, 1 < k < 180. Определите, какая цифра находится вН позиции последовательности 101112131415...9899.
*	20. Составьте программу нахождения корней биквадратного уравнения ах* + + bx2 + с “ 0.
ГЬма 4. Условный оператор
L Дано положительное число а. Найти:
а)	наибольшее число вида 1/2", п > 0, меньшее а;
Ь)	наибольшее число вида 1/3”, п > 0, меньшее а,
Цания для самостоятельной работы
Доведите три числа. Если они могут быть длинами сторон прямоугольной треугольника, выведите их в порядке возрастания и вычислите площадь по * лученного треугольника.
L Введите три числа. Если они могут быть длинами сторон остроугольного тре угольника, выведите их в порядке убывания и вычислите площадь получен лиого треугольника.
I; Введите три числа. Если они могут быть длинами сторон тупоугольного тре и угольника, выведите их в порядке убывания и вычислите площадь получен-.него треугольника.
м; Введите три числа. Если они могут быть сторонами равностороннего треугольника, вычислите его площадь и длину высоты. Выведите стороны, площадь и длину высоты в порядке возрастания.
< Введите три числа. Если они могут быть длинами сторон равнобедренного ^Треугольника, вычислите длины его высот. Выведите длину основания и дли-, ды высот в порядке возрастания.
, ^ведите три числа. Если они могут быть длинами сторон разностороннего ^тупоугольного треугольника, выведите их в порядке возрастания и вычислите ...площадь полученного треугольника.
^Введите три числа. Если они могут быть длинами сторон равнобедренного тупоугольного треугольника, вычислите его площадь. Выведите длины сторон и площадь в порядке возрастания значений.
/Введите три числа. Если они могут быть длинами сторон равнобедренного остроугольного треугольника, вычислите его площадь. Выведите длины сторон и площадь в порядке возрастания значений.
‘.‘Введите три числа. Если они могут быть длинами сторон разностороннего \ остроугольного треугольника, выведите их в порядке возрастания и вычислите площадь полученного треугольника.
 Пусть даны координаты трех точек на плоскости. Если они могут быть вер-'шинами прямоугольного треугольника, вычислите его площадь. ...
«Пусть даны координаты трех точек на плоскости. Если они могут быть вершинами остроугольного треугольника, вычислите его площадь.
.Пусть даны координаты трех точек на плоскости. Если они могут быть вершинами тупоугольного треугольника, вычислите его площадь. Выведите длины сторон в порядке убывания.
Пусть даны координаты трех точек на плоскости. Если они могут быть вершинами равностороннего треугольника, вычистите его площадь и длину высоты.
Задания для самостоятельной работы 31
Вы подите длины сторон, площадь и длину высоты в порядке возрастай™ значений.
14.	Пусть даны координаты трех точек на плоскости. Если они могут быть вер шинами равнобедренного треугольника, вычислите длины его высот. Выве дите длины основания и высот в порядке возрастания значений.
15.	Пусть даны координаты трех точек на плоскости. Если они могут быть верши нами разностороннего тупоугольного треугольника, вычислите его площадь
16.	Пусть даны координаты трех точек на плоскости. Если они могут быть вер шинами равнобедренного тупоугольного треугольника, вычислите его пло щадь. Выведите длины сторон и площадь в порядке возрастания значений.
17.	Пусть даны координаты трех точек на плоскости. Если они могут быть вер шинами равнобедренного остроугольного треугольника, вычислите его пло щадь. Выведите длины сторон и площадь в порядке возрастания значений.
18.	Пусть даны координаты трех точек на плоскости. Если они могут быть верши нами разностороннего остроугольного треугольника, вычислите его площадь
19.	Пусть даны три числа. Если они MOiyr быть длинами сторон треугольника определите его вид (разносторонний, равнобедренный, равносторонний). Вы числите длины его высот и напечатайте их в порядке убывания.
20.	Пусть даны три числа. Если они могут быть длинами сторон треугольника определите его вид (прямоугольный, тупоугольный, остроугольный). Вычи слите длины его высот и напечатайте их в порядке убывания.
21.	Пусть даны координаты трех точек на плоскости. Если они могут быть вер шинами треугольника, определите его вид (разносторонний, равнобедренный, равносторонний). Вычислите длины его высот и напечатайте их в порядке убывания.
22.	Пусть даны координаты трех точек на плоскости. Если они могут быть вершинами треугольника, определите его вид (прямоугольный, тупоугольный остроугольный). Вычислите длины его высот и напечатайте их в порядке убывания.
23,	Составьте программу, которая определяла бы вид треугольника (равносторонний, равнобедренный, разносторонний, прямоугольный, тупоугольный остроугольный), если по данным трем отрезкам его можно построить.
24.	Пусть даны координаты трех точек на плоскости. Составьте программу, которая определяла бы вид треугольника (равносторонний, равнобедренный разносторонний, прямоугольный, тупоугольный, остроугольный), если данные координаты вершин позволяют его построить.
25.	Пусть даны координаты вершин четырехугольника. Составьте программу которая определяла бы, является ли этот четырехугольник прямоугольником.
26.	Пусть даны координаты трех вершин прямоугольника. Определите координаты четвертой вершины.
"лава 5
Операторы цикла
йворетические вопросы
' 1. Как называются программы, в основе которых лежит структура повторения?
J 2. Сколько операторов цикла вам известно?
*3. Как называется оператор, синтаксическая диаграмма которого приведена на рис. 5.1.
j-
Рис. 5.1. Синтаксическая диаграмма оператора
S4. Каков тип выражения в операторе цикла с предусловием?
pl Верно ли, что в теле цикла с предусловием должен находиться один оператор? Как сделать, чтобы в теле цикла было несколько операторов?
Ж* Когда проверяется истинность выражения в цикле while?
/р. Верно ли, что истинность выражения в цикле с предусловием является уело-вием продолжения цикла?
р* Сколько раз выполнится оператор в теле цикла while, если с самого начала значение выражения равно false?
Ю. Верно ли, что цикл while используется при вычислении всякого рода сумм £ и произведений, когда заранее не известно число повторений?
В» Как называется оператор, синтаксическая диаграмма которого приведена
£ на рис. 5.2?	\
.К
! REPEAT
-------
Оператор ;
Рис. 5*2. Синтаксическая диаграмма оператора
I
i Выражение
Теоретические вопросы 4
12.	Сколько операторов можно записать между ключевыми словами герег и until?
13.	Когда проверяется истинность выражения в операторе цикла repeat?
14.	Какой тип имеет выражение в операторе цикла с постусловием?
15.	Почему в цикле repeat оператор тела цикла всегда будет выполнен хотя 61 один раз?
16.	Верно ли, что истинность выражения в цикле repeat является условием окот чания цикла?
17.	С помощью каких служебных слов записывается цикл с параметром?
18.	Верно ли, что цикл с параметром применяется в тех случаях, когда заране известно число повторений?
19.	Пусть цикл записан в виде:
for v:-El to Е2 do S;
а)	Как называется El?
Ь)	Как называется Е2?
с)	Как называется v?
20.	Сколько раз выполнится оператор S, если Е1=Е2, а цикл записан в виде:
for v:=El to Е2 do S:
21.	Сколько раз выполнится оператор S и можно ли изменить значение пере менной v внутри цикла, если £1>Е2, а цикл записан в виде:
for v:<l 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.	Допустим ли выход из тела цикла whi 1 е?
33.	Допустим ли выход из тела цикла repeat?
34.	Какие циклы называются вложенными?
35.	Верно ли, что цикл, содержащий в себе другой цикл, называется внешним?
36.	Какой цикл называется внутренним?
Глава 5. Операторы цикла
37.	Какому условию должны удовлетворять вложенные циклы?
38.	Может ли внешний цикл быть циклом for, а внутренний — циклом repeat?
39.	Могут ли внутренний и внешний циклы быть циклами разных видов?
4& Могут ли внутренний и внешний циклы быть циклами одного вида?
4$ Может ли вещественная переменная быть параметром цикла for?
42. Можно ли в качестве параметров вложенных циклов for использовать одну < и ту же переменную?
43. Какие утверждения являются верными (проиллюстрируйте ответ соответствующими примерами):
1' а) любой цикл for можно записать при помощи цикла while;
b) любой цикл while можно записать при помощи цикла for;
 с) не любой цикл for можно записать при помощи цикла whi 1 е;
d) не любой цикл whi 1 е можно записать при помощи цикла for.
, задачи, программы
,1. Чему равно число повторений цикла for 1 :-А to В, если:
а)	6>=А-1;
Ъ)	В<А.
Й. Чему равно число повторений цикла for 1: ~А downto В, если:
j а) А>=В-1;
Ь) А<В.
3.	Пусть дан фрагмент программы:
f 	у 1;
S	1	2;
mv-	while 1 <= 5 do
1	begin
у - у * i:
£ i i + 1
о	end:
£	write ( у k
 а) Что будет напечатано в результате работы программы?
? Ъ) Замените цикл while циклом for.
с) Замените цикл while циклом repeat.
4.	Для заданных значений х и п вычислите г/ где п — натуральное число.
5.	Составьте программу вычисления значения М:
к\ ,к<9.
Упражнения, задачи, программы 43
♦б. С дм-laahTtf программу вычисления величины К:
и(п-2)(я-1)	_
------, и<9.
JC= 2S-", 9<п<29,
U п = 29,
(п-9)!, и >29.
7. Напишите программу вычисления значения функции у для десяти вводимых пользователем значений г.
х2 + 2х “ 2, - 2 < х < 1, х, (х < -2) или (х > 1).
8.	Составьте программу для вычисления самого большого числа, для которогс можно вычислить факториал на имеющемся компьютере.
9.	Пусть дано натуральное число п (запись числа п в десятичной системе есп ... с0). Составьте фрагменты программ для ответа на следующие вопросы.
а)	Сколько цифр в числе п?
Ь)	Чему равна сумма его цифр?
♦ с) Чему равна первая цифра числа п?
d) Как выглядит запись цифр числа п в обратном порядке?
*	е) Читается ли число п слева направо и справа налево одинаково?
♦	f) Чему равна знакочередующаяся сумма цифр числа п?
	g) Чему равно выражение ak - ak_t + ak 2- ... +(-1 /я0?
10.	Составьте программу для нахождения всех автоморфных чисел в отрезке [т, и]. Автоморфным называется целое число, которое равно последним числам своего квадрата. Например: 52= 25, 6г=36, 25г= 625.
11.	Пусть дано натуральное число п. Требуется следующее:
♦	а) выяснить, является ли оно степенью числа 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.	Составьте программу нахождения наименьшего общего кратного двух натуральных чисел.
Diami 5. Опкреторы цикла
14.	Составьте программу, которая проверяет, является ли заданное число совершенным. Совершенным называется натуральное число, равное сумме всех своих делителей (исключая само число). Например: 28 = 1+ 2 + 4 + 7 + 14.
15. Напечатайте все простые трехзначные числа.
16. Вычислите первый отрицательный член последовательности cos(ctg(w))h • ' я = 1,2, 3,... Отрицательные члены в этой последовательности обязательно есть.
. 17. Составьте программу, вычисляющую и печатающую п первых чисел Фибоначчи. Числа Фибоначчи получаются с помощью следующих рекуррентных соотношений:/t = /г ~ 1, /я=/п - 1 + /я - 2, я > 3,где/„ ~ целое.
♦18. Заданное натуральное число п представьте в виде суммы различных чисел Фибоначчи. Сколько слагаемых будет входить в эту сумму?
Найдите первое число Фибоначчи, большее заданного и.
ж Вычислите сумму всех чисел Фибоначчи, которые меньше 1000.
191- Для заданного значения х вычислите п-й многочлен Чебышева, если извест-ны следующие соотношения: 7о“ 1; 1\(х) = л; Та + 1(х) = 2хГя(х) - T„-i(x), -ЧЙ. Пусть дано целое k > 0. Напечатайте k-й член последовательности, задаваемой формулами:
Лд — 1,
= '“„-1 +-п
.4
Пусть дано натуральное число п (п > 5). Получите v„, если vo=v1=O;v2=l,5;
ЯГ v< = ТТТv-' “	‘ = 3>4 -
:Ж."	I 4" i
W4. Пусть даны вещественные числа q, rt b, с, d, натуральное число п (п>2у 2' Вычислитехп, еслихо = с, xj = d,хь = qx^-x + кхь-? + b,k> 2.
^25. Пусть дано натуральное число п (п > 3): Получите уп, если гц = и2 = 0, n = п = 1,
&
^-1 “4-1
7	7	» ”* —

*26. Пусть йо - = 1,	- а,-_2 +	... Для заданного п найдите произведение а,	• —’«й.
>27. Составьте программу вычисления суммы вида:
a)	l+-v+“v+...+—;
23 З3 50*
Vx 1	1	! 1
Ь)	+... н--------------.
22	42	63	1282
28. Пусть xq•= у0 ~ 10 и Xi+i и 0,1^, у^х = ОДх - 0,12^, для i > 1. Требуется найти наименьшее i, такое, что |х,| < е, < е для заданного в > 0.
Упражнения, задачи, программы 4(
29. 11у<1 г. дико 100 вещественных чисел, которые вводятся по одному. Найдит* количество положительных, отрицательных и нулевых чисел.
"30. 11 усть дано 100 вещественных чисел, которые вводятся по одному. Вычисли те среднее арифметическое положительных и среднее арифметическое от рицательных чисел.
31. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычислите разность между максимальным и минимальным числами.
♦32. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычислите среднее арифметическое чисел, больших полусуммы первых двух.
; ♦ЗЗ. Пусть дано 100 целых чисел, которые вводятся по одному. Получите сумм) г	тех из них, которые:
а) кратны 5;
.	Ь) нечетны и отрицательны;
i с) меньше по абсолютному значению квадрата порядкового номера вводимого числа.
: *34. Пусть дано натуральное число п и вещественные числа аг,..., а», которые вводятся по одному. Получите:
а)	их произведение;
Ь)	их среднее арифметическое;
с)	аг + 2 а2 + 3 а3 + ... + п «п;
d)	«, а, + а2 а3+ ... + в,., a, (n > 1);
е> К-в«|:
О последовательность alt ага2> afaa.
♦35. Пусть дано натуральное число п и последовательность из п вещественных чисел, среди которых есть хотя бы одно отрицательное. Найдите наибольшее среди отрицательных чисел этой последовательности.
36.	Составьте программу вычисления при заданныхх и а значения функции 3/ вида:
а) У - ((((((((х + а)2 + а)2 + а}2 У а}2 + а)2 + а)2 + а)2 + а)2;
♦	Ь) У -а+(а + (а + (а+(а + (аУ(а + (аУх)2)2)2)2)2)2)2;
	с) у -	~ 2)(Л ~	~	~~64) -
У (х-1)(х-3)(х-5),..(х-63) ’
	d) у = (((((х - а)х - а)х - а)х - а)х - а)х - а.
37.	По заданному значениюхвычислите значение у, представив многочлен в виде
у = (...(((х+2)х + 3) + 4)х + ... + 10)х + И
a) у = л!0+2х+3х*+... + 10х + 11;
♦Ь) у = 11х10 + 10х9 + 9х8 +... + 2x4-1.
38. Вычислите значение многочлена /(х) = aoxfl + atx"-1 +... + an_tx + ал и его производной в точке х = Г*+ 0,5 для заданного значения £. Числа nt t, aOf at,..., ая определяются вводом.
40 Глава 5. Операторы цикла
39. Вычислите:

Напишите программу вычисления при заданном х величины у по формуле:
К	2 256
Е	Х + 2
К	х
R41. Вычислите:
» a)y-=cosx + cosx + cosx + ...+cosx ;
К b) у - 1!+ 2! + 3!+...+ я!,п> 1;
Вь c)^ = sinl + sinl,l + sinl,2 +...+sin2;
.»'• *d) первое из чисел sinx, sin sinx, sin sin sinx..., меньшее по модулю, чем 1СГ'. М2. Вычислите сумму квадратов всех целых чисел, попадающих в интервал Ж (1пх, ех ),х > 1.
КЗ. Напишите программу нахождения первого члена последовательности
а, = (-1)"(1 +1 +... + А) , (и - 1,2,...), 2 п
Ж., который не принадлежит заданному отрезку [а, Ь].
>44. Используя метод деления отрезка пополам, с точностью до 10”4 найдите наи-V	меньший положительный корень уравнения tg х = х.
^45. Пусть дан прямоугольник, длины сторон которого а и b — натуральные числа, г !<: На сколько квадратов, стороны которых выражены натуральными числами, можно разрезать данный прямоугольник, если от него каждый раз отрезать квадрат максимально возможной площади?
♦46. Составьте программу для нахождения всех прямоугольников заданной площади. Считайте, что длины сторон прямоугольников и площадь выражаются натуральными числами.
47.	Составьте программу для нахождения и печати всех пифагоровых чисел, не превышающих 20.
Упражнения, задачи, программы
4
48.	Вм нсдите на экран одну из строк формулы
5
1-3-...-7V
для заданного натурального N; первая строка выводится, если N — четное вторая — если N — нечетное.
49.	Пусть вводится последовательность из целых чисел, оканчивающаяся нулем Найдите:
	а) номер последнего из наибольших чисел последовательности;
♦	Ь) наименьшее из всех положительных чисел последовательности;
с) два наименьших числа последовательности;
*	d) номер меньшего из двух наибольших чисел последовательности;
♦	е) сумму тех из них, порядковые номера которых — числа Фибоначчи.
50.	Пусть вводится последовательность вещественных чисел, оканчивающаяся нулем и состоящая более чем из одного ненулевого элемента. Определите:
	а) содержит ли последовательность хотя бы одну пару равных соседних эле ментов;
	Ь) сколько раз в последовательности меняется знак при переходе к следую
* щему элементу;
с) является ли эта последовательность возрастающей;
♦d) номер числа по абсолютной величине самого близкого к своему номеру.
*	51. Б соревнованиях по фигурному катанию оценки выставляют несколько судей. При выведении единой оценки за выступление одного спортсмена и< всей совокупности оценок удаляется наиболее высокая и наиболее низкая, и для оставшихся оценок вычисляется среднее арифметическое. Если несколько судей выставили наиболее низкую или наиболее высокую оценки, то из совокупности оценок удаляется только одна такая оценка. Напишите ' программу для вычисления оценки спортсмена.
♦	52. Пусть“ a, xk=qXk-\ + b (k = 1,2,...). Дано неотрицательное целое п и вещест’ венные a, b, с, d,q (с < d). Сколько чисел jq (k < л) принадлежит интервалу (с, с/)?
	53. Пусть дано натуральное число п и вещественные числа а, А, Ь. Вычислите сумму:
1 + 2(Ь - а) + 3(6 - п)(6 - а - А) + ... + (п + 1)(6 - а) ... (Ь - а - (и - 1)6).
54. Имеется целое k > 0. Вычислите А-й член последовательности Xi, х2,	где
лго=1,хя=кхя.1+1/« при п = 1, 2,3,...
♦55. Пусть дано натуральное число п. Вычислите значения выражений:
fhaia 5. Операторы цикла
•56. Пусть даны натуральное число п и вещественное число х Вычислите:
е) sin х + sin2 х + ... + sin"x f) sin ж + sin x2 + ... + sin ж";
g) sin x + sin sin x + ... + sin sin sin ... sin x.
Пусть даны натуральное число п и вещественные числа , У\, х2, у2,..., хл, уя. 1 Рассматривая пары х, у. как координаты точек на плоскости, определите ра диус наименьшего круга с центром в начале координат, внутрь которого по-&' падают все эти точки.
фб. Даны натуральное число п (п > 2) и вещественные числа л,, £], л2,62,.
Рассматривая пары а„ bi как координаты левых и правых концов отрезков ; числовой прямой, определите концы отрезка, являющегося пересечением всех I}:. этих отрезков.
Ц. Пусть дано натурал ьное число k. Напечатайте k-ю цифру последовательности: а) 12345678910111213..., в которой выписаны подряд все натуральные числа; Ь) 149162536..., в которой выписаны подряд квадраты всех натуральных чисел;
l с) 1123581321..., в которой выписаны подряд все числа Фибоначчи.
Вычислите Xt + Хг +...+х^, если последовательность Xi, х2,, образована по сле-[р- дующему закону:
5 у з
а) л-, = 0; а2 = Xi =	+ -х(._2, i = 3,4,...;
"	'J	jCr т
Xj — 1, x2 — 0.3, Xj — (Z 4-1) -x^_2, i — 3,4,
.. С) x, = x2 = x3 =!;*;= (Z + 3)(xM -1) + (x + 4)x-_3, Z = 4, 5,...
1. Каждая бактерия делится на две в течение одной минуты. В начальный мо-мент времени имеется одна бактерия. Составьте программу для расчета ко-fe; личества бактерий через заданное целое количество минут.
Ч 	Л
02. Вычислите приближенное значение Jx2dx, используя формулу прямоугол ь-а
ников, если известно, что отрезок (й, Л] разбит на п частей. Формула прямоугольников для вычисления интеграла записывается в виде:
УflРИЖНШИЛИ, 41ВДН1Г1, ,'p/wi г-'-
63.	Вычислите определенные интегралы: о г
a) |4cosJxd!x;
и
64.	Используя приближенное интегрирование, найдите значение л. Для этого вычислите площадь четверти единичного круга, а затем увеличьте ее в четыре раза.
65.	Выведите таблицу значений функции у =/(х). Таблица должна иметь две колонки: в первую заносятся значения х, а во вторую — у±
а)	/(х)=cosVSx, xf = а +-—i - 0,1,и; a,b,n~- вводятся;
n
b)	/(x)= \ T Xj ~ 1-нА, i = 0,1,.... n; h, n — вводятся.
V2x3 -1
66.	Получите таблицу температур по шкале Цельсия от 0 до 100 градусов и их эквивалентов по шкале Фаренгейта, используя для перевода формулу
9
/р' — /с + 32.
5
67.	Пусть интервал (а, Ь) разбит точками нац равных частей; в каждой точке вычисляется значение функции
х2 ~3х + 2
л/2.13 -1
Найдите точку, в которой функция достигает наибольшего значения.
68.	Пусть отрезок [«, b] разбит точками на п равных частей. В каждой точке вычисляется значение функции
х" - Зх + 2
г/2д3-1
Найдите наибольшее и наименьшее значения функции в этих точках.
69.	Пусть отрезок [а, А] разбит точками на п равных частей. Б каждой точке вычисляется значение функции
х2 - Эх + 2
^2х3 -~1
Найдите те точки, в которых функция принимает наибольшее и наименьшее значения.
OU Пива 5 Огшраюры цикм
“70. Найдите то знпчснисг, при котором значение суммы Pj(x)4-/72(x) + p3(x) мак-сималыю, если
Pi(*) = * > Р2М ~ ЗХ — , Рз(х) = 5Х ~-Х , ах = 0; 0,5; 0,1;... 20.
jLi
Л71. Билет называют «счастливым», если в его номере сумма первых трех цифр М; равна сумме последних трех цифр. Подсчитайте число тех «счастливых» би-* летов, у которых сумма первых трех цифр равна 13.
Задания для самостоятельной работы
у 1. Пусть = а} = 1; ак = «Ь1 +	, где k - 2,3,...
%. р .
т Найдите произведение а^-ал-...-ап,
". 2. Вычислите длину кривой, соответствующей функции у - /(х) на отрезке ;	[а, А], приближенно заменив кривую ломаной, полученной в результате раз-
у биения отрезка («, 6] на п равных частей.
%.	 тт
, 3. Пусть даны вещественные числа а, b (Ь > а), натуральное и. Получите
Д.
и + Л + - + Л)'й> где h = ^-, ft = п
а + (г-0,5)-h
Л = 1,2,
п.
4. Пусть дано целое число т > 1. Получите наибольшее целое k, при котором 4k< т.
f 5. Определите, в какую наибольшую целую положительную степень можно воз-ft вести число Ь, чтобы результат не превосходил заданной величины а (Ь < а).
6. Пусть дано вещественное число х и натуральное число и. Вычислите:
V	(х - 2)(х - 4)..,(х - 2«)
|	(х - 1)(х - 3)...(х - 2л -1)
$ 7. Пусть даны вещественные числа a, h, натуральное число л. Вычислите:
|	/ W+f(a + л) + f(a + 2h )+... + f(a + nh ), где f(ic) = (x: +1) cos x.
8.	Корень некоторого уравнения находится последовательными приближениями по формуле
Напишите программу для нахождения такого приближения корня, при котором разность по модулю между двумя соседними приближениями не превосходит 10’5, а начальное приближение х(! = 1,
9.	Сторона правильного вписанного многоугольника с удвоенным числом сторон выражается через сторону исходного многоугольника а,; и радиус описанной окружности R в виде формулы
Задания дли оамоотоятальноРГработы DT
«а« - 42Я’-2Л.|Л2-^~ • V	1	*т
Вычислите длину стороны правильного вписанного 48-угольника.
10.	Цилиндр объема 1 имеет высоту Л. Определите радиус основания цилиндра для значений Л, равных 0,5; 1; 1,5; ...; 4,5; 5.
11.	Способ последовательных приближений позволяет находить корень пятой степени из положительного числа а приближенно по формуле
4	а
*л+1 = "7*И	- 4 ’
5	5хл
При этом разность между и Va по абсолютной величине не превосходит
Составьте программу вычисления корня пятой степени из числа а с точностью до 10* с заданным значением k, принимая
fnin(2a, 0,95), «51,
х0 = - а / 5, 1 < а < 25,
а /25, а >25.
12.	Пусть дано натуральное число н. Получи те наименьшее число вида 2*, превосходящее п.
13.	Пусть дано натуральное число п. Вычислите: l*2 + 2- 3*4t.2я-
14.	Напишите программу для вычисления корня п-й степени из положительного числа а, пользуясь последовательными приближениями
п-1 =------Ч
fl
а
k - 0,1,2,... до совпадения соседних приближений с точностью Е, если задана начальное приближение ло.
15.	Пусть дано натуральное число п. Выбросите из записи этого числа цифры 3 и 7, оставив прежним порядок остальных цифр. Например, из числа 3 171 507 377 должно получиться 1150.
16.	Пусть дано натуральное число п. Найдите наименьшее среди чисел
sm н + —
I п
= 1,2,
..., п.
17.	Пусть дано натуральное число п. Найдите	+ а2Ь2 +... + акЬп} где «1=6^1,
1
+ — а. .
2 1-1
ak — 2
>bt=2a2 +6 fA-l,2,....
*	i-l А-l
n.
 wn w wf rw| MTnpi*i ЦИК Л 
IB.	Пусть дины целые числа a'j, *1. ...» x35. Вычислите величину:
*1 (*2 + -Ч )(-*4	*5 ** ^л)”'(^46 + ^41 + ••> + **S5 )
19.	Пусть -Г] - 0,3; х2 - —0,3; х, = / + sin(x(._j), i = 3,4,... Среди чисел х,, х2,.... х[00 найдите ближайшее к какому-нибудь целому числу.
. J0. Пусть а. = -—- + sin	i - 1,2,..., п, где п задано.
/ +1 i +1
Найдите сумму всех положительных чисел
ЭД. Пусть дано натуральное число п и вещественное число х Среди чисел:
e“s^'*)-sin(j?/S), где k = 1,2,..., п,
найдите ближайшее к какому-нибудь целому числу.
32. Последовательность чисел alf й2,...,^1оо задана формулой
ak = sin2(3A + 5)-cos(Z?2 -15), k * 1,2, ...,100.
Определите, сколько членов последовательности с номерами 1, 2,4, 8, 16,... имеют значение, меньшее 0,25.
$3, Дано вещественное положительное число Ь. Последовательность аь ai, аз,... |* образована по закону:
цЬ; Я] Clj 1 ” t	2,3,... ,
ж' Найдите первый отрицательный член последовательности.
мЕ Дано вещественное отрицательное число Ь. Последовательность aif с2, а3( ... н- образована по закону:
Ч*	ar} +1
ML	l-sm i
ж Найдите первый неотрицательный член последовательности.
|Ж, При некоторых заданных.!', Л’и £, определяемых вводом, вычислите сумму N № слагаемых заданного вида, а также сумму тех слагаемых, которые по абсо-лютной величине больше £. Для второго случая выполните суммирование Ж»'.для двух значений £, отличающихся на порядок, и при этом определите ко-
личество слагаемых, включенных в сумму. Сравните результаты с точным значением функции, для которой данная сумма определяет приближенное '0; значение при х, лежащем в интервале ( -R, R).
J a) sin(x) _ t ? ! / / !
< х	3! 5! 7!
2	4	2*Л‘
Ь) С- =1- —+ —...+(-1)".^— (Я-М).
	1!	2!	М
Задания для самостоятельной работы 53
7
1 х3 1-3 х5
2*Т+?4 'Т 2-4*6 7
(R -1)
.3
d)
z .	~	*5
arctg(x)-x—у + -у
7	„9
3
9
(Я = 1).
5
7
• , ч	1	*'
arcsin(x) = Л !----h
2 3	2*4 5	2-4-6 7
е)
1-3-5
r±./+-L£2_.x6+.„ (д=1).
2*4	2’4-6
... (/? = !>. 2-4-6
(Я = 1).
------ = 1-2-х + 3'Х2-4’Х3+5-х4 (1 + х)г
(* = О-
к)
(/? = 1).
1)
+ *-)
(* = 1).
(* = 1).
in(i + х)
(тг-1).
о) ch(x) =	1 4- Х 2!	Л 1-	4.	X 4*... >6!	(2? - оо).
		Г	Л 4!		
р) sh(x) =	X3 х +		X5 t-	4	х^+	(7? = ~).
Ч) cos(x) =	3! =1-—	5! л4 4		7! хб 	4 ...	(Я--).
г) sin(x) =	2! Х- —	4! л5 4“		6! А7	(R = «).
FWtW
n) €* =* 1 — — + —*-•	(/? ** °o).
1!	2!	U	7
t) e = 1 + —I—— +...	(J? " oo).
1!	21	v	7
j) af = jsin(x)dn(bx) j2-0 + 1)!
V) 0( Д-1)Чсоа(л)Гч!1
где ?!!=
1  3 * 5 ... • it если i — нечетно, 1
2 • 4 -6 ... • i, если i — четно.
W) e,=£±i2!iW 0 + l)bil!
где Л! =
1  3 5• г, если i — нечетно, 2-4’6'.„-i, если i — четно.
x) a{ = {	'S^O-x)-?!! д।_ 1  3-5•...• jеслиi — нечетно,
0 + D*	2• 4  6 если i — четно.
y>
. Н)'+1-1п(ёх)
W-/ “	1	—	~--—
*‘O2 + I)
Глава 6
Литерный тип
Теоретические вопросы
1.	Верно ли, что литерный (символьный) тип относится к скалярным типам данных?
2.	Как задается описание переменных литерного типа?
3.	Каково множество значений литерного типа?
4.	Какой объем памяти требуется для хранения переменной символьного типа?
5.	Приведите примеры символьных констант.
6.	Верно ли то, что значением литерного типа является множество всех символов кодовой таблицы ПЭВМ?
7.	Что такое код символа?
8.	Верно ли то, что каждому символу ставится в соответствие целое число в диапазоне 0...255?
9.	Можно ли к данным символьного типа применять операции отношения?
10.	Верно ли, что в программе значения символьного типа должны быть заключены в апострофы?
11.	Каков результат работы функции ord(c), где с — переменная символьного типа?
12.	Верно ли утверждение, что о rd С 01) = О?
13.	Верно ли, что 'а1 = ’А1?
14.	Верно ли утверждение, что если с n d — литеры, то c<d тогда и только тогда, когда о rd (с) <ord (d) ?
15.	Как работает стандартная функция chr (1), где 1 — целочисленная переменная?
16.	Каковы особенности кодировки цифр, латинских и русских букв?
17.	Какие операции применимы к символьным данным?
18.	Какие встроенные функции можно применить к символьным данным?
19.	Верно ли, что chr(ord(c)) = с, где с — переменная символьного типа?
20.	Верно ли, *m> ord(dir( D) - I. где 1 - переменная целого тинп?
21.	Как работают стандартные функции pred(c), succ(c), где с — переменная литерного типа?
22.	Верно ли, что pred(c) - chr(ord(c)-l), где с — переменная символьного типа?
23.	Верно ли, что succ(c) » chr(ord(c)+l), где с — переменная символьного типа?
24.	Можно ли переменные и константы символьного типа использовать в выражениях?
25.	Можно ли к переменным символьного типа применять стандартные процедуры ввода-вывода?
Упражнения, задачи, программы
i. 1. Напишите проп>амму, которая по введенному символу определяет его по-£ рядковый номер, а также предыдущий и последующий символы.
КД Напечатайте все буквы латинского алфавита.
” Ж Пусть вводится последовательность символов длиной 10. Подсчитайте, сколь-Г, ко среди них цифр?
у4< Пусть вводится последовательность символов длиной не более 20. Признак К конца последовательности — точка. Верно ли, что в последовательности со-F1, держится четное количество строчных латинских букв?
М. Подсчитайте, сколько раз среди последовательности символов встречается й' символ, задаваемый вводом. Количество вводимых символов также опрсде-t ляется вводом.
В Напечатайте заданную последовательность символов, заменяя каждую точку EL многоточием.
К Пусть входной поток литер содержит по крайней мере одну цифру. Считая &р;первую из них началом записи числа (целого или вещественного с фиксиро-К; ванной точкой), по правилам языка Паскаль выполните преобразование этой г?записи в число, присвойте его значение переменной и выведите результат.
I Пусть дана последовательность литер, имеющая вид ±d2 ±...± dn — К цифры, и > 1), за которой следует точка. Вычислите значение этой алгебраи-f г. ческой суммы, г
к Пусть даны целое число и, символы хр $2,sn. Выясните, имеются ли в этой = последовательности такие члены, что st — это запятая, a s. н — тире.
Ц Пусть даны символы sp s2,.... 5я. Известно, что символ отличен от восклицательного знака и что среди символов s2, s3,... есть по крайней мере один восклицательный знак. Пусть s2,sn — символы данной последовательности, предшествующие первому восклицательному знаку (?? заранее неизвестно), а) определите количество пробелов в последовательности s2,sn;
b) выясните, имеется ли среди s2fпара соседних символов но или он; с) выясните, имеется ли среди	пара соседних одинаковых символов.
Упражнения, задачи, программы 57
•	11. 11усть даны целое число п, символы sp s2,sn. Удалите из данной последовательности все группы букв, образующих запись abed, то есть получите новую последовательность, не содержащую этих групп литер.
	12. Пусть даны целое число п, символы sp s2, sn. Преобразуйте последовательность 5Р $2, ..., 5В, удалив каждый символ звездочки ( *) и повторив каждый символ, отличный от звездочки.
♦	13. Пусть даны целое число п, символы sp х2>..., $л, среди которых есть двоеточие. Получите все символы, расположенные:
а)	до первого двоеточия включительно;
Ь)	между первым и вторым двоеточием; если второго двоеточия нет, то получите все символы, расположенные после имеющегося двоеточия.
	14. Напечатайте заданный непустой текст, удалив из него все буквы Ь, непосредственно перед которыми находится буква с,
	15. Заданный текст распечатайте по строкам, понимая под строкой либо очередные 60 литер, если среди них нет запятой, либо часть текста до запятой включительно.
♦	16. Пусть в заданны й непустой текст входят только цифры и буквы. Определите, удовлетворяет ли он следующему условию:
а)	текст начинается с некоторой ненулевой цифры, за которой следуют только буквы, и их количество равно числовому значению этой цифры;
Ъ)	текст начинается с k букв (1 <&< 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 );
var c: colour; begin
for c := green to yellow do
Пйрвмисл ИМЫИ тип
1
writet ord( с ) ):
end.
. Измените фрагмент программы из предыдущего вопроса, заменив цикл циклом while.
. Ко всем ли значениям перечислимого типа применимы функции succ и рп . Что будет напечатано в результате выполнения следующих программ:
program А;
begin
if true > false
then writelnC ’true > false' ) else writelnf 'true false' ) end
program B:
type
z т ( true, false ): begin
if true > false
then wr1teln( 'true > false' ) else writeln( 'true <- false' ) end.
. Можно ли к данным перечислимого типа применить стандартные проце, ры ввода-вывода?
. Какие средства имеются в языке Паскаль для ввода-вывода значений пе менных перечислимого типа?
ражнения
. Пусть имеются описания:
type
day * ( monday. tuesday, Wednesday, thursday. friday, Saturday. Sunday):
pnonth ( m28. m29, гпЗО, m31 k var
wday, weekday: day.-kday: pmonth;
а) установите, какие значения могут принимать переменные weekday, kdaj Ь) определите, допустимы ли следующие присваивания: weekday friday kday :и гп27 weekday := пЗО kday ord( thursday }
с) вычислите значения выражений:
monday < Sunday tuesday = m28 Wednesday <= Wednesday tuesday о m29 succ( 29 ) pred( Saturday )
tr.wwe F .	1ИП, ограниченный ТЙЛ, опора 1 up ОйрИННГО
рп.чН |П?В } or d( l.uesdity ) ord( tuesday ) + pred( 30 ) succ( kday ) * 1 + ord( pmonth )
d) Что будет напечатано в результате выполнения следующих операторов:
wday :-= sued Friday );
if wday = Sunday
then wr1teln( ’yes' ) else write! n( 'no' ):
writeln( ord( monday ) ):
for wday :e monday to Friday do writef ord( wday ) );
с) Допустимы ли следующие операции ввода-вывода:
read( wday ) write( monday ) write!n( 'Sunday' ) wrltelnt ord( Wednesday ) ) writelnf succ( tuesday ) ) write!n( ’pnionth=’, 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, и значение false в противном случае. Месяцы 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 (считайте, что за декабрем идет январь);
Ь)	название Л-го месяца после месяца т;
с)	название я-го месяца года.
Ограниченный тиг
Ограниченный тип
Теоретические вопросы
1.	Верно ли то, что ограниченный тип называется также интервальным i
2.	Почему интервальный тип называется диапазоном?
3.	Верно ли, что интервал ьный тип используется тогда, когда заранее по с задачи известен диапазон изменения переменных?
4.	Что делает компилятор при каждой операции с переменной интерва типа?
5.	Могут ли константы, определяющие границы интервального типа, им( real?
6.	Верно ли, что значение первой константы, определяющей интервалы! данных, должно быть меньше второй?
7.	Какие символы разделяют константы, определяющие тип диапазон?
8.	Где определяется тип диапазон?
9.	Можно ли границы диапазона задать не значениями констант, а их им определенными в разделе описания констант?
10.	Какие значения могут принимать переменные типа диапазон?
И. Можно ли стандартные функции ord, succ, pred применять к перем интервального типа?
12.	Можно ли к переменным интервального типа применять процедуры вывода?
13.	Как описываются переменные ограниченных типов?
14.	Можно ли операцию, применимую к переменной некоторого типа, i нять к переменной, относящейся к соответствующему диапазону?
15.	Могут ли в одном выражении встречаться переменные, относящиеся личным диапазонам одного основного типа?
16.	Может ли переменная интервального типа фигурировать в левой чаш ратора присваивания?
17.	Может ли переменная интервального типа фигурировать в г [раной час ратора присваивания?
18.	Верно ли, что функции, определенные для базового скалярного типа, применяться и к ограниченному типу?
Упражнения
•1. Пусть даны описания:
type Days-1..31;
var
RabDay. BolnDay: Days: t: boolean: k: integer:
в2 Пшм 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 := succf BolnDay ) k :== pred( RabDay )
2. Пусть даны описания: var z: 'a\.rz': date: 1..31;
digit:
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 read(month ) writeln( z )
3. Пусть дано описание:
var масштаб: ( дюйм, фут, стадия, миля };
Равнозначны ли фрагменты программ?
a)	for масштаб : = дюйм to миля do преобразовать;
Ь)	масштаб дюйм: while масштаб миля do begin преобразовать; масштаб : = succ( масштаб ) end;
Оператор варианта
Теоретические вопросы
1.	Что общего у операторов case и if?
2.	Чем различаются операторы case и 1 Г?
3.	Верно ли, что выражение после служебного слова case называется селектором или переключателем?
4.	Верно ли, что список констант называют списком меток?
5.	Чем метка в операторе case отличается от обычной программной метки?
6.	Может ли список констант в операторе case состоять из одной константы?
Оператор варнак
7.	Какой символ разделяет константы в списке констант оператора cas
8.	Каким служебным словом заканчивается оператор case?
9.	Верно ли, что оператор case выполняется следующим образом: сна1 числяется значение выражения селектора, затем выполняется тот oi константа которого равна значению селектора?
10.	Может ли присутствовать ветвь el se в операторе case?
11.	Как будет выполняться оператор case, если ни одна из констант не р кущему значению селектора?
12.	Какой тип может иметь селектор оператора case?
13.	Верно ли, что все константы, предшествующие операторам — альтер] оператора case, должны иметь тип, совместимый с типом селектора?
14.	Как записывается список меток альтернатив, если метки имеют т пазон?
15.	Что означает фраза «константы в альтернативах должны быть уника в пределах оператора варианта»?
16.	Могут ли в операторе пересекаться метки, тип которых — диапазон?
17.	Могут ли метки, тип которых — диапазон, содержать константы, ук< в данной или других альтернативах?
18.	Сколько операторов может содержать каждая альтернатива?
19.	Каким символом заканчивается каждая альтернатива?
20.	Может ли альтернатива быть пустым оператором?
21.	Сколько операторов может содержать ветвь el se в операторе сазе?
Упражнения
1.	Замените вложенный условный оператор оператором варианта:
if Ch «  i' then N :=₽ 1 else
if Ch = j' then N := 5 else
if Ch = *k' then N := 10 else
if Ch = "11
then N r- 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;
□W	глава 7. перечислимый тип, ограниченный тип, опери орпринт п
d 3 end end;
если переменная k имеет значение:
а)	6;
Ь)	235;
с)	71.
3.	Что будет напечатано в результате выполнения следующего фрагмента про граммы:
var
season: ( winter, spring, summer, autumn ):
begin
case season of
winter: writeln( 'Winter' ):
spring: write! n( 'Spring' );
summer: writelnt 'Summer' ):
autumn; writelnt ’Autumn' ) end
end:
если переменная season принимает значение:
a)	spring;
b)	sunnier;
с)	зима;
d)	ord( winter ).
4.	Восстановите условие задачи:
program Oay_Week; var
Day: 1..7:
begin
write ( ’Введите номер дня недели: '};
readln ( Day ):
case Day of
1:	writein ( ‘Понедельник’ );
2:	writein ( 'Вторник' );
3; writein (' Среда' ):
4:	writein ( 'Четверг' ):
5:	writein ( 'Пятница' );
6:	writein ( 'Суббота' ):
7:	wrlteln ( ’Воскресенье' ) end
end.
5.	Напишите фрагмент программы для определения величины dayscount, значение которой равно количеству дней в заданном месяце 1998 года.
6.	Восстановите условие задачи:
program symbols: var
n, kO, kl. k2: integer; ch: char:
Упражнения, задачи, программ!
begin
kl 0;
kl 0:
к2 0:
readt Ch ):
while Ch о '.' do
begin
n := ord(Ch) - ord('A');
case n of
0: kO kO + к
1: kl := kl + к
2: k2 := k2 + 1 end;
readt Ch )
end;
readln;
writelnt kO, kl, k2 ) end,
7. Что будет напечатано в результате работы следующей программы: program Whatlslt;
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;
in := m div 10;
n n-6;
case n of
1:	kl : = kl + 1:
2:	k2 k2 + 1;
3:	кЗ := k3 + 1 end
end;
writelnt kl. k2, k3 ) end,
8.	Составьте программу вычисления по заданному радиусу и значению менной k площади круга (если k ~ 1), длины окружности (если k = i объема шара (если k = 3).
9.	Пусть текст вводится с клавиатуры. Известно, что в тексте встречаютс. ментарии, которые расположены между знаками (* и ♦). Исключите вс ментарии из текста.
Упражнения, задачи, программы
1. В следующем фрагменте программы по значению переменной типа С (название страны) присвоить переменной типа Capital название столищ страны.
П»м 7. Перечислимый тип* ограниченный тип, оператор варианта
type
Country - { Австрия, Болгария, Греция.
Италия. Норвегия, Франция.ФРГ ):
Capital - ( Вена. София. Афины. Рим.
Осло. Париж. Бонн ):
2. В следующем фрагменте программы по значению переменной Р (русское название языка программирования) присвоить переменной А английское название этого языка,
var
₽: (Ада, Бейсик. Модула?, Лисп, Паскаль. Пл1. Фортран ):
А: ( ada. basic, pascal. modu1a2, lisp, pascal. pH, fortran );
'3. В следующем фрагменте программы по значению литеры-цифры d присвоить переменной п название этой цифры.
type
название - (ноль. один, два, три. четыре, пять):
var
d: ‘О’..’5’:
П: название:
4. В следующем фрагменте программы определите 1 “ интервал, образованный нотами п1 и n2 (nl * п2): секунда — это интервал из двух соседних (по кругу) нот (например, ре и ми, си и до), терция — интервал через ноту (например, фа и ля, си и ре) и т. д.
type
нота - ( до, ре, ни. фа. соль. ля. си );
интервал - ( секунда, терция, кварта, квинта, секста, септика ); var
nl, п2: нота:
1:	интервал;
5.	В следующем фрагменте программы замените значение переменной х, означающее некоторую длину в единицах р, значением в метрах.
type
единица - ( дециметр, километр, метр, миллиметр, сантиметр );
длина - real:
var
х: длина:
р: единица;
6.	В следующем фрагменте программы выведите название цвета, отвечающее значению переменной с.
type
цвет - ( черный, белый, синий );
var
С; цвет;
7.	В следующем фрагменте программы введите литеру и присвойте переменной х соответствующее этой литере значение типа letter.
type
letter - ( a. b. с. d ):
var
x: letter:
♦8. Для значений целого числа k от 1 до 99 напечатайте фразу «мне Л л< тывая при этом, что при некоторых значениях k слово «лет» надо з словом «год» или «года».
*9. Для натурального числа k напечатайте фразу «мы нашли k грибов согласовав окончание слова «гриб» с числом k.
10. В следующем фрагменте программы определите новый курс К2 кора( корабль сначала шел по курсу К1, а затем его курс был изменен согла казу ПР.
type
курс - ( СЕВЕР. ВОСТОК, ЮГ. ЗАПАД );
приказ - ( ВПЕРЕД. ВЛЕВО. ВПРАВО. НАЗАД );
var
KI. К2: Hjypc:
ПР: приказ;
И. В следующем фрагменте программы переменной t присвойте значе если тройка у, m, d образует правильную дату, и значение false в пр случае (например, 31 июня и т. п.).
type
месяц - ( якв. фев. мар. апр, май. июн.
июл, евг, сен. окт. ноя. дек ): var
у: 1900..2000:
т: месяц;
d: 1..3Г.
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:
ш: месяц;
а)	определите к — порядковый номер того дня високосного года, имеет дату d, гл.
Ь)	определите d, гл — дату k-го по счету дня високосного года.
vv---f лив т, исчислимый тип, ограниченный тип. опервтпр мриашв
*14. Пусть дпн фрагмент программы:
type
число  1..31;
месяц - ( янв, фев. мар. алр, май. июн, июл. авг, сен, окт, ноя, дек };
день_недели - ( вс. пн. вт, ср, чт. пт. сб ): var
d: число;
ГЛ: месяц;
wdl, wd: деньнедели;
k; 0..12:
Считая, что год високосный и его 1 января приходится на день недели wdl, определите:
a)	wd — день недели, на который приходится день с датой d, г;
b)	k — количество понедельников в году, приходящихся на 13-е число.
♦15. Пусть значение функции f<п) равно количеству букв в записи числа п русскими словами f (1 )=4 (один), f(3>3 (три), Т(42)-8 (сорок два) и т. п. Напечатайте все натуральные числа п, меньшие 100, для которых f(n)=n.
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. Координаты на шахматной доске определяются по горизонтали от а до h и по вертикали от 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 Пиви В. Яегулирнмв типы данных
19.	Может ли индекс быть выражением целого типа?
20.	Может ли индекс быть выражением вещественного типа?
21.	Может ли индекс быть выражением любого порядкового типа?
22.	Какой массив называется одномерным?
23.	Какой массив называется двумерным?
24.	Какой массив называется л-мерным?
25.	Верно ли, что одномерный массив соответствует понятию линейной таблицы (вектора)?
26.	Верно ли, что двумерный массив соответствует понятию прямоугольной таблицы (матрице, набору векторов)?
27.	Существуют ли ограничения на размерность массива?
28.	Можно ли в описании массива использовать предварительно определенные константы?
29.	В какой последовательности располагаются в памяти элементы одномерного массива?
30.	Верно ли, что элементы с большими значениями индекса хранятся в больших адресах памяти?
31.	Верно ли, что двумерные массивы располагаются в памяти таким образом, что второй индекс изменяется быстрее, чем первый?
32.	Верно ли, что матрица расположена в памяти по строкам?
33.	Всегда ли работа с массивом сводится к работе с его компонентами?
34.	Обязательно ли количество элементов массива должно быть фиксирован-г ным, то есть определяться при трансляции программы?
35.	Может ли процедура read(x) ввести весь массив х целиком?
36.	Можно ли с помощью стандартной процедуры wr 1 te(х) вывести весь массив х целиком?
37.	Как можно сымитировать работу с массивом переменной длины?
38.	Возможно ли следующее описание:
var а: array[integer]
39.	Предложите способы вывода элементов двумерного массива.
Векторы. Задачи, программы
1. Используя следующий фрагмент: const
п = 41; var
х: array [1. .n] of real;
у: real;
напишите программы для вычисления перечисленных формул:

ВИКТОРЫ. ЗЖДЖЧИ, ПРОГРАММЫ л
а)	у "	*х2	;
Ь)	у " max л;;
с)	у- хх-хг+х3+ хи;
d)	у - хл, +х2хиЧ + .„ + xnXi;
с) у “ Х| + Xj + х5 +,.. + хд ;
О л-„(хя + х|_|)(хя +хлЧ + хи_2),..(хп + ... + Х0.
2.	С помощью следующего фрагмента программы по заданному массиву С полу чите массив В, используя правило: элементу B[i ] присвоить true, если С[1] -цифра, и false — в противном случае.
const
m • 50:
var
С: array СО..m] of char:
В: array [O..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.	По заданным вещественным числам °о, ,..., д20, t вычислите значение мне гочлена аг0*20 +	+... + я,х + а0 и его производной в точке t.
9.	Напечатайте все буквы русского алфавита.
тж
пшм а. Регулярные типы данных
10.	Пусть вводится последовательность символов, длина которой нс больше наперед заданного числап_тах. Замените каждую из рядом стоящих групп точек одной точкой. Решите эту задачу в двух вариантах:
а) полученная последовательность просто выводится на печать, а массив, в котором хранится исходная последовательность, не изменяется;
♦Ь) преобразованная последовательность должна заместить исходную в массиве.
11.	Известно, что длина последовательности символов не превышает наперед заданного числа п_тах. Подсчитайте максимальное количество идущих подряд пробелов.
	12. Пусть дано натуральное число п и вещественные числа аь ...»	В последова-
тельности <зъап все отрицательные члены увеличьте на 0,5, а все неотрицательные, меньшие среднего арифметического, замените на 0,1.
	13. Пусть даны натуральное число я, целые числа	Получите сумму по-
ложительных, число отрицательных и число нулевых членов последовательности Ль..., ап,
•	14. Пусть вводится последовательность символов, длина которой не превышает 80. Напечатайте те русские буквы (в алфавитном порядке), которые встречаются в заданной последовательности.
	15. Пусть дан текст из 80 литер. Напечатайте сначала все цифры, входящие в него, азатем все остальные литеры, сохраняя при этом взаимное расположение литер в каждой из этих двух групп.
	16. Пусть дан текст, содержащий от 1 до 70 букв. Напечатайте буквы текста в обратном порядке.
♦	17. Пусть дан непустой текст из прописных русских букв, за которым следует точка. Определите, упорядочены ли эти буквы по алфавиту.
♦	18. Пусть дан текст, за которым следует восклицательный знак. Замените все прописные русские буквы, встречающиеся в тексте, строчными.
*	19. Пусть дан текст, состоящий из слов. Под словом понимается последовательность литер, не содержащая пробелов и знаков препинания. Напечатайте все слова, состоящие из нсповторяющихся символов.
20. Пусть вводится последовательность символов. Напечатайте те строчные латинские буквы, которые не вошли во введенную последовательность.
♦	21. Пусть дан непустой текст из цифр, за которым следует точка. Напечатайте цифру, наиболее часто встречающуюся в этом тексте (если таких цифр несколько, напечатайте любую из них).
♦	22. Пусть даны целые числа ..., аюо. Получите новую последовательность из 100 целых чисел, заменяя а, нулями, если значение |<7,| не равно максимальному из «1,..., а юс, и заменяя а, единицей — в противном случае (: = 1,..., 100).
►	23. Пусть даны целые числа ah..., л25, bIt...» b2$. Преобразуйте последовательность />ь.... b& по правилу, согласно которому если а:< 0, то bi увеличивается в 10 раз, иначе bi заменяется нулем (i ~ 1,..., 25).
Векторы. Задачи, программ
♦24. Пусть даны вещественные числа йь Требуется умножить вес последовательности Дь «25 на квадрат ее наименьшего члена, есл1 и на квадрат ее наибольшего члена, если at< 0.
£5. С помощью следующего фрагмента программы вычислите сумму sг ментов массива х, индексы которых совпадают со значениями элемент сива a (d; щ при
var
х: array [1..100] of real:
a: array [1..30] of 1..100: S: real:
♦26. Пусть даны целые числа ait«да. Получите новую последовательно» бросив из исходной максимальный и минимальный члены.
♦27. Пусть даны целые числа .... а», каждое из которых отлично от нул в последовательности отрицательные и положительные члены чере/ то ответом должна служить сама исходная последовательность. Инач лучите все отрицательные члены последовательности, сохранив пор? следования.
28. Пусть задан текст размером не более одной строки. Напечатайте, скол в тексте встречается каждая буква латинского алфавита.
♦	29. Пусть дана последовательность из 100 различных целых чисел. Н среднее арифметическое чисел этой последовательности, располол между максимальным и минимальным числами (в сумму включить и о> числа).
♦	30. Пусть даны координаты п точек на плоскости:	yi,..., хп, уп (п = 20). Н
номера двух точек, расстояние между которыми наибольшее (считай такая пара точек единственная).
♦	31. С помощью следующего фрагмента программы напечатайте литеры сива s в виде таблицы:
* *-5я-25л-1
const
п = 20: var
s: array [1..n] of char;
•32. Используя следующий фрагмент программы, преобразуйте массив х г занному ниже правилу (х* — значение Л го элемента массива после пр зования):
const
г = 100: var
х: array [1..n] of real;
и) X - шах л, при 1 £ i S k;
b)	элементы массива расположите в обратном порядке;
с)	х', - х„ х'„ = х„ = (х4_, +х( +ХМ)/3 при k - 2, 3,п-1;
d)	элементы массива циклически сдвиньте на одну позицию влево: х' = *;, *1 е*ы при А - 1,2,..., п-1;
е)	элементы массива циклически сдвиньте на две позиции влево.
•33. Пусть в массиве содержатся результаты измерений температуры воздуха, которые проводились ежедневно в течение декабря месяца. Определите:
а)	среднемесячную температуру декабря;
Ь)	сколько раз температура была выше 0°С;
с)	день, когда температура была наибольшей;
d)	день, когда первый раз температура поднялась выше нуля, и увеличьте эту температуру на 1°С;
. е) любой из самых холодных дней декабря;
f)	сколько дней в декабре температура была выше средней;
g)	день, когда температура была ближе всего к средней температуре в декабре;
Ь) минимальную температуру второй декады декабря;
i)	минимальную температуру тех дней декабря, которые следуют после последнего из самых теплых дней в этом месяце;
j)	температуры любого из самых холодных и самых теплых дней и поменяйте их местами;
к)	среднюю температуру тех дней, которые предшествуют первому из самых холодных дней в декабре;
1)	любые два самых холодных дня;
ш) сколько раз в декабре температура меняла знак;
п) первую из минимальных температур и вытесните ее на последнее место, сдвинув все остальные к началу массива,
И, Используя следующий фрагмент программы, преобразуйте массив х по указанному ниже правилу, воспользовавшись массивом у как вспомогательным:
var
х, у: array [1..70] of real;
k: 1..69;
а)	все отрицательные элементы массива х перенесите в его начало, а все остальные — в конец, сохраняя исходное взаимное расположение как среди отрицательных, так и среди остальных элементов;
Ь)	элементы массива х циклически сдвиньте на к позиций влево.
♦35. Пусть элементы из массива х упорядочены по неубыванию, а элементы массива у — по невозрастанию. Используя следующий фрагмент программы, объедините элементы этих двух массивов в один массив z так, чтобы они оказались упорядоченными по неубыванию:
Векторы. Задвчи, программы
const
к - 50;
m - 20:
п - к + !Л;
var
х: array [1..к] of real:
у: array Cl.,mJ of real:
z: array [1..nJ of real:
•36. Пусть даны вещественные числа Xi, ...,Хюь Уь ..., г/юь Получите последовательности Jtp...»x'0I, у,....,	, преобразовав для получения х', у, члены xt, у(-
по правилу: если они оба отрицательны, то каждый из них увеличивается на 1,25; если отрицательно только одно число, то отрицательное число заменяется его квадратом; если оба числа неотрицательны, то каждое из них заменяется средним арифметическим исходных значений.
37. Пусть даны вещественные числа си, .... азо- Получите:
а)	тах(а1+йзо> аг+даз, —, ais+tfie);
b)	min(aiai6, йзап,015^30)-
38. Пусть даны вещественные числа ah ..., «20- Преобразуйте эту последовательность по правилу: большее из и а10+( (i - 1,.... 10) примите в качестве нового значения ait меньшее — в качестве нового значения аюя.
•39. Пусть даны целые числа аьЕсли в данной последовательности ни одно четное число не расположено после нечетного, то получите все отрицательные члены последовательности, иначе — все положительные. Порядок следования чисел в обоих случаях замените обратным,
40. Пусть дан фрагмент программы:
var
k: 0..9999:
d: array [1..4] of 'О’..'9':
♦а) запишите в массив d цифры числа к;
 Ь) получите целое к, составленное из цифр массива d.
41.	Напечатайте заданный текст из 100 литер, удалив из него повторные вхождения каждой литеры,
42.	Определите, сколько различных литер входит в заданный текст, содержащий не более 100 литер и оканчивающийся точкой (в сам текст точка не входит).
43.	В массиве из 20 целых чисел найдите наибольший элемент среди отрицательных (считайте, что такой элемент один) и поменяйте его местами с первым элементом.
44.	Пусть даны натуральные числа п, aif..., ая. Определите количество членов а* пЬследовательности <h,..., а^.
а)	являющихся нечетными числами;
Ь)	кратных 3 и не кратных 5;
с)	являющихся квадратами четных чисел;
Jx	^4-i	^4+1
а) удовлетворяющих условию: ак <----------;
е) удовлетпоряющих условию 2* < < А?1;
О имеющих четные порядковые номера и являющихся нечетными числами, 45. С помощью следующего фрагмента программы присвойте каждому элементу массива КД значение, равное количеству дней в соответствующем месяце високосного года.
type
месяц - ( янв. фев. мар. апр. май, июн.
июл. авг, сен. окт. ноя, дек ): var
КД: array [месяц] of 28..31;
46. Пусть даны вещественные числа ait &lf..., b„. Вычислите произведение Aal+b„)(ai+bs_l)...(a„+bi).
47. Используя следующий фрагмент, напишите программы для решения перечисленных ниже задач:
const
П = 40:
var
х: array [1..п] of integer;
у. k: integer; tr boolean-.
; 1 ♦ а) переменной t присвоить значение t rue, если элементы массива х упорядочены по возрастанию, иначе значение false;
♦b) переменной t присвоить значение true, если в массиве х нет нулевых элементов и при этом положительные элементы чередуются с отрицательными, иначе значение false;
с) переменной к присвоить либо номер первого вхождения у в массив х, либо число п+1, если у не входит в х;
♦d) вычислить у - jq+х^2 + xtx2*3 + ... + х1х2...х„, где т — либо номер первого отрицательного элемента массива х, либо число п, если в массиве х нет отрицательных элементов.
. “48. Пусть дан текст из 80 литер. Определите, симметричен ли он, то есть читает-' ся ли он одинаково слева направо и справа налево,
,и i .	-----—--------——----—______________________________________
ЛМИМЕЧАНИЕ В последующих шести задачах рекомендуется не использовать вспомогательный массив.
•	49. Пусть дан массив из элементов. Каждый отрицательный элемент замените полусуммой тех двух элементов, которые стоят рядом с ним справа и слева.
	50. Пусть дана последовательность из N элементов. Увеличьте ее, вставив после минимального элемента максимальный.
	51. Пусть дана последовательность из N элементов. Уменьшите ее, удалив первый из отрицательных и минимальный из положительных (считайте, что такой элемент один) и сдвинув все остальные к началу.
♦	52. Пусть дана последовательность из N элементов. Уменьшите ее, удалив все минимальные и максимальные элементы и сдвинув все остальные к началу последовательности.
Векторы. Задами, программы
53.	Пусть дана последовательность из W элементов. Увеличьте ее, вставив пос каждого элемента такой же,
54.	Замените каждый элемент массива средним арифметическим всех предше< вующих ему элементов.
55.	С помощью следующего фрагмента программы по массиву t, где указана те пература каждого дня некоторого невисокосного года, определите m — наз) ние месяца с наибольшей среднемесячной температурой:
type
месяц - (янв, фев. мар, апр, май. июн. июл, авг.
сен. окт. ноя. дек):	..
var
t : array [1..365] of real:
m : месяц;
56.	Пусть даны вещественные числа .... а15. Получите:
57.	Пусть даны вещественные числа a1Wj й1ЭЯ, д1998 — количество осадков (в mi диметрах), выпавших в Воронеже в течение последних 50 лет. Вычисл! среднее количество осадков и отклонение от среднего для каждого года.
58.	Пусть даны вещественные числа а1(aw. Получите числа bit.... Z>2q, где Ь среднее арифметическое всех членов последовательности а1?.... кроме (i - 1,2,..., 20).
59.	Пусть даны натуральные числа вещественные числа .гао. Вьг слите:
»1Х1ч... + д30х30
«1+... + л30
60.	Используя следующий фрагмент программы, упорядочьте массив х .по ; убыванию (то есть переставьте его элементы так, чтобы для всех k выпол) лось условие хк < %А+1) в соответствии с перечисленными ниже алгоритма сортировки (упорядочения):
const п = 100;
var	...,. ..
х : array [1..n] of real;
♦а) сортировка выбором — отыскивается максимальный элемент и nepei сится в конец массива; затем этот метод применяется ко всем элемент кроме последнего (он уже находится на своем месте) и т. д;;
Ь) сортировка обменом (пузырьковая сортировка) — послсдовательно.ср ниваются пары соседних элементов xk и хА+1 (£ я 1,2,3,	и ес
xk > то они переставляются; тем самым наибольший элемент о зывается на своем месте в конце массива; затем этот метод применяв ко всем элементам, кроме последнего, и т. д.;
7в Ошм В. Регулярные типы данным
♦ с) сортировка вставками — пусть первые k элементов массив» уже упорядочены по неубыванию; берется (k + 1)-й элемент и размещается среди первых k элементов так, чтобы упорядоченными оказались уже k + 1 первых элементов; этот метод применяется при k от 1 до п - 1.
♦61. Пусть элементы массива х упорядочены по возрастанию, С помощью представленного ниже фрагмента программы присвойте переменной к номер элемента массива х, равного числу у, или 0, если такого элемента нет. При этом использовать следующий метод двоичного (бинарного) поиска: сравнить у со средним элементом массива (или элементом около середины); если эти ..числа равны, поиск завершается, если же у меньше среднего элемента, то у надо . ' искать в левой половине массива, а иначе в правой. Далее к выбранной половине применяется этот же алгоритм.
const
п = 500;
var
х : array [l..n] of Integer:
p : integer;
k : Q.,n:
62. Пусть даны две последовательности по 30 целых чисел в каждой. Найдите наименьшее среди тех чисел первой последовательности, которые не входят во вторую последовательность, считая, что хотя бы одно такое число есть.
*63. Пусть дана последовательность из 20 целых чисел. Определите количество инверсий в этой последовательности (то есть таких пар элементов, в которых большее число находится слева от меньшего:	при i <)).
64.	Пусть дан текст из строчных латинских букв, за которым следует точка. Напечатайте в алфавитном порядке все буквы, которые входят в этот текст по од-? ному разу.
65.	Пусть даны натуральное число п и символы st,...,	среди которых есть двое-
точие. Получите все символы:
а)	расположенные до первого двоеточия включительно;
Ь)	расположенные после первого двоеточия;
с)	расположенные между первым и вторым двоеточием; если второго двоеточия нет, то получите все символы, расположенные после единственного имеющегося двоеточия.
56.	Пусть даны натуральное число п и символы ...» s„. Исключите из последовательности^, группы символов, расположенные между открывающей и закрывающей скобками. Сами скобки тоже должны быть исключены. Предполагается, что внутри каждой пары скобок нет других скобок.
♦67. Пусть даны вещественные числа аи яи. Если в результате замены отрицательных членов последовательности ..., ап их квадратами члены будут образовывать неубывающую последовательность, то получите сумму членов исходной последовательности; в противном случае получите их произведение.
*68. Пусть данывещественные числа rt>..., г17, среди которых заведомо есть как отрицательные, так и неотрицательные. Получитездt +... + а;у5, гдех„..., хр — отри-
j I
etL..
Векторы. Задачи, программы 7
цательные члены последовательности rtf..., г17, взятые в порядке их следовани Уи , Уч — неотрицательные члены, взятые в обратном порядке, $ •“ min(p, q
69. Пусть даны вещественное число а и массив вещественных чисел Q[1...n Выберите два числа b и с из массива фтаким образом, чтобы числа а, Ь, с мо] ли быть длинами сторон:
♦	а) треугольника (если таких чисел в массиве Q несколько, выберите первь из них);
♦	Ь) треугольника (если таких чисел в массиве Q несколько, выберите послед ние из них); вычислите площадь этого треугольника;
♦	с) треугольника; подсчитайте, сколько пар таких чисел а и Ь в массиве Q *d) остроугольного треугольника; вычислите его площадь;
*	е) равнобедренного тупоугольного треугольника; вычислите его площадь; ♦ f) треугольника, площадь которого максимальна среди всех площадей;
♦	g) прямоугольного треугольника, площадь которого максимальна среди все площадей;
♦	h) треугольника; определите вид этого треугольника: равносторонний, рги нобедренный, разносторонний;
•	i) треугольника; определите вид этого треугольника: прямоугольный, тущ угольный, остроугольный;
*	j) треугольника, площадь которого максимальна среди всех площадей; onpi делите вид этого треугольника: равносторонний, равнобедренный, разн< сторонний, прямоугольный, тупоугольный, остроугольный.
♦70. Используя следующий фрагмент программы, выберите из массива А подма< сив В с заданной суммой элементов s или сообщите, что такого подмассш не существует:
const
го - 50:
var
А : array	of Integer;
В : array	of integer;
S : integer:
Задания для самостоятельной работы
1.	Пусть даны вещественные числа х2,	.r„,	у2,..., уп, г2,г„. Выяснит
есть ли на плоскости точка, принадлежащая всем кругам с„ с2,ся, где с, им» центр с координатами xit у, и радиус г(.
2.	Пусть даны вещественные числа alt а?,а2п. Эти точки определяют п интерв. лов числовой оси (alf а2), (а3, ал),..., (<з2л1, агп). Является ли интервалом объед: нение этих интервалов? Если да, то указать концы объединенного интервал
3.	Пусть даны вещественные числа аъа^. Эти точки определяют п инте; валов числовой оси (л„ д2), (аз, л4),..., (о2п ь Имеются ли точки числовс оси, принадлежащие по крайней мере трем каким-нибудь из данных инте] валов. Если да, то указать какую-нибудь из этих точек.
4.	Пусть даны целые числа <зо а» .... ан. Пусть М — наибольшее, m — наименьшее из них. Получите в порядке возрастания все целые числа из интервала (т, М), которые не входят в последовательность ait а2,.... а„.
5.	Пусть даны координаты центров п окружностей и их радиусы. Определите число пересекающихся окружностей.
6.	Присвойте переменной t значение true, если в некотором массиве нет нулевых элементов и при этом положительные элементы чередуются с отрицательными, в противном случае присвойте значение false.
7,	Пусть имеются десять гирь весом alt а2,.... я10. Обозначим через с* число способов, которыми можно составить вес k, то есть ck — это число решений уравнения ЯрЦЧ- я2х2+...+ я10х10 = kt где х; может принимать значения 0 или 1 (i - 1,..., 10). Получите ct, у,,cl0.
8.	Прямая на плоскости может быть задана уравнением ах+ by “ с, где а, b одновременно не равны нулю, а, Ь, с — целые. Пусть даны коэффициенты нескольких прямых яь by a2t b2, с2, ..., а„, Ьп, сп. Определите, имеются ли среди этих прямых совпадающие или параллельные,
9.	Прямая на плоскости может быть задана уравнением or+ by = с, где я, b одновременно не равны нулю, а, Ь, с — целые. Пусть даны коэффициенты нескольких прямых я„ Ьу сп я2, Ь2, с2>...»я„, Ьп, сп. Определите, имеются ли среди этих прямых три, пересекающиеся в одной точке.
10.	Пусть даны натуральное число п, целые числа а, хи х2,..., хи. Если в последовательности х2, ...» х„ есть хотя бы один член, равный а, то получите сумму всех членов, следующих за первым таким членом, иначе найдите минимальный среди нечетных чисел последовательности .у, х2>..., хя.
11.	Пусть даны целые числа ях, я2,	я„, среди которых могут быть повторяю-
щиеся. Составьте новый массив из чисел, которые входят в последовательность по одному разу.
12.	Пусть даны целые числа alf а2, .... ап, среди которых могу г быть повторяющиеся. Составьте новый массив из чисел, взятых по одному из каждой группы равных членов данной последовательности.
13.	Пусть даны натуральные числа А, п, вещественные ч исла я,, а2,..я^. Получите последовательность min(alf я2, -> аД пйп(я^р я^2,.... а2к),..., тт(я^_1)+ияь).
14.	Пусть даны натуральные числа k, п, вещественные числа alt a2tПолучите последовательность тах(йр а2, яД max(aw, ak¥2,.... я2Д тах(я^_1)+1, ..„ я^).
15.	Пусть даны натуральные числа k, и, вещественные числа а{, я2,..., а^. Получите min(«j+ я2+...+ ak, яИ1+ я^2+...+ a2f[t.... лм,_1)<.|+...+
16.	Пусть даны натуральные числа k, я, вещественные числа ал, а2,.... а^. Получите max(aj+ я2+.. + аь яА+1+ яИ2+.,.+ а2к,.... яА{„_1)+1+...+ akn).
17.	Пусть даны натуральные числа k, п, вещественные числа ал, а2,	Получите
min(max(a1, a2f.... ak), шах(яН1+ et+z+...+ я^), .„, max(c^_l)+] +...+ я^)).
Матрицы
18.	Пусть даны натуральные числа kt nt вещественные числа д„ а-2, tikri. Пол; max(min(fl1f аъ ...»<яД min(aH1+ а*+2+-+ аг*)> min(eJK„_ini+...+ aAJ).
19.	Пусть дана последовательность чисел. Все ее элементы, не равные нул! ренесите, сохраняя их порядок, в начало данной последовательности, а вые — в конец.
20.	Пусть числовая прямая разбита на произвольные отрезки точками аиаг, Выясните, какому из отрезков принадлежит данная точка х.
21.	В массиве из п элементов подсчитайте количество четверок ait ai+i, ai+ идущих подряд членов, из которых:
а)	все члены равны;
Ь)	все члены различны.
22.	Произвольный выпуклый многоугольник задан координатами своих ве на плоскости. Найдите самую длинную диагональ данного многоугОль
23.	Вычислите площадь произвольного выпуклого многоугольника, зада] координатами своих вершин на плоскости, разбив многоугольник н< угольники.
Матрицы
Задачи, упражнения
	1. Пусть даны целые числа «i » «2, . Получите целочисленную матрицу 1 мером 3x3, для которой by ~ ai -Зду.
	2. Пусть даны вещественные числа ait..., Ьи ...» 620. Получите веществе матрицу С размером 10 х 20, для которой ctj - а; /(14- |/?у).
	3. Получите целочисленную матрицу А размером 8 х 14, для которой ау =
	4. Получите вещественную матрицу А размером 23 х 17, для которой:
а)	Ч, = т— ' ‘+J
sin(i + y), i<j,
b)	at = <
i + / arcsin------ i > j.
2r+3J	-
♦5. Пусть дана вещественная матрица Л. Получите матрицу А'^В*С, где

Q«----1 лмв в. rtr уличные типы данных
6. Получите вещественную матрицу А размером 7x7, первая строка которой задается формулой ач = 2J+3 (/ -1,	7), вторая строка — формулой
a2j = J
3
2 + 1/j
U - 1,7),
а каждая следующая строка есть сумма двух предыдущих.
7. Пусть дано натуральное число п и вещественная матрица размером п х 9. Найдите среднее арифметическое элементов:
а)	для каждого из столбцов;
Ь)	для каждого из столбцов, имеющих четные номера.
8. Пусть дано натуральное число п. Выясните, сколько положительных элементов содержит матрица Л размером п х п при выполнении перечисленных ниже условий:
а)	ац - sin(i + ;72);
b)	дгу =cos(f2+« у);

Яд = sin

п
9. Пусть дана вещественная матрица размером п х в которой не все элементы равны нулю. Получите новую матрицу путем деления всех элементов данной матрицы на ее наибольший по модулю элемент.
 10. Пусть даны натуральное число т, целые числа ait.am и целочисленная квадратная матрица порядка т. Строку с номером i назовем отмеченной, если а,- > 0, и неотмеченной — в противном случае:
а)	все элементы, расположенные в отмеченных строках матрицы, преобразуйте по правилу: отрицательные элементы заменить на —1, положительные — на 1, а нулевые оставить без изменения;
Ь)	подсчитайте число отрицательных элементов матрицы, расположенных в отмеченных строках.
11. Пусть дана вещественная квадратная матрица порядка 12. Замените нулями все ее элементы, расположенные на главной диагонали и выше ее.
♦12. Пусть даны вещественные числа х8. Получите квадратную матрицу порядка 8, образованную по правилу:
Мирит
Ч 1 ... 1 ;
Xj х2 ... Xg
/ Y7	Y7
а2 л8 J
13.	Пусть дана вещественная матрица размером т х п. Определите числа й равные соответственно:
а)	суммам элементов строк;
Ь)	произведениям элементов строк;
с)	наименьшим значениям элементов строк;
d)	значениям средних арифметических элементов строк;
е)	разностям наибольших и наименьших значений элементов строк.
14.	Все элементы с наибольшим значением в данной целочисленной квад матрице порядка 10 замените нулями, если эти элементы не прина первой или последней строкам.
15.	Пусть дана вещественная матрица размером 6x9. Найдите среднее а] тическое наибольшего и наименьшего значений ее элементов, распо ных ниже главной диагонали.
16.	Пусть дана вещественная матрица размером 18 х п. Найдите значение н< шего по модулю элемента матрицы и укажите его местоположение в м;
17.	В данной вещественной квадратной матрице порядка п найдите сум: ментов строки, в которой расположен элемент с наименьшим зна* Предполагается, что такой элемент единственный.
18.	В данной вещественной матрице размером 6x9 поменяйте местами стр держащую элемент с наибольшим значением, со строкой, содержащей s с наименьшим значением. Предполагается, что эти элементы единсп
19.	В данной квадратной целочисленной матрице порядка 17 укажите и всех элементов с наибольшим значением, не принадлежащих главно бочной диагоналям.
20.	Пусть дана вещественная матрица размером п х /л, все элементы котор личны. В каждой строке выберите элемент с наименьшим значениеn среди этих чисел выберите наибольшее. Укажите индексы найдены мента.
21.	Пусть дана вещественная матрица размером п х т. Получите последо ность Ьи ..., bnt где bk — это:
а)	наибольшее из значений элементов £-й строки;
Ь)	сумма наибольшего и наименьшего из значений элементов Л-й ctj с) количество отрицательных элементов в &-й строке;
d) произведение квадратов тех элементов £-й строки, модули котор! надлежит отрезку [1; 1,5].
ПшЖ 8 Регулярный типы денных
•22. Пусть дана целочисленная квадратная матрица порядка 8.11айлите наименьшее из значений элементов столбца, который обладает наибольшей суммой модулей элементов. Если таких столбцов несколько, надо взять первый из них.
23. Пусть дано натуральное число п и целочисленная квадратная матрица порядка п. Получите 6lf bni где bt — это:
а)	значение первого по порядку положительного элемента t-й строки (если таких элементов нет, то принять b.^ 1);
Ъ)	сумма элементов, расположенных за первым отрицательным элементом в t-й строке (если все элементы строки неотрицательны или отрицательный элемент на последнем месте, то принять 100);
с)	сумма элементов, предшествующих последнему отрицательному элементу t-й строки (если все элементы строки неотрицательны, то принять /?,= -!).
24. Пусть дана целочисленная квадратная матрица порядка п. Найдите номера строк:
а)	все элементы которых — нули;
Ь)	элементы в каждой из которых одинаковы;
с)	все элементы которых четны;
d)	элементы каждой из которых образуют монотонную последовательность (монотонно убывающую или монотонно возрастающую);
с) элементы которых образуют симметричные последовательности.
	25. Пусть даны натуральное число и, вещественное число х, вещественная матрица размером п х 2п. Получите последовательность blf	b„ из нулей и еди-
ниц, где Ь.= 1, если элементы t-й строки матрицы не превосходят х, и 6, = О в противном случае.
♦	26. Пусть дана вещественная квадратная матрица порядка л. Постройте последовательность вещественных чисел ..., а„ по правилу: если в t-й строке матрицы элемент, принадлежащий главной диагонали, отрицателен, то элемент tZj равен сумме положительных элементов t-й строки, в противном случае й, равен произведению отрицательных элементов t-й строки.
	27. Пусть дана вещественная квадратная матрица порядка 10. В строках с отрицательным элементом на главной диагонали найдите:
а)	сумму элементов;
Ъ)	наибольший из элементов.
♦	28. Пусть дана вещественная квадратная матрица порядка п. Относительно элементов, расположенных в строках, начинающихся с отрицательного элемента, найдите суммы тех из них, которые расположены соответственно ниже, выше и на главной диагонал и.
	29. Пусть дана вещественная квадратная матрица порядка 9. Получите целочисленную квадратную матрицу того же порядка, в которой элемент равен единице, если соответствующий ему элемент исходной матрицы больше
мвтрищ
элемента, расположенного в его строке на главной диагонали, и ранен 1 в противном случае.
	30. Пусть дана вещественная квадратная матрица порядка п. По Х|Х„ +х2хя_] + „. + хяхь где ** — наибольшее значение элементов £-й данной матицы.
	31. Пусть даны натуральное число п>2 и вещественная квадратная м порядка п. Постройте последовательность ЬиЬ„ из нулей и единиц, рой bf e 1 тогда и только тогда, когда:
а)	элементы t-й строки матрицы образуют возрастающую иоследо! ность;
Ь)	элементы t-й строки матрицы образуют возрастающую или убыв* последовательность.
32. Пусть дана целочисленная квадратная матрица порядка 15. Выяснит ются ли в матрице ненулевые элементы, и если имеются, то укажите иь а) одного из нулевых элементов;
Ь) всех нулевых элементов.
	33. Пусть даны натуральные числа t,j (1 i,j 24) и вещественная матри мером 18 х 24. Поменяйте в матрице местами t-й иу-й столбцы.
•	34. Пусть даны натуральное число п и вещественная квадратная матри рядка п. Постройте последовательность bir,..t b„ из нулей и единиц, в к< “ 1 тогда и только тогда, когда в t-й строке матрицы есть хотя бы о/ рицательный элемент.
	35. Пусть даны натуральные числа п и w, вещественное число г, вещест] матрица размером пхт. Получите значение	2+...+ Ьп, где bk
вый по порядку положительный элемент в А’-й строке матрицы (й = 1 если в k-й строке нет положительных элементов, то	0,5.
♦	36. Найдите сумму квадратов тех элементов а# квадратной матрицы А : ка 10, для которых выполняются условия: 2 < i < 9, 2 < j < 9,
> gi-lj + aif-l + Q«+lj + Цу+i
* “	4
♦37. Пусть дана вещественная квадратная матрица порядка 9. Вычислите тех из ее элементов, расположенных на главной диагонали и выше ее рые превосходят по величине все элементы, расположенные ниже rj диагонали. Если на главной диагонали и выше ее нет элементов с указ: свойством, то ответом должно служить сообщение об этом.
38. Пусть дана целочисленная квадратная матрица Л (а$) размерности п. чите blf.... Ь„, где элемент равен:
а)
7=1
 b) £(-iy%;
7-1
•d) ni°J;
7=1
♦e) nia.w; -пшж.
Kji^n 'J	f
♦39. Будем называть соседями элемента с индексами ij некоторой матрицы такие элементы, соответствующие индексы которых отличаются от i,j не более чем на единицу. Для данной целочисленной матрицы размером тхт найдите матрицу В, состоящую из нулей и единиц, элемент которой равен единице, когда:
а)	все соседи а1} меньше самого элемента ajy;
b)	все соседи а- и сам элемент а., равны нулю;
с)	среди соседей ад есть не менее двух элементов, совпадающих с air
	40. Пусть дана символьная квадратная матрица порядка 10. Замените буквой а все ее элементы, расположенные выше главной диагонали.
♦	41. Пусть даны натуральное число п и символьная квадратная матрица порядка п. Получите последовательность bn из нулей и единиц, в которой - 1 тогда и только тогда, когда в z-й строке число символов звездочки ( *) не меньше числа пробелов.
♦	42. Пусть дана символьная матрица размером 13 х 18. Найдите номер: а) первой по порядку строки, содержащей наибольшее число цифр;
Ь)	первого по порядку столбца, содержащего наименьшее число пробелов на пересечении со строками, номера которых четны;
с)	последней по порядку строки, содержащей наибольшее количество букв ш и щ,
d)	последнего по порядку столбца, в котором содержится наибольшее количество различных символов.
43. Введите квадратную вещественную матрицу 4-го порядка, элементы которой заданы для ввода построчно, и распечатайте ее по столбцам.
44. Используя следующий фрагмент программы, вычислите перечисленные ниже соотношения:
const п ° 20: var
А, В, С : array [1..п. l..n] of real: x. у : array of real;
-	а) С-Л + В;
-b)
♦	с) С = Л-B;
♦	d) В ~ Br (транспонировать).
45. Используя следующий фрагмент программы, присвойте переменной чение true, если массивы С и 0 равны, и значение fal se — в противном с
var
С, 0 : array [0..9, -5..3] of integer;
t : boolean:
♦46. Пусть даны натуральное число п и (построчно) элементы квадратной ственной матрицы Л 5-го порядка. Вычислите и-ю степень этой ма: (Д1 - А, Л2 = А - А, Л3 = А2 • Л и т. д.).
47. Используя следующий фрагмент, напишите программы для решения численных ниже задач:
type
vector - array [1,.20] of integer:
mate =* array [1..20] of vector;
i	var
A : matr: x : vector;
:	В : array [1..20, 1..20] of integer;
	а) нечетные строки матрицы А замените вектором x;
I b) четные столбцы матрицы А замените вектором х;
	с) первые шесть строк массива В замените вектором х;
	d) в матрице А поменяйте местами 1-ю и 2-ю строки, 3-ю и 4-ю строки,.. и 20-ю строки (воспользуйтесь вектором х как вспомогательным маса ♦48. Пусть дана (построчно) вещественная матрица размером 7x4. Переел ее строки и столбцы, добейтесь того, чтобы наибольший элемент (один и оказался в верхнем левом углу.
♦	49. Используя следующий фрагмент программы, найдите наибольшее ра< ние (D) между точками, рассматривая элементы массива М как коорд] точек на плоскости:
type
точка - array [(х. у)] of real;
var
М : array El..40] of точка;
D : real;
50. Используя следующий фрагмент программы, найдите сумму элеме! из заштрихованной области массива А (рис. 8.1):
var
А : array [1..9. 1..9] of real;
s real;
1	9	1	9	1	9
 a)	♦ b)	c)
Рис. 8.1. Заштрихованные области
51. Используя следующий фрагмент программы, вычисли гс: var
U : array 11.. 10, 1. . 10] of real;
S : real:
io
5 = У max D. 7
•52. Используя следующий фрагмент программы, заполните массив А так, как показано ниже:
var А : array fl..10. 1..10] of integer;
fO 0 O...OA
0 1 0...0
о о 2...0 ;
'I 2...10
1112. ..20
2122...30
0 О 0...9
'i 2 з...кР
0 1 2... 9
0 0 1... 8 ;
9192...100;
d)	'0 ...0 ОИР 0 ...0 9 0 0 ...8 0 0
	1 ...0 0 0 к	7

53. Используя следующий фрагмент программы, заполните массив А по правилу
var
А : array Г1..6, 1..9] of real.
X : array [1..9] of real;
54. Используя следующий фрагмент программы, получите массив В из массива А удалением и-й строки и Л-го столбца:
var
А : array [1..20. 1..20] of boolean;
В : array [1..19, 1..I9] of boolean;
П. k : 1..20;
55. Используя следующий фрагмент программы, из массива А получите массив В, присвоив его А-му элементу значение true, если выполнено указанное ниже условие, в противном случае присвойте значение false:
var
А : array [1..20, I..20] of Integer;
В ; array [1..20] of boolean;
а)	все элементы А-го столбца массива А нулевые;
Ь)	элементы k-й строки массива А упорядочены по убыванию;
с)	k-я строка массива А симметрична.
Матрицы
'56. Используя следующий фрагмент программы, определите количество бых» элементов к массива С, считая элемент «особым», если вы пол ш перечисленные ниже условия:
const
п * 10:
гл = 12: var
к : integer:
С : array [l..n. l..m] of integer;
а)	элемент больше суммы остальных элементов своего столбца;
Ь)	в строке слева от элемента находятся элементы, меньшие его, а спр большие,
>57. Используя следующий фрагмент программы, определите количество личающихся элементов массива С (то есть повторяющиеся элементы счп один раз):
var
k ; 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 напечатайте индексы всех ei левых точек.
62.	Пусть дана вещественная матрица размером 7x7, все элементы которое личиы. Найдите скалярное произведение строки с наибольшим элеме матрицы и столбца с наименьшим элементом.
63.	Определите, является ли заданная целая квадратная матрица 10-го пор орто нормированной, то есть такой, в которой скалярное произведение дой пары различных строк равно 0, а скалярное произведение каждой  ки на себя равно 1.
90	ГЬава В. Регулярные типы денным
•64, Определите, является ли заданная целая квадратная матрица9-го порядка магическим квадратом, то есть такой, в которой суммы элементов во всех строках и столбцах одинаковы.
65. Пусть дана непустая последовательность слов из строчных латинских букв; слова разделяются запятой, за последним словом стоит точка. Среди всех пар а{ и bit где — первая, а bj — последняя буквы i-ro слова последовательности, определите наиболее часто встречающуюся пару.
•66. По заданным коэффициентам a12J alnf a22J a23, a2nf am, (n ~ 20, 0) и правым частям bit b2s.... b„ найдите решение «треугольной» системы линейных уравнений:
«I1А] + «12*2 +	+    +	=* ,
«22*2 + а23*з +... + а2пх„ = Ь2,
«зз*з +    + «з»*з = ^,

•67. Пусть дана последовательность из 60 литер. Напечатайте эту последовательность дважды (в двух экземплярах).
«68. Используя следующий фрагмент программы, введите перечисленные ниже слова:
type
слово •» array [1..5] of char;
список = array Cl..60] of слово:
var
С г список:
а)	все слова из списка С, отличные от слова hello*,
b)	то слово из списка С, которое лексикографически (по алфавиту) предшествует всем другим словам этого списка (считайте, что все слова различны);
с)	текст, составленный из последних литер всех слов списка С;
d)	все слова из списка С, содержащие ровно две буквы d.
’69. Пусть во входном файле input задано от 1 до 6 букв, за которыми следует точка. Используя следующий фрагмент программы, введите эти буквы и запишите их в начало строки s, дополнив конец этой строки пробелами:
var s : array [1..6] of char:
70. Пусть во входном файле задана последовательность строчных латинских букв, за которой следует пробел. Если это правильная запись значения типа color, то, используя следующий фрагмент программы, присвойте эту запись переменной х, иначе — сообщите об ошибке:
type
color ’ (red. blue, green, yellow, black, white):
var
x ; color:
Матрицы ж
•	71. Используя следующий фрагмент программы, определите, сколько раз ( в строку s входят литеры, перечисленные в константе v:
const
v - 'aeiou';
type
строка - array [1..200] of char; var
S : строка;
k : 0..200;
•	72. Пусть дан текст из 60 литер. Напечатайте только строчные русские букв] входящие в этот текст.
•	73. Пусть дан текст из строчных русских букв, за которым следует точка. Нап читайте этот текст заглавными русскими буквами.
74. Известно, что в начале строки s находится не более 40 латинских букв, за кот рыми следуют пробелы. Напечатайте эту строку, предварительно преобраз' вав ее так, как показано ниже, и используя следующий фрагмент программ] type
строка - array [1..80] of char; var
S : строка;
♦	а) все последовательности abc замените последовательностями def;
♦	b) удалите первое вхождение w, если такое есть (образовавшуюся «дыр} заполните последующими буквами, а в конец добавьте пробел);
♦	с) удалите все вхождения tA;
	d) замените последовательностью ks первое вхождение х, если такое есть;
е) после каждой буквы q добавьте букву и;
♦ f) замените все последовательности ph буквой f} а все последовательное! ed — последовательностями ing,
75.	Пусть дана последовательность, содержащая от 1 до 30 слов, в каждом из к( торых от 1 до 5 строчных латинских букв; между соседними словами — заш тая, за последним словом — точка. Введите:
	а) эту же последовательность слов, но в обратном порядке;
♦	Ь) те слова, перед которыми в последовательности находятся только мею шие (по алфавиту) слова, а за ними — только большие;
♦	с) эту же последовательность слов, но удалив из нее повторные вхождени слов;
♦	d) все слова, которые встречаются в последовательности по одному разу;
♦	е) все различающиеся слова, указав для каждого из них число его вхожде ний в последовательность;
♦	f) все слова в алфавитном порядке.
•76. Пусть дана последовательность, содержащая от 2 до 50 слов, в каждом из кс торых от 1 до 8 строчных латинских букв; между соседними словами — в менее одного пробела, за последним словом — точка. Напечатайте те слов
02 Пшм в. Регулярные г ины данным
Iюслслова гельности, которые отличны от последнего слов» и удовлетворяют следующему свойству:
а)	слово симметрично;
Ь)	первая буква слова входит в него еще раз;
с)	буквы слова упорядочены по алфавиту;
d)	длина слова максимальна;
с)	в слове нет повторяющихся букв;
f)	каждая буква входит в слово не менее двух раз;
g)	в слове гласные буквы (й, е, i, о, и) чередуются с согласными.
77.	Пусть дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 строчных латинских букв; между соседними словами — не менее одного пробела, за последним словом — точка. Напечатайте все слова, отличные от первого слова, предварительно преобразовав каждое из них по следующему правилу:
	а) перенести первую букву в конец слова;
	Ь) перенести последнюю букву в начало слова;
	с) удалить из слова первую букву;
	d) удалить из слова последнюю букву;
♦	е) удалить из слова все последующие вхождения первой буквы;
♦	f) удалить из слова все предыдущие вхождения последней буквы;
♦	g) оставить в слове только первые вхождения каждой буквы;
♦	11) если слово нечетной длины, то удалить его среднюю букву.
78.	Известно, что астрологи делят год на 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Л 0	Весы
23.10-22.11	Скорпион
23.11-2112	Стрелец
22Л2-19.01	Козерог
нти 1ргц»
79.	Пусть дана последовательность, содержащая от 1 до 90 слон» в каждом торых от 1 до 10 строчных русских букв; между соседними словами — нее одного пробела, за последним словом — точка. Напечатайте эти сл< алфавиту.
80.	Известно, что в следующем фрагменте программы массив матрица сод< оценки студентов группы, фамилии которых перечислены в типе фант type
фамилия ~ (Иванова. Просветкин. Лемин, Михайлов, Маслова. Юрьева. Беляев, Малашенко. Нагайцев. Сеныкин);
Предмет - (матанализ, алгебра, информатика.
история, матлогика, механика.
педагогика, дифуравнения. статистика);
var
матрица : array [фамилия, предмет] of integer;
	а) найдите средний балл всех студентов группы;
	Ь) напечатайте фамилию первого студента списка, средний балл кот максимален;
•	с) поменяйте местами оценки любого студента, средний балл которо нимален, с оценками первого из студентов списка, который не име удовлетворительных отметок;
	d) измените на <3>> все неудовлетворительные оценки (если такие име у студента с минимальным средним баллом;
♦	е) напечатайте фамилии любых двух студентов, средний балл котор] ляется наибольшим;
•	f) найдите количество студентов группы, которые учатся без троек (1 на «4» и «5»);
	g) выясните, сколько студентов группы имеют средний балл, наимег клоняющийся по абсолютному значению от среднего балла всей гр h) напечатайте названия предметов, по которым студенты учатся без
	i) определите, по какому предмету самая высокая успеваемость;
	j) переставьте оценки всех студентов группы по механике и педагоги
	к) составьте список отличников группы;
	1) составьте список хорошистов группы;
♦	ш) составьте упорядоченный по неубыванию средних баллов список с тов группы.
Глава 9
Процедуры и функции
Теоретические вопросы
1.	Дайте определение подпрограммы.
2.	Что лежит в основе метода программирования сверху вниз?
3.	Существуют ли подпрограммы без параметров?
4.	Дайте определение параметра.
5.	Как называются параметры, определяемые в заголовке подпрограммы?
6.	Какие параметры называются фактическими?
7.	Чем синтаксически отличается описание процедуры от описания функции?
8.	Какое количество значений возвращает функция?
9.	Как определить тип значения, возвращаемого функцией?
10.	Существуют ли ограничения на тип возвращаемого функцией значения?
И. Каким образом осуществляется обмен данными между основной программой и подпрограммой без параметров?
12.	Сколько элементов может содержать список формальных параметров?
13.	Сколько элементов должен содержать список фактических параметров?
14.	Могут ли фактические параметры быть выражениями?
15.	Могут ли фактические параметры быть именами переменных?
16.	Могут ли фактические параметры быть именами других процедур или функций?
17.	Каково соответствие между фактическими и формальными параметрами?
18.	Могут ли имена формальных параметров совпадать с именами фактических?
19.	Могут ли имена формальных параметров не совпадать с именами фактических?
20.	Какие переменные называются локальными?
21.	Чем глобальные переменные отличаются от локальных?
22.	Что такое время жизни переменной?
зждвчи, программ
23.	Что такое область видимости переменной?
24.	Может ли имя локальной переменной совпадать с именем глобальнс
25.	Можно ли утверждать, что одноименные глобальные и локальные in ные — это разные переменные?
26.	Какие два способа передачи параметров вы знаете? В чем их отличш
27.	При каком способе передачи параметров изменение соответствующе мального параметра внутри процедуры изменяет и фактический пар;
28.	Может ли в качестве параметра при вызове подпрограммы, имеюпц мальный параметр-значение, выступать: переменная, выражение, кон*
29.	Может ли в качестве параметра при вызове подпрограммы, имеюще мальный параметр-переменную, выступать: переменная, выражеш станта?
30.	Может ли в основной программе функция вызываться внутри вырая
31.	Наличие какого оператора необходимо для возвращения значения и: ции в вызывающую программу?
32.	Что называется побочным эффектом при вызове подпрограммы?
33.	Почему следующее описание процедуры недопустимо?
procedure S ( А ; array [1..10] of real );
1 34. Может ли элемент массива быть формальным параметром?
35. Почему недопустимо следующее описание функции?
function F( s : char ) : stringQO];
36. Может ли быть функция или процедура параметром подпрограммы?
Задачи, программы
1. Вычислите выражение г(х) = (sign(x) + sign(y)) • sign(jc + у). При pernei дачи определите и используйте функцию sign:
-1,х<0, signer) = ’ 0,х = 0,
1,х>0.
2. Даны вещественные числам, t. Получите:
H(v) + (тах(Нэ - м * /), Н4(я - г, л + 0)+Н( 1,1)),
где	- (а-Ь)3.
1 + b 1 + а
3. Напишите функцию, вычисляющую sh(x), и для заданного значение менной х вычислите следующее выражение:
sh(x) + tg(x+1) - tg2 (2 +sh(x -1)),
г ЛВШ» V. 1 »роц»дурн и функции
1 Нуги, даны натуральные числа k, I, т, вещественные хи.г,......Ж*г
^.Za, Получите:
minty, t ,.„у1) + max(z|t ...,2ж), если max(xtl .... xk) > 2,
I = ‘	2
1 + (max(xp ...,x4))f если max(x1T...»xk) < 2.
5.	Пусть даны вещественные числа щ, щ, v2, wt, ну Получите:
2u +
Зьи-
2 + w - v
где иу v, w — комплексные числа. Определите процедуры для работы с комплексными числами.
6.	Пусть даны три последовательности вещественных чисел alf..., а^; b0, b,, Ь;ю; c0, clh Сзд. Вычислите значение выражения для заданного х
аох + щх 4-... 4- а?оХ + бг™ ,	..in	.ч2о	..
~~ зо , ,	п29 г	(со (2* + О + А (2х + 1) +...+с29(2х 4-1) 4- с30) •
b0(x-l) 4-bj(x-l) 4-... + b30
7.	Для следующих программ определите, что будет напечатано:
a) program One;
var с. d : Integer: procedure P( x. у : integer ): begin
У := x + 1 end:{ p } procedure 0( x : integer; var у : integer ): begin
У := x + 1 end; { Q } begin
C := 2: d 0;
P( sqrt c ) + d. d ); writelnt 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
I := X + Y + W:
X := 2 * W end;{ В } begin
Y Z + X;
B( Y. Z );
end;( A }
begin
X - 1:
Y - 2;
A( X + V, V );
A( 2 * Y, X );
к^ад*чигпрогрв1итн
write In( X, Y )
end.{ [wo }
 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 r- 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 ):
writelnf II. W )
endJ Three }
8. Определите наибольший общий делитель трех чисел, написав функция определения наибольшего общего делителя NOD(x, у), используя ал гор Евклида.
'*9. Напишите процедуру сложения двух дробей, результатом которой явля несократимая правильная дробь. Используйте функцию для нахождения большего общего делителя.
► 10. Вычислите результат выражения
1'А С ~| Е
^В + С А-СJ F
в виде правильной дроби, где А, В, С, Е, F— целые числа. Воспользуй функцией сложения двух дробей,
•11. Для двух представленных ниже квадратных уравнений определите, им ли они одинаковые корни. Напечатайте те корни уравнений, которые не падают.
qx2 + х 4- q — 0,
а2х2 +b2x+c2 =0.
12. Для заданного натурального А определите первые N простых чисел.
► 13. Определите все общие делители двух заданных натуральных чисел.
к14. В трех автопарках работают по 20 машин с заданными госномерами и ; данными марками: ГАЗ, ЗИЛ, ЛИАЗ и т. д. Каждый водитель сдает свод: том, сколько километров прошла его машина в каждый день недели, и о; мере выручки. Подсчитайте общий километраж в каждом автопарке по к дому дню отдельно. В каком из автопарков самый больший автопробег? Ка
день недели соответствует самой большой прибыли, полученной автохозяйством? Автомобили какой марки приносят наибольшую прибыль?
*15, На заправочной станции для каждого автомата известно количество отпущенного топлива каждого вида (А76, А93, А95, DIZ ...) и количество обслуженных машин в каждый из дней недели. Вычислите общий объем топлива, проданный в указанный период недели. В какой день недели было обслужено больше всего машин? Из какого автомата было продано наибольшее количество топлива? Какой вид топлива пользуется наибольшим спросом?
16. Определите исходя из данного фрагмента программы:
type
country - (Австрия. Канада. Китай, Италия.
Перу. США);
continent = (Америка. Африка, Азия, Европа);
а)	функцию, которая по заданной стране определяет континент, на котором находится страна;
Ь)	для двух стран, находятся ли они на разных континентах.
17. Напишите функцию, проверяющую, является ли заданная литера гласной русской буквой.
*18. На плоскости координатами своих вершин заданы два треугольника. Определите, одинакового ли они типа (прямоугольный, тупоугольный, остроугольный).
19. В двух последовательностях ..., а„ и Ьх, Ьп замените все элементы, следующие за элементом с максимальным значением, на значение минимального элемента.
♦	20. Дана последовательность вещественных чисел at, а2,..., ап. Для каждого элемента последовательности аг подсчитайте количество элементов слева, которые по модулю меньше а,, и количество элементов справа, которые по модулю больше а,. Используйте подпрограмму, производящую вычисления для одного элемента последовательности.
♦	21. Для заданных А и В (А < В) и последовательности целых чисел определите количество чисел, которые принадлежат интервалам [-«, А], [Д В], [В, «>].
♦	22. Заданный массив целых чисел делится на три части двумя элементами: максимальным и минимальным. Определите сумму элементов в каждой части массива. Используйте функции для нахождения индексов минимального и максимального элементов и подсчета суммы элементов в указанной части массива.
23. Пусть дана матрица А размером п х т, состоящая из вещественных чисел. Необходимо получить матрицу В размерном п х т, каждый элемент Ь1; которой равен true, если сумма соседних с элементов меньше указанной величины 5, и false — в противном случае. Воспользуйтесь функцией для нахождения суммы соседних элементов.
*24. Пусть даны две матрицы А(н х ж), В(и х щ), состоящие из вещественных чисел. Необходимо получить матрицу С(п х т), где элемент CtJ равен сумме
□ЯЩЧИ, npvrpewiwiw
элементом гй строки матрицы А, которые отсутствуют в/-м столбце mi цы В, Напишите функцию вычисления CIjt использующую функцию пр< ки наличия числа в j-м столбце матрицы В.
♦	25. Пусть задано ЛГпараллелограммов координатами своих вершин. Опре/ те номер параллелограмма, у которого площадь максимальна. Напи] функцию для определения площади параллелограмма по его заданны! ординатам вершин.
<	♦26. Пусть дана матрица А(п х т). Постройте матрицу В(п х т), каждый эле которой равен произведению сумм элементов, расположенных в обла показанных на рис. 9.1. Напишите функцию для вычисления суммы эле 7 тов в указанной области.
Рис. 9.1. Девять областей
ли,/]
*	27. Пусть даны две вещественные матрицы порядка п. Получите новую мат] следующим способом (для нахождения минимального элемента и прог дения элементов в указанной строке используйте функции):
а)	умножением минимального элемента каждой строки первой матриц наибольший элемент соответствующего столбца второй матрицы;
Ь)	прибавлением к элементам каждого столбца первой матрицы произх ния элементов соответствующих строк второй матрицы.
28. Допустимым преобразованием матрицы назовем перестановку двух сс них строк или двух соседних столбцов. Пусть дана вещественная квадра матрица порядка N. С помощью допустимых преобразований получите ма цу, в которой один из элементов с наибольшим значением располагался левом верхнем углу. Напишите функции, осуществляющие соответсп щие преобразования строк и столбцов.
♦	29. Пусть дана вещественная матрица А(я х т). В каждой строке переместите i нец строки все элементы, у которых соседние элементы в строке разны знаку. Используйте функцию для перемещения указанного элемента стр
♦	30. Пусть дана матрица А(и х т), состоящая из натуральных чисел. В кая столбце обнулите минимальное количество элементов так, чтобы сумма ментов столбца не превышала заданную.
IWV	>1>ЛЛ4в*(^ЛВГ1|1у
*	31. Для заданной вещественной матрицы определите, образуют ли ос алименты упорядоченную послсдонателыюсть при их переборе по схеме, представлен ной на рис. 9.2. Для определения факта упорядоченности части строки (столбца) используйте функции.
Рис. 0.2. Схема расположения последовательности
*32. Пусть дана вещественная квадратная матрица порядка 2п, Получите новую матрицу, переставляя ее блоки размером п так, как показано на рис. 9,3. Для
Рис. 9.3. Переставляемые блоки матрицы
33. Пусть дана прямоугольная матрица А(п х т), элементами которой являются целые числа. Определите, в какой строке матрицы находится наибольшее количество симметричных чисел. Составьте функцию, проверяющую симметричность числа.
"34. Пусть дана прямоугольная матрица Л(и х т), элементами которой являются вещественные числа. Определите для каждой строки, все ли ее элементы являются симметричными. Составьте функцию, проверяющую симметричность числа.
	35. Пусть дана прямоугольная матрица А(п х т), элементам и которой являются целые числа. Определите для каждого элемента позиции элементов матрицы с такой же суммой цифр.
	36. Пусть дана прямоугольная матрица А(п х ?п), элементами которой являются целые числа. Замените все положительные четные числа на числа, являющиеся их «перевертышами». Составьте подпрограмму, получающую для заданного числа его «перевертыш» (число а будем считать «перевертышем» числа Ь, если, читая число а справа налево, получаем число Ь).
задачи, программы
•	37, Пусть дани /V шестизначных номеров троллейбусных билетов — ХХХХ Определите те билеты, номера которых являются «счастливыми*, то есть < ма первых трех цифр совпадает с суммой последних трех цифр. Использ; функцию для определения, является ли номер «счастливым*.
•	38. Б квадратной матрице определите количество строк, отвечающих след щему условию (для определения типа каждой строки используйте функщ а) упорядоченных по возрастанию;
Ь)	упорядоченных по убыванию;
с)	состоящих из равных элементов;
d)	неупорядоченных.
♦39. Пусть дан список учащихся и для каждого из них Nоценок по М предме ;. Переместите в конец списка тех учащихся, у которых средний балл меш ;	чем средний балл в классе. Напишите функции для перемещения одной с
ки в конец списка для вычисления среднего балла.
40.	Пусть даны три слова. Необходимо определить буквы, которые встречай (для нахождения множества символов, образующих слово, используйте i f цедуру):
♦	а) во всех словах;
♦	Ь) только в 1-м и 2-м словах;
•	с) только в 1-м и 3-м словах;
♦	d) только во 2-м и 3-м словах;
	е) только в 1-м слове;
♦	f) только во 2-м слове;
♦	g) только в 3-м слове.
♦	41. Пусть даны два предложения, которые оканчиваются точкой и содержат с наковое количество слов. Определите для первых слов каждого предло ния множество одинаковых букв, а для последних — те буквы, которые нс чаются только в одном из них. Для определения буквенного состава сл используйте процедуру.
	42. Найдите все слова в предложении, которые содержат только заданные f вы. Для определения буквенного состава слова используйте процедуру.
♦	43. Среди нескольких предложений найдите то, которое содержит наиболь количество разных букв.
44. В заданном тексте удалите все слова, которые начинаются с нечетной нс ции. Для удаления слова используйте функцию.
45. По заданной строке текста напечатайте строку, в которой все гласные бу] удваиваются, а двойные согласные заменяются одиночными.
46. Напишите функцию, которая в заданной строке определяет количество вх дений в нес заданной подстроки. Для заданных строки и слова oi (редел количество вхождений слова в строку.
1U« 1Л«МН. нроц|щуры и функции
*	47. Пусть задан текст, состоящий из нескольких предложений, разделенных точкой. Выполните следующие преобразования: первые слова в каждом предложении преобразуйте к виду, в котором первая буква прописная, а остальные строчные; в словах, которые содержат более чем одну прописную букву, все буквы замените прописными; в остальных словах все буквы должны быть строчные. Используйте функцию для преобразования одного слова в предложении.
♦	48. Пусть дан текст в виде символьной строки, оканчивающейся точкой. Необходимо определить количество слов, которые являются «перевертышами» (например: казак, шалаш), то есть читаются одинаково с начала и с конца слова. Слова в предложении отделяются одним либо несколькими пробелами.
♦	49. Составьте подпрограмму, которая в строке текста определяет позицию самого правого вхождения указанной подстроки. Для указанной строки определите позицию подстроки END.
♦	50. Напишите процедуру, которая для заданного целого числа получает его представление в n-й системе счисления в виде строки символов.
♦	51. Составьте процедуру вычисления значения целого числа по заданной строке символов, являющейся записью этого числа в и-й системе счисления (п < 16). Найдите сумму чисел, записанных в виде строки, для указанного основания системы счисления.
	52. Для заданной строки текста определите слова, которые содержат символы, отличные от букв. Напишите функцию, определяющую тип символа строки.
	53. Пусть дано п треугольников. Посчитайте количество треугольников, лежащих в каждой координатной четвертин не пересекающих оси координат. Используйте функцию для определения координатной четверти, в которой лежит треугольник.
♦	54. Для заданного текста определите пару слов, буквенный состав которых наиболее схож. Используйте функцию для определения буквенного состава слов.
♦	55. Составьте процедуру «сжатия» исходной последовательности символов, которая заменяет последовательность, состоящую из одинаковых символов, текстом вида x(k), где х — символ последовательности, k — число вхождений. Определите для указанной последовательности коэффициент сжатия (отношение исходной длины последовательности к полученной).
♦	56. Пусть дано п треугольников, заданных координатами своих вершин. Найдите пару треугольников, максимально удаленных друг от друга.
	57. Пусть дано п треугольников, заданных координатам и своих вершин. Найдите треугольник с максимальной площадью. Напишите функцию для нахождения площади одного треугольника.
	58. Пусть дано п произвольных четырехугольников, зада]шых координатами своих вершин. Найдите четырехугольник с максимальной площадью. Используйте функцию для вычисления площади четырехугольника.
♦	59. Пусть дано п прямоугольников, заданных координатам и левой верхней и правой нижней вершины. Стороны прямоугольников параллельны осям коор-
Задачи, программа
динат. Определите пару прямоугольников с максимальной площадьк сечения. Напишите функцию для определения площади пересечсни прямоугольников.
♦	60. Пусть дано п треугольников. Определите координаты центра и мин1 ный радиус круга, который содержит все треугольники.
•	61. Составьте процедуру выравнивания строки, которая преобразует < к строке указанной длины путем добавления пробелов между словам]
•	62. Пусть дано п треугольников. Определите количество треугольников рые пересекают границы заданного квадрата. Используйте функцию длз деления, пересекает ли треугольник границы квадрата.
♦	63. Пусть дано п отрезков на интервале [Л, В]. Определите часть интерва торый покрывается наибольшим количеством отрезков. Напишите фу] для определения количества отрезков, покрывающих заданный интер
*	64. Определите минимальное количество отрезков из числа заданных, кс покрывают заданную часть прямой. Напишите функцию, определяют} крывает ли заданный набор отрезков необходимую часть прямой.
:	65. Напишите процедуру сложения двух многочленов. Представьте кажды > гочлен в виде массива коэффициентов, где Д — коэффициент перед х, ♦66. Найдите многочлен, полученный в результате умножения (д0 + дрс + а^х
+	х (Ьо + btx + Ь2х*+... + Ъпх“). Напишите функцию для умножени: гочлена на число и
*	67. Составьте процедуру деления с остатком для многочленов. Вычислит д0+д1х4-«2х2+...+дпхя	____
—---------   5----------------------=---------, £.т < и ,
(Ьо + ЬАх + Ь2 х +... + Ьтх™ )(6Л + ^_j х + Ь^2х +... + bQxm)
. *68. Напишите процедуру, которая для заданного полинома определяет пол являющийся производной исходного полинома по указанной передо Вычислите:
______________др	+ » + дл хя__________
Jbp +blX + b2x2 + .„+bmxm)(bltt +bm_ix+bm_2x2 +... + 60xm) j
♦69, Вычислите интегралы:
f 1	b
[sin2 x--Tdx и f ctg(x2 + 4)dx.
J i+л i a	a
Для этого напишите функцию, вычисляющую интеграл по формуле паи ших прямоугольников для заданного интервала, количества разбиений и ции, передаваемой как параметр. Формула наименьших прямоугольш
ь
^f{x)dx = шщ(/(д = яД/СМ) + min(/(al),/(a2)) +.
а
+ min(/(<i^,),/(b = o„)).
1 UW 1лжм W процедуры И ФУНКЦИИ
70. Вычислите иптегрнл:
J3sin(;r + ])<&.
2
Для этого напишите функцию, которая вычисляет интеграл по формуле трапеций для заданного интервала, количества разбиений и функции, передаваемой как параметр. Формула трапеций:
ь
f f(x)dx = ~(f(aQ) + 2/(fll)+2f(a2) + 2/(Oj)+... + 2f(a„_x a
71. Напишите подпрограмму, которая вычисляет инте1рал по формуле Симпсона для заданного интервала, количества разбиений и функции, передаваемой как параметр.
ь
= | (/(«^ ) + 4/(а,) + 2f(a2) + 4f(a3)+... +	) + /(«„)).
а
♦	72. Напититс процедуру, которая по заданному интервалу и функции определяет «ноль» функции с заданной точностью, используя метод деления отрезка пополам. Известно, что на границах интервала функция принимает значения, отличные по знаку. Определите «ноль» функции Аг2 + Вх + С для заданных Л, В, С,
♦	73. В квадратной матрице Л (л х га) найд ите строки, представляющие вектор с максимальной нормой в каждой из следующих метрик (напишите функцию для подсчета нормы вектора в указанной метрике):
H = 7“i2+
H=hK-+kl
1141 = ^3x1^,1= 1, ...,га
*	74. По вещественным числам £ > 0 и t вычислите с точностью £ величину:
Jt cos4' + Jj , arctg t . J » .
V 4 V 2 V3 + t2
Для вычисления корней используйте следующий ряд Тейлора:
/1 . ча , й	а(а-1) 2 о(га-1)(га-2) 3	।	,
(1 + х)а = 1 + -д: + --Г + v-- А----~х +..., л: < 1, а > 0.
1!	2!	3!	11
*75, Пусть даны вещественные числа «, b, Е (а < b, Е > 0). С точностью Е вычислите интеграл:
С УУХ \g(A) = 1,/(х) = 1 +<

Задания для самостоятельной работы
ис пользу >i формулу трапеций (см. выше задачу 70). Для обеспечен из пой точности воспользуйтесь следующим правилом Руш е: если прибл ное значение интеграла In вычислять при л = ии, 2па, 4п0, 8п0... и т. д. (г/ некоторое начальное число отрезков разбиения, например ио“10), тог, 1^Ч1/з<£ за искомую величину можно взять 12„.
*76. Пусть дано п вещественных чисел (я = 100). Упорядочить их по неубы методом фон Неймана:
а)	завести два массива Л и В и занести все элементы в А;
Ь)	упорядочить пары соседних элементов (Аг и А2, А3 и А4 и т. д.) и зат । их в В;
с)	взять из массива В упорядоченные пары и, слив их в упорядоченнь верки, снова записать в А;
d)	затем взять из массива В четверки элементов, восьмерки и т. д.
^Задания для самостоятельной работы
^3 каждом из предложенных ниже заданий используйте процедуры ввода и в Элементов матрицы по строкам.
 1. Проверьте свойство (Ат)т~ А, где А — исходная матрица (п х я), Т озт ;  транспонирование. Используйте процедуру транспонирования.
1 2. Пусть задана вещественная матрица А(п х п). Упорядочить элементы мат ; а) по неубыванию значений максимальных элементов в строках;
Ь) по неубыванию сумм элементов строк.
3.	В заданной матрице А(н х п) определите количество строк, которые у дочены по возрастанию. Используйте подпрограмму проверки упорял ности строки.
4.	В матрице А(я х я) определите количество строк, элементы которой обр арифметическую прогрессию. Используйте подпрограмму проверки сз
5.	В заданной матрице А(и х п) найдите максимум из всех минимальны ментов матрицы по столбцам.
6.	В заданной матрице А(я х и) найдите минимум всех сумм абсолютных чин элементов матрицы по столбцам. Для нахождения суммы абсолк величин столбца используйте функцию.
7.	Подсчитайте количество строк матрицы А(н х я), элементы которых о( ют монотонную последовательность. Для определения факта монотон используйте подпрограмму.
8.	Уплотните матрицу А(я х п) влево и вверх. Для выявления нулевых и столбцов используйте подпрограмму.
9.	Упорядочьте строки матрицы по возрастанию их евклидовых норм.
10.	Проверьте, есть лив матри це А(п х п) строки, нс содержащие более двух дательных элементов. Для проверки строки используйте подпрограмм
106 Пика в. Процедур* и функции
И. Пусть дана матрица Л(я х и). Постройте вектор, каждый элемент которого содержит наименьший по абсолютной величине элемент строки.
12.	Составьте программу поиска минимального элемента, расположенного под главной диагональю, и максимального элемента, расположенного над главной диагональю заданной вещественной матрицы Л(п х п).
13.	Пусть задана вещественная матрица. Рассматривая ее как вектор строк, упорядочьте ее по количеству нечетных элементов в каждой строке.
14.	Определите номера строк в матрице, в которых элементов, принадлежащих отрезку [А, В], больше, чем элементов, принадлежащих отрезкам [-<», А], [В, «•].
15.	Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент которого принимает значение true, если среди элементов t-й строки матрицы А есть хотя бы два равных, и значение false — в противном случае. Воспользуйтесь логической функцией, которая для i-й строки выполняет указанную проверку.
16.	Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого равен наибольшему количеству равных элементов в соответствующей строке матрицы Л. Воспользуйтесь функцией, которая определяет это количество в i-й строке матрицы Д.
17.	Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент которого равен true, если в строке существует элемент, делящий весь массив на две части с одинаковой суммой элементов в каждой,
18.	Проверьте, верно ли, что количество строк матрицы Л(п х и), в которой все числа нечетные, кратно заданному числух
19.	Пусть дана матрица Л(и х и). Постройте логический вектор, каждый элемент которого равен true, если среди элементов соответствующей строки матрицы А есть хотя бы один элемент, принадлежащий отрезку [0,5; 1], и false -в противном случае. Воспользуйтесь логической функцией, делающей соответствующую проверку в t-й строке.
20.	Пусть дана матрица А(п х я). Постройте вектор, каждый элемент которого равен количеству элементов в i-й строке матрицы А, не принадлежащих отрезку [0, 10]. Воспользуйтесь функцией, делающей соответствующую проверку в i-й строке.
21.	Пусть дана матрица Д(п х п). Постройте вектор, каждый элемент которого равен сумме элементов i-й строки матрицы Д, больших, чем значение минимального элемента в этой строке. Воспользуйтесь функцией, определяющей соответствующую операцию в каждой строке матрицы А.
22.	Пусть дана матрица Л (л х л). Упорядочьте строки ион (’убыванию сумм цифр элементов этой строки. Воспользуйтесь функцией, определяющей для каждого числа сумму его цифр.
23.	Напечатайте строки и столбцы матрицы W(n х ?/). на пересечении которых находятся максимальные и минимальные элементы, если элементы матрицы вычисляются по формулам:
Задания для самое! витальной paflo
№,/ =  1/2, i=j,
24.	Элементы матрицы Л(п х п) вычисляются по формуле:
Д J = / * Sin( j) + sin(i) о; jf = 1, 2, 3,..., «)-
Требуется:
а)	сформировать матрицу В:
д = Ai'j (/, 7=1,2,3,л);
Ь)	вывести на печать сформированные матрицы Л, В и их произвело
25.	Пусть дана матрица А(п х и), где Д = (-1)' * i * j. Постройте и выв< печать матрицу В, элементы которой определяются по правилу:
Я.. = Д .*тах ДА ,J	15*<Я	’
26.	Выведите на печать матрицу К(п х и). Вычислите и выведите на печ лярное произведение i-й строки на i-й столбец (всего п произведени менты матрицы вычисляются по формуле:
27.	Элементы матрицы Л(пх п) вычисляются по формуле:
Д-7 = sin(i* j), (ij = 1,2,3,и);
Требуется:
а)	построить матрицу В, каждый элемент которой вычисляется по ф’
J а=1
Ь)	вывести на печать матрицы Л и В.
Глава 10
Рекурсивные подпрограммы
Теоретические вопросы
1.	Как называются процедуры или функции, которые вызывают сами себя?
2.	Для каких целей создаются рекурсивные алгоритмы?
3.	Что называется стеком?
4.	Верно ли, что значения всех локальных переменных при очередном вызове рекурсивной процедуры или функции помещаются в стек?
5.	В какой последовательности происходит заполнение стека и выбор элементов из стека?
6.	Всегда ли в рекурсивном алгоритме должно присутствовать условие выхода из рекурсии?
7.	Что произойдет, если рекурсивный алгоритм будет вызывать сам себя «бесконечное» число раз?
8.	Верно ли, что решение задачи, реализуемое рекурсивным алгоритмом, можно выразить нерекурсивным алгоритмом?
Задачи, программы
1. Напишите рекурсивную функцию для нахождения биномиальных коэффициентов (для заданного Л/> i >j > 0 вычислите все С/ ):
1, при т - 0,я > 0 или т = п > О,
С* = < 0, при т > п > 05 СД+СГ', иначе.
♦2. Пусть задано конечное множество имен жителей некоторого города, причем для каждого жителя перечислены имена его детей. Перечислите все пары жителей города, которые являются родственниками, причем жители А и Б называются родственниками, если:
□дачи, программы
а)	Л это ребенок 5;
Ь)	Б — это ребенок Л;
с)	существует некий В такой, что А является родственником В, а В я вл родственником В.
*3. Подсчитайте количество различных представлений заданного натурал числа Лв виде суммы не менее двух попарно различных положительны гаемых. Представления, отличающиеся порядком слагаемых, различны считаются.
♦4. Вычислите определитель заданной матрицы, пользуясь формулой раз. ния по первой строке (матрица В получается вычеркиванием из А п< строки и £-го столбца):
detj = £(-l)‘+'/lltdetBt.
*=)
5. Постройте синтаксический анализатор для понятия идентификатор. «Идентификатор* :: = «буква* | «идентификатор* («цифра* | «буква*).
*	6. Постройте синтаксический анализатор для понятия простое выражеъ
<простое_выражение> ;<простой_идентификатор> |
(<лростое_8ыражениехзна к_операци и><ггростое_вырамение>);
«простой_идентификатор> «буква*;
<знак_операции* ::= + | - | *.
*	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. Найдите с точностью Е все корни и-го многочлена Чебышева Гп(х), определяемого формулами:
Г0(х) = 1; 7](х) = х; Tk (х) = 2хТк_}(х) - Tk_2(х), (k = 2,3,...).
ПРИМЕЧАНИЕ Многочлен Tt(x) имеет k различных корней в интервале [-1,1]; если
Х|<г2<„. <xk — корни многочлена то многочлен имеет по одному корню в каждом из интервалов (-1, xj, [x^xj,.... [хъ 1 ].
17. «Ханойские башни». Пусть имеются три колышка Л, В, Сип дисков разного размера, перенумерованных от 1 до п в порядке возрастания их размеров. Сначала все диски надеты на колышек Л в виде пирамиды. Требуется перенести все диски с колышка А на колышек В, соблюдая следующие правила: диски можно переносить только по одному, диск большего размера нельзя ставить на меньший. Диск С можно использовать в качестве промежуточного.
*	18. Напишите программу перевода инфиксной записи арифметического выражения в постфиксную.
♦	19. Напишите программу вычисления выражения, записанного в постфиксной
	20. Пусть дана строка текста, оканчивающаяся точкой. Напечатайте этот текст в обратном порядке.
	21. Опишите рекурсивную логическую функцию, которая проверяет, является ли симметричной часть заданной строки, начинающаяся i-м и кончающаяся у-м символом.
♦	22. Напишите две функции вычисления г го числа Фибоначчи (рекурсивную и не рекурсивную) и напечатайте таблицу для сравнения времени вычисления i-ro числа. Вычислите /(A), k = 15,20, 30,40.
ПРИМЕЧАНИЕ Функция/(п) определена для целых чисел следующим образом;
1, «-1,
/(«) =
£/(« div2), п>2.
♦	23. Проверьте, является ли вводимая последовательность символов константным ^выражением .
Задания для самостоятельной работ!
<конст_выр> : «целое^Оез^энакй*!
(«ис лоеОезз не ка><зна к_опера ции*<конст_выр>)
«целоебез_знака> <цифра*[«цифра>]
«знак_операции> + - | *
«цифра* :0 | 1 | 2 3|4|5|6|7|8|9
•	24. Напишите программу, которая по заданному правильному конски выражению (см. условие предыдущей задачи) вычисляет значение эт ражения либо печатает сообщение об ошибке, если происходит пере ние в результате вычислений.
►	25. Проверьте, соответствует ли вводимая последовательность символов тию скобки:
«скобки* ::= «круглые* | «квадратные*
«круглые* : («квадратныехквадратные*) | +
«квадратные* ::= [«круглыехкруглые*] | -
►	26. Проверьте, соответствует ли вводимая последовательность символо] тию список_списков\
«список_списков* ::= <слисок>[;«список*]
«список* ::= «элемент*[.«элемент*]
«элемент* : - a|b|c|d|e|f|g|hji|j|k|l |m|n|o|p|q|r'|s|t|u|v|w|x|y|z
►	27. Проверьте, соответствует ли вводимая последовательность символо! тию скобки:
«скобки* ::= «круглые*|«квадратные*
«круглые* :А|((«круглые*)[«квадратные*])
«квадратные* :В|[[< квадратные >](«круглые*)]
*	28. Вводимая последовательность символов представляет собой формул; занного ниже вида (М означает функцию max, а го — ппп). Вычислите зн данной формулы:
«формула* ::= «цифра* | М(«формула*.«формула*)| ш(«формула*,«формула*)
«цифра* ::-0|1|2|3|4|5|6[7|8|9
... *29. Проверьте, удовлетворяет ли вводимая последовательность символо! тию текст:
«текст* «элемент*|<эленент*«текст>
«элемент* а | b | («текст*) | [«текст*] | {«текст*}
♦	30. Опишите рекурсивную функцию, которая по заданным границам а з данной функции f(x) и заданной точности Е методом деления отрезк; лам находит с точностью Е корень уравнения /(я) - 0 на отрезке [а, b тать, что е > 0, а < Ь,/(й) х/(Ь) < 0,/(х) — непрерывная и монотонная н
Задания для самостоятельной работы
1. Для заданного целого п вычислите значение суммы:
Г1^
c) with К, центр do
begin
радиус ;- 2.5;
X 0;
у- 1.8 end:
d) with центр. К do begin
радиус ;= 2.5;
x : = 0:
У ;= 1.8 end;
Используя следующий фрагмент программы, опишите логическую функцию Бьет С К1, К2, КМ), проверяющую, «бьет» ли карта К1 карту К2, с учетом того, что масть КМ является козырной.
type
масть «= (пики, трефы, бубны, червы):
достоинство - (шесть. семь, восемь, девять,
десять, валет, дама, король, туз);
карта = record
м: масть;
д: достоинство end:
Используя следующий фрагмент программы, опишите логическую функцию ПравильныйРяд(г), которая проверяет, правильно ли выставлены кости домино в ряду г (равна ли правая цифра очередной кости левой цифре следующей кости).
type
КостьДомино = record
левая, правая: 0 .. 6 end;
ряд = array [1..28] of КостьДомино;
Используя следующий фрагмент программы, опишите перечисленные ниже функции:
type
поле = record
вертикаль: (a. b. с. d. е, f. g. h);
горизонталь; 1 .. 8 end:
а)	функция ХодСлона(п1, п2) проверяет, находится ли фигура с поля п2 под боем у слона, который стоит на поле nl;
Ь)	функция ХодЛадьи(nl. п2. пЗ) проверяет, может ли ладья за один ход перейти с поля nl шахматной доски на поле п2. Если нет, надо указать промежуточное поле пЗ, через которое ладья может попасть на поле п2 за два хода;
с)	функция ХодКоня(п1, п2) проверяет, можно ли конем с поля nl объявить шах, если король находится на поле п2;
d)	функция ХодФерзя (nl, п2) проверяет, может ли ферзь за один ход перейти с поля nl шахматной доски на ноле п2.
8. Используя следующий фрагмент программы, найдите самую длинную реку из списка С и напечатайте ее название.
type
строка - array [1..15J of char;
река  record
название: строка: длина: Integer end;
список = array [1..3Q] of река;
9. Пусть дан фрагмент программы. Используя оператор присоединения, присвойте переменной Лдр1 значение, соответствующее адресу: Воронеж, ул. Остужева, д, 1, кв. 70. Кроме того, переменной Адр2 присвойте такое же значение, заменив в нем номер квартиры на 99.
type
строка - array [1..15} of char;
адрес - record
город, улица: строка:
дон, квартира: 1..999
end;
var Адр1. Адр2: адрес;
10.	Определите комбинированный тип для представления анкеты школьника, включающий в себя его возраст, номера школы и класса и оценки по каким-либо пяти предметам. Опишите некоторую переменную данного типа и присвойте ей значение, соответствующее следующей анкете: Петров Иван Ильич, 16 лет, 194-я школа, класс 9б, оценки: 5,3,4, 5,2.
11.	Используя следующий фрагмент программы, опишите перечисленные н иже функции:
type
имя - (Аня, Валя. Женя. Петя.
Саша. Таня, Щура. Юра):
данные = record
пол: (муж. жен);
рост: 140.200
end:
группа = array [имя] of данные:
	а) функция Сред Рост ( ГР ) определяет средний рост женщин из группы ГР;
	Ь) функция Высокий( ГР ) определяет имя самого высокого мужчины из группы ГР;
с	) логическая функция ОдинРост ( ГР ) проверяет, есть ли в группе ГР хотя бы два человека одинакового роста.
12.	Используя следующий фрагмент программы, опишите процедуру Ирон ияСудь -бы( С ), которая печатает фамилии двух (любых) жителей из списка С, живущих в разных городах по одному адресу.
type
строка = array [1..20] of char;
житель - record
фамилия, город: строка;
адрес; record
11ZПина 10. Рекурсивные подпрограммы
2.	Опишите рекурсивную функцию, которая по заданным вещественному;? и цс лому п вычисляет величину л" согласно формуле:
1,и=0,
3.	Напишите программу вычисления функции Аккермана для всех неотрицательных целых аргументов т и и:
/4(0, л) = я + 1,
А(т,п) = А(т,0) = A(tn - 1,1),т > О»
Л(т,л) = А(т -1, А(т,п -1)), т,п > 0.
4,	Напишите рекурсивную функцию, которая вычисляет у — л/х по следую щей формуле:
п 0,1,2, , За ответ принять приближение, для которого выполняется уело вне (уЛ - #„+1| < е, где е = 0,0001.
5,	По вещественному числу а > 0 вычислите величину:
Корни у = \!х вычислятьсточностью£= 0,00001 по следующей итерацион-
ной формуле:
*-1
№ = 1;^+1;=Ул+1—г я
п = 0, 1,2,приняв за ответ приближение ynU, для которого	- у^ < Е.
6.	Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:
sin^'^cosx л-1
	+	 и-------------п
------sin2x, /г-2, 2 4
- cos х» н = 1;
Задания для самостоятельной рабой
cos" xdx-
cos"4 xsinx п
~—- fcos"-2xdx, n>2, n J
- + — sin2x, n = 2,
2 4
1 cosx л-l sin""1^
1 sin x n - 2 e dx
---  — *J —  -------T?—s л-l cos" ~x л-rcos X
n > 2,
x, n = 0;
a
XU	fl Г и—1 mx j ~ i
------------------x a dx, n > 1, л In a mln fl’’
„„IKX
xa a n ~ Г mine m(lrw)2 ’
e cos x(c? cosx + n sin x) n(n -1) г „_2 ----------\--------------- + -i--f e cos" x c
a +«	a +niJ
j	cos" xdx =
-	(sin x + a cos x)
d) f^-= J COS X
sin x, w -1;
x, n = 0;
n >
ean
—,» = 0;
. л
Глава 11
Строковый тип
sfc’.j
ретические вопросы
£ 1. Является ли тип stri ng структурированным типом данных? Обоснуйте свой рь ответ.
f. 2. Что представляет собой тип string:
&	А)	последовательность английских букв;
|	Ъ)	последовательность русских букв;
I	с)	последовательность символов ПЭВМ?
$3. Какое максимально возможное количество символов может содержать t,	строка?
М, Каково функциональное назначение типа string?
Как при описании строкового типа указывается длина строки?
6. Может ли пользователь задать длину строки? Если да, то каким образом?
|7. Всегда ли фактическая длина строки равна объявленной в описании?
Перечислить типовые операции над строками.
Каким образом в переменную типа string можно поместить какое-то кон-р крстное значение?
JO. Может ли в процессе выполнения программы изменяться фактическая дли-на строки?
11. Может ли в процессе выполненпит программы фактическая длина строки стать j больше, чем объявлено в описании? Что произойдет в этом случае?
5. Если длина строки не указана при объявлении типа stri ng, то чему она равна '' по умолчанию?
'^3. Мотут ли переменные строкового типа быть операндами выражений?
•$4, Верно ли, что тип string аналогичен одномерному массиву символов % array [O..n] of char?
f-45. Чем отличается тип string от одномерного массива символов array [0. .п]
of char?
Задачи, программы 117
16	Верно ли, что к любому символу в строке можно обратиться точно так же, как к элементу одномерного массива?
17.	Какие операции отношения можно применять к переменным типа string? Каков их приоритет?
18.	Как происходит сравнение строк:
а)	одинаковой длины;
Ь)	разной длины?
19.	Пусть s — переменная типа string. Что является результатом действия стандартных операторов read(s), write(s), readln(s), writelrj(s)?
20.	Перечислите основные процедуры и функции для обработки строк.
Задачи, программы
1.	Напишите программу, которая включала бы в себя подпрограммы, имитирующие основные стандартные процедуры и функции работы со строками.
2.	Быясвите, имеются ли среди вводимых символов все буквы, входящие в слово «змея».
*	3. Для большинства существительных, оканчивающихся на онок и -енок, множественное число образуется от другой основы. Как правило, это происходит по образцу: цыпленок — цыплята, мышонок — мышатам т. д. (в новой основе перед последней буквой т пишется а или я в зависимости от предыдущей буквы: если это шипящая, то а, иначе — я). Имеются слова-исключения, из которых укажем следующие: ребенок (дети), бесенок (бесенята), опенок (опята), звонок (звонки), позвонок (позвонки), подонок (подонки), колонок (колонки), жаворонок (жаворонки), бочонок (бочонки). Есть еще ряд малоупотребительных слов-исключений, которые мы не рассматриваем. Пусть дан текст, среди символов которого имеется пробел. Группа символов, предшествующая первому пробелу, представляет собой русское слово, оканчивающееся на -онок или -енок. Получите это слово во множественном числе.
*	4. Пусть дан русский текст, слова которого разделены пробелами, запятой или точкой. Все слова, оканчивающиеся на -опок или -енок, представьте во множественном числе.
*	5. Вводится строка. Если она является записью римского числа, то преобразуйте ее в целое число.
6. Напишите программу, позволяющую перемещать курсор в пределах экрана вверх-вниз, влево-вправо и допускающую ввод и отображение только русских букв независимо от того, осуществлялось ли переключение на русскую раскладку клавиатуры.
ПРИ М ЕЧАН ИЕ Такие приемы удобно использовать для ввода информации в тех прикладных задачах, которые работаю!' только с русскими текстами, чтобы не тратить время на переключение с латинской раскладки на русскую, что особенно актуально для неквалифицированного пользователя.
тю пйвмTTTCTpoKOiwfl тип
*7. Пусть вводится 10 произвольных имен. Необходимо рагпгчцтйть ИХ в алфавитном порядке. Попытайтесь решить задачу, не сортируя сами имена. Поскольку требуется просто распечатать их в алфавитном порядке, заведите массив, содержащий порядковые номера имен. При необходимости перестановки переставляйте не сами имена, а их порядковые номера. Такой подход особенно удобен, когда приходится сортировать сложные и «громоздкие* объекты.
♦	8. Напишите функцию revpositn, которая получает два параметра strl и str2 типа string и возвращает позицию начала первого появления в strl текста, содержащего литеры str2 в обратном порядке. Например, revpositnf' внешность 1, ’ сон1) должно возвратить 5, потому что подстрока ' нос ’ (перевернутое 'сон') содержится в слове 'внешность' начиная с 5-й позиции. Заметим также, что revpositn(' внешность'. ' нос’) дает 0.
*	9. Напишите функцию ri ghtpositi on, которая получает два параметра strl и st г2 типа string и возвращает позицию начала последнего появления str2 в strl. Например, rightposi ti on (' Миссисипи'. ' си ’) дает значение 6.
♦	10. Напишите функцию count, которая получает два параметра strl и str2 типа strl ng и возвращает число, указывающее, сколько раз stг2 встречается в strl. Функция не должна изменять свои параметры. Кроме того, любая литера в strl может учитываться не более чем в одном вхождении str2. Например, count (1 балалайка'. 'ала‘) должна возвращать 1, а не 2.
Н1. Напишите функцию nonalpha, которая получает параметр str типа string и возвращает позицию его первой литеры, не являющейся буквой (как латин-г ского, так и русского алфавитов) строчной или прописной. Например, поп-alphat ’stev7n’) дает 5.
42. Напишите функцию s pl ite( name: string: var first, last: string), которая из 1? параметра name, хранящего имя и фамилию человека, извлекает их в nepers менные f 1 rst (имя) и 1 ast (фамилия). Имя и фамилия разделены некоторым числом пробелов. Например, после обращения spl i te С' Вася Иванов', strl, str2) в strl должно оказаться слово 'Вася', а в str2 — ‘Иванов'. Необходимо также предусмотреть обнаружение и обработку некорректных данных. В частно-' сти, если в паше вообще не окажется ни одного пробела, процедура должна установить в обоих выходных параметрах специальное значение 'error' (ошибка). Какие еще ошибочные ситуации следует учесть?
£13, Пусть даны две строки strl и str2. Выясните, можно ли из strl путем пере-&' становки литер получить строку str2. Напишите подпрограмму, которая ре-F шала бы указанную задачу.
м4. Напишите процедуру sortmi d, которая сортировала бы ряд из п строк в алфа-/ битном порядке, основываясь на k-й литере каждой строки, где k является параметром, передаваемым процедуре sortmid. Например, если k “ 3, то эле-\	менты ряда должны быть отсортированы по возраста!шю значения в третьей
; литере каждой строки. Если длина строки меньше k, то будем предполагать, что его А’ й литерой, реально не существующей, служит пробел,
Н5. Напишите процедуру сортировки строк в обратном алфавитном порядке.
Задачи, программы 119
♦	16. Напишите подпрограммы encode (зашифровать) и decode (расшифровать), которые получают два параметра str и al pha типа strl ng. В первом параметре задается слово, подлежащее шифрованию (дешифровке), второй представ’ ляет собой некоторую перестановку 26 латинских букв алфавита. Принцип преобразования для шифрации состоит в следующем. Если некоторая буква в Str является k-ii буквой в обычном алфавите, то вместо нее должна быть взята буква из &-й позиции «нового» алфавита al pha. Для подпрограммы дешифровки используется обратный принцип.
♦	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
Записи,оператор присоединения
Теоретические вопросы
1.	Верно ли, что запись относится к структурированным типам данных?
2.	Дайте определение поля записи.
3.	Верно ли, что поля записи должны иметь один и тот же тип?
4.	Как осуществляется ссылка на компоненты записи?
5.	Может ли компонент записи быть помечен более чем одним именем?
6.	Может ли типом поля записи быть массив?
7.	Могут ли записи иметь вложенную структуру?
8.	Каков максимально допустимый уровень вложенности записей?
9.	Могут ли во вложенных записях имена полей повторяться на разных уровнях вложенности?
10.	Верно ли, что значения переменных типа запись можно присваивать переменным того же типа?
11.	Могут ли совпадать имена полей различных записей?
12.	Могут ли совпадать имена полой одной и той же записи?
13.	Как можно оценить объем памяти, необходимой для хранения записи?
14.	Можно ли значения полей записи использовать в выражениях?
15.	Дайте определение составного имени. Из каких частей оно состоит и как записывается?
16.	Чем запись отличается от массива?
17.	Какой оператор используют для упрощения доступа к полям записи?
18,	Когда применяется запись с вариантами?
19.	Из каких частей состоит запись с вариантами?
20.	Сколько вариантных частей может быть в любой записи с вариантами?
i zzmin 17. записи, оператор присо«линвнии
21.	Верно ли то, что вариантная часть расположена за всеми фиксированными полями?
22,	Что такое поле признака? Для чего оно используется в записи с вариантами?
23.	Как описываются компоненты каждого варианта записи?
24.	Сколько вариантов может иметь вариантная часть записи?
25.	Как можно оценить объем памяти, выделяемой для записи с вариантами?
26.	Почему в вариантной части записи не ставится слово end, закрывающее оператор case... of?
: 27. Верно ли, что ключ выбора должен быть стандартным или предварительно ? объявленным порядковым типом?
j. 28. Как влияет ключ выбора на количество следующих ниже вариантных полей?
/ 29. Можно ли ключу выбора в исполняемой части программы присвоить неко-торое значение и таким образом повлиять на выбор полей?
к 30. Пусть Zap — переменная типа запись, состоящая из нескольких полей. Мож-? но ли инициализировать значен ие этой переменной с помощью стандартной процедуры ввода read (р) ?
рЗГ. Верно ли, что все поля записи должны быть разных типов?
132. Почему при описании записи ее поля могут перечисляться в любом порядке? рЗЗ. Верно ли, что назван ия полей записи могут совпадать с именами переменных, f констант и других объектов программы, но не могут совпадать с названиями f  полей других записей?
f 34. Почему при обращении к полю записи имя поля должно указываться явно и не может быть задано в виде выражения?
Задачи, упражнения, программы
1.	Опишите комбинированный тип для определения следующего понятия:
а)	цена в рублях и копейках;
Ь)	время в часах, минутах и секундах;
с)	дата (число, месяц, год);
d)	адрес (город, улица, дом, квартира);
е)	семинар (предмет, преподаватель, номер группы, день недели, часы занятия, аудитория);
 f) бланк требования на книгу (сведения о книге: шифр, автор, название; сведения о читателе: номер читательского билета, фамилия, дата заказа);
• g) экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 строчек с полями: фамилия студента, номер его зачетной книжки, экзаменационная оценка).
задачи.упражнения,программы г4J
2. Опишите следующее понятие в виде массива или записи, а если возможно, то и в том и другом виде:
а)	обозначение поля шахматной доски (а5, h8 и т. п.);
Ь)	комплексное число;
с)	точка в 50-мерном пространстве.
3. Пусть дан фрагмент программы:
type
точка! « array [ (х, у) ] of real;
точка? - record
х. у: real end;
var
pl; точка!:
p2: точка?; di real;
а)	объясните, почему допустим данный раздел типов, хотя в нем одними и теми же именами (х и у) обозначены разные объекты (индексы и поля);
Ь)	присвойте переменной d значение расстояния между точками pl и р2;
с)	подумайте, допустимы ли конструкции pl[succ(x)] и 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:
11Z П1аид 10. Рвкуроииныв подпрограммы
2.	Опишите рекурсивную функцию, которая по заданным нгщсстиг иному хи цс лому и вычисляет величину х" согласно формуле:
1,«=0,

3.	Напишите программу вычисления функции Аккермана для всех неотрица тельных целых аргументов т и п:
А(0,п) = в + 1,
4(т,п) = J(w,0) = А(т - 1,1), т > О»
Л(т,л) = А(т — 1, А(т,п -!)),«,« > О,
4,	Напишите рекурсивную функцию, которая вычисляет у == Vx по следую щей формуле:
Уо = I: K+i = Л +
п - 0,1,2,.... За ответ принять приближение, для которого выполняется уело вие |ул - #n+1| < е, где £ = 0,0001.
5.	По вещественному числу' а > 0 вычислите величину:
Корни у’ = у[х вычислять с точностью £ = 0,00001 по следующей итерацион-
ной формуле:
/-> л
п = 0,1,2,приняв за ответ приближение ул+!) для которого |^и+1 - уп\ < Е.
6.	Для заданных границ интегрирования а и b вычислите значение определенного интеграла следующего вида:
„ I
Sin ~ XCOSX Л-1 f . я-2 , -------------4------I Si и	х ах, п> 2,
п	п J
Л' 1 .
------sm2x, п ~2,
-cosx» п = I;
Задания для самостоятельной рабой
	COS*1"1 XSinX , Л-1 f п-2	.	э 	+	 cosn х j dx, п > 2, П	rt J
b) Jcosnxd!x-’	—+ —sin2x, л - 2, 2 4 sin х, п = 1;
1 cosx л-1 sin""1.
п-2
и-1
sin"-2
dx sin"x
lntg-,rt = l, чЛ*
x, л = 0;
л-1
sinx
п-2
cos""1
п -1J cos" 2
cos"x
In tg
к
4 2
, п = 1,
х, п = О
x”e
a
—— fx"-‘a”“dr>n m In a *
xamx an'
mln Л И1(1П€?У
, л -1;
еш cos 1 х(й cosх + п sm х) п{п -1) г ш л_?
-----------\ъf е cos'1 хс а +н	a +niJ
g) Jeaxcos"xr/x =
- е"* (sin х + a cos х)
еап
—,л = 0;
. а
Глава 11
Строковый тип ч,-
ретические вопросы
Является ли тин stri ng структурированным типом данных? Обоснуйте свой ответ.
Что представляет собой тип string:
2) последовательность английских букв;
Ь) последовательность русских букв;
с) последовательность символов ПЭВМ?
Какое максимально возможное количество символов может содержать строка?
Каково функциональное назначение типа string?
Как при описании строкового типа указывается длина строки?
Может ли пользователь задать длину строки? Если да, то каким образом?
Всегда ли фактическая длина строки равна объявленной в описании?
Перечислить типовые операции над строками.
Каким образом в переменную типа string можно поместить какое-то конкретное значение?
Может ли в процессе выполнения программы изменяться фактическая длина строки?
Может ли в процессе выполнения программы фактическая длина строки стать больше, чем объявлено в описании? Что произойдет в этом случае?
Если длина строки не указана при объявлении типа stri ng, то чему она равна по умолчанию?
Могут ли переменные строкового типа быть операндами выражений?
Верно ли, что тип string аналогичен одномерному массиву символов array [0.of char?
Чем отличается тип string от одномерного массива символов array [0. .п] of char?
Задачи, программы 117
16	Верно ли, что к любому символу в строке можно обратиться точно так же, как к элементу одномерного массива?
17.	Какие операции отношения можно применять к переменным типа string? Каков их приоритет?
18.	Как происходит сравнение строк:
а)	одинаковой длины;
Ь)	разной длины?
19.	Пусть s — переменная типа string. Что является результатом действия стандартных операторов read(s), write(s), readln(s), writeln(s)?
20.	Перечислите основные процедуры и функции для обработки строк.
Задачи, программы
1.	Напишите программу", которая включала бы в себя подпрограммы, имитирующие основные стандартные процедуры и функции работы со строками.
2.	Выясиите, имеются ли среди вводимых символов все буквы, входящие в слово «змея».
*	3. Для большинства существительных, оканчивающихся на -онок и -енок, множественное число образуется от другой основы. Как правило, это происходит по образцу: цыпленок — цыплята, мышонок — мышатам т. д. (в новой основе перед последней буквой т пишется а или я в зависимости от предыдущей буквы: если это шипящая, то а, иначе — я). Имеются слова-исключения, из которых укажем следующие: ребенок (дети), бесенок (бесенята), опенок (опята), звонок (звонки), позвонок (позвонки), подонок (подонки), колонок (колонки), жаворонок (жаворонки), бочонок (бочонки). Есть еще ряд малоупотребительных слов-исключений, которые мы не рассматриваем. Пусть дан текст, среди символов которого имеется пробел. Группа символов, предшествующая первому пробелу, представляет собой русское слово, оканчивающееся на -опок или -енок. Получите это слово во множественном числе.
*	4. Пусть дан русский текст, слова которого разделены пробелами, запятой или точкой. Все слова, оканчивающиеся на -онок или -енок, представьте во множественном числе.
*	5. Вводится строка. Если она является записью римского числа, то преобразуйте ее в целое число.
6. Напишите программу, позволяющую перемещать курсор в пределах экрана вверх-вниз, влево-вправо и допускающую ввод и отображение только русских букв независимо от того, осуществлялось ли переключение на русскую раскладку клавиатуры.
ПРИ М ЕЧ АН ИЕ Такие приемы удобно использовать для ввода информации в тех прикладных задачах, которые работаю!' только с русскими текстами, чтобы не тратить время на переключение с латинской раскладки на русскую, что особенно актуально для неквалифицированного пользователя.
11 о тма 11C1 роковый тип
*7. 11усть вводится 10 произвольных имен. Необходимо рагпочитить ИХ в алфавитном порядке. Попытайтесь решить задачу, не сортируя сами имена. Поскольку требуется просто распечатать их в алфавитном порядке, заведите массив, содержащий порядковые номера имен. При необходимости перестановки переставляйте не сами имена, а их порядковые номера. Такой подход особенно удобен, когда приходится сортировать сложные и «громоздкие* объекты.
♦8. Напишите функцию revpositn, которая получает два параметра strl и st г2 типа string и возвращает позицию начала первого появления в strl текста, содержащего литеры str2 в обратном порядке. Например, revpositnf 'внешность ‘’ сон') должно возвратить 5, потому что подстрока ' нос ’ (перевернутое 'сон') содержится в слове 'внешность' начиная с 5-й позиции. Заметим также, что revposi tn(' внешность ’. 'нос’) дает 0.
*9. Напишите функцию ri ghtposit1on, которая получает два параметра strl и st г2 типа strlng и возвращает позицию начала последнего появления str2 в strl. Например, rl ghtpos11 i on('Миссисипи'. 'си') дает значение 6.
♦10. Напишите функцию count, которая получает два параметра strl и str2 типа strl ng и возвращает число, указывающее, сколько раз str2 встречается в strl. Функция не должна изменять свои параметры. Кроме того, любая литера в strl может учитываться не более чем в одном вхождении str2. Например, count ('балалайка'. 'ала') должна возвращать 1, а не 2.
И1. Напишите функцию nonalpha, которая получает параметр str типа string и возвращает позицию его первой литеры, не являющейся буквой (как латин-
, ского, так и русского алфавитов) строчной или прописной. Например, поп-’ alphatfstev7n’) дает 5.
Д2. Напишите функцию spliteCnarne: string: var first, last: string), которая из ... параметра name, хранящего имя и фамилию человека, извлекает их в пере-менные fl rst (имя) и 1 ast (фамилия). Имя и фамилия разделены некоторым числом пробелов. Например, после обращения spl 1 teС Вася Иванов ’. strl, str2) в strl должно оказаться слово ’Вася', а в str2 — ‘ Иванов'. Необходимо также предусмотреть обнаружение и обработку некорректных данных. В часгно-' сти, если в name вообще не окажется ни одного пробела, процедура должна установить в обоих выходных параметрах специальное значение 'error' (ошибка). Какие еще ошибочные ситуации следует учесть?
♦13. Пусть даны две строки strl и str2. Выясните, можно ли из strl путем пере-X становки литер получить.строку str2. Напишите подпрограмму, которая ре-F шала бы указанную задачу.
'J14. Напишите процедуру sortirri d, которая сортировала бы ряд из п строк в алфа-(. битном порядке, основываясь на k-й литере каждой строки, где k является параметром, передаваемым процедуре sortmid. Например, если k - 3, то эле-	менты ряда должны быть отсортированы по возраста!iию зкачения в третьей
ф литере каждой строки. Если длина строки меньше k, то будем предполагать, что его Л-й литерой, реально не существующей, служит пробел,
♦15. Напишите процедуру сортировки строк в обратном алфавитном порядке.
Задачи, программы 119
♦	16. Напишите подпрограммы encode (зашифровать) и decode (расшифровать), которые получают два параметра str и al pha типа strl ng. В первом параметре задается слово, подлежащее шифрованию (дешифровке), второй представ’ ляет собой некоторую перестановку 26 латинских букв алфавита. Принцип преобразования для шифрации состоит в следующем. Если некоторая буква в Str является k-ii буквой в обычном алфавите, то вместо нее должна быть взята буква из &-й позиции «нового» алфавита al pha. Для подпрограммы дешифровки используется обратный принцип.
♦	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 Гнлм 1 1. СЩОКПЙЫЙ г ин
*	23. Усовершенствуйте процедуру convert из задачи 21 так, чтобы любое некорректное значение даты отвергалось. В каких случаях исходную строку, определяющую дату, можно считать некорректной?
♦	24. Пусть задан текст, представляющий собой последовательность строк. Признак конца текста вводится пользователем. Выведите на печать количество каждой из содержащихся в строке латинских и русских прописных букв в порядке частоты их появления.
♦	25. Пусть задан текст, представляющий собой последовательность строк. Признак конца текста вводится пользователем. Выведите на печать заданный текст в порядке возрастания длин строк.
♦	26. Пусть текст представляет собой последовательность строк. На каждой строке находится имя, фамилия и отчество. Распечатайте все отчества по алфа-, виту, а также текст, содержащий строки, состоящие только из имен и фамилий.
*	27. Пусть задано десять русских имен. Проверьте, все ли эти имена написаны .... с прол иеной буквы; если нет, то исправьте ситуацию.
Глава 12
Записи,оператор присоединения
Теоретические вопросы
1.	Верно ли, что запись относится к структурированным типам данных?
2.	Дайте определение поля записи.
3.	Верно ли, что поля записи должны иметь один и тот же тип?
4.	Как осуществляется ссылка на компоненты записи?
5.	Может ли компонент записи быть помечен более чем одним именем?
6.	Может ли типом поля записи быть массив?
7.	Могут ли записи иметь вложенную структуру?
8.	Каков максимально допустимый уровень вложенности записей?
9.	Могут ли во вложенных записях имена полей повторяться на разных уровнях вложенности?
10.	Верно ли, что значения переменных типа запись можно присваивать переменным того же типа?
11.	Могут ли совпадать имена полей различных записей?
12.	Могут ли совпадать имена полой одной и той же записи?
13.	Как можно оценить объем памяти, необходимой для хранения записи?
14.	Можно ли значения полей записи использовать в выражениях?
15.	Дайте определение составного имени. Из каких частей оно состоит и как записывается?
16.	Чем запись отличается от массива?
17.	Какой оператор используют для упрощения доступа к полям записи?
18,	Когда применяется запись с вариантами?
19.	Из каких частей состоит запись с вариантами?
20.	Сколько вариантных частей может быть в любой записи с вариантами?
т« 1лщ ix. записи. оператор присоединении
2L Верно ли то, что вариантная часть расположена за всеми фиксированными нолями?
22,	Что такое поле признака? Для чего оно используется в записи с вариантами?
23.	Как описываются компоненты каждого варианта записи?
24.	Сколько вариантов может иметь вариантная часть записи?
25.	Как можно оценить объем памяти, выделяемой для записи с вариантами?
26.	Почему в вариантной части записи не ставится слово end, закрывающее оператор case... of?
: 27. Верно ли, что ключ выбора должен быть стандартным или предварительно объявленным порядковым типом?
j. 28. Как влияет ключ выбора на количество следующих ниже вариантных полей? / 29. Можно ли ключу выбора в исполняемой части программы присвоить неко-£': торое значение и таким образом повлиять на выбор полей?
й 30. Пусть Zap — переменная типа запись, состоящая из нескольких полей. Мож-? но ли инициализировать значение этой переменной с помощью стандартной I процедуры ввода read (р) ?
р31'. Верно ли, что все поля записи должны быть разных типов?
132. Почему при описании записи ее поля могут перечисляться в любом порядке? К33. Верно ли, что назван ня полей записи могут совпадать с именами переменных, f констант и других объектов программы, но не могут совпадать с названиями р полей других записей?
f 34. Почему при обращении к полю записи имя поля должно указываться явно и не может быть задано в виде выражения?
Задачи, упражнения, программы
1.	Опишите комбинированный тип для определения следующего понятия:
а)	цена в рублях и копейках;
Ь)	время в часах, минутах и секундах;
с)	дата (число, месяц, год);
d)	адрес (город, улица, дом, квартира);
е)	семинар (предмет, преподаватель, номер группы, день недели, часы занятия, аудитория);
 f) бланк требования на книгу (сведения о книге: шифр, автор, название; сведения о читателе: номер читательского билета, фамилия, дата заказа);
• g) экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 строчек с полями: фамилия студента, номер его зачетной книжки, экзаменационная оценка).
лвдачи, упражнения, программы
2. Опиши тс следующее понятие в виде массива или записи, а если возможно, то и в том и другом виде:
а)	обозначение поля шахматной доски (а5, h8 и т. п.);
Ь)	комплексное число;
с)	точка в 50-мерном пространстве.
3. Пусть дан фрагмент программы:
type
точна! - array [ (х, у) ] of real;
точка2 - record
х. у: real
end:
var
pl: точка!;
p2: точка2; d; real;
а)	объясните, почему допустим данный раздел типов, хотя в нем одними и теми же именами (х и у) обозначены разные объекты (индексы и поля);
Ь)	присвойте переменной d значение расстояния между точками pl и р2;
с)	подумайте, допустимы ли конструкции pl[succ(x)] и 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:
Г1^
c)	with К, центр do
begin
радиус ;- 2.5;
X 0;
у- 1.8 end:
d)	with центр. К do begin
радиус ; = 2.5;
x 0:
У ; = 1.8 end;
Используя следующий фрагмент программы, опишите логическую функцию Бьет С К1, К2, КМ), проверяющую, «бьет» ли карта К1 карту К2, с учетом того, что масть КМ является козырной.
type
масть «= (пики, трефы, бубны, червы):
достоинство - (шесть. семь, восемь, девять,
десять, валет, дама, король, туз);
карта = record
м: масть;
д: достоинство end:
Используя следующий фрагмент программы, опишите логическую функцию ПравильныйРяд(г), которая проверяет, правильно ли выставлены кости домино в ряду г (равна ли правая цифра очередной кости левой цифре следующей кости).
type
КостьДомино = record
левая, правая: 0 .. 6 end;
ряд = array [1..28] of КостьДомино;
Используя следующий фрагмент программы, опишите перечисленные ниже функции:
type
поле = record
вертикаль: (a. b. с. d. е, f. g. h);
горизонталь; 1 .. 8 end:
а)	функция ХодСлона(п1. п2) проверяет, находится ли фигура с поля п2 под боем у слона, который стоит на поле nl;
Ь)	функция ХодЛадьи(nl. п2. пЗ) проверяет, может ли ладья за один ход перейти с поля nl шахматной доски на поле п2. Если нет, надо указать промежуточное поле пЗ, через которое ладья может попасть на поле п2 за два хода;
с)	функция ХодКоня(п1, п2) проверяет, можно ли конем с поля nl объявить шах, если король находится на поле п2;
d)	функция ХодФерзя (nl, п2) проверяет, может ли ферзь за один ход перейти с поля nl шахматной доски на ноле п2.
8. Используя следующий фрагмент программы, найдите самую длинную реку из списка С и напечатайте ее название.
type
строка - array [1..15J of char;
река  record
название: строка: длина: Integer end;
список = array [1..3Q] of река;
9. Пусть дан фрагмент программы. Используя оператор присоединения, присвойте переменной Лдр1 значение, соответствующее адресу: Воронеж, ул. Остужева, д, 1, кв. 70. Кроме того, переменной Адр2 присвойте такое же значение, заменив в нем номер квартиры на 99.
type
строка - array [1..15} of char;
адрес - record
город, улица: строка:
дон, квартира: 1..999
end;
var Адр1. Адр2: адрес;
10.	Определите комбинированный тип для представления анкеты школьника, включающий в себя его возраст, номера школы и класса и оценки по каким-либо пяти предметам. Опишите некоторую переменную данного типа и присвойте ей значение, соответствующее следующей анкете: Петров Иван Ильич, 16 лет, 194-я школа, класс 9б, оценки: 5,3,4, 5,2.
11.	Используя следующий фрагмент программы, опишите перечисленные н иже функции:
type
имя - (Аня, Валя. Женя. Петя.
Саша. Таня, Щура. Юра):
данные = record
пол: (муж. жен);
рост: 140.200
end:
группа = array [имя] of данные:
	а) функция Сред Рост ( ГР ) определяет средний рост женщин из группы ГР;
	Ь) функция Высокий( ГР ) определяет имя самого высокого мужчины из группы ГР;
с	) логическая функция ОдинРост ( ГР ) проверяет, есть ли в группе ГР хотя бы два человека одинакового роста.
12.	Используя следующий фрагмент программы, опишите процедуру Ирон ияСудь -бы( С ), которая печатает фамилии двух (любых) жителей из списка С, живущих в разных городах по одному адресу.
type
строка = array [1..20] of char;
житель - record
фамилия, город: строка;
адрес; record
улице; строка: don. квартира: 1..999
end end;
var
список: array [1..15J of житель;
13.	Используя следующий фрагмент программы, опишите перечисленные ниже ; процедуры:
type
строка - array! 1. .16] of char: -
дата - record
число: 1..31;
яесяц: 1..12: год: 1901..1997 end:
анкета = record
фамилия г строка: пол : (муж. жен); день рожд ; дата end;
группа = аггау[1..25] of анкета;
а)	процедура Старший(Гр, Фаи) присваивает строке Фан фамилию самого старшего мужчины из группы Гр (считать, что такой есть и он единственный);
Ь)	процедура Печать (Гр, Бук) печатает все фамилии людей из группы Гр, начинающиеся с литеры Бук, и даты рождения этих людей.
И4. В массиве содержится информация о зимней сессии 3-го курса. Сведения о каждом студенте (максимальное число студентов —150) содержат следующие данные: фамилию (до 12 символов), номер группы (от 1 до 7), оценки по трем предметам (функциональный анализ, численные методы и экономика соответственно). Напишите программу, которая вводит эту информацию и печатает следующие данные:
а)	фамилии студентов, имеющих задолженность хотя бы по одному предмету;
Ь)	процент студентов, сдавших все экзамены на 5 и 4;
с)	название предмета, который был сдан лучше всего;
м, d) номера групп в порядке убывания средней успеваемости их студентов. Kt 15, Сведения о студентах вуза записаны в массиве и содержит следующую ин-p.	формацию: фамилия, имя, отчество, пол (М или Ж), возраст (от 16 до 35),
х	курс (от 1-го до 5-го). Напишите программу, которая вводит эту информа-
5	цию и печатает следую]цие данные:
£ а) номер курса, на котором наибольший процент мужчин; у
Ь)	самые распространенные мужские и женские имена;
с)	фамилии (в алфавитном порядке) и инициалы всех студенток, возраст и отчества которых являются одновременно самыми распространенными.
16. Пусть дан фрагмент программы:
type
?	complex  record
re, im: real end;
point - record
x. y: 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.im -W.iffl;
with p do begin x := re;
У := 2 end;
17,	Используя следующий фрагмент программы, опишите перечисленные ниже подпрограммы:
type
рац = record числ: integer; знак: l..maxint end;
массив = array[1..20] of рац;
а) логическая функция Рав но( а, b ) сравнивает два рациональных числа а и Ь;
 Ъ) процедура Слож( а. Ь ) складывает рациональные числа а и Ь;
с) процедура Сокр( г ) приводит рациональное число г к несократимому виду;
d) процедура Мах( х, m ) присваивает параметру п наибольшее из рациональных чисел массива х.
18.	Используя следующий фрагмент программы, опишите процедуру Value( р, х, у ), которая вычисляет у — значение квадратного трехчлена ах2 +Ьх+с с коэффициентами из р в комплексной точке х.
type complex = record re, Im; real end; coeff = record
a. b. c : complex { a<>0 }
end:
19.	Пусть длин комплексное число z (пара вещественных чисел) и иеществен-нос число с > 0. Вычислить с точностью Е значение следующей комплексной функции:
а) ег	Z 22 = 1+ — +	 1! 2!	M z и!
♦b) sh	z3 Z =Z +	h 3!	zs	zM +... +	4-..., 5!	(2rt + l)l
♦ с) ch	z2 Z- Z 4	1- 2!	z	z2" + ... + +... , 4!	(2л)!
♦d) sin	N II N 1 -I-	z5	( (-1)Лг2и+1 (
		5! '**	(2k + 1)1 +”'
♦е) cos	I 1 N> II N	z4	(-l)’z2” I-		+ ...; 4!	(2«)1
2	3	7п
•f) 1п(14-г) = г-^ + |--... + 1	£ +...	(|z|<l);
Р ♦g)aretgz=z-y+--...+ (—i	+ ... (М.;1)
20.	Используя следующий фрагмент программы, опишите перечисленные ниже подпрограммы:
const
MaxN = 30:
type
ВещТип я record
знак: boolean:
мантисса, порядок: real: end;
список = arreytl..MaxNJ of ВещТип;
•а) функция MaxNeg(C) предназначена для нахождения минимального отрицательного числа из списка чисел С;
Ь) функция MaxDI (С) предназначена для нахождения максимального порядка числа из списка вещественных чисел С;
с) процедура Equal Dec (С. р) приводит все числа из списка С к единому порядку р.
21.	Используя следующий фрагмент программы, опишите процедуру ДП(с1. р), преобразующую координаты точки на плоскости из декартовых d в полярные р, и процедуру ПД(р. d), выполняющую обратное преобразование.
type декарт = record х. у: real end;
IIOJIHp •
record
r, fl: real { r ? 0. -p < fi ? p }
end:
♦22. Используя следующий фрагмент программы и считая, что все даты даются по григорианскому календарю (в «новом стиле»), опишите перечисленные ниже функции:
type
число = 1. .31;
месяц = 1..12;
год - 1..2000;
дата = record
ч: число:
и: месяц: г: год end;
ДеньНедели = (пн. вт. ср. чт. пт, сб. вс);
а)	функция ПослЧисло((1) вычисляет количество дней в том месяце, которому принадлежит дата d;
b)	логическая функция ВернаяДата(б) проверяет правильность даты d;
с)	функция ЧислоДней^) подсчитывает, сколько дней прошло с 1 января 1 -го года нашей эры до даты d;
d)	функция flH(d) предназначена для определения дня недели, на который приходится дата d (учтите, что 1 января 1-го года нашей эры было понедельником);
е)	функция Пятиица!3(d) определяет количество дней до даты d, которые были пятницами 13-го числа.
23. Пусть дан массив, содержащий даты. Каждая дата — это число, месяц, год. Найти:
а)	год с наименьшим номером;
Ь)	все весенние даты;
с)	самую позднюю дату.
24. Сведения об ученике состоят из его имени и фамилии, названия класса (года обучения и буквы), в котором он учится, оценок, полученных учеником за последнюю четверть. Пусть дан массив, содержащий сведения об учениках школы:
•	а) выясните, имеются ли в школе однофамильцы;
•	Ь) выясните, имеются ли однофамильцы в каких-либо параллельных классах;
	с) ответьте на первые два вопроса, но в отношении учеников, у которых совпадают и имя и фамилия;
	d) выясните, в каких классах насчитывается более 15 учащихся;
	е) выясните, на сколько человек в восьмых классах больше, чем в десятых;
♦	f) соберите все сведения об учениках 9-х и 10-х классов, упорядочив их по году обучения и букве;
•	g) выясните, сколько учеников школы имеют оценки не ниже «четырех»;
	h) сформируйте массив из лучших учеников школы, то есть из учеников, нс имеющих отметок ниже «четырех» и по сумме баллов не уступающих другим ученикам своего и параллельных классов;
	i) проверьте правильность заполнения массива: всегда ли Тод обучения лежит в пределах от 1 до 11.
	25. Багаж пассажира характеризуется количеством вещей и общим весом вещей. Пусть дан массив, содержащий информацию о багаже нескольких пассажиров: а) найдите багаж, средний вес каждой вещи которого отличается не более чем на 0,3 кг от среднего веса вещей всех пассажиров;
Ъ)	найдите число пассажиров, имеющих более двух вещей, и число пассажиров, количество вещей которых превосходит среднее число вещей;
с)	определите, имеются ли два пассажира, багажи которых совпадают по числу вещей и отличаются по весу не более чем на 0,5 кг;
d)	выясните, имеется ли пассажир, багаж которого превышает багаж каждого из остальных пассажиров и по количеству вещей, и по весу;
е)	выясните, имеется ли пассажир, багаж которого состоит из одной вещи весом не менее 30 кг;
! f) дайте сведения о багаже, число вещей в котором не меньше, чем в любом другом багаже, а вес вещей не больше, чем в любом другом багаже с этим же количеством вещей;
g) упорядочьте сведения о багаже по невозрастанию веса багажа;
h) удалите сведения о багаже, общий вес вещей в котором меньше чем 10 кг.
»26. Пусть дан массив, содержащий сведения о книгах. Сведения о каждой книге — это фамилия автора, название и год издания:
а)	найдите названия книг данного автора, изданных с 1977 года;
Ь)	определите, имеется ли книга с названием «Информатика»; если да, то .	сообщите фамилию автора и год издания книги, если таких книг несколь-
ко, то сообщите имеющиеся сведения обо всех этих книгах.
; *27. Пусть дан массив, содержащий сведения об экспортируемых товарах: указы-
	вается наименование товара, страна, импортирующая товар, и объем постав-
ляемой партии в штуках. Составьте массив стран, в которые экспортируется товар (наименование задается пользователем), и общий объем его экспорта.
28. Пусть дан массив, содержащий сведения об игрушках: указывается название игрушки (например, кукла, кубики, мяч, конструктор и т. д.), ее стоимость в копейках и возрастные границы детей, для которых игрушка предназначена (например, для детей от 2 до 5 лет). Получите информацию:
♦	а) о названиях игрушек, цена которых не превышает 4 рублей и которые подходят детям до 5 лет;
	Ь) о цене самого дорогого конструктора;
♦	с) о названиях наиболее дорогих игрушек (цена которы х отличается от цены самой дорогой игрушки не более чем на 1 рубль);
Звдвчи, упражнения, программы ТЗТ
♦	d) о нашалнях игрушек, которые подходят как детям 4 лет, так и детям 10 лет;
♦	е) о делах всех кубиков;
♦	f) можно ли подобрать игрушку, любую, кроме мяча, подходящую ребенку 3 лет, и дополнительно мяч так, чтобы суммарная стоимость игрушек не превышала 5 рублей;
♦	g) имеется ли мяч ценой 2 рубля 50 копеек, предназначенный детям от 3 до 8 лет; если да, то выведите сведения об этой игрушке.
!. *29. Пусть даны два массива М1 и М2. Массив М1 — это инвентарный массив, содержащий сведения о том, сколько изделий каких видов хранится на складе (вид продукции задается ее порядковым номером). Массив М2 — это вспомогательный массив, содержащий сведения о том, на сколько уменьшилось или увеличилось количество изделий по некоторым видам продукции. Вспомогательный массив может содержать несколько сведений по продукции одного вида или не содержать такого сообщения. Обновите инвентарный массив на основе вспомогательного.
I
 *30. Пусть дан массив, содержащий сведения о претендентах на руку и сердце. Сведения могут содержать следующие данные: фамилию, имя, отчество, возраст, рост, цвет глаз, цвет волос, зарплату, наличие квартиры, наличие машины и т. п. Сформулируйте несколько критериев, по которым претенденты будут отбираться. Напишите программу, предназначенную для ввода данных о претендентах и печати сведений о наиболее подходящих кандидатах в зависимости от того или иного критерия,
♦31. Пусть дан массив, который содержит сведения о продаваемых квартирах. Сведения могут содержать следующую информацию: общая площадь, жилая площадь, площадь кухни, наличие санузла и его характеристики (совмещенный или нет), наличие лоджии, панельный или кирпичный дом, общее количество этажей в доме, этаж, на котором расположена квартира, район, в котором она находится, адрес, стоимость квартиры и т. п. Сформулируйте несколько критериев, по которым можно отобрать ту или иную квартиру для покупки и, основываясь на этих критериях, выведите сведения о ней. Если подходящих квартир несколько, то выведите сведения обо всех.
♦32. Пусть дан массив, содержащий сведения о жителях, обслуживаемых данной поликлиникой. Сведения содержат следующую информацию: фамилию, имя, отчество жителя, адрес, место работы, наличие прививки от дифтерии, дату прохождения последней флюорографии:
а)	напечатайте фамилии и адреса тех жильцов, которые не сделали прививку от дифтерии;
Ъ)	сформируйте массив с данными о жильцах, у которых на данный момент просрочена дата флюорографии (дата просрочена, если с ее момента прошло больше года).
♦33. Сведения о каждой машине включают в себя следующую информацию: модель (строка длиной 10 символов), номер (код региона, цифровой код, буквенный код), цвет, сведения о владельце (фамилия, имя, отчество), дата последнего техосмотра:
10Ж ГЛЙЯА lif 31ПИ0И, onepiiop ПрИСОйДИНвНИЯ
а)	выберите данные обо всех машинах, не прошедших техосмотр в теку те; соду;
Ь)	напечатайте информацию обо всех владельцах «Волг» черного цвета;
с)	по номеру машины выдайте всю имеющуюся информацию о ней.
34. Пусть дан фрагмент программы:
type
Строка *= array [1. .20] of char:
ДеньНедели = (пн. вт. ср. чт, пт. сб. вс);
Время и record
часы; 0..23;
минуты: 0..59
end;
Семинар = record
предмет, преподаватель; Строка:
•	день: ДеньНедели;
?'	часы: record
начало, конец: Время
end;
номер^Группы; 1,.300;
-j	аудитория: Integer;
end:
а)	напечатайте расписание группы с номером п;
Ь)	опишите логическую функцию РасписаниеНеВерно, которая проверяет, не: ли «накладок» (одновременно проходят занятия у разных преподавате лей в одной и той же аудитории или один преподаватель ведет занята* в разных аудиториях в одно и то же время);
с)	напечатайте названия предметов, которые ведет преподаватель с фамилией Fam;
d)	выясните, в какое время проходит больше всего занятий;
е)	определите, есть ли занятия по субботам;
f)	определите, сколько преподавателей ведет занятия у группы с номером го;
g)	напечатайте названия тех предметов, занятия по которым проводятся по средам;
h)	определите количество занятий в неделю по каждому из предметов.
35. На факультете ПММ ВГУ существует две специализации: прикладная математика (номера групп с 1 -го по 6-й) и механика (группа 7). Сведения о преподавателях имеют следующий вид:
const
Кол_воЛрегтодавателей = 100;
type
Г рулпа = 1..7;
Груплы__курсв = array [Группа] of boolean:
Группы_факультета = array[l.,5] of Группы_курса;
Преподаватель = record
ФИО: string;
Специализация: (математика, механика): { Обучаемые преподавателем группы }
Задачи, упражнения, программы 133
Спмсон^групп: Группы_факультета
end:
Все_преподавателм = array [1..Кол^воПрелодавателей]
of Преподаватель:
а)	найдите всех преподавателей, которые ведут занятия только у студентов со специализацией «механика»;
Ь)	посчитайте количество преподавателей, у которых количество обучаемых групп максимально;
с)	напишите логическую функцию, которая определяет, есть ли преподаватель, ведущий занятия только в одной группе, и, если такой есть, выведите его фамилию;
d)	напечатайте фамилии преподавателей, которые ведут занятия у студентов 2-го курса по обеим специальностям;
е)	выясните, есть ли преподаватели, которые ведут занятия у групп со специализацией, отличной от собственной.
36.	Точка задается своими координатами, которые могут быть полярными или декартовыми. Напишите функцию, которая определяет расстояние между двумя точками.
37.	Пусть дан фрагмент программы:
type
Person = record
Surname.
Name,
Address,
City: string [20];
Post_1ndex: 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;
Ь)	посчитайте количество людей, которые увлекаются музыкой;
с)	напечатайте данные обо всех различных музыкальных инструментах, которые есть в списке Li st.
18.	Пусть дан фрагмент программы:
type
tFigure = (circle, rectangle, triangle);
tColor = (red, green, blue);
Ped nt. =	record
x. y: real
end;
1 тем 11, Шпион, ontpltop присоединения
Figures - record
color; tColor;
case FigureType: tFigure of circle: (center: point;
radius : real ):
rectangle: (si. s2 : point):
triangle: (tl. tZ, t3: point)
end:
tL1st - array [1..20] of Figures;
var
List; tllst;
Определите:
♦	а) суммарную площадь всех фигур;
*	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.	Каково назначение операций «больше или равно», «меньше или равно», примененных к данным множественного типа?
ise Птил 13. Множеств
21.	Что называется объединением множеств?
22.	Что называется пересечением множеств?
23.	Что называется разностью множеств?
24.	Верно ли, что спецификациями элементов конструктора множеств могут быть константы или выражения базового типа, а также тип диапазон того же базового типа?
25.	Может ли конструктор множества стоять в правой части оператора присваивания?
26.	Можно ли конструктор множества использовать в выражении?
Упражнения, задачи, программы
 1. Пусть дан фрагмент программы.
type
bits = set of 0.. 1;
var
x: bits;
y: set of ( a. b. c );
?s	z: set of '! ’. ' ’';
Определите:
а) базовый тип каждого из указанных множественных типов;
i л	b) сколько и каких значений может принимать каждая из переменных х, у и z.
«2. Если в базовом типе п различных значений, то сколько различных значений в построенном на его основе множественном типе?
t 3. Пусть дай фрагмент программы:
«. type ДеньНедели - ( пн. вт, ср. чт. пт, сб, вс );
Опишите множественный тип, включающий в себя множества из перечисленных ниже элементов:
а)	названия любых дней недели;
Ь)	названия рабочих дней недели.
4. Какие из следующих описаний не верны и почему?
type
точки = set of real;
байт = array [ 1..8 ] of 0..1:
данные = set of байт;
месяц = ( янв, фев. мар. апр, май. июн, июл, авг, сен. окт, ноя. дек );
Ml = set of месяц;
М2 = set of июн..авг;
М3 = set of дек..фев;
M4 = set of ( июн. июл, авг ):
5. Какие из следующих конструкций являются множествами (в смысле языка Паскаль), а какие нет?
а)	[ 7. 15. 2. 4 ];
Ь)	[ 3 .. 9, 12. 45 ];
с)	[ 7 ..15 , 9 .. 25 ];
Упражнения, задачи, программы 137
<1) [ '!' .. ’ 11 ];
е)	[ 1 .. 1 ];
f)	[ true .. false ];
g)	[. 3 •. sqrt( 25 ) ];
h)	[	*>’ ];
i)	[ [ ]. E 5 ] ];
j)	[ odd( П 0<2 ].
6. Пусть дан фрагмент программы:
var
р: set of 0..25;
1,	j: Integer;
a)	p := [ 1 + 5. j div 3T j .. sqr( 1 ) - 8 ];
b)	p - [ i .. 3*j 1;
с)	p C 1. j. 5*i. 3*j ].
Если I = 4 и j “ 7, то какие значения получит переменная р при выполнении перечисленных ниже операторов присваивания:
7. Пусть дан фрагмент программы:
var
s: set of char;
C, d: Char;
Присвойте переменной s перечисленные ниже множества:
а)	пустое множество;
Ь)	множество из строчных гласных латинских букв (а, е, i, о, и);
с)	множество из всех цифр;
d)	множество литер, которые больше с, но меньше d(c< d).
8.	Вычислите значения отношений:
а)	[ 6 ] <> [ 6, 6. 6 ];
Ь)	[ ‘1‘, ’8’ ] = [ ’8’. Г ];
с)	[ 6, 7. 8 ] = [ 6 .. 8 ];
d)	[	п‘,	'п‘ ] - L *п'	..	'лГ	];
е)	[	1. 7	] <= [	1 ..	9	];
f)	t	2. 5	.. 8 ]	<= [	1	..	6, 9	1;
g)	[	] <=	[ 0 ..	9 ];
h)	’д’ in [ ’а' .. z‘ ];
i)	trunct 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 ).
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	X	5. 7	];
c)	[ 4. 6. 8	H	5. 7	];
d)	[ 7 ,. 12	]+[	9 ,.	18	];
e)	[ 7 .. 12	X	9 ..	18	];
	f)	[	7	..	12 X	9	..	18 1;
У.	g)	[	4,	7	x	1	..	9	];
t	h)	[	4.	7	X	1	..	9	];
|	i)	[	4.	7	M	1	..	9	];
|' j) [ J+[ 23 ];
k) [ ]*[ 23 ];
|,	1) [ M 23 ].
£• 12, Вычислите значения выражений:
a) [ 2 .. 13 X 3,13.. 60 X 4 .. 10 ]-[ 5 .. 15 X 6 ];
t	b) [ 2 .. 10 ]-[ 4. 6 ]-[ 2 .. 12 x 8 .. 15 ];
Г	c) ( [ ’O' .. ’7' X ’2' .. ’9' ] X [ ’a’ X ‘z’ ]).
£ 13. Упростите (4 и В — множества):
Р	а)Л*В-Л;
|	Ъ)Л-(Л-В);
;i;	с) (л + в)-<л-в)-(в-л);
t	d) (А-В) + (В-Л) + А*В.
*14. Пусть дан фрагмент программы. Присвойте переменной В множество, полученное из А перечисленными далее способами:
var
А. В: set of char;
х: char;
Упражнения, задачи, программы 139
а)	добавлением элемента х;
Ъ)	удалением элемента х,
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 then а:ш b + x else
if ord (x) in a - b
then a;- a - [ x..]:
f;- a + b end;
16.	Пусть дан текст. Посчитайте общее число вхождений английских букв в текст.
17.	Пусть дан текст. Верно ли, что в нем имеются буквы, входящие:
а) в слово «шина»;
♦Ь) в слово, задаваемое пользователем?
18.	Напишите процедуру, которая осуществляет ввод текста, состоящего из неповторяющихся букв.
И9. Пусть дан текст. Распечатайте те буквы, которые встречаются в каждом слове текста только один раз.
•20. Пусть дан текст. Найдите наибольшее количество цифр, идущих подряд.
21. Пусть вводится последовательность символов длиной не более 4. Если все вводимые символы — цифры, то выполните преобразование данной последовательности в целое число.
22. Пусть дан текст. Определите, содержит ли он символы, отличные от букв и пробелов.
23.	Пусть дан фрагмент программы. Опишите процедуру Pri nt(А), печатающую в алфавитном порядке все элементы множества А типа TLetter.
type TLetter = set of ‘ a ’.. ’ z';
24.	Пусть дан текст, состоящий из строчных латинских букв и цифр. Определите, каких букв — гласных (а, е, i, о, и) или согласных — больше в этом тексте.
25.	Пусть дан текст, оканчивающийся точкой. Напечатайте:
♦	а) первые вхождения символов в текст, сохраняя их исходный порядок;
*	Ъ) символы, входящие в текст не менее двух раз;
с) в порядке появления символов, входящих в текст только один раз;
♦	d) символы, входящие в текст только один раз, в порядке их кодов.
26.	Пусть дана непустая последовательность слов из строчных русских букв. Между соседними словами присутствует запятая, за последним — точка. Напечатайте в алфавитном порядке:
♦	а) гласные буквы, которые входят в каждое слово;
	Ь) согласные буквы, которые не входят ни в одно слово;
	с) все звонкие согласные буквы, которые входят хотя бы в одно слово;
♦	d) все глухие согласные буквы, которые не входят хотя бы в одно слово;
T4U Пита 13- Множен: гии
♦	с) все глухие согласные буквы, которые не входят только в одно слово;
О все звонкие согласные буквы, которые входят более чем в одно слово;
♦	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. Пусть дан фрагмент программы. Опишите функцию Card(A), подсчитывающую количество элементов во множестве А типа М. Например, Card([5, 8. 23] >3.
type М = set of 1..99;
32. Пусть дан фрагмент программы. Опишите функцию SumCA. SI, S2), вычисляющую сумму тех элементов матрицы А, номера строк и номера столбцов которых принадлежат соответственно непустым множествам S1 и S2 типа num,
const n = 10;
type
number = 1., n;
matrix = 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 NaWig - 1..Maxint;
а) функция Digit (п) подсчитывает количество различных значащих цифр в десятичной записи числа;
•Ь) процедура Print(п) печатает в возрастающем порядке все цифры, не входящие в десятичную запись числа п.
36.	В возрастающем порядке напечатайте все целые числа из диапазона 1... 10 ООО, представимые в виде n2 + т2, где тп, п > 0.
♦37. В порядке убывания напечатайте все целые числа из диапазона 1...4900, которые представимы в видел2 + 2А’2, но не представимы в виде 7ij +j + 3 (nt k, ij > 0).
38. Пусть дан фрагмент программы. Онишите процедуру Наличие(Ma г, А, В, С), которая по информации из массива Маг типа магазины присваивает параметрам А, В, С типа ассортимент значения, перечисленные ниже.
type
продукт = ( хлеб, масло, молоко, мясо, рыба, соль, сыр. колбаса, сахар, чал, кофе ); ассортимент = set of продукт:
магазины = array [1..20] of ассортимент;
а)	А — продукты, которые есть во всех магазинах;
Ь)	В — продукты, которые есть хотя бы в одном магазине;
с)	С — продукты, которых нет ни в одном магазине.
39. Пусть дан фрагмент программы. Опишите логическую функцию Везде (ГР), определяющую, есть ли в группе ГР хотя бы один человек, побывавший в гостях у всех остальных из группы (ГР[х] — множество людей, побывавших в гостях у человека с именем х; х £ ГР[х]).
type
имя “ ( Вася, Володя, Ира. Лида, Марина, Миша. Наташа, Олег, Оля, Света. Юля ): гости - set of имя;
группа - array [ имя ] of гости:
♦40. Пусть дан фрагмент программы. Опишите процедуру МомноПопас т ь (Р, И, К), которая по рейсам Р (Р[х] — множество городов, в которые можно за один рейс доехать из города х) определяет К — множество городов, в которые можно попасть автобусом (за один рейс или через другие города) из города Н.
type
город = ( a ,b ,с ,d ,е ,f , g, h );
города = set of город;
рейсы = array [город] of города;
41. Вычислите определитель заданной квадратной матрицы А к-го порядка (п = 15), используя формулу:
я
det^) = £(-I)*'O|rdet(4),
Jt=]
142 Пшм 13. Множества
где Ak — матрица, получен нал удалением первой строки и А-го столбца. Для этого определите рекурсивную функцию от параметров / и которая по формуле вычисляет определитель матрицы, полученной из Л удалением первых I строк и всех столбцов, номера которых принадлежат множеству $.
Задания для самостоятельной работы
1.	Составьте программу вычисления суммы номеров мест, на которых в слове 5 стоят гласные буквы.
2.	Пусть вводится последовательность чисел в диапазоне от 1 до 255. Признак конца последовательности — 0. Определите переменные ml п и max как минимальное и максимальное из введенных чисел. Напечатайте по одному разу все числа из интервала (min, тех), которые не были введены.
3.	Пусть вводится последовательность символов. Признак конца последовательности — точка. Напечатайте все латинские буквы, которые есть в данной последовательности символов.
4.	Пусть задана произвольная последовательность символов. Признак конца последовательности — точка. Напечатайте те символы, которые встречаются в данной последовательности более одного раза.
5.	Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделенных пробелами. Слова представляют собой произвольную последовательность символов, отличных от пробела. Напечатайте все слова, которые со-
 стоят из тех же литер, что и последнее слово текста.
* 6. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен-ных пробелами. Слово представляет собой последовательность латинских букв. Напечатайте те слова, в которые не входит ни одна из букв первого слова.
7.	Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделенных пробелами. Слово — последовательность русских букв (как строчных, так и прописных). Напечатайте слова, имеющие четный номер, которые состоят только из повторяющихся букв.
8.	Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделенных пробелами. Слово — последовательность латинских букв. Напечатайте слова текста, имеющие нечетный номер, в которых нет ни одной повторяющейся буквы.
9.	Пусть задана целочисленная квадратная матрица размерности п. Напечатайте все значения i (1 < i < п), при которых i-я строка симметрична, а i-й столбец упорядочен по убыванию.
10.	Пусть задана целочисленная квадратная матрица размерности п. Элементы матрицы находятся в диапазоне от 1 до 100, Напечатайте все цифры из заданного диапазона, которых нет ни в одной из строк заданной матрицы.
ill. Пусть задана целочисленная квадратная матрица размерности п. Известно, j что значения элементов матрицы не меньше 0 и не больше 30. Напечатайте
i
овдднин для самостоятельней ptiuuiu
 чв
номера тех строк матрицы, которые содержат все целочисленные элементы, лежащие в диапазоне от минимального элемента рассматриваемой строки до ее максимального элемента. Например, рассмотрим строки матрицы размерности 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, которые представимы в виде 5n + 7 т, где п и т — целые числа (т, п > 0).
15.	Напечатайте все целые числа в диапазоне от 1 до 3600, которые представимы в виде к2 + т2, но которые нельзя представить как 5/ + 5k (m, n,k,l> 0).
16.	Напечатайте все целые числа в диапазоне от 1 до 1600, которые представимы в видел'2 + у2, но которые нельзя представить в видедл/ = с2, где с изменяется от 1 до 5.
17.	Пусть заданы п отрезков с целочисленными координатами концов. Координаты концов находятся в диапазоне от 0 до 100 включительно. Определите, существует ли точка с целочисленными координатами, которая принадлежит всем этим отрезкам.
18.	В классе учатся 25 учеников. Каждому ученику были выставлены оценки за четверть по 15 предметам. Определите, сколько в классе отличников, хорошистов и троечников.
19.	Известны результаты анкетирования ста человек. Анкета состоит из 150 пунктов, на которые предлагалось ответить утвердительно, отрицательно или «нет определенного мнения по данному вопросу». Напечатайте номера тех пунктов анкеты, на которые были получены только утвердительные и только отрицательные ответы всех опрошенных (если, конечно, такие пункты есть).
20.	В городе N имеется 100 кондитерских магазинов. Известно, что в каждом из этих магазинов не более 20 видов сластей в ассортименте. Какие виды сластей есть во всех имеющихся магазинах? Существует ли магазин, торгующий уникальной продукцией? Перечислите 5 видов сластей, которые есть в большинстве магазинов города N(ассортимент кондитерских магазинов рассматривайте как данные перечислимого типа).
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, а в ка ких fal se при чтении файла и при записи?
19,	Может ли файл не содержать ни одной записи? Если может, то как об этом узнать?
20.	В чем отличие процедур read и write?
21.	Каково назначение операции close?
22.	Что делает следующая программа? program Whatlslt: var
f: file of Integer:
i: integer; begin
reset( f ); while not eof( f ) do begin
read( f, i ); writeln( i ) end;
close(f) end. (Whatlslt)
Каковы действия программы в случае пустого файла f? Изменится ли смысл программы, если использовать следующий цикл?
repeat read( f, i ); writelnf 1 ) у	until eof( f ):
£23. Пусть дано описание файла. Можно ли из описания определить, какие опе-/ рации (чтение, запись) над этим файлом разрешены?
£24. Пусть файл открыт для записи. Можно ли по состоянию флага eof(f) опре-& делить, была ли сделана хотя бы одна запись в файл f ?
Г
Упражнения, задачи, программы
' 1. Создайте файл целых чисел/. Числа считываются из стандартного устройства ввода. Признаком конца ввода является число 9999.
5*2. Создайте файл целых чисел, занося в него числа Фибоначчи, не превос-v- ходящие заданного числа W.
*3. Пусть даны два файла целых чисел / и/2. Найдите в файле/2 число, самое близкое по величине к минимальному значению файла /Р
*4. Пусть даны два файла целых чисел. Определите, в каком из них больше по-ложительных, отрицательных и нулевых значений.
^5. Пусть дан файл целых чисел. Определите, являются ли числа в файле упоря-i дочеиными по возрастанию.
гб. Пусть дан файл целых чисел. Определите, являются ли числа в файле уиоря-I доченными (по возрастанию или по убыванию).
17. Пусть дан файл, хранящий последовательность целых чисел. Определите, I является ли последовательность знакопеременной.
Упражнения, задачи, программы 147
8. Пусть дан файл целых чисел. Выберите наибольшее из них, принадлежащее интервалу [а, А]. Концы интервала а, 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 -1 1;
« второй файл-результат: f3: 3 8 15 -3 10.
14.	Пусть дан файл целых чисел. Определите, где больше нулей — на четных или на нечетных позициях.
15.	Пусть дан файл целых чисел. Создайте файл вещественных чисел, значениями которого будут средние арифметические значения каждой пятерки подряд идущих чисел. Последняя группа может содержать меньше пяти значений.
16.	Пусть в файлах j\ и /2 целые числа упорядочены по возрастанию. Создайте файл/3, объединив / и/2и сохранив упорядоченность.
17.	Пусть дан файл целых ч исел. Определите длину наибольшего интервала возрастания и среднее арифметическое чисел этого интервала.
18.	Пусть дан файл целых чисел. Определите наибольшую сумму подряд идущих чисел, образующих возрастающую последовательность.
19.	Пусть дан файл целых чисел. Определите, образуют ли числа арифметическую прогрессию.
20.	Пусть дан файл целых чисел. Значения в нем имеют следующий смысл: rtj /и /12 —/П| п2 /21 Лз — /1пг гДе И1 “ количество оценок первого студента, ( /12... /|я — оценки первого студента, щ — количество оценок второго студента, /21 f22 ...	— оценки второго студента и т. д. Задание:
а)	найдите номер студента, имеющего наибольшую среднюю оценку;
Ь)	создайте файл вещественных чисел со средними оценками.
1чо pflsu14 q 1йлы
♦	21. Пусть даны два файла целых чисел. Определите, равны ли они.
♦	22. Пусть даны два файла целых чисел. Определите, больше ли минимальное значение первого файла, чем максимальное значение второго,
	23, Пусть дан файл целых чисел с диапазоном значений от й до Ь. Определите, сколько раз встречается каждое значение в файле.
♦	24. Пусть матрица А целых чисел размером 100 х 100 записана по строкам в файле. Определите, есть ли в ней нулевые строки.
♦	25. Пусть матрица А целых чисел размером 100 х100 записана по строкам в файле. Определите, является ли она единичной.
♦	26. Пусть матрица А целых чисел размером 100 х 100 записана по строкам в файле. Перенесите в новый файл m-й столбец матрицы (т задается вводом).
*	27. Пусть матрица Л целых чисел размером 100 х 100 записана по строкам в фай-; ле. Определите, упорядочены ли значения m-го столбца по возрастанию (т задается вводом).
♦ 28. Пусть матрица А целых чисел размером 100 х 100 записана по строкам в фай-/  ле. Найдите значение первого максимального элемента, а также номер стро-'?	ки и номер столбца, соответствующие этому значению.
£ *29. Пусть матрица А целых чисел размером п х п записана по строкам в файле/,. 1;	Создайте новый файл /2, в который перепишите ненулевые строки в следую-
/ тем формате: kaki ak2... akknt где k — номер ненулевой строки, kaki ак2...	—
X, значения &-й строки.
Jg*30. См. условие задания 13. Пусть дан файл /2. Создайте файл fx.
| 31. Студентам 5-го курса была предложена анкета о том, знание каких из прочитанных курсов могут потребоваться в будущей работе. Результаты анкетирования были занесены в файл. Напишите программу создания файла анкетирования. Список прочитанных курсов:
к математический анализ;
а алгебра;
« информатика;
|	* численные методы;
» дифференциальные уравнения;
е теория вероятности;
функциональный анализ.
132. См. условие задания 31. Напишите программу обработки файла анкетирования: но заданному предмету определите, сколько студентов назвали его полезным.
33. См. условие задания 31. Напишите программу обработки файла анкетирования: выберите и напечатайте название предмета, получившего наибольшую оценку (если таких несколько — перечислите все).
34. См. условие задания 31. Напишите программу обработки файла анкетирования: сколько студентов нс оценили положительно ни один из предметов и сколько студентов оценили все предметы как полезные.
Упражнении, задачи;программы 1 w»
	35. См. условие 3|ДДНИЯ 31. Напишите программу обработки файла анкетирования: определите, сколько студентов назвали полезными k и более предметов
♦	36. См. условие задания 31. Напишите программу обработки файла анкетирования: распечатайте названия предметов в порядке убывания их рейтинга.
♦	37. См. условие задания 31. Напишите программу обработки файла анкетирования: определите количество студентов, оценивших положительно все сели предметов, шесть предметов и т. д.
*	38. См. условие задания 31. Создайте новый файл, в который перенесите записи в следующем порядке: сначала ответы со всеми положительными оценками затем ответы, в которых шесть положительных оценок, и т. д.
*	39. См. условие задачи 31. Напишите программу обработки файла анкетирования: перенесите в новый файл записи с положительными оценками заданного предмета.
; *40. Полугодовая информация о подписных изданиях по каждому подписчику имеет следующую структуру: ФИО (20 знаков), участок доставки (2 знака) адрес, количество выписанных изданий (2 знака), список изданий. Адрес е свою очередь состоит из следующих компонентов: улица (20 знаков), номер дома (3 знака), номер квартиры (3 знака). Список изданий состоит из следующих компонентов: название (20 знаков), вид, то есть газета или журнал (1 знак), месяцы, на которые оформлена подписка. Список изданий представляет собой массив структур, содержащий У элементов, из которых заполнены К — количество выписанных изданий. Если подписчик оформил подписку на более чем У изданий, то для него имеется две или более записи, идущие подряд. Информация о месяцах подписки может, например, быть представлена в виде массива из двенадцати логических элементов. Создайте файл с информацией о подписных изданиях.
	41. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному номеру месяца и заданному изданию найдите количество экземпляров, подлежащих доставке.
•	42. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному номеру месяца и названию издания распечатайте количество экземпляров, необходимых для каждого участка. Считайте, что записи в файле упорядочены по номеру участка доставки.
	43. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданным ФИО распечатайте список подписных изданий данного подписчика (записей, относящихся к одному подписчику, может быть несколько).
•	44. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному названию издания и номеру месяца определите участок, получающий больше всего экземпляров.
*	45. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному участку доставки и месяцу определите издание, на которое подписалось наибольшее число подписчиков.
46. См. условие задания 40. Напишите программу обработки файла подписных изданий: распечатайте ФИО подписчиков, оформивших подписку на наибольшее число изданий, независимо от количества месяцев.
♦47. См. условие задания 40, Напишите программу обработки файла подписных изданий: определите участок доставки, на котором наибольшее число подписчиков (учесть, что записей, относящихся к одному подписчику, может быть несколько). Пусть записи упорядочены по номеру участка.
См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданным ФИО, участку доставки, адресу, названию издания £ выполните исключение данного издания из списка подписных изданий, то есть создайте новый файл, который будет соответствовать новому состоя -Г  нию. Если указанное издание было единственным в записи, исключите запись. 0. См. условие задания 40. Напишите программу обработки файла подписных № изданий: по заданным ФИО, участку доставки, адресу, названию издания, 5?' виду, месяцам, на которые оформлена подписка, добавьте информацию в ₽ файл, то есть создайте новый файл, который будет соответствовать новому So'' состоянию информации. Если список издании в записи заполнен, создайте g новую запись.
Пусть дан файл, содержащий сведения об абонентах телефонной станции: Jk ФИО (40 знаков), номер телефона, содержащий номер АТС (2 знака) и соб-ственно номер (5 знаков). Пусть записи упорядочены по номеру телефона. [ Напишите программу создания файла сведений об абонентах телефонной станции.
См. условие задания 50. Добавьте новую запись в файл, сохраняя упорядо-.. ченность по номеру телефона.
См. условие задания 50. Распечатайте свободные номера по каждой АТС в виде интервалов, например: 45671-46000 46007 47000-47100...
В- См. условие задания 50. Отсортируйте записи по полю ФИО. Реализуйте алгоритм внешней сортировки простым слиянием.
г  Используются один входной и два выходных файла.
f  L-проход (L - 1,2,3,...) состоит из двух фаз: разделения и слияния. Разделение — отсортированные серии длиной L из входного файла поочередно переписываются в два выходных. Слияние — выходные файлы становятся входными, а входной — выходным, упорядоченные серии длиной L сливаются в упорядоченные серии длиной 2L и записываются в выходной файл.
 Результат помещается на место исходного файла.
МИ. Пусть файл Wages содержит сведения о заработной плате сотрудников пред-М- приятия в формате: № отдела, ФИО, Сумма к получению. Записи упорядоче-к ны по полю № отдела. Напишите программу создания файла Wages.
Й5. См. условие задания 54. Напишите программу распечатки ведомости по от-Ж-; делам.
Е6. См. условие задания 54. Найдите отдел с самой высокой средней заработной платой.
Упражнения, мщачи, программы 101
•57, См, условие MWmfl 54. Найдите отдел с самой большой общей суммой вы* платы.
58. Пусть файл На гк содержит оценки учащихся класса за год в формате: Фамилия, Оценки по 10 предметам. Пусть таблица Name содержит названия предметов в том же порядке, в котором перечислены оценки в файле Mark. Задание:
	а) распечатайте фамилии отличников;
♦	Ь) по заданному названию предмета определите среднюю оценку класса по этому предмету;
♦	с) сравните оценки по двум заданным предметам;
♦	d) распечатайте название предмета с наилучшей средней оценкой.
♦59. Пусть файл содержит сведения о билетах спортлото, участвующих в тираже. Используя следующий фрагмент пр01раммы, напишите процедуру, которая по файлу типа Lottery (сведения о билетах, участвующих в тираже) и массиву типа Gain (выигрышные номера тиража) определяет количество билетов, в которых угадано три номера, четыре номера и все пять номеров.
type
Not ° 1..36:
Rec - set of Norn:
tottery - file of rec:
Gain - array [1..5] of Not:
з__________ ____________________________________________________________________
i. ПРИМЕЧАНИЕ В заданиях с 60-го по 84-е предполагается, что текстовый файл содержит строки длиной не более 80 символов. Строка состоит из слов, разделенных произвольным количеством пробелов.
•60. Создайте текстовый файл. Текст вводится со стандартного устройства ввода.
61.	Пусть дан текстовый файл. Подсчитайте количество пустых строк.
62.	Пусть дан текстовый файл/,. Перепишите его содержимое в файл/2, сохраняя строчную структуру и удаляя пустые строки.
63.	Пусть дан текстовый файл. Слова не переносятся с одной строки на другую. Напечатайте строку с наибольшим количеством слов. Если таких строк несколько, напечатайте первые десять.
*	64. Пусть дан текстовый файл. Перенесите в новый файл все строки, содержащие заданное слово.
*	65. Пусть дан текстовый файл. Перенесите в новый файл все строки, не содержащие заданного слова.
♦	66. Пусть дан текстовый файл. В новый файл перенесите каждое слово как отдельную строку. Переход к новой строке в исходном файле соответствует пустой строке в новом файле. Пустых строк в заданном файле нет.
	67. По файлу, содержащему строки-слова (см. условие предыдущего задания), получите первоначальный файл, в котором слова разделены одним пробелом.
*	68. Пусть дан текстовый файл. Распечатайте первую строку, содержащую наибольшее число различных слов.
Г ।	। лани 14. Файлы
♦	69. 11уеть дан текстовый файл. Для каждой строки распечатайте слови наибольшей длины. Если их несколько, то распечатайте все.
•	70. 11усть дан текстовый файл. Распечатайте строку с заданным номером.
♦71. Пусть да! г текстовы й файл. Удалите строку с заданным номером. Если строки с указанным номером нет, сообщите об этом.
, *72. Пусть дан текстовый файл. Распечатайте все строки, начинающиеся с задан-него слова.
у73. Пусть дан текстовый файл. Распечатайте все строки, оканчивающиеся за-Л данным словом.
•Д
4*74. Пусть дан текстовый файл. Найдите строку максимальной длины.
,Ж5. Пусть дан текстовый файл. Создайте новый файл на основе данного, оставив Ж в каждой группе подряд идущих строк, отличающихся между собой только ffif, количеством пробелов между словами, одну с минимальным числом про-Ж белов.
Ж76. Пусть дан текстовый файл. Определите, сколько строк файла имеют дайну, большую, равную и меньшую, чем заданное значение k.
>77. Пусть дан текстовый файл. Создайте два выходных файла: в один перепишите из каждой строки первые р слов (р задается вводом), в другой — оставшиеся. Если в строке меньше чем р слов, то во втором файле соответствующая строка должна быть пустой.
Пусть даны файлы, созданные но условию предыдущего задания. Выполните объединение двух файлов: из соответствующих двух строк входных фай-, лов получите одну строку выходного файла.
(9. 11усть дан текстовый файл. Распечатайте строки, предшествующие строкам, W. начинающимся с заданного слова.
«0. Пусть дан текстовый файл. Напечатайте первое из слов, в котором наиболь-№ •' шее число различных букв. Если длина слова больше 20, то распечатайте пер-Ж' вые 20 букв.
881. Пусть дан текстовый файл. Для каждой строки распечатайте первое из слов, Вт содержащее наибольшее число различных букв.
К82. Пусть дан текстовый файл. Для каждой строки распечатайте слово с номе-ft' ром (п + 1) div 2, где п — количество слов в строке.
9*83. Пусть дан текстовый файл. Создайте файл целых чисел, в котором каждой строке исходного файла соответствует в выходном файле число, равное коли-Г честву слов в строке. Пустой строке или строке, состоящей из одних пробе-» лов, соответствует число 0.
>84. Пусть дан текстовый файл. Максимальная длина слова в этом файле равна ?. пяти символам. Создайте пять файлов. Каждой строке входного файла соответствует одна строка в каждом из пяти файлов, в которые переписаны через пробел слова соответствующей дайны: в первом файле — слова длины 1, во втором — слова длины 2 и т. д, Если слов длины k нет, то соответствующая строка А’-го должна быть пустой.
Упражнения, задачи, программы 15G
85, Пусть даны два текстовых файла. Определите, равны ли они. Равенство понимается в смысле совпадения соответствующих символов и одинакового деления на строки.
♦86. Пусть дан текстовый файл. Заменить последовательность Р1 подряд идущих символов последовательностью Р2. Последовательности Р1 и Р2 задаются пользователем.
87.	Создайте файл информации по итогам сессии resultdat Для каждой группы каждого курса в файл заносится следующая информация (количество курсов и групп на курсе фиксировано, сами номера курсов и групп в записи не хранятся):
* количество студентов в группе;
» количество допущенных к сессии;
м количество сдавших на «отлично»;
« количество сдавших на «отлично» и «хорошо»;
и количество получивших «неудовлетворительно».
88.	Используя прямой доступ к файлу result.dat (см. задание 87), распечатайте по заданному номеру курса и номеру группы информацию о результатах сессии.
89.	Используя прямой доступ к файлу result.dat (см. задание 87), найдите и распечатайте информацию о количестве отличников на заданном курсе.
90. Напишите программу создания файла прямого доступа results итогов сессии факультетов ПММ (1), физического (2), математического (3). Структуру записи см. в задании 87. Названия (номера) факультетов, курсов и групп в запись не включайте. Считайте, что количество курсов и групп фиксировано.
 "91. Используя прямой доступ к файлу result3.dat (см. задание 90), но заданному номеру факультета, номеру курса и номеру группы распечатайте информа-
' цию о результатах сдачи сессии группой.
	92. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданному номеру факультета найдите группу с наименьшим числом неуспевающих.
	93. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданным номерам факультетов сравните успеваемость заданных курсов (по количеству отличников и количеству неуспевающих).
♦	94. Пусть в файле фамилий ТТагп находятся фамилии студентов (одна запись — одна фамилия), в файле оценок fnote — в том же порядке оценки студентов (одна запись — массив оценок одного студента), в файле fchg — изменения к файлу оценок (структура записи: номер студента, совпадающий с номером фамилии в файле ffат, номер измененной оценки, новая оценка). Записи упорядочены по номеру студента. Распечатайте список фамилий студентов, получающих стипендию, то есть сдавших сессию на «хорошо» и «отлично». Файлы ffam, fnote, fchg читаются один раз.
♦	95. Пусть заданы файлы ffam, fnote, fchg (см, задание 94). Используя прямой доступ, по заданной фамилии распечатайте оценки студента, учитывая возможные пересдачи.
150 Пшша 14. Файлы
11.	Создайте файл Студент. Занесите в отдельный файл записи из файла Студент о студентах 5-го курса, упорядочив их по убыванию сумм баллов за все время обучения (ФИО, балл).
12.	Создайте файл Студент. Занесите в отдельный файл записи из файла Студент, выполнив перевод студентов на следующий курс.
13.	Создайте файл Студент. Занесите в отдельные файлы записи о студентах раз-. личных форм обучения.
' 14. Создайте файл Студент. Подсчитайте количество студентов, имеющих хорошие и отличные оценки за весь период обучения, по каждому курсу, по каждой форме обучения.
* 15. Создайте файл Каталог книг. Занесите в отдельный файл все произведения заданного пользователем автора.
1:16. Создайте файл Каталог книг. По заданному значению года издания занесите Jy в отдельный файл сведения о произведениях, изданных в указанном году.
д. 17. Создайте файл Каталог книг. По заданной специальности занесите в отделъ-ный файл сведения обо всех изданиях (ФИО, название, год издания).
Создайте файл Каталог книг. Найдите специальность, по которой имеется наи-'Й; большее число книг,
JOB- Создайте файл Каталог файлов. Выберите и завесите в отдельный файл сведс-Ж ния о файлах, размер которых превышает заданное число блоков.
Создайте файл Каталог файлов. Перепишите его в отдельный файл, упорядочив записи по количеству блоков.
ЖК1. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах L с заданной спецификацией.
№е2. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах Ж ’ с задан 11 ым именем.
№сЗ. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах, KL созданных ранее указанной даты.
ж24. Создайте файл Каталог файлов. Найдите такие файлы, которые есть в трех & модификациях — со спецификациями .PAS, .OBJ, .EXE.
К\25. Создайте файл Телефон ныйсправочник. Выберите и занесите в отдельный файл Ж по заданному адресу (улица, номер дома) сведения об абонентах, имеющих Ж телефоны.
Создайте файл Тел ефон ныйсправочник. Выберите и занесите в отдельный файл сведения об абонентах, имеющих телефоны, номера которых начинаются £ с заданных двух цифр.
27.	Создайте файл Телефонный справочник. Найдите по ФИО номера телефонов и адреса абонентов.
28.	Создайте файл Телефон ный справочник. Найдите номер АТС (первые две цифры номера телефона), имеющей наибольшее число абонентов.
задании для самостоятельной реооты юг
29.	Создайте файл Телефонный справочник. По номеру телефона найдите ФИО и адрес владельца.
30.	Напечатайте в произвольном порядке все разные слова, встречающиеся в данном текстовом файле. Словами считать последовательности (длиной не более 20) прописных и строчных латинских букв. Для накопления слов использовать таблицу.
31.	Напечатайте все разные числа из файла целых чисел в порядке их первого появления.
32.	Пусть даны три упорядоченных по возрастанию файла целых чисел. Напечатайте наименьшее из чисел, встречающихся во всех трех файлах. Файлы должны быть прочитаны не более одного раза.
Глава 15
f .
^Динамические структуры Жданных
^Теоретические вопросы
1. Укажите принципиальное отличие статических переменных от динамических. , 2. Приведите примеры нерационального использования оперативной памяти при применении статических переменных.
3.	На каком этапе (компиляции, выполнения) происходит выделение памяти под динамические структуры данных?
4.	На каком этапе (компиляции, выполнения) происходит выделение памяти под статические структуры данных?
5.	Укажите причины использования динамических переменных.
6.	Что называется указателем?
7,	Какой объем памяти необходим для хранения указателя.
8.	В каких случаях память под указатель выделяется статически, а в каких динамически?
9.	Когда происходит выделение памяти для указателей, а когда для данных, на которые они указывают?
10.	Что описывается в первую очередь — тип указателя или тип данных, на который он указывает?
11.	Определено ли значение по умолчанию для переменных ссылочного типа?
12.	Поясните роль базового типа при работе с указателями.
13.	Для чего необходимо значение ni 1 при работе с указателями?
14.	Что такое базовый тип?
15.	Можно ли в качестве базового типа использовать тип, определяемый пользователем?
16.	Что является значением переменной ссылочного типа?
17.	Какое у j ш печальное 31 [ачение может быть присвоено любой переменной ссылочного типа?
18.	Назвать операции, которые допускаются над значениями ссылочного типа.
19.	Какие стандартные процедуры реализуют основные действия над динамическими переменными?
20.	Каково назначение стандартных процедур new, di spose? Сколько параметров они имеют? Каков тип этих параметров?
21.	К чему приводит «потеря» указателя на данные, хранимые в динамической памяти?
22.	Ограничена ли динамическая память?
Задачи, решения
Списки
Односвязный (однонаправленный) список
1, Реализуйте следующие операции для списков без заглавного (рис. 15,1) элемента и с заглавным (рис. 15.2) элементом:
	инициализация списка;
« добавление элемента в начало списка;
•	добавление элемента в конец списка;
» удаление первого вхождения заданного элемента в список;
	переворот списка, то есть такая переустановка ссылок в списке, при которой элементы списка следуют друг за другом в обратном порядке;
* печать элементов списка;
н удаление всех элементов списка.
Рис. 15.1. Список без заглавного звена
Рис. 15.2. Список с заглавным звеном
♦2. Реализуйте процедуру удаления всех вхождений элемента Е в список L.
3. Подсчитайте число вхождений элемента Е в список L.
4. Упорядочьте элементы списка по убыванию, используя сортировку посредством ныбора максимального элемента. Используйте список без заглавного элемента.
•5. В решении предыдущей задачи (см. приложение 1) при сортировке списка обмен двух элементов списка реализован как обмен информационных частей. В реальных задачах обмен информационных частей неэффективен из-за их большого размера. Поэте му выгоднее переустанавливать указатели в списке, не затрагивая информационных частей. На основе этого замечания реализуйте процедуру, упорядочивающую элементы списка по убыванию.
6. Слейте два упорядоченных по невозрастанию списка в один (также упорядоченный по невозрастанию):
*• а) построив новый список;
Ь) поменяв соответствующим образом указатели в исходных списках.
, 7. Упорядочьте по возрастанию только:
	а) положительные элементы списка;
	Ь) элементы с четными порядковыми номерами в списке;
.. *с) элементы с порядковыми номерами, являющимися простыми числами.
'♦8. В результате проведенного анкетирования Иванова Ивана Ивановича были определены ответы па поставленные вопросы (табл. 15.1). Представьте полученную информацию в виде списка характеристик, каждой из которых соответствует сп и со к значений характеристики. Определите процедуры добавления и удаления для характеристик и их значений.
Таблица 15.1. Анкетные данные Иванова Ивана Ивановича
Вопрос (характеристика)	Ответ (список значений характеристики)
Год рождения	1961
Семейное положение	холост
Увлечения	программирование, футбол
Любимые времена года	весна, лето
♦9. Пусть дан упорядоченный список названий книг. Необходимо добавить информацию о новой книге, сохранив упорядоченность списка.
'10. Пусть дан список, хранящий слова некоторого предложения. Удалите из списка те вхождения слова «программирования», которым предшествует слово «языки».
11.	Пусть дан список. После каждого элемента добавьте предшествующую ему часть списка.
12.	Пусть элементы списка хранят следующие друг за другом символы некоторого предложения. Замените в списке каждое вхождение слова «тысячелистник» на словосочетание «лекарственное растение».
13.	Проверьте, совпадают ли два списка Л и В.
Задачи, решения 161
14.	Проверьте, содержатся ли элементы списка А в списке В в указанном списком А порядке.
15.	Упорядочьте элементы списка, используя сортировку простыми вставками.
16.	Вычислите сумму тех элементов списка, значения которых меньше значений элементов, непосредственно следующих за ними.
17.	Пусть дан список А, содержащий целые числа. Занесите в список В порядковые номера максимальных элементов списка А.
18.	Определите, что является результатом работы следующей процедуры: procedure ZZZ( hl: TList ): var
h2. h3 : TList;
fr boolean;
begin
while hl о nil do begi n h2 hl*.next; h3 hl; f true:
while (h2 <> nil) and f do
if hl*.info - h2*.lnfo
then f :» false
el se
begin
h3 :* h2;
h2 h2*.next
end;
1f not f
then
begin
h2 :« hl*.next;
newt hl*.next );
hl*.next*.info h3*.info;
hl*.next*.next	h2;
hl := hl*.next
end;
hl	hl*.next
end
end; { ZZZ }
19.	Пусть дан список студентов. Элемент списка содержит: фамилию, имя, отчество, № курса, № группы, оценки по пяти экзаменам последней сессии. Выполните перечисленные ниже операции:
“	а) предполагая, что фамилии студентов в списке упорядочены по алфавиту, удалите подсписок студентов, начиная с фамилии Петров и заканчивая фамилией Сидоров включительно;
	Ь) предполагая, что информация о студентах в списке упорядочена по номеру курса, перенесите студентов 2-го курса в конец списка;
♦	с) удалите информацию о студентах 5-го курса и переведите остальных студентов на следующий курс;
1DZDi«M IB. Динамические структуры данных
•d)	выведите информацию о начисленной стипендии, предполагая, что отличникам выплачивается сумма 5/, студентам, имеющим только «четверки» и «пятерки», выплачивается сумма 52, троечникам стипендия не выплачивается.
♦	20. Вычислите среднее арифметическое элементов непустого списка.
♦	21. Опишите процедуру, которая формирует список Z, включив в него по одному разу элементы, которые входят хотя бы в один из списков L1 и L2.
♦	22. Опишите подпрограмму, которая в списке L из каждой группы идущих подряд равных элементов оставляет только один.
23. М ногочлен Р(х) = ар х" + л„ч " ' +... + а} х +	с вещественными коэффициен-
тами можно представить в виде списка (рис. 15,3), причем если а, = 0, то соот-f ветствующее звено в список не включается. Опишите:
•*. " а) функцию Va 1 ue(Р. х), вычисляющую значение многочлена — списка Р в точке х;
♦Ь) подпрограмму, рассчитывающую производную многочлена — списка Р по переменной х;
♦ с) подпрограмму, интегрирующую многочлен — список Р.
Рис. 15.3. Представление многочлена в виде списка
24. Опишите подпрограмму, которая проверяет, есть ли в списке хотя бы два одинаковых элемента.
25. Пусть в файле хранятся записи со сведениями об автомобилях и их владельцах (марка, номер ГАИ, фамилия владельца). Необходимо:
	а) для каждой марки автомобиля составить список, содержащий фамилии владельцев автомобилей данной марки;
	Ъ) для каждой фамилии владельца составить список, содержащий информацию об автомобилях, принадлежащих данному владельцу.
Двусвязный (двунаправленный) список
	1. Пусть дан текстовый файл. Создайте двусвязный список, каждый элемент которого содержит количество символов в соответствующей строке текста.
♦	2. Пусть с клавиатуры вводится последовательность jq, х>.х„ вещественных чисел, где п — заранее не известная величина. Ввод завершается символом перевода строки. Вычислите сумму произведений: 5 -	+ XjX^ +... +
Кольцевой список
♦	1. «Считалка». А ребят располагаются по кругу. Начав отсчет от первого, удаляют каждого K-vg, смыкая круг после каждого удаления. Определите порядок удаления ребят из круга.
Задачи, решения 163
♦	2. Пусть имеется кольцевой двусвязный список, содержащий целые числа из диапазона [0... 1000], Произвольный элемент выбирается в качестве рабочего. Для работы со списком определены только 4 перечисленные ниже операции: а) ШагВлево — смена рабочего элемента. Рабочим становится левый сосед текущего рабочего элемента;
Ь) ШагВпра во — рабочим становится правый сосед текущего рабочего элемента; с) Прочитать — поместить в заданную переменную значение рабочего элемента списка;
d) Записать — записать в рабочий элемент списка значение заданной переменной (значение переменной принадлежит диапазону 0., Л ООО).
Необходимо определить число элементов кольцевого списка.
^Двоичное дерево
 1. Реализуйте процедуру ввода двоичного дерева.
2. Реализуйте процедуру копирования двоичного дерева.
3. Подсчитайте число листьев (терминальных элементов) в заданном двоичном дереве.
4. Определите высоту заданного двоичного дерева.
	5. В заданном двоичном дереве подсчитайте число элементов, равных максимальному.
	6. Замените в заданном двоичном дереве все отрицательные элементы их абсолютными величинами,
♦	7. Поменяйте местами максимальный и минимальный элементы заданного двоичного дерева, все элементы которого различны.
*	8. Пусть для дерева А была сделана копия — дерево В, и из дерева В были удалены некоторые из ветвей. Необходимо сформировать список указателей на удаленные ветви дерева Л.
	9. Проверьте, является ли заданное двоичное дерево сбалансированным.
 ♦!(). Опишите процедуру, которая для заданного значения N строит дерево следующего вида: корнем является узел, информационная часть которого равна М второй уровень содержит узлы со значениями N-1 и М2; третий уровень — М3, М4, AL5, Мб; и т. д. Последний уровень может быть неполным и содержать узел с конечным значением — 1.
11. Представленную ниже формулу можно представить в виде двоичного дерева по следующим правилам: формула из одного терминала (цифры или переменной) представляется деревом из одной вершины с этим терминалом, а формула вида (/t s/2) — деревом, в котором корень — это знак 5, а левое и правое поддеревья — это соответствующие представления формул и /2.
«формула*;:“<тернинал>|(«формула>«знак*<формула>)
<ЗНак>::- + | - | * | /
«терминал*::-«переменная*|«цифра*
<переиенная>::=a[b|c|d|e|f|g|h|i|m|njo|pfq|r|s[t|u[v|w|x|y|z
«цифра*;:=0|1[2|3|4|5|6|7|8|9
ТО* глам 1 а. Динамические структуры денных
Опишите подпрограмму, которая решает перечисленные ниже задачи:
• а) вычисляет значение дерева-формулы (считайте, что значения переменных заданы массивом Value: array [' а'..' z ’ ] of real);
* b) по формуле, содержащейся в текстовом файле, строит соответствующее дерево-формулу;
 '	♦ с) печатает дерево-формулу в виде формулы;
 ’	"d) проверяет, является ли заданное двоичное дерево деревом-формулой;
*	е) упрощает дерево-формулу, заменяя в нем все поддеревья, соответствующие формулам (/+ 0), (0 +/), (f- 0), (/*1) и (1*/)* поддеревьями, соответствующими формуле/; поддеревья, соответствующие формулам (/*0) и (0 */), — с вершиной 0; поддеревья (а + Ь), (а - Ь), (а*Ь), (а/b), где а и b — константы, вершиной с, равной а + Ь, а - Ь, а*Ь, а/b соответственно;
♦	f) преобразует дерево-формулу, заменяя в нем все поддеревья, соответствующие формулам ((fl ± f2)*f3) и (f1 *(f2 + /3)), поддеревьями, соответствующими формулам ((J1 */3) ± (J2 */?)) и	*f2) ± (f1 *f3));
j-,. * g) находит производную дерева-формулы ио заданной переменной.
Дерево двоичного поиска
v 1. Пусть задано дерево двоичного поиска. Реализуйте подпрограмму:
•	а) добавления элемента в дерево двоичного поиска;
	*Ь) удаления элемента из дерева двоичного поиска;
	с) поиска элемента в дереве двоичного поиска;
*	d) преобразования данного дерева в сбалансированное дерево двоичного поиска;
	е) подсчета числа элементов, больших заданного.
2. Пусть дан файл, содержащий целые числа. Сформируйте из них дерево поиска и выведите элементы дерева в порядке убывания значений.
	3. Проверьте, является ли данное двоичное дерево деревом поиска.
*	4. Пусть дан текстовый файл. Слова содержат не более 20 символов. Определите частоту использования каждого слова в тексте. Результат оформить в виде таблицы, содержащей слова в лексикографическом порядке.
*	5. В заданном дереве найти поддерево двоичного поиска с максимальным количеством элементов.
^Очередь
1.	Реализуйте операции работы с очередью, построенной на основе:
а)	массива;
Ь)	динамических структур.
♦	2. Пусть дан текстовый файл А. Перепишите его содержимое в файл В, удалив при этом слова, длина которых меньше заданной.
Задачи , решения 1 IS
♦	3. Пусть дан текстовый файл Л. Перепишите его содержимое в файл В, перенося при этом в конец каждой строки все входящие в нее знаки препинания.
♦	4. Пусть задан массив Named. .Nl (элементы имеют тип аггау[1. .15] of char), содержащий имена людей, и массив Children[L..N, 1. .N] (элементы имеют тип bool еап), в котором Chi 1 dren[x, у>true, если человек под номером у является ребенком человека под номером х. Для человека с заданным номером к напечатайте сначала имена всех его детей, затем ~ всех его внуков, затем — всех правнуков и т. д.
*	5. Напечатайте элементы двоичного дерева в следующем порядке: сначала — элементы первого уровня, затем — элементы второго уровня, затем — элементы третьего уровня и т. д.
♦	6. Пусть имеется три конвейера. Конвейеры работают независимо друг от друга. Изначально на первом конвейере располагаются детали N типов, а второй и третий — пусты. Время обработки детали каждого типа с каждого конвейера задается матрицей Timed--N.1..3J. После обработки детали с конвейера к она поступает на конвейер к+1. Назовем обработанную деталь с третьего конвейера изготовленной. Требуется по начальному расположению деталей на первом конвейере определить время, через которое все детали будут изготовлены.
♦	7. Пусть даны две очереди X и У, содержащие вещественные числа. Из каждой очереди одновременно извлекается по одному числу х и у соответственно. Если.г < у, то число (х + у) помещается в конец очереди А’, иначе число (г - у} помещается в конец очереди К Необходимо определить число шагов, через которое одна из очередей станет пустой.
Стек
1.	Реализуйте операции работы со стеком, построенным на основе:
а)	массива;
Ь)	динамических структур.
2.	Распечатайте символы введенной пользователем строки в обратном порядке.
♦3. Пусть в текстовом файле записана без ошибок показанная ниже формула (М обозначает функцию max, a m - mi п). Вычислите значение данной формулы (например, М (5. m (6,8))
«формула*::к«цифра> | М(«формула*,«формула*) | гл («формула*, «формула*)
«цифра*::Ч)|1|2|3|4|5|6|7|8|9
♦4. Проверьте, является ли содержимое заданного текстового файла правильной записью формулы следующего вида:
«формула*::^«терм> | «терм* + «формула* | «терм* - «формула*
«терм*::^«переменная*|«цифра*|(«формула*)
«переменная*::=a|b|c|d|e|f|g|h|i|j|kjl|m|n|ojp|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 <ЛВ>),
160 ГПам fS. Динамические структуры данных
где not, and и or обозначают соответственно отрицание, конъюнкцию и дизъюнкцию. Вычислите значение этого выражения.
*6. Преобразуйте арифметическое выражение в постфиксную форму. В выражение входят:
а)	переменные;
Ь)	целые числа;
с)	знаки плюс (+), минус (-), умножить (*) и разделить (/);
d)	круглые скобки,
{•: *7. Вычислите значение арифметического выражения, хранящегося в постфиксной записи, В выражение входят:
а)	целые числа;
Ь)	знаки плюс (+), минус (-), умножить (*), разделить (/) и унарный ми-/:	нус (’),
1 ♦в. Преобразуйте выражение из постфиксной формы в инфиксную.
5’ *9. Карту, определяющую прямоугольную область моря, представили матрицей с логическими элементами (false — море, true — суша). Островом будем на
О зывать совокупность соприкасающихся (вертикальной или горизонтальной
*:	стороной) клеток матрицы со значениями true. Рассчитайте число островов
на матрице-карте.
♦10. Пусть даны два стека. Используя операции Извлечь, Занести и функцию Пуст-ЛиСтек (проверка факта очистки стека), подсчитайте общее число элементов в стеках. В качестве вспомогательных структур разрешается использование переменных целых типов. Алгоритм должен предусматривать восстановление исходного расположения элементов в стеках,
11. Пусть дана логическая матрица, описывающая лабиринт (t rue — стена, fa 1 se — проход) и начальное положение человека в лабиринте (х, у). Необходимо предложить вариант обхода всех доступных клеток лабиринта:
♦а) любой;
*Ь) оптимальный.
* 12. Распечатайте возрастающие серии последовательности целых чисел в обратном порядке (серия — упорядоченная подпоследовательность максимальной длины).
13. Проверьте правильность расстановки скобок трех типов (круглых, квадратных и фигурных) в выражении.
[Задания для самостоятельной работы
1.	Реализуйте функцию поиска элемента Е в односвязном списке L.
2.	Реализуйте процедуру Swap_Elems(Pl. Р2: TList), где Р1 и Р2 — указатели на звенья. Процедура предназначена для обмена местами двух звеньев путем переустановки ссылок в списке.
Задания для самостоятельной работы 167
3.	Подсчитайте число максимальных элементов списка.
4.	Пусть в списке А хранится информация о людях (фамилия, имя, отчество, профессия). Имеется список В, содержащий перечень профессий. Удалите из списка Л тех людей, чья профессия не указана в списке В,
5.	Пусть дан список штучных товаров, хранящихся на складе (наименование, цена). В списке могут присутствовать одинаковые товары. Задание;
а)	составьте прайс-лист на товары (список, содержащий перечень различных товаров и цен на них);
Ь)	вычислите среднюю цену на каждый товар;
с)	выведите перечень наименований товаров, чья цена ближе всего к средней.
6.	Пусть имеется N городов и задан список пар городов (i,j), между которыми существует прямая дорога. Напечатайте список городов, которые напрямую сообщаются более чем с тремя городами.
7.	Пусть дан список слов. Из каждой группы подряд идущих одинаковых слов оставить только одно.
8.	Пусть дан текстовый файл. Распечатайте слова, имеющие максимальную длину.
9.	Пусть дан список вещественных чисел. Проверьте, упорядочены ли числа по возрастанию или по убыванию.
10.	Пусть дан список вещественных чисел. Для каждого элемента списка напечатайте число отрицательных элементов, следующих за ним.
11.	Пусть дан список вещественных чисел. Проверьте, образуют ли числа, хранящиеся в списке, арифметическую или геометрическую прогрессию.
12.	Опишите процедуру, вставляющую в список £, элементы которого упорядочены по неубыванию, новый элемент так, чтобы сохранялась упорядоченность.
13.	Опишите процедуру, формирующую список Л, включив в него по одному разу элементы, которые входят в список L1, но не входят в список £2.
14.	Опишите функцию, подсчитывающую количество элементов списка L, у которых равные «соседи».
15.	Пусть задан список Л целых чисел. Занесите в список В порядковые номера максимальных элементов списка А.
16.	Пусть с клавиатуры вводится последовательность ..., х„ вещественных чисел, где п — заранее неизвестная величина. Ввод завершается символом перевода строки. Вычислите произведение сумм;
S - (Л[ + х2 + 2хл )(х2 + х3 + 2x„_t)... (x„_j + хл„2 + 2х2) .
17.	Пусть с клавиатуры вводится последовательность	х2,вещественных
чисел, где п — заранее неизвестная величина. Ввод завершается символом перевода строки. Вычислите произведение сумм:
S = (х2 - х„2	~ *„2-i)    (х2 - X2 ) .
108 П1М115. Динамически» структуры данным
18.	Подсчитайте число узлов в заданном двоичном дереве.
19,	Подсчитайте число узлов на k-м уровне заданного двоичного дерева (корень считать узлом 1-го уровня).
20.	Пусть даны два текстовых файла Л и В. Максимальная длина слова — 20 символов. Занесите в файл С те слова файла А, которых нет в файле В. Для хранения слов файла В и ускорения поиска среди них воспользуйтесь деревом двоичного поиска.
у 21. Реализуйте нерекурсивную процедуру печати всех элементов заданного двоичного дерева.
22.	Реализуйте рекурсивную процедуру печати всех элементов заданного двоичного дерева.
23.	Опишите логическую функцию, проверяющую на равенство два заданных двоичных дерева.
24.	Опишите логическую функцию, определяющую, есть ли в заданном двоичном дереве хотя бы два одинаковых элемента.
25.	Опишите процедуру, строящую для заданного значения N двоичное дерево, в котором N полных уровней и на каждом уровне i располагаются узлы, информационные части которых равны i.

Приложение 1
[Ответы и решения
Глава 1. Числовые типы данных к
Упражнения
! Задание 3
Ответы:
а) 2 * In ( х / 15 ) / 1п( 2 );
к b) arctan ( х / sqrt ( 1 - sqr ( x ) ) );
[c) 0.5 * sin ( 3.1415927 / 6 );
| d) sqr ( sqr ( sqr ( x ) ) );
[ e) exp ( 250 * In ( x ) );
J f) 1E3 + betta / ( x2 - ganrna * delta ).
Задание 4
; Ответы:
 a) 4;	f) 0,1415;
b) -1;	g)	8;
' c) 4;	h)	1,0;
d) 1;	i	)	3;
e) 3;	j	)	3,1415926536.
Задание 6
Ответы: a) real; b) real; c) integer; d) Integer; e) Integer.
1 /41Приложение 1. Ответы и решения
Глава 2. Оператор присваивания, ввод и вывод информации
Упражнения, задачи, линейные программы
Задание 3
Ответы:
*) 4;
Ь) ю.
Задание 4
Ответы:
т:' ( х mod 10 ) * 100 + ( х div 10 mod 10 ) * 10 + х div 100
ние 9

ict:
{ должна быть объявлена вещественная переменная t t : х;
X у:
У t;
ание11
[ение:
program Geron;
var
a	,b,	с:	real;	{	длины сторон треугольника	}
р	:	real;	{	полуперинетр треугольника	}
s	:	real;	{	площадь треугольника }
begin
write ('Введите длины сторон треугольника:
readin ( a. b. с );
р;=(а+Ь+с)/2;
s sqrt( р * -( р - а ) * ( р - Ь ) * ( р - с ) );
writelnt ' Площадь треугольника равна ', з )
end. { Geron j
Задание 19
решение:
program Rocket;
var
hour, mln, sec. time : integer;
begin
wrlteln ( 'Введите время запуска ракеты' ):
Глава 3. Логический тип 1
wri te	i	'	час	-	'	);	readln	(	hour );
write	(	'	мин	-	'	reedin	(	min );
write	(	*	сек	•	’	):	readin	(	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;
writeln ( 'Результаты' );
write ( Время взлета = * ):
writeln ( hour: 2. ' час. ', min: 2. ' мин, '.
sec: 2, ' сек.');
writeln ( 'Время полета = ’ , time: 3 . ’сен’ );
write ( 'Ожидаемое время прибытия = ’ };
writeln ( hour: 2. ' час, ‘, mln: 2. ' мин, 1, sec: 2. ' сек.')
end. { Rocket }
Глава 3. Логический тип
Упражнения
Задание 1
Ответы:
d)
а	not а	a and not a
true	false	false
false	true	false
i)
a	not a	not not a
true	false	true
false	true	false
Задание 2
Ответы:
a)	true;
b)	false;
с)	false;
172 Приложение 1. Oymw и решения
(1) true;
е) false.
Задание 3
Ответ:
$) true.
Задание 4
,'ЭДгветы:
W (х <= у >(х 2
( х > 2 ) and ( х <= 10 ) or abs ( х ) < 2;
ш( к 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 ):
writein ( t )
I end. { Triangle }
&
tЗадание 9
| Ответы:
|a)t := (x=y) and (y=z);
ib) 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 ICO or (k div 100-7); h)t	sqr(xl) + 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 FindMax; var
а. b, с, max: real;
begi n
if a > b
then Max : = a
else Max b;
if c > max then max:-c;
writein ( 'Max = *, max )
end. { FindMax }
Задание 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:
f	if x >= 2 then у 1 / у:
wri te ( 'x = ', x , ' у = ', у ).
end. { YFunction }
Задание 9
Решение:
program Regulating; var
x. y, z: real;
begin
write ( 'Введите два числа: ' );
readln ( x. у ):
if x > у then
Приложение 1, Ответы и решения
begin
z х:
х :- у:
у 2
end:
writein ( ’ После упорядочения; ', х, у ) end. { Regulating }
Задание 11
Ответ:
х := гог I: and с
Задание 12
решение:
program Roots: var
а, b, с. d: real:
begin
write ( 'Введите коэффициенты a. b, с ‘ );
write ( ‘квадратного уравнения: ' );
readln ( а, b, с );
d sqr ( Ь ) - 4 * а * с;
if d < О
then writein ( 'Корней нет.' ) else
begi n
d :- sqrt ( d );
wrlteln ( ’xl-’, (-b + d } / (2*a). fx2“'. (-b - d ) / (2*a)J
end
end. { Roots }
цание13
[ение:
program Overflow: var
a. b: Integer;
signa. sign_b: integer;
t: boolean:
begin
read ( a. b );
if a - 0
then s1gn_a := 0
else signa :«= a div abs (a ): if b = 0
then slgn b := 0
else sign J)	b div abs ( b );
t := sign_a * sign_b > 0:
1f t
then begin
a r« abs ( a ):
b := abs ( b ):
t Maxint - a < b
end:
Пшаа Б. Операторы цикле 176
write ( Игропол пение при суммировании: ' ); 1f t
then write ( 'да1 )
else write ( 'нет' );
writein
end. { Overflow }
Глава 5. Операторы цикла
Упражнения, задачи, программы
Задание 1
Ответы:
а)В-Л + 1;
b) 0.
Задание 3
Ответы:
а)	120;
Ь)
у := 1;
for i ;я 2 to 5 do у := у * 1;
write ( у );
С)
у 1:
1	2;
repeat
У - у*1:
1 := i + 1
until 1 > 5:
write ( у ):
Задание 4
Решение:
program Degree;
var
1. n: Integer;
х, у: real;
begin
write ( 1 n = ’ ): readln ( n );
write ( 'x = ’ ); readln ( x J;
1 := 1;
У := 1:
while 1 <= r> do begin
У := У * x;
1 := 1 + 1 end;
write ( у = ’. у )
end. { Degree }
178 Приложение 1. Ответы и решения
Задание 8
Решение:
program MaxFactorial: var
i, f: Integer;
begin
1	1;
f 1;
*	repeat
i 1 + 1;
f :-f * 1
until f > Maxint div 2;
writeln( 'FC, 1-1:2. f )
end. { MaxFactorial }
I Задание 9
J. Решение:
fa)
program NumbersCount: var
<< n, k? Integer;
begin
write ( 'Введите число: ' ):
readin ( n );
к := 0;
repeat
к :₽ к + 1;
n := n div 10 *
until n « 0;
writeln ( ‘В числе к , 'цифр1 )
end. { NumbersCount }
fe
program Number sSuni;
var
n, s? Integer;
begin
write ( 'Введите число: ' );
readln ( n );
S := 0;
repeat
s	s + n mod 10:
n	n div 10
until n - 0:
writeln ( 1 Сунна цифр равна '. s )
£	e1^ { NumbersSum }
|)
•&’	program ReverseOrder;
var
n, m: integer;
begin
J write ( 'Введите число: ’ ):
readln ( n ):
m := 0:
repeat
m m * 10 + n mod 10:
Глава 5. Операторы цикла т
п п div 10
until п • 0;
write ( 'Цифры числа в обратном порядке: '. ш) end. { ReverseOrder }
Задание 10
Решение:
program Automorphism; var
га, п. х. d: integer:
begin
write{ ’Введите левую и правую ' ):
write( 'границу отрезка: ? ): readin ( n . m );
d 10:
for х i“ m to n do begin
while d <- x do d d * 10: if x * x mod d = x then
write ( 'Число ’.x, ' автонорфно’ 1 end
end { Automorphism }
Задание 12
Решение:
program NOD: var
x. y. a. b. result: Integer;
begin
write ( 'Введите два числа: ' ): readin ( 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;
writeln ( 'x-'. x. ' г'. У- ' Н0Д’'. result ) end. { NOD }
Задание 14
Решение:
program Perfect;
var
1. n. s: integer;
begin
write( 'Введите проверяемое число: ‘ );
readln ( n );
s :=* 1:
for i := 2 to n div 2 do
if n mod 1 = 0 then s := s + 1;
1f s = n
then writeln( 'Число является совершенным' )
else writeln( 'Число не является совершенным' ) end. { Perfect }
। г о приложение 1, ответы и решения
Задание 16
Решение:
program FlrstNegative: var
п: integer;
begin
П ;e 1;
while cos(cos(n)/sin(n)) 0 do
П D + 1;
write ( 'Номер отрицательного члена равен *, n ) end. { FirstNegative }
Задание 17
Решение:
• program FIbSequence: var
1.	n. fnO. fnl. fn2; integer;
begin
fnl := 1;
fnO 0;
writein ( fnl );
for i := 1 to n - 1 do begin
fn2 fnl;
fnl :a fnO:
fnO := fnl + fn2;
|	writein ( fnO )
»j-	end
end. { FIbSequence }
шдание 28
шение:
program FlndI;
var
x. y, xm. eps; real;
/. begin
read ( eps ):
V-	x Ю;
У 10:
J;	1 - 0;
.»* while (abs(x) >= eps) or (abs(y) >= eps) do begin
.‘i	xiri ;*= 0.1 * y;
у := 0.1 *x - 0.12 * y;
:	x ;« xm:
i ;= 1+1
end;
write (i)
end. { Flndl }
Гдание 29
тение:
program Count;
const
Пшва б. Операторы цикла
п - 100:
var
1,	kp. ко, kn: Integer:
х: real:
begin
kp :• 0;
kn 0;
for 1:* 1 to n do
begin
read ( x ):
if x > 0 then kp :• kp + 1:
1f x < 0 then kn kn + 1
end;
readln:
ко n - kp - kn;
writelnt 'Число положительных чисел: kp ):
writelnt ‘Число отрицательных чисел: 1, kn к writelnt 'Число нулей: '. ко )
end. { Count )
Задание 31
Решение:
program MaxMinDifference: var
х, max, min: real:
1:	integer:
begin
read ( x ):
mln :« x:
max x;
for 1	2 to 100 do
begin
read ( x ):
If x > max then max:- x else
if x < min then m1n:« x
end:
readln;
write ( 'Разность между максимальным и 1.
'минимальным числами: max - min ) end. { MaxMinDifference }
Задание 36
Решение:
а)
program YFunction;
var
a. x, у: real:
1: integer;
begin
write! 'Введите x и a: ' ):
readln ( x, a );
У x;
for 1	1 to 8 do
у sqr ( у + a ):
writein { 'Значение функции равно г. у )
end. { YFunction }
i qu приложение 1. ответы и решения
Задание 37
Ответ:
а)	(фрагмент программы)
У 1;
for 1:= 2 to И 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 ( 'y = ’. у )
end. { YFunction }
Задание 41
Ответы:
»
У-1
f
У 0;
n := 1:
for 1 := 1 to 30 do begin
n -.= x * n:
у ;= у + cos ( n ) end;
У 1;
f := 1;
for 1 :» 2 to n do begin
f := f * 1:
У := У + f
end;
Задание 44
решение (фрагмент программы):
£ L 0.0: { левый конец отрезка
R := 1.57; { правый конец отрезка
repeat
х :« ( L + R ) / 2; { середина отрезка } if s1n(x)/cos(x) < х
then L := х
else R := x until R - L < IE-4
DiflM 5, Операторы цикла ТВ1
Задание 45
Решение:
program Rectangle: var
a.	b. { длины сторон прямоугольника }
n.	{ наименьшее число квадратов }
к.	{ число одинаковых квадратов }
х: integer;
begin
n 0:
write ( 'Введите длины сторон прямоугольника: ’ ): readln ( а. b );
writein С 'Дан прямоугольник: ', а:2,	Ь:2 ):
write!п ( Квадраты: ’ );
repeat
if а < b then begin
х а:
а Ь: Ь :и х end:
k := a div Ь:
а := a mod b:
writein ( b, b. ' к ); n : n + к
until ( a = 0 ):
writeln ( 'Всего квадратов: n )
end. { Rectangle }
Задание 47
Решение:
program PythagoreanNumbers; var
a. b. c. ex: integer: begin
for a 1 to 20 do for b a to 20 do
begin ex a * a + b * b;
c := sqr( round( sqrtt ex ) ) ): if c » ex then wrlteln( a, b, c )
end
end. { PythagoreanNunfcers }
Задание 48
Решение:
program Line: var
N, 1: 1nteger:
begin
repeat
write ( 'Введите натуральное число N: ' ): readln ( N )
until hl > 0:
write ( S - ' ):
1 :- 2 - ord( odd( N ) 1:
I ipVUIUMVTWV 1, UTBffTW и решения
repeat
if 1 < 3
then write( i )
else writeC , i );
i 1 + 2
until i > N
end. { Line }
Задание 49
Решение:
С)
program DoubleMin: var
1 ; integer; { счетчик вводимых чисел }
x : integer:
mini, min2 : integer;
begin
1—0;
write ( ’Введите x= '
read ( x );
{mini ? min2}
while x о 0 do
begin
i := 1 + 1;
if i = 1
then mini x el se begin
if x <= mini
then
begin
min2 : = mini;
mini :» x end
else
if (1 = 2) or (x < m1n2) then min2 := x
end:
write ( Введите x= ' ):
read ( x )
end;
readln;
if 1 < 2
then writeln ( 'Было введено менее двух чисел’ ) else writeln ( ‘Два наименьших числа mini,
. ттп2 )
Ж end. { DoubleMin }
Задание 50
Решение:
с)
program Increase;
var
old, new: real;
begin
write ( ’x-' 1; readln( old ):
Ditia б. Операторы цикла 183
write ( ’х-‘ ): readlnt new ):
while (new о 0) and (new > old) do
begin write ( 'x-' ): old :• new: readln ( new )
end;
write ( ‘Последовательность ' );
if new <- old
then writeln ( ‘не является возрастающей’ ) else writeln { 'возрастающая' )
end. { Increase }
Задание 54
Решение (фрагмент программы):
х := 1:
for i 1 to k do
x : = i*x + 1/i:
Задание 62
Решение:
program IntegraISqrX: var
a. b.	{	концы отрезка }
h.	{	шаг интегрирования	}
s,	{	искомая площадь }
с: real:	{	промежуточная переменная }
i,	[шаг цикла }
n: integer; { количество разбиений отрезка } begin
write! 'Введите а. Ь. п: ’ ):
read ( a. b, п ):
h :« ( b - а ) / п:
s 0:
с :я а - h / 2:
for 1	1 to n do
begin
с c + h:
S : s + sqr( c ) end;
$ :-S *h;
writeln ( 'Интеграл равен \ s )
end. { IntegraISqrX }
Задание 63
Ответы:
a)	= 1,84147098;
b)	=1,73205090;
c)	» 14,6666666.
Задание 67
Решение:
program MaxValue;
var
iqw приложения i,итвяты и решения
а. Ь. х. у. h. max. xmax: real;
i. n: integer:
begin
write( 'Введите a, b, n: * ): readln ( a. b. n );
h :- ( b - a ) / n:
x a;
for i ;= 1 to n - 1 do begin
x :« x + h;
у ;= ( sqrt x)-3 * x + 2 ) / sqrtt 2 * x * sqr( x ) - 1 );
if (1 = 1) or (y > max) then begin
xmax x:
max := у end
end;
write ( xmax, max=‘. max )
end. { MaxValue }
Глава 6. Литерный тип
Упражнения, задачи, программы
Задание 1
Решение:
program Symbols; var
S_pred. S. Sjiext: char: n: integer;
, begin
write ( 'Введите символ: ' ):
readln! S );
n := ordt S );
writelnt ‘Порядковый номер символа S,
	’ - n );
if n > 0
then writelnt 'Предыдущий символ = pred(S) ) else writelnt 'Предыдущий символ отсутствует' );
; if n < 255
then writelnt ‘Последующий символ - ', succtS) ) else writelnt 'Последующий символ отсутствует' )
end. { Symbols }
Задание 2
Решение:
program LatinLetters: var
sym: char:
; begin
writein ( ‘Буквы латинского алфавита;' );
wrlteln ( '1. Прописные’);
for sym : ’A' to ’Z‘ do write(sym);
Глава 6. Литерный тип 185
wrlteln;
writelnt'2. Строчные'):
for sym : 'a' to 'z1 do write ( sym );
readln
end. { LatinLetters }
Результат работы программы:
Буквы латинского алфавита:
1. Прописные
ABCDEFGH1JKLMNOPQRSTUVWXYZ
2. Строчные
abcdef ghi j kl mmpq rstuvwxyz
Задание 3
Решение:
program Digits;
const
n - 10: var
c: char:
1. count: integer:
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:
wrlteln ( rBo введенной последовательности
‘символов count. * цифр' ):
readln
end. { Digits }
Задание 4
Решение:
program Test:
const
n = 20;
eot -var
c: char;
count; Integer;
begin
write ( 'Введите не более '. n. ' символов:' ): writeln ( ' признак конца последовательности -
" ", eot. " " );
count 0;
repeat
read ( c );
if (c a') and (c <- 'z'J
then count :« count + 1
until c = eot;
if odd( count )
1В0 Приложение 1 t Ответы и решения
then writeln( Предположение не верно' )
else wr 1 teln( ’Предположение верно' ); readln
end. { Test }
Задание 5
Решение:
program SymbolsCount: var
c, ch : char:
n. i ; integer:
S : integer;
begin
writein ( 'сколько символов будет введено?’ ):
readln ( n ):
writeln С ’вхождения какого символа 'будут подсчитываться?' );
readln ( ch );
S 0:
writeln ( ’введите последовательность символов' );
for 1	1 to n do
1	begin
read(c);
if c - ch then S S + 1
end;
writeln ( ‘количество вхождений символа '”, ch,	S )
end. { SymbolsCount }
Задание 6
Решение:
4'	program Substitution;
If	var
£	C: Char;
*.	first: boolean:
begin
write( 'Введите последовательность символов: ');
first :« true;
while not eoln do
beg 1 n
L	read t c >:
if first then begin
.	first false:
<	write ( 'Результат: ‘ )
end:
;	write ( c );
л>	if c - '.’ then writet '.." )
end;
writeln;
£ readln
I	end. { Substitution )
шример работы программы:
*	Введите последовательность символов: asf..e.gf.ws,8jh
Результат: asf.....e...gf...ws...8jh
1л*ш о. литерным тип юг
Задание 7
Решение:
program Convert: const
nul = '0‘:
nine = '9’:
point = '.1;
n ~ 10:
var
result: real: scale: real: c: char;
begin
result := 0;
writeln( ’Введите последовательность символов.’ );
repeat
read( 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 +
( ord(c) - ord(nul) ) / scale: end
end:
wrltelnf 'Результат = result );
readln
end. { Convert }
Задание 8
Решение:
program Summa;
const
eot " '.'; var
s. d: integer;
c. sign: char;
begin
Sign : = '+;
s : 0:
write ( 'Введите выражение в символьном виде: ’
repeat
read( с ):
d : ord(c)  ord('O); if sign = ’+’
then s :* s + d else s s ~ d;
read( sign )
until sign - eot;
readln:
writeln ( 'Полученная сумма в s );
readln
end. { Sumina }
Пример работы программы:
Введите 8ыра>кение в символьном виде: 1+1+2+1-4, Полученная сумма = I
Глава 7. Перечислимый тип, ограниченный тип, оператор варианта
Перечислимый тип. Упражнения
Задание 2
Ответ: t ml < m2 f
Задание 3
> Ответы:
;\.а)
.£  if m2 = Dec
.7 ' then ml dan
else m2 : = succ( m2 )
^b)
ml m2;
for 1	1 to к mod 12 do
if ml = Dec
Ж	then ml Jan
I	else ml := succ( ml )
Й
ml ;= Jan;
for 1 :« 1 to n  1 do ml := succ( ml )
I
/Оператор варианта. Упражнения
н'
^Задание 1
£ Ответ:
- case Ch of
'Г : N ;= 1;
Т: N - 5:
'к': N := 10;
Г: N 100:
else N	500
end:
ГДВМТ. ГЖЖЧИСЛИМЫЙТИП, 0Гр1НИЧ«ННЫИТИП. ОП»рвТОР «риаИТ!IO1
Задание 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, jure, July, august.
September, October, ncvember. december); var num: month: dayscount: 28..31;
begin
case num of
 february: dayscount:- 28 april, June. September: dayscount 30;
else dayscount r- 31;
end;
end.
Задание 6
Ответ:
Среди символов, вводимых с клавиатуры, подсчитать количество символов ’А’, 'Вт и ’С’.
Задание 8
Решение:
program Geometry; const
pl - 3.1415926:
var
r. s. 1, v: real:
к: integer;
begin
writet 'Введите радиус: ' J:
readln( г );
writet 'Введите номер варианта: ’ );
readlnt к );
case к of
1:
begin
s :» p1*r*r:
writelnt 'площадь круга - \ s)
end;
2:
begin
1 :« 2*pi*r;
writelnt 'длина окружности - 1, 1)
end:
3:
begin
v 4 / 3 * pi * sqrt r ) * r:
writelnt ’объем шара - 1, v) end
end
end. { Geometry }
Задание 9
Решение:
program OeleteComments;
var
state: (copy, beg_conment,comment, end conrrent);
i: integer:
C: char:
begin
state := copy:
while not eof do
if eoln
then
begin
readln;
wrlteln;
end
else
begin
readt c ):
case state of
copy:
if c » '(*
then state :- beg_conrnent else writet c ):
beg_comment:
if c e
then state := comnent
else
if c <> (‘
then
1ЛЩ F, ,Ц|Л .........................Ulll.l... .... . VIIWH"'VH
begin
writet . c ): state copy
end
else writet '(' ); comment:
1f C =
then state := end^comment: end_corrrnent;
if c - ')' then state copy el se
i	if c <>
|.	then state :» comment
I	end { case }
j	end
| end. { DeleteComments }
‘ Упражнения, задачи, программы
1 Задание 16
Решение:
program Zodiac: var
m: 1..12; { месяц } d? 1..31: { день } Zod: ( Ari. Tau. Cem. Can, Leo, Vir, Lib. Sco. Sag, Cap, Aqu, FIs ):
(
знаки Зодиака; Ari - Овен. Tau - Телец, Cem - Близнецы. Can - Рак. Leo - Лев, Vir - Дева. Lib - Весы. Sco - Скорпион. Sag - Стрелец. Cap - Козерог. Aqu - Водолей, Fis - Рыбы
begin
writet 'Введите месяц рождения '.
'(целое число от 1 до 12); '): readlп( ш };
writet ’Введите день рождения ', 1(целое число от 1 до 31): ');
readln( d ); case m of
1:	if	d	<=	20	then	Zod	Cap else Zod	: =	Aqu:
2:	if	d	<=	IB	then	Zod	:= Aqu else Zod	:=	Fis:
3:	if d 20 then Zod := FIs else Zod Ari;
4:	if	d	<=	20	then	Zod	Ari else Zod	:=	Tau;
5:	if	d	<=	21	then	Zod	:= Tau else Zod	:*	Cem;
6:	if	d	<“	21	then	Zod	: Cem else Zod	:	Can:
1.	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	Vlr	else Zod	:*	Lib:
10:	if d	<“	23 then	Zod	Lib	else	Zod	Sco:
11:	if d	<-	22 then	Zod	: =	Sco	else	Zod	:= Sag:
12:	1f d	<-	21 then	Zod	Sag	else	Zod	Cap
end:
write( 'Ваш знак Зодиака: ‘ );
case Zod of
Ari: writel nC ’Овен' >;
Tau; writeln( ‘Телец’ ):
Сст: writeln( ’Близнецы’ ):
Can: writeln( 'Рак' ):
Leo: writeint 'Лев' ):
Vir: writeln( 'Дева' ):
Lib: writelnt 'Весы' ):
Sco: writel n( 'Скорпион' J;
Sag: writelnC 'Стрелец' );
Cap: wr1teln( 'Козерог' );
Aqu; writel n( 'Водолей' );
Fis: writeln( ‘Рыбы’ )
end
end. { Zodiac J
Глава 8. Регулярные типы данных
Векторы. Задачи, программы
Г3адание2
 Решение:
program NuntersLocate;
const
m - 50: var
C: array [0..m] of char:
B: array [0. m] of boolean;
1: Integer;
begin
writeln( 'Введите элементы массива
'в количестве ш+1 ):
for i :=₽ 0 to m do
read( C[i] ):
readln;
for i :» D to m do
B[i] C C[i] >= O' ) and ( C[i] <= '9‘ ):
for i := 0 to ri do
wr1te( B[1], ’ ' )
end. { MuinbersLocate }
Задание 5
Решение:
program ReverseAnd6Columns;
const
m = 100; { количество элементов массива }
n - 6; { по n элементов в строке }
глава о. регулярные типы данных i va
var
х: array IL j] of integer;
1: i ntogcr;
begin
writeln( 'Введите '. m. ' злемента(ов) массива’);
for 1 := 1 to m do
read( x[l] );
readln;
for i m downto 1 do
begin
wrlteC x[i], ' ' ):
if ( m - i +1 ) mod m = 0 then writeln end
end. { ReverseAnd6Col Limns }
Задание 8
Решение:
program Derivative:
const
n = 20;
var
a: array [0.,n] of real;
x, t: real;
у : real; { значение многочлена в точке t }
yl: real: { значение производной в точке t }
i; 1nteger;
begin
writelnt 'Введите коэффициенты многочлена:’ );
for 1 := 0 to n do
read( a[i] );
readln;
writet 'Введите значение переменной x: ' );
readlnf t );
x : = t;
У	:= 0:
У1	:= 0;
for i :> 1 to n - I do
begin
у у + а[т] * x;
yl := yl + (1 + 1) * a[1+l] * x;
x :• x * t
end:
У := У + a[0] + a[n] * x:
yl yl + a[l];
writelnf 'y(x)=\ y;7:3. ' y"(x}='. yl:7:3 )
end. { Derivative }
Задание 9
Решение:
program RusLette^s;
const
num_l etters = 33;
type
setofletters: array [1. .num letters] of char; const
small_letters: set_of_letters =
(’a'.	, 1 в'. Гг'. 'д'. 'e', *e’,
'ж', ’з’.	'и', T,	'к', ‘л’.	'м‘.
’н'. 'o’,	*п'. 'р\	‘с‘. 'т',	’У’.
'Ф'. *x‘.	'ц'. 'ч'.	’ID’, щ‘.	 ъ' ,
' ы ‘' ь ’ .	*з', 'ю’.	я‘):	
bigjletters; set	of letters		
('А'. ‘Б1	7 ’В', 'Г1.	'Д’. Е‘	. ’Е'
’Ж’, ’3'.	'И'. 'И'.	’К', Л',	М',
'H'. 'O’.	'Л', ’Р'.	’С'. ’Г.	’У'.
•ф’, 'X',	'Ц'. 'Ч',	’Ш’, т.	’Ъ',
’Ы’, 'b1 ,	'3'. ’IO’,	Я’);	
var			
i: integer;			
begin			
writeln ( 'Буквы	русского алфавита: '		):
writeln ( ’1. Прописные1 );
for i ;=* 1 to num_letters do writet big lettersfi] );
writeln;
writeln ( '2, Строчные’ ):
for 1	1 to num_letters do
writef small_letters[l] );
readln
end. { RusLetters }
Результат работы программы:
Буквы русского алфавита:
1. Прописные
АББГ ДЕЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЗЮЯ
2. Строчные
абв г деежз ийклмнопрстуфхцчшщьыьзюя
Задание 10
Решение:
а)
program Points;
const
n_max - 80;
var
txt: array [l..n_inax] of char:
1. n: integer;
point: boolean;
begin
writeln ( 'Введите последовательность символов',
' длиной не больше птах,
1 :- 0:
while not coin and (i < njnax) do
begin
i := i + 1:
read( txt[1] )
end:
readln:
n := 1:
point :* false;
writeln( 'Преобразованная последовательность;’ );
for 1 - 1 to n do
begin
1f txt£1] -then
begin
if not point then
{ это первая встретившаяся точка } begin
write( txt[1J );
point :* true end
end el se begin wrlteC txt[i] ): point false end end { for }
end. { Points }
Задание 11
Решение:
program Spaces;
const
n max • 80:
ch :
var
1. n. max, count: integer:
txt: array [l..n_max] of char:
begin
wri teln( 'Введите последовательность символов*. ’ длиной не больше *. n_max. ':‘;
1	0;
while not eoln and (1 < n_max) do
begin
1 :» i + 1;
read( txtEi] )
end;
readln:
n := 1:
max 0:
count 0;
for 1 := 1 to n do
if txt[i] = ch
then
begin
count count + 1; if count > max then max :и count end
else count :- 0;
writelnt 'Максимальное количество 'символов '". ch, - ', max ):
readin
end. { Spaces }
Задание 20
Решение:
program Not In;
var
letters: array C’a'./z’] of boolean;
C: char;
begin
{ инициализация массива }
for c := 'a' to *z* do letterstcj false;
writelnt 'Введите последовательность символов:' к while not eoln do
begin
readt c );
if (c >- 'a') and (c <= 'z') then letters[c] ;= true
end:
readln;
writelnt 'Буквы, которые не вошли в ', 'последовательность:');
for с := ’a' to 'z.' do
if not lettersEc] then writet c. ' ' ): writein
end. { Notin }
* Пример работы программы:
t Введите последовательность символов: sdfkj kjhkjhkjhk235kj kjhkjh346457kjh kjh Буквы, которые не вошли в последовательность: a b с е g 1Imnopqrtuvwxyz
Задание 25
. Решение:
program Sima; var
к: array [1..100] of real:
a: array [1..30] of 1..100;
s: real;
1, j: integer;
begin
writein ( ’Введите значения элементов*.
' массива х:' ):
for 1	1 to 100 do
readt x[i] );
readln:
writelnt 'Введите значения (1..100) элементов'.
* массива а:1);
for i := 1 to 30 do
readt a[i] J;
readln;
s := 0:
for 1 := 1 to 30 do
s := s + x[ a[i] ];
writelnt 's = '. s:7;3 1
end. { Summa }
Глава 0. Регулярные типы данных
Задание 28
Решение:
program LettersFrequency: type
1etter - 'a1.. 1 z1: var
{ массив счетчиков латинских букв } counters: array [letter] of integer; c: char:
begin
{ обнуление счетчиков } for с :=₽ 'a' to 'z' do counters[c] := 0: writet 'Введите текст: ’ ); while not eoln do beg 1 n readt c ): if (c =-= 'a') and (с <и 'z') then counters[c] := counters(c] + 1 end;
readln;
{ вывод на печать результата } writelnt 'Частота встречаемости *. 'латинских букв:’ ): for с : = a’ to ’z’ do writelnt с, counters[c] ): readln
end. { LettersFrequency }
Пример работы программы:
Введите текст: my heart is in the highlands. my heart is not here Частота встречаемости латинских букв: а-3 b-0 с-0 d-1 е-5 ГО д-1 h-б 1-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
У-2 z-0
Задание 47
Решение:
с)
program Position;
const
n - 40:
var
x; array [l..n] of integer;
y. k. 1; integer;
t: boolean;
begin
writeln( 'Введите значения элементов', ' массива х:‘ ):
for 1 := 1 to n do read( x[i] };
write( 'Введите значение у = ' );
readln( у ):
к 1:
while (к <- n) and (у <> x[k]) do к :» к + 1;
writelnC ’к-'. к )
end. { Position }
Задание 54
Решение (первый вариант): program ArithnieticMeanl; const
n » IDO; var
x: array [1..n] of real;
S. b, c: real:
i: integer;
begin
writeln( 'Введите значения элементов', * массива х:* ):
for i ;ж 1 to n do read( x[i] )-, readln;
b r- X[l];
S := 0:
for i 2 to n do begin
c :» x[1];
S - S + b;
x[i] ;= S / (т-1); b c
end:
writeln( 'Полученный массив x:' );
for i 1 to n do write( x[i]. ' ' ) end. { ArithmeticMeanl }
Пшм в, Регулярные типы данных 1VM
Решение (второй вариант):
program ArithmeticMaan2: const
n - 100:
var
x: array Cl--nJ of real:
S. b. c: real:
1: integer:
begin
writeinc 'Введите значения элементов
1 массива х:’):
S 0:
for 1 :» 1 to n do begin
read( x[i] ):
S S + x[i] end;
readl n:
for i n downto 1 do begin
S :- S - x[i];
x[1] S / (1-1)
end:
writelп( ‘Полученный массив x:‘ ):
for i 1 to n do
write( x[1]. 1 ’ )
end. { ArithmeticMean2 }
Задание 60
Решение:
b)
program ExchangeSort:
const
n - 100:
var
x : array [1. n] of integer:
y. i. к : integer:
begin
writelnt 'Введите значения элементов массива х:‘ ):
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;
writelnC 'Упорядоченный массив x:’ );
for к :• 1 to n do write( x[k],‘ 1 ) end.{ ExchangeSort }
*w 11рилож*нме i. ответы и решения
Задание 62
Решение:
program Min InAddition;
var
х : array [1..30J of integer;
у : array [1..30] of integer;
min. k, i ; integer;
begin
wrltelnC ’Введите значения элементов первой ’ последовательности х.1 );
for к 1 to 30 do
read( x[k] ):
readin;
write!n( ’Введите значения элементов ’.
1 второй последовательности у:’ );
for к := 1 to 30 do
read( у[к] ):
readin;
min :» Maxlrit;
for i := 1 to 30 do
begin
к =1;
while (k <= 30) and (x[i] <> y[k]) do
к - к + 1;
if к >30 then
{x[1] не входит во вторую последовательность} if min > х[1] then min x[i]
end:
writet ‘min=’. min )
end,{ MinlnAddition }
 Задание 64
: Решение:
program UniqueEntrylntoText;
var
x : array [1..26] of char: { массив лат. букв }
s : array [’a'..’z'] of integer; { счетчик букв }
с ; char.
1. k. j : integer;
{ k - кол-во встретившихся по одному разу
латинских букв }
begin
for с := ’a' to 'z* do
s[c] := 0;
writeln( 'Введите текст, заканчивающийся ’точкой:’ ):
read( с ):
while с <> ’. ’ do
begin
s[c] := sic] + 1;
read( c )
end;
readln:
{ формирование результата }
k := 0:
for c :- 'a' to z’ do
if s[cJ « 1 then
Шам б Регулярны* типы данных 201
| пуква встретилась первый раз } begin
к к + 1:
х[к] с
end;
{ вывод результата }
for 1 := 1 to к do
writet х[1].' ' );
end.{ UniqueEntrylntoText }
Матрицы. Задачи, упражнения
Задание 47
Решение:
Ь)
program Substitution;
type
vector = array [l..n] of Integer;
matr = array [l..n] of vector;
var
A : matr;
X : vector;
l.j : Integer;
begin
write!n( 'введите матрицу A;1 );
for i 1 to n do
for j ;= 1 to n do
read( A[1.j] );
readin;
writelnt 'введите вектор x:h );
for i 1 ton do
read( x[1] );
readln;
for j 1 ton div 2 do
for 1 ;= 1 to n do
A[l,2*j] := x[i];
writeln( 'полученная матрица A:' );
for 1	1 to n do
begin
for j := 1 to n do
write( A[1JL’ ' J;
writeln
end
end.{ Substitution }
Задание 50
Решение:
с)
program SumElementInSecti on;
var
A : array [1. 9, 1..9] of real;
5 : real;
l.j: Integer;
begin
writelnf 'введите матрицу A:' );
203 Приложение 1. Ответы и решения
for 1	1 to 9 do
for J 1 to 9 do
readt A[i J] );
readln:
s 0;
for i :• 1 to 9 do
s s + A[1,i] + A[i,10-1]:
{ элемент на пересечении диагоналей суммируется дважды }
S S ’ А[5.5]:
writet 'сумма элементов из заштрихованной области- ‘. s:5:2 ) end.{ SumE lenient InSect ion }
Задание 54
Решение:
program DeleteColRow;
const m - 20:
var
A : array L.m] of integer:
В : array [l..m - 1, 1..m - 1] of Integer:
k. n, 1. j : 1. .m:
begin
writelnt 'введите матрицу A:‘ ):
for i 1 to m do
for j :» 1 to m do
readt A[1.j] ):
readln:
writet 'введите номер удаляемой строки (1,.
m. ):
readln( n ):
writet 'введите номер удаляемого столбца (1,/, m. '): ‘ }; readlnt k );
for 1 :- 1 to n - 1 do
begin
for j	1 to k - 1 do B[i,j] A[i,j]:
for j	k to in - 1 do B[i ,jj :“ A[1 J + 1];
end;
for i n to m - 1 do
begin
for j :* 1 to k - 1 do B[1.j] A[i + l.j]:
for j k tom - 1 do
B[i J] r- Afi + l.j + 1];
end;
writelnt ’полученная матрица B:‘ ):
for i 1 to m - 1 do begin
for j :» 1 tom - 1 do writet B[i,j], ' ' writein
end
end.{ DeleteColRow }
Задание 58
Решение:
Ь)
program Ordering:
const
n «= 20:
Dibm 8. Регулярные типы денных 20!
nl - 30.
var
А : array [L.n. l..nl] of Integer;
i, j, m. к : l,.nl;
r. s. sjnax : integer:
begin
writelnt 'введите матрицу A;' ):
for 1 : 1 to n do
for j :« 1 to nl do read( );
readln;
{сортировка no неубыванию выбором}
for к := n downto 2 do begl n
{m - номер строки с максимальной сумной}
m 1: s max :» 0; {s_max - сумма элементов первой строки} for j : 1 to nl do
smax s_max + A[l.j];
for i 2 to k do begin
{s - сумма элементов 1~й строки}
s г- 0:
for j 1 to nl do s s + A[i J]; if s > s max then
begin sjnax :* s; hi : 1
end;
end;
if k о m then
{перестановка пьй и k-й строк}
for j := 1 to nl do begin
Г A[k J];
Afk.j] ;”A[m,jJ;
A[in.j] r end;
end;
writelnt 'полученная матрица:’ ):
for 1 ; 1 to П do begin
for j 1 to nl do
write{ A[1.j]. ' ’ );
wrlteln end
end.{ Ordering }
Задание 60
Решение:
program Symmetry: const
n = 10;
var
A : array [l..n. l..n] of integer:
Ирид ожени* 1. Omer ы и решении
1. J : 1. .п: b : boolean; begin
writeinc 'введите матрицу А:' );
for 1	1 to n do
for j := 1 to n do readf A[1 ,j] ): readln;
1 := I;
b := true:
while (1 < n) and b do
{ 1<n т.н. элемент A[n,n] можно не рассматривать } begin
{чтобы не рассматривать диагональный элемент) j := 1 + 1;
while (j <= n) and (a[iJJ - a[j,1]J do
j := J + 1;
if j <= n
then b := not b
else 1 := i + 1 end;
if b
then wrltelnC ’матрица А симметрична' )
else writeln( 'матрица А не является симметричной’ ) end.( Symmetry }
Задание 65
Решение:
program OftenMet;
{ непустая последовательность слов (не более 30) } type
{ 1-я и последняя буквы слова }
Bukva = array [1..2] of char:
var
В ; array [1,.30] of Bukva:
{ число появлений пары букв }
А : array [1..30] of 0..30;
1. j. k. max. ijnax : integer;
c. p_c : char;
begin
writelnf 'введите текст, заканчивающийся точкой' ):
1 := 1;
repeat
read( с );
B[i.1] - с;
while (с <> '.') and (с <> ',‘) do
begin
р_с := с; {р_с - предыдущий для с символ] read( с )
end;
B[i.2] := р_с; {вс либо точка, либо запятая]
1 := 1 + 1
until (с = 'or (1 > п);
к ;= т - I: (к - количество слов)
for j := 1 to к do А[1] ;= 0;
for i := 1 to к do
if A[i] =0 then
Plata 6. Регулярные типы данных 205
|мщл1 букв еще не обрабатывалась}
for J 1 * 1 to k do
1f B[i] - B[j1 then
begin
A[i] := A[i] + 1:
A[j] - A[j] + 1 end;
max := A[l];
ijnax := 1;
{нахождение номера максимального элемента в массиве А} for 1 := 2 to k do
if max < A[i] then
begin
max := A[i];
1_max ;= i
end:
if max = 1
then writeln( 'все пары встречаются по ’, 'одному разу’ } 
else writelп( 'наиболее часто встреч-ся пара:', B[ijnaxrl], B[1_max.2] ) end.{ OftenMet }
Задание 70
Решение:
program CorrectRecord;
type
color = (red, blue, green, yellow, black, white); stroka- array [1..6] of char;
var
cl : array El--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[63 ;= 'white ';
writeln( 'введите строну, заканчивающуюся
1 пробеломi’ );
read( с );
i 0;
while (c <> ' ') and (i < 6) do
begin
i := i + 1;
s[i] := c:
read( c )
end:
while (c <> ' ') do
begin
i := i + 1:
read( c ) end;
WO приложение 1. Ответы и решения
readin;
1f 1 > 6
then write!п( 'ошибка' )
else
begin
{заполнение оставшейся части пассива пробелами}
for к :• i + 1 to 6 do
s[k] ;- '
у :• red:
j 1:
while (j <= 6) and (s о cl [j]) do
begin
j J + 1:
у succ( у )
end:
1f j <* 6
then x :** у
else writeln( 'ошибка' )
end
end.{ CorrectRecord }
Задание 74
Решение:
e)
program HodificationString:
type
stroka - array [1..80] of char;
var
s : stroka: (s - строка символов}
1. j. k : integer: {k - количество букв}
begin
writelnC 'введите текст, заканчивающийся пробелом' );
k :- 0;
repeat
k k + 1:
read( s[kj )
until (s[k] - ' ') or (k-40):
{заполняем остаток массива пробелами}
for j k + 1 to 00 do s[jj ‘
i :• 1:
while 1<-k do
begin
if (sm - v)
then
begin
{освобождаем место для буквы u}
for j k downto 1 + 1 do
s[j + 1]	s[j];
s[i + 1] :* 'if;
i : i + 2: {т.н. и проверять не нужно}
к :» к + 1 {увеличилось количество буке}
end
else i i + 1
end:
writelnf s )
end. ( Modificationstring }
Имев 8, Регулярны* типы данных 20
Задание 78
Решение:
Таблица 1. Массив Data — даты начала действия знака Зодиак
(индекс — месяц, Datafl] — числ
type
stroka- array [1..8] of char:
{ 8 - максимальное количество букв в названии знака Зодиака }
var
zz : array [1..12] of stroka:
Data : array [1..12] of 19..23:
Dm i array [1.12] of 28. .31
m.d : Integer; fl : boolean;
{ верно ли введена дата: true - верно, false ~ нет } begin
Data[l]:=20; Data[2]-19: Data[3]:-21;
Data[4]:-20; Data[5]:*21: Data[6]:-22: Data[7]:=23: Data[8]:-23: Data[9];-23: Data[101:=23: Data[ll]:-23; Data [12]-22: D_m[l]:-31;	D_m[2]:-29:	Dm[3];-31:
0_m [ 4 ]: -30;	Dj[5]: -31; Djr [ 6 ] : -30:
D_m[7]:-31; D m[8]:-31: D m[9]:-30; Djn[10]:-31: D_m[ll]—30; Djn[12]:-31; zz[l]:-‘Водолей 22[2]:-'Рыбы гг[3]:=’0вен ';
zz[4] — 'Телец ';
zz[5]—’Близнецы':
zz[6]:='PaK	':
zz[7J—'Лев ':
zz[81:-'AeBa zz[9]:='Becbi zz[10]:='Скорпион': zz[ И] —'Стрелец ’: zz[12]:=’Ko3epor ': repeat
wrlteC введите месяц в диапазоне 1-12;‘ ): readln( m );
until (m >= 1) and (m <• 12): repeat
fl := true;
write( 'введите день;' ) readln( d ):
{ проверка корректности ввода }
if (d > D m[m]) or (d < 1) then
«ио приложений 1. ответы и решения
begin
П false;
writelnt 'такого дня в 1. го. ' месяце нет ! ) end
until fl:
if d>-Data[ml then writelnt zz[m] ) else
if m = 1
then writelnt zz[12] ) else writelnt zz[m-l] ) end.{ SignsOfTheZodiac }
Глава 9. Процедуры и функции
Задачи, программы
Задание 1
Г; Решение:
program Calculate!;
var
х. у. func : real;
function S1gn( x : real ) : integer;
begin
if x < 0
then Sign ; = -1 else
if x > 0
then Sign ;= 1
else Sign := 0
end;( Sign }
begin
writet 'Введите значения переменных X. Y: ' );
readlnt x. у };
func (S1gn( x ) + S1gn( у ))*S1gn( x + у ):
writelnt 'Значение функции; func )
end.{ Calculate! }
^Задание 2
^Решение:
program Calculate?;
var
s. t, func. hl : real:
{ функция нахождения максимума } function maxt x, у : real ) ; real;
begin
if x < у
then max ;• у
else max x;
end;] max }
{ функция H(a.b) }
function H( a. b ; real ) : real;
var t ; real;
begin
t a - b;
там v. । |роцвдуры и функции *w
н  J / и ♦ sqrt b В ♦ b / (1 + sqr( а )) -sqr( t ) * t;
end.{ H }
begin
writet ’Введите значения переменных S. Т: ’ ):
readlп( s. t );
hl :-H( S - t, $ + t ):
func :== Ht s, t ) +
maxt sqrt H( s - t. s * t ) ).
sqrt sqrt hl ) ) ) +
H( 1. 1 );
writelnt 'Значение функции: func ):
end.( Calculate2 }
Задание 7
Ответ:
а) в результате работы программы будет напечатано:
2 О
2 5
Задание 8
Решение:
program CaclculateNOD:
var А. В, Cr N : integer:
function NODt х, у : 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
writelnt ’Введите 3 числа’ );
readlnt А. В. C ):
N := NODt A. 8 ):
N := NODt C. N };
writelnt 'Наибольший делитель 3 чисел - N )
end.{ CaclculateNOD }
Задание 12
Решение:
program SimpleNumbers:
var j. x. N : Integer;
function Testt X : integer ) : boolean;
var
1 : Integer;
b : boolean;
begin
1 - 2;
b true:
while (1 <- sqrt( X )) and b do
begin
b	X mod I о 0;
1	1 + 1
end;
Test := b
end:{ Test }
begin
writet 'Введите количество простых чисел ' ): readln( N );
1	0;
X 2;
while (1 < N) do
begin
if Test( X ) then
begin
writeln( X );
i := i + 1
end;
X :« X + 1
end
'< end.{ SimpleNumbers }
it J
Задание 17
f Решение:
'* function vowels ( ch ; char ) : boolean;
const
num_vowels “ 20:
vowel : array [1.. num_vowels] of char -
(‘a','e’,'e','и1.'o','у‘'ы1,'э','ю',* a’.
'А'.'Е'.'Е'.'И'.'О'/У'/Ы'/Э'/Ю'.'Я-); var
yes ; boolean;
1 ; integer;
begin
yes :« false;
1 := 1:
while not yes and (1 <= num_vowels) do begin
yes ch =•= vowel[1J:
1 :-1 +1:
end;
vowels r- yes
end;{ vowels }
Гадание 19
ешение:
program Replace;
const
N - 20:
Oiaм 8. Процедуры и функции 211
typo
(тип - последовательность }
Seq - array[l..N] of integer: var
A. В : Seq;
{ ввод последовательности } procedure InputSeqt var X : Seq ); var
i : integer:
begin
for 1	1 to N do
begin
write( 'Введите ’,
1,	'-й элемент последовательности' ); readlnC X[1] )
end
endr{ InputSeq }
{ печать последовательности } procedure PrintSeq( X : Seq ); var
1 : Integer:
begin
for 1	1 to N do
write( X[1J );
writeln
end;{ PrintSeq }
{ поиск минимального элемента }
function MinlmumSeqC X : Seq ) : integer: var
1.	Min : integer:
begin
Min X[l];
for 1	2 to N do
if X[i] < Min then Min X[1];
MinimumSeq Min
end;{ MinlmumSeq }
{ поиск индекса максимального элемента ) function MaxTTnumSeqt X : Seq ) : Integer: var
1, Max : Integer;
begin
Max 1;
for 1	2 to N do
1f X[i] > X[Max] then Max 1:
MaximumSeq Max
end:{ MaximumSeq }
{ замена элементов, которые расположены за максимальным } procedure ReplaceMaxMin( var X : Seq ):
var
Min. Max : Integer;
I : integer;
begin
M1n := MinlmumSeqf X );
Max MaxImumSeqt X );
for 1 Max + 1 to N do
X[i] Min
end:{ ReplaceMaxNin }
begin
writelnt 'Введите первую последовательность' };
Input Sept A ):
writelnt 'Введите вторую последовательность' );
InputSeqt В ):
ReplaceMaxMint A );
ReplaceMaxMint В ):
writelnt 'Результаты замены в',
‘первой последовательности' );
PrintSept А ):
wri tel в( ' Результа ты за мены во'.
’ второй последовательности' );
PrintSeqt В )
end.{ Replace }
Задание 23
Решение:
program SurmaS; const
N = 10;
M = 5:
Type
Matr = array!1..К l-.H] of real: var
A : Hatr:
В : array [1..N. 1..MJ of boolean;
l.j: Integer:
S ; real;
function TestSumt 11, jl : integer:
S : real ) : boolean: var
1, j : integer:
Surma : real;
begin
Surma := 0;
for 1 :« 11 - 1 to 11 + 1 do
for j := jl - 1 to jl + 1 do
if ti >= 1) and (1 <» N) and
(j >= 1) and (j <= M)
then Summa := Surma + A[i,j]:
TestSum : = Surma < S
end:{ TestSum }
begin
writelnt 'Введите исходную матрицу' J;
for 1 := 1 to N do { Ввод матрицы A } begin
for j 1 to M do
readt A[1,j] ):
readln
end:
writet 'Введите значение сунны' );
readln( S ):
for i := I to N do { Вычисление матрицы В }
for j := 1 to M do
глма у. процедуры и функции
И| LJJ :• TestSumt 1. j. 5 ):
WI ilr-ltH 'Матрице В1 );
for I ;• 1 to N do { Печать результатов } begin
for j 1 to M do
writet B[i.j] J;
wrlteln end end.{ SummaS }
Задание 28
Решение:
► program Change;
const
N = 100:
var
A : array[l..N, 1..N] of real:
l	.j, Maxi. MaxJ : integer;
procedure InputMatr;
begin
{	ввод матрицы }
end;( InputMatr }
procedure PrintMatr:
begin
{	печать матрицы }
end:{ PrintMatr }
{ обмен строк }
procedure ExchangeRowsf x, у : integer );
var
i	: integer;
Buffer : real;
begin
for i := 1 to N do
begin
Buffer ;= A[x,1];
A[x,i] := Afy.i]:
A[y.1] := Buffer end
end;{ ExchangeRows }
{ обмен столбцов }
procedure ExchangeColunins( x. у : Integer }; var
i	: integer;
Buffer ; real:
begin
for i := 1 to N do
begin
Buffer ;= A[i,x];
ALi.x] - ALi.y];
A[i.y] := Buffer end
end;{ Exchangecolumns }
Tow3 С':
Hano1_Tower(Towlr Tcw2. Tow3. n):
write(’Нажмите клавишу «Enter*.,.'); readln
end. { Hanoi }
Глава 11. Строковый тип
Задачи, программы
Задание 1
Решение:
program test;
const
n - 255;
type
str « 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
read( S[length] );
end:
readln
end; { readl nstri ng }
( ПЕЧАТЬ СТРОКИ (имитация оператора write) } procedure write string(var S : str;
length : Integer); var
i ; Integer;
begin
for 1 ;» ! to length do write( S[i] ) end;{ write_string }
{ ПОИСК СИМВОЛА В ПОДСТРОКЕ
Частный случай поиска подстроки. Результат; порядковый номер искомого символа в строке. Если символ не найден, функция возвращает значение 0 }
function find_char (var S : str;
length : integer;
ch ; char ) : integer: var
1 : integer;
no : boolean:
begin
1 I.
no I rut';
while (I <- length) and no do begin
no S[i] <= ch;
i i + 1
end;
if no
then findchar 0
else find_char := i - 1 end:{ findchar }
{ ПОИСК ПОДСТРОКИ
Здесь S - строка, в которой ищем.
subS “ подстрока, которую ищем.
Результат - номер позиции вхождения или О, если подстрока не содержится в строке.
Пример.
5яподлесок. subS-лес
результат: 4
Для типа string p:=pos (искомая подстрока, строка поиска), где р=0, если подстрока не найдена, иначе - номер позиции вхождения) }
function find_substring( var S, subS : str: length_S, length subS: integer
) : Integer;
var
j. j : integer:
begin
j := 0;
i := 1:
while (i <* length s - length_sub$ + 1) and (j < length_subS) do
begin
j 1;
while (j <= length_subS) and
(1 + j - 1 <= length_S) and (S[i + j - 1] - subS[jl) do j := j + 1:
1	1 + 1;
end;
if j <= length_subS
then find-Substring := 0
else f1 nd substring i - 1 end;{ find_substring }
{ ПРОВЕРКА НА СОВПАДЕНИЕ
Для string: sl=s2
Результат true, если строки идентичны, иначе false }
function equal_string( var SI, S2 : str;
lengthl, length2 : integer ) : boolean;
var
1 : integer;
«си—। |рилож*нив 1. игмтыирешении
OK boolean:
begin
OK lengthl - length2;
if OK
then
begin
1 := 1;
while OK and (i <= lengthl) do
begin
OK : = Sl[i] = S2[i];
1 := i + 1 end
end;
equal : = OK
end;{ equal_stnng }
{ ИСКЛЮЧЕНИЕ ПОДСТРОКИ
Здесь pos - индекс первого исключаемого символа.
пит - количество исключаемых символов.
Имитация оператора delete.
Пример.
подлесок. pos=4. пипгЗ
результат: лодок }
procedure de1ete_substгi ng
( var S : str;
var length : integer;
pos. num ; 1nteger ):
. var
1 ; integer;
begin
if (pos > 0) and
(pos <= length) and (num >= 0) then
begin
for i := pos to length - num do S[i] : = S[i + num];
if pos + num - 1 <= length then length ;= length - num else if pos <= length
then length :=* pos - 1
end
end;{ delete_subst ri ng }
{ ВСТАВКА ПОДСТРОКИ
Здесь SubS - вставляемая подстрока,
S - принимающая строка,
length_subS, length s ~ их длины,
pos - позиция вставки.
Имитация оператора insert.
Пример:
лодок
подстрока = лес,
позиция вставни=4
результат; подлесок. }
procedure insert_substring ( var SubS. S : str;
length subS : integer:
var lengthj; : integer: pos : integer ); var
d, i ; integer;
begin
d Iength_subS + length Ji:
[ЛЯМ 1 1. строковый
if cl •- h
then
begin
for i : 0 to length_subS - 1 do
begin
S[ d - 1 ] := S[ length_S - 1 ];
S[ pos + length_subS -1-1 ] :=* SubS[ length subS - 1 ];
end;
1ength_S:=d
end
end: { insert_substr1ng }
{ ИНВЕРСИЯ СТРОКИ
Пример?
подлесок
результат: коселдоп }
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 -1+1];
SElength - i + 1] := c
end
end: { inverse string }
begin
writeln! 'Введите строку и подстроку *, 'для проверки' );
readln string! si. 11 ):
read!n_string( s2. 12 ):
writeln! ‘Введите символ для поиска' );
readln! с );
write! с.г" входит в );
writestring! si. 11 );
writeln! '" с позиции ',
find_char( si. 11, c ) );
write! );
write string! s2. 12 );
write! входит в );
write_string( si, 11 );
writeln! с позиции
find substring! si, s2. 11, 12 ) );
if equal_string( si, s2, 11, 12 )
then writeln! 'Строки совпадают' }
else writeln! 'Строки не совпадают’ );
p := find_substr1ng( si, s2. 11. 12 );
if p = 0
then
begin
write! 'Подстрока ” ):
wr1 tejtrlnflt s2, 12 );
write! '" не содержится в ): wr1te_str1f2( si, 11 );
wr1te’n( )
end else
begin
writet 'Подстрока '" ); write_string( s2. 12 );
write( "' содержится в ): wr1te_$tring( si, 11 ):
writelnt с позиции N', p ): deletesubstringt si, 11, p. 12 ); writet 'После исключения подстроки
'имеем
write_str1ng(sl.ll);
writelnt "" )
end:
insert^substringt s2, si, 12. 11, p );
writet 'После вставки подстроки имеем ); write_string( si. Il ): writelnt "" ):
Inverset si. 11 );
writet 'После инверсии: '" ); wr1te_string( si, 11 ):
% writet "" ):
? readln
f end. { test } r
Задание 2
(решение:
program check:
il const
'/' wrd : array [1..4] of char •
kv.	t 'з', re‘, 'я' ):
t var
i,	s	:	string;
£.	i	:	integer;
7	OK	;	boolean;
begin
writelnt 'Введите последовательность символов:' ): readlnt s ):
OK :• true;
1	1;
while OK and ti <- 4) do begin
OK post wrd[i], S ) <> 0:
i ;= i + 1 end;
if OK
then writelnt 'предположение верно' )
else writelnt ‘предположение не подтвердилось' ); readln
end. { check }
тлев» TT, CTpOMUWWITTHn
Ваданиев
Решение:
ргодгвт < •«лгцрТс*;
uses Crl ;
const
kbtsc - #27:
kbEnter - #13:
kbLeft - #75:
kbRight - #77;
kbllp = #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 :» left;
kbRight : key_type :ж right;
kbllp : key_type :« up;
kbDown : key_type down
el se
end: { case }
end { if J
else key_type symbol
end;{ key_type }
function replace ( ch ; char ) : char;
const
StrLen - 92;
charFrora : stringCstrLen] -
"1234567890’+
'qwertyuioptlasdfghjkl;'lzxcvbnm,+
1 @#$Г&*()'+
'QWERTYUWPtJASOFGHJKL; ‘ ‘2XCVBNM'+
' - •
charTo : string[strLen] =
'£1234567890'+
'йцукенгшщзхъфыва пролджэяченит ьЬю.--’+ /	'Ё1234567890'+
'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛдаЭЯЧСМИТЬБЮ?..';
var
Stop : boolean;
i : integer;
begin
Stop - false,
1	1:
while not Stop and (i <- strLen) do
begin
If (charFron[iJ - ch) or (charTofiJ - ch) then Stop true else 1nc( i );
end;
if Stop
then replace : charioti]
else replace ;= ' ’ end;{ replace j
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 : 1f x < highX then x x + 1;
up : if у > lowY then у ;= у - 1;
down : if у < highY then у ;= у + 1;
t •	else
t	end; { case }
c	if action = symbol
then write( replacet c ) ) else GotoXYt x. у );
£.• until (c = kbEsc) or (c = kbEnter);
»	end J example }
f r.
Ллава 12. Записи, оператор присоединения
^Задачи, упражнения, программы
Ж-. 
^Задание 1
^Ответы:
1^)
type Цена = record
*	рубли; integer;
'Г-	копейки; 0 .. 99
V	end;
Ъ)
type Время » record
часы; 0 .. 23:
минуты, секунды: 0 .. 59 end;
type Дата = record
число; 1	31;
ГИЯМ 1*7
месяц: 1 .. 12: год: integer •nd;
type
Строка - array El.,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 HodKonyat 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
(abs( nl.hor - n2.hor ) = 2) end;{ HodKonya }
d)
{ Ход ферзя }
function HodFerzya( nl, n2 : pole ): boolean;
begin
HodFerzya :» (nl.hor = nZ.hor) or
(nl.ver « n2.ver) or

(abs( nl.hor - nZ.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; tStHng: { название }
Len; integer { длина }
end;
{ Тип 'Массив рек' }
tAlIRiver - array [1..MaxRiver] of tRIver;
var
Rlv: tAlIRiver; { Массив рек }
i, и: 1..MaxRiver;
j: integer;
{ Процедура печати названия сапой длинной реки }
* procedure MoreLengttiC riv : tAlIRiver );
var
1.	IndMax: 1..MaxRiver;
J:	1..MaxLen;
begin
{ определение индекса самой длинной реки в массиве }
IndMax 1;
for 1 := 2 to n do
1f riv[i].len > riv[IndMax].len then IndMax i
{ Печать названия этой реки }
with riv[IndMax] do
for j := 1 to ord( Name[0] ) do
write( NameLj] );
writeln
end:{ MoreLength }
begin
{ ввод количества рек }
writelnC 'Введите количество рек'.
’(от 1 до MaxRiver. ')' ):
readln( n ):
{ ввод массива рек }
for т := 1 to г do
begin
{ ввод названия реки }
writeln( 'Введите название реки’ );
j 0;
while not eoln and (j < MaxLen) do
begin
j j + 1:
read! r1v[1].nanie[j] )
end:
readln;
{ определение длины названия реки }

rivl11nim»(0] chr( J ):
{ под длины реки }
wr1teln( 'Введите ее длину' ):
readlnC r1v[iJ.len )
end;
{ вывод результатов }
write( 'Самая длинная река '
MoreLengtht riv );
readln
end.{ MaxLengthRiver }
Задание 11
Решение:
с)
type
{ Имена }
Name * (Vacya, Volodya. Ira. Lida.
Marina. Misha. Natasha, Oleg, Olya. Sveta. Yulya): Data - record {Тип ’Данные о человеке1 }
sex: (male, female): { лол }
rost: 140..200; { рост }
end:
Group - array [Name] of Data; { Тил Труппа’ } function EqualRost(var Gr : Group): boolean: var
namel, name2: Name:
flag: boolean:
begin
flag : false:
namel Vacya;
while ( namel < Yulya ) and not flag do
begin
nameS : = namel;
repeat
name2 ; succ( nameZ ):
flag Gr[namel].rost • Gr[name2].rost until flag or ( names - Yulya k namel succt namel )
end;
Equal Rost flag
end;{ Equal Rost }
Задание 13
Решение:
a)
const
LenStr = 16;
MaxQuantPerson - 10;
type
tString = array [0..LenStr] of char:
date - record
day: 1..31;
month: 1.Л2;
year: 1901..1997 end;
TjjFtnsHRwnjwTTw™» । «проштии
tPerson - record
SecondName: tString: Sex: (Male, Fenale): Birthday: date end;
tGroupe = array [1,.MaxQuantPerson] of tPerson;
{ Функция для определения самого старшего мужчины в группе Gr. Если мужчины есть, то возвращается значение true, в противном случае false. Самым старшим считается мужчина, у которого наименьшая дата рождения. Если таких (старших) мужчин несколько, то переменной SecName присваивается имя первого из них по списку. ) function 01dest( 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 = dZ.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 <= MaxQuantPerson ) and (Gr[i].Sex о Male) do i :== i + 1;
{ если мужчина не найден, присваиваем имени функции false } 1f i > MaxQuantPerson
then Oldest false { если мужчина найден } else
begin
{ поиск самого старшего } for k := i + 1 to MaxQuantPerson do if (Gr[k].Sex - Male) and
LessThen( Gr[kJ.blrthday, Gr[1].birthday ) then i :» k;
{ запоминание фамилии }
Oldest true;
SecName Gr[iJ.SecondName: end
end:{ Oldest } .1
| Задание 16
* Ответ:
*-(1,-1)
Г w-(0, 1)
I P“(2,2)
| re-2
Пшм 12. Записи, оператор присоединения 229
Задание 17
Решение:
с)
type
tNatDig * l./Maxlnt:
TracDig = record
chlsк integer:
znani: that Dig
end:
procedure Sokr( var r: tRacDig ): var
k: tNatDig;
{ Функция, возвращающая наибольший общий делитель двух чисел }
function N0D( a. b: tNatDig к tNatDig:
begin
repeat
if a<b
then b := b’d else а :и a-b until a = b;
NOD := b
end:{ NOD }
begin
if r.chi si <> 0 then
begin
with r do begi n
к := NOD( abs( Chisl ). znam ), chisl chisl div k: znam : znam div к end
end
end:( Sokr }
Задание 19
Решение:
a)
program Canpl exExp:
const
CompPrec = Je-lO:
type
complex = record
re. im: real end:
var
Eps : real;
z, res : coin lex:
{ Функция для определения модуля комплексного числа } function AbsComplex( z: Complex ): real:
begin
AbsComplex := sqrt( sqr( z, re ) + sqr( z. Im )) end;{ AbsComplex }
{ Процедура слежения двух комплексных чисел } procedure AcdCcinplexC 21. z2: Complex:
230 Приложение 1. Ответы и решения
var res:Complex к begin res.re	zl.re + z2,re;
res.1m	zl.lm + z2.im
end:{ AddComplex }
{ Процедура умножения двух комплексных чисел } procedure MultyComplexf zl, z2: Complex:
var res;Comp!ex ): begin
res.re	zl.re * z2.re - zl.lm * z2.1m:
res.Im	zl.re * z2.1m + zl.im * z2.re
end:{ MultyComplex }
{ Процедура деления комплексного числа на вещественное } procedure DIvComlToReaK var z: Complex; c: real k begin
if c < CompPrec then writeln( ‘На ноль делить нельзя' ) else begin
z.re :• z.re / c:
z.lm z.lm / c end end:{ DivCoffllToReal }
{ Процедура вычисления экспоненты комплексного числа } procedure ExpComplexf z: Complex: Eps; real:
var Res: Complex ): ver
CurZ: Complex:
1: real: begin
Res.re 1:
Res.im 0:
CurZ z:
i 1:
while AbsConplexf CurZ ) >- Eps do begin
AddComplex( Res, CurZ, Res ):
1	1 + 1;
MultyCornplext CurZ. Z. CurZ ):
DivComlToReaK CurZ, 1 ) end end;{ ExpComplex } begin
{ Ввод комплексного числа z } writelnt ‘Введите комплексное число' ); writef 'Вещественная часть: * ): readlnf z. re k write ( 'Комплексная часть: ' )-, readln( z. im ):
{ Ввод точности вычислений } writelп( 'Введите Eps - точность вычислений’, ’( Eps > 0 )' ):
repeat
write( 'Eps -' );
readlг( Eps );
if Eps <- 0 then
writeln( 'Неправильно. Повторите ввод.' )
Пшв* 12. Записи, оператор присоединения 231
until ( Ipi > 0 ):
{ Вычисление экспоненты комплексного числа }
ExpCorplex! z, Eps. res ):
{ Вывод результатов }
write! 'Экспонента равна ’. res.re:5:2 >;
1f res.in > 0 then write! ' + ' ):
write! res.1m:5:2 . '*1' ): readln
end.{ ComplexExp }
Задание 20
Решение:
с)
const
NaxN - 20:
type
tReal -record
Sign: boolean;
Mant: real; Dec: integer end:
tlndex  l..MaxN:
tLlst - array [tlndex] of tReal;
{ Процедура приводит все числа из списка List к виду, в котором порядок равен FixDec } procedure Equal Dec! var List: tLlst:
FixDec: integer ); var
1; tlndex:
k . Maxk: integer;
begin for 1	1 to MaxN do
begin
{ если фиксированный порядок больше текущего }
if FixDec > List[1].0ec then
{ делим на 10 в нужной степени }
for к 1 to FixDec - L1st[1].Dec do
L1st[1].Want L1st[i].Mant / 10 else
{ иначе умножаем на 10 в нужной степени }
for к :• 1 to List[i].Dec - FixDec do ListEIJ.Mant	List[1].Mart * 10:
{ Переопределяем порядок текущего числа }
List[iJ.Dec :- FixDec end end:{ EqualDec }
Задание 36
Решение:
type Coordinate - record
case Kind : (Decart, Polar) of Decart ; (x. y: real);
Polar : (r: real: Fi: real) end:
function Distance! a, b: Coordinate ): real:
232 Приложение 1. Отиты и решении
var
d: real:
begin
case a.Kind of
{ Если точка а задана декартовыми координатами J Decart:
case b.kind of
{ Если точка b задана декартовыми координатами }
Decart: d := sqrtt sqrt a.x - b.x ) + sqrt a.у - b.y ) );
{ Если точка b задана полярными координатами }
Polar: d :« sqrtt sqr( a.x -b.r * cost b.fi )} + sqrt a.у - b.r * sint b.fi ))); end;
{ Если точка а задана полярными координатами } Polar:
case b.kind of
{ Если точка b задана декартовыми координатами }
Decart: d := sqrtt sqrt a.r * cost a.fl 1 -b.x ) + sqrt a.r * sint a.fl ) - b.y ) };
{ Если точка b задана полярными координатами }
Polar: d sqrtt sqrt a.r ) + sqrt b.r ) -
2 * a.r * b.r * cost a.fi - b.fi ) ) end
end;
Distance d
end.{ Distance }
Глава 13. Множества
Упражнения, задачи, программы
Задание 3
Ответы:
а)	ВсеДниНедели = set of ДеньНедели;
Ь)	РаОочиеДни = set of пн .. пт.
Задание 5
Этвет: множествами являются конструкции a, b, с, d, е, f, g.
Задание 6
Этветьг:
i) [ 9, 2, 7 .. 8 ];
9 L 4 .. 21 ];
:) [ 4, 7. 20, 21 ].
Задание 8
Ответы:
Результатом выполнения отношений Ь, с, е, g, h, if к является true. :Результатом выполнения отношений a, d, f, j является false.
i
[Задание 10
(Ответы:
|а) неправильно;
(Ъ) неправильно;
I с ) правильно;
jd) правильно;
е) правильно;
f) неправильно.
;Задание 12
i Ответы:
;а) [ 3 .. 5. 7 .. 10. 13 ];
Ь) [ 2. 3. 5. 7 ];
с) [ ].
Задание 13
Ответы:
а)	[];
Ь)	А*В;
с)	А* В;
d)	А+В.
Задание 16
Решение:
program LettersCount: const
MaxLen - 80; { максимальная длина текста } eot - ‘‘: {признак окончания ввода } type
TLetter - set of char:
TStr - array [1..MaxLen] of char: var
Str: TStr:
StrLen: 0..MaxLen; { длина введенной строки }
Count: 0..MaxLen; { счетчик букв }
1	: 0..MaxLen;
tetter: TLetter;
begin
{	инициализация множества }
Letter := [ ‘A’ ., *Z'. 'a' .. 'z* ];
{	ввод текста }
wr1teln< ’Введите текст’ );
1	0:
repeat
1 ;• i + 1;
readt $tr[1] )
until ( 1 - MaxLen ) or ( Str [ i ] - eot ):
1f Str[i] * eot
then StrLen i - 1 else StrLen ;» 1;
{ обработка текста }
count :*= 0:
for i:=l to StrLen do
if Str[1] in Letter then count count + 1; { вывод результатов }
writelnt 'Количество английских букв 'в тексте равно - '. count ) end. { LettersCount }
Задание 17
Решение:
а)
program Find:
const
MaxLen = 80: { максимальная длина текста } eot -	{ признак окончания ввода }
type
TLetter » set of char:
TStr - array [1..MaxLen] of char: var
Str: TStr: { строка )
StrLen: 0..MaxLen: { длина введенной строки }
1	: 0..MaxLen: { множество букв слова 'шина' } Letter: TLetter:
{	флаг, который принимает значение true. }
{	если в строке есть буквы из слова ’шина’, }
{	false - в противном случае } flag: boolean:
begin
{	инициализация множества }
Letter :- [ 'w'. 'и', н'. 'а' ];
{	ввод текста }
w	ritelnt ’Введите текст' );
1	0;
repeat
1 := 1 + I: readt str[1] ) until ( 1 = MaxLen ) or ( Str [ 1 ] - eot ): if Str[i] - eot
then StrLen := i - I else StrLen 1;
{ обработка текста }
1 := 0:
repeat
1 :-i + 1:
flag Str [ т ] in Letter until ( 1 = StrLen ) or flag: { вывод результатов }
if
then writelnt 'В тексте есть буквы.
'входящие в слово "шина"’ )
else writelnt ‘В тексте нет букв. 1.
'ВХОДЯЩИХ В СЛОВО "ШИНа'" ) end. { Find }
Задание 18
Решение:
( В данной примере строка представлена в виде )
{ массива символов, 0-й элемент, которого } { зарезервирован для хранения длины строки } const
MaxLen - 80: { максимальная длина текста } eot - ’.'; { признак окончания ввода } type
TStr ’ array [0..MaxLen] of char: procedure DifferentLetterst var str: TStr ); var
InputLetters: set of char:
1: 0..MaxLen; begin
InputLetters := [];
1	0;
repeat
i := 1 + 1;
repeat
readlnt str[i] ):
if str[1] in InputLetters then writein (
'Символ str[1J.
' был введен ранее.
‘Повторите ввод.1 );
until not ( str[1] in InputLetters );
InputLetters InputLetters + [ str[i] ];
until ( i = MaxLen ) or ( str[i] - eot ): if str[i] - eot
then str[0]	chr( 1-1 )
else str[0]	chr( 1 )
end: { DifferentLetters }
Задание 21
Решение:
program Number;
const
n - 4: var
error: boolean;
digits: set of '0‘..‘91:
c: char;
num, d. 1: integer:
begin
writelnt Введите последовательность символов; '): error :=* false;
digits L 'O' .. ‘9’ ];
num ;* 0;
i 1:
while not eoln and not error and ( i <= n ) do begin
readC c );
if c in digits then
begin
d ord(c) - ord('01};
num := num * 10 + d end
else error : = true:
1 :* i + 1;
end; { while } readln;
if error
then write!n( '.Преобразование невозможно: 1.
'символ ''', с,
не является цифрой') else writelп( 'Полученное число = '. num ), readln
end. { Number }
Задание 23
♦Решение:
procedure Print ( A: TLetter );
var ch: char;
begin
for ch ;= 'a' to 'z‘ do
if ch in A then write( ch ) end;
Задание 24
Решение:
program Greater;
const
MaxLen = 80: { максимальная длина текста } eot = ’,'; { признак окончания ввода } type
TLetter « set of char:
TStr = array [1. MaxLen] of char: var
Str: TStr; { строка }
StrLen: 0..MaxLen: { фактическая длина строки }
i	: 0..MaxLen;
{	счетчики гласных и согласных букв ) COuntGL. countSGL: 0..MaxLen;
{	множества гласных и согласных букв } LetGL, LetSGL; TLetter:
begin
{	инициализация множества гласных букв } LetGL := [ 'а'. 'е'. '1', 'о', 'и' ]; { инициализация множества согласных букв } LetSGL := [ 'а'..'?* ] - LetGL;
{	ввод текста }
writelп( 'Введите текст' ):
Глава 13. Множества 237
1 U.
rtjpedL
i 1 < 1;
read( str[i] )
until ( 1 - MaxLen ) or ( Str [ i ] - eot );
if Strfi] - eot then StrLen 1 - 1 else StrLen :=* 1;
{ обработка текста }
i -- 0:
countGL 0;
countSGL := 0:
for 1 := 1 to StrLen do
begin
if str[1] in LetGL
then countGL :*= countGL + 1:
if Str[i] in LetSGL then countSGL countSGL + 1
end:
{ сравнение и вывод результатов }
If countGL - countSGL
then writeln( ’Количества гласных
'и согласных букв равны1)
el se
if countGL > countSGL then writeln( 'Гласных букв больше’ ) else writeln( ’Согласных букв больше’ );
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;
Once. Twice: TLetter;
begin
{ инициализация множества букв, которые }
{	встречаются один раз в тексте }
Once
{	инициализация множества букв, которые } { встречаются ? и более раз в тексте } Twice :» [];
{	ввод текс 1 а } writeln( 'Введите текст' ): 1	0;
repeat
1 := 1+1.
read( str[i] )
23В Приложение 1. Ответы и решения
until ( 1 - MaxLen ) or ( Str[i] • eot ); readln
if Str[i] - eot then StrLen :« i - 1 else StrLen 1:
{ обработка текста } 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;
{ печать результатов }
1:-0:
while Once<>[] do begin
i i + 1;
1f Str[1] in Once then begin
Once :» Once - [ Str[i] ]: write! Str[1L ’ ' 1
end end;
end. { Order }
Задание 26
Решение:
f)
program Vowel IsAbsent;
const
MaxLen - 80: { максимальная длина текста } eot - '.’: { признак окончания ввода } type
TLetter - set of char:
TStr - array [1..MaxLen] of char: var
Str: TStr; { строка }
StrLen: 0..MaxLen; { фактическая длина строки } 1: 0..MaxLen;
Once, Twice. Words: TLetter: ch: char;
begin
{ инициализация множества букв, которые }
{ встречаются в одном слове }
Once :* [];
{ инициализация множества букв, которые } { встречаются в двух и более словах} Twice [];
{ввод текста }
writelп( 'Введите текст’ );
1 г- 0;
repeat
1	1+1:
read! str[i] )
until ( i = MaxLen ) or ( Str[i] « eot ): readln
Phew 13. Множества 230
if Str'Ll] - eot then StrLen 1 - 1 else StrLen :- 1;
( обработка текста }
1	1:
repeat
{ пропуск запятых }
while (1 <- StrLen) and (str[i] - do i:* 1+1;
{ обработка слова } words
while (i <- StrLen) and (str[i] <> do begin
words words + [ str[i] ]: 1:« 1+1
end;
twice :- twice + words * once;
once once + words
until (1 >- StrLen);
{ выбор только звонких согласных букв }
twice:- twice * [ 'б', 'в', 'г*, 'д', ‘ж’. 'з'. ‘л', 'и', 'н'. 'р' ]: { печать результатов }
for ch chr(128) to chr(255) do
1f ch 1n twice then wr1te( ch, ' ' ):
end. { Vowel IsAbsent }
Задание 29
Решение:
program OneOrTwo;
const
MinDig - 1; { минимально возможное число }
MaxDig - 50: { максимально возможное число } type
TRange - MinDig..MaxDig;
{ множество возможных чисел } TSetRange - set of TRange;
var
1. n. Last. Current: integer;
Fib: TSetRange: { множество чисел Фибоначчи }
digit: TRange; { обрабатываемые числа } CountFib. Count: integer;
{ функция определения первой }
{ значащей цифры числа к ]
function FlrstOlg ( к: TRange ): Integer;
var i: integer;
begin
repeat
1 :- к mod 10;
к :« к div 10
until к - 0;
FirstDig i
end:
begin
{ формирование множества чисел Фибоначчи. }
{ принадлежащих заданной границе чисел }
Fib [];
Last : 1:
Current := 1;
ми । гриложвни» i. Ответы и решения
repeat
Fib := Fib + [ Current ];
Current : = Last + Current;
Last := Current - Last until Current > MaxDlg; { ввод количества чисел, с которыми } { пользователь будет работать}
<L-	writelnt ‘Введите количество чисел (больше 0).' );
,	repeat
'	readlп( п );
1f п о 0 then
writein ( ’Данные введены неправильно.',
‘ Повторите ввод.') until (п > 0);
{ ввод чисел }
wrlte( 'Вводите числа в границах от ' );
writelnt MinDig, ' до '. MaxDig );
for i .= 1 to п de
begin
readt digit ):
if digit in Fib
then countFib := CountFib + 1:
if FirstDigt digit ) in [1,2] then count := count + 1 end;
{ вывод результатов } writein;
writein ( ‘Количество чисел Фибоначчи равно г, 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
sumna ;= 0;
for i := 1 to n do if i in SI then for j := 1 to n do if j in s2 then
summa :== summa + A[i, j]: Sum : surma;
end;
Задание 33
)твет:
A r= A + B;
В A - B;
A := A - В
глава 13. Множества 247
Задание 35
Решение:
а)
function Oigit( n: NatOlg ): 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 = WOOD: { максимально возможное число } MaxSizeSet - 256. { максимальный размер мн-ва } SizeSet = MaxDig div
MaxSizeSet; { размер массива множеств }
MinM - 0;
MinN = 0;
type
TRange - MinDig..MaxDig:
TSet = set of 0..MaxSizeSet - 1;
TArraySet = array [Q_.SizeSet] of TSet: var
ArraySet: TArraySet; { массив множеств }
m. n: 0..MaxDig:
MinM. MaxM. Digit, j: integer:
{ определение максимального N }
function MaxN ( m: 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
ArraySetfj] []:
Z4Z Приложение 1. Ответы и решения
( определение максимально возможного значения х } НахМ г- round( sqrt( MaxDig ) );
{ перебор всех чисел, которые попадают в }
{ заданные границы, причем без повторений, }
{ которые могут получиться из-за перестановки }
{ значений тип}
for т:=М1пМ to МахМ do
for п:и HInN to HaxN(m) do begin
{ вычисление числа } digit sqr(m) + sqr(n): if (digit MinDig) and
(digit <- MaxDIg) then begin
{ вычисление индекса элемента массива. } { в котором содержится данное число } j digit div MaxSizeSet;
{ вычисление положения числа }
{ в множестве }
digit digit mod MaxSizeSet;
ArraySet[j] := ArraySetLj] + [ digit ] end
end;
{ печать элементов множества }
for Digit := MinDig to MaxDIg do begin
{ вычисление индекса элемента массива. }
{ в котором содержится данное число }
j digit d1v MaxSizeSet:
{ вычисление положения числа в множестве } digit := digit mod MaxSizeSet;
{ есть ли элемент в множестве? }
if digit 1п ArraySetEj]
then write( digit + j * MaxSizeSet. ' ’ ) end;
readln
end. { InRange }
Задание 39
Решение:
type
Name - ( Vacya. Volodya. Ira. Lida.
Marina. Misha, Natasha, Oleg. 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 * ( Gr[namevar] + [namevar] ); Everywhere ( result о [] )
end; { Everywhere }
Dibbb 13. Множества
Задание 41
Решение:
( Вычисление определителя матрицы }
program Determinant:
const
MaxN = 15; { максимальный размер матрицы } type
Index = L.MaxN; { индекс матрицы }
TMatrlx - array [Index, Index ] of real:
TIndexes - set of Index; { множество индексов } var
matrix; TMatrlx;
n, 1, j: Index:
{ рекурсивная функция для вычисления определителя }
{ матрицы, полученной удалением 1 первых строк и } { тех столбцов, номера которых есть в множестве s } function Det( L: integer; S: TIndexes ): real:
var
j: Index;
count; real;
coef: -1 .. 1;
begin
{ если осталась матрица размерности 1x1 }
if I ’ п - 1
then
begin
j 1;
while j in S do j j + 1:
Det fnatrix[n. j]:
end else
{ если матрица размерности больше 1 }
begin
count :- 0:
Coef := -1:
{ вычисление по формуле }
for j ;и 1 to n do
if not (j in s) then begin
coef :- -coef;
count:- count + coef * matrix[ 1+1, j ] * Oet( 1+1. s+[j] ) end;
Det:- count
end
end:
begin
{ ввод реальной размерности матрицы } writeln( 'Введите размерность матрицы'.
' (от 1 до MaxN. ):
readln! n ).
{ ввод матрицы }
writeln! 'Введите матрицу' );
for 1 ;= 1 to n do
for j :=1 to n do

ЖЯД Приложение 1. Ответы и решения
read( matr1x[1J] );
readin
{ подсчет и печать значения определителя }
writeln( ’Определитель равен
Det( 0. □ ): 5: 2 );
 end. { Determinant }
Глава 14. Файлы
Упражнения, задачи, программы
Задание 1
Решение:
program CreatelntegerFile;
const
Marker = 9999;
var
f: file of integer: { создаваемый файл }
a: integer; { буфер для ввода }
begin
rewritet f ):
writeln
(
’Введите числа.
<	’Признаком конца последовательности
	’является число 1, Harker
):
readln( а );
while а <> Marker do
begin
'	writer f. a );
readln( a )
end;
closet f );
writeln( ’файл создан' )
= end. { CreatelntegerFile }
Задание 8
Чтение:
program MaxInAB;
var
f: file of integer; { заданный файл }
a. b: integer; { заданный интервал поиска }
x: integer; { буфер для ввода }
max; integer; { искомое максимальное значение }
fl: boolean: { флаг для поиска }
begin
reset(f);
repeat
writelл( ‘Введите интервал для поиска' );
write( 'а = ’ ); readlnt а );
write( 'b “ * ); readint b );
until a < b;
{ поиск первого числа из [а. b] }
II - I f ur
while not шИ( f ) and fl do
begin
readl f. x ):
if ( x >- a ) and ( x <» b )
then { нашли первое число из [а, ЬЗ } begin
max х;
fl false
end
end;
{ поиск максимального числа, принадлежащего }
{ [а. Ь]. в оставшихся числах файла }
while not eofl f ) do
begin
readl f, x );
If ( x a ) and ( x <- b ) then 1f max < x then max := x
end;
closel f ):
if fl
then writeln( ‘чисел из интервала [’,
a, 1„ *, b, ’] в файле нет') else writelnl ‘максимальное значение.
‘принадлежащее интервалу [',
a. , b. равно max) end. { MaxInAB }
Задание 12
Решение:
program NegativPos11 ivFties;
var
fl, { входной файл }
f2. f3: file of Integer; { выходные файлы }
a: integer; { буфер для ввода }
enifS, emf3: boolean; { флаги пустого файла }
begin
{ инициализация }
resetl fl );
rewrite( fZ ):
rewritel f3 );
emt 2 := true: { файл f2 пуст }
emf3 : true; { файл f3 пуст }
{ чтение и анализ значений входного файла }
while not eofl fl ) do
begin
readl fl. a ):
if a > 0 then
begin
writel fZ. a ):
emf2 :• false
end:
if a < 0 then
begin
writel f3. a ):
emf3 :•» false
end
end;
closet fl ):
closet f2 );
closet f3 ):
{ вывод результатов }
if not emf2 and not emf3
then writelnt ‘оба файла созданы' )
el se
begin
if emf2 then
writelnt 'положительных чисел в исходном файле нет');
if emf3 then
writelnt ’отрицательных чисел в исходном файле нет') end
end { NegativPositlvFi1es }
Задание 16
Решение:
program Merge;
var
fl. f2, { входные файлы }
f3: file of Integer; { файл-результат }
rdfl. rdf2: boolean; { флаги прочтения записи }
al. a2. a3: integer;
begin
{ инициализация }
reset( fl );
reset( f2 );
rewritet f3 );
if not eoft fl ) then
begin
readt fl. al );
rdfl :» true
end
else rdfl false;
if not eoft f2 )
then
begin
readt f2. a2 );
rdf2 true end
else rdf2 false;
{ объединяем значения, если файлы непустые }
while rdfl and rdf2 do	*
begin
{ выбираем из двух очередных }
{ значений иеныиее }
if al < а2 then begin
a3 al:
if not eoft fl ) then readt fl. al } else
begin
rdfl false;
writet f3, a3 );
аЗ а2
end
end
else begin d3 a2;
if not eoft f2 )
then readt f2. a2 ) else
begin
rdf2 :* false:
writet f3, a3 ):
аЗ := al
end end:
writet f3, a3 }
end:
while not eoft fl ) do
begin
readt fl. al );
writet f3, al ) end;
while not eoft f2 ) do
begin
readt f2, a2 ):
writet 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 - информатика }
{ 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
{ инициализация } rewrltet fquest ); names[MA] :- 'математический анализ'; names£A ] ’алгебра': namesEI ] : = 'информатика';
names[NM] : 'численные методы';
names[DE] : = 'дифференциальные уравнения': names[PT] 'теория вероятности';
names[FA] ;= 'функциональный анализ'; writelrK 'добавить запись в файл?' ); writelп( гд - да, любое другое значение - нет' ); readlnt fin );
while fin =* д' do begin
writelnC 'вводите ответы очередной анкеты;' ); writelnC 'д - да, любое другое ', 'значение - нет' );
for k ;= МА to FA do begin
wrlteC names[k], readln( res ): ans£k] ;= ( res = 'д' ) end;
write( fquest, ans ):
writeln( 'добавить запись в файл?' ):
writelnf 'д - да, любое другое значение - нет’ ); read1n( fin )
end; { while } close( fquest ) end, { Ariketa }
Задание 33
?ешение:
program PopularSub: const
{ максимальная длина названия предмета } Inname = 26;
type
sub - ( MA, A, I, NM. DE, PT, FA );
( тип предметов; }
{ MA - математический анализ }
{ А- алгебра }
{ I - информатика }
{ 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;
Глава 14. Файлы 24
гили", errty [iub] of name: { названия предметов }
rm integer: { счетчик максимальных значений }
k. J; sub:
begin
{ инициализация }
reset( fquest ):
names[MA] := 'математический анализ’;
names[А ] :« 'алгебра';
names[I ] :• 'информатика':
names[NM] 'численные методы’;
names[DE] ‘дифференциальные уравнения’;
names[РТ] := 'теория вероятности';
names[FA] ;= ’функциональный анализ':
for к : = МА to FA do
count[к] ;- 0:
all := 0;
{ вычислить количество положительных }
{ оценок для каждого предмета }
while not eof( fquest ) do
begin
readt fquest. arts ):
all :« al! + 1;
for k := MA to FA do
if ans[k] then count[k] : = count[k] + 1 end;
closet fquest ):
{ найти максимальное число }
{ положительных ответов }
max := 0:
cm 0;
for k := MA to FA do
if count[kJ > max
then
begin
max : count[k];
cm : = 1;
j k
end
else
if count[k] = max then cm cm + 1;
if max - 0 then
writelnt 'ни один предмет не получил положительной оценки') else
if cm = I then
{ предмет с максимальной оценкой один. }
begin
write( ‘Наилучшую оценку получил ' .);
writelnt 'курс namestj], );
writelnt 'Всего ответов '. all.
’ из них положительных - ', max ) end
el se
{ предметов несколько }
begin
writelnt 'Fanлучшую оценку '. max, из '.all.
' получили предметы:' );
for k MA to FA do if count[k] - max
«ои—мрил ожени» 1. Ответы и решения
then write!n( names[к] )
end
end. { PopularSub }
Задание 61
Решение:
program EmptyLines:
var
f : text: { исходный файл }
count : Integer: { счетчик пустых строк } begin
reset( f ):
count := 0;
while not eof( f ) do
begin
if eoln( f ) then count :• count + 1:
readln{ f )	{ пропуск строки }
end:
writelл( 'Количество пустых строк в файле равно 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 eoln( fl ) do readlnf fl ):
{ копирование непустой строки }
while not eoln(fl) do
begin
read( fl. ch );
write( f2, ch )
end:
readln( fl ); { пропуск конца строки в fl }
writeln( f2 ) { запись конца строки в f2 }
end:
closet fquest )
end, ( Copy }
Задание 63
Решение:
program Powerlines: var
f: text; { исходный файл }
max: integer; { максимальное количество слов в строке }
Гнева 14. Файлы 261
иллп integer: ( количество слов в очередной строке } { список кокеров строк с максимальным количеством слов } list: array [1..10] of Integer: klist: integer: { указатель списка номеров } num: integer; { номер строки } ch: char: { очередной символ j 1. p: integer; { индексы }
begin
{ инициализация }
reset( 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 ( cho ' ’ ) or eoln( f ): if ch <>’ * then count count + 1; ( пропустить слово }
while not eoln( f ) and ( cho1 * ) do read( f, ch )
end;
{ закончилась строка } if count > max
then
begi n
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:
{ пропуск конца строки } readln( f )
end;
{ распечатать первые klist строк с }
{ максимальным количеством слов }
reset( f ):
num 1;
for i := 1 to klist do begin
{ паи: и строку с номером list[1J }
р - listLi]: while p <> num do beg i n
readlnt f ):
num ;• num + 1 end.
kqX приложение 1. Ответы и решении
( распечатать строку с номером list[1J } while not eolnf f ) do
begin
readt f. ch );
writet ch ) end;
{ пропустить конец строки } readlnt f );
num := num + 1:
{ перейти на новую строку на печати } wri tel n
end;
closet f )
end. { Powerlines }
Задание 87
Решение:
program Create;
const
nc = 5: { количество курсов }
ng = 6; { количество групп на курсе }
num = 30; { максимальное количество студентов в группе } type
tree = record
num stud: O..num; { количество студентов в группе } nim^admit; O..num; { количество допущенных к сессии } num_ex: O..num; { количество сдавших на "отлично'' } { количество сдавших на “отлично" и "хорошо" } num_ex_good: 0..num;
{ количество получивших "неудовлетворительно" } num_no sat: 0..num
end;
var
f: file of tree; { создаваемый файл }
1c: l..nc;
1g: 1..ng;
rec ; tree;
begin
assigntf. 'result.dat');
rewritetf);
writelnt' вводите информацию по итогам сессии');
for 1с :Ч to пс do
begin
writelnt'курс ',1c);
for ig:=l to ng do
begin
writelnt'группа '. ig);
writet1 количество студентов: ');
readln(rec.num_stud);
writet'допущены к сессии: ');
readln(rec.num_adm1t);
writet'сдали на "отлично": ');
readlnt rec.num_ex):
writet'сдали на "хорошо" и “отлично";
readlntrec.num_exjjood); writet'неуспевающих: '); read 1 nt rec. num_no_sat); write(f,rec)
end end. closetf); writelnt файл создан*) end. { Create }
Задание 88
Решение:
program Printinfo:
const
nc - 5: { количество курсов }
ng = 6: { количество групп на курсе }
{ максимальное количество студентов в группе }
num = 30:
type
tree - record
num stud: O.*num: { количество студентов в группе } num admit: O..num; { количество допущенных к сессии } num_ex: O..num: { количество сдавших на ’отлично" } { количество сдавших на "отлично" и "хорошо" } num_exjjood: O..num;
( количество получивших "неудовлетворительно” } num_no_sat : (k. num
end:
var
f: file of tree; { обрабатываемый файл }
1c: 1.,nc;
1g: 1-.ng:
rec : tree:
irec: byte: { номер записи о нужной группе в файле} begin
assigntf.‘result.dat1):
reset(f):
writet'курс: '):
readln(ic);
writet'группа: ');
readln(ig):
if lone
then writelnt‘неверно задан номер курса')
el se
if 1g>ng
then writelnt'неверно задан номер группы’)
else
begin
irec :« (ic-l)*ng+(ig-l):
seektf.Irec): read(f.rec): wrltel nt'информация о результатах сессии ’.
ig, ’ группы ’, ic, ’ курса‘;
writelnt'количество студентов rec.numstud);
writelnt'допущены к сессии rec.numadmlt); writelnt'сдали на “отлично'' '. rec.num_ex): writelnt'сдали на “хорошо" и "отлично" \
rec.num ex good):
writelnt’неуспевающих ", rec.numjio_sat); end
end. { Printinfo }
Задание 89
Решение:
program PrintBestInfo: const
nc-5: { количество курсов }
ng * 6: { количество групп на курсе }
num - 30; { максинальное количество студентов в группе } type
tree - record
num_stud: 0. .num; { количество студентов в группе } num_admit: O.,num: { количество допущенных к сессии } пшех; О..пил; ( количество сдавших на “отлично*' } { количество сдавших на "отлично" и “хорошо" } пш_ехjjood: 0.. num;
{ количество получивших "неудовлетворительно” } num_no_sat; О..пшл end;
var
f: file of tree; { обрабатываемый файл }
1c: 1..nc;
ig: l..ng:
rec : tree;
irec: byte: { номер записи о нужной группе в файле} num_ex_c ; О..шт; { искомое число отличников } begin
{II-} { отключить проверку ошибок ввода-вывода } assigntf.'result.dat');
reset(f):
{11+} { отключить проверку ошибок ввода-вывода }
1f IOResu1toO
then writelп('файла нет*)
else
begin
write('курс: read]n(ic): if 1с>пс then writeln('неверно задан номер курса*) else
begin
irec:-(ic-l)*ng: seek(fjrec); num_ex_C:M);
for 1g: «1 to ng do begin read(f.rec): num_ex_c:=num_ex_c+rec.num_ex end:
writelnCwa 1 ,ic, ' курсе сдали сессию на “отлично’'*. num_ex_c,' студентов’)
end
end
end. { PrintBestInfo }
Задание 96
Решение:
{ Прообраз решения взят из справочной }
{ системы Turbo Pascal }
prog г am i.iipyl lie; const
HufSize • 2046: var
FromF. ToF: file:
{ для типа file размер записи указывается }
{ при открытии файла на чтение-запись }
NumRead. NumWritten: Word;
{ Word - тип для представления целых }
{ неотрицательных чисел }
Btif: array[l. .BufSize] of Char; begin assign(Fron)F. 'a.dat'); { открываем входной файл } reset(FromF. 1); { Размер записи - 1 байт } assigntToF. 'b.dat’): { создаем выходной файл } rewrite(ToF. 1); { Размер записи - 1 байт } write!п(’Копирование FileSize(FromF). 1 байт...'); repeat BlockReadCFromF. Buf. BufSize, NumRead);
BlockWrite(ToF, Buf. NumRead. NunWritten);
until (NumRead - 0} or (NumWritten о NumRead);
close(FromF):
dose(ToF):
wri teln U Копирование завершено.’);
end. { CopyFile }
Глава 15. Динамические структуры данных
Списки. Задачи, решения
Задание 1
Решение:
program List Proc;
type
TElem - integer: { Тип информационной части }
TList • *TNode. { Представление списка }
TNode - record { Звено списка }
Info: TElem; { Информационная часть }
Next: Tlist { Следующий элемент списка } end;
{	1. Инициализация списка }
{	Список без заглавного звена } procedure BList_Init (var L: TList);
begin
L ; = nil end:
[	Список с заглавным звеном } procedure ZList Imt (var L: TList); var N: TList; { заглавный элемент } begin new( N );
N*.Next nil:
L ;* N end;
{ 2. Добавление элемента в начало списка }
{ Список без заглавного звена }
procedure 8List_AddF1rst (var L: TList; E: TElem): var N: TList; { добавляемое звено списка } begin
new( N );
r.Info E;
N*,Next ;= L;
L := N end;
{ Список с заглавный звеном }
procedure ZL1st_AddFirst (L: TList; E; TElem): var Nr TList; { добавляемое звено списка } begin
BList_AddFirst( L'VNext. E ) end;
{ 3. Добавление элемента в конец списка }
{ Список без заглавного звена }
procedure BList_AddLast (var L: TList: E: TElem); var
N; TList; { добавляемое звено списка } { вспомогательный указатель для } { поиска последнего элемента списка }
Р: TList:
begin
new( N );
Г.Info := E;
N*.Next nil:
if L - nil
then L ;= N
el se begin
( поиск последнего элемента списка }
Р := L;
while Р* Next о nil do P PA.Next:
{ добавление в список нового звена } PA.Next := N
end end;
{ Список с заглавным звеном }
procedure ZLIst AddLast (L: TList; E: TElem): begin
( поиск последнего элемента списка } while L^.Next <> nil do L := LA.Next;
{ добавление в список нового звена }
new( LA.Next ):
L := L*,Next;
LMnfo := E;
LA.Next :» nil end;
{ 4. Удаление первого вхождения элемента Е в список L } { Результат функции: }
ГТшаа 1В. Динамически*
{ 1 rur ijihmohi н1ЙД*м и уделен }
j idl'd- .uwKfHi I списке не найден }
{ Слисок без заглавного звена. Решение 1 }
function BList_DelEleml(var L: TList; E: TElem): boolean; var
N: TList; { указатель на удаляемое из списка звено }
{ вспомогательный указатель для поиска звена списка, }
{ предшествующего удаляемому }
Р: TList:
{ признак: найден ли элемент Е }
{ в списке ? }
found: boolean;
begin
found false:
if L о nil then { если список не пуст )
if L*.Info  E
then { если первое звено является удаляемым } begin
found ; true:
{ запоминаем указатель на }
{ удаляемое звено }
N :« L;
L := L*.Next; { удаляем звено из списка } disposet N ) { освобождаем память }
end else begin
{ ищем звено, предшествующее удаляемому } Р := L;
while not found and (P*.Next <> nil) do if PA.Next*.Info - E
then found i-true
else P := PVNext: if found then
{ если найдено удаляемое звено } begin
{ запоминаем указатель }
{ на удаляемое звено }
N :₽ P*.Next:
{ удаляем звено из списка }
P*.Next N*.Next:
{ освобождаем память } dispose( N ) end
end:
BList_DelEleml := found
end:
{ Слисок без заглавного звена. Решение 2 }
{ Рекурсивный вариант }
function BL1st_DelEleni2(var L: TList: E: TElem): boolean: var
N: TList. { указатель на удаляемое звено списка }
begin
if L о nil
then { если список не пуст }
if L*.Info - E
then
{ если первое звено является удаляемым } begin
{ запоминаем указатель на удаляемое звено
N :* L:
L	(ЛNext: { удаляем звено из списка }
disposeC N ); { освобождаем память }
BL1 st Del El епэ2	true
end else
BLI stDelEl em2
BLisOelElem2( L*,Next, E )
else BL1st_DelElem2 :- false:
end:
{ Слисок с заглавным звеном }
function ZLi st_Del Elem(L: TH st: E: TElemk boolean: var
N: TList: { указатель на удаляемое звено списка } { вспомогательный указатель для поиска эвена списка, { предшествующего удаляемому }
Р: TList;
{ признак: найден ли элемент Е в списке? } found: boolean:
begin
{ ищем звено, предшествующее удаляемому } found := false:
Р L;
while not found and ( PA.Next <> nil ) do
if P*.Next*.Info - E
then found 2-true
else P :* P*.Next;
if found then { если найдено удаляемое звено } begin
{ запоминаем указатель на удаляемое звено }
N := P*,Next:
P*.Next : = N*.Next: { удаляем звено из списка disposeC N ) { освобождаем память }
end:
ZList DelElem := found end;
{ 5. Переворот списка }
{ Список без заглавного звена ) procedure BLIst-Invert (var L: TList):
var
H: TList: { вспомогательный указатель }
P: TList: { указатель на обработанный элемент списка begin
Р : = nil:
while L<>nil do
begin
{ запоминаем указатель на следующий }
Н := L*.Next;
{ теперь следующим за текущим будет звено Р } L*,Next := Р:
{ текущим становится предыдущим }
{ для следующего шага }
Р L;
{ перемещаемся к следующему элементу списка }
ГЪ*м 15. Динамически* структуры данных
l Н end,
L .-Р ( самый последний становится первый } end:
( Список с заглавный звеном } procedure ZList_Invert (L: TList): begin
BList_lovert ( L*.Next ) end;
{ 6. Печать элементов списка }
{ Список без заглавного звена }
procedure BL1st Print ( L: TList ):
begin
write(’< '):
while L о nil do
begin
writet L',.Info ):
if L*.Next <> nil then writer.’):
L : = L\Next end;
writelnt' >’) end:
{ Список с заглавным звеном } procedure ZList Print (L: TList); begin
BList_Print ( L*.Next ) end;
{ 7. Удаление всех элементов списка }
{ Список с заглавным звеном и без него } procedure 11st_Clear ( var L: TList ): var
N: TList; { указатель на удаляемое звено списка } begin while L <> nil do
begin
N := L;
L L*.Next;
disposeC N ) end end:
{ Процедура демонстрирует работу приведенных }
{ выше процедур. Параметр 1sB позволяет выбрать }
{ тип списка: с заглавным звеном или без него } procedure Testi isB: boolean );
const
FirstElem = 4444;
{ Сообщение о результате выполнения }
{ операции удаления }
procedure Ое:.мс-.ладе( b: boolean ): begin
if b
then wriii'lnt 'Элемент в списке найден и удален' ) else wrilrlnt 'Заданный элемент в списке не найден' )
end:
KOU Приложение 1. Ответы и решения
var
L: TList; { список }
{ вводимая пользователем информационная часть } Е ; TElem;
begl n
if isB
then BList Init ( L )
else ZL1st_Init CL);
writelnt 'Список инициализирован1 );
if isB
then BList-AddFIrst ( L. FirstElem 1 else ZList_AddF1rst ( L, FirstElem );
writelnt В список добавлен элемент'.
' co значением FirstElem ): writet ’Введите значение элемента. *.
'добавляемого в начало списка; ' ): readln( Е );
if isB
then BList AddFirst ( L, E )
else ZList_AddF1rst ( L. E );
writet 'Введите значение элемента. '.
‘добавляемого в конец списка: ' ): readlnt Е ):
if IsB
then BList AddLast ( L, E ) else ZListAddLast ( L. E ): write( ’Элементы списка: ‘ ); { Печать списка } if isB
then BList Print ( L )
else ZL1st_Prlnt ( L ):
{ Переворот списка }
if IsB
then BList_Invert t L ) else ZList_Invert ( L );
writet 'Элементы списка в обратном порядке: 1 ) { Печать списка }
if isB
then BL1st_Pr1nt ( L ) else ZList Print t L ); writet ‘Введите значение элемента. ’удаляемого из списка: ' };
readlл( Е };
if IsB
then begin
Del Message( BL1st_DelEleml ( L. E ) ) wrltet ’Введите значение элемента, ’, ’удаляемого из списка: ’ readint Е ):
DelMessaget BList_0elElem2 ( L. Е ) ) end
else DelMessaget ZListDelElem ( L. E ) ); wrltet 'Элементы списка: 1 };
{ Печать списка }
if IsB
then BList_Print( L ) else ZLIst Printt L );
Глввв 15, Динамически»
I I’.l Lh’rtr (I );
wr 11 <• 11»( 1 Элементы списка удалены' );
writet Нажмите <Enter> ... readln end;
begl n
writelnt ‘Список без заглавного звена' ):
Testt true ):
writelnt 'Список с заглавным звеном' );
Testt false );
end. { L1st_Proc }
Задание 4
Решение:
procedure List_Sort( L: TList ):
{ обмен информационных частей двух звеньев списка }
{ L.R - указатели на звенья }
procedure SwapInfPt L, R: TList ): begin
with LA do Info := RMnfo - Info;
with FT do Info : = Info - L*.lnfo;
with LA do Info := RA.Info + Info;
end;
var
{ указатель, используемый при поиске максимума )
R; TLlst;
Max: TList; { указатель на максимальный элемент } begin
if Lonil then { если список не пуст } begin
while LA.Next <> nil do
{ сортируем подсписок, если в } { нем более одного элемента } begin
{ сначала считаем, что первый элемент }
{ подсписка является максимальным }
Мах := L:
R LA.Next;
{ ищем максимальный элемент }
while R <> nil do begin
if RA.Info > MaxA.Info
{ запоминаем указатель } j на максимальный } then Max := R;
{ переходим к следующему }
{ элементу подсписка } R RA.Mext
end;
if Max <> L
{ обмениваем информационные части } then Swaplnfot L, Max );
{ nopi-ходим к следующему элементу списка } L : IА.Next
end
end
end; { L1st_Scr 1. }
Задание в
Решение:
а)
program Merge: type
TElem - Integer: { Тип информационной части } TList - ATNode; { Представление списка }
TNode * record { Звено списка }
Info: TElem: { Информационная часть }
Next: TL1st ( Следующий элемент списка } end:
{
Предполагается, что здесь описаны
следующие процедуры:
procedure ListJSortfL: TH st)
procedure BL1st_Print(L; TL1st) procedure BLlst_Init(var L: TList)
procedure BList_AddLast(var L: TL1st: E: TElem) procedure List Cl ear(var L: TList)
)
{ Ввод пользователем элементов списка } procedure List_Iinput(var L: TList): var E: TElem: { введенное число } begin
BL1st_In1t ( L ); { Инициализируем список } write( 'Введите элементы списка ',
г( ЭЛ1 эл2 ... 3nN<Enter> ): ');
while not eoln do
begin
readf E ):
{ заносим новый элемент в конец списка } BLiStAddLast ( L. Е )
end;
readlл { считываем символ перевода строки } end:
{
Процедура сливает два упорядоченных по невозрастанию списка А и В в список С. также упорядоченный по невозрастанию.
Исходные списки не удаляются
}
procedure List_Merge( А.В: TList: var С: TList ): var
Hr TList: { указатель на конец списка }
{ Процедура добавляет элемент из }
{ списка L в результирующий список С } procedure AddFromList(var L: TList): begin
{ является ли добавляемый элемент }
{ первым в списке? }
if С  nil
then
begin new( С ): H С
end
Diaat 15. Динамически* структуры денных 263
О III
begin
new( К.Next ):
И К Next
end;
HA.Info :* LA.Info:
{ переходим к следующему элементу списка }
L LA.Next
end;
begin
С nil;
H nil:
{ пока есть хотя бы один элемент }
{ в исходных списках }
while ( А о rrll ) or ( В <> nil ) do
begin
{ список А пуст, добавляем из В }
1f А - nil
then AddFrontlst(В)
else
{ список В пуст, добавляем из А }
1f В = nil
then AddFrooiLlst(A)
else
1f A*.Info > BA.Info
then AddFrofllistt A )
else AddFromL1st( В )
end:
If H <> nil
then H*.Next = nil { завершаем список } end:
{ Ниже приведен пример работы }
{ с процедурой List_Merge } var
А. В : Tlist; { сливаемые списки }
С : Tlist; { результат слияния двух списков } begin
{ ввод исходных списков }
L1st_InpiJt( А ):
L1st_Input( В );
{ отсортируем списки по невозрастанию }
L1st_Sort( А );
Llst Sort-C В ):
{ слияние списков А и 0 е список С }
Llstjfergef А. В. С ):
{ напечатаем результат слияния }
writei 'Реэуль’аг слияния: * );
BList_Pr1nt( 0 );
{ очищаем списки }
L1st_Clear( А );
List_Clear( В );
ListJTIearc С
writel 'Нанниic - Inter* ... ' );
readIn
end. { Merge }
204 Приложение 1. Ответы и решения
Ь)
{ Процедура производит слияние двух упорядоченных }
{ по невозрастанию списков А и В в список С. }
{ также упорядоченный по невозрастанию, путем } { перестановки указателей в исходных списках. } procedure ListJoin (А, В г TList: var С: TList ); var h: TList: { указатель на конец списка } procedure Joint var S: TList ): begin
{ если список-результат пуст } if С = nil
{ запоминаем указатель на "голову" списка } then С := S
{ подсоединяем элементы к концу списка } else h*. Next	S;
h S.
{ переходим к следующему элементу списка }
S :* S^.Next end:
begin
С :- nil:
{ пока оба списка не пусты, сравниваем } { первые элементы и минимальный из них } { помещаем в список-результат } while (А <> nil) and (В <> nil) do
if A*. 1 nfo < B". 1 nfo 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; { Информационная часть )
Left: TTree; { Указатель на левое поддерево } Right: TTree { Указатель на правое поддерево } end;
{ Функция создает копию двоичного дерева А }
{ Результатом функции является указатель }
{ на копию дерева А }
function TreeCopyt A: TTree ): TTree.
var Tree: TTree: { Указатель на копию дерева } begin
if A <> nil then begin
Глава 1В, Динамические структуры данных <coi
( соэДвек новое звено дерева } new( Tree );
{ копируем информационную часть }
Tree*.Info A*.Info:
{ сохраняем указатель на копию }
{ левого поддерева )
Tree*.Left : = TreeCopy(A*.Left):
:	{ сохраняем указатель на копию }
{ правого поддерева }
Tree*.Right : = TreeCopy(A*.Right) end
else Tree :== nil;
TreeCopy := Tree
f' end: { TreeCopy }
Задание4
Решение:
type
TElem = integer; ( Тит информационной части }
TTree я *TNode: { Прилегавпение дерева }
TNode = record { Узел дерева }
Info: TElem: { Информационная часть }
Left: TTree: { Указа гель на левое поддерево }
Right: TTree { Указа голь на правое поддерево }
end:
{ Функция вычисляет высоту }
{ заданного двоичного дерева Л }
function TreeHeightC A: Tkor ): Integer: var
lh. integer: { высота .ччкяо поддерева }
rh: integer; { выест и правого поддерева }
begin
if А = nil
then TreeHeignt (j el se begin
lh Tre--!h-i4h( ( A*.Left ).
rh : = Iri’i’P"-jhlt A*.Right ):
if lh > rh
then irrriii'Hjht :* lh + 1
else Irci'iiriqht rh + 1 end
end; { TreeHeight )
Дерево двоичного поиска. Задачи, решения
Задание 2
Решение:
program FindTree:
type
TElem = record { Ihi; ri*M рационной части }
Number: inteco •  'imno }
Count; integer  inrciio повторений }
end:
TTree - *TNode: { ;i|	ы к пенив- дерева }
TNode = record { >•••• .г |«’ва }
 >^ri^UMWHrip | , V/ГМ	UJWHVffl
type
TElem - integer; { Тип элементов очереди }
TH erents * array [1..HaxN] of TElem;
TQueue = record ( Представление очереди )
{ Массив для хранения элементов очереди }
Elements: TElementS:
Head: Integer; { "Голова" очереди }
Tall : integer { "Хвост" очереди }
end:
{ Инициализация очереди 0 }
procedure Queue_Init( var Q : TQueue):
begin
{ Изначально очередь не содержит элементов }
Q.Head := 1:
Q.Tail := 1
end.f Queuejnit }
{ Проверка очереди Q на пустоту }
{ Результат функции: }
{ true - очередь пуста }
{ false - очередь не пуста }
function Queue_Isbnpty( Q: 1queue ): boolean;
begin
Queue^IsEmpty ( Q.Head ~ Q.Tail )
end;{ QueueJsEmpty }
{ Поместить элемент E в очередь Q }
procedure QueuePusht var Q : TQueue; E : TElem):
const
ErrorCode = 255;
begin
with Q do
begin
{ заносим новый элемент в очередь }
ElementstТаi 1 ] :« Е;
{ вычисляем значение индекса для следующего }
{ элемента очереди }
Tail (Tail mod MaxN) + 1;
if Tall = Head then
begin
writelnt 'Переполнение очереди !!!’ ):
{ Аварийное завершение программы } Halt( ErrorCode )
end
end
end;{ Queue^Push }
{
возможна другая реализация операции помещения значения в очередь
}
{ Поместить элемент Е в очередь Q }
{ Результат функции: }
{ true - операция выполнена успешно }
{ false - переполнение очереди }
function Queue_Push_Func( var Q: TQueue:
E: TElem): boolean: var
newTail: Integer; { индекс для следующего } { элемента очереди }
begin
newTail ;= (Q.Tail mod MaxN) + 1:
Глава 15. Динамически» структуры данных zov
with 0 do
1f newГа11 о Head then begin
Tail ;* newTail:
Elements[Tai1] :• E;
Queue_Push_Func : = true end
else { Переполнение очереди } Queue_Push_Func ;= false end: / Queue_Push_Func } { Извлечь элемент из "головы" очереди Q } { Результат функции: }
{ Извлеченный из очереди элемент )
function Queue_Pop( var Q : TQueue): TElem;
const
ErrorCode = 255;
begin
if QueuelsEmpty( Q ) then
begin
writelnt 'Извлечение элемента из пустой очереди !!!' );
{ Аварийное завершение программы } Haltt 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 = 255:
begin
if Queue_IsEmpty( Q ) then
begin
writelnt 'Извлечение элемента из пустой очереди I!!1);
{ Аварийное завершение программы }
Halt( ErrorCode ) end
else
with Q do begin
( ElementsCHead];
l«\id :- (Head mod MaxN) + 1; end
end: { Queue Pup I’roc }
b)
type
TElem = integer: { (ин элементов очереди }
TList - ATElonic-fit , { С.писон. предназначенный для хранении элементов очереди }
<rv—приложение i, UTuetw и решания
TElement * record { Элемент списка } Info: TElem; { Информационная часть } Next; TList { Указатель на следующий элемент списка }
end:
TQueue » record { Представление очереди } Head: TList: { "Голова" очереди } Tall: TL1st { ‘‘Хвост" очереди }
end:
{ Инициализация очереди Q }
procedure Queue_Init( var Q: TQueue ):
begin
{ Изначально список, хранящий }
{ элементы очереди, пуст } Q.Head :* nil
end: { Queuelnit }
{ Проверка очереди Q на пустоту }
{ Результат функции: }
{ true - очередь пуста }
{ false - очередь не пуста }
function QueuelsEniptyC Q: TQueue 1: boolean;
begin
{ Очередь пуста, если пуст }
{ соответствующий список }
QueuelsEmpty ( Q.Head = nil )
end; ( Queue_IsEmpty }
{ Поместить элемент E в "хвост" очереди Q } procedure Queue^Pusht var Q: TQueue: E: TElem };
var Z: TH st;
begin
new( Z ); { Создаем новое звено списка } ZMnfo ;= Е;
Z*.Next :- nil:
if Queue_IsEmpty( Q ) then Q.Head Z else Q.TaiP.Next Z;
Q.Tail := 1
end: { Queue Push }
{ 14звлечь элемент из очереди Q }
{ Результат функции: }
{ Извлеченный из "головы" очереди элемент } function Queue Рор( var Q: TQueue ): TElem: const ErrorCode - 255;
var Z: TList;
begin
if Queue_IsEmpty( Q ) then
begin
writeln( 'Извлечение элемента из пустой очереди !!! ' }; { Аварийное завершение программы } Halt( ErrorCode )
end else
begin
{ Сохраняем указатель на звено списка }
Z Q.Head;
{ Перемещаемся к следующему звену }
Q.Head ZA.Next:
Queue Pop ZA.Info;
disposed 1 ) { Удаляем звено списка }
end
end: { Queue Pop }
I ЛИ» 10, динамически»структурвгдиннид
Стек. Задачи, решения
Задание 1
Решение:
а)
const
MaxN =100: { Максимальное число элементов стека } type
TElem - Integer: {Тип элементов стека }
ТЕ1 erents - array [L.MaxN] of TElem:
TStack - record { Представление стека } Elements: TElerents; { Элементы стека } Top: integer ( Индекс вершины стека }
end:
{ Инициализация стека S }
procedure Stacklnit ( var S: TStack );
begin
{ Изначально стен не содержит элементов }
S.Top := 0
end:
{ Проверка стена S на пустоту }
{ Результат функции: }
{ true - стек пуст }
{ false - стек не пуст }
function StacklsEmpty( S: TStack ): boolean:
begin
{ Стек пуст, если он не содержит элементов } Stack_IsEmpty : = £ S.Top - 0 ) end:
( Поместить элемент Е в стек S }
procedure StackPush ( 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
writelп( 'Переполнение стека !!!' );
{ Аварийное завершение программы } Halt( ErrorCode } end
end;
I
возможна другая реализация операции помещения значения в < г ок
}
{ Поместить злсмгш I в стек S }
{ Результат функции }
{ true - операция выполнена успешно }
{ false - пс:л'1 цинките стека }
function Stack ii.'.h lune ( var S: TStack;
E: TElem ): boolean:
begin
with S do if lop< MaxN then
begin
Top Top + 1:
Elements [Top] := E:
Stack-Push-Func : = true end else
[ Переполнение стека }
Stack-Push-Func := false
end;
{ Извлечь элемент с вершины стека S }
{ Результат функции-. }
{ Извлеченный из стека элемент }
function Stack Pop ( var S: TStack ); TElem;
const ErrorCode = 255;
begin
If Stack__IsEmpty( S )
then
begin
writeln< 'Извлечение элемента из пустого стека !!!' );
{ Аварийное завершение программы }
Halt( 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
writelnt 'Извлечение элемента из пустого стека !!!' );
{ Аварийное завершение программы }
Halt( ErrorCode )
end
else
with S do begin
E ;= ElementsETop];
Top Top-1
end
end;
b)
type
TElem “ Integer; ( Тип элементов стека }
TStack = ATElement; { Представление стека }
I 'ncnriii ।лиске, предназначенного для }
I /ранения элементов стека }
111 enient • record
Info: TElem; { Элемент списка }
Next: TStack { Указатель на следующий элемент списка } end:
{ Инициализация стека S }
procedure Stack^Init ( var S: TStack ):
begin
{ Изначально список, хранящий }
{ элементы стена, пуст }
S := nil
end:
{ Проверка стека S на пустоту }
[ Результат функции: }
{ true - стек пуст }
{ false - сгек не пуст }
function StacklsEmptytS: TStack): boolean:
begin
{ Стек пуст, если пуст }
( соответствующий стисок }
Stack_IsEmpty := ( S = nil ) end;
{ Поместить элемент Е в стен S }
procedure StackPush (var S: TStack; E: TElem);
var 1. TStack;
begin
new( Z ); { Создаем новое звено списка }
ZA.Next := S; { Присоединяем новое звено } { к имеющемуся списку }
ZMnfo := Е:
S := Z ( Новая эерщипа стена } end;
{ Извлечь элемент с вершины стека S }
{ Результат функции: j
{ Извлеченный из стека элемент }
function Stack_Pop ( var S: TStack ): TElem:
const ErrorCode -= 255:
var Z; TStack;
begin
if StacklsEmptyt S j
then
begin
writelnt ‘Извлечение элемента из ’, 1 пут иго стека 1!! ‘ ):
{ Аварийп:и’ завершение программы } Haltt ЕгготТ-оПс )
end else
begin
Z := S; { (охраняем указатель } j на звено списка }
{ Пере мел.! ।-м- и к следующему звену }
S ;= S'
Stack ZVInfo;
dispose: ; j | Удаляем звено списка ) end
end;
ПРИМЕЧАНИЕ Приведенные выше реализации стека (на основе массива и динамических структур) позволяют однообразно обращаться к данной логической структуре, а также использовать стек без знания его внутреннего представления (хотя, конечно, имеется множество случаев, когда та или иная реализация предпочтительней при обработке конкретной информации).
Ниже демонстрируется функционирование подпрограмм для работы со стеком, program StackTest; var
Stack: TStack; { Стен }
E: TElem; { Помещаемый в стек элемент } begin
( Пример использования стека }
{ Инициализация стека }
Stack_Init ( Stack ):
{ Проверка стека на пустоту }
writeln ( 'Stack_Is Empty = StacklsEmpty( Stack ) k
writet ’Введите 1-й элемент стека: ’ ):
readlnt Е ):
{ Помещение элемента в стек }
Stack_Pusht Stack, Е к
{ Проверка стека на пустоту }
writeln ( ’Stack^IsEmpty - Stack_IsEmpty( Stack ) k
writet 'Введите 2-й элемент стека: ' );
readln( Е ):
{ Помещение элемента в стек }
Stack._Push( Stack, Е ):
writelnt ’Извлечение и печать элементов стека:' к
while not Stackjs Empty ( Stack ) do
writelnt Stack_Pop( Stack ) k
writet ‘Нажмите <Enter> ... 1 k readln
end. { StackTest }
Задание 2
Решение:
program Inversestring;
type
TElem - char; { Тил элементов стека }
TStack = ATElement: { Представление стека }
{ Список, предназначенный для хранения элементов стека }
TElement - record
Info : TElem: { Элемент списка }
( Указатель на следующий элемент списка }
Next ; TStack
end;
{
Предполагается, что здесь описаны следующие подпрограммы работы со стеком, реализованным на основе динамических структур:
procedure Stackjnit С var S: TStack );
procedure Stack^Pusii ( var S: TStack; E: TElem );
function Stack JsEmptyt S: TStack k boolean:
function Stack'Pop ( var S: TStack ): TElem:
} var
'i| in к l1d nek. ( Ctf* }
I II I rm: { Помещаемый в стек элемент } begin
{ Инициализация стека }
Stack_lnit ( Stack );
writef 'Введите строку текста: ' ):
{ Помещение символов строки текста в стен } while not eoln do { Пока не конец строки } begin
{ Читаем следующий символ )
read( Е ):
{ Помещаем его в стен }
Stack_Push( Stack, Е )
end;
readln; { Читаем признак конца строки }
writet 'Символы строки в обратном порядке: ' );
while not StacklsEmpty( Stack ) do
{ Пока стек не пуст, извлекаем }
{ символ из стена и выводим его } writet Stack_Pop( Stack } ): writeln:
writet 'Нажмите <Enter> ... * );
readln
end. { InverseString }
Задание 5
Решение:
program Log1 cal Express1 on: const
TerminateChar = chr(O):
type
TSymbol = ( sNone. sTerminate. sTrue. sFalse.
sNot. sAnd. sOr, sLParen, sRParen ):
TElem = TSymbol; { Тип элементов стека } TStack  ATElement: { Представление стека } { Список, предназначенный для хранения элементов стека } TElement = record
Info : TEleni; { Элемент списка }
Next : TStack { Следующий элемент списка } end;
{
Предполагается, что здесь описаны следующие подпрограммы: procedure Stack_Init (var S: TStack): function Stack_IsEmpty(S: TStack): boolean: procedure Stack_Push (var S: TStack; E: TElem);
function StackJ\jp (var S: TStack): TElem:
}
{ функция рассчитывает значение выражения, }
{ хранящегося в текстовом файле F } function BooleanExpressionf var F: Text ) : boolean:
var
Sym : TSyrnbol:
Ch : char.
procedure NextSym:
{ процедура чи=аот следующий символ из файла } procedure NextChar;
begin
if eof( F ) then Ch := TerminateChar el se
If eolnt F ) then begin readln( F ); Ch ;= ' ’ end else read( F. Ch ): end:
{ процедура пропускает конец текущего слова }
procedure SkipWordTail: begin
while Ch in [ra‘..'zr] do
NextChar end;
begi n
while Ch=’ ' do NextChar: { пропускаем пробелы )
Sym : = sNone: case Ch of begin Sym := SRParen: NextChar end; begin Sym ; = sLParen; NextChar end:
’ t'; begin Sym := sTrue; SkipWordTa11 end;
’f': begin Sym := sFalse: SkipWordTail end;
'n': begi n Sym ;= s No t: Sk1pWo rdTa11 end:
'a': begin Sym ; = sAnd; SkipWordTail end;
'o': begin Sym :» sOr; SkipWordTail end;
TerminateChar: Sym ; = sTerminate end end; var
{ извлекаемые из стека операнды и операция }
Dpi. ор2. fun : TSymbol:
{ вспомогательный массив для преобразования }
{ false в sFalse. a true в sTrue }
B2Sym ; array [false..true] of TSymbol;
{ стек для хранения операций и операндов }
S ; TStack;
begin
Stack_Init( S );
B2Sym[false] : = sFalse;
82Sym[true] := sTrue:
Ch
NextSym; { читаем первый символ }
while Sym <> sTerminate do
begin
case Sym of
sTrue. sFalse. sNot. sAnd. sOr :
Stack_Push(S.Sym);
sRParen : begin { при чтении правой скобки извлекаем операцию и операнд(ы). } { и производим вычисления }
ор2 : = Stack_Pop( S ):
fun ;= Stack_Pop( S );
case fun of
sNot:
Глпнн 15. Динамические структуры данных
Stack Push (
S.
B2Sym[op2 = sFalse]
};
sOr : begin
opl : Stack_Pop( S ); Stack_Push ( S.
B2Sy<(opl = sTrue) or (op2 = sTrue)]};
end;
sAnd :
begin
opl := Stack-Pop( S ): StackPush
( S.
B2Syrri[(opl = sTrue) and
(op2 “ sTrue)]): end
end
end
else : { пропускаем '(' }
end:
NextSym { читаем следующий символ }
end:
BooleanExpression : = (Stack_Pop( S ) = sTrue) end:
var
F: Text; { файл, хранящий логическое выражение }
Filename ; string; { имя файла }
begin
writet 'Введите имя файла, содержащего логическое 'выражение заданного формата: ');
readln( Ft 1 eName );
Ass'ign< F. FileN-jni: ).
{$!-) Reset(F): /WJ
{ при открытии файла возникали ошибки ввода-вывода? }
if lOResult <> О
then
begin
writeln; 'Возникла ошибка при открытии файла!
Выполнение программы прекращено,' );
Exit
end:
writelnC 'Значение выражения равно \
Fijulf.-r'l xpressiont F ) );
Closet F ):
writet 'Нажмите tfl it • ... ' );
readIn
end. { LogicalExp-i. .•= n }
Задание 13
Решение:
program TestBrr?icr ।
const
{ Максимальна? ;!n.iы киндимой строки }
И7О приложение 1. Ответы и решения
MaxStrLen - 80;
{ Максимальное число элементов стека }
MaxN - MaxStrLen:
type
TElem - char; { Тил элементов стека }
TElements = array [L.MaxK] of TElem;
TStack = record { Представление стека }
{ Массив длй хранения элементов стека }
Elements : TElements:
{ Вершина стека } Тор : Integer
end;
{ Строка символов }
TString = arr^y fl..MaxStrLen] of char;
{
Предполагается, что здесь описаны следующие подпрограммы работы со стеком, реализованном на основе массива:
procedure Stack J nit ( 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 TestExpressiont s: TString;
ExprLen: integer ): boolean: var
Stack: TStack: { Стек для хранения открывающих скобок } curChar: TElem; { Обрабатываемый символ выражения } 1: integer:
Good: boolean: { Признак соответствия скобок в выражении } { Определение символа левой скобки для данной правой } function ToLeftt г: char ): char;
begin
case r of
ToLeft -
ToLeft
']': ToLeft :•»	;
end
end:
begin
{ Инициализация стека }
Stacklnit ( Stack ):
{ Изначально будем считать, }
{ что скобки расставлены верно }
Good true;
{ Начинаем обработку с первого }
{ символа выражения }
1 :- 1:
while (i <= ExprLen) and Good do
begin
curChar := sfij;
case curChar of
П11В1 15. Динвмич«окив структуры денных ЗГ
| (Лкрываоцую скобку заносим в стек } Stack Push< Stack. curChar );
Т-’Г-T:
begin
Good false;
{ Проверим ситуацию, когда } { есть закрывающая скобка, } { но нет открывающей } If not Stack!sEmpty! Stack ) then
{ Проверим соответствие ) [ левой и правой скобок } if Stack-Pop! Stack ) = ToLeft! curChar ) then Good true
end
end:
1 :« i+1 { Переходим к следующему символу } end:
{ Проверяем ситуацию незакрытых левых скобок }
Good : - Good and StackJ sEmpty( Stack );
{ Очищаем стек в случае ошибки }
if not Good then
while not Stack_IsEmpty( Stack ) do curChar : = Stack_Pop( Stack ):
{ Возвращаем результат выполнения функции }
TestExpression : = Good: end;
var
s: TString: { Введенное пользователем выражение } ExprLen: integer: ( Число символов в выражении } begin
{ Ввод выражения }
write! 'Введите проверяемое выражение; ’ ):
ExprLen 0;
while (ExprLen < MaxStrLen) and not eoln do begin
ExprLen := ExprLen + 1;
read! s[ExprLenJ );
end:
if not eoln then
{ Если пользователь ввел более )
{ MaxStrLen символов }
wrlteln! 'Обрабатываемое выражение усечено до MaxStrLen,' символов !' );
readlп:
{ Сейчас в ExpLen хранится длина }
{ выражения в символах )
{ Проверка правильности расстановки скобок }
if TestExpression! s, ExprLen )
then wrlteln! ‘Скобки в выражении расставлены правильно/ )
else wrlteln! ‘В выражении обнаружено несоответствие скобок.' ): write! 'Нажмите «Enter* ’ );
readlп
end. { TestBrRlght )
Приложение 2
Задачи по информатике, предлагавшиеся
на олимпиадах прошлых лет
Задачи для самостоятельного решения
Задача 1. «Абракадабра»
Последовательность из латинских букв строится следующим образом. На первом шаге она пуста. На каждом последующем шаге последовательность удваивается, после чего к ней слева дописывается очередная буква латинского алфавита (л, Ь, с,...). Ниже приведены первые шаги построения последовательности.
Пустая последовательность:
Illarl. а
Шаг 2. baa
ШагЗ. cbaabaa
Шаг 4. dcbaabaacbaabaa
Задача состоит в том, чтобы по заданному числу Wопределить символ, который стоит на jV-m месте в последовательности, получившейся после 26-го шага.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
Во входном файле записано одно натуральное число jV(1 < Д'< 226).
Формат выходных данных
Запишите в выходной файл символ, стоящий в позиции ^получившейся последовательности.
Зпдмчи дли симиотоя1влыю< о решения <
Пример файлов входных и выходных данных
INPUT. !ХГ (HJlPUI.rxT 4	w
Задача 2. «Divide et impkra!»
На плоскости задано N прямых. Напишите программу, которая определяеч сколько кусков разбивают плоскость эти прямые.
Технические требования
Входной файл: IN PUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
Исходные данные во входном файле записаны в следующем порядке: N, alt blt с .... «v, /;Лг, сл, где 1 < N< 100, а пары чисел (<?,, Л.) и (с-, J-) — целочисленные К( t динаты двух различных точек, через которые проходит прямая с номером i.
данные разделяются пробелами и/или символами перевода строки.
: Формат выходных данных
В выходной файл необходимо вывести одно целое число — искомое кол ячее кусков.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
3	7
0 0 0 2
022020 0 0
Задача 3. «Два конвейера»
В цехе по производству напитков работают два конвейера. На первом конвег напиток разливается по бутылкам, а на втором происходит закупоривание бу лок. После схода с первого конвейера очередной бутылки она сразу же постуг на второй. Поскольку тара используется различная, каждая бутылка имеет < время заполнения и время закупорки. Требуется написать программу, которая заданной последовательности бутылок:
а)	определяет время, через которое последняя бутылка в этой последователз сти будет закупорена (закупоривать можно лишь наполненные бутылки);
Ь)	находит такую персе та попку заданных бутылок, при которой суммарное вр разлива и закупорки буты лок было бы минимально, и определяет это врем
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT
Ограничение времени: 20 секунд.
тipruiv^vrine *.,5вджчи по информатике,ггредла га вшивея на олимпиадах прошлых лет
Формат входных данных
В первой строке входного файла содержится целое число N(1 < N< 1000) — количество бутылок. Далее идут X пар чисел:	Х2 Y2,XNY& Здесь X; означает
время разлива, a Yt - время закупорки бутылки с номером г. Хг и Е — неотрицательные целые числа, не превосходящие 1 000 000. Все числа разделяются пробелами и/или символами перевода строки.
Формат выходных данных
Первая строка выходного файла должна содержать время, требуемое для исходной последовательности бутылок, вторая — минимально возможное время для пункта Ь задачи. Третья строка должна содержать перестановку номеров бутылок от 1 до N, для которой достигается минимальное время.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.ВТ
3	490
200 40	370
100 100	3 2 1
30 90
Задача 4. «Антивирус»
Для распознавания различных вирусов программа HIVTEST использует набор сигнатур. Если сигнатура вируса встречается в файле (последовательности литер), то файл считается зараженным этим вирусом. Напишите программу, которая по заданному набору сигнатур определяет, какими вирусами инфицирован анализируемый файл.
Сигнатура вируса формально описывается следующим образом:
<сигнатура>: <бдйт>|'?’| ’*'| <сигнатура> <сигнатура>
<байт>::= шестнадцатеричная цифра>
шестнадцатеричная цмфра>
шестнадцатеричная цифра>::-'0’| Г|'2'|’3'f*4'1*5’|'6'|'7'| 'S’l’S'l'A'I’B’l'C'I'D'I'E'I'F*
Например, 1F71E* — сигнатура, a *?FFF — не является сигнатурой. Байт (две шестнадцатеричные цифры) в сигнатуре означает, что на этом месте в файле должен быть именно этот байт. Символ 1 ? ’ означает, что на соответствующем месте может быть любой байт. Символ ' * ’ заменяет любую, в том числе и пустую, последовательность байтов. Считается, что сигнатура присутствует в файле, если она может быть правильно прочитана, начиная с некоторой позиции этого файла.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
Первая строка входного файла содержит количество различных вирусов N( 1 <N<10). В каждой из следующих Nстрок указано имя одного из вирусов, а через пробел —
Задачи для самостоятельного решения 2ВЗ
соотвсгс । пуктшм ему сигнатура. Имена вирусов не повторяются и состоят не более чем из 20 лаги неких букв и цифр. Длина сигнатуры не превышает 100 символов. В (У + 2)-Й строке записан анализируемый файл (последовательность литер) в шестнадцатеричном представлении (банты последовательно записаны как пары шестнадцатеричных чисел). Длина анализируемого файла не превышает 10 000 байт.
Формат выходных данных
Выведите в выходной файл имена вирусов, которыми инфицирован заданный анализируемый файл. Имена вирусов должны разделяться символами перевода строки.
Пример файлов входных и выходных данных
INPUT.TXT	OUTPUT.TXT
4	small virus
small virus 2F3E74F	polymorph
bi gvlrus A5*FF? 0D*A6*23? 724
vIRusamarlNA 1F70775F polymorph 22*33 22312F3E454F763318
Задача 5. «Новые гвозди»
На прямоугольный стол разложили N одинаковых листков бумаги со сторонами, параллельными краям стола. Необходимо прибить листки к столу гвоздями так, чтобы в каждый листок был вбит ровно один гвоздь, а каждым гвоздем прикреплялся к столу хотя бы один листок. Гвозди нельзя забивать в границы листков бумаги.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
В файле исходных данных записано количество листков ДГ(1 < ЛГ< 100), длина листка L и его ширина Т7(1 < L, V7< 1000). Далее следуют описания У листков, заданных координатами левого нижнего угла. Оси координат расположены по краям стола, начало координат находится в левом нижнем углу стола. Координаты точек — пары неотрицательных целых чисел, не превосходящих 1000. Все числа разделяются пробелами и/или символами перевода строки.
Формат выходных данных
Если вбить гвозди требуемым в условии способом невозможно, то необходимо поместить в выходной файл строку вбить гвозди невозможно. Если искомый способ существует, то программа должна вывести в выходной файл координаты гвоздей в произвольном порядке. Координаты гвоздей — вещественные числа. Числа в выходном файле должны разделяться пробелами и/или символами перевода строки.
<04приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Пример файлов входных и выходных данных
INPUT.TXT	output, тхт
3	66
10 10	13 7.5
О О 5 5 12 3
ПРИМЕЧАНИЕ Следующая группа задач предлагалась на универст стекой олимпиаде студентов по информатике в 1997 году.
Задача 6. «Телефонная связь»
Поселок состоит из А домов, расположенных вдоль прямой дороги с одной стороны на равных расстояниях. Дома пронумерованы последовательно: 1, 2, 3, ..., Лт, В поселке проводят телефонную связь. В таблице Туказано, сколько телефонных аппаратов надо установить в каждом доме. Расстояние между двумя соседними домами считается равным единице.
Создать программу для определения номера дома, в котором надо установить АТС, чтобы суммарное расстояние от АТС до всех телефонных аппаратов было минимальным. Если таких домов несколько, достаточно найти любой. Каждый телефон связан с АТС отдельным проводом.
Под расстоянием до телефонного аппарата подразумевается расстояние до дома, в котором будет установлен аппарат. Расстояние от АТС до телефонного аппарата, установленного в доме, где стоит АТС, считается равным нулю.
Технические требования
Входные данные берутся из текстового файла inputl.txt, первая строка которого содержит число домов, вторая — линейную таблицу Т. Исходные данные корректны, их проверка не требуется.
Выходные данные — номер дома, где нужно поставить АТС, и суммарное расстояние до всех телефонных аппаратов — выводятся на экран.
Пример файлов входных и выходных данных
б	АТС - в доме 4
103113	Суммарное расстояние - 13
Задача 7. «Функция»
Целое положительное число М записывается в двоичной системе счисления, затем разряды переставляются в обратном порядке. Получившееся число принимается за значение функции В(Ю.
Создать программу для вывода в текстовый файл OUT.TXT значений функции В<М) на отрезке [512,1023].
Задача 8. «Считалка»
Вокруг считающего стоят Ачеловек, один из которых назван первым, а остальные пронумерованы по часовой стрелке числами от 2 до N. Считающи й ведет счет до М' начиная с первого. Человек, на котором остановился счет, выходит из круга. Счет
Звдичи длм самостоятельного решения 286
вшить начинается со следующего за выбывшим человека (при этом выбывшие из круга нс считаются), и так до тех пор, пока не останется один человек.
i Определить начальный номер оставшегося человека.
Технические требования
Входными данными являются числа У и Л/, которые вводятся с клавиатуры. Результат — номер оставшегося человека — выводится на экран.
Пример файлов входных и выходных данных
;	5 3 Номер оставшегося - 4
ПРИМЕЧАНИЕ Следующие задачи предлагались па городской студенческой олимпиаде по информатике в 1997 году.
! Задача 9. «Многоугольник»
 Выпуклый многоугольник на плоскости задан целочисленными координатами  своих вершин. Требуется подсчитать количество точек с целочисленными координатами, лежащих на границе многоугольника.
Технические требования
Входными дашIыми являкm я шjело вершин многоугол ьника и их коорди! >аты в порядке обхода по часовой стрелке. Координаты вершин — целые числа и по модулю не превосходят 1 000 000.
Входные данные берутся и.« i екстового файла INPUT4.TXT, в первой строке которого указывается число шрпши .многоугольника, в каждой следующей строке — пара координат. Результаты вы водятся на экран.
Исходные данные коррек i пы, их проверка нс требуется.
Пример файлов входных и выходных данных
4	80
-10	-10
-10	10
10	10
10	-10
Задача 10. «Метеостанции»
На Южном полюсе рас полижгиы У Пронумерованных метеорологических станций. Каждая станция сое/пиггиа с другими станциями линиями связи. В результате стихийного бедствия i к • iч< н орые линии связи оказались нарушенными. Исправность линии связи межд\ / й и К-й станциями определяется из целочисленной таблицы NET\ элемент с пи и ксами (/,К) равен 1, если связь между 7-й и К-й станциями не нарушена, и 0 н противном случав.
Требуется определить. между какими парами станций связь невозможна даже через цепочки других cj a11111r i i.
Создать программу дл :n >i i редслеияй пар станций, между которым невозможно установить связь.
28в Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет
Технические требования
Входными данными являются число станций ТУи целочисленная таблица NET размером NxN
Входные данные берутся из текстового файла IN PUTS .TXT, в первой строке кото-. рого указывается число станций, в каждой следующей строке — очередная строка таблицы. Результаты — пары номеров станций — выводятся построчно на экран.
Исходные данные корректны, их проверка не требуется.
Пример файлов входных и выходных данных
4
110 113
1 1 0 02 3 0 0 1 03 4 10 0 1
Задача 11. «Скобки»
Дано арифметическое выражение, состоящее из букв, однозначных чисел, знаков арифметических операций и скобок, записанное в общепринятой форме. Требуется удалить из выражения лишние пары скобок (то есть пары, не влияющие на порядок выполнения операций).
Создать программу для удаления из заданного выражения лишних пар скобок.
Технические требования
Исходная строка с выражением вводится с клавиатуры.
Результат — упрощенное выражение — выводится на экран.
Пример файлов входных и выходных данных
((6/2)*А+(8-5))/(Е) (6/2*А+Б-5)/Е
Задача 12. «Криптограмма»
Текст закодирован с помощью сетки, представленной ниже, где цифрой 0 обозначено отверстие. Для того чтобы декодировать сообщение (криптограмму), нужно наложить сетку на текст так, чтобы в отверстия можно было видеть символы закодированного текста. Первый раз сетка накладывается так, чтобы сторона, отмеченная знаком «+», была верхней, затем сетка поворачивается по часовой стрелке на 90 градусов, читается следующий набор символов и так далее до полного оборота сетки на 360 градусов.
10 10 10
11110 1
110 111
10 110 1
111110
1110 11
Создать программу для ввода закодированного текста по строкам и расшифровки его с помощью данной сетки.
Залечи для самостоятельного решения 387
Технически# требования
Исходные данные — текст и сетка — задаются в виде квадратных таблиц в текстовых файлах inpl.txt и inp2.txt, каждая строка таблицы размещается в отдельной | строке файла. Результат выводится на экран.
^Пример файлов входных и выходных данных
[	ж б в у н р бурямглоюнебонроетвихриснежныекрутя
i	и ы н е я е
1,	к х я 6 р р
j	о г у р л к
f ,	т и р я о о
с е н ю е т
'	1 0 1 0 1 О
}	iiiioi
'	110 111
i	10 110 1
111110
1110 11
Задача 13. «Зоны»
Двумерная таблица ₽(1 :М, i:N] заполнена нулями и единицами. Цепочкой будем называть последовательность единичных элементов таблицы, в которой последовательно расположенные пары элементов таблицы являются соседними по гори-' зонтали, вертикали или диагонали. Смыкаясь концами друг с другом и с краями ’ таблицы, цепочки делят таблицу на «зоны», заполненные нулями. Своими индексами Р и Q задается элемент таблицы. Требуется заполнить единицами зону таблицы, в которой находится заданный элемент. Если заданный элемент окажется единичным, то таблица не преобразуется.
Создать программу для получения из заданной таблицы другой таблицы, в которой зона с указанным элементом заполнена единицами, если указанный элемент — нулевой.
Технические требования
Входными данными являются число строк Л/и столбцов АГ таблицы, значения элементов таблицы и индексы задаваемого элемента.
Входные данные берутся из текстового файла IN Р5.ТХТ, в первой строке которого указываются числа М и М в каждой следующей строке — очередная строка таблицы, в последней строке файла — числа Р и Q.
Результат — новая таблица — выводится на экран.
Пример файлов входных и выходных данных
12 12
000000000000
011000000000
010111110000
010000001000
010011000100 010101000010 010011011110 010000010000
оссооошюооо 0К 000(100000 огни юооо 011111111000 0211111 И 100 OUJiJl I Н 110 ОНИ I I !1 ПО ОН 11111(1000
286 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых ле i
010010011000	011111111000
010101001000	011101111000
011000110000	011000110000
000000000000	000300000000
5 8	
Задача 14. «Лист бумаги»
Имеется прямоугольный диет бумаги, длина которого равна N см, а ширина М см С листом можно производить следующие операции: сгибать лист пополам, сонме щая противоположные стороны листа; сгибать лист, совмещая одну строну с параллельной ей линией сгиба; разгибать лист, при этом оставляя на нем линию сгиба.
Написать программу, которая определяет, можно ли свернуть лист так, чтобы получился прямоугольник длиной Р см и шириной Q см. В случае утвердительно го ответа программа должна выдавать минимальное количество операций с лис Том, необходимых для этого.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 5 секунд.
Формат входных данных
•=: В первой строке входного файла содержатся вещественные числа N, М, Р и Q в ви-:  де десятичных дробей.
л формат выходных данных
£,• Вели лист можно свернуть, то первая строка текста должна содержать слово YES и минимальное число операций, необходимых для этого. В противном случае пер-
, вая строка текста долЖ1i а содержать слово No.
Г Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT 12 1 0.75 YES 4
Задача 15. «Система счисления»
Множество символов 7-ричной системы счисления (2 < / < 36) образуют символы О,9, А, В,..., Z. Если I < 36, то соответствующее количество последних букв ла-тинского.алфавита в качестве цифр не используются. Если 1< 10, то не используются соответствующие цифры. Необходимо написать программу, которая по двум текстовым строкам, означающим одно и то же число в 7-ричной и J-ричной системе счисления, определяет минимальные значения I и J.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 10 секунд.
Задачи для самостоятельного решения 208
Формат входных данных
Во входном файле хранятся две строки символов, означающих первое и второе числа. Длина строки — не более 40 символов.
Формат выходных данных
В выходном файле в текстовом виде должны содержаться пары чисел I nJ или слово No, если заданные числа не равны ни в каких из указанных (2 < I < 36 и 2 <J < 36) системах счисления.
Пример файлов входных и выходных данных
INPUT.TXT OUTPUT.TXT
10	2 3
2
Задача 16. «Электрическая цепь»
В электрическую цепь включено X устройств. Устройство с номером I реагирует на поступающие в сеть сигналы определенной частоты (частота — неотрицательное вещественное число), причем само тоже генерирует сигналы и посылает их г цепь. Для каждого устройства задан диапазон частот сигналов (Л(7), В(Г)) (А(Г) и В(7) — неотрицательные вещественные числа, причем А(Г) < В(Г)), на которые этс устройство реагирует (исключая эти числа) и посылает в цепь сигнал с частотой равной С(7)*Х + D(F) (С(7) и D(7) — вещественные числа), где А’ — частота поступившего сигнала. Диапазоны различных устройств могут пересекаться, в этом случае все генерируемые сигналы распространяются одновременно. Работа цепи за канчивается, если ни один из распространяемых по ней сигналов не попадает в диапазон ни одного устройства.
Напишите программу, определяющую по описанию всех устройств сети множество всех сигналов X при подаче которых работа цепи никогда не закон чится.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
В первой строке входной) файла содержится число устройств Лг(1 < N< 20). В по следующих строках файла указываются четверки вещественных чисел Л(/), В(1] С(Г), D(T) в виде десятичных дробей. Каждая четверка занимает отдельную строк файла.
Формат выходных данных
В выходном файле указываются пары вещественных чисел — начала и концы диа пазонов частот сигналов, при подаче которых цепь никогда не закончит свою работу Если таких сигналов нет, то файл должен содержать слово No.
xvu приложение 2. Задачи по информатике, предлагавшиеся ни олимпиадах прошлых лет
Пример файлов входных и выходных данных
INPUT.TXT	OUTPUT-тхт
2
О 5 2 10	0 5
10 15 1 ~10	10 15
Задача 17, «Точки»
Имеется Nточек и известны расстояния между некоторыми из них. Нужно написать программу, которая проверяет, можно ли эти точки расположить на плоскости так, чтобы указанные расстояния между ними сохранились.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 20 секунд.
Формат входных данных
В файле исходных данных записано количество точек jV(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 имеется N монет. На следующий год мистер Z взял из сундука М монет. В каждый следующий год мистер Z добавлял в сундук столько монет, сколько у него было два года назад. Известно, что на Х-й год в сундуке мистера 2 было У монет. Требуется определить, сколько монет было в сундуке изначальнс и сколько монет мистер Z взял на второй год.
Формат входных данных
Файл In put. txt содержит числа X и К
Формат выходных данных
Файл Output.txt содержит числа N и М.
Алгоритм решения
Алгоритм решения — чисто математический. Рассмотрим последовательность чисел
А(1),А(2),...,А(п),...
Здесь A(k) — число монет в сундуке на k-й год. Из условия задачи получаем:
А(1)-АГ,
A(2)-N-M,
А(3) - 2АГ - И
А(4) - ЗХ - 2М,
А(5) - 5N - ЗМ
А(6) - 8N - 5М,
А(Х) =	- F(X - 1)М - У.
Здесь F(n) — последовательность чисел Фибоначчи, которые определяются рекуррентными соотношениями:
W-l
Л2) -1
/'(К) = F(K - 1) т F(K - 2), К> 2
Вполне очевидно, что для нахождения М и N достаточно найти целочисленно решение уравнения:
F(X)N-F(X-1)M~ Y
Такое уравнение, вообще говоря, имеет счетное множество решений. Однаю в данном случае эта множество конечно, поскольку Л (л) > 0 для всех п. Следова тельно:
А(К) > Л (К-2) для К > 2.
Таким образом:
М<Х< Y
Программная реализация
Программная реализация сводится к нахождению целочисленного решения уравнения F(X)N - F(X-t)M = Упри условии М< jV< У Программа находит все возможные варианты ответа или выдает сообщение о том, что решения нет.
Program MoneY;
Var
F;Text;
X.Y:Integer;
Procedure Init; {ввод из файла}
Begin
Ass i gn(F,11при t.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:-!
Else
Begin
A:=1;B:<;
For I:«3 To К Do
Begin
C:=B;
B-B+A;
A:<
End;
GetValue:=B
End
End;
Procedure Run:(решение уравнения}
Var
H.N:Integer;
A,В:Integer:
T;Boolean: {флаг разрешимости уравнения: true - если решение есть}
Begin
Ass1gn(F,'Output.txt');ReWr1te(F);
A:=GetValue(X):
B;=GetValue(X-l);
задачи с комментариями и решениями
I -i.j1-.i-,
Fur N TO Y DO
For M—0 To N Oo
If A*N-B*M-Y Then
Begin
Ti^True:
WrlteLntF.N,' ’.M)
End:
If Not T Then WriteLn(F.'Задача не имеет решения!'к Close(F)
End;
Begin
Init:
J Run End.
Задача 2. «Функция»
Задача была предложена на Московской олимпиаде школьников в 1991 году и не Олимпиаде первокурсников факультета ПММ в 1998 году. Ниже приводится программа, разработанная студентом 4-го курса факультета ПММ ВГУ Олегом Викторовичем Гладышевым.
Условие задачи
Функция Г(п) для целых неотрицательных п определена так:
F(0) = О, F(I) = 1, F(2n) = F(«), F(2n + 1) - F(«) + F(n+1)
Для данного нужно найти и напечатать F(n). Обязательное условие: N стол t велико, что недопустимо заводить массив из N чисел.
Алгоритм решения
Основная идея алгоритма заключается в том, что при разложении F(2n + 1) на 1(п и F{n +1) мы должны вычислить 2 значения функции. Либо w, либо п + 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
с, {Текущий четный аргумент} пс. {Текущий нечетный аргумент} кс, {Коэффициент при четном аргументе} kne,	{Коэффициент при нечетном аргументе}
mLonglnt;
{В переменной с всегда должен быть четный аргумент, а в пс - нечетный. Эта процедура меняет местами значения переменных с и пс, если это необходимо} Procedure Correct:
г. лцджчи по информатике, предлвгвишиесм ни олимпиадах прошлых лет
var Temp;Long Int:
Begin
if odd(c) then
Begin
Temp:=c;
c:-nc:
no:-Temp;
Temp;=kc: kc:-knc; kriC;=Temp;
End;
End;
Begin
Writer Введите число
ReadLn(N);
n^abs(n); {Вычислим модуль n}
if n-0 then Wrltelnt'O'} else
Begin
while n mod 2 - 0 do
n:=n div 2; {уменьшаем л до’нечетного числа} c:=n d1v 2; {Разложим п на четное} пс:=п-с; {и нечетное числа}
if с=0 then кс:Ч) else кс:Ч;
кпс:=1;
while (с>2) or (nc>2) do
Begin
Correct; (поменяем с и пс. если нужно} с:=с div 2:	{получим новый аргумент}
кс;-кс+кпс;	{получим козфф. при нем}
пс:=пс-с; {вычислим второй аргумент)
End;
WriteLn(Kc+knc); (Выведем результат}
ReadLn;{Подождем}
End;
End.
^Задача 3. «Лабиринт»
G Задача была предложена на общеуниверситетской олимпиаде по программ ирона-&ию, посвященной дню рождения факультета ПММ (март 2001 года). Ниже приведено решение победителя олимпиады, студента 4-го курса факультета ПММ ВГУ [^Антона Александровича Елинских.
^Условие задачи
В результате рейда налоговой полиции города Обломова в фирму «Real» в одном fe-Йз небоскребов был обнаружен секретный уровень, на который вела только одна •'Лестница, а в некоторых местах были аварийные выходы (в виде люков в полу). - Согласно агентурным данным уровень представляет собой прямоугольник из Л/ х М * комнат одинакового размера (М комнат вдоль западной стены, N — вдоль северной), причем между некоторыми парами соседних комнат есть двери. Положение осложняется тем, что точные координаты входа и выходов неизвестны.
На разведку были отправлены обезьянки из местного зоопарка. Каждая из них поднималась по лестнице и ходила по уровню, пока не натыкалась на какой-нибудь выход. После этого она спускалась по нему и сообщала свой маршрут началь-
Задачи о комментариями и решениями gvo
ству. При игом первая обезьянка в начальной точке смотрела на север, а осталь-1 ныс — неизвестно куда. Маршрут каждой обезьянки представлен в виде последовательности символов, представляющих движения и повороты:
м F— шаг вперед;
a R — поворот направо;
« L — поворот налево;
в В — разворот;
и W — впереди стена, движения не было;
f  Е — выход, конец маршрута (может идти только непосредственно после F).
1 1
Задача состоит в том, чтобы построить план обследованной части уровня, со-: держащий всю собранную информацию: стенки, проходы, выходы.
Технические требования
, Входной файл: INPUT.TXT.
: Выходной файл: OUTPUT.TXT.
Время тестирования: 20 с/тест.
, Входные данные
г
: В первой строке входного потока задаются числа М и N, разделенные пробелами.
На следующей строке задается общее количество маршрутов. Далее идут мар- шруты, представляющие собой последовательность символов F, R, L, В, IV, Е, возможно разделенных символами пробела. Каждый маршрут заканчивается симво-лом Е, после которого начинается следующий маршрут.
Ограничения
Входные данные удовлетворяют следующим ограничениям: 1 < М < 50,1 < N < 50, общее количество маршрутов — не более 100, общее количество символов в записи маршрутов — не более 255.
Результат
Программа должна напечатать карту уровня размером (2Л/ + 1) х (2N + 1), нарисованную символами:
« пустая комната или проход обозначаются пробелом;
» угол комнаты — знак + ;
• северная/южная стенка -- знак
® западная/восточная стенка — знак |;
* вход — знак *;
в выход — знак #;
 неизвестное состоя 11 не ком каты или стенки — знак ?.
Если существует несколько планов уровней, удовлетворяющих условиям задачи, достаточно напечатать любой, если план построить не удается, программа должна напечатать строку N0.
11*1 и
информатике, предла г Ьвш и ос и ни олимпиадах прошлых лот
Алгоритм решения
Для построения плана необходимо соотнести донесения всех обезьянок гак, что бы они не противоречили друг другу. Используется бэк-трэкинг, расшифровываю щи» маршрут очередной обезьянки, и, если это приводит к конфликту, последний маршрут отменяется и производится попытка согласовать маршрут этой обезьянки, предположив, что в начальный момент она смотрела в другую сторону, и т. д. Если все четыре начальных направления обезьянки приводят к конфликтам, счи тастся, что план для этой обезьянки построить не удается, что вызовет изменение начального направления предыдущей обезьянки, и так далее до первой. Откат реализуется путем рекурсии, а состояния плана хранятся в стеке.
Если при какой-либо комбинации начальных состояний всех обезьянок план построен, он и является ответом. Если такой комбинации нет, плана не существует.
Программная реализация
Program Labirint; {Автор - Клинскмх A. A.}
Const
MaxN=50;
MaxM=50;
type
TPoint> record
x.y;Integer
end;
PPlan=*TPlan;
TPlan=array[-2*MaxN.,2*MaxN,-2*MaxM..2*MaxM] of char; {План}
TStack=ATElem:
ТЕlem=record
PlanrTPlan:
L.R.T.B:integer;
Next;TStack
end;
var
Stack:TStack; {Стек}
Input,Output:Text; {Файлы ввода-вывода}
M.N:integer; {Размеры поля}
NOfM:integer; {Число маршрутов}
L.RrT,В:integer: {Текущие границы поля}
Cur,Next,Di г:Трот nt; {Текущая и следующая точки и направление, куда смотрит обезьяна}
₽1ап:ТР1ап; {План}
Monkeys:array!1..10] of string: {Маршруты}
{Процедуры работы со стеком}
{Инициализация стека}
procedure InltStack;
begin
Stack;=nil
end;
{Добавление в стек}
procedure PushStack(var Plan:TPlan:T,B.L.R:integer); var
p:TStack;
begin
p:-Stack:
newt Stack):
Задачи с комментариями и решениями 297
'Л ,ii I д Г Lin -14 лп.
М .к Г I -I .
S	1..K kM -I.;
Stack*.R:-R;
Stack*.В:-В:
Stack*.next;=р end;
{Извлечение из стена}
procedure Popstack(var Plan:TPlan;var T,В.L.R:integer); var
p:TStack;
begin
pi=Stack:
Stack;=Stack*.next;
T:=p*.T;
L;=p*.L:
R:=p*.R:
B:=p*.B;
Plan:=p*.P'lan:
dispose(p) end;
{Проверка стека на пустоту}
Functi on Empty:boo1ean:
begin
Empty:=Stack=nil end;
j" **^★***'#★★★★***★>**++*•*1* iA-*r *★*** J
{Процедура чтения}
procedure InitIO: var
i	: integer;
begin
assign(input.'input txt').
assign(output.'output.txt');
reset(1nput);
rewrite(output):
read(input.M):
readln(input.N);
readln(input.NOfM): For 1;=1 to NofM do
readln(input.Merkeys I ।1> end;
{-----------,-----Anr.ipi i м ---------------}
{Функция, ’’пытающаяся" ....1И1[?ровать очередной маршрут)
{Если удалось пост рок  гил,1, иоэвращает true}
Function GctNextMonkeyr..in integer);boolean: var index:byte: c;char;
begin
Get Next. Monkey: =-Fa I s। •
index:=l; (Ночс-р с-н-г- ai -	। имвола в маршруте}
repeat
с: -ttonk eys [nom] [’ n>:, • - I case c of
'F':begin {Если ............'ргд}
if (Plan[Next.x,Hc-.i . in | ' *.'?]) then {Если впереди стенка,}.
xvo। |рилож«ни« z. Задачи по информатике, предлагавшиеся ни олимпиадах прошлых лет
begin [шагать туда нельзя) Cur;-Next;
Next.x:-Cur_x+D1r. х; Next.y;-Cur.y+Dir.y;
Plan[cur.x.cur.y]’;
if МопкеузЕпотЗ^пйех+Ц-'Е' then [Обезьянка здесь вышла} begin
GetNextMonkey;-Plan [Next.х.Next.у] in	[если это невозможно}
if [Plan[Alext.x. Next .у ]]*[’?'.'#’]-[] then exit; {запоминаем ошибку) PlantNext.x.Next.у];я'#' {иначе устанавливаем выход} end;
if Pl anENext.x.Next у] in ['?’] then PlantNext.x,Next ,yj:-' ': Cur:-Next;
Next.x.'-Cur.x+Dir. x; Next.y; -Cur .y+Dir.y;
if cur.y>=T then T:*cur.y+1; {Изменяем местоположение обезьянки}
if cur.y<-B then 8:-cur.y-1; {и габариты яланаСесли нужно)} if cur.x>=R then R;-cur.x+l;
if cur.x<-L then L:»cur.x-1:
if t(T-8+l)>2*M+l) or ((R-L+1)>2*N+1) then exit: {План слишком большой} if Plantcur.x.cur.y]-'#' then begin {Пришли на выход:проверим сообщение обезьянки} GetNextMonkey;-Monkeys[nom][index+l>rE': [и выйдем} exit end end else exit end;
L':beg1n {Повернем обезьянку налево) if dir.x-0 then begin dlr.xz-dir.y: dir,y:=0 end else begin dir.y:=d1r.x;
dir.xr-0 end;
Next.x:-Cur.x+Di r.x: Next.у:-Cur. y+Di r. у end;
‘R’:begin (Повернем обезьянку направо} 1f dir.x-0 then begin dir.xr-dir.y;
dir.y;-0 end else begin dir.y:-~d1r.x;
dir.X:-0 end;
Next ,x: <ur.x+D1 r,x: Next,y:-Cur .y+01 r.y end;
'B‘;begin {Развернем обезьянку} dir.x:--dirx;
dir.y;»-d1r.у;
Задачи с «оммФнтаринми и решениями 4CVV
Next .» -Сиг м*1)1Г.х; Next,у;-Cur.y+Dir.у end.
W:begin {Впереди стенка)
1f Pl ап[Next.л.Next.у] in	,’|‘J then
begin
if dir.x-0
then Plan[Next.x.Next.y]:=‘-' {вертикальная или горизонтальная)
else Pl an[Next.x,Next.у]|':
if Next.y>T then T:-Next.y:
if Next.y<B then B:=Next.y:
if Next.x>R then R:=Next.x: {Изменяем габариты плана(если нужно)} if Next.x<L then L:-Next.x
end
else
exit
end
end;
inc(index)
until c='E';
GetNextNonkey;-True (Если не было аварийных выходов,есе в порядке) end;
{Функция, находящая план гю всем маршрутам начиная с рог.) {Рекурсивно вызывает саму себя, пока не использует все маршруты) {Если удалось построить план.возвращает true)
Funct1on GetMonkeys(per:i nt eger):boolean:
var
t0.b0.10.r0:integer;
DJPoint;
p;PPlan:
OK:boolean;
Count:integer;
begin
if por>N0fM then
begin {Все маршруты согласованы)
GetHonkeys:MTrue; {Запоминаем.что план построен)
new(p);
while not Empty do {Очищаем стек)
PopStackCpMO.BO.LO.RO);
exit
end;
Count:-I;
d.x:=0; d.y:=l;
repeat
Dlr:=D;
Cur.x:=0: Cur.y:-0:
Next.x:-Cur.x+Dlr.x; Next у H’ur.y+01r.y:
PushStack(Plan,T.B.t.R); (Сохраняем настройки)
OK:-GetNextMonkey(por) and цнMonkeys(por+l); {Добавляем маршрут}
if OK then break; {Если iih ныходим)
Popstack (Pl an, T.B.L. R): >iihi’ иосстановим настройки}
if d.x-0 then {и повер1, м ^ы.янку)
begin
d.x:=d.y; d.y;-0
end
else
begin
d.y:-'d.x:d.x;=0
end;
. сидячи пи гм формат ике, предлагавшиеся ни олимпиадах прошлых
inc(Count)
until (Count-5) or OK;
GetHonkeys:-OK
end;
{Инициализация поля]
procedure Clear;
var
1. j integer:
begin
For i :=-MaxN to MaxN do
For j:=-MaxM to MaxH do
if odd(abs(D) and oddtabs(j)) then Planfi + ’ else Plan[i. j]:=‘?’: Plan[0,0]r='*’
end;
[Вывел плана)
procedure ShowPlan;
var
1 .j’.integer;
begin
For i:=T downto T-2*M do
begin
For j;< to L+2*N do
begin
if (i-T) or (f»T-2*M) then
if odd(j-L) then
write(output.1-‘)
else
write(output.' + ')
else
if (j4) or (j=L+2*N) then
if odd(T-i) then write(output,'[') else
write(output.' + ')
else
wr1te(ou tput.Plan[j,j]);
end;
writeln(output);
end
end:
[Вывод сообщения об ошибке)
procedure ShowError:
begin
writelnCoutput. 'NO
end;
{Закрываем использованные файлы}
procedure CloseW;
begin
close(input); close(output)
end;
begin (Основная программа)
InitlO;
Clear:
if Getfionkeys (1) then
ShowPl an
else
, ’Jliwl r t III
(.hr,Hu end
Задача 4. «Прямоугольники»
Задача предлагалась в 1998 году на олимпиаде первокурсников факультета ПММ ВГУ. Автор решения — одна из призеров олимпиады, Лусине Азатовна Мхитарян, В настоящее время студентка 5-го курса факультета ПММ.
*
Условие задачи
На плоскости задано Wпрямоугольников с координатами вершин (XIг, Viz), (Х2г, Y2i), (X3i, У3|), (X4z, V4i), z = 1,2,3,..., М Известно, что все стороны прямоугольников параллельны осям координат. Все прямоугольники являются замкнутыми множествами, то есть содержат свою Гранину. Будем считать, что прямоугольники пересекаются, если они имеют хотя бы одну общую точку (в том числе и на грани це).
Необходимо определить количество фигур, образованных в результате наложения прямоугольников.
Входные данные
| В первой строке (1 < ЛГ< 100) — число прямоугольников.
! В каждой последующей — их координаты, заданные целыми числами:
5	wf<iooo) ?-i. 2. 3.n.
Выходные данные
Число фигур.
Алгоритм решения
Задача решается с использованием элементов теории графов.
Строится матрица инцидентности М, где = 1, если 7-й прямоугольник пересекается с/ м. Остается лишь определить число компонентов связности полученного графа.
Программная реализация
Program Rectangular; {Ан'Op  Мхитарян Л. А.}
Const MaxN=100;
Type TRec=Record
XA. YA. XB.YB: Integer-
End;
Var PA:Array	of IRec.
M:Array[1..MaxN.l..MaxN] of Boolean;
N.FC:Integer;
BA;Array[l. .MaxN] of Boolo.iri.
Function MintA.B: Integer . I nr i-grr:
Begin
If A>B Then Min:=B
Else Mi n:=A
End;
Function NaxCA,В: Integer; iriii'qcr.
Begin
If A<B Then Max—0
Else Max:-A
End;
Procedure Init:
Var F:Text; I.X1.YLX2. Y2.X3.¥3,X4,Y4:integer:	.
Begin
AssignfF.'input.txt ’): ReSet(F):
ReadLn(F,N):
For I:=l to N do
Begin
ReadLn(F,Xl.Yl,X2.Y2.X3.Y3.X4,Y4):
PA[I].XA:-Flin(M1nfXl.X2),Min(X3,X4));
PA[I]. YA:=M1n(Min(Yl ,Y2) ,M1n(Y3. Y4));
PA[I].XB:-Max(Max(Xl.X2),Max(X3.X4)):
PA[IJ.YB-Max(Max(Yl. Y2) tMax(Y3,Y4));
End;
For I.—1 to N do
For XI—1 to N do
M[I.XI]—False:
For I:-l to N do
BA[I]-False:
Close(F)
End:
Functi on Check (U: I n t eger): Bool ean:
{Проверка: пересекаются ли I-й и J-й прямоугольники}
Var Rl.R2:TRec;
Begin
Check—False;
If PALI].XA<PA[J].XA Then Begin R1-PA[1];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 I.J.К,TrInteger;
Begin
T—-1;
For I—1 to N do
If not BA[I] Then Begin I:=1;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 MLJ.J] Then
If Then True:
For I—1 to N do
If not BALI] and M[IJ] Then BA[I]:-True:
GetPodGraph—True
End:
Procedure Run;
{Вычисление количества подграфов}
Var I,J:Integer:
Begin
FC:-0:
Гог I -1 to N do
For J -I to N do
If h;-j Then Mtl.JJr-CheckU.J);
WMle 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
Ass1gn(F,'output.txt');ReWr1te(F);
WriteLn(F.FC);
Close(F);
End;
Begin
Inlt;
Run:
Done
End.
эдача 5. «Трубопровод»
Й
© основу условия положена задача, которая предлагалась на четвертьфинале мирового первенства по программированию 2000 года (г. Саратов). Автор программы ~ член сборной Б ГУ по программированию, в настоящее время студент 5-го курса факультета ПММ В ГУ Андрей Евгеньевич Поляков.
Условие задачи
Пусть имеется трубопровод,лианный прямой линией на плоскости Ах + Ву + С^ О, и два города с координатам j i (XI, У1), (Х2, У2). Необходимо соединить эти два города трубопроводом, истратив при этом наименьшее число труб; указать суммарную длину использованных труб и две точки, где происходит соединение трубопроводов.
Входные данные
Целые числа “100 000 < А,В,С 5 100 000 — параметры трубопровода.
Целые числа “100 000 < XI, И 5 100 ООО — координаты первого города.
Целые числа -100 000 < Х2,Г2 5 100 000 — координаты второго города.
Выходные данные
В первой строке указывается суммарная длина использованных труб.
Во второй и третьей coot нс гственно — координаты точек соединения трубопроводов.
Алгоритм решения
Рассмотрим две возможности.
• Точки лежат с разных ст<>|и>п от прямой. Тогда для их соединения достаточно опустить на прямую перпендикуляры из этих точек. На выходе получим сумму длин этих перпендикуляр!и их точки пересечения с прямой.
“ Точки лежат по одну сторону от прямой. Здесь возможны три случая.
. I Одна точка соединяется с другой, из которой затем опускается перпенди ку ляр на прямую. На выходе: длина перпендикуляра плюс расстояние между точками, координаты точки пересечения перпендикуляра и прямой, коор динаты самой ближней к прямой точки.
j Существует третья точка, для которой выполняется условие: перпендику ляр из этой точки к прямой и отрезки, соединяющие эту точку с двумя за данными, образуют угол 120 градусов. На выходе - длина перпендикуляра + сумма расстояний, координаты третьей точки и ее проекции на прямую.
J Для соединения точек достаточно опустить из них перпендикуляры на прямую.
Программная реализация
Program Tubes: {Автор - Поляков А. Е.}
Var X1.Y1.X2.Y2.A,B.C:LongInt:
Procedure Init:
{Инициализация}
Var F;Text;
Begin
AssignfF,1 input.txt');Re$et(F);
ReadLn(F.A.B.C):
ReadLn(F,Xl,Y1);
ReadLnCF.X2.¥2):
Close(F)
End;
Function TestLocation;Boolean:
{Проверка местонахождения заданных точек. Возвращает True, если точки расположены с одной стороны, и False - в противном случае }
Begin
Test Locat ion: Ч A*X1+B*Y1+C)* (A*X2+B*Y2+€)>0
End;
Functi on Dest(X. Y:Double):Double;
{Вычисление длины вектора}
Begin
Dest:=Sqrt(Sqr(X)+Sqr(Y))
End:
Procedure ProjlX У:Double;Var TX.TY:Double):
{Вычисление проекции точки (X.Y) на пряную}
Begin
TX:=(-C*A+Sqr(B)*X-A*B*Y)/($qr{A)+Sqr(B)):
TY:=(-C*B-A*B*X+Sq r(A)*Y)/(Sqr(A)+Sqr(B)):
End;
Function FindDifferentSideDesttVar txl.Tyl.Tx2.ty2:Double):Double;
{Решение задачи для случая 1}
Var D;Double;
Begin
Proj(Xl.Yl.Txl.Tyl);
D:=DeSt(TXbXl,TYl-Yl);
Proj(X2,Y2.Tx2.Ty2);
FindDifferentSIdeDest:=D+Dest(TX2-X2,TY2-Y2)
End;
Procedure FindPoint(PX.PY.X.Y.D:Double;Var TX,TY;Double);
(Нахижшииг ноордишн I очки im прямой, из ко юрой точка (х.у) видна под углом 30 ।радусон}
Var 1X1.1X2.TYI.ly2.Sq:0ouble;
Begin
Sq:-sq rt(3)*O/Sqrt(Sqr(A)+Sqr(В}):
TX1:=PX+B*sq:TY1:-PY-A*Sq;
TX2:“PX-B*Sq:TY2:=PY+A*Sq;
PX-Dest(TXbX.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
1	End;
=	Function F1nd0neSideDest(Var txl. Ту LTx2,ty2: Double): Double:
{Решение задачи для случая 2}
Var DI.D2.PX1.PY1.Рх2,Ру2,LX1,LY1.LX2.LY2.T.Res:Double:
1	Begin
;	ProjCXl.Y1.PX1.PY1);
j	Dl;=Dest(PXl’Xl,PYl-Yl):
FlridPoint(PXl.PY1.X2.Y2.DI.Lxl. Lyl):
Proj(X2,Y2.PX2.PY2);
D2:=0est(PX2-X2.PY2-Y2);
FindPoint(PX2.PY2.XlrYl,D2,Lx2.Ly2);
{Случай 2в}
Res:=01+D2;
Txl: -Pxl;Ту1:*Py1:Tx2 - Px2;Ty2:-Py2:
(Случай 2 a}
T:=Dest(X2’Xl,Y2-Yl);
If (02>T) or (D1>T) Then
If D1>D2 Then Begin Txl:-x2;ty1:-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(Lxi-Xl,Lyl-Yl);PYl:-Dest(Lx2-X2.Ly2-Y2);
If (2*T < PX1) and (2*T < PY1) and
(Dest(Lx2-Xl,Ly2-YI)<PYl) and (Dest(Lxl-X2.Lyl-Y2)<PXl) then
Begin
Pxl:-CLxl+Lx2)/2:Pyl-(Lyl+ly2)/2;
Px2:=Pxl-T*A/Sqrt(Sq r(A H Sc;r(В));Pxl:-Pxl+T*A/Sqrt(Sqr(A}+Sqr(В));
PY2:=Py1-T*B/Sqrt(Sqr(A)Лдг(H)):PY1:-Pyl+T*B/Sqrt(Sqr(A)+Sqr С В}):
T;=2*(D1+D2)-3*T:
If Res>T Then Begin
Res:=T;
If (A*PXl+B*PYl+C)*(A*X2*H*Y2+C)>0 Then
Begin Tx2;=Pxl:Ty?:=Pyl End
Else Begin Tx2:=Px2:Ty?:’Py2 End;
Txl:=(Lxl+Lx2)/2;Tyl:-(I yl-1 y2)/2 End
End;
FlndOneSi deDest:=Res
End;
Procedure Done:
{Вывод результатов}
Var F:Text:Txl.Tyl.tx?.ГуЛП Double;
Begin
Assign(F,’output.txt’) :Pi-rtr Hc(l );
If not TestLocation Thru 1> - I indl)ifferentSideDest(Txl.Tyl.Tx2.Ty2)
Else D:=FindOn.eSiil"Hi" к I. |, lyl ,Tx2.Ty2);
WriteLn(F.D:l:4);
Wr1teLn(F.Txl:l:4,' ’ ,Tyl:l:4):
WriteLn(F,Tx2:l:4.' ',Ty2:l;4);
CloseCF)
End:
Begin
Init:
Done
End.
Задача 6. «Телебашня»
Задача была предложена на общеуниверситетской олимпиаде по программированию, посвященной дню рождения факультета ПММ (март 2001). Ниже приводится решение победителя олимпиады, студента 4-го курса факультета ПММ ВГУ Afw-хаила Михайловича Ширяева.
Условие задачи
В результате пожара полностью сгорела телевизионная башня города Обломова, и все население города осталось без телевидения. Чтобы восстановить телевещание в кратчайшие сроки, мэр города распорядился разместить передатчики на крышах некоторых домов. Однако ситуация осложняется наличием в городе нескольких небоскребов, владельцы которых установили у себя на крыше антенну спутниковой системы See++ и поэтому не дают согласия на установку там передатчиков. Более того, эти небоскребы являются преградой на пути распространения сигнала, поэтому установки одного передатчика может оказаться недостаточно. Мэр хочет установить минимальное количество передатчиков так, чтобы зоны распространения сигнала покрывали весь город, исключая, возможно, территорию, занимаемую упомянутыми выше небоскребами.
Город Обломов представляет собой прямоугольник кварталов. Все кварталы имеют форму квадрата равной площади, а ширина улиц незначительна по сравнению с размерами квартала. Каждый небоскреб занимает полностью один квартал.
Каждый квартал (кроме небоскребов) имеет единственную телевизионную антенну точно в центре и считается охваченным телевещанием, если существует какой-нибудь передатчик, который находится в прямой видимости от антенны. Передатчики могут располагаться только точно в центре квартала.
Сигнал распространяется строго по прямой. Если на пути от передатчика к антенне сигнал лишь касается небоскреба, сигнал доходит до антенны. Других небоскребов в городе нет. Квартал, в котором установлен передатчик, считается охваченным телевещанием.
Программа должна найти минимальное количество необходимых передатчиков и указать места их размещения.
Технические требования
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Время тестирования: 20 с/тест.
Входные денные
г Первыми задаются два числа от 1 до 14, которые определяют количество кварталов в городе с запада на восток по оси х и с юга на север по оси у соответственно. Далее идет число от 1 до 195, задающее количество кварталов, занятых небоскребами, после чего перечисляются пары.т, г/ координат кварталов. Координаты кварталов отсчитываются от 1,
Все числа во входных данных разделяются произвольным количеством пробельных символов. В городе существует хотя бы один квартал (дом мэра), не являющийся небоскребом.
Результат
Программа должна напечатать минимально необходимое число передатчиков, после чего перечислить координаты кварталов, в которых они должны быть установлены.
Алгоритм решения
Алгоритм основан на рекурсии. На каждом се шаге на карту ставится антенна и вычисляются кварталы, охваченные вещанием. Если до всех кварталов доходит сиг-[ нал, то расположение антенн запоминается, при условии, что до этого не найдено расположение с меньшим числом антенн.
Для хранения информации о расположении антенн, небоскребов и кварталов, i охваченных вещанием, используются множества. Кроме того, информация о рас-: положении небоскребов дублируется в массиве, что позволяет ускорить работу программы.
Программная реализация
program Town: {Автор - И'иряев М. М.)
const
Nmax<4: {макс, число клир ьт лов по горизонтали<=16}
Мтах-14; {по вертикален;)
Lmax=Nmax*Mmax: {макс, число кварталов}
type
TNum=l..Lmax; {тип индексов кнарталов}
TSet=set of TNum: {тип множеств кварталов}
TRecwrecord {координаты ннгцлала}
х.утinteger
end;
ТАгr-array[TNum]of TRec: var neb,	{множество небес-q>.<.;in}
antrTSet; {множество ангин) arr_neb:TArr; {массив ||[.чия иргГюв} n.m, {число кварталов i- шрилонтали и вертикали} neb_num. {число небось nJ antjium: integer: (числе ...
function Getlndex(x,y- i' i г ii'i i integer;{индекс квартала} begin
GetIndex:=(y-l)*Nmax
end:
IMFKH.T» ни	”pJUH
F--Fvwrvrrrrwvmi^a-ivp T iw^rrnfTujjTTiw I TPMJ ! мрн/уТН1
procedure GetCoo rd(a: лteger; var x.у;i л teger); (поиск координат квартала} begin x:-(a-I) mod Nmax + 1:
y:-(a-l) div Umax + 1 end;
procedure Load:{загрузка карты} var f: text:
i:integer;
begin
neb:=[J;
AsslgnCf,'1nput.txt' }:Reset(f):
read(f ,n,ni,neb_num):
for 1:=1 to nebnum do with arr_neb[t] do begin read(f.x.y):
neb:=neb+[GetIndex(x.у)] end;
Close(f) end;
procedure Save;{запись числа и расположения антенн} var f .text;
i,x,y:integer;
begin
AsslgnCf,’output.txt');Rewr1te(f);
wri teln(f.’Число антенн:’):
writeln(f .antnum);
wrlteln(f/Координаты антенн:’);
for 1:4 to Lmax do if i in ant then begin
GetCoordCi,x,y);
writelntf.x.1 ’,y) end:
Close(f) end:
function Wavetai.a2:integer)boolean;
{проходит ли волна между кварталами al и а2} const
eps=0.Ql;(допустимое отклонение от угла квартала} half=0.5-eps;
var
xl.yl.x2,y2,x,у.{координаты кварталов al. а? и проверяемого небоскреба} i.t:Integer:
k{коэффициент наклона прямой},pl.р2{точки пересечения с небоскребом}:real; begin
Wave:=true;
GetCoord(al.xl.yl);
GetCoord(a2.x2.y2);
if x>x2 then begin
if yl>y2 then
begin
t:~yl; yl;=y2: y2:=t end;
for 1 :=1 to riebjiuTn do with arr_neb[i] do
лдвчи о комментариями и решениями <9U1
1f (x*xl),nullvl--y)ind(y<-y2)then begin Wave:-false; Exit end end else
if y>y2 then begin if xl>x2 then begin
xl:=x2; x2:-t end:
for i:-l to neb num do with arr_neb[i] do
if (yeyl)and(xl<-x)and(x<=x2)then begin Wave:Mfalse: Exit end end el se begin k:=(y2-yl)/(x2-xl);
for 1:=1 to nebnum 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:-faIse: Exit end; p2:-k*(x+0.5-xl)+yl:
if (y-half<p2)and(p2<y+halOther begin Wave:-false; Exit end;
i f (a bs(у-0.5-pl)<eps)and(abs(y+0,5-p2)<eps)or (abs(y+0,5-pl)<eps)and(abs(у-0.5-p2)<eps) then begin Wave:=false: Exit end:(проходит через углы небоскреба} k:=(x2-xl)/(y2-yl);
pl:=k*(y-0.5-yi)+xl;
if (x-half<pl)an<Kpl<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:
functi on Cover(var тиа p: TSc t; new_a: i nteger): bool ean: (покрыть каргу map проходящим сигналом из антенны newa} 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
i f Wave(new_a.a) then map:=map+[a J else Cover:=fa1se end end:
procedure Think:{расстановка антенн} var
vspom:TSet:[рабочее paстолишение} num:integer;{рабочее число антенн} procedure Step(map:TSet> new a:1nteger); (поставить антенну new_а на карту map} var x.y:integer;
begin
if not Cover (ma p,new_<i) then for x:-l to n do
procedure GetCoordU: integer:var x.у:integer); {поиск коорди<м1 ннвртала} begin
mod Nmax + Г,
y;-(a-l) div Nmax + 1 end;
procedure Load;(загрузка карты} var
f: text;
i:Integer;
begin
neb:-[];
Assign(f,’input.txt'):Reset(f);
readCf.n.m,neb_num);
for т :=1 to nebjium do with arr_neb[i] do begin
readff,x,y);
neb: meb+[GetIndex(x,у}]
end:
Closetf) end;
procedure Save;{запись числа и расположения антенн} var f:text г
i ,x,у;integer:
begin
Ass i gn(foutput.txt'):Rewrite(f};
writelntf.'Число антенн;');
writeln(f.ant_num);
writelntf,'Координаты антенн:'):
for i :=4 to Lmax do if 1 in ant then begin
GetCoordd .x.y):
writelntf,x.' ’.y) end;
Close(f) end;
function Wave(a1,a2:integer):boolean:
{проходит ли волна между кварталами al и а2} const
eps=0.01;{допустимое отклонение от угла квартала}
half4).5eps: var
xl,у 1.х2.у2.х,у.{координаты кварталов al. а2 и проверяемого небоскреба} i,tг integer;
k{коэффициент наклона прямой}.pl,р2{точки пересечения с небоскребом};real: begin
Wave;=true:
GetCoord(al,xl,yl):
GetCoord(a2,x2.y2);
if xl=x2 then begin
if У1>у2 then
begin
t:=yl; yl:-y2. y2r~t
end:
for i;=l to пеЬ_питп do with arr_neb[il do
□ Д1ЧИ С КОММвНТВрИИМИ И рвШвНИЯЫИ
if (x-d )midiYl--y>ind(y<-y2)then begin Wave:-false: Exit end end else
if yl-y2 then begin
if xl>x2 then begin
t:-xl; xl:=x2; x2:«t
i. end:
for i:=l to nebjium do with arr_neb[i] do
| if (y=yl)and(xl<-x)and(x<-x2)then begin Wave:-false; Exit end [. end
else begin '	k:=(y2-yl)/(x2-xl);
:	for i:=l to nebnum do with агг_пеЬ[1] do
(	begi n
I	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-i0.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:-faIse; Exit end end
end;
end:
function CoverCvar map;TSet;new_a:integer);boolean;
{покрыть каргу map проходящим сигналом из антенны new_a) var х.у.а:integer;
begin
Cover rue;
for x:=l to n do for y;=l to m do begin
a:=Get!ndex(x,y);
if not(a in map) and not(a in neb) then
if Wave(new_a.a) then map:=map+[a] else Cover:=fa1se end end:
procedure Think;{расстановка антенн} var
vspom:TSet:{рабочее рас юлпжение} num:integer;{рабочее число антенн} procedure Step(map; - Set.; now a: 1 nteger); {поставить антенну newa на wapiy map} var x.y:integer;
begin
if not Cover(map,new_fl) then for x:=l to n do
for y:-l to m do
begin
new_a:-GetIndex(x. у);
if not(new a in map)and not(new_a in neb) then begin
vspom:-vspan+[new_a]: inc(num);
Step(map.new_a);
v$pom:-vspom-[new_a]: dec(num)
end end else
if nurrr<ant_nuiD then
begin
ant_num:=num;
ant;-vspom
end
end;
var
x.y.ailnteger;
begin
ant:-[J: ant_num:4inax+l;
for x:tol to п Оо{ставим в качестве 1-й различные антенны}
for у:-1 to m do
begin
a.-Getindex(x.y);
if not(a in neb) then
begin
vspom;=[a]; nuffl:“l:
Step(LLa)
end
end
end:
begin
Load;
Think:
Save end.

Приложение 3
Интегрированная
инструментальная среда Turbo Pascal
(Borland International)
После того как вы завершили процесс разработки алгоритма и записали его в виде программы на языке Паскаль, необходимо поместить этот текст в файл на магнитном диске, перевести на язык машинных команд и загрузить в память ЭВМ для выполнения с тем или иным набором исходных данных. Каждое из перечисленных действий реализуется с помощью соответствующей компьютерной программы, относящейся к классу инструментальных, то есть используемых в качестве средств для создания других программ.
Размещение текста программы (исходного текста) в файле на магнитном диске осуществляется с помощью программ, называемых текстовыми редакторами. Они позволяют создавать и корректировать текст, отображая его на экране дисплея.
Программа в виде исходного текста не может быть непосредственно выполнена компьютером: предварительно она должна быть преобразована в последовательность машинных команд. Это преобразование выполняется специальными программами компиляции (компиляторами) и компоновки (компоновщиками, или линкерами).
Фирмой Borland International (США) была разработана система, объединившая основные инструментал ьные средства для разработки программ на собственном диалекте языка Паскаль - языке Turbo Pascal. Эта система получила название интегрированной инструментальной системы Turbo Pascal. Термин «интегрированная» указывает на спяль всех входящих в нее компонентов. Войдя в среду Turbc Pascal, вы сможете выполнить все этапы разработки программы начиная от создания исходного текста до ее отладки. В состав системы входят:
• экранный редактор;
* компилятор с языка 11 а< к;ы ь;
01 ж приложение 3 Интегриронаннпя инструментальная средпТПгТнГРВвО11
*	компоновщик;
•	• отладчик.
Для входа в систему Turbo Pascal необходимо ввести в командной строке ко манду turbo.
При использовании средств оболочки Norton Commander то же самое можно сделать, установив курсор на строку оглавления с именем файла turbo.exe или любого файла с расширением .pas и нажав затем клавишу Enter,
В обоих случаях сразу после загрузки системы начинает работать экранный редактор, выводящий на экран терминала окно редактора. При вызове системы ПО имени файла с расширением .pas в окне размещается содержимое этого файла, а в верхней строке окна — его название. При первом способе входа в систему окно редактора, как правило, бывает пустым, а в строке имени файла указывается NONAME 00. PAS — неименованный (файл).
Теперь вы можете либо начать редактировать файл, либо, если имеющийся текст Программы вас устраивает, приступить к ее выполнению. Но прежде, чем перейти К описанию соответствующих действий, обратим ваше внимание на еще одно обстоятельство. В первой строке экрана терминала размещается основное меню системы. Оно представляет собой строку с названиями Пунктов меню, каждый из Которых позволяет выполнить определенное действие. Для перехода в меню следует нажать клавишу F10. С отдельными пунктами меню мы будем знакомиться ПО ходу дальнейшего изложения. Пока же отметим, что система Turbo Pascal снаб-SJJOBHa справочной подсистемой, обращение к которой осуществляется выбором Пункта Help основного меню. При этом на экране разворачивается окно с кон-& ^екстной подсказкой, то есть информацией, относящейся к конкретной ситуации. Которой вы обратились за справкой. К сожалению, справочные тексты даны на к(ИСГЛИЙском языке, что делает их совершенно бесполезными для некоторых пользо-МКТелей.
и I
|8кранный редактор
^Экранный редактор системы Turbo Pascal выполняет разнообразные команды редактирования, которые условно можно разбить на пять групп:
'/» команды перемещения курсора;
? W команды поиска фрагментов;
Я команды вставки и удаления;
• команды работы с блоками текста;
В прочие команды.
Язык Паскаль не накладывает жестких требований на формат записи текста программы. Однако для удобства работы с текстом настоятельно рекомендуем вам соблюдать следующие правила.
 Использовать систему отступов при записи вложенных операторов или операторов, заключенных в опера горные скобки begin и end. Такой способ записи наглядно показывает структуру программы.
Экранный рвдшктор 41 *Э
1йшрнмгр:
while >* -у do
begin
if x>y
then x := x-y
else у := y-x:
writeln ( x:5. у15 )
end
ш He следует в одной строке записывать несколько операторов, кроме, может быть, простейших. В противном случае вы рискуете сильно усложнить себе жизнь • при отладке программы.
 в Объектам программы следует давать имена, отражающие их суть. Нс избегайте длинных имен, если они помогают лучше понять смысл программы. За редким исключением нс следует использовать однобуквенные имена вроде А, В и т. д.
л» Используйте комментарии для выделения в тексте логически завершенных ; фрагментов.
Например:
{ поиск минимального элемента в массиве }
(* сортировка таблицы записей *)
Теперь рассмотрим комбинации клавиш, предназначенные для выполнения отдельных групп команд.
Клавиши перемещения курсора
<— или —> — перемещение на один символ влево или вправо.
? или X — перемещение на одну строку вверх или вниз.
*	Ctrt-н-перемещение на одно слово влево.
*	Ctrln—> — перемещение на одно слово вправо,
*	Ноте “ перемещение к началу строки.
е End — перемещение к концу строки.
и Ctrl+Home — перемещение в начало первой строки окна редактора,
н Ctrl+End — перемещение н начало последней заполненной строки окна.
« Pg U р — перемещение на од ну страницу вверх, то есть сдвиг по тексту па величину экрана минус одна строка.
<	PgDn — то же, но перемещение на страницу вниз.
* Ctrl+Pg Up — перемеj це 1111 е 11 а 1 качало текста.
a Ctrl+PgDn — перемещение в конец (на. последний символ) текста.
Клавиши поиска фрагментов
С помощью клавиш этой группы вы имеете возможность производить поиск в тексте любого фрагмента. Это бывает полезно, например, при необходимости провести замену во всем тексте одного идентификатора другим.
« Ctrl+Q, затем F — открывается окно диалога, в котором нужно задать фрагмент текста. Затем, после нажал ня клавиши Enter, производится поиск первого вхождения этого фрагмента в текст.
Э14 Приложени» 3, Интегрированная инструментальная среде Tut bo PMOtl
	Ctrl+Q, затем A — то же, что и в предыдущей команде, но в окне диалога задаются фрагмент текста поиска и фрагмент текста для замены,
•	Ctrl+L ~ осуществляется поиск следующего фрагмента, заданного одним из дну х предыдущих сочетаний.
	Ctrl+Q, затем ] или Ctrl+Q, затем [ — ищется парный к одному из следующих сим волов:	),],}. Если парный символ найден, то курсор перемещает
ся к нему, в противном случае он остается на месте.
Клавиши вставки и удаления информации
Сочетания клавиш этой группы позволяют помещать в текст и удалять из него Символы, слова и строки. Редактор может работать либо в режиме вставки, либо в режиме замены, В первом случае вновь вводимый символ располагается в месте1 Нахождения курсора, раздвигая уже существующий текст. Во втором случае вводимый символ заменяет тот, на который указывал курсор. Переключение между режимами вставки и замены осуществляется нажатием клавиши Ins.
	Ctrl+N - в текст добавляется пустая строка.
Ж Ctrl+Y — удаление строки.
В Backspace — удаление символа слева от курсора.
,р Del — удаление символа над курсором.
jp Ctrl+T - удаление слова (части слова) справа от курсора.
Ctrl+Q, затем Y — удаление части строки справа от курсора.
Шклавиши работы с блоками текста
|Жермином «блок» обозначается особым образом выделенный фрагмент текста, экране он имеет цвета символов и фона, отличные от остальной части текста.
КВлок может иметь любую величину, начиная от одного символа и кончая всем тек-Блок можно выделить следующими способами:
Кд* использованием комбинаций клавиш Shift+<-, Shift+->, Shift+T, Shift+J< 1&|В с помощью клавиш Ctrl+K, затем В, помечающей начало блока, и Ctrl+K, затем К, К помечающей его конец.
. Следует иметь в виду, что выделение в тексте нового блока отменяет предыду-Шее выделение.
При выполнении ряда команд этой группы используется промежуточный бу-фер обмена (Clipboard, иногда называемый «карман»), в который помещаются и из которого выбираются фрагменты текста. Промежуточный буфер удобно использовать для переноса фрагментов текста из одного файла в другой.
Перечислим клавиши этой группы,
	Ctrl+Ins — скопировать блок в промежуточный буфер.
	Shift+Del — перенести блок в промежуточный буфер (при этом блок удаляется из текста).
	Shift+Ins — перенести блок из промежуточного буфера и разместить в тексте, начиная с позиции, помеченной курсором.
Отладка и тестирование 310
* Ctrl+K, затем С — блок копируется в место расположения курсора в окне редактирования,
u Ctrl+K, затем V — блок перемещается в место расположения курсора в окне редактирования.
* Ctrl+K, затем Y, или Ctrl+Del — удалить блок.
к Ctrl+K, затем Н — снять-восстановить выделение блока на экране.
» Ctrl+K, затем I — сдвинуть блок вправо на одну позицию.
» Ctrl+K, затем U — сдвинуть блок влево на одну позицию.
о Ctrl+K, затем Р — напечатать блок на принтере.
Прочие клавиши
В эту группу включены комбинации клавиш, связанные с чтением и сохранением редактируемого файла, входом в основное меню и выходом из среды,
» F10 — войти в основное меню.
« F3 — загрузить файл для редактирования. Это же действие можно выполнить, выбрав в меню File команду Open. При этом на экране появится окно диалога, в котором можно выбрать (или задать) имя требуемого файла. В меню File имеется команда New. Выбрав эту команду, вы откроете пустое окно редактирования для ввода текста новой программы. Первоначально файлу с текстом этой программы присваивается имя NONAMEXX, где XX — порядковый номер файла. Это имя можно изменить при записи файла на диск.
« F2 — сохранить файл на диске. Это же действие можно выполнить, выбрав команду Save в меню File. По этой команде текст сохраняется в файле на диске. Окно редактирования остается активным, что позволяет продолжить работу с текстом.
ft Alt+X — выход из среды Turbo Pascal. То же можно сделать выбором команды Exit в меню File.
Отладка и тестирование
Тестирование — один из наиболее трудоемких этапов создания программ. Если ваша программа выдала правдоподобный результат, то это еще не значит, что сама по себе она является правильной. Вполне возможно, что при повторном запуске с новым набором исходных данных вас постигнет разочарование.
Дадим некоторые практические рекомендации, касающиеся отладки и тестирования.
Одним из способов тестирования является тестирование по данным или тестирование с управлением т> входу-выходу. В этом случае знания о внутренней структуре программы нс учитываются, тестовые данные используются лишь в соответствии со спецификацией программы. При таком подходе для полного тестирования пришлось бы перебрать все возможные наборы входных данных, что, как правило, недостижимо из-за большого количества вариантов. Однако очень часто использование при прогонг даже ограниченного числа вариантов исходных
310 Приложение 3. Интегрированная инструментальная среда Тит bo Pascal
данных «открывает глаза» на явно неверное в некоторых случаях поведение про граммы.
Другой способ тестирования — это тестирование, управляемое логикой программы. Оно позволяет исследовать внутреннюю структуру программы. При таком тс стировании можно поступать по-разному. Представляется полезным ответить на вопросы, которые позволяют выявить специфические для языка программирован МИЯ Паскаль ошибки. Разумеется, каждый программист вправе пополнять для себя подобный список по мере накопления опыта.
Ошибки обращения к данным
• Существуют ли в программе обращения к переменным, которым не присвоены значения?
Ц Если в программе используются массивы, то не выходят ли значения соответ-„ ствующих индексов за границы, определенные при описании массива?
Проверьте корректность обращения к памяти с помощью указателей, если такие обращения используются.
Например, следует избегать ситуации, когда указатель существует дольше, чем „ Память, к которой производится обращение. Такое может произойти, если указа-) Мдь задает локальную переменную в теле процедуры, его значение присваивается -ЛЙбо глобальной переменной, либо выходному параметру, а память при выходе f'*3 Процедуры освобождается.
['Ошибки вычисления
Не используются ли при некоторых вычислениях недопустимые типы дан-К...ных?
$4 Не может ли возникнуть переполнение или потеря значимости во время вы-j числения выражения?
И Не может ли делитель в операторе оказаться равным нулю?
# • Может ли значение переменной выходить за пределы установленного для нее диапазона?
	Правильно ли используются приоритеты операций для записи выражения?
Ошибки при сравнении
	Нет ли в программе бесконечных циклов? Типичные ситуации:
□	неверно сформулированное условие цикла (следует всегда помнить, что для цикла с предусловием while формулируется условие его выполнения, а для цикла с постусловием repeat формулируется условие его прекращения);
□	постоянное значение переменной цикла (циклы типа while, repeat).
ж Нет ли в программе циклов, которые никогда нс будут выполняться?
• Правильно ли расставлены операторные скобки begi п и end? Ошибка в их расстановке может нарушить логику программы.
Отладка и тестиромни* «i г~
Ошибки интерфейса
Правильно ли заданы аргументы при вызове встроенных функций?
ш Не портит ли подпрограмма некоторые параметры и глобальные переменные, которые должны использоваться только как входные величины?
Исправление ошибок
' При обнаружении ошибки в программе начинается процесс, отладки.
Прежде всего ошибку необходимо локализовать. Для этого, в первую очередь, > следует сделать предположение о характере ошибки и уже исходя из этого при-' ни мать меры. Например, предполагая ошибку интерфейса, следует при входе в [• процедуры и функции распечатать их имя и значения всех фактических параметров, которые передаются по значению, а при выходе из процедуры или функции — ‘ значения фактических параметров-переменных, а также глобальных переменных. При ошибках передачи управления полезно напечатать сообщения о прохожде-: ним тех участков программы, управление на которые передается при любых на-j чальных данных. Можно завести счетчики, которые позволяют контролировать г прохождение различных ветвей программы, и т. д. Если происходит выход за гра-1. ।шцу индекса (а это наиболее распространенная ошибка), то следует обратить вни-J мание на используемые в программе массивы и в циклах, где происходит их обра-I ботка, поставить вывод на печать значений индексов в тех местах, где имеет место f изменение индекса. При обнаружении места ошибки следует внимательно изучить । условие цикла — весьма вероя пю, что некорректная формулировка послужила при-I чиной данной ошибки.
1	Существуют стандарт ы с j i рограммы-отладч и ки. Он и существенно облегчают
: пользо нател ю поиск и локал i г tai uno ошибок.
Использование отладчика
Существует два основных типа программных ошибок:
ft ошибки времени компиляции;
я ошибки времен и в ы п ол нения,
Синтаксические ошибки легко устранимы, поскольку Turbo Pascal выдает полный их перечень с указанием местоположения в программе. Процесс компиляции нс будет завер шен до поли oi i л 11 к в идации ошибок такого сорта. ;.
Ошибки времени выполнения (семантические ошибки) устраняются ле так легко, поскольку их не всегда просто локализовать и понять причину возникновения. Особенно незаметны и трут i ы для прослеживания логические ошибки и ошибки, связанные с взаимодсйс гинем модулей одной большой программы. В этой ситуации было бы удобно останавливать программу по достижении определенного места, чтобы проследить, как опа проработала данный набор операторов, пронаблюдать значения некоторых переменных и выражений, может быть, попытаться изменить их значения и ное moi реп» па реакцию программы.
Интегрированный отладчик Turbo Pascal имеет все упомянутые возможности (и не только). Он представ, иге г собой встроенную часть интегрированной усовершенствованной среды Turbo Pascal.
318 Приложение Э> Интегрированная инструментальная среда Tur bo Paeoal
При отладке программы очень часто возникает потребность просмотра значе-ния некоторых используемых переменных на определенной стадии выполнения программы. Традиционно для решения данной проблемы применялась отладочная печать. Однако отладчик позволяет делать это гораздо проще: достаточно воспользоваться командой 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. Тем самым появляется возможность выполнить одну строку програм-г мы, затем прерваться и посмотреть на результаты.
При вызове процедуры или функции внутри пользовательской программы можно задать режим выполнения вызова как одного шага или режим трассировки этой процедуры или функции строка за строкой.
При выполнении пошаговой отладки Тurbo Pascal будет иногда переключаться на экран пользователя. Это происходит тогда, когда предусматривается вывод ин-; формации на экран или требуется ввод информации. Затем выполняется возврат в интегрированную среду.
Можно управлять переключением экрана с помощью установок, выполняемых по команде Options ► Debugger ► Display Swapping.
•	Smart. Это режим по умолчанию. Переключение на экран пользователя происходит при вызове программы или в вышеупомянутой ситуации.
•	Always. Переключение на экран пользователя происходит на каждом шаге.
» None. Переключение экранов не происходит. Интегрированная среда остается видимой все время. При выводе информации текст будет отображаться на экране среды.
Кроме того, можно установить экран вывода в отдельном окне с помощью команды Window ► Output.
Построчное выполнение программы может оказаться достаточно неудобным, когда хочется обойти циклы или другие утомительные участки программы. Кроме того, отладку программы бывает удобно начать с определенного места. В этом слу
Отладке и квотирование :
чае можно nociHuibaoiiuTiiCJl клавишей F4 или командой Run ► Go to Cursor. Mo передвинуть курсор на определенную строку программы, а затем указать отла ку на необходимость выполнения программы до достижения этой строки.
Для проверки значений переменных, структур данных и выражений в инте тивном режиме пользователь может вызвать окно Evaluate, используя клав: Ctrl+F4 или команду Debug ► Evaluate ► Modify.
Используя окно Evaluate, можно изменить значение любой переменной, вг чая строки, указатели, элементы массива и поля записей. Это обеспечит про< механизм для проверки, как программа реагирует на определенную установку чений и условий.
С помощью команды Debug ► Breakpoints можно пометить строки в польз тельской программе как точки прерывания. Когда в процессе выполнения nporj : мы достигается точка прерывания, выполнение программы останавливает, i отображается исходный текст. Курсор при этом оказывается на строке с то1 ! прерывания. После этого можно проверить значения переменных, начать тра ; ровку или выполнить программу до другой точки прерывания. Можно в лк  точке прервать выполнение программы, нажав клавиши Ctrl+Break. Произо) ' остановка в следующей строке исходной программы, как если бы в этой ст] 1 была установлена точка прерывания.
' Точки прерывания являются важным инструментом отладки. Точка npepj 1 ния подобна знаку остановки, введенному в программу пользователя. Когда ] I грамма встречает такую точку, она останавливает свое выполнение и ждет д t нейших отладочных инструкций. Пользователь может иметь до 16 активных т( i прерывания.
После задания точек прерывания можно начать выполнение программы с | мощью команды Run ► Run (Ctrl+F9). Сначала программа будет выполняться j  мально, но, когда встретится точка прерывания, остановится. При этом если I кие нибудь переменные ил и выражения были добавлены в окно Watch, то они т ' выводятся на экран с соответствующими значениями.
 Затем пользователь может использовать любой режим отладки:
* можно осуществлять пошаговое выполнение программы, используя кома Run ► Trace Into, Step Over, Go to Cursor (F7, F8, F4);
» можно проверить или изменить значения переменных;
' » можно добавить или удалить выражения из окна Watch;
» можно назначить или удалить точки прерывания;
« можно просмотреть выходные результаты программы, используя команду dews ► User Screen (ALt+F5);
» можно перезапустить программу сначала (Run > Program Reset и затем комг пошагового выполнения);
« можно продолжить выполнение до следующей точ ки прерывания или до кс программы, выполнив команду Run ► Run (Ctrl+F9).
Для удаления точки прерывания необходимо переместить курсор на дан строку и выполнить команду Debug ► Toggle Breakpoint (Ctrl+F8) еще раз. Эта кот да включает или отключает точку прерывания в строке.
320 Приложение 3. Инт«гриромнная инструментальная средн Tur bo Patcal
ПРИМЕЧАНИЕ Следует заметить, что основным элементом н отладчике является строка. Если на одной строке имеется несколько операторов, они будут выполняться вместе при нажатии клавиши F7. Однако, если один оператор размещен на нескольких строках, то яри нажатии клавиши F7 будет выполняться весь оператор. Все команды выполнения, включая команды пошаговой отладки и работы с точками прерывания, основываются на строках. Выполняемая строка всегда помечена курсором выполнения.
Пользователь может быстро находить объявления процедур или функций, даже если программа разбита на несколько модулей: для этого используется команда Starch > Find ► Procedure. Во время трассировки можно быстро вернуться обратно ИЗ вызовов процедур или функций и проверить параметры каждого вызова — с помощью команды Window ► Call > Stack.
Если в процессе отладки программы возникает необходимость начать все сна Чала, то нужно выбрать команду Program reset в меню Run. Система отладки повтор-ЦО инициализируется, и команда следующего шага вернет пользователя к первой Строке главной программы. При этом производится закрытие всех файлов, которые были открыты программой, очистка стека всех вложенных программ, освобождение всего использованного пространства кучи.
Turbo Pascal предлагает перезапуск программы, если пользователь произвел
-либо изменения в программе во время отладки. Например, если изменена ть программы, азатем пользователь выбирает любую команду выполнения (F7, Ctrl+F9 и т. д.), на экране появится сообщение «Исходный модуль модифици-повторить сборку? Д/Н»:
Source modified, rebuild? (Y/N>
Если пользователь ответит «У», Turbo Pascal перекомпилирует программу и ио-|$новит отладку программы сначала. Если ответ — «И», то сеанс отладки продол-Кается дальше (любые изменения в программе, произведенные пользователем, не |удут влиять на ее выполнение до тех пор, пока он не перекомпилирует программу).
Приложение 4
Зарезервированные слова Turbo Pascal 7.0
Слово	Назначение
absolute	Признак переменной, расположенной по определенному адресу
and	Операция логического умножения
array	Тин-массив
asm	Начало блока, написанного на ассемблере
assembler	Подпрограмма, написанная на ассемблере
begin	Начало тела программы, тела подпрограммы или составного оператора
case	Опера тор выбора или описание вариантной части в записи
const	Начало раздела описания констант
constructor	Koj и । ру к гор объекта
destructor	Деструктор объекта
div	Операция целочисленного деления
do	11ача 'к итераторов цикла for и while или оператора with
downto	При так изменения счетчика цикла for на -1
else	Час [ г- «иначе» условного оператора или оператора выбора
end	Koih-ц сила программы, подпрограммы, конец составного от-ра горд, конец оператора выбора, конец описания записи или объекта, конец модуля, конец блока на ассемблере
external	Диргк । и на внешней подпрограммы
far	Днргь гипа формирования «дальнего» адреса
file	Фан 1ИН1>1ЙТИН
for	<hii'pjinp цикла с известным числом повторений
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	Конец цикла с постусловием 		
Зирлзарнн и тайные ОЛфыЛигЬо Рвы ;нГ7. С
Слово	Нмнечвнив
uses	1 !пчало раздела описания используемых модулей
var	Начало раздела описания переменных или описание параметров-переменных
virtual	Директива виртуального метода
while	Начало цикла с предусловием
with	Оператор присоединения
xor	Логическая операция исключающего «ИЛИ»
Приложение 5
Комбинации клавиш быстрого управления в среде Turbo Pascal
Команда (комбинация ?. клавиш)	Назначение
\ Стрелка влево Ctrl+S	Перемещение курсора на одну позицию влево
f Стрелка вправо Ctrl+D i farrti  	 • — -	Перемещение курсора на одну позицию вправо
J Ctrl+стрсл ка влево ;i"". Ctrl+A	Перемещение курсора на первый символ слова, находящегося слева от текущей позиции курсора, или, в случае отсутствия такого слова, па конец предыдущей строки
и * Ctrl+стрелка вправо j Ctrl+F	Перемещение курсора на первый символ слова, находящеюся справа от текущей позиции курсора, или, в случае отсутствия такого слова, на конец строки
Стрелка вверх i Ctrl+E	Перемещение курсора на одну строку вверх
1 Стрелка вниз i Ctrl+X	Перемещение курсора на одну строку вниз
Ctrl+W	Перемещение экрана на одну строку вверх (если такая строка существует)
Ctrl+Z	Перемещение экрана на одну строку вн из (если такая строка существует)
PgUp	Перемещение экрана на одну страницу вверх (если эта страница существует)
PgDn	Перемещение экрана на одну страницу вниз (если эта страница существует)
Home Ctrl+QS	Перемещение курсора в первую позицию текущей строки
RWWwWIeUlW КЛОППЫ UIHtrpvt U ynjmwiwrwwr 1 ир«ци  uruu , ш
Команда (комбинация' клавиш)	Назначение
end Ctrl+QD	Перемещение курсора в конец текущей строки
Ctrl+Home Ctd+QE	Перемещение курсора на первую строку окна
Ctrl+end Ctrl+QX	Перемещение курсора на последнюю строку окна
Ctrl+PgUp CtrkQR	Перемещение курсора на начало текста
Ctrl+PgDn Ctrl+QC	Перемещение курсора на конец текста
Ctrl+QB	Перемещение курсора на начало выделенного блока
Ctrl+QK	Перемещение курсора на конец выделенного блока
Ctrl+QP	Возврат курсора на предыдущую позицию
Ctrl+QW	Перемещение курсора в место обнаружения последней ошибки и вывод сообщения об ошибке в верхней строке
Ctrl+Kn	Установить маркер с номером п в текущей позиции курсора
Ctrl+Qn	Перемещение курсора в позицию, помеченную маркером с номером п
Ctrl+QF	Поиск фрагмента текста
Ctrl+QA	Поиск и замена фрагмента текста
Ctrl+QL	Повтор поиска фрагмента текста
Ctrl+Q[	Поиск парной скобки для скобки вида: ( I { < ” ’ > 1J ) вперед по тексту
Ctrl+Q|	Поиск парной скобки для скобки вида: ([{<”’> И ) назад по тексту
Ins Ctrl+V	Изменение режима вставки. Возможны два режима: 1) добавляемые символы помещаются в место текущего положения курсора, уже имеющиеся символы сдвигаются; 2) добавляемые символы помещаются в место текущего положения курсора, уже имеющиеся символы заменяются на вводимые
Tab Ctrl+I	Поместить знак табуляции (величина табуляции по умолчанию — 8 символов)
Enter	Переход на новую строку
Ctrl+N	Вставка строки
Ctrl+Y	Удаление строки
Ctrl+QO	Поместить в текст программы ключи компиляции, hcj юл ьзусмые по умолчанию
Backspace Ctrl+H	Удаление символа слева от курсора
Del Ctrl+G	Удаление символа в месте текущего положения курсора
Ctrl+T	Удаление слова или части слова, находящегося справа от курсора
продолжение £
.ММ..Ш vo<LiiM и управления п среде Turbo Pascal
Продолжение таблицы
Команда (комбинация клавиш)	Назначение
Ctrl+QY	Удаление части строки от текущего положения курсора до конца строки
Ctrl+KB	Пометить начало выделяемого блока
Ctrl+KK	Пометить конец выделяемого блока
Ctrl+KT	Пометить блок в одно слово, на котором находится курсор
Ctrl+Ins	Скопировать помеченный блок в буфер обмена (Clipboard)	[
Shift+Del	Перенести помеченный блок в буфер обмена (Clipboard)
Shift+Ins 		Перенести блок из буфера обмена (Clipboard) в файл и поместить в текущей позиции курсора
i^ftrl+KC	Скопировать помеченный блок в текущую позицию курсора
"ttrl+KV	Перенести помеченный блок в текущую позицию курсора
Ctrl+Del Ctrl+KY	Удаление помеченного блока из файла
Ctri+KH	Погасить (высветить) выделение помеченного блока
j- .Ctri+KW	Сохранить помеченный блок на диске (имя файла запрашивается)
J Ctrl+KR Fctri+KP	Вставить в текст блок из файла на диске (имя файла запрашивается) Вывод помеченного блока на принтер
Fctrl+KI 	 fjttrl+KU	Сдвиг помеченного блока вправо на одну позицию Сдвиг помеченного блока влево на одну позицию
BF1	Вызов контекстной помощи
r 2	Сохранение редактируемого файла на диске
LF3	Открыть существующий файл
0TF4	Выполнить программу до строки, в которой находится курсор
) L F5	Расширение окна до полного экрана
	——n £ JE	Активизация следующего окна Пошаговая трассировка с заходом в подпрограммы
f ТГ	-	-- HF8	Трассировка без захода в подпрограммы
g		Компиляция программы начиная с основного файла
vFlO	Выход в меню
yAIt+Fi	Вывод предыдущего окна помощи
Alt+F3	Закрыть окно
1 Alt+F5	Открыть окно пользователя
A1UF7		Переход к предыдущей строке окна сообщений
КомбИМ*ЦИИ мл лини I быстрого управлении ** сред»TurboPflicol 32г
Команда (комбинация клавиш) Alt+F8	Назначение Переход к следующей строке окна сообщений		
Alt+F9	Компиляция программы из окна редактирования
Alt+FlO	Вызов подменю			
Alt+Backspace	Отмена изменений в текущей строке
Alt+C	Вызов меню Compile
Alt+D	Вызов меню Debug
Ak+E	Вызов меню Edit
Alt+F	Вызов меню File
Alt+H	Вызов меню Help
Ak+o	Вызов меню Options
Alt+R	Вызов меню Run
Alt+S	Вызов меню Search
Alt+T	Вызов мелю Tools
All+W	Вызов меню Window
Alt+X	Выход в операционную систему
Alt+0 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 ifr				Duplicate identifier	Повторное описание идентификатора
?"5	Syntax error	Ошибка в синтаксисе (обнаружен недопустимый символ)
! 6	Error in real constant	Ошибка в вещественной константе
- 7	Error in integer constant	Ошибка в целой констан	тс
	String constant exceeds line	Строковая константа превышает допустимые размеры
м°	Unexpected end of file	Не найден конец файла
	Line too long	Слишком длинная строка
12	type identifier expected	Нс указан тип идентификатора
L 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 bo files	Компонентами файла не могут быть файлы
Некоторые сообщении об ошибках периодо компилиции 329
Ns	Сообщение	Комментарий
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 cxjKctcd	Необходима целая или вещественная константа
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	Необходимы 1'0 или DOWNTO
59	Undefined forward	Неопределенное опережающее описание
60	Too many procedures	Слишком много процедур
61	Invalid typecast	Неверное преобразование типа
62	Division by zero	Деление на ноль
63	Invalid fdc type	Неверный файловый тип
64	Cannot read or write cm mbit's of this type	Невозможно считать или записать переменные этого типа
65	Pointer variabl c t  x pet  u-< 1	Необходима переменная-указатель
66	String variable ex peri rd 		Необходима строковая переменная
продолжение &
330 Приложение б, Некоторые сообщения об ошибках периода компиляции
Продолжение таблицы
NS	Сообщение	Комментарий
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	Метка не находится внутри данного блока
	Label already defined	Повторное определение метки
: 85	<;» expected	Необходима «;>
86	expected	Необходимо *:>
87	«,» expected	Необходима
88	expected	Необходима «(»
Л 89	«)» expected	Необходима «)*
?« до 1 rt	-	«“* expected	Необходимо
pi	<:bs> expected	Необходимо
t82	<[> expected	Необходима «[»
Е 83	«]» expected	Необходима
Е"94	«.s> expected	Необходима «.»
Е 95	о expected	Необходимо «..»
KL Л7	Invalid FOR control variable	Неверный параметр цикла FOR
к..		
|р8	integer variable expected	Необходима переменная целого типа
|Н02	String constant expected	Необходима константа строкового типа
тПоз •4 ri 		integer or real variable expected	Необходима переменная целого или вещественного типа
i -104 			Ordinal variable expected	Необходима переменная порядкового типа
106	Character expression expected	Необходимо выражение символьного типа
112	CASE constant out of range	Константа CASE выходит за допустимые границы
ИЗ	Error in statement	Ошибка в операторе
123	Too many symbols	Слишком много символов
Д24	Statement part too large	Слишком большой раздел операторов
126	File must be var parameters	Файлы должны передаваться как параметры-переменные
Нико г аркит сообщения об ошибках периоды КОМПИЛЯЦИИ ЗЭ Т
№	Сообщение	Комментарий
: 1зз	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.	Абрамов В. Г., Трифонов Н. II., Трифонова Е II. Введение в язык Паскаль. - М.: Наука, 1988.
4.	Бородич 10. С., Вальвачев А. Н„ Кузьмич А. И, Паскаль для персональных компьютеров: Справочное пособие. — Минск: Высшая школа; БФ ГИТМП «Ника», 1991.
5.	Ван ТасселД. Стиль, разработка, эффективность, отладка и испытание программ. — М.: Мир, 1981,
6.	Вирт II. Алгоритмы + структуры данных = программы. — М.: Мир, 1989.
7.	Горбенко О. Д., Попов В. Б., Ускова О. Ф. и др. Региональный стандарт общего среднего образования по информатике. — Воронеж: ВИПКРО, 1995.
8.	Грогоно П. Программирование на языке Паскаль. — М.: Финансы и статистика, 1982.
9.	Джонсон Ж., Харроу К. Решение задач в системе Turbo Pascal. — М.: Финансы и статистика, 1991.
10.	Емелина Е. И. Основы программирования на языке Паскаль. — М.: Финансы и статистика, 1997.
11.	Йодан Э. Структурное программирование и конструирование программ. — М.: Мир, 1987.
12.	Йенсен К, Вирт Н. Паскаль: Руководство для пользователя и описание языка. — М.: Финансы и статистика, 1982.
13.	Касьянов В. Н., Сабелъфелъд В. К. Сборник заданий по практикуму на ЭВМ. М.: Наука, 1986.
14.	Мейер Д., Бодуэн К Методы программирования: В 2 т. — М.: Мир, 1985,
15.	Немпюгин С. A. Turbo Pascal. Учебник. — СПб.: Питер, 2002.
16,	Иемнюгин С. A. Turbo Pascal. Практикум. — СПб.: Питер, 2002.
17.	Немнюгин С. А., ПерколабЛ. В. Изучаем Turbo Pascal. — СПб.: Питер, 2002.
i I PIivpn rypnSJW*
18.	Пильщиков 8. И. Сборник упражнений по языку Паск.ыь. — М.: Наука, 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.
WWW. PITER. COM
КНИЖНОГО БИЗНЕСА!
ПРЕДСТАВИТЕЛЬСТВА ИЗДАТЕЛЬСКОГО ДОМА «ПИТЕР» предлагают эксклюзивный ассортимент компьютерной, медицинской, психологической, экономической и популярной литературы
РОССИЯ
Москва
Представительство издательства «Питер»
М. «Калужская», ул. Бутлерова, д. 176, офис 207,
Тел./факс (095) 777-54-67
E*mail: sales@piter.msk.ru
Санкт-Петербург
Представительство издательства «Питер» М. «Выборгская», Б. Сампсониевский лр„ д. 29а Тел. (812) 103-73-73, факс (812) 103-73-82
E-mail: sales@piter.com
Воронеж
Представительство издательства «Питер»
Ул. Ленинградская, д. 138
Т1Л. (0732) 49 68 86
E-mail: piter-vm@vmail.nj
Екатеринбург
Представительство издательства «Питер 240 Ул. Завокзальная, д. 4а, склад 10а
Тел.(3432) 33-96-40
E-mail: piter-ural@r66.ru
Нижний Новгород
Представительство издательства «Питер
Ул. Премудрова, д. 31а
Тел. (8312) 58-50-15, 58-50-25
E-mail: piter@infonet.nnov.ru
Ростов-на-Дону
Представительство издательства «Питер!
Ул. Калитвинская, д. 17в
Тел. (8632) 95-36-31, (8632) 95-36-32
E-mail: jupiter@rost.ru
УКРАИНА
Харьков
^ Представительство издательства «Питер»
Уд. Энгельса, д. 29а, офис 610
ГШ. (0572) 23-75-63, (0572) 28-20-04, ИЙ572) 28-20-05, факс (0572) 14-96-09 r<-mail: piter@tender.kharkov.ua
Беларусь
гМинск
К Представительство издательства «Питер»
ЕУл. Бобруйская д., 21, оф. 3 ^Тм/факс (37517) 226-19-53
E-mail: piterbel@tut.by
Киев
Представительство издательства «Питер»
Пр. Красных казаков, д. 6, корп. 1
Тел./факс (044) 490-35-68,490-35-69
E-mail: office@piter-press.kiev.ua
МОЛДОВА
Кишинев
«Ауратил-Питер*
Ул. Митрополит Варлаам, 65, офис 345
Тел. (3732) 22-69-52, факс (3732) 27-24-82
E-mail: lili@auratip.mldnet.com
Ищем зарубежных партнеров или посредников, имеющих выход на зарубежный рынок.
Телефон для связи: (812) 103-73-73.
E-mail: grigorjan@piter.com
Редакции компьютерной, психологической, экономической, юридической, медицинской, учебной и популярной (оздоровительной и психологической) литературы Издательского дома «Питер» приглашают к сотрудничеству авторов.
Обращайтесь по телефонам. Санкт-Петербург — тел.: (812) 103-73-72, Москва - тел.: (095) 234-38-15, 777-54-67.

WWW.PITER.COM
кпипгиадд । «лмжиго динипнт ИI ВЫ МОЖГГ1ПРИ0ВР1СТИ ОПТОМ И В РОЗНИЦУ
У НАШИХ РЕГИОНАЛЬНЫХ ПАРТНЕР
1
^Башкортостан
ИМ Азия», ул, Зенцова, д. 70 (оптовая продажа), маг! «Оазис*, ул, Чернышевского, д, 8В, Й.Ыкс (3472) 50-39-00.
lllasiaufa@tifanet. ru
|^аий Восток
Jnajpitf осток, «Приморский торговый дом книги», гел|Ыкс (4232)23-82-12.
f-mail: bookbase@mail.primoryo.ru
(ябаровск, «Мирс»,
Бел. (4212) 30-54-47, факс 22-73-30.
fe-miil: sale book@bookmirs.khv.ru
[(Хабаровск, «Книжный мир», pei. (4212) 32-85-51, факс 32-82-50.
! E-fitil: postmaster@worldbooks.kht. ru
) । i
Европейские регионы России
Архангельск, «Дом книги», тел. (8182) 65-41-34, факс 65-41 -34.
)E-rnail: book@atnet.ru
р&лмнинград, «Вестер», /тел./факс (0112) 21 -56-28, 21 -62-07.
' E-mail: nshibkova@vester.ru
http://www.vester.ru
Ростов-на-Дону, ПБОЮЛ Остроменский, пр. Соколова, д. 73, тел./факс (8632) 32-18-20.
E-mail: ostrom@don,sitek.net
Северный Кавказ
Ессентуки, «Россы», ул. Октябрьская, 424, тел./факс (87934) 6-93-09.
E-mail: rcssy@kmw.ru
Сибирь
Иркутск, «ПродаЛитЪ», тел. (3952) 59-13-70, факс 51-30-70.
E-mail: prodalit@irk.ru http://www.prodalit.irk. ru
Иркутск, «Антей-книга», тел./факс (3952) 33-42-47.
E-mail: antey@irk.ru
Красноярск, «Книжный мир», тел./факс (3912) 27-39-71.
E-mail: book-world@publlc.krasnet ru
Нижневартовск, «Дом книги*, тел. (3466) 23-27-14, факс 23-59-50.
E-mail: book@nvartovsk.wsnet.ru
Новосибирск, «Топ-книга», тел. (3832) 36-10-26, факс 36-10-27.
E-mail: oftice@top-kniga.ru http://www.top-kniga.ru
Тюмень, «Друг», тел./факс (3452) 21-34-82.
E-mail: drug@tyumen.ru
Тюмень, «Фолиант», тел. (3452) 27-36-06, факс 27-36-11.
E-mail: foliant@tyumen.ru
Челябинск, ТД «Эврика», ул. Барбюса, д. 61, тел./факс (3512) 52-49-23.
E-mail :evrika@chel.sumetru
Татарстан
Казань, «Таис», тел. (8432) 72-34-55, факс72-27-82.
E-mail: tais@bancorp.ru
Урал
Екатеринбург, магазин № 14, ул. Челюскинцев, д. 23, тел ./факс (3432) 53-24-90.
E-mail: gvardia@mail.ur.ru
Екатеринбург, «Валео-книга», ул. Ключевская, д. 5, телефакс (3432) 42-56-00.
E-mail: valeo@etel.ru
Ускова Ольга Федоровна, Бакланов Михаил Владимирович, Воронина Ирина Евгеньевна, Горбенко Олег Данилович, Вощинская Гильда Эдгаровна, Огаркова Наталья Владимировна, Мельников Вадим Митрофанович
Программирование на языке Паскаль: задачник
Главный редактор £. Строганова Заведующий редакцией И. Корнеев Руководитель проекта Ю. Суркис Литературный редактор А. Жданов Корректоры Н. Лукина, И. Келле-Пелле Верстка А. Дорошенко
Лицензия ИД № 05784 от 07-09,0J.
Подписано в печать 05.12.02. Формат 70x1007^. Усл. п. л. 27,09. Доп. тираж 4500 экз. Заказ № 1900.
ООО «Питер Принт». 196] 05, Санкт-Петербург, ул. Благодатная, д. 67в.
Налоговая льгота - общероссийский классификатор продукции ОК 005-93, том 2; 953005 - литература учебная.
Отпечатано с фотоформ в ФГУП «Печатный двор» им. А. М. Горького Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 197110, Санкт-Петербург, Чкаловский пр., 15.
Под редакцией
О. Ф. Усковой
Темы, рассмотренные в книге:
Программирование
* теоретические вопросы для повторения пройденного материала
" '**' Паскаль
практические упражнения и задачи различной степени сложности
ЗАДАЧНИК
• задания
для самостоятельной работы
Базовый курс для студентов высших учебных заведений, изучающих язык Паскаль.
Эта книга представляет собой не просто задачник с набором примеров и упражнений различной степени сложности. Основные цели предлагаемого учебного пособия — придать курсу программирования научно обоснованный базис, сформировать на его основе определенную культуру разработки программ, структурировать соответствующим образом учебный процесс. Авторы постарались большую часть практических заданий посвятить не столько синтаксическим особенностям языка, сколько методам программирования, технологии проектирования алгоритмов и разработки программных систем. Книга предназначена студентам и преподавателям вузов, а также всем, кто хотел бы научиться программировать на языке Паскаль.
• рекомендации по разработке программ на языке Паскаль
задачи, предлагавшиеся на олимпиадах прошлых лет по информатике
• описание
интегрированной инструментальной среды Turbo Pascal
• сообщения об ошибках компилятора
С&ППТЕР
WWW.PITER.COM
Посетите наш web магазин: http: www.piter.com