Текст
                    Под редакцией
О. Ф. Усковой
'П№	@
Программирование
" паскаль
ЗАДАЧНИК
• для студентов и преподавателей
высших учебных заведений
• теоретические вопросы,
упражнения и задачи, задания
для самостоятельной работы
проектирование алгоритмов
и разработка программных
систем
•ОЙ

СЕРИЯ С^ППТЕР
Под редакцией О. Ф. Усковой Программирование .. .эЫИ паскаль Допущено Министерством образования Российской Федерации в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению подготовки бакалавров и магистров «Информатика и вычислительная техника» и по направлениям подготовки дипломированных специалистов «Информатика и вычислительная техника» и «Информационные системы» С^ППТЕР Москва • Санкт-Петербург - Нижний Новгород * Воронеж Ростов-на-Дону * Екатеринбург * Самара Киев - Харьков * Минск 2005
ББК 32.973-018я 7 УДК 681.3.06(075) П78 Рецензенты: Львович Я. Е., профессор, доктор технических наук, начальник Главного управления образования Администрации Воронежской области, заслуженный деятель науки РФ Сидоркин А. С., профессор, доктор физико-математических наук, проректор по научной работе Воронежского госуниверситета Денисова А. Л., профессор, доктор педагогических наук, зав. кафедрой Тамбовского государственного технического университета П78 Программирование на языке Паскаль: задачник / под ред. Усковой О. Ф. — СПб.: Питер, 2005. — 336 с.: ил. ISBN 5-318-00553-5 Эта книга представляет собой не просто задачник с набором примеров и упражнений различной степени сложности. Основные цели предлагаемого учебного пособия — придать курсу программирования научно обоснованный базис, сформировать на его основе определенную культуру проектирования и разработки программ, структурировать соответствующим образом учебный процесс. Авторы старались большую часть практических заданий посвящать не столько синтаксическим особенностям языка программирования, сколько методам программирования, технологии проектирования алгоритмов и разработки программных систем. Книга предназначена студентам и преподавателям вузов, а также всем, кто хотел бы научиться программировать на языке Паскаль. ББК 32.973-018я7 УДК 681.3.06(075) ISBN 5-318-00553-5 © ЗАО Издательский дом «Питер», 2005
Краткое содержание Введение .................................................. 13 Рекомендации читателю.......................................15 Глава 1. Числовые типы данных..............................19 Глава 2. Оператор присваивания, ввод и вывод информации....24 Глава 3. Логический тип....................................31 Глава 4. Условный оператор.................................35 Глава 5. Операторы цикла...................................40 Глава 6. Литерный тип......................................55 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта.58 Глава 8. Регулярные типы данных............................69 Глава 9. Процедуры и функции...............................94 Глава 10. Рекурсивные подпрограммы....................... 108 •Глава 11. Строковый тип.................................. 116 Глава 12. Записи, оператор присоединения................. 121 Глава 13. Множества...................................... 135 Глава 14. Файлы...........................................145 Глава 15. Динамические структуры данных.................. 158 Приложение 1. Ответы и решения............................ 169 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет.................................280
Приложение 3. Интегрированная инструментальная среда Turbo Pascal (Borland International).......................311 Приложение 4. Зарезервированные слова Turbo Pascal 7.0.321 Приложение 5. Комбинации клавиш быстрого управления в среде Turbo Pascal.......................................324 Приложение 6. Некоторые сообщения об ошибках периода компиляции.........................................328 Литература..................................................332
Содержание Введение...............................................13 Структура книги........................................13 От издательства........................................14 Рекомендации читателю................................. 15 Вы получили задачу.................................... 15 Решение задачи........................................ 16 Чтобы программа была наглядной........................ 17 Глава 1. Числовые типы данных..........................19 Теоретические вопросы..................................19 Упражнения.............................................21 Глава 2. Оператор присваивания, вводи вывод информации...........,....................24 Теоретические вопросы..................................24 Упражнения, задачи, линейные программы .................26 Задания для самостоятельной работы.....................28 Глава 3. Логический тип................................31 Теоретические вопросы..................................31 Упражнения.............................................32 Линейные программы.....................................33 Глава 4. Условный оператор.............................35 Теоретические вопросы..................................35 Упражнения.............................................35 Задания для самостоятельной работы..................... 38
8 Содержание Глава 5. Операторы цикла.................................. 40 Теоретические вопросы......................................40 Упражнения, задачи, программы............................. 42 Задания для самостоятельной работы.........................50 Глава 6. Литерный тип......................................55 Теоретические вопросы......................................55 Упражнения, задачи, программы..............................56 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта.........................................58 Перечислимый тип...........................................58 Теоретические вопросы............................... 58 Упражнения............................................59 Ограниченный тип...........................................61 Теоретические вопросы.................................61 Упражнения........................................... 61 Оператор варианта..........................................62 Теоретические вопросы.................................62 Упражнения............................................63 Упражнения, задачи, программы..............................65 Глава 8. Регулярные типы данных ...........................69 Теоретические вопросы......................................69 Векторы. Задачи, программы................................ 70 Задания для самостоятельной работы....................80 Матрицы................................................... 82 Задачи, упражнения....................................82 Глава 9. Процедуры и функции...............................94 Теоретические вопросы......................................94 Задачи, программы..........................................95 Задания для самостоятельной работы....................... 105 ГлаваЮ. Рекурсивные подпрограммы..........................108 Теоретические вопросы.................................... 108 Задачи, программы........................................ 108 Задания для самостоятельной работы....................... 111
Содержание 9 Глава 11. Строковый тип....................................116 Теоретические вопросы..................................... 116 Задачи, программы......................................... 117 Глава12. Записи, оператор присоединения....................121 Теоретические вопросы..................................... 121 Задачи, упражнения, программы............................. 122 Глава13. Множества......................................... 135 Теоретические вопросы..................................... 135 Упражнения, задачи, программы............................. 136 Задания для самостоятельной работы........................ 142 Глава14. Файлы.............................................145 Теоретические вопросы..................................... 145 Упражнения, задачи, программы............................. 146 Задания для самостоятельной работы........................ 154 Описание файлов....................................... 154 Варианты заданий...................................... 155 Глава15. Динамические структуры данных.....................158 Теоретические вопросы..................................... 158 Задачи, решения........................................... 159 Списки............................................... 159 Двоичное дерево...................................... 163 Дерево двоичного поиска............................... 164 Очередь.............................................. 164 Стек................................................. 165 Задания для самостоятельной работы........................ 167 Приложение 1. Ответы и решения ............................169 Глава 1. Числовые типы данных............................. 169 Упражнения........................................... 169 Глава 2. Оператор присваивания, ввод и вывод информации... 170 Упражнения, задачи, линейные программы............... 170
10 Содержание Глава 3. Логический тип.................................... 171 Упражнения............................................ 171 Линейные программы.................................... 172 Глава 4. Условный оператор................................. 173 Упражнения............................................ 173 Глава 5. Операторы цикла................................... 175 Упражнения, задачи, программы......................... 175 Глава 6. Литерный тип...................................... 184 Упражнения, задачи, программы .:...................... 184 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта. 188 Перечислимый тип. Упражнения.......................... 188 Оператор варианта. Упражнения......................... 188 Упражнения, задачи, программы......................... 191 Глава 8. Регулярные типы данных..........................:..... 192 Векторы. Задачи, программы............................ 192 Матрицы. Задачи, упражнения............................201 Глава 9. Процедуры и функции................................208 Задачи, программы......................................208 Глава 10. Рекурсивные подпрограммы..........................216 Задачи, программы................................... 216 лава 11. Строковый тип......................................218 Задачи, программы.................................... 218 Глава 12. Записи, оператор присоединения....................224 Задачи, упражнения, программы..........................224 Глава 13. Множества........................................ 232 Упражнения, задачи, программы..........................232 Глава 14. Файлы.............................................244 Упражнения, задачи, программы........................ 244 Глава 15. Динамические структуры данных.....................255 Списки. Задачи, решения............................... 255 Двоичное дерево. Задачи, решения.......................264 Дерево двоичного поиска. Задачи, решения...............265 Очередь. Задачи, решения.............................. 267 Стек. Задачи, решения..................................271 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет..................................280 Задачи для самостоятельного решения.........................280 Задача 1. «Абракадабра»................................280
Задача 2. «Divide et impkra!»...........................281 Задача 3. «Два конвейера».............................. 281 Задача 4. «Антивирус»...................................282 Задача 5. «Новые гвозди»................................283 Задача 6. «Телефонная связь»............................284 Задача 7. «Функция».................................... 284 Задача 8. «Считалка»....................................284 Задача 9. «Многоугольник»...............................285 Задача 10. «Метеостанции»...............................285 Задача 11. «Скобки».....................................286 Задача 12. «Криптограмма».............................. 286 Задача 13. «Зоны».......................................287 Задача 14. «Лист бумаги»................................288 Задача 15. «Система счисления»..........................288 Задача 16. «Электрическая цепь».........................289 Задача 17. «Точки»......................................290 Задача 18. «Выражение»..................................290 Задачи с комментариями и решениями...........................291 Задача 1. «Монеты»......................................291 Задача 2. «Функция».....................................293 Задача 3. «Лабиринт»....................................294 Задача 4. «Прямоугольники»..............................301 Задача 5. «Трубопровод».................................303 Задача 6. «Телебашня»...................................306 Приложение 3. Интегрированная инструментальная среда Turbo Pascal (Borland International)........................311 Экранный редактор............................................312 Клавиши перемещения курсора.............................313 Клавиши поиска фрагментов...............................313 Клавиши вставки и удаления информации...................314 Клавиши работы с блоками текста.........................314 Прочие клавиши..........................................315 Отладка и тестирование.......................................315 Ошибки обращения к данным...............................316 Ошибки вычисления.......................................316 Ошибки при сравнении....................................316
12 Содержание Ошибки интерфейса................................317 Исправление ошибок...............................317 Использование отладчика..........................317 Приложение 4. Зарезервированные слова Turbo Pascal 7.0.................................. 321 Приложение 5. Комбинации клавиш быстрого управления в среде Turbo Pascal................................324 Приложение 6. Некоторые сообщения об ошибках периода компиляции...................................328 Литература......................................... 332
Введение Развитие и широкое распространение информационных технологий, основанных на применении компьютеров, сопровождается изданием весьма значительного числа учебных и методических пособий по различным направлениям информаци- онных и коммуникационных технологий, а также отдельным приложениям. Про- граммирование, как особый род деятельности человека, по-прежнему остается важ- нейшей составляющей в подготовке высококвалифицированных специалистов в сфере компьютерных наук. Выработка определенного стиля профессионального проектирования и разработки программной системы базируется на ряде основопо- лагающих принципов, сформулированных в работах Э. Дейкстры, Н. Вирта и других авторов. В разные исторические периоды на основе этих принципов формирова- лись соответствующие парадигмы программирования. Дать курсу программиро- вания научно обоснованный базис, сформировать на его основе определенную куль- туру проектирования и разработки программ, структурировать соответствующим образом учебный процесс — таковы основные цели предлагаемого учебного посо- бия. Авторы старались большую часть практических заданий посвящать не столько синтаксическим особенностям языка программирования, сколько методам про- граммирования, технологии проектирования алгоритмов и разработки программ- ных систем. В этом аспекте предлагаемая книга существенно отличается от всех практических пособий по программированию, изданных к настоящему времени. Структура книги Книга состоит из пятнадцати глав. Каждая глава начинается с раздела, содержащего теоретические вопросы. Если вы затрудняетесь ответить на них, мы рекомендуем обратиться к любому справоч- ному или учебному пособию по программированию на языке Паскаль. Далее следует раздел, в котором приведены упражнения и задачи. Некоторые задачи сопровождаются программами на языке Паскаль. Мы рекомендуем не спе- шить заглядывать в решение, а попытаться сначала самостоятельно составить про- грамму и только после этого сравнить ее с приведенной в книге. Все задачи и упраж- нения, кроме тех, для которых даны решения, помечены специальными символами, идентифицирующими уровень сложности: — легкие задачи; ♦ — задачи средней сложности; * — сложные задачи.
14 Введение Последний раздел каждой главы содержит задания для самостоятельной рабо- ты, которые необходимо выполнить на компьютере. Ответы на задачи вы найдете в первом из приложений, приведенных в конце книги. В других приложениях приводятся примеры задач, предлагавшихся на раз- нообразных олимпиадах по информатике (для некоторых задач приведены реше- ния-программы победителей олимпиад), описание интегрированной инструмен- тальной среды Turbo Pascal (Borland International), зарезервированные слова Turbo Pascal 7.0, описание клавиш быстрого вызова в среде Turbo Pascal и сообщения о некоторых ошибках компилятора. От издательства Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! Подробную информацию о наших книгах вы найдете на web-сайте издатель- ства http://www.piter.com.
Рекомендации читателю Вы получили задачу Прежде чем писать программу, уясните себе смысл задачи. Какова цель программы? Какие данные она требует? & Откуда поступают данные? & Какие результаты должна выдавать программа? То есть определите внешние спецификации программы. Не существует какого-то фиксированного набора правил, который можно было бы рекомендовать при разработке программ и выполнение которого обеспечило бы составление правильной программы. Чаще всего люди, создающие програм- мы, стараются представить их в таком виде, который обеспечивал бы наибольшие удобства в модификации программы на этапах тестирования и отладки. Исходя- щая из этого технология программирования направлена на создание удобочитае- мых, высокоэффективных, легко модифицируемых программ и в ряде случаев по- зволяет доказывать правильность их разработки. Когда задача четко понята, можно приступать к составлению проекта програм- мы на алгоритмическом языке или псевдокоде. Проектирование осуществляется как последовательность шагов, направленных на решение задачи. Сначала набрасывается план решения задачи в общем виде. Далее описание составляется более детально. Большие этапы разбиваются на бо- лее мелкие. В ходе этого процесса выделяются относительно независимые части — модули, и дальнейшее уточнение каждого такого модуля может производиться тем же методом пошаговой разработки «сверху вниз». $ На каждом шаге детализации программа должна оставаться структурированной. & Каждый модуль должен быть достаточно простым и обозримым. & Делайте наглядными связи между модулями. & Каждый модуль должен выполнять единственную функцию, но делать это хорошо. $ После того как проект программы готов, переведите ее на язык Паскаль. аз Никаких трюков и заумного программирования — пишите программы просто. S3 Используйте содержательные обозначения. & Сдвигайте строки так, чтобы выделить логическую структуру программы.
16 Рекомендации читателю При разработке алгоритма решения задачи вам могут помочь общие правила решения, сформулированные, например, в одном из лучших руководств по реше- нию задач — книге Пойа «Как решать задачу». Применительно к проектированию программ схема метода Пойа может быть представлена следующим образом. Решение задачи 1. Поймите задачу, для этого: а) изучите данные; Ь) изучите неизвестные; с) определите, достаточно ли данных для решения; d) проверьте, не противоречивы ли они. 2. Составьте план. Обратите внимание на следующие моменты: а) цель решения задачи; Ь) методы проектирования, которые будут использоваться; с) вспомните, встречалась ли вам уже такая задача; d) подумайте, не знаете ли вы близкой задачи, алгоритмом решения которой можно воспользоваться; е) определите, можете ли вы решить более узкую или аналогичную задачу; f) установите, можете ли вы решить часть задачи. 3. Выполните план: а) следуйте своему плану решения задачи; Ь) проверяйте правильность каждого шага. 4. Проанализируйте решение: а) определите, все ли данные вы использовали; Ь) проверьте правильность решения; с) подумайте, можете ли вы воспользоваться полученным результатом или примененным методом при решении других задач; d) проверьте вводимые данные на обоснованность и правдоподобие; е) выведите результаты в удобной для чтения форме; f) помните, что программа должна быть самодокументируемой, то есть каж- дому модулю должно предшествовать словесное описание цели и внешних спецификаций, а комментарии должны пояснять смысл операторов на со- держательном уровне в терминах постановки задачи. Об отладке и тестировании создаваемых программ необходимо помнить, начи- ная с первых шагов разработки алгоритма решения задачи. Поэтому приведем здесь некоторые рекомендации по тестированию программ. £ Перед тестированием программы убедитесь в том, что в тексте программы всем переменным присваиваются значения. Экспериментальное тестирование про- грамм может служить доказательством наличия ошибок, но никогда не дока- жет их отсутствия.
Чтобы программа была наглядной 17 $ Тесты нужно разрабатывать таким образом, чтобы проверить, корректно ли реагирует программа не только на допустимые входные данные, но и на заведомо неправильные. « Тестирование производится согласно общему принципу «сверху вниз». На каж- дом этапе функции модулей более низкого уровня моделируются упрощенными. $ Хорошим считается текст, который имеет высокую вероятность обнаружения ошибки. « Ив заключение приведем еще один практический совет: не исправляйте пло- хую программу — лучше перепишите ее. Чтобы программа была наглядной Остановимся на некоторых деталях написания программы, которые помогут об- легчить дальнейшую работу с ней. 1. При именовании величин идентификаторы следует выбирать так, чтобы они отражали смысловое значение этих величин. В дальнейшей работе это изба- вит автора программы или ее пользователя от необходимости всякий раз на- прягать память для выяснения, что же этот идентификатор обозначает. Вме- сте с тем выбираемое имя не должно быть слишком длинным. 2. Программу следует разумно снабдить комментариями. Прежде всего, тексту программы должен предшествовать комментарий, дающий краткое, но пол- ное описание ее функционального назначения, входных и промежуточных величин и их спецификаций, характеристики алгоритма, фамилии автора и его координат. Комментарии бывают особейно полезными при описании и использовании процедур: краткое описание их действий и характеристика формальных параметров сделают более понятным назначение процедуры. 3. Основой при разработке программы должен служить структурный подход, базирующийся на методе последовательного уточнения действий и на ис- пользовании управляющих структур трех типов: следования, ветвления и по- вторения. На начальных этапах проектирования допускается использование абстрактных операторов, последующая детализация которых приводит к со- зданию процедур. Не следует спешить сразу писать программу в терминах операторов Паскаля: уточнение действий должно быть постепенным. Это важ- но и потому, что на каком-то этапе может обнаружиться ошибка в выборе действия на предыдущем шаге, тогда придется переработать детализацию только этого действия. В противном случае пришлось бы «ворошить», а иног- да просто заново разрабатывать всю программу. Расположение текста программы на экране или на бумаге должно быть та- ким, чтобы подчеркивался структурный характер программы: следует выде- лять, например, отступом от левого края строки те операторы или группы операторов, которые образуют вложенную часть другого составного опера- тора. Например: { пример 1 } while А<0 do begin
18 Рекомендации читателю х:=х+1; УДАЛИТЬ(В.х) end; { пример 2 } if prise and (i<=N) then begin 1 ВКЛЮЧИТЬ(А,1) end else 1:=1+2; Приступая к очередному шагу уточнения действий, следует продумывать сра- зу несколько вариантов алгоритма, во-первых: для того, чтобы выбрать наи- более оптимальный или подходящий; во-вторых, на случай, если придется внести изменения в проект программы на предыдущем шаге детализации. 4. Программы следует писать сразу с защитой от ошибок при вводе. Это дости- гается проверкой вводимого значения, а при ошибочном вводе параметра — запросом повторного ввода. И ввод исходных данных, и вывод результата и промежуточных величин обя- зательно должны сопровождаться печатью пояснительного текстового сооб- щения: при вводе это должен быть запрос, для каких величин требуется зна- чение, при выводе — значения каких величин выводятся. В последнем случае предметом особого внимания должно стать размещение выводимых значе- ний на экране или листе бумаги. Выводимые значения размещаются так, что- бы обеспечивалось наилучшее их восприятие, дабы было понятно, какие из них имеют более важное значение, а какие второстепенное. 5. Набирая программу на клавиатуре терминала ЭВМ, следует иметь в виду, что буквы и символы, имеющие сходные изображения на экране на разных раскладках клавиатуры (например, буквы А в латинской и русской расклад- ках), по-разному представляются в памяти компьютера. В большинстве слу- чаев замена одного символа другим, сходным с ним, приводит в дальней- шем к сообщениям компилятора об ошибках. Обращаем ваше внимание на следующие попарно похожие символы: А-А, В-В, Е-Е, К-К, М-М, 0-0 (цифра ноль изображается с перечеркиванием), Р-Р, С-С, Т-Т, Х-Х. Рекомендуем также для большей наглядности размещать по возможности мень- шее число операторов на одной строке.
Глава 1 Числовые типы данных Теоретические вопросы 1. Существуют ли ограничения на множество целых чисел, используемых в язы- ке? Если да, то чем они определяются? 2. Перечислите основные операции, определенные для данных целочисленно- го типа. 3. Перечислите основные стандартные функции, определенные для данных це- лочисленного типа. Каков тип результата, возвращаемого каждой функцией? 4. Для представления кйкой информации в языке Паскаль используется тип real? 5. В чем отличие двух типов числовых данных real и integer? 6. Какие две формы записи вещественных чисел используются в языке Пас- каль? 7. Поясните понятия диапазона и точности как важных характеристик вещест- венных переменных? 8. Перечислите основные стандартные функции, определенные для данных ве- щественного типа. Каков тип результата, возвращаемого каждой функцией? 9. Что называется мантиссой числа? 10. Что называется порядком числа? И. Какие стандартные тригонометрические функции, реализованные в языке Паскаль, вы знаете? 12. Почему в языке Паскаль аргумент стандартной функции всегда записывается в скобках? 13. Почему знак умножения всегда выписывается явно? 14. Можно ли аргумент стандартной тригонометрической функции задать в гра- дусах? 15. К каким типам числовой информации применимы функции sqr(x) и sqrt(x)? 16. Для какого типа данных определены операции +,-,*,/?
20 Глава 1. Числовые типы данных 17. Назовите две операции, которые определены для данных целого типа, но не определены для данных вещественного типа? 18. Назовите операции отношения, которые применимы к данным вещественного типа. 19. Назовите операции отношения, которые применимы к данным целого типа. 20. Каков приоритет выполнения арифметических операций? 21. К данным какого типа применимы функции trunc(x) и round(х)? 22. Почему запись формул на языке Паскаль линейна? 23. Почему в языке Паскаль факториал от 9 нельзя записать как 9! ? 24. Назовите функцию, которая вычисляет модуль вещественного числах. 25. Какая функция возвращает натуральный логарифм числа х? 26. К каким типам данных применимы арифметические операции di v и mod? 27. Что делает стандартная функция trunc(x)? 28. Каков результат работы стандартной функции round(х)? 29. При каких значениях аргумента стандартные функции trunc(x) и round(x) воз- вращают одинаковый результат? 30. Для каких чисел определены стандартные функции succ(x) и pred(x)? 31. При каком значении аргумента х не определен результат работы функции 1п(х)? 32. Пусть а и b — два вещественных числа, ос и Р — их машинное представление. Верно ли, что а < Р, если а < Ь. Если нет, объясните почему. 33. Чему равен результат вычисления выражения (a div b)*b+(a mod Ь)? 34. Как записать величину основания натурального логарифма, если вы забыли цифры этого числа? 35. Каков результат вычисления выражения s1n(3.141592*х/180)? 36. Может ли пробел входить в число символов, составляющих идентификатор? 37. Приведите пример унарной арифметической операции. 38. Чему равен результат целочисленного деления, если делимое меньше дели- теля? 39. Приведите примеры составных специальных символов. 40. Как называются слова, имеющие фиксированное начертание и раз и навсег- да определенный смысл? 41. Из каких символов может состоять идентификатор? 42. Как называются элементы данных языка, значения которых установлены в описательной части программы и не изменяются в процессе ее выполнения? 43. Можно ли ключевые слова использовать в качестве имен переменных? 44. Как называются величины, которые могут менять свое значение в процессе выполнения программы? 45. Можно ли при записи арифметических выражений на языке Паскаль исполь- зовать фигурные скобки?
Упражнения 21 46. Можно ли при записи арифметических выражений на языке Паскаль исполь- зовать квадратные скобки? 47. Какие функции преобразуют вещественный аргумент в целое число? 48. Что такое «выражение», «операция», «операнд»? 49. Как называется некоторый конечный набор операций (действий, предписа- ний), выполнение которых одна задругой за конечное число шагов приводит к намеченной цели (искомому результату, решению поставленной задачи)? 50. Можно ли при записи идентификаторов использовать буквы русского алфа- вита? Упражнения 1. Ниже приведены два столбца чисел. Подберите из правого столбца соответ- ствующее представление на языке Паскаль для чисел левого столбца. 7,9985 п -1/3 106 -1/10000000 32782,82 <2~ -0,3(3) 6! LXXIV 10 74 1Е6 О.3278282Е5 720 1*2*3*4*5*6 74 7.9985 .-0.3333 -1Е-7 0.1414Е1 1Е1 3.1416 1.4142 2. Запишите на языке Паскаль следующие формулы: -b + ylb2 -4ас а) -------z-------; 2а b) {[(ax-Z>)x + c]x+d}x-e; sin2 (х) — cos2 (х) __^|cosx|+sinx d)
22 Глава 1. Числовые типы данных 0 y}p(j>-а)2(р-ь){р-с)2; 107+Vlg4! ♦ j) + ln(l + e)log2tg2. 3. Запишите на языке Паскаль следующие формулы: a) 21og2-^; b) arcsinx; с) sin 15° cos 15°; d) х4 * * * 8; е) х250; ) ) при x=l. y=-2: 4. Вычислите значение выражений: а) ( sin ( sqr ( х ) - 1 ) + 2*abs ( у ) / cos ( 2 + у b) trunc ( 6.9 ) - trunc ( 6.2 ) - 1: с) round ( 1.9 ) + round ( 1.2 ) + 1; d) trunc ( -1.9 ) + trunc ( -1.9.) + abs ( 3 ); e) round ( 0.5 ) + round ( -0.5 ) + abs ( -3 ): f) 3.1415 - trunc ( 3.1415 ); g) 30 div 6 - 30 mod 5 + succ ( 2 ); h) 3 * 7 div 2 mod 7 / 3 - trunc ( sin ( 1 ) ); i) succ ( round (17 / 4) ) - pred ( 3 ); j) 4 * arctan ( 1 ) - 1 + abs ( -1 ).
Упражнения 23 5. В выражении a/b*c/d*e/f*h расставьте скобки так, чтобы выражению со скобками соответствовала дробь а 6. Определите тип следующих числовых выражений: а) 1 + sqrt ( 4 ) + sin ( 0 ) + 0.0; b) sqr ( 2.0 ) + sqrt ( 121 ) - succ ( -11 ); с) pred ( 32700 ) + round ( 10 / 3 ); d) trunc ( sin ( 0 ) ) + 1; e) succ ( round ( 5 / 2) - pred ( 3 ) ).
Глава 2 Оператор присваивания, ввод и вывод информации Теоретические вопросы 1. Допустимо ли присваивание переменной вещественного типа значения вы- ражения целого типа? 2. Допустимо ли присваивание переменной целого типа значения выражения вещественного типа? 3. Как называются алгоритмы, в которых используется только структура сле- дования? 4. С какого служебного слова начинается программа, написанная на языке Пас- каль? 5. Каким символом заканчивается текст программы? 6. Из каких двух основных частей состоит программа? 7. Какое служебное слово используется для описания раздела констант? 8. Каким служебным словом начинается раздел описания переменных? 9. Чем вызвана необходимость использования комментариев в программе? 10. Где в программе можно написать комментарий? 11. Какими символами ограничивается текст комментария? 12. Какое влияние оказывает комментарий на выполнение программы? 13. Какая часть блока, описательная или исполнительная, является обязатель- ной? 14. Приведите пример самой короткой программы. 15. Верно ли, что в программе, на языке Паскаль надо описывать все используе- мые переменные? 16. Какой из перечисленных разделов обязателен в программе: а) раздел van; b) раздел const;
Теоретические вопросы 25 с) раздел type; d) раздел begin ... end; е) раздел label? 17. Для чего используется указание типа величины? 18. Какие значения имеют переменные в начале выполнения программы? 19. Можно ли в процессе выполнения программы изменять значения констант? 20. Как называется процесс передачи информации от внешнего носителя в опе- ративную память? 21. Как называется процесс передачи данных из основной памяти во внешнюю? 22. Назовите внешние носители информации. 23. В какой стандартный файл программа на языке Паскаль помещает результат обработки данных? 24. Какое устройство назначено стандартному файлу Input? 25. Какое устройство назначено стандартному файлу Output? 26. Назовите процедуру ввода информации. 27. Каково назначение процедур write и writein? 28. Следующую последовательность операторов ввода замените одним операто- ром: read(xl); read(y2): read(x3); read(x4). 29. Одинаков ли результат выполнения операторов read(x) и read(Input. х)? 30. Сколько аргументов могут иметь процедуры read и readln? 31. Верно ли, что аргументом процедуры read может быть список переменных и элементы этого списка разделяются запятыми? 32. Сколько процедур read может быть в программе? 33. Чем различаются процедуры read и readln? 34. Пусть в программе есть процедура read(xl, х2..хп). Должны ли пере- менные списка ввода иметь одинаковый тип? 35. Как набираются на клавиатуре значения переменных xl, х2, ..., хп для опера- тора read (xl, х2.....хп)? 36. Какой оператор используется для того, чтобы вводимые данные читались с новой строки? 37. Может ли быть пустым список ввода? 38. Надо ли описывать тип переменных, входящих в список ввода? 39. Какое соответствие должно быть между типами переменных списка ввода и типами данных, вводимых с терминала? 40. С помощью каких стандартных процедур осуществляется вывод на дисплей? 41. Замените следующую последовательность операторов вывода одним опера- тором: write(’Зарплата отца = '); write(z): writein. 42. Может ли элементом списка вывода быть константа? 43. Можно ли с помощью процедуры write напечатать значение выражения?
26 Глава 2. Оператор присваивания, ввод и вывод информации 44. Что будет напечатано в результате работы процедуры write(arctan(l))? 45. Пусть I — величина целого типа. Что напечатается в результате работы сле- дующего фрагмента программы: I := 123: write(I. I. I): write(I-12); 46. Какова ширина поля десятичного представления величины х при печати в ре- зультате выполнения оператора wri te (х: 7) ? 47. Чем отличаются действия процедур write и writein? 48. В чем состоит действие процедуры wri tel п без параметров? 49. Для чего в прбцедурах вывода write и writein определяется ширина поля вывода? 50. Какие обозначения используются в форматах вывода? Упражнения, задачи, линейные программы ♦ 1. Задайте в виде оператора присваивания следующие действия: а) переменной вещественного типа х присвоить значение, равное полусум- ме значений аиЬ; Ь) удвоить значение переменной х; с) переменной целого типа х присвоить значение на 1 меньшее исходного; d) сменить знак у переменной х на противоположный. 2. Дано целое положительное число п. Присвойте переменной т последнюю цифру этого числа. 3. Пусть р и п — целые положительные числа и п - 123 456. Чему равно зна- чение р после выполнения оператора присваивания: а) р:= n div 100 mod 10; b) р:= n div 100 mod 10 + n mod 10. 4. Пусть m — целое число, x - 123,45. Каков результат выполнения оператора присваивания: a) m := trunc ( х * 1000 ) mod 10 + round ( х * 100 ) mod 10; b) m := pred ( round ( x * 100 ) ) mod 10 + succ ( round ( x * 1000 ) ) mod 10. ♦ 5. Целой переменной x присвойте значение суммы цифр заданного трехзначного числа. 6. Определите число, полученное выписыванием в обратном порядке цифр за- данного целого трехзначного числа х. Присвойте это число переменной т. ♦7. Пусть идет k-я секунда суток. Определите, сколько целых часов h и целых минут т прошло к этому моменту. *8. Пусть п — целое число от 1 до 365. Присвойте целой переменной т значение 1,2,..., 6 или 7 в зависимости от того, на какой день недели (понедельник,
Упражнения, задачи, линейные программы 27 вторник, ...» субботу или воскресенье) приходится n-й день невисокосного года, в котором 1 января — среда. 9. Поменяйте местами значения вещественных переменных х и у. 10. Поменяйте местами значения целых переменных т и и, не используя допол- нительные переменные. И. Пусть даны длины сторон треугольника. Вычислите его площадь. 12. Вычислите расстояние между двумя точками на плоскости с данными коор- динатами (х1,у1) и (х2, у 2). 13. Вычислите дробную часть среднего арифметического и дробную часть сред- него геометрического трех заданных чисел. 14. Найдите сумму п членов арифметической прогрессии, первый член которой равен а, а разность равна d. 15. Вычислите значение первой производной функции л/1 в заданной точке а при заданном значении п. 16. Введите положительное число а. Вычислите: . а) площадь равностороннего треугольника со стороной а; Ь) площадь квадрата со стороной а\ с) площадь круга, радиус которого равен а, 17. Вычислите длину окружности, площадь круга, объем шара заданного радиуса. 18. Пусть даны числа а, 6, у. Найдите площадь треугольника, две стороны которо- пэ равны а и Ь, а угол между этими сторонами равен у. Считайте, что у — это: а) радианная мера угла; Ь) градусная мера угла. 19. Пусть даны четыре целых числа (hour, min, sec, time). Первые три из них (hour, min, sec) — это время запуска ракеты в часах, минутах и секундах, четвертое (time) определяет время полета в секундах. Найдите и напечатайте время воз- вращения ракеты на землю. 20. Пусть дано натуральное число и, состоящее из шести цифр. Определите чис- ло сотен и тысяч в нем. 21. Товар до деноминации (до 1 января 1998 года) стоил г рублей. Какова его цена после деноминации (в рублях и копейках) при условии, что г > 10 ? 22. Определите f—угол (в градусах) между положением часовой стрелки в начале суток и ее положением в h часов,т минут и s секунд ( 0 < h < 11, т > 0, 5 < 59 ). 23. Введите два вещественных числа. Напечатайте коэффициенты приведенно- го квадратного уравнения, корнями которого являются эти числа. 24. Пусть дано число/ — угол в градусах. Определите смежный к нему угол в ра- дианах. 25. В бригаде, работающей на уборке сена, имеется п косилок. Первая из них ра- ботала т часов, а каждая следующая на 10 мин больше, чем предыдущая. Сколько часов работала вся бригада?
28 Глава 2. Оператор присваивания, ввод и вывод информации *26 . Пусть даны целые числа т, п (часы, минуты), 0 < т < 11 > 0 < и < 59, опреде- ляющие время суток. Определите наименьшее время (число полных минут), которое должно пройти до того момента, когда часовая и минутная стрелки на циферблате: а) совпадут; Ь) расположатся перпендикулярно друг другу. Задания для самостоятельной работы 1. Составьте программу для решения системы двух линейных уравнений ах + by = с, dx + ey = f с двумя неизвестными х, у. Значение неизвестных находятся по формулам: . . , ce-bf af-cd Д = ae-bd, х =-—, у = —-- Д Д' Считайте, что Д 0. 2. Подсчитайте, сколько очков набрала команда «Динамо» в первом круге чем- пионата России по хоккею, если известно, что т встреч она выиграла, ц встреч проиграла, k встреч закончились ничьими, полагая, что за выигрыш команда получает 2 очка, за ничью — 1 очко, за проигрыш — 0 очков. 3. Пусть известны длины сторон а, &, с треугольника. Вычислите высоты этого треугольника по формулам: ha = - Vp(p-a)(p-*)(p-c) > а hb=T ylp(p-a)(p-b)(p-c), b hc = -> где p = a+b+c . c 2 4. Составьте программу для вычисления времени t встречи автомобилей, дви- жущихся равноускоренно навстречу друг другу, если известны их скорости Vt и У2, ускорения ах и а2 и начальное расстояние S между ними. Расстояние 5Р пройденное первым автомобилем, вычисляется по формуле расстояние 52, пройденное вторым автомобилем, вычисляется по формуле
Задания для самостоятельной работы 29 Время t встречи автомобилей определяется из уравнения г тт м а + b Ь-с 5. Найдите х из пропорции----------- х а + с 6. Сколько процентов от А 4- В - С приходится на А? На В? На С? 7. Составьте программу вычисления идеального веса человека по его росту, при условии, что идеальный вес (кг) = рост (см) - 100. 8. Даны координаты вершин некоторого треугольника. Вычислите его пло- щадь. 9. Розничная цена мужского костюма составляет R рублей. Торговое наложе- ние магазина составляет Т% от оптовой цены. Составьте программу опреде- ления оптовой цены костюма. 10. Зарплата сотрудника частной фирмы составляет г рублей в месяц. Сколько денег он получит за полгода после вычета налогов в размере t % ежемесячно и s % за полГода? И. Даны координаты вершин некоторого треугольника. Вычислите его пери- метр. 12. Пусть смешано литров воды температуры t{ с V2 литрами воды температу- ры t2. Составьте программу вычисления объема и температуры образован- ной смеси. 13. Определите стоимость набора, в который входят следующие конфеты (сто- имость упаковки составляет U руб.): Название Вес Стоимость Петровские 200 г /Сруб. (1 кг) Воронежские 300 г Рруб. (1 кг) Чародейка 250 г R руб. (1 кг) Факел 150 г В руб. (1 кг) Ласточка 200 г L руб. (1 кг) Упаковка — U руб. (1 кг) 14. Сколько времени в минутах затратит школьник на дорогу от школы до стадио- на, если это расстояние составляет S км, а средняя скорость движения школь- ника — V км/ч. 15. В квадрат вписана окружность (рис. 2.1). Определите площадь заштрихован- ной части фигуры, если известна длина стороны квадрата.
30 Глава 2. Оператор присваивания, ввод и вывод информации 16. В квадрат вписана окружность (рис. 2.1). Определите площадь заштрихован- ной части фигуры, если известен радиус окружности. Рис. 2.1. Два «уголка» 17. В квадрат вписана окружность (рис. 2.2). Определите площадь заштрихован- ной части фигуры, если известна длина стороны квадрата. Рис. 2.2^ «Уголок» и квадрат 18. В квадрат вписана окружность (рис. 2.3). Определите площадь заштрихован- ной части фигуры, если известна длина стороны квадрата. Рис. 2.3. Круг и два «уголка»
Глава 3 Логический тип I Теоретические вопросы 1. Какое служебное слово используется для описания данных логического типа? 2. Какие значения могут принимать данные логического типа? 3. Почему логический тип относится к порядковым типам? 4. Верно ли, что true > false? 5. Верно ли, что succ ( false ) = true? 6. Верно ли, что ord ( false ) = О? 7. Верно ли, что ord ( true ) = 1? 8. Верно ли, что pred ( true ) = false? 9. Верно ли, что pred ( false ) = О? 10. Перечислите логические операции в порядке убывания приоритета. 11. Верно ли, что результат операции логического умножения возвращает true, если оба операнда истинны? 12. Верно ли, что операция and дает false, если хотя бы один операнд имеет зна- чение false? 13. Верно ли, что результат логического сложения истинен, если хотя бы один операнд имеет значение true? 14. Какой тип должна иметь переменная в левой части оператора присваивания, если в его правой части стоит выражение логического типа? 15. Может ли булево выражение содержать круглые скобки? 16. Может ли булево выражение содержать несколько операций? 17. Влияют ли круглые скобки на порядок вычисления значений логических опе- раций в булевых выражениях? 18. Могут ли в булевы выражения входить операции сравнения? 19. Верно ли, что в булевом выражении, содержащем несколько операций, сна- чала определяются значения всех операций сравнения?
32 Глава 3. Логический тип 20. Пусть в левой части оператора присваивания находится переменная логи- ческого типа. Может ли в его правой части стоять операция сравнения чис- ловых типов? 21. С помощью какой функции можно проверить целочисленную переменную на нечетность? Упражнения 1. Пусть заданы переменные а, Ь, с логического типа. Доказать тождества: a) true or а = true b) a and false н false c) a or ( not a ) s true d) a and ( not a ) н false e) a or ( b or с ) н ( a or b ) or c f) a or ( b or c ) = ( a or b ) or ( a or c ) g) a and ( a or b ) s a h) a or ( a and b ) = a i) not not a s a j) a = ( a and b ) or ( a and not b ) 2. Чему равно значение логического выражения (a and not b) or с, если: а) все значения переменных равны true; b) все значения переменных равны fа 1 se; с) а = true, b = true, с = false; d) а = true, b = false, с = true; e) a = false, b = true, c = false. 3. Вычислите значение логического выражения, считая, что х и у являются пе- ременными вещественного типа: ♦a) d/x>x) and not (1+х*х>0) or (132<13.2*10) or ((х*х-2*х+1) < 0); ' ♦b) not (12.5>25/2) and (x<x*x) and not (-5*6=( 7.5*(-4))); c) (x or (not x)) and odd(32767-2) or (sqr(x)+sqr(y)<=4). 4. Запишите на языке Паскаль выражения, истинные при выполнении указан- ного условия и ложные в противном случае: а) х = min(x, у, z); b) x принадлежит отрезку (-1,1); с) х лежит вне интервала (-1,1); d) х принадлежит интервалу (2,10) или (-2,2); е) х лежит вне полуинтервалов (-2,0) и (2,5); f) каждое из чисел х, yt z положительно; g) только одно из чисел х, yf z положительно;
Линейные программы 33 h) хотя бы одно из чисел х, yf z положительно; i) год с порядковым номером k является високосным (год високосный, если его порядковый номер кратен 4, однако из кратных 100 високосными яв- ляются лишь кратные 400). ♦5. Нарисуйте на плоскости область, в которой истинны выражения: а) (у >= х) and (у+х >= 0) and (у <= 1); b) (abs(x) <= 1) > (abs(y) >= 1); с) (у >= -х-1) and (X <= 0) and (у <= 0) or ((х = у) and (х >= 0)); d) (у = 0) and ((х >= -2) and (х <= -1) or (х >= 1) and (х <= 2) or (х = 0) and (у >= 2)). Линейные программы ♦1. Напишите программу, в результате выполнения которой выводится значе- ние true, если ел > ле. Возможны следующие варианты: а) числа е и л описать как константы с точностью 10~5; Ь) числа е и л представить с машинной точностью. 2. Для произвольных чисел a, Ь, с определите, имеет ли уравнение аг2 + Ьх + с = О хотя бы одно вещественное решение. ♦3. Для заданных чисел р, а, b (а < Ь) определите, имеет ли уравнение arctan(2* - - |р|) = V2~KopeHb на отрезке [а, Ь]. 4. Даны три положительных числа а, Ь, с. Определите, можно ли построить тре- угольник с такими длинами сторон. 5. Определите, есть ли среди цифр некоторого трехзначного числа повторяю- щиеся. ‘6. Определите, равна ли сумма крайних цифр некоторого четырехзначного числа сумме его средних цифр. ♦7. Пусть (k, Г), (т, п) — поля шахматной доски: k, т — номера по горизонтали; 1,п — номера по вертикали (1 < k, т, п < 8). Определите: а) можно ли с поля (k, I) попасть на поле (т, п) одним ходом пешки; Ь) можно ли с поля (k, I) попасть на поле (т, п) одним ходом ладьи; с) можно ли с поля (k, Г) попасть на поле (т, п) одним ходом слона; d) можно ли с поля (£, Z) попасть на поле (т, п) одним ходом ферзя. ♦8. Пусть дано вещественное число а. Вычислите /(а), где f — периодическая функция с периодом 2, совпадающая на отрезке [-1,1] с функцией (-х2 + 1). 9. Напишите оператор присваивания, в результате выполнения которого логи- ческая переменная t принимает значение true, если выполняется указанное условие, и значение false в противном случае: а) числа х, г/, z равны между собой; Ь) из чисел х, у, z только два равны между собой; 2 Зак. 906
34 Глава 3. Логический тип с) целые числа т и п имеют одинаковую четность; d) только одна из двух заданных логических переменных имеет значение true; е) х — положительное число; f) цифра 7 входит в десятичную запись трехзначного целого числа k хотя бы один раз; g) из чисел х, г/, z хотя бы два числа положительные; h) точка (хр z/j) попадает внутрь круга радиуса г; i) точка (хр у{) попадает внутрь кольца с центром в начале координат, вне- шний радиус которого равен /, а внутренний — г, если / и г (I > г > (^зада- ны. j) поля шахматной доски (g1, с1) и (g2, с2) имеют одинаковый цвет (g7, g2, d, с2 — целые числа от 1 до 8); к) ферзь, расположенный на поле (g/, с1) шахматной доски, «бьет» фигуру, расположенную на поле (g2, с2); I) конь за один ход может перейти с поля (g1, с1) на поле (g2, с2).
Глава 4 Условный оператор Теоретические вопросы 1. Какие служебные слова могут использоваться при записи условного опера- тора? 2. Какой тип должно иметь выражение, стоящее в условном операторе между словами 1 f и then? 3. Пусть дана следующая последовательность операторов: if <выражение> then <оператор1> else <оператор2>: <0ператор3>: Установите: а) значение <выражения>, при котором выполняется <операторЗ>; Ь) возможность записи после слова then нескольких операторов; с) условие выполнения оператора <оператор1>; d) значение <выражения>, при котором выполняется <оператор2>; е) может ли <выражение> содержать знаки операций сравнения; f) может ли <выражение> содержать знаки логических операций; g) могут ли быть операторы if быть вложенными. 4. Приведите пример составного оператора. 5. Как называются программы, в основе которых лежит структура следование? 6. Какие операторы входят в состав разветвляющихся программ? Упражнения Как найти минимальное из двух чисел а и Ь. Как найти максимальное из трех чисел а, b и с. Переменной х присвойте значение корня уравнения arcsin (1 + In х) = а, если такой существует. При заданном значении х вычислить значение функции у = - 2
36 Глава 4. Условный оператор ♦5. Составьте программу вычисления функции f(x) вида: х3 -Зх + 8, /•(*)= 1 х3 - Зх + 8 X2 - X < 1, х2 -х > 1; х < О, с) /(х) = ^х2-х, 0<х<1, x2-sinnx2, х>1. ь 6. Для заданных значений х, у напишите программу вычисления числа min(x,y )+0,5 1 + шах2(х,у ) ПРИМЕЧАНИЕ Здесь и далее min(x, у) обозначает минимальное из чисел хи у, шах(х, у) — максимальное из чисел х и у. ♦7. По заданным значениям х, у, z вычислить значение и\ a.) u = тах(х + у + z, xyz); ах + bye [с, J) ах + by < с , где a, b,c,d— известные величины; ах + by > d с) u = min(x, max(y, z)); 8. Найдите полярные координаты г и ф точки на плоскости по ее прямоуголь- ным координатам х и у. При этом воспользуйтесь формулами:
Упражнения 37 у arctg— , х>0 , у>0, х у 2ft+arctg— , х>0 х 9. Перераспределите значения переменных хи у таким образом, чтобы перемен- ная х получила меньшее из этих значений, а у — большее. ♦10. Считая, что стандартные функции sin и cos применимы только к аргументам изотрезка[0, л/2], вычислите z/1 - sinx,y2 = cosхдля произвольного числах. 11. Замените оператором присваивания следующий условный оператор: if а then х : = true else if b then x := c else x := false; 12. Составьте программу для определения корней квадратного уравнения. 13. Напишите программу, которая проверяет, не приведет ли суммирование двух заданных целых чисел к переполнению. * 14. Напишите программу, которая проверяет, не приведет ли перемножение двух заданных целых чисел к переполнению. * 15. Пусть даны вещественные числа х1, х2, х3, у1, у2, у3. Принадлежит ли начало координат треугольнику с вершинами (х1, у1), (х2, у2), (х\у3)? 16. Сколько общих точек у прямой у = kx + b и окружности х2 + у2 = 7?2? 17. Пусть даны вещественные положительные числа а, 6, с, d. Выясните, можно ли прямоугольник со сторонами а, b разместить внутри прямоугольника со сторонами с, d так, чтобы каждая из сторон одного прямоугольника была па- раллельна или перпендикулярна каждой стороне второго прямоугольника. ♦ 18. Составьте программу, которая проверяет, пройдет ли кирпич с ребрами а, Ь, с в прямоугольное отверстие со сторонами х и у. Просовывать кирпич в отвер- стие разрешается только так, чтобы каждая из его граней была параллельна или перпендикулярна плоскости отерстия каждой из его сторон. * 19. Пусть дано целое k, 1 < k < 180. Определите, какая цифра находится в k-и позиции последовательности 101112131415...9899. * 20. Составьте программу нахождения корней биквадратного уравнения ах4 + + Ьх2 + с = 0.
38 Глава 4. Условный оператор ♦ 21. Дано положительное число а. Найдите: а) наибольшее число вида 1/2”, п > 0, меньшее а\ Ь) наибольшее число вида 1/3”, п > 0, меньшее а. Задания для самостоятельной работы 1. Введите три числа. Если они могут быть длинами сторон прямоугольного треугольника, выведите их в порядке возрастания и вычислите площадь по- лученного треугольника. 2. Введите три числа. Если они могут быть длинами сторон остроугольного тре- угольника, выведите их в порядке убывания и вычислите площадь получен- ного треугольника. 3. Введите три числа. Если они могут быть длинами сторон тупоугольного тре- угольника, выведите их в порядке убывания и вычислите площадь получен- ного треугольника. 4. Введите три числа. Если они могут быть сторонами равностороннего тре- угольника, вычислите его площадь и длину высоты. Выведите длины сторон треугольника, площадь и длину высоты в порядке возрастания. 5. Введите три числа. Если они могут быть длинами сторон равнобедренного треугольника, вычислите длины его высот. Выведите длину основания и дли- ны высот в порядке возрастания. 6. Введите три числа. Если они могут быть длинами сторон разностороннего тупоугольного треугольника, выведите их в порядке возрастания и вычислите площадь полученного треугольника. 7. Введите три числа. Если они могут быть длинами сторон равнобедренного тупоугольного треугольника, вычислите его площадь. Выведите длины сто- рон и площадь в порядке возрастания значений. 8. Введите три числа. Если они могут быть длинами сторон равнобедренного остроугольного треугольника, вычислите его площадь. Выведите длины сто- рон и площадь в порядке возрастания значений. 9. Введите три числа. Если они могут быть длинами сторон разностороннего остроугольного треугольника, выведите их в порядке возрастания и вычи- слите площадь полученного треугольника. 10. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами прямоугольного треугольника, вычислите его площадь. 11. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами остроугольного треугольника, вычислите его площадь. 12. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами тупоугольного треугольника, вычислите его площадь. Выведите дли- ны сторон в порядке убывания. 13. Пусть даны координаты трех точек на плоскости. Если они могут быть верши- нами равностороннего треугольника, вычислите его площадь и длину высоты.
Задания для самостоятельной работы 39 Выведите длины сторон, площадь и длину высоты в порядке возрастания значений. 14. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами равнобедренного треугольника, вычислите длины его высот. Выве- дите длины основания и высот в порядке возрастания значений. 15. Пусть даны координаты трех точек на плоскости. Если они могут быть верши- нами разностороннего тупоугольного треугольника, вычислите его площадь. 16. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами равнобедренного тупоугольного треугольника, вычислите его пло- щадь. Выведите длины сторон и площадь в порядке возрастания значений. 17. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами равнобедренного остроугольного треугольника, вычислите его пло- щадь. Выведите длины сторон и площадь в порядке возрастания значений. 18. Пусть даны координаты трех точек на плоскости. Если они могут быть верши- нами разностороннего остроугольного треугольника, вычислите его площадь. 19. Пусть даны три числа. Если они могут быть длинами сторон треугольника, определите его вид (разносторонний, равнобедренный, равносторонний). Вы- числите длины его высот и напечатайте их в порядке убывания. 20. Пусть даны три числа. Если они могут быть длинами сторон треугольника, определите его вид (прямоугольный, тупоугольный, остроугольный). Вычи- слите длины его высот и напечатайте их в порядке убывания. 21. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами треугольника, определите его вид (разносторонний, равнобедрен- ный, равносторонний). Вычислите длины его высот и напечатайте их в по- рядке убывания. 22. Пусть даны координаты трех точек на плоскости. Если они могут быть вер- шинами треугольника, определите его вид (прямоугольный, тупоугольный, остроугольный). Вычислите длины его высот и напечатайте их в порядке убывания. 23. Составьте программу для определения вида треугольника (равносторонний, равнобедренный, разносторонний, прямоугольный, тупоугольный, остро- угольный), если по данным трем отрезкам его можно построить. 24. Пусть даны координаты трех точек на плоскости. Составьте программу для определения вида треугольника (равносторонний, равнобедренный, разно- сторонний, прямоугольный, тупоугольный, остроугольный), если данные ко- ординаты вершин позволяют его построить, 25. Пусть даны координаты вершин четырехугольника. Составьте программу, которая определяла бы, является ли этот четырехугольник прямоугольником. 26. Пусть даны координаты трех вершин прямоугольника. Определите коорди- наты четвертой вершины.
Глава 5 Операторы цикла Теоретические вопросы 1. Как называются программы, в основе которых лежит структура повторения? 2. Сколько операторов цикла вам известно? 3. Как называется оператор, синтаксическая диаграмма которого приведена на рис. 5.1. Рис. 5.1. Синтаксическая диаграмма оператора 4. Каков тип выражения в операторе цикла с предусловием? 5. Верно ли, что в теле цикла с предусловием должен находиться один оператор? 6. Что нужно сделать, чтобы-циклически выполнялись несколько операторов? 7. Когда проверяется истинность выражения в цикле while? 8. Верно ли, что истинность выражения в цикле с предусловием является усло- вием продолжения цикла? 9. Сколько раз выполнится оператор в теле цикла while, если с самого начала значение выражения равно false? 10. Верно ли, что цикл while используется при вычислениях всякого рода сумм и произведений, когда заранее не известно число повторений? И. Как называется оператор, синтаксическая диаграмма которого приведена на рис. 5.2? Рис. 5.2. Синтаксическая диаграмма оператора
Теоретические вопросы 41 12. Сколько операторов можно записать между ключевыми словами repeat и until? 13. Когда проверяется истинность выражения в операторе цикла repeat? 14. Какой тип имеет выражение в операторе цикла с постусловием? 15. Почему в цикле repeat тело цикла всегда будет выполнен хотя бы один раз? 16. Верно ли, что истинность выражения в цикле repeat является условием окон- чания цикла? 17. С помощью каких служебных слов записывается цикл с параметром? 18. Верно ли, что цикл с параметром применяется в тех случаях, когда заранее известно число повторений? 19. Пусть цикл записан в виде: for v:=El to Е2 do S: а) Как называется El? b) Как называется^? с) Как называется v? 20. Сколько раз выполнится оператор S, если Е1=Е2, а цикл записан в виде: for v:=El to Е2 do S; 21. Сколько раз выполнится оператор S и можно ли изменить значение пере- менной v в теле цикла, если Е1>Е2, а цикл записан в виде: for v:=El to Е2 do S; 22. Сколько раз выполнится оператор S, если Е1=Е2, а цикл записан в виде: for v:=El downto Е2 do S; 23. Сколько раз выполнится оператор S, если Е1<Е2, а цикл записан в виде: for v:=El downto Е2 do S; 24. Верно ли, что в качестве параметра цикла for используется простая перемен- ная, описанная в текущем блоке? 25. Какой тип должен иметь параметр цикла в цикле for? 26. Какой тип должны иметь начальное и конечное значения в цикле for? 27. Чему равно значение параметра цикла for после завершения цикла? 28. Можно ли войти в тело цикла for, минуя его заголовок? 29. Можно ли войти в тело цикла while, минуя его заголовок? 30. Можно ли войти в тело цикла repeat, минуя его заголовок? 31. Допустим ли выход из тела цикла for? 32. Допустим ли выход из тела цикла while? 33. Допустим ли выход из тела цикла repeat? 34. Какие циклы называются вложенными? 35. Верно ли, что цикл, содержащий в себе другой цикл, называется внешним? 36. Какой цикл называется внутренним?
42 Глава 5. Операторы цикла 37. Какому условию должны удовлетворять вложенные циклы? 38. Может ли внешний цикл быть циклом for, а внутренний — циклом repeat? 39. Могут ли внутренний и внешний циклы быть циклами разных видов? 40. Могут ли внутренний и внешний циклы быть циклами одного вида? 41. Может ли вещественная переменная быть параметром цикла for? 42. Можно ли в качестве параметров вложенных циклов for использовать одну и ту же переменную? 43. Какие утверждения являются верными (проиллюстрируйте ответ соответ- ствующими примерами): а) любой цикл for можно записать при помощи цикла while; b) любой цикл while можно записать при помощи цикла for; с) не любой цикл for можно записать при помощи цикла while; d) не любой цикл while можно записать при помощи цикла for. Упражнения, задачи, программы 1. Чему равно число повторений цикла for i:=A to В, если: а) В>=А-1; Ь) В<А. 2. Чему равно число повторений цикла for i:=A downto В, если: а) А>вВ-1; Ь) А<В. 3. Пусть дан фрагмент программы: У 1: 1 := 2; while 1 <= 5 do begin у := у * 1: i := 1 + 1 end; write ( у ); а) Что будет выведено в результате работы программы? Ь) Замените цикл while циклом for. с) Замените цикл while циклом repeat. 4. Для заданных значений хим вычислите у = х”, где п — натуральное число. 5. Составьте программу вычисления значения М: [/I9 к>9 м = Г [£! Д <9.
Упражнения, задачи, программы 43 ♦6. Составьте программу вычисления величины К: ,п<9 К = 1229~п,9<п<29 1, п = 29 7. Напишите программу вычисления значения функции у для десяти вводи- мых пользователем значений х. [х2 4- 2х - 2, - 2 < х < 1 У = < I х, (х < - 2) или (х > 1). 8. Составьте программу для вычисления самого большого числа, для которого можно вычислить факториал на имеющемся компьютере. 9. Пусть дано натуральное число п (запись числа п в десятичной системе есть akak-iak-2 ••• ао)- Составьте фрагменты программ для ответа на следующие во- просы. а) Сколько цифр в числе и? Ь) Чему равна сумма его цифр? ♦ с) Чему равна первая цифра числа п? d) Как выглядит запись цифр числа п в обратном порядке? * е) Читается ли число п слева направо и справа налево одинаково? ♦ f) Чему равна знакочередующаяся сумма цифр числа п? g) Чему равно выражение ak - ak_x + ak_2- ... +(-1)*а0? 10. Составьте программу для нахождения всех автоморфных чисел в отрезке [т, п\. Автоморфным называется целое число, запись которого сопадает с последними цифрами его квадрата. Например: 52= 25,62в36, 252= 625. И. Пусть дано натуральное число п. Требуется: ♦ а) выяснить, является ли оно степенью числа 3; * Ь) переставить первую и’ последнюю цифры числа п\ ♦ с) выяснить, входит ли цифра 3 в запись числа п2\ d) добавить 1 к последней цифре числа. Пример: 37 —> 38,49 -» 410; ♦ е) добавить 2 к первой цифре числа. Пример: 49 —> 69,92 —» 112; f) удвоить первую цифру числа. Пример: 49 89,89 -> 169; g) добавить 1 к первой и последней цифрам числа. Пример: 489 —>5810. 12. Вычислите наибольший общий делитель двух натуральных чисел. 13. Составьте программу нахождения наименьшего общего кратного двух нату- ральных цисел.
44 Глава 5. Операторы цикла 14. Составьте программу, которая проверяет, является ли заданное число совер- шенным. Совершенным называется натуральное число, равное сумме всех своих делителей (исключая само число). Например: 28 = 1 + 2 + 4 + 7 + 14. 15. Выведите все простые трехзначные числа. 16. Вычислите первый отрицательный член последовательности cos(ctg(n)), « = 1,2,3,... Отрицательные члены в этой последовательности обязательно есть. 17. (Доставьте программудля ычисления и вывода п первых чисел Фибоначчи. Числа Фибоначчи получаются с помощью следующих рекуррентных соот- ношений:/! =/2 = + fn-2, и > 3, где fn — целое. ♦ 18. Заданное натуральное число п представьте в виде суммы различных чисел Фибоначчи. Сколько слагаемых будет входить в эту сумму? 19. Найдите первое число Фибоначчи, большее заданного п. 20. Вычислите сумму всех чисел Фибоначчи, которые меньше 1000. 21. Для заданного значения х вычислите п-й многочлен Чебышева, если извест- ны следующие соотношения: Го = 1; Г1(х) - х; Гп+1(х) = 2хГ„(х) - Гл-1(х). 22. Пусть дано целое k > 0. Напечатайте k-й член последовательности, задавае- мой формулами: х0 — 1, Хп = ПХп-\ + ~,П>\. П 23. Пусть дано натуральное число п (п > 3). Получите у„, если v0 = Vj = 0; v2 = 1,5; f + 1 • ? л Vi = ту—V,-! - V^v^ , z = 3,4 ... I +1 24. Пусть даны вещественные числа q, г, b, с, d, натуральное число n(n> 2). Вычислите хл, если Хо = с, Xi = d, Xk = qxk-t + rXk-2 + b,k>2. 25. Пусть дано натуральное число п (п > 3). Получите v„, если щ = щ = 0, vi = v2 = 1, ai-\ ♦ 26. Пусть aQ = = 1, 4 - 4-2 + *= 2,3,... Для заданного п найдите произве- дение ах -а2-а^ ♦ 27. Составьте программу вычисления суммы вида: / . , 1 1 1 а) 1ч—— ч—— Ч-...Ч---—; 23 З3 503 1 1 1 1 ' 22 42 + 62 + " + 1282 ’ 28. Пусть Хо = z/o = Ю и x,+i = 0,1 yly y,+i = 0,1х, - 0,12г/,, для i > 1. Требуется найти наименьшее г, такое, что |л7г | < е, |г/, | < е для заданного е > 0.
Упражнения, задачи, программы 45 29. Пусть дано 100 вещественных чисел, которые вводятся по одному. Найдите количество положительных, отрицательных и нулевых чисел. •30. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычисли- те среднее арифметическое положительных и среднее арифметическое от- рицательных чисел. 31. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычисли- те разность между максимальным и минимальным числами. >32. Пусть дано 100 вещественных чисел, которые вводятся по одному. Вычислите среднее арифметическое чисел, больших полусуммы первых двух. >33. Пусть дано 100 целых чисел, которые вводятся по одному. Получите сумму тех из них, которые: а) кратны 5; Ь) нечетны и отрицательны; с) меньше по абсолютному значению квадрата порядкового номера вводи- мого числа. >3 4. Пусть дано натуральное число п и вещественные числа аи а2>..., ап, которые вводятся по одному. Получите: а) их произведение; Ь) их среднее арифметическое; с) + 2 а2 + 3 а3 + ... + п d) d2 4" 4-... 4- dn_^ dn (п > 1), e) |a, -a„|; f) последовательность av dxa2, a{a2ay ..., a1a2...an. >35. Пусть дано натуральное число п и последовательность из п вещественных чисел, среди которых есть хотя бы одно отрицательное. Найдите наибольшее среди отрицательных чисел этой последовательности. 36. Составьте программу вычисления при заданных х и а значения функции у вида: а) у = ((((((((х + а)1 + а)2 + а)2 + а)2 + а)2 + а)2 + а)2 + а)2; ♦Ь) у = а + (а + (а + (а + (а + (а + (а + (а + х)2)2)2)2)2)2)2; ,с) (х-2)(х-4)(х-6)...<х-64). У (х-1)(х-3)(х-5)...(х-63) ’ d) у = (((((х - а)х - а)х - а)х - а)х - а)х - а. 37. По заданному значению х вычислите значение г/, представив многочлен в виде у = (.. .(((х 4-2)х 4-3) 4-4)х 4-... 4-10)х 4-II а) у = х'6’ + 2х9 + Зх3 + ... + Г0х + П; ♦Ь) у = 11х1° + 10х9 + 9х8 + ... + 2х + 1. 38. Вычислите значение многочлена /(х) = аах" + а.х"'1 +... + а„чх + а„ и его про- изводной в точке х = Г2 + 0,5 для заданного значения t. Числа п, t, а0, at,..., а„ определяются вводом.
46 Глава 5. Операторы цикла 39. Вычислите: 109 + 1 111 ♦40. Напишите программу вычисления при заданном х величины у по формуле: 2 256 X +-?- X 41. Вычислите: а) у = cos х + cos х + cos х + ... + cos х ; b) у e 1! + 2! + 3! + ... + п!, и > 1; с) у - sinl + sinl,l+ sinl,2 + ... + sin2; d) первое из чисел sin х, sin sin x, sin sin sin x..., меньшее по модулю, чем 10’4. ♦42. Вычислите сумму квадратов всех целых чисел, попадающих в ийтервал (1пх, ех), х > 1. ♦43. Напишите программу нахождения первого члена последовательности а„=(-1)л(1 + | + ... + -)•(« = 1.2,...), 2 п который не принадлежит заданному отрезку [а, Ь]. 44. Используя метод деления отрезка пополам, с точностью до 10"4 найдите наи- меньший положительный корень уравнения tg х = х. 45. Пусть дан прямоугольник, длины сторон которого а и b — натуральные числа. На сколько квадратов, стороны которых выражены натуральными числами, можно разрезать данный прямоугольник, если от него каждый раз отрезать квадрат максимально возможной площади? ♦46. Составьте программу для нахождения всех прямоугольников заданной пло- щади. Считайте, что длины сторон прямоугольников и площадь выражаются натуральными числами. 47. Составьте программу для нахождения и выода всех пифагоровых чисел, не превышающих 20.
Упражнения, задачи, программы 47 48. Выведите на экран одну из строк формулы для заданного натурального У; первая строка выводится, еслиЛГ — четное, вторая — если N — нечетное. 49. Пусть вводится последовательность из целых чисел, оканчйвающаяся нулем. Найдите: а) номер последнего из наибольших чисел последовательности; ♦ Ь) наименьшее из всех положительных чисел последовательности; с) два наименьших числа последовательности; * d) номер меньшего из двух наибольших чисел последовательности; ♦ е) сумму тех из них, порядковые номера которых — числа Фибоначчи. 50. Пусть вводится последовательность вещественных чисел, оканчивающаяся нулем и состоящая более чем из одного ненулевого элемента. Определите: а) содержит ли последовательность хотя бы одну пару равных соседних эле- ментов; Ь) сколько раз в последовательности меняется знак при переходе к следую- щему элементу; с) является ли эта последовательность возрастающей; ♦d) номер числа по абсолютной величине самого близкого к своему номеру. * 51. В соревнованиях по фигурному катанию оценки выставляют несколько су- дей. При выведении единой оценки за выступление одного спортсмена из всей совокупности оценок удаляется наиболее высокая и наиболее низкая, и для оставшихся оценок вычисляется среднее арифметическое. Если не- сколько судей выставили наиболее низкую или наиболее высокую оценки, то из совокупности оценок удаляется только одна такая оценка. Напишите программу для вычисления оценки спортсмена. ♦ 52. Пусть х0= a,Xk = qxk-\ + b (k = 1,2,...). Дано неотрицательное целое п и вещест- венные a, Ь, с, d,q{c < d). Сколько чисел Xk (k < п) принадлежит интерва- лу (с, d)? 53. Пусть дано натуральное число л и вещественные числа а, Л, Ь, Вычислите сумму: 1 + 2(b - а) + 3(6 - a)(b - а - h) + ... + (п + 1)(6 - а) ... (6 - а - (п - 1)6). 54. Имеется целое k > 0, Вычислите 6-й член последовательности Х1,Хг, ...,х*, где хо=1,хя=пхл-1+1/и прип - 1,2,3,... ♦55. Пусть дано натуральное число п. Вычислите значения выражений:
48 Глава 5. Операторы цикла *56. Пусть даны натуральное число п и вещественное число х. Вычислите: е) sin х + sin2 х + ... + sin" х; f) sin х + sin x2 + ... + sin x"; g) sin x + sin sin x 4-... 4- sin sin sin... sin x. ♦57. Пусть даны натуральное число п и вещественные числа х{, у1, х2, у2, •••, хп, уп. Рассматривая пары х„ как координаты точек на плоскости, определите ра- диус наименьшего круга с центром в начале координат, внутрь которого по- падают все эти точки. ♦58. Даны натуральное число п (п > 2) и вещественные числа ах, Ьх, а2, Ь2,ап, Ьп. Рассматривая пары aif bi как координаты левых и правых концов отрезков числовой прямой, определите концы отрезка, являющегося пересечением всех этих отрезков. *59. Пусть дано натуральное число k. Выведите А-ю цифру последовательности: а) 12345678910111213..., в которой выписаны подряд все натуральные числа; Ь) 149162536..., в которой выписаны подряд квадраты всех натуральных чисел; с) 1123581321..., в которой выписаны подряд все числа Фибоначчи. ♦60. Вычислите Xi 4- х2 4-... 4- Х20, если последовательность Xi, Хг,... образована по сле- дующему закону: b) X] =1; х2 =0.3; х, = (»+1)-х/_2, 1 = 3,4,...; с) X] = х2 = х3 = 1; х, = (i + 3)(х,_| -1) + (х + 4)х,_3, i = 4,5,... 61. Каждая бактерия делится на две в течение одной минуты. В начальный мо- мент времени имеется одна бактерия. Составьте программу для расчета ко- личества бактерий через заданное целое количество минут. ь 62. Вычислите приближенное значение jx2dx, используя формулу прямоуголь- а ников, если известно, что отрезок [af fe] разбит на п частей. Формула прямо- угольников для вычисления интеграла записывается в виде: ь J f (x)dx = h а где h - b-a п
Упражнения, задачи, программы 49 63. Вычислите определенные интегралы: 0.5 a) |4cos2xdi; о 64. Используя приближенное интегрирование, найдите значение л. Для этого вычислите площадь четверти единичного круга, а затем увеличьте ее в четы- ре раза. 65. Выведите таблицу значений функции у = /(х). Таблица должна иметь две колонки: в первую заносятся значения х„ а во вторую — г/,. а) /(х)= cosV2x, х, = л + -—-i, i = 0,1,..., л; а,Ь,п — вводятся; п — Зх + 2 Ь) /(х)= —. ,X; = 1 + ih, i = 0,1,...,л; h,n — вводятся. V 2х3 -1 66. Получите таблицу температур по шкале Цельсия от 0 до 100 градусов и их эквивалентов по шкале Фаренгейта, используя для перевода формулу tF = — tc + 32. 67. Пусть интервал (а, Ь) разбит точками на п равных частей; в каждой точке вычисляется значение функции V1X3 -1 Найдите точку, в которой функция достигает наибольшего значения. 68. Пусть отрезок [а, Ь] разбит точками на п равных частей. В каждой точке вы- числяется значение функции •Jlx* -1 ’ Найдите наибольшее и наименьшее значения функции в этих точках. 69. Пусть отрезок [а, 6] разбит точками на п равных частей. В каждой точке вы- числяется значение функции Найдите те точки, в которых функция принимает наибольшее и наименьшее значения.
50 Глава 5. Операторы цикла 70 . Найдите то значение х, при котором значение суммы (х) + р2 (х) + р3 (х) мак- симально, если Зх2 -1 5х2 - Зх р,(х) = X , р2(х) = , Л(х) = — Аш Л* ах = 0; 0,5; 0,1;... 20. ♦71. Билет называют «счастливым», если в его номере сумма первых трех цифр равна сумме последних трех цифр. Подсчитайте число тех «счастливых» би- летов, у которых сумма первых трех цифр равна 13. Задания для самостоятельной работы / 1. Пусть ак-\ где k = 2,3,... Найдите произведение ауаг...-ап. 2. Вычислите длину кривой, соответствующей функции у = /(х) на отрезке [a, i], приближенно заменив кривую ломаной, полученной в результате раз- биения отрезка [а, Ь] на п равных частей. 3. Пусть даны вещественные числа а, b (Ь > а), натуральное п. Получите \ , b-a r a + (i-Q3\h , о W +/2 +... + Л)-Л, где h =-, z = \ л ’1 = lj 21 ”• п 1 +(а+ (/-0,5)* Л/ 4. Пусть дано целое число т > 1. Получите наибольшее целое k, при котором 4к< т. 5. Определите, в какую наибольшую целую положительную степень можно воз- вести число 6, чтобы результат не превосходил заданной величины а (Ь< а). 6. Пусть дано вещественное число х и натуральное число п. Вычислите: (х-2)(х-4)...(х-2и) (х-1)(х-3)...(х-2и-1) 7. Пусть даны вещественные числа а, А, натуральное число п. Вычислите: f(a)+ f(a + h)+ f(a + 2h)+... + f(a + nh), где /(x) = (x2+l)cosx. 8. Корень некоторого уравнения находится последовательными приближения- ми по формуле о з 2“Х„ хл+1=—Г-2-- Напишите программу для нахождения такого приближения корня, при ко- тором разность по модулю между двумя соседними приближениями не пре- восходит 10’5, а начальное приближение х0 = 1. 9. Сторона правильного вписанного в окружность многоугольника с удвоен- ным числом сторон выражается через сторону исходного многоугольника ап и радиус описанной окружности R в виде формулы
Задания для самостоятельной работы 51 2Л2-2Л. Л2-^- • V 4 Вычислите длину стороны правильного вписанного 48-угольника. 10. Цилиндр объема 1 имеет высоту h. Определите радиус основания цилиндра для значений Л, равных 0,5; 1; 1,5;...; 4,5; 5. И. Способ последовательных приближений позволяет находить корень пятой степени из положительного числа а приближенно по формуле При этом разность между хп и >[а по абсолютной величине не превосходит 5 । -ахя+1-хй 4 Составьте программу вычисления корня пятой степени из числа а с точно- стью до 10~* с заданным значением k, принимая min(2a, 0,95), а <1, *о я/5,1<а<25, а/25, а>25. ь 12. Пусть дано натуральное число п. Получите наименьшее число вида 2*, пре- восходящее п. 13. Пусть дано натуральное число п. Вычислите: 1.2 + 2 • 3 • 4 + ... + л •... • 2л. 14. Напишите программу для вычисления корня n-й степени из положительно- го числа а, пользуясь последовательными приближениями k = 0,1,2,... до совпадения соседних приближений с точностью е, если задано начальное приближение хо. 15. Пусть дано натуральное число п. Удалите из записи этого числа цифры 3 и 7, оставив прежним порядок остальных цифр. Например, из числа 3171 507 377 должно получиться 1150. 16. Пусть дано натуральное число и. Найдите наименьшее среди чисел k3 sin k - 1,2,..., п. 17. Пусть дано натуральное число п. Найдите Q\b\ + а2Ь2 +... + апЬп =
52 Глава 5. Операторы цикла 18. Пусть даны целые числа Х(, х2 у х3,х55. Вычислите величину: 19. Пусть х1 = 0,3; хг - -0,3; х, = i 4- sin(x,_|), i - 3,4,... Среди чисел *j, х2,х100 найдите ближайшее к какому-нибудь целому числу. z 1 (i 1У 20. Пусть а, =---4-sin-—'—9 * " U,..., п, где n задано. /4-1 i 4-1 Найдите сумму всех положительных чисел а,. 21. Пусть дано натуральное число п и вещественное число х. Среди чисел: ecos(?‘) .sjn(x3/* j, где k = 1,2..п, найдите ближайшее к какому-нибудь целому числу. 22. Последовательность чисел fl2,...,aioo задана формулой ак =sin2(3£4-5)-cos(fc2-15},£ = 1,2,..., 100. Определите, сколько членов последовательности с номерами 1, 2, 4, 8,16,... имеют значение, меньшее 0,25. 23. Дано вещественное положительное число Ь. Последовательность аь а2> аз,... образована по закону: Найдите первый отрицательный член последовательности. 24. Дано вещественное отрицательное число Ь. Последовательность а2, аз,... образована по закону: ^Ь.а^а^ —U/ = 2, 3, .... Найдите первый неотрицательный член последовательности. 25. При некоторых заданных х, ЛГи £, определяемых вводом, вычислите сумму N слагаемых заданного вида, затем сумму тех слагаемых, которые по абсолют- ной величине больше Е. Для второго случая выполните суммирование для двух значений Е, отличающихся на порядок, и при этом определите количе- ство слагаемых, включенных в сумму. Сравните результаты с точным значе- нием функции, для которой данная сумма определяет приближенное значе- ние при х, лежащем в интервале (-7?, R).
Задания для самостоятельной работы 53 1-3 2-4 (/? = 1). е) d) arctg(x) = х - — + — arcsin(x) = х + — (R “ 1). (R -1). (R -1). (R -1).
54 Глава 5. Операторы цикла t) ех {R = оо). (7? - «). и) (-1)'+| • sin(x) • ln(z • х) i2 0+1)! (-1)' -(cosCx))'72 •/!! 0 + 1)! если i — нечетно если i — четно. ч (—1) -sin'(x) ... fl-3-5-...-z, еслиi — нечетно, w) ai = -— -------—», где z!! = < (z + !)!•/!! [2-4-6-...-z, если i — четно. если i — нечетно, если г — четно. V'» „ _(-1)'+1-1п0-х) ai -----Z-2 ---•
Глава 6 Литерный тип Теоретические вопросы 1. Верно ли, что литерный (символьный) тип относится к скалярным типам данных? 2. Как задается описание переменных литерного типа? 3. Каково множество значений литерного типа? 4. Какой объем памяти требуется для хранения переменной символьного типа? 5. Приведите примеры символьных констант. 6. Верно ли то, что значением литерного типа является множество всех симво- лов кодовой таблицы ПЭВМ? 7. Что такое код символа? 8. Верно ли то, что каждому символу ставится в соответствие целое число в диа- пазоне 0...255? 9. Можно ли к данным символьного типа применять операции отношения? 10. Верно ли, что в программе значения символьного типа должны быть заклю- чены в апострофы? И. Каков результат работы функции ord(c), где с — переменная символьного типа? 12. Верно ли утверждение, что ord(’ 0') = О? 13. Верно ли, что ' а ’ = 'А'? 14. Верно ли утверждение, что если end — литеры, то c<d тогда и только тогда, когда ord(c)<ord(d)? 15. Как работает стандартная функция ch г (1), где 1 — целочисленная переменная? 16. Каковы особенности кодировки цифр, латинских и русских букв? 17. Какие операции применимы к символьным данным? 18. Какие встроенные функции можно применить к символьным данным? 19. Верно ли, что chr(ord(c)) = с, где с — переменная символьного типа?
56 Глава 6. Литерный тип 20. Верно ли, что ord(chrd)) = 1, где 1 — переменная целого типа? 21. Как работают стандартные функции pred(с), succ(c), где с — переменная ли- терного типа? 22. Верно ли, что pred(c) - chr(ord(c)-l), где с— переменная символьного типа? 23. Верно ли, что succ(c) = chr(ord(c)+l), где с— переменная символьного типа? 24. Можно ли переменные и константы символьного типа использовать в вы- ражениях? 25. Можно ли к переменным символьного типа применять стандартные проце- дуры ввода-вывода? Упражнения, задачи, программы 1. Напишите программу, которая по введенному символу определяет его по- рядковый номер, а также предыдущий и последующий символы. 2. Напечатайте все буквы латинского алфавита. 3. Пусть вводится последовательность символов длиной 10. Подсчитайте, сколь- ко среди них цифр? 4. Пусть вводится последовательность символов длиной не более 20. Признак конца последовательности — точка. Верно ли, что в последовательности со- держится четное количество строчных латинских букв? 5. Подсчитайте, сколько раз среди последовательности символов встречается символ, задаваемый вводом. Количество вводимых символов также опреде- ляется вводом. 6. Напечатайте заданную последовательность символов, заменяя каждую точку многоточием. 7. Пусть входной поток литер содержит по крайней мере одну цифру. Считая первую из них началом записи числа (целого или вещественного с фиксиро- ванной точкой), по правилам языка Паскаль выполните преобразование этой записи в число, присвойте его значение переменной и выведите результат. 8. Пусть дана последовательность литер, имеющая вид dx ±d2 ±...±dn (d, — цифры, п > 1), за которой следует точка. Вычислите значение этой алгебраи- ческой суммы. 9. Пусть даны целое число и, символы sp s2,..., sn. Выясните, имеются ли в этой последовательности такие члены, что s. — это запятая, a sl+1 — тире. ♦ 10. Пусть даны символы sp s2,sn. Известно, что символ отличен от восклица- тельного знака и что среди символов s2, s3,... есть по крайней мере один вос- клицательный знак. Пусть sp s2,..., sn — символы данной последовательности, предшествующие первому восклицательному знаку (п заранее неизвестно), а) определите количество пробелов в последовательности sp s2,..., sn; b) выясните, имеется ли среди sp s2,..., sn пара соседних символов но или он; с) выясните, имеется ли среди sp s2,sn пара соседних одинаковых символов.
Упражнения, задачи, программы 57 ♦ 11. Пусть даны целое число и, символы sp s2,sn. Удалите из данной последова- тельности все группы букв, образующих запись abed, то есть получите новую последовательность, не содержащую этих групп литер. 12. Пусть даны целое число п, символы sp s2,..., sn. Преобразуйте последователь- ность sp52, ..., sn, удалив каждый символ звездочки (*) и повторив каждый символ, отличный от звездочки. ♦ 13. Пусть даны целое число п, символы sp s2,..., sn, среди которых есть двоеточие. Получите все символы, расположенные: а) до первого двоеточия включительно; Ь) между первым и вторым двоеточием; если второго двоеточия нет, то по- лучите все символы, расположенные после имеющегося двоеточия. 14. Напечатайте заданный непустой текст, удалив из него все буквы Ь, непосред- ственно перед которыми находится буква с. 15. Заданный текст распечатайте по строкам, понимая под строкой либо очеред- ные 60 литер, если среди них нет запятой, либо часть текста до запятой вклю- чительно. ♦ 16. Пусть в заданный непустой текст входят только цифры и буквы. Определите, удовлетворяет ли он следующему условию: а) текст начинается с некоторой ненулевой цифры, за которой следуют толь- ко буквы, и их количество равно числовому значению этой цифры; Ь) текст начинается с k букв (1 <k< 9), за которыми следует только одна литера — цифра с числовым значением k, с) сумма числовых значений цифр, входящих в текст, равна длине текста. 17. Пусть задан текст, за которым следует точка. Поменяйте все строчные латин- ские буквы, которые встречаются в тексте, на прописные. • "18. Пусть дан непустой текст из заглавных латинских букв, за которым следует точка. Определите, упорядочены ли эти буквы по алфавиту. ♦19. Пусть задан текст, состоящий из слов. Под словом понимается последова- тельность литер, не содержащая пробелов и знаков препинания. Если слово начинается с латинской строчной буквы, замените ее на прописную. 20. Пусть дан текст, каждый символ которого может быть латинской буквой, цифрой или одним из знаков «+», «-», «*». Группой букв будем называть такую совокупность последовательно расположенных букв, которой непо- средственно не предшествует и за которой непосредственно не следует буква. Аналогично определим группу цифр и группу знаков: а) выясните, верно ли, что в данном тексте больше групп букв, чем групп знаков; Ь) найдите число таких групп букв, которые начинаются и заканчиваются одной и той же буквой; с) определите длину самой длинной группы цифр.
Глава 7 Перечислимый тип, ограниченный тип, оператор варианта Перечислимый тип Теоретические вопросы 1. Как определяется перечислимый тип? 2. Какие значения может принимать переменная перечислимого типа? 3. Что представляет собой значение перечислимого типа? 4. Могут ли встречаться одинаковые значения при описании двух различных перечислимых типов? 5. Применимы ли операции сравнения к переменным перечислимого типа. Если да, то каков результат различных операций? 6. Может ли переменная перечислимого типа быть параметром цикла for? 7. Какие стандартные функции применимы к переменным перечислимого типа? 8. В чем отличие показанного ниже перечислимого типа от стандартного типа boolean? type boolean = ( false, true ): 9. Что будет напечатано в результате выполнения цикла в следующем фраг- менте программы: type colour = ( green, yellow, red ); van c: colour; begin for c green to yellow do
Перечислимый тип 59 write( ord( с ) ); end. 10. Измените фрагмент программы из предыдущего вопроса, заменив цикл for циклом while. 11. Ко всем ли значениям перечислимого типа применимы функции succ и pred? 12. Что будет напечатано в результате выполнения следующих программ: program А; begin if true > false then writeln( 'true > false’ ) else writeln( 'true <= false' ) end. program B; type z = ( true, false ); begin if true > false then writeln( 'true > false' ) else writeln( 'true <= false’ ) end. 13. Можно ли к данным перечислимого типа применить стандартные процеду- ры ввода-вывода? 14. Какие средства имеются в языке Паскаль для ввода-вывода значений пере- менных перечислимого типа? Упражнения ♦1. Пусть имеются описания: type day = ( monday, tuesday, Wednesday, thursday, friday, Saturday. Sunday); pmonth = ( m28, m29, m30, m31 ); var wday, weekday: day: kday; pmonth; а) установите, какие значения могут принимать переменные weekday, kday; b) определите, допустимы ли следующие присваивания: weekday : = friday kday := m27 weekday := m30 kday := ord( thursday ) с) вычислите значения выражений или укажите на наличие ошибки; monday < Sunday tuesday « m28 Wednesday <= Wednesday tuesday <> m29 succ( 29 ) pred( Saturday )
60 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта pred( т28 ) ord( tuesday ) ord( tuesday ) + pred( 30 ) succ( kday ) + 1 + ord( pmonth ) d) Что будет напечатано в результате выполнения следующих операторов: wday := succ( friday ); if wday = Sunday then writelnC 'yes' ) else writelnC 'no' ): writelnC ord( monday ) ); for wday : = monday to friday do writeC ord( wday ) ); e) Допустимы ли следующие операции ввода-вывода: readC wday ) writeC monday ) writelnC 'Sunday' ) writelnC ord( Wednesday ) ) writelnC succC tuesday ) ) writelnC ’pmonth»', ord( m28 ) ) f) Допустимы ли следующие заголовки цикла: for wday := monday to Saturday do for wday :» Sunday downto monday do for kday m28 to m30 do for kday 1 to 31 do 2. Пусть дан представленный ниже фрагмент программы. Присвойте перемен- ной t значение true, если месяц ml предшествует месяцу m2, и значение fа 1 se в противном случае. Месяцы ml и m2 принадлежат одному году. type month » (Jan. Feb, Mar, Apr. May, Jun. Jul. Aug. Sep. Oct, Nov. Dec); var ml, m2: month: t: boolean; 3. Пусть дан следующий фрагмент программы: type month » (Jan. Feb. Mar, Apr, May, Jun. Jul, Aug, Sep. Oct, Nov, Dec); var ml, m2: month; i: integer; Присвойте переменной ml: а) название месяца, следующего за месяцем m2 (считайте, что за декабрем идет январь); Ь) название &-го месяца после месяца т; с) название n-го месяца года.
Ограниченный тип 61 Ограниченный тип Теоретические вопросы 1. Верно ли то, что ограниченный тип называется также интервальным типом? 2. Почему интервальный тип называется диапазоном? 3. Верно ли, что интервальный тип используется тогда, когда заранее по смыслу задачи известен диапазон изменения переменных? 4. Что делает компилятор при каждой операции с переменной интервального типа? 5. Могут ли константы, определяющие границы интервального типа, иметь тип real? 6. Верно ли, что значение первой констанТы, определяющей интервальный тип данных, должно быть меньше второй? 7. Какие символы разделяют константы, определяющие тип диапазон? 8. Где определяется тип диапазон? 9. Можно ли границы диапазона задать не значениями констант, а их именами, определенными в разделе описания констант? 10. Какие значения могут принимать переменные типа диапазон? И. Можно ли стандартные функции ord, succ, pred применять к переменным интервального типа? 12. Можно ли к переменным интервального типа применять процедуры ввода- вывода? 13. Как описываются переменные ограниченных типов? 14. Можно ли операцию, применимую к переменной некоторого типа, приме- нять к переменной, относящейся к соответствующему диапазону? 15. Могут ли в одном выражении встречаться переменные, относящиеся к раз- личным диапазонам одного основного типа? 16. Может ли переменная интервального типа фигурировать в левой части опе- ратора присваивания? 17. Может ли переменная интервального типа фигурировать в правой части опе- ратора присваивания? 18. Верно ли, что функции, определенные для базового скалярного типа, могут применяться и к ограниченному типу? Упражнения 1. Пусть даны описания: type Days=l..31; var RabDay, BolnDay: Days; t: boolean; k; Integer:
62 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта а) может ли переменная RabDay принимать значения 1,2,30,0? Ь) могут ли значения переменных RabDay и BolnDay быть одинаковыми? с) допустимы ли представленные ниже операторы? RabDay :» 25 BolnDay := 1 t := RabDay = BolnDay for RabDay := 5 to 30 do k : = ord( RabDay ) - 2 k : = succ( BolnDay ) k := pred( RabDay ) 2. Пусть даны описания: var z: 'a*..’z’; date: 1..31; digit: ’O’..’9': month: 1..12: Допустимы ли операторы? Date := 1:2:31 month := ord( digit ) month := ord(month ) for z := 'a' to 'z' do for month := 6 to 31 do readCmonth ) writeln( z ) 3. Пусть дано описание: var масштаб: ( дюйм, фут. стадия, миля ): Равнозначны ли фрагменты программ? a) for масштаб : = дюйм to миля do преобразовать: Ь) масштаб :« дюйм: while масштаб <= миля do begin преобразовать: масштаб : = succ( масштаб ) end: Оператор варианта Теоретические вопросы 1. Что общего у операторов case и if? 2. Чем различаются операторы case и if? 3. Верно ли, что выражение после служебного слова case называется селекто- ром или переключателем? 4. Верно ли, что список констант называют списком меток? 5. Чем метка в операторе case отличается от обычной программной метки? 6. Может ли список констант в операторе case состоять из одной константы?
Оператор варианта 63 7. Какой символ разделяет константы в списке констант оператора case? 8. Каким служебным словом заканчивается оператор case? 9. Верно ли, что оператор case выполняется следующим образом: сначала вы- числяется значение выражения селектора, затем выполняется тот оператор, константа которого равна значению селектора? 10. Может ли присутствовать ветвь el se в операторе case? 11. Как будет выполняться оператор case, если ни одна из констант не равна те- кущему значению селектора? 12. Какой тип может иметь селектор оператора case? 13. Верно ли, что все константы в списке меток должны иметь тип, совместимый с типом селектора? 14. Как записывается список меток альтернатив, если метки имеют тип диа- пазон? 15. Что означает фраза «константы в альтернативах должны быть уникальными в пределах оператора варианта»? 16. Могут ли в операторе пересекаться метки, тип которых — диапазон? 17. Могут ли метки, тип которых — диапазон, содержать константы, указанные в данной или других альтернативах? 18. Сколько операторов может содержать каждая альтернатива? 19. Каким символом заканчивается каждая альтернатива? 20. Может ли альтернатива быть пустым оператором? 21. Сколько операторов может содержать ветвь el se в операторе case? Упражнения 1. Замените вложенный условный оператор оператором варианта: i f Ch = '1' then N : = 1 else if Ch = * J' then N := 5 else if Ch = 'k' then N := 10 else if Ch = ’I’ then N := 100 else N := 500: 2. Определите значения переменных p и d после выполнения операторов: р := true: d := 1: case k mod 10 of 3. 2. 7. 5: d := k; 1:: 4, 8: begin p :- false: d := 2 end; 9. 6: begin p := false:
64 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта d :» 3 end end; если переменная k имеет значение: а) 6; Ь) 235; с) 71. 3. Что будет напечатано в результате выполнения следующего фрагмента про- граммы: var season: ( winter, spring, summer, autumn ); begin case season of winter: writelnC ’Winter’ ): spring: writelnC 'Spring' ); summer: writelnC 'Summer' ): autumn: writelnC 'Autumn' ) end end; если переменная season принимает значение: a) spring; b) summer; с) зима; d) ord( winter ). 4. Восстановите условие задачи: program Day_Week; var Day: 1..7; begin write ( 'Введите номер дня недели: '); readln ( Day ); case Day of 1: writein ( 'Понедельник' ); 2: writein ( 'Вторник' ); 3: writein (' Среда' ); 4: writein ( 'Четверг' ); 5: writein ( 'Пятница' ); 6: writeln ( 'Суббота' ); 7: writeln ( 'Воскресенье' ) end end. 5. Напишите фрагмент программы для определения величины dayscount, зна- чение которой равно количеству дней в заданном месяце 1998 года. 6. Восстановите условие задачи: program symbols; var n. kO. kl. k2: integer; ch: char:
Упражнения, задачи, программы 65 begin kl := 0: kl := 0: к2 := 0: read( Ch ); while Ch <> ’do begin n := ord(Ch) - ord(’A'); case n of 0: k0 := kO + 1; 1: kl := kl + 1; 2: k2 ;= k2 + 1 end; read( Ch ) end: readin; writeln( kO, kl. k2 ) end. 7. Что будет напечатано в результате работы следующей программы: program WhatIsIt; var kl. k2. k3. n. m: integer; begin m ;= 1989; kl := 0; k2 := 0; k3 := 0; while m <> 0 do begin n := m mod 10; m := m div 10; n ;= n-6; case n of 1; kl := kl + 1; 2; k2 ;= k2 + 1; 3: k3 := k3 + 1 end end; writelnC kl. k2. k3 ) end. 8. Составьте программу вычисления по заданному радиусу и значению пере- менной k площади круга (если k = 1), длины окружности (если k = 2) или объема шара (если k = 3). 9. Пусть текст вводится с клавиатуры. Известно, что в тексте встречаютогком- ментарии, которые расположены между знаками (* и *). Исключите все ком- ментарии из текста. Упражнения, задачи, программы 1. В следующем фрагменте программы по значению переменной типа Country (название страны) присвоить переменной типа Capi tai название столицы этой страны. 3 Зак. 906
66 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта type Country = ( Австрия. Болгария. Греция. Италия. Норвегия. Франция.ФРГ ); Capital = ( Вена. София. Афины. Рим,, Осло. Париж. Бонн ); 2. В следующем фрагменте программы по значению переменной Р (русское на- звание языка программирования) присвоить переменной А английское на- звание этого языка. var Р: (Ада. Бейсик. Модула2. Лисп. Паскаль. Пл1. Фортран ); А: ( ada, basic, pascal. modula2. lisp, pascal, pll. fortran ); 3. В следующем фрагменте программы по значению литеры-цифры d присво- ить переменной п название этой цифры. type название - (ноль. один. два. три. четыре, пять); van d: ’О’..’5': п: название; 4. В следующем фрагменте программы определите 1 — интервал, образованный нотами nl и n2 (nl п2): секунда — это интервал из двух соседних (по кругу) нот (например, ре и ми, си и до), терция — интервал через ноту (например, фа и ля, си и ре) и т. д. type нота = ( до. ре, ми. фа. соль, ля. си ); интервал = ( секунда, терция, кварта. квинта, секста, септима ); var nl, п2; нота; i; интервал; 5. В следующем фрагменте программы замените значение переменной х, озна- чающее некоторую длину в единицах р, значением в метрах. type единица = (дециметр, километр, метр. миллиметр, сантиметр ); длина = real; var х; длина; р; единица; 6. В следующем фрагменте программы выведите название цвета, отвечающее значению переменной с. type цвет » ( черный, белый, синий ); var с: цвет; 7. В следующем фрагменте программы введите литеру и присвойте перемен- ной х соответствующее этой литере значение типа letter. type letter = ( a, b, с, d );
Упражнения, задачи, программы 67 van х: letter; ♦8 . Для значений целого числа k от 1 до 99 напечатайте фразу «мне k лет», учи- тывая при этом, что при некоторых значениях k слово «лет» надо заменить словом «год» или «года». *9 . Для натурального числа k напечатайте фразу «мы нашли k грибов в лесу», согласовав окончание слова «гриб» с числом k. 10. В следующем фрагменте программы определите новый курс К2 корабля, если корабль сначала шел по курсу К1, а затем его курс был изменен согласно при- казу ПР. type курс = ( СЕВЕР. ВОСТОК. ЮГ. ЗАПАД ); приказ = ( ВПЕРЕД. ВЛЕВО. ВПРАВО. НАЗАД ); var KI. К2: курс; ПР; приказ; 11. В следующем фрагменте программы переменной t присвойте значение true, если тройка у, m, d образует правильную дату, и значение false в противном случае (например, 31 июня и т. п.). type месяц = ( янв. фев. мар. апр. май. июн. июл, авг. сен. окт, ноя. дек ); var у; 1900..2000; т: месяц; d; 1..31; t; boolean;. 12. В следующем фрагменте программы по дате d, m, у определите дату следую- щего дня — dl, ml, yl. type месяц = ( янв. фев. мар. апр. май. июн. июл. авг. сен. окт. ноя. дек ); var d. dl; 1..31; m. ml; месяц; у; 1901..2000; yl; 1901..2001; 13. Пусть дан фрагмент программы: type месяц = ( янв. фев. мар. апр. май. июн. июл. авг. сен, окт, ноя. дек ); var k; 1..366; d: 1..31; m: месяц; а) определите к — порядковый номер того дня високосного года, который имеет дату d, m. Ь) определите d, m — дату k-го по счету дня високосного года.
68 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта *14. Пусть дан фрагмент программы: type число = 1..31: месяц = ( янв, фев. мар, апр, май. июн, июл, авг, сен. окт, ноя. дек ): день_недели = ( вс, пн, вт. ср, чт, пт. сб ): var d: число; m: месяц: wdl, wd: день_недели: k: 0..12: Считая, что год високосный и его 1 января приходится на день недели wdl, определите: a) wd — день недели, на который приходится день с датой d, m; b) k — количество понедельников в году, приходящихся на 13-е число. ♦ 15. Пусть значение функции f(n) равно количеству букв в записи числа п рус- скими словами f(l)=4 (один), f(3)=3 (три), f(42)=8 (сорокдва) ит. п. Напеча- тайте все натуральные числа п, меньшие 100, для которых f (п)=п. 16. По дате (месяц и день) рождения определите знак Зодиака. ♦ 17. В старояпонском календаре был принят 60-летний цикл, состоявший из пяти 12-летних подциклов. Подциклы обозначались названиями цвета: зеленый, красный, желтый, белый, черный. Внутри каждого подцикла года носили на- звания животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы, собаки и свиньи (1984 год — год зеленой крысы — был началом очередного цикла). Напишите программу для ввода номера некото- рого года нашей эры и вывода его названия по старояпонскому календарю. ♦ 18. Напечатайте календарь заданного месяца 1998 года, зная, что 1 января 1998 го- да — четверг. * 19. Пусть число записано римскими цифрами: М — 1000, D — 500, С — 100, L — 50, X — 10, V — 5,1 — 1. Выведите его запись арабскими цифрами. ♦20. Пусть на шахматной доске заданы два поля: р1 и р2. Определите, какая из шахматных фигур при установке на поле р 1 бьет фигуру, стоящую на поле р2. Координаты на шахматной доске определяются по горизонтали от а до Л и по вертикали от 1 до 8. Белые фигуры двигаются от 8-й горизонтали к 1-й, а черные — от 1 -й к 8-й.
Глава 8 Регулярные типы данных Теоретические вопросы 1. Дайте определение массива. 2. Верно ли, что массив — это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип? 3. Какие типы данных не допустимы для компонентов массива? Почему? 4. В каком разделе (разделах) программы допустимо описание данных регу- лярного типа? 5. Где и как определяется общее число элементов массива? 6. Можно ли размерность массива определить с помощью типа диапазон? 7. Дайте определение индекса. Какие типы данных можно использовать при описании индекса? 8. Может ли левая граница индексов массива быть меньше правой? 9. Может ли левая граница индексов массива быть положительной? 10. Может ли левая граница индексов массива быть равной нулю? 11. Может ли левая граница индексов массива быть отрицательной? 12. Как осуществляется доступ к каждому элементу массива? 13. Когда индекс элемента в массиве совпадает с порядковым номером этого эле- мента? 14. Верно ли, что название регулярный тип массивы получили за то, что в них объединены логически однородные элементы, упорядоченные по индексам, определяющим положение каждого элемента в массиве? 15. Что называется базовым типом? 16. Верно ли, что могут существовать массивы массивов? 17. Верно ли, что элементами массива могут быть данные любого типа, включая структурированные? 18. Может ли индекс в правильно составленной программе выходить за пределы, определенные типом диапазон?
70 Глава 8. Регулярные типы данных 19. Может ли индекс быть выражением целого типа? 20. Может ли индекс быть выражением вещественного типа? 21. Может ли индекс быть выражением любого порядкового типа? 22. Какой массив называется одномерным? 23. Какой массив называется двумерным? 24. Какой массив называется и-мерным? 25. Верно ли, что одномерный массив соответствует понятию линейной табли- цы (вектора)? 26. Верно ли, что двумерный массив соответствует понятию прямоугольной таб- лицы (матрице, набору векторов)? 27. Существуют ли ограничения на размерность массива? 28. Можно ли в описании массива использовать предварительно определенные константы? 29. В какой последовательности располагаются в памяти элементы одномерно- го массива? 30. Верно ли, что элементы с большими значениями индекса хранятся в боль- ших адресах памяти? 31. Верно ли, что двумерные массивы располагаются в памяти таким образом, что второй индекс изменяется быстрее, чем первый? 32. Верно ли, что матрица расположена в памяти по строкам? 33. Всегда ли работа с массивом сводится к работе с его компонентами? 34. Обязательно ли количество элементов массива должно быть фиксирован- ным, то есть определяться при трансляции программы? 35. Может ли процедура read(x) ввести весь массив х целиком? 36. Можно ли с помощью стандартной процедуры wr 11е (х) вывести весь массив х целиком? 37. Как можно сымитировать работу с массивом переменной длины? 38. Возможно ли следующее описание: var a: array[integer] 39. Предложите способы вывода элементов двумерного массива. Векторы. Задачи, программы 1. Используя следующий фрагмент: const п = 41; van х: array El..n] of real: у: real: напишите программы для вычисления перечисленных формул:
Векторы. Задачи, программы 71 а) у - Vi xi 'х2 I > Ь) у = max xz; с) г/ = Л -х2 +х3 -...-х^ + хл; d) У = *iX„+*2*n-\+- + xnxx-, е)у = xj2 + х3 + Х5 +... + хл; О У = *п (*п + *„-! )(*л + *л-1 + *и-2 ) • • • (*л + • • • + Xj ) . 2. С помощью следующего фрагмента программы по заданному массиву С полу- чите массив В, используя правило: элементу В[1 ] присвоить true, если С[1 ] — цифра, и fа 1 se — в противном случае. const m - 50; var С: array [0..m] of char; B; array [0..m] of boolean; 3. Пусть дан фрагмент программы с заданными массивами Пол и Вес: type имя = ( Валя. Гена, Женя, Коля, Маша, Нина. Саша, Таня, Федя, Шура ); var Пол array [имя] of ( муж. жен ); Вес ; array [имя] of 30..150; .И ; имя; Ср ; real; а) определите имя самого полного мужчины И; Ь) определите средний вес женщин Ср. 4. С помощью следующего фрагмента программы зашифруйте текст t, заменив в нем каждую литеру значением элемента массива к, индексом которого явля- ется эта литера. type текст = array [1..72] of char; шифр = array [char] of char; var t; текст; k; шифр; 5. Пусть дано 100 целых чисел. Распечатайте их в обратном порядке по 6 чисел в строке. 6. Пусть дано 50 чисел. Определите, сколько среди них отличных от последне- го числа. 7. Пусть дано 100 чисел. Напечатайте сначала все отрицательные из них, за- тем — все остальные. 8. По заданным вещественным числам a0,al,...9a20,t вычислите значение мно- гочлена Дго*20 + Я|9х19 +... + AjX + а0 и его производной в точке t. 9. Напечатайте все буквы русского алфавита.
72 Глава 8. Регулярные типы данных 10. Пусть вводится последовательность символов, длина которой не больше на- перед заданного числа п_тах. Замените каждую из рядом стоящих групп точек одной точкой. Решите эту задачу в двух вариантах: а) полученная последовательность просто выводится на печать, а массив, в котором хранится исходная последовательность, не изменяется; ♦Ь) преобразованная последовательность должна заместить исходную в мас- сиве. 11. Известно, что длина последовательности символов не превышает наперед заданного числа п_тах. Подсчитайте максимальное количество идущих под- ряд пробелов. 12. Пусть дано натуральное число п и вещественные числа ах,..., ап. В последова- тельности Дь..., ап все отрицательные члены увеличьте на 0,5, а все неотрица- тельные, меньшие среднего арифметического, замените на 0,1. 13. Пусть даны натуральное число п, целые числа ..., ап. Получите сумму по- ложительных, число отрицательных и число нулевых членов последователь- ности ах,ап, ♦ 14. Пусть вводится последовательность символов, длина которой не превыша- ет 80. Напечатайте те русские буквы (в алфавитном порядке), которые встре- чаются в заданной последовательности. 15. Пусть дан текст из 80 литер. Напечатайте сначала все цифры, входящие в не- го, а затем все остальные литеры, сохраняя при этом взаимное расположение литер в каждой из этих двух групп. 16. Пусть дан текст, содержащий от 1 до 70 букв. Напечатайте буквы текста в об- ратном порядке. ♦ 17. Пусть дан непустой текст из прописных русских букв, за которым следует точка. Определите, упорядочены ли эти буквы по алфавиту. ♦ 18. Пусть дан текст, за которым следует восклицательный знак. Замените все прописные русские буквы, встречающиеся в тексте, строчными. * 19. Пусть дан текст, состоящий из слов. Под словом понимается последователь- ность литер, не содержащая пробелов и знаков препинания. Напечатайте все слова, состоящие из неповторяющихся символов. 20. Пусть вводится последовательность символов. Напечатайте те строчные ла- тинские буквы, которые не вошли во введенную последовательность. ♦ 21. Пусть дан непустой текст из цифр, за которым следует точка. Напечатайте цифру, наиболее часто встречающуюся в этом тексте (если таких цифр не- сколько, напечатайте любую из них). ♦ 22. Пусть даны целые числа ах, ..., аюо. Получите новую последовательность из 100 целых чисел, заменяя а, нулями, если значение \at\ не равно максималь- ному из ai,..., йюо, и заменяя а, единицей — в противном случае (г = 1,..., 100). ♦ 23. Пусть даны целые числа аь..., а25, Ьх,b2s. Преобразуйте последовательность bi,..., 625 по правилу, согласно которому если а, < 0, то bi увеличивается в 10 раз, иначе bi заменяется нулем (i - 1,..., 25).
Векторы. Задачи, программы 73 24. Пусть даны вещественные числа аьа25. Требуется умножить каждый член последовательности a, (i=l,25) на квадрат ее наименьшего члена, если а, > О, и на квадрат ее наибольшего члена, если ai< 0. 25. С помощью следующего фрагмента программы вычислите сумму s тех эле- ментов массива х, индексы которых совпадают со значениями элементов мас- сива а (я, * а, при i * j). var х: array [1..100] of real; a: array [1..30] of 1..100; s: real; 26. Пусть даны целые числа ab ..., £99. Получите новую последовательность, вы- бросив из исходной максимальный и минимальный члены. 27. Пусть даны целые числа аь ..., ап, каждое из которых отлично от нуля. Если в последовательности отрицательные и положительные члены чередуются, то ответом должна служить сама исходная последовательность. Иначе — по- лучите все отрицательные члены последовательности, сохранив порядок их следования. 28. Пусть задан текст размером не более одной строки. Напечатайте, сколько раз в тексте встречается каждая буква латинского алфавита. 29. Пусть дана последовательность из 100 различных целых чисел. Найдите среднее арифметическое чисел этой последовательности, расположенных между максимальным и минимальным числами (в сумму включить и оба этих числа). 30. Пусть даны координаты п точек на плоскости: хь у\,хп, уп (и - 20). Найдите номера двух точек, расстояние между которыми наибольшее (считайте, что такая пара точек единственная). 31. С помощью следующего фрагмента программы напечатайте литеры мас- сива s в виде таблицы: ЗД52...5л_25л_] const п ж 20; var s; array [1..n] of char; 32. Используя следующий фрагмент программы, преобразуйте массив х по ука- занному ниже правилу ( хк — значение &-го элемента массива после преобра- зования): const п = 100; var х: array [1..n] of real;
74 Глава 8. Регулярные типы данных а) хк = max х, при 1 < i < k; b) элементы массива расположите в обратном порядке; с) х} = xbx' = хп,х'к =(**_! +xk +x*+i)/3 приб = 2, 3,n-1; d) элементы массива циклически сдвиньте на одну позицию влево: х' = Х], = xk+i при k - 1, 2,п-1; е) элементы массива циклически сдвиньте на две позиции влево. 33. Пусть в массиве содержатся результаты измерений температуры воздуха, ко- торые проводились ежедневно в течение декабря месяца. Определите: а) среднемесячную температуру декабря; Ь) сколько раз температура была выше 0°С; с) день, когда температура была наибольшей; d) день, когда первый раз температура поднялась выше нуля, и увеличьте эту температуру на 1°С; е) любой из самых холодных дней декабря; f) сколько дней в декабре температура была выше средней; g) день, когда температура была ближе всего к средней температуре в декабре; h) минимальную температуру второй декады декабря; i) минимальную температуру тех дней декабря, которые следуют после по- следнего из самых теплых дней в этом месяце; j) температуры любого из самых холодных и самых теплых дней и поменяйте их местами; к) среднюю температуру тех дней, которые предшествуют первому из самых холодных дней в декабре; 1) любые два самых холодных дня; ш) сколько раз в декабре температура меняла знак; п) первую из минимальных температур и вытесните ее на последнее место, сдвинув все остальные к началу массива. ♦34. Используя следующий фрагмент программы, преобразуйте массив х по ука- занному ниже правилу, воспользовавшись массивом у как вспомогательным: var х. у: array [1..70] of real: k: 1..69: а) все отрицательные элементы массива х перенесите в его начало, а все ос- тальные — в конец, сохраняя исходное взаимное расположение как среди отрицательных^ так и среди остальных элементов; Ь) элементы массива х циклически сдвиньте на к позиций влево. ♦35. Пусть элементы массива х упорядочены по неубыванию, а элементы мас- сива у — по невозрастанию. Используя следующий фрагмент программы, объедините элементы этих двух массивов в один массив z так, чтобы они ока- зались упорядоченными по неубыванию:
Векторы. Задачи, программы 75 const к = 50; m = 20; п = к + m; var х: array [1. .к] of real; у; array [1..m] of real; z; array [1..n] of real; ♦36. Пусть даны вещественные числа ..., х101 д ..., у101. Получите последова- тельности jq, •••, *п)1, Я, Ди , преобразовав для получения члены х,, у, по правилу: если они оба отрицательны, то каждый из них увеличива- ется на 1,25; если отрицательно только одно число, то отрицательное число заменяется его квадратом; если оба числа неотрицательны, то каждое из них заменяется средним арифметическим исходных значений. 37. Пусть даны вещественные числа 01, ..., а3о. Получите: а) шах(б11+азо, 02+029,015+01б); Ь) min(0i0i6, 02017, ..., 0150зо)« 38. Пусть даны вещественные числа 0Ь ..., 020. Преобразуйте эту последователь- ность по правилу: большее из а, и 0ю+1 (i = 1,..., 10) примите в качестве нового значения 0,, меньшее — в качестве нового значения ш 39. Пусть даны целые числа 0Ь..., ап. Если в данной последовательности ни одно четное число не расположено после нечетного, то напечатайте все отрица- тельные члены последовательности, иначе — все. положительные. Порядок следования чисел в обоих случаях замените обратным. 40. Пусть дан фрагмент программы: var к: 0..9999: d: array [1..4] of ’О’..’9’: ♦ а) запишите в массив d цифры числа к; Ь) получите целое к, составленное из цифр массива d. ♦ 41. Напечатайте заданный текст из 100 литер, удалив из него повторные вхож- дения каждой литеры. ♦ 42. Определите, сколько различных литер входит в заданный текст, содержащий не более 100 литер и оканчивающийся точкой (в сам текст точка не входит). 43. В массиве из 20 целых чисел найдите наибольший элемент среди отрицатель- ных (считайте, что такой элемент один) и поменяйте его местами с первым элементом. 44. Пусть даны натуральные числа п, 0Ь ..., ап. Определите количество членов аь последовательности 0Ь..., ап: а) являющихся нечетными числами; Ь) кратных 3 и не кратных 5; с) являющихся квадратами четных чисел; d) удовлетворяющих условию: а < ; 2
76 Глава 8. Регулярные типы данных е) удовлетворяющих условию 2к < ak < k\\ f) имеющих четные порядковые номера и являющихся нечетными числами. 45. С помощью следующего фрагмента программы присвойте каждому элемен- ту массива КД значение, равное количеству дней в соответствующем месяце високосного года. type месяц = ( янв. фев. мар, апр. май. июн, июл, авг. сен. окт, ноя. дек ); var КД: array [месяц] of 28..31; 46. Пусть даны вещественные числа ах,..., ап1 Ьх,..., Ьп. Вычислите произведение (al+bn){a2+bn_i)...{an+bl). 47. Используя следующий фрагмент, напишите программы для решения пере- численных ниже задач: const п = 40; var х: array [1..nJ of integer; у, k: integer; t: boolean; ♦ а) переменной t присвоить значение true, если элементы массива х упорядо- чены по возрастанию, иначе значение fа 1 se; ♦b) переменной t присвоить значение true, если в массиве х нет нулевых эле- ментов и при этом положительные элементы чередуются с отрицатель- ными, иначе значение false; с) переменной к присвоить либо номер первого вхождения у в массив х, либо число п+1, если у не входит в х; ♦ d) вычислить у = х1 + х1х2 + х1х2х3 + ••• + *1х2...хда, где т — либо номер пер- вого отрицательного элемента массива х, либо число п, если в массиве х нет отрицательных элементов. 48. Пусть дан текст из 80 литер. Определите, симметричен ли он, то есть читает- ся ли он одинаково слева направо и справа налево. ПРИМЕЧАНИЕ В последующих шести задачах рекомендуете^ не использовать вспомога- тельный массив. 49. Пусть дан массив из N элементов. Каждый отрицательный элемент замените полусуммой тех двух элементов, которые стоят рядом с ним справа и слева. 50. Пусть дана последовательность из Nэлементов. Увеличьте ее, вставив после каждого минимального элемента максимальный. 51. Пусть дана последовательность из У элементов. Уменьшите ее, удалив пер- вый из отрицательных и минимальный из положительных (считайте, что та- кой элемент один) и сдвинув все остальные к началу. ♦ 52. Пусть дана последовательность из N элементов. Уменьшите ее, удалив все минимальные и максимальные элементы и сдвинув все остальные к началу последовательности.
Векторы. Задачи, программы 77 53. Пусть дана последовательность из Nэлементов. Увеличьте ее, вставив после каждого элемента такой же. 54. Замените каждый элемент массива средним арифметическим всех предшест- вующих ему элементов. 55. С помощью следующего фрагмента программы по массиву t, где^указана тем- пература каждого дня некоторого невисокосного года, определйте m — назва- ние месяца с наибольшей среднемесячной температурой: type месяц = (янв. фев. мар. апр. май. июн, июл. авг, сен. окт. ноя. дек); var t : array [1..365] of real; m ; месяц; 56. Пусть даны вещественные числа аи ..., а15. Получите: 57. Пусть даны вещественные числа а1954, а1955,..., а2ооз ~ количество осадков (в мил- лиметрах), выпавших в Воронеже в течение последних 50 лет. Вычислите среднее количество осадков и отклонение от среднего для каждого года. 58. Пусть даны вещественные числа аи..., а20. Получите числа Ьиi20, где 6, — среднее арифметическое всех членов последовательности аи ..., а20, кроме я, (г-1,2,..., 20). 59. Пусть даны натуральные числа n3Q, вещественные числа хи..., х30. Вычи- слите: M^+... + ЛзоХзо «i + ... + пзо 60. Используя следующий фрагмент программы, упорядочьте массив х по не- убыванию (то есть переставьте его элементы так, чтобы для всех k выполня- лось условие xk < хЬ1) в соответствии с перечисленными ниже алгоритмами сортировки (упорядочения): const п = 100; var х : array [1..n] of real; ♦а) сортировка выбором — отыскивается максимальный элемент и перено- сится в конец массива; затем этот метод применяется ко всем элементам, кроме последнего (он уже находится на своем месте) и т. д.; Ь) сортировка обменом (пузырьковая сортировка) — последовательно срав- ниваются пары соседних элементов xk и (k = 1, 2,3, ..., п-1), и если хь>хы> то они переставляются; тем самым наибольший элемент ока- зывается на своем месте в конце массива; затем этот метод применяется ко всем элементам, кроме последнего, и т. д.;
78 Глава 8. Регулярные типы данных ♦ с) сортировка вставками — пусть первые k элементов массива уже упорядо- чены по неубыванию; берется (k + 1)-й элемент и размещается среди пер- вых k элементов так, чтобы упорядоченными оказались уже k + 1 первых элементов; этот метод применяется при k от 1 до п - 1. ♦61. Пусть элементы массива х упорядочены по возрастанию. С помощью пред- ставленного ниже фрагмента программы присвойте переменной к номер эле- мента массива х, равного числу у, или 0, если такого элемента нет. При этом использовать следующий метод двоичного (бинарного) поиска: сравнить у со средним элементом массива (или элементом около середины); если эти числа равны, поиск завершается, если же у меньше среднего элемента, то у надо искать в левой половине массива, а иначе — в правой. Далее к выбранной половине применяется этот же алгоритм. const п = 500: var х : array [l..n] of integer: у : integer: k : 0..n: 62. Пусть даны две последовательности по 30 целых чисел в каждой. Найдите наименьшее среди тех чисел первой последовательности, которые не входят во вторую последовательность, считая, что хотя бы одно такое число есть. ♦63. Пусть дана последовательность из 20 целых чисел. Определите количество инверсий в этой последовательности (то есть таких пар элементов, в кото- рых большее число находится слева от меньшего: х, > Xj при i <j). 64. Пусть дан текст из строчных латинских букв, за которым следует точка. Напе- чатайте в алфавитном порядке все буквы, которые входят в этот текст по од- ному разу. ♦65. Пусть даны натуральное число п и символы st,..., s„, среди которых есть двое- точие. Получите все символы: а) расположенные до первого двоеточия включительно; Ь) расположенные после первого двоеточия; с) расположенные между первым и вторым двоеточием; если второго двое- точия нет, то получите все символы, расположенные после единственно- го имеющегося двоеточия. 66. Пусть даны натуральное число п и символы ..., sn. Исключите из последо- вательности ..., sn группы символов, расположенные между открывающей и закрывающей скобками. Сами скобки тоже должны быть исключены. Пред- полагается, что внутри каждой пары скобок нет других скобок. ♦ 67. Пусть даны вещественные числа аи ..., ап. Если в результате замены отрица- тельных членов последовательности aif..., ап их квадратами члены будут обра- зовывать неубывающую последовательность, то получите сумму членов ис- ходной последовательности; в противном случае получите их произведение. * 68. Пусть даны вещественные числа rif..., г17, среди которых заведомо есть как отри- цательные, так и неотрицательные. Получите#^ +... +xsys, гдех1?..., хр — отри-
Векторы. Задачи, программы 79 дательные члены последовательности rt,г17, взятые в порядке их следования, Уь •••> Уч — неотрицательные члены, взятые в обратном порядке, s = min(p, q). 69. Пусть даны вещественное число а и массив вещественных чисел Q[l...n]. Выберите два числа b и с из массива Q таким образом, чтобы числа a, i, с мог- ли быть длинами сторон: ♦ а) треугольника (если таких чисел в массиве Q несколько, выберите первые йз них); ♦ Ь) треугольника (если таких чисел в массиве Q несколько, выберите послед- ние из них); вычислите площадь этого треугольника; ♦ с) треугольника; подсчитайте, сколько пар таких чисел а и b в массиве Q; * d) остроугольного треугольника; вычислите его площадь; * е) равнобедренного тупоугольного треугольника; вычислите его площадь; ♦ f) треугольника, площадь которого максимальна среди всех площадей; ♦ g) прямоугольного треугольника, площадь которого максимальна среди всех площадей; ♦ h) треугольника; определите вид этого треугольника: равносторонний, рав- нобедренный, разносторонний; * i) треугольника; определите вид этого треугольника: прямоугольный, тупо- угольный, остроугольный; * j) треугольника, площадь которого максимальна среди всех площадей; опре- делите вид этого треугольника: равносторонний, равнобедренный, разно- сторонний, прямоугольный, тупоугольный, остроугольный. ♦70. Используя следующий фрагмент программы, выберите из массива А подмас- сив В с заданной суммой элементов s или сообщите, что такого подмассива не существует: const m = 50: var А : array Cl..m] of Integer: В : array of integer: S : integer: ‘71.Используя следующий фрагмент программы, введите: type слово » array Cl..5] of char: список » array [1..60] of слово: var С : список: а) все слова из списка С, отличные от слова hello\ b) то слово из списка С, которое лексикографически (по алфавиту) предшест- вует всем другим словам этого списка (считайте, что все слова различны); с) текст, составленный из последнйх литер всех слов списка С; d) все слова из списка С, содержащие ровно две буквы d. 72. Пусть во входном файле input задано от 1 до 6 букв, за которыми следует точка. I
80 Глава 8. Регулярные типы данных Используя следующий фрагмент программы, введите эти буквы и запишите их в начало строки s, дополнив конец этой строки пробелами: var s : array Cl..6] of char; 73. Используя следующий фрагмент программы, определите, сколько раз (к) в строку s входят литеры, перечисленные в константе v: const v = 'aeiou'; type строка = array [1..200] of char; var s: строка; k 0..200; ♦74. Пусть дан текст из 60 литер. Напечатайте только строчные русские буквы, входящие в этот текст. ♦75. Пусть дан текст из строчных русских букв, за которым следует точка. Напе- чатайте этот текст заглавными русскими буквами. 76. Известно, что в начале строки s находится не более 40 латинских букв, за кото- рыми следуют пробелы. Напечатайте эту строку, предварительно преобразо- вав ее так, как показано ниже, и используя следующий фрагмент программы: type строка = array [1..80] of char; var s ; строка; ♦ а) все последовательности abc замените последовательностями def\ ♦ b) удалите первое вхождение да, если такое есть (образовавшуюся «дыру» заполните последующими буквами, а в конец добавьте пробел); ♦ с) удалите все вхождения th\ d) замените последовательностью ks первое вхождение х, если такое есть; е) после каждой буквы q добавьте букву и; ♦ f) замените все последовательности ph буквой /, а все последовательности е d — последовательностями ing. Задания для самостоятельной работы 1. Пусть даны вещественные числа xif х2,..., хп, yif у2,уп, rlf r2t..., гп. Выясните, есть ли на плоскости точка, принадлежащая всем кругам clf с2,..., с„, где с, имеет центр с координатами х„ г/, и радиус г,. 2. Пусть даны вещественные числа aif а2,..., а2п. Эти точки определяют п интерва- лов числовой оси (aif а2), (а3, (а2п_ь а2п). Является ли интервалом объеди- нение этих интервалов? Если да, то указать концы объединенного интервала. 3. Пусть даны вещественные числа alf а2,..., а2п. Эти точки определяют п интер- валов числовой оси (at, а2), (дз> яД •••> (я2л-1, а2п)- Имеются ли точки числовой оси, принадлежащие по крайней мере трем каким-нибудь из данных интер- валов? Если да, то выести любую из этих точек.
Матрицы 81 4. Пусть даны целые числа аи a2f..., ап. Пусть М — наибольшее, т — наимень- шее из них. Получите в порядке возрастания все целые числа из интервала (ти, М), которые не входят в последовательность аи а2,ап. 5. Пусть даны координаты центров п окружностей и их радиусы. Определите число пересекающихся окружностей. 6. Присвойте переменной t значение true, если в некотором массиве нет нуле- вых элементов и при этом положительные элементы чередуются с отрица- тельными, в противном случае присвойте значение false. 7. Пусть имеются десять гирь весом aif а2,aiQ. Обозначим через ck число спо- собов, которыми можно составить вес k, то есть ck — это число решений урав- нения а2х2+...+ Я1о*1о= k, где xi может принимать значения 0 или 1 (i - 1,..., 10). Получите Ср с2,..., с10. 8. Прямая на плоскости может быть задана уравнением ах + by = с, где а, b од- новременно не равны нулю, а, Ь, с — целые. Пусть даны коэффициенты не- скольких прямых ар bp си а2, b2, с2, ...,а„, Ь„, с„. Определите, имеются ли среди этих прямых совпадающие или параллельные. 9. Прямая на плоскости может быть задана уравнением ах + by = с, где a, b qr- новременно не равны нулю, a, Ь, с — целые. Пусть даны коэффициенты не- скольких прямых ait Ьр Ср а2, b2, с2,..., ап, Ьп, с„. Определите, имеются ли среди этих прямых три, пересекающиеся в одной точке. 10. Пусть даны натуральное число п, целые числа а, Хр х2,..., х„. Если в последо- вательности Хр х2,..., хп есть хотя бы один член, равный а, то получите сумму всех членов, следующих за первым таким членом, иначе найдите минималь- ный среди нечетных чисел последовательности Хр х2,..., х„. И. Пусть даны целые чйсла а{) а2, ..., ап, среди которых могут быть повторяю- щиеся. Составьте новый массив из чисел, которые входят в последователь- ность по одному разу. 12. Пусть даны целые числа аи а2, ..., ап, среди которых могут быть повторяю- щиеся. Составьте новый массив из чисел, взятых по одному из каждой груп- пы равных членов данной последовательности. 13. Пусть даны натуральные числа k, и, вещественные числа ар а2,..., а^. Получите последовательность min^, а2,..., ak), min(aH, а*+2,..., a2k\..., ..., а^). 14. Пусть даны натуральные числа k, п, вещественные числа аи а2,..., а^. Получите последовательность max(at, а2,..., ak), max(ak+p ak+2,..., а2А),..., max(a^„_1)+i,..., а^). 15. Пусть даны натуральные числа и, вещественные числа ау а2,..., а^. Получите min(#i+ 472+...“Ь ak, а^^ д^+2+...“Ь 02^..., a^n_^+i +...+ 0^). 16. Пусть даны натуральные числа k, п, вещественные числа аи а2,..., а^. Получите max(fli+ а2+...+ ak, 0^+1+ а^+2+...+ a2kf..., ak(n_^+i +... + akn). 17. Пусть даны натуральные числа А, и, вещественные числа аи а2)аы. Получите min(max(ah а2,ak), тах(лж+ ak+2+...+ a2k),..., тах(яЛ(л_1)+1+...+ 0^)).
82 Глава 8. Регулярные типы данных 18. Пусть даны натуральные числа Л, и, вещественные числа аи а2,..., akn. Получите max(min(a„ а2,a*), min(aH1+ а*+2+...+ аи),min(at(„_1)+1+...+ а*л)). 19. Пусть дана последовательность чисел. Все ее элементы, не равные нулю, пе- ренесите, сохраняя их порядок, в начало данной последовательности, а нуле- вые — в конец. 20. Пусть числовая прямая разбита на произвольные отрезки точками ait а2,..., ап. Выясните, какому из отрезков принадлежит данная точка х. 21. В массиве из п элементов подсчитайте количество четверок aif ai+{, ai+2, ai+3 идущих подряд членов, в которых: а) все члены равны; Ь) все члены различны. 22. Произвольный выпуклый многоугольник задан координатами своих вершин на плоскости. Найдите самую длинную диагональ данного многоугольника. 23. Вычислите площадь произвольного выпуклого многоугольника, заданного координатами своих вершин на плоскости, разбив многоугольник на тре- угольники. Матрицы Задачи, упражнения 1. Пусть даны целые числа , а2, а3. Получите целочисленную матрицу В раз- мером 3x3, для которой Ьу = at - Зау. 2. Пусть даны вещественные числа aif..., b2Q. Получите вещественную матрицу С размером 10 х 20, для которой су = а, /(1 + Ь}). 3. Получите целочисленную матрицу А размером 8 х 14, для которой atJ - i+2f. 4. Получите вещественную матрицу А размером 23 х 17, для которой: у ♦5. Пусть дана вещественная матрица А. Получите матрицу Л'вВ*С, где
Матрицы 83 6. Получите вещественную матрицу А размером 7x7, первая строка которой задается формулой = 2j+3 (j = 1,7), вторая строка — формулой а каждая следующая строка есть сумма двух предыдущих. 7. Пусть дано натуральное число п и вещественная матрица размером п х 9. Най- дите среднее арифметическое элементов: а) каждого из столбцов; Ь) каждого из столбцов с четным номером. 8. Пусть дано натуральное число п. Выясните, сколько положительных элемен- тов содержит матрица А размером п х п при выполнении перечисленных ниже условий: a) aj = sin(f + j/2); b) а.. = cos(z2 + л • j); 9. Пусть дана вещественная матрица размером п х т, в которой не все элементы равны нулю. Получите новую матрицу путем деления всех элементов дан- ной матрицы на ее наибольший по модулю элемент. 10. Пусть даны натуральное число т, целые числа аиат и целочисленная квад- ратная матрица порядка т. Строку с номером i назовем отмеченной, если а, > 0, и неотмеченной — в противном случае: а) все элементы, расположенные в отмеченных строках матрицы, преобра- зуйте по правилу: отрицательные элементы заменить на -1, положитель- ные — на 1, а нулевые оставить без изменения; Ь) подсчитайте число отрицательных элементов матрицы, расположенных в отмеченных строках. И. Пусть дана вещественная квадратная матрица порядка 12. Замените нулями все ее элементы, расположенные на главной диагонали и выше ее. 12. Пусть даны вещественные числа xlf..., х8. Получите квадратную матрицу по- рядка 8, образованную по правилу:
84 -13. 14. 15. 16. 17. 18. 19. 20. 21. Глава 8. Регулярные типы данных Пусть дана вещественная матрица размером т х п. Определите числа alf..., ат, равные соответственно: а) суммам элементов строк; Ь) произведениям элементов строк; с) наименьшим значениям элементов строк; d) значениям средних арифметических элементов строк; е) разностям наибольших и наименьших значений элементов строк. Все элементы с наибольшим значением в данной целочисленной квадратной матрице порядка 10 замените нулями, если эти элементы не принадлежат первой или последней строкам. Пусть дана вещественная матрица размером 6x9. Найдите среднее арифме- тическое наибольшего и наименьшего значений ее элементов, расположен- ных ниже главной диагонали. Пусть дана вещественная матрица размером 18 х п. Найдите значение наиболь- шего по модулю элемента матрицы и укажите его местоположение в матрице. В данной вещественной квадратной матрице порядка п найдите сумму эле- ментов строки, в которой расположен элемент с наименьшим значением. Предполагается, что такой элемент единственный. В данной вещественной матрице размером 6x9 поменяйте местами строку, со- держащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением. Предполагается, что эти элементы единственные. В данной квадратной целочисленной матрице порядка 17 укажите индексы всех элементов с наибольшим значением, не принадлежащих главной и по- бочной диагоналям. Пусть дана вещественная матрица размером п х ти, все элементы которой раз- личны. В каждой строке выберите элемент с наименьшим значением, затем среди этих чисел выберите наибольшее. Укажите индексы найденного эле- мента. Пусть дана вещественная матрица размером п х т. Получите последователь- ность by..., bn, где bk — это: а) наибольшее из значений элементов А-й строки; Ь) сумма наибольшего и наименьшего из значений элементов й-й строки; с) количество отрицательных элементов в &-й строке; d) произведение квадратов тех элементов &-й строки, модули которых при- надлежат отрезку [1; 1,5].
Матрицы 85 22. Пусть дана целочисленная квадратная матрица порядка 8. Найдите наимень- шее из значений элементов столбца, который обладает наибольшей сум- мой модулей элементов. Если таких столбцов несколько, надо взять первый из них. 23. Пусть дано натуральное число п и целочисленная квадратная матрица по- рядка п. Получите by ..., Ью где 6, — это: а) значение первого по порядку положительного элемента i-й строки (если таких элементов нет, то принять 6.- 1); Ь) сумма элементов, расположенных за первым отрицательным элементом в i-й строке (если все элементы строки неотрицательны или отрицатель- ный элемент на последнем месте, то принять Ь.- 100); с) сумма элементов, предшествующих последнему отрицательному элементу i-й строки (если все элементы строки неотрицательны, то принять fe, = -1). 24. Пусть дана целочисленная квадратная матрица порядка п. Найдите номера строк: а) все элементы которых — нули; Ь) элементы в каждой из которых одинаковы; с) все элементы которых четны; d) элементы каждой из которых образуют монотонную последовательность (монотонно убывающую или монотонно возрастающую); е) элементы которых образуют симметричные последовательности. 25. Пусть даны натуральное число п, вещественное число х, вещественная мат- рица размером п х 2п. Получите последовательность by..., bn из нулей и еди- ниц, где 6, = 1, если элементы i-й строки матрицы не превосходят х, и &, = 0 в противном случае. 26. Пусть дана вещественная квадратная матрица порядка п. Постройте после- довательность вещественных чисел а{, ..., ап по правилу: если в i-й строке матрицы элемент, принадлежащий главной диагонали, отрицателен, то эле- мент я, равен сумме положительных элементов i-й строки, в противном слу- чае а, равен произведению отрицательных элементов i-й строки. 27. Пусть дана вещественная квадратная матрица порядка 10. В строках с отри- цательным элементом на главной диагонали найдите: а) сумму элементов; Ь) наибольший из элементов. 28. Пусть дана вещественная квадратная матрица порядка п. Относительно эле- ментов, расположенных в строках, начинающихся с отрицательного элемен- та, найдите суммы тех из них, которые расположены соответственно ниже, выше и на главной диагонали. 29. Пусть дана вещественная квадратная матрица порядка 9. Получите целочи- сленную квадратную матрицу того же порядка, в которой элемент равен единице, если соответствующий ему элемент исходной матрицы больше
86 Глава 8. Регулярные типы данных -30. •31. -32. •33. •34. элемента, расположенного в его строке на главной диагонали, и равен нулю — в противном случае. Пусть дана вещественная квадратная матрица порядка п. Получите Х|ХЛ +*2xn-i + ••• + *„*!, где хк — наибольшее значение элементов k-й строки данной матицы. Пусть даны натуральное число п > 2 и вещественная квадратная матрица порядка п. Постройте последовательность by..., Ьп из нулей и единиц, в кото- рой bi - 1 тогда и только тогда, когда: а) элементы i-й строки матрицы образуют возрастающую последователь- ность; Ь) элементы i-й строки матрицы образуют возрастающую или убывающую последовательность. Пусть дана целочисленная квадратная матрица порядка 15. Выясните, име- ются ли в матрице ненулевые элементы, и если имеются, то укажите индексы: а) одного из нулевых элементов; Ь) всех нулевых элементов. Пусть даны натуральные числа i,j (1 < i < 24,1 < j < 24) и вещественная мат- рица размером 18 х 24. Поменяйте в матрице местами i-й и j-й столбцы. Пусть даны натуральное число п и вещественная квадратная матрица по- рядка п. Постройте последовательность 6h..., bn из нулей и единиц, в которой bi = 1 тогда и только тогда, когда в i-й строке матрицы есть хотя бы один от- рицательный элемент. Пусть даны натуральные числа пит, вещественное число г, вещественная матрица размером п х т. Получите значение bxf~x + b2f2•+... + Ьп, где bk — пер- вый по порядку положительный элемент в k-й строке матрицы (k = 1,..., и); если в k-й строке нет положительных элементов, то bk = 0,5. Найдите сумму квадратов тех элементов ау квадратной матрицы А поряд- ка 10, для которых выполняются условия: 2 < i < 9,2 < j< 9, а 1 • 4- а •. 4- а . 4- > /-1 j ij—\ **/+1 j у+1 a‘J - 4 Пусть дана вещественная квадратная матрица порядка 9. Вычислите сумму тех из ее элементов, расположенных на главной диагонали и выше ее, кото- рые превосходят по величине все элементы, расположенные ниже главной диагонали. Если на главной диагонали и выше ее нет элементов с указанным свойством, то ответом должно служить сообщение об этом. Пусть дана целочисленная квадратная матрица A(atJ) размерности п. Полу- чите by ..., bn, где элемент 6, равен: п a) п
Матрицы 87 с) ГК; ;=1 п d) ПЫ; 7=1 ♦ е) шаха,.,-minа,,. J \Zj<M J 39. Будем называть соседями элемента с индексами z, j некоторой матрицы та- кие элементы, соответствующие индексы которых отличаются от i,j не более чем на единицу. Для данной целочисленной матрицы A(atj) размером т х т найдите матрицу В, состоящую из нулей и единиц, элемент которой Ьу равен единице, когда: а) все соседи ау меньше самого элемента а/у; Ь) все соседи ау и сам элемент atj равны нулю; с) среди соседей atj есть не менее двух элементов, совпадающих с ау. 40. Пусть дана символьная квадратная матрица порядка 10. Замените буквой а все ее элементы, расположенные выше главной диагонали. 41. Пусть даны натуральное число п и символьная квадратная матрица порядка п. Получите последовательность Ь{, ..., Ьп из нулей и единиц, в которой = 1 тогда и только тогда, когда в z-й строке число символов звездочки ( *) не мень- ше числа пробелов. 42. Пусть дана символьная матрица размером 13 х 18. Найдите номер: а) первой по порядку строки, содержащей наибольшее число цифр; Ь) первого по порядку столбца, содержащего наименьшее число пробелов на пересечении со строками, номера которых четны; с) последней по порядку строки, содержащей наибольшее количество букв ш и щ\ d) последнего по порядку столбца, в котором содержится наибольшее коли- чество различных символов. 43. Введите квадратную вещественную матрицу 4-го порядка, элементы кото- рой заданы для ввода построчно, и распечатайте ее по столбцам. 44. Используя следующий фрагмент программы, вычислите перечисленные ниже соотношения: const п = 20; var А. В. С : array [l..n, l..n] of real; x. у ; array [1.,n] of real; а) С = Л+В; b) y = Ax\ ♦ c) C = A-B; ♦ d) B = В7 (транспонировать).
88 Глава 8. Регулярные типы данных 45. Используя следующий фрагмент программы, присвойте переменной t зна- чение true, если массивы С и D равны, и значение fа 1 se — в противном случае: var С. D : array [0..9, -5..3] of integer; t : boolean; ♦46. Пусть даны натуральное число п и (построчно) элементы квадратной веще- ственной матрицы А 5-го порядка. Вычислите n-ю степень этой матрицы (Л = Л, Лг = Л • Л, Л3 = Л2 • Л и т. д.). 47. Используя следующий фрагмент, напишите программы для решения пере- численных ниже задач: type vector = array [1..20] of integer; matr = array [1..20] of vector; var A ; matr; x : vector; В : array [1..20. 1..20] of integer; а) нечетные строки матрицы А замените вектором х; b) четные столбцы матрицы А замените вектором х; с) первые шесть строк массива В замените вектором х; d) в матрице А поменяйте местами 1-ю и 2-ю строки, 3-ю и 4-ю строки,..., 19-ю и 20-ю строки (воспользуйтесь вектором х как вспомогательным массивом). ♦ 48. Пусть дана (построчно) вещественная матрица размером 7x4. Переставляя ее строки и столбцы, добейтесь того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу. ♦ 49. Используя следующий фрагмент программы, найдите наибольшее расстоя- ние (D) между точками, рассматривая элементы массива М как координаты точек на плоскости: type точка = array [(х. у)] of real; var М : array [1..40] of точка; D : real; 50. Используя следующий фрагмент программы, найдите сумму элементов s из заштрихованной области массива А (рис. 8.1): var А ; array [1..9. 1..9] of real; s ; real;' a) <b) c) Рис. 8.1. Заштрихованные области
Матрицы 89 51. Используя следующий фрагмент программы, вычислите: var D : array [1..10. 1..10] of real: S real: io s = V max Da 52. Используя следующий фрагмент программы, заполните массив А так, как по- казано ниже: var А : array [1..10. 1..10] of integer; Го о 0...0A fl 2...10 0 1 0...0 1112...20 a) 0 0 2...0 b) 2122...30 0 0 0...9 0 1 2... 9 9192...100 k 7 (0 ...0 010 0 ...0 9 0 1 2 З.-.Ю^ c) 0 0 1... 8 d) 0 ...8 0 0 0 0 0... 1 1 ...0 0 0 53. Используя следующий фрагмент программы, заполните массив А по правилу А : array [1..6. 1..9] of real: X : array [1..9] of real: 54. Используя следующий фрагмент программы, получите массив В из массива А удалением п-и строки и &-го столбца: А : array [1..20. 1..20] of boolean: В : array [1..19. 1..19] of boolean: n, k : 1..20: 55. Используя следующий фрагмент программы, из массива А получите массив В, присвоив его £-му элементу значение true, если выполнено указанное ниже условие, в противном случае присвойте значение false: А : array [1..20. 1..20] of integer: В : array [1..20] of boolean; а) все элементы &-го столбца массива А нулевые; Ь) элементы £-й строки массива А упорядочены по убыванию; с) k-я строка массива А симметрична.
90 Глава 8. Регулярные типы данных 56. Используя следующий фрагмент программы, определите количество «осо- бых» элементов к массива С, считая элемент «особым», если выполняются перечисленные ниже условия: const п = 10; m ж 12; var к : integer; С : array [1.,n. l..m] of Integer; а) элемент больше суммы остальных элементов своего столбца; Ь) в строке слева от элемента находятся элементы, меньшие его, а справа — большие. 57. Используя следующий фрагмент программы, определите количество к раз- личающихся элементов массива С (то есть повторяющиеся элементы считайте один раз): var к ; integer; С ; array [1..13. 1..18] of char; 58. Пусть дана вещественная матрица размером 20 х 30. Упорядочьте ее строки по неубыванию: ♦ а) первых элементов строк; Ь) суммы элементов строк; ♦ с) наибольших элементов строк. ♦59. Используя следующий фрагмент программы, преобразуйте массив S, осущест- вив поворот элементов вокруг его центра на 90° против часовой стрелки: const п = 256; type screen = array [l..n. l..n] of 0..1; var S screen; 60. Определите, является ли некоторая целая квадратная 10-го порядка матрица симметричной (относительно главной диагонали). ♦ 61. Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце йли, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы размером 10x15 напечатайте индексы всех ее сед- ловых точек. 62. Пусть дана вещественная матрица размером 7x7, все элементы которой раз- личны. Найдите скалярное произведение строки с наибольшим элементом матрицы и столбца с наименьшим элементом. ♦ 63. Определите, является ли заданная целая квадратная матрица 10-го порядка ортонормированной, то есть такой, в которой скалярное произведение каж-
Матрицы 91 дой пары различных строк равно 0, а скалярное произведение каждой стро- ки на себя равно 1. 64. Определите, является ли заданная целая квадратная матрица 9-го порядка магическим квадратом, то есть такой, в которой суммы элементов во всех строках и столбцах одинаковы. 65. Пусть дана непустая последовательность слов из строчных латинских букв; слова разделяются запятой, за последним словом стоит точка. Среди всех пар я, и bh где а, — первая; a bi — последняя буквы г-го слова последователь- ности, определите наиболее часто встречающуюся пару. 66. По заданным коэффициентам ап, а12, ain, ..., а22, а23,-..., а2п, ..., апп, (п - 20, 0) и правым частям bif b2t..., bn найдите решение «треугольной» системы линейных уравнений: «1 + а12х2 + а13х3 +... + аХпхп = , *22*2 + «23*3 + • • • + &2пХп = *2> * ^33*3 + • • • + а3пх3 =^3» > 67. Известно, что в следующем фрагменте программы массив матрица содержит оценки студентов группы, фамилии которых перечислены в типе фамилия: type фамилия = (Иванова. Просветкин. Лемин. Михайлов. Маслова. Юрьева. Беляев. Малащенко. Нагайцев. Семыкин): Предмет = (матанализ, алгебра, информатика, история, матлогика. механика, педагогика, дифуравнения. статистика): var матрица array [фамилия, предмет] of Integer; i) найдите средний балл всех студентов группы; Ь) напечатайте фамилию первого студента списка, средний балл которого максимален; с) поменяйте местами оценки любого студента, средний балл которого ми- нимален, с оценками первого из студентов списка, который не имеет не- удовлетворительных отметок; d) измените на «3» все неудовлетворительные оценки (если такие имеются) у студента с минимальным средним баллом; ♦ е) напечатайте фамилии любых двух студентов, средний балл которых яв- ляется наибольшим; f) найдите количество студентов группы, которые учатся без троек (только на «4» и «5»);
92 Глава 8. Регулярные типы данных g) выясните, сколько студентой группы имеют средний балл, наименее от- клоняющийся по абсолютному значению от среднего балла всей группы; h) напечатайте названия предметов, по которым студенты учатся без двоек; i) определите, по какому предмету самая высокая успеваемость; j) переставьте оценки всех студентов группы по механике и педагогике; к) составьте список отличников группы; 1) составьте список хорошистов группы; ш) составьте упорядоченный по неубыванию средних баллов список студен- тов группьь 68. Пусть во входном файле input задана последовательность строчных латинс- ких букв, за которой следует пробел. Если это правильная запись значения типа color, то, используя следующий фрагмент программы, присвойте это значение переменной х, иначе — сообщите об ошибке: type color = (red. blue, green, yellow, black, white); var x : color; 69. Пусть дана последовательность, содержащая от 1 до 30 слов, в каждом из ко- торых от 1 до 5 строчных латинских букв; между соседними словами — запя- тая, за последним словом — точка. Выведите: а) эту же последовательность слов, но в обратном порядке; ♦ Ь) те слова, перед которыми в последовательности находятся только мень- \ шие (по алфавиту) слова, а за ними — только большие; ♦ с) эту же последовательность слов, удалив из нее повторные вхождения слов; ♦ d) все слова, которые встречаются в последовательности по одному разу; ♦ е) все различающиеся слова, указав для каждого из них число его вхожде- ний в последовательность; ♦ f) все слова в алфавитном порядке. ♦70. Пусть дана последовательность, содержащая от 2 до 50 слов, в каждом из ко- торых от 1 до 8 строчных латинских букв; между соседними словами — не менее одного пробела, за последним словом — точка. Напечатайте те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству: а) слово симметрично; Ь) первая буква слова входит в него еще раз; с) буквы слова упорядочены по алфавиту; d) длина слова максимально; е) в слове нет повторяющихся букв; f) каждая буква входит в слово не менее двух раз; g) в слове гласные буквы (а, е, i, о, и) чередуются с согласными.
Матрицы 93 71. Пусть дана последовательность, содержащая от 2 до 30 слов, в каждом из ко- торых от 2 до 10 строчных латинских букв; между соседними словами — не менее одного пробела, за последним словом — точка. Напечатайте все слова, отличные от первого слрва, предварительно преобразовав каждое из них по следующему правилу: а) перенести первую букву в конец слова; Ь) перенести последнюю букву в начало слова; с) удалить из слова первую букву; d) удалить из слова последнюю букву; ♦ е) удалить из слова все последующие вхождения первой буквы; ♦ f) удалить из слова все предыдущие вхождения последней буквы; ♦ g) оставить в слове только первые вхождения каждой буквы; ♦ h) если слово нечетной длины, то удалить его среднюю букву. 72. Известно, что астрологи делят год на 12 периодов и каждому из них ставят в соответствие один из знаков Зодиака (табл. 8.1). Напишите программу для ввода даты некоторого дня года и печати названия соответствующего знака Зодиака. Таблица 8.1. Знаки Зодиака Период Знак Зодиака 20.01 - 18.02 Водолей 19.02 - 20.03 Рыбы 21.03-19.04 Овен 20.04 - 20.05 Телец 21.05-21.06 Близнецы 22.06 - 22.07 Рак 23.07 - 22.08 Лев 23.08 - 22.09 Дева 23.09-22.10 Весы 23.10-22.11 Скорпион 23.11-21.12 Стрелец 22.12 - 19.01 Козерог 73. Пусть дана последовательность, содержащая от 1 до 90 слов, в каждом из ко- торых от 1 до 10 строчных русских букв; между соседними словами — не ме- нее одного пробела, за последним словом — точка. Напечатайте эти слова по алфавиту.
Глава 9 Процедуры и функции Теоретические вопросы 1. Дайте определение подпрограммы. 2. Что лежит в основе метода программирования сверху вниз? 3. Существуют ли подпрограммы без параметров? 4. Дайте определение параметра. 5. Как называются параметры, определяемые в заголовке подпрограммы? 6. Какие параметры называются фактическими? 7. Чем синтаксически отличается описание процедуры от описания функции? 8. Какое количество значений возвращает функция? 9. Как определить тип значения, возвращаемого функцией? 10. Существуют ли ограничения на тип возвращаемого функцией значения? И. Каким образом осуществляется обмен данными между основной програм- мой и подпрограммой без параметров? 12. Сколько элементов может содержать список формальных параметров? 13. Сколько элементов должен содержать список фактических параметров? 14. Могут ли фактические параметры быть выражениями? 15. Могут ли фактические параметры быть именами переменных? 16. Могут ли фактические параметры быть именами других процедур или функ- ций? 17. Каково соответствие между фактическими и формальными параметрами? 18. Могут ли имена формальных параметров совпадать с именами фактических? 19. Могут ли имена формальных параметров не совпадать с именами факти- ческих? 20. Какие переменные называются локальными? 21. Чем глобальные переменные отличаются от локальных? 22. Что такое время жизни переменной?
Задачи, программы 95 23. Что такое область видимости переменной? 24. Может ли имя локальной переменной совпадать с именем глобальной? 25. Можно ли утверждать, что одноименные глобальные и локальные перемен- ные — это разные переменные? 26. Какие два способа передачи параметров вы знаете? В чем их отличие? 27. При каком способе передачи параметров изменение соответствующего фор- мального параметра внутри процедуры изменяет и фактический параметр? 28. Может ли в качестве параметра при вызове подпрограммы, имеющей фор- мальный параметр-значение, выступать: переменная, выражение, константа? 29. Может ли в качестве параметра при вызове подпрограммы, имеющей фор- мальный параметр-переменную, выступать: переменная, выражение, кон- станта? 30. Может ли в основной программе функция вызываться внутри выражения? 31. Наличие какого оператора необходимо для возвращения значения из функ- ции в вызывающую программу? 32. Что называется побочным эффектом при вызове подпрограммы? 33. Почему следующее описание процедуры недопустимо? procedure S ( A array [1..10] of real ); 34. Может ли элемент массива быть формальным параметром? 35. Почему недопустимо следующее описание функции? function F( s : char ) string[10]; 36. Может ли быть функция или процедура параметром подпрограммы? Задачи, программы / 1. Вычислите выражение z(x) = (sign(x) + sign(y)) • sign(x + у). При решении за- дачи определите и используйте функцию sign: -1,х<0, sign(x) = < 0, х = О, 1,х>0. 2. Даны вещественные числа s, t. Получите: H(s,t) + (max(H2 (s-t,s*t),H4 (s-t,s +1)) + H( 1,1)), где H(a,b) = - Аг + -Ц- - (a - b)3. 1+b2 l + a2 3. Напишите функцию, вычисляющую sh(x), и для заданного значения пере- менной х вычислите следующее выражение: sh (х) + tg(x+l) - tg2(2+sh(x-l)).
96 Глава 9. Процедуры и функции ♦4. Пусть даны натуральные числа k, /, m, вещественные xitx2t ...,xk1 у^у2^ -Уь zu z2,..., zm. Получите: fmin(y1,...,y/) + max(z1,...,zw), если max(xi,...,xk)>2, ' = ] 2 [l + Onax^,...,**)) , если тах(х15...,х*)<2. ♦5. Пусть даны вещественные числа щ, и2, v2f wlf w2. Получите: 2 + w-v где u,v,w — комплексные числа. Определите процедуры для работы с комп- лексными числами. 6. Пусть даны три последовательности вещественных чисел а0, aifа30; b0, bif ^зо; cQ, с{,..., с30. Вычислите значение выражения для заданного х\ 30 , 29 . , алх +atx +... + а2дх + азо . ,.30 ,.79 ч —-------30--------—(с0(2х + 1Ги +q(2x + l/y +... + С29(2х + 1) + сзо) . 60(х- 1) +Z?i(x-1) +... + Z>jQ 7. Для следующих программ определите, что будет напечатано: a) program One; var с, d : Integer; procedure P( x, у ; integer ); begin у ;= x + 1 end;f p } procedure Q( x ; integer; var у : integer ); begin у ;= x. + 1 end;f Q } begin C := 2; d ;= 0; P( sqr( c ) + d. d ); writeln( c. d ); c ;= 2; d ;= 0; Q( sqr( c ) + d, d ); writelnC c, d ) end.{ One } b) program Two; var X. Y ; integer; procedure A( Z : integer; var X integer ); var Y ; integer: procedure B( X, W : integer); begin Z ;= X + Y + W; X 2 * W end;{ В } begin Y Z + X; B( Y. Z ); end;f A } begin X :» 1; Y :» 2: A( X + Y. Y ); A( 2 * Y. X );
Задачи, программы 97 writeln( X. Y ) end.{ Two } c) program Three; var U, W : integer; procedure At( var К ; integer; T ; integer ); var Z ; integer; procedure C( var X, W ; integer ); begin Z ;= X + T + W; X := 2 * W end;{ C } begin К ;= Z + 4; C( К. К ); T := T + К + Z end;{ At } begin U :» 11; W ;= 3; At( U. W + 4 ); At( W. U ): writeln( U. W ) end.{ Three } 8. Определите наибольший общий делитель трех чисел, написав функцию для определения наибольшего общего делителя N0D(x, у), используя алгоритм Евклида. 9. Напишите процедуру сложения двух дробей, результатом которой является несократимая правильная дробь. Используйте функцию для нахождения наи- большего общего делителя. ♦ 10. Вычислите результат выражения в виде правильной дроби, где А, В, С, Е, F— целые числа. Воспользуйтесь функцией сложения двух дробей. И. Для двух представленных ниже квадратных уравнений определите, имеют ли они одинаковые корни. Напечатайте те корни уравнений, которые не сов- падают. а{х2 +bix + c} = 0, а2х2 + Ь2х + с2 = 0. 12. Для заданного натурального Nопределите первые Nпростых чисел. ♦13. Определите все общие делители двух заданных натуральных чисел. *14. В трех автопарках работают по 20 машин с заданными госномерами и ука- занными марками: ГАЗ, ЗИЛ, ЛИАЗ и т. д. Каждый водитель сдает сводку о том, сколько километров прошла его машина в каждый день недели, и о раз- мере выручки. Подсчитайте общий километраж в каждом автопарке по каж- дому дню отдельно. В каком из автопарков самый больший автопробег? Какой 4 Зак. 906
98 Глава 9. Процедуры и функции день недели соответствует самой большой прибыли, полученной автохозяй- ством? Автомобили какой марки приносят наибольшую прибыль? *15. На заправочной станции для каждого автомата известно количество отпу- щенного топлива каждого вида (А76, А93, А95, DIZ ...) и количество обслу- женных машин в каждый из дней недели. Вычислите общий объем топлива, проданный в указанный период недели. В какой день недели было обслуже- но больше всего машин? Из какого автомата было продано наибольшее ко- личество топлива? Какой вид топлива пользуется наибольшим спросом? 16. Определите, исходя из данного фрагмента программы: type country = (Австрия, Канада. Китай. Италия. Перу. США); continent = (Америка. Африка. Азия. Европа); а) функцию, которая по заданной стране определяет континент, на котором находится страна; Ь) для двух стран, находятся ли они на разных континентах. 17. Напишите функцию, проверяющую, является ли заданная литера гласной русской буквой. *18. На плоскости координатами своих вершин заданы два треугольника. Опре- делите, одинакового ли они типа (прямоугольный, тупоугольный, остро- угольный). 19. В двух последовательностях aif..., а„ и Ьи ..., Ь„ замените все элементы, следую- щие за элементом с максимальным значением, на значение минимального элемента. ♦ 20. Дана последовательность вещественных чисел аи а2,..., а„. Для каждого эле- мента последовательности а, подсчитайте количество элементов слева, кото- рые по модулю меньше и количество элементов справа, которые по моду- лю больше а,. Используйте подпрограмму, производящую вычисления для одного элемента последовательности. ♦ 21. Для заданных А и В (А < В) и последовательности целых чисел определите количество чисел, которые принадлежат интервалам [-<», А], [А, В], [В, <»]. ♦ 22. Заданный массив целых чисел делится на три части двумя элементами: мак- симальным и минимальным. Определите сумму элементов в каждой части массива. Используйте функции для нахождения индексов минимального и максимального элементов и подсчета суммы элементов в указанной части массива. 23. Пусть дана матрица А размером п х т, состоящая из вещественных чисел. Необходимо получить матрицу В размером п х т, каждый элемент btJ кото- рой равен true, если сумма соседних с элементов меньше указанной вели- чины 5, и fа 1 se — в противном случае. Воспользуйтесь функцией для нахож- дения суммы соседних элементов. *24. Пусть даны две матрицы А(п х ти), В(п х т), состоящие из вещественных чисел. Необходимо получить матрицу С(п х ти), где элемент равен сумме
Задачи, программы 99 элементов i-й строки матрицы А, которые отсутствуют в j-м столбце матри- цы В. Напишите функцию вычисления С,7, использующую функцию провер- ки наличия числа вj-м столбце матрицы В. ♦ 25. Пусть задано У параллелограммов координатами своих вершин. Определи- те номер параллелограмма, у которого площадь максимальна. Напишите функцию для определения площади параллелограмма по его заданным ко- ординатам вершин. ♦ 26. Пусть дана матрица А(п х т). Постройте матрицу В(п х ти), каждый элемент которой равен произведению сумм элементов, расположенных Bi областях, показанных на рис. 9.1. Напишите функцию для вычисления суммы элемен- тов в указанной области. A[ij] A[j,i] Рис. 9.1. Девять областей * 27. Пусть даны две вещественные матрицы порядка п. Получите новую матрицу следующим способом (для нахождения минимального элемента и произве- дения элементов в указанной строке используйте функции): а) умножением минимального элемента каждой строки первой матрицы на наибольший элемент соответствующего столбца второй матрицы; Ь) прибавлением к элементам каждого столбца первой матрицы произведе- ния элементов соответствующих строк второй матрицы. 28. Допустимым преобразованием матрицы назовем перестановку двух сосед- них строк или двух соседних столбцов. Пусть дана вещественная квадратная матрица порядка N. С помощью допустимых преобразований получите матри- цу, в которой один из элементов с наибольшим значением располагался бы в левом верхнем углу. Напишите функции, осуществляющие соответствую- щие преобразования строк и столбцов. ♦ 29. Пусть дана вещественная матрица А(п х т). В каждой строке переместите в ко- нец строки все элементы, у которых соседние элементы в строке разные по знаку. Используйте функцию для перемещения указанного элемента строки. ♦ 30. Пусть дана матрица А(п х т), состоящая из натуральных чисел. В каждом столбце обнулите минимальное количество элементов так, чтобы сумма эле- ментов столбца не превышала заданную.
100 Глава 9. Процедуры и функции * 31. Для заданной вещественной матрицы определите, образуют ли ее элементы упорядоченную последовательность при их переборе по схеме, представлен- ной на рис. 9.2. Для определения факта упорядоченности части строки (столб- ца) используйте функции. Рис. 9.2. Схема расположения последовательности * 32. Пусть дана вещественная квадратная матрица порядка 2п, Получите новую матрицу, переставляя ее блоки размером п так, как показано на рис. 9.3. Для обмена четырех заданных фрагментов матрицы напишите функцию. а) Рис. 9.3. Переставляемые блоки матрицы 33. Пусть дана прямоугольная матрица А(п х тп), элементами которой являются целые числа. Определите, в какой строке матрицы находится наибольшее количество симметричных чисел. Составьте функцию, проверяющую сим- метричность числа. 34. Пусть дана прямоугольная матрица А(п х тп), элементами которой являются вещественные числа. Определите для каждой строки, все ли ее элементы яв- ляются симметричными. Составьте функцию, проверяющую симметричность числа. 35. Пусть дана прямоугольная матрица А(п х т), элементами которой являются целые числа. Определите для каждого элемента позиции элементов матрицы с такой же суммой цифр. 36. Пусть дана прямоугольная матрица А(п х тп), элементами которой являются целые числа. Замените все положительные четные числа на числа, являю- щиеся их «перевертышами». Составьте подпрограмму, получающую для за- данного числа его «перевертыш» (число а будем считать «перевертышем» числа 6, если, читая число а справа налево, получаем число Ь).
Задачи, программы 101 37. Пусть даны N шестизначных номеров троллейбусных билетов — ХХХХХХ. Определите те билеты, номера которых являются «счастливыми», то есть сум- ма первых трех цифр совпадает с суммой последних трех цифр. Используйте функцию для определения, является ли номер «счастливым». * 38. В квадратной матрице определите количество строк, отвечающих следую- щему условию (для определения типа каждой строки используйте функцию): а) упорядоченных по возрастанию; Ь) упорядоченных по убыванию; с) состоящих из равных элементов; d) неупорядоченных. ♦39. Пусть дан список учащихся и для каждого из них У оценок по М предметам. Переместите в конец списка тех учащихся, у которых средний балл меньше, чем средний балл в классе. Напишите функции для перемещения одной стро- ки в конец списка для вычисления среднего балла. 40. Пусть даны три слова. Необходимо определить буквы, которые встречаются (для нахождения множества символов, образующих слово, используйте про- цедуру): ♦ а) во всех словах; ♦ Ь) только в 1-м и 2-м словах; ♦ с) только в 1-м и 3-м словах; ♦ d) только во 2-м и 3-м словах; ё) только в 1-м слове; ♦ f) только во 2-м слове; ♦ g) только в 3-м слове. ♦ 41. Пусть даны два предложения, которые оканчиваются точкой и содержат оди- наковое количество слов. Определите для первых слов каждого предложе- ния множество одинаковых букв, а для последних — те буквы, которые встре- чаются только в одном из них. Для определения буквенного состава слова используйте процедуру. 42. Найдите все слова в предложении, которые содержат только заданные бук- вы. Для определения буквенного состава слова используйте процедуру. ♦ 43. Среди нескольких предложений найдите то, которое содержит наибольшее количество разных букв. 44. В заданном тексте удалите все слова, которые начинаются с нечетной пози- ции. Для удаления слова используйте функцию. 45. По заданной строке текста напечатайте строкукоторой все гласные буквы удваиваются, а двойные согласные заменяются одиночными. 46. Напишите функцию, которая в заданной строке определяет количество вхож- дений в нее заданной подстроки. Для заданных строки и слова определите количество вхождений слова в строку.
102 Глава 9. Процедуры и функции * 47. Пусть задан текст, состоящий из нескольких предложений, разделенных точ- кой. Выполните следующие преобразования: первые слова в каждом предло- жении преобразуйте к виду, в котором первая буква прописная, а остальные строчные; в словах, которые содержат более чем одну прописную букву, все буквы замените прописными; в остальных словах все буквы должны быть строчные. Используйте функцию для преобразования одного слова в пред- ложении. ♦ 48. Пусть дан текст в виде символьной строки, оканчивающейся точкой. Необ- ходимо определить количество слов, которые являются «перевертышами» (например: казак, шалаш), то есть читаются одинаково с начала и с конца слова. Слова в предложении отделяются одним либо несколькими пробелами. ♦ 49. Составьте подпрограмму, которая в строке текста определяет позицию само- го правого вхождения указанной подстроки. Для указанной строки опреде- лите позицию подстроки END. ♦ 50. Напишите процедуру, которая для заданного целого числа получает его пред- ставление в п-й системе счисления в виде строки символов. ♦ 51. Составьте процедуру вычисления значения целого числа по заданной строке символов, являющейся записью этого числа в n-й системе счисления (п < 16). Найдите сумму чисел, записанных в виде строки, для указанного основания системы счисления. 52. Для заданной строки текста определите слова, которые содержат символы, отличные от букв. Напишите функцию, определяющую тип символа строки. 53. Пусть дано п треугольников. Посчитайте количество треугольников, лежа- щих в каждой координатной четверти и не пересекающих оси координат. Ис- пользуйте функцию для определения координатной четверти, в которой ле- жит треугольник. ♦ 54. Пусть дано п вещественных чисел (п = 100). Упорядочить их по неубыванию методом фон Неймана: а) завести два массива А и В и занести все элементы в Л; Ь) упорядочить пары соседних элементов и Л2, А3 и Л4 и т. д.) и записать их в В; с) взять из массива В упорядоченные пары и, слив их в упорядоченные чет- верки, снова записать в Л; d) затем взять из массива В четверки элементов, восьмерки и т. д. ♦ 55. Составьте процедуру «сжатия» исходной последовательности символов, ко- торая заменяет последовательность, состоящую из одинаковых символов, текстом вида х(&), где х — символ последовательности, k — число вхожде- ний. Определите для указанной последовательности коэффициент сжатия (отношение исходной длины последовательности к полученной). ♦ 56. Пусть дано п треугольников, заданных координатами своих вершин. Найдите пару треугольников, максимально удаленных друг от друга.
Задачи, программы 103 57. Пусть дано п треугольников, заданных координатами своих вершин. Найдите треугольник с максимальной площадью. Напишите функцию для нахожде- ния площади одного треугольника. 58. Пусть дано п произвольных четырехугольников, заданных координатами сво- их вершин. Найдите четырехугольник с максимальной площадью. Исполь- зуйте функцию для вычисления площади четырехугольника. ♦ 59. Пусть дано п прямоугольников, заданных координатами левой верхней и пра- вой нижней вершины. Стороны прямоугольников параллельны осям коор- динат. Определите пару прямоугольников с максимальной площадью пере- сечения. Напишите функцию для определения площади пересечения двух прямоугольников. ♦ 60. Пусть дано п треугольников. Определите координаты центра и минималь- ный радиус круга, который содержит все треугольники. ♦ 61. Составьте процедуру выравнйвания строки, которая преобразует строку к строке указанной длины путем равномерного добавления пробелов между всеми словами. 62. Пусть дано п треугольников. Определите количество треугольников, кото- рые пересекают границы заданного квадрата. Используйте функцию для опре- деления, пересекает ли треугольник границы квадрата. ♦ 63. Пусть дано п отрезков на интервале [Л, В]. Определите часть интервала, ко- торый покрывается наибольшим количеством отрезков. Напишите функцию для определения количества отрезков, покрывающих заданный интервал. * 64. Определите минимальное количество отрезков из числа заданных, которые покрывают заданную часть прямой. Напишите функцию, определяющую, по- крывает ли заданный набор отрезков необходимую часть прямой. 65. Напишите процедуру сложения двух многочленов. Представьте каждый мно- гочлен в виде массива коэффициентов, где Л, — коэффициент перед х,-. ♦ 66. Найдите многочлен, полученный в результате умножения (а0 + а{х + + ... + + апх?) х (fe0+ b{x + Ь2х*+... + Ьпх?). Напишите функцию для умножения мно- гочлена на число и х*. * 67. Составьте процедуру деления с остатком для многочленов. Вычислите: ____________Q0+aix + a2x2 +... + flwxw___ 2т <п. (bQ + b[x + b2X2 4-... + bmxm )(bm + bm_ix + bm_2x2 + - + bQXm) ’ * 68. Напишите процедуру, которая для заданного полинома определяет полином, являющийся производной исходного полинома по указанной переменной. Вычислите: ( 2 п \ а$ + а\х + а2х +... + апх (Ъ^+Ь^х + Ь^ + ... + bmx )(bm + bm_\x + bm_2x +;.. + Ijqx ), Вычислите интегралы: f 1 b | sin2 х-----j-dx и jc а а
104 Глава 9. Процедуры и функции Для этого напишите функцию, вычисляющую интеграл по формуле наимень- ших прямоугольников для заданного интервала, количества разбиений и функ- ции, передаваемой как параметр. Формула наименьших прямоугольников: ь j f(x)dx = min(/(a = а0), f(at)) + min(/(a (), f(a2)) + ...+ a +min(/(an_|), f(b = an)). 70. Вычислите интеграл: ю j*3sin(x2 4-1)бзЬс 2 Для этого напишите функцию, которая вычисляет интеграл по формуле тра- пеций для заданного интервала, количества разбиений и функции, передава- емой как параметр. Формула трапеций: ь h J /(х) dx = - (/(ао) + 2/(aj)+2Да2) + 2/(а3)+... + 2/(ап_|) + Дап)). а 71. Напишите подпрограмму, которая вычисляет интеграл по формуле Симпсо- на для заданного интервала, количества разбиений и функции, передавае- мой как параметр. ь h J/(x)A»j(/(ao)+4/(el)+2/(a2)+4/(e3)+...+4/(a„_1)+/(e„)). а ♦ 72. Напишите процедуру, которая по заданному интервалу и функции определяет «ноль» функции с заданной точностью, используя метод деления отрезка пополам. Известно, что на границах интервала функция принимает значе- ния, отличные по знаку. Определите «ноль» функции Лх2 + Вх + С для за- данных Л, В, С. ♦ 73. В квадратной матрице А(п х п) найдите строки, представляющие вектор с мак- симальной нормой в каждой из следующих метрик (напишите функцию для подсчета нормы вектора в указанной метрике): H = Val + IH=hl+-+kl ||а|| = max^l,/ = . * 74. По вещественным числам Е > 0 и t вычислите с точностью Е величину: J, cos41 J arctg t I 1 V 4 V 2 Ъ + t2’ Для вычисления корней используйте следующий ряд Тейлора: /1 ха 1 а а(а-1) 2 а(а-1)(а-2) 3 (1 + х)а = 1 + -х + —--х2 +—-----------xJ+..., х <1, а>0. 1! 2! 3!
Задания для самостоятельной работы 105 *75. Пусть даны вещественные числа а,Ь,Е(а<Ь,Е> 0). С точностью Е вычис- лите интеграл: Ь [/(х) jh(x,y)dy dx,h(x,y) = е Уух ',g(x) = 1,/(х) = 1 + х2, a [g(x) используя формулу трапеций (см. выше задачу 70). Для обеспечения нуж- ной точности воспользуйтесь следующим правилом Рунге: если приближен- ное значение интеграла In вычислять при п= nQ, 2я0,4и0,8и0... и т. д. (где п0 — некоторое начальное число отрезков разбиения, например по=1О), тогда при |72я“4| /3 <Е за искомую величину можно взять 12п. Задания для самостоятельной работы В каждом из предложенных ниже заданий используйте процедуры ввода и вывода элементов матрицы по строкам. 1. Проверьте свойство (Ат)т = Л, где А — исходная матрица (п х и), Т означает транспонирование. Используйте процедуру транспонирования. 2. Пусть задана вещественная матрицами х п). Упорядочить элементы матрицы: а) по неубыванию значений максимальных элементов в строках; Ь) по неубыванию сумм элементов строк. 3. В заданной матрице А(п х п) определите количество строк, которые упоря- дочены по возрастанию. Используйте подпрограмму проверки упорядочен- ности строки. 4. В матрице А(п х и) определите количество строк, элементы которой образуют арифметическую прогрессию. Используйте подпрограмму проверки строки. 5. В заданной матрице А(п х п) найдите максимум из всех минимальных эле- ментов матрицы по столбцам. 6. В заданной матрице А(п х п) найдите минимум всех сумм абсолютных вели- чин элементов матрицы по столбцам. Для нахождения суммы абсолютных величин столбца используйте функцию. 7. Подсчитайте количество строк матрицы А(п х и), элементы которых образу- ют монотонную последовательность. Для определения факта монотонности используйте подпрограмму. 8. Уплотните матрицу А(п х п) влево и вверх. Для выявления нулевых строк и столбцов используйте подпрограмму. 9. Упорядочьте строки матрицы по возрастанию их евклидовых норм. 10. Проверьте, есть ли в матрице А(п х п) строки, не содержащие более двух отри- цательных элементов. Для проверки строки используйте подпрограмму. И. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого содержит наименьший по абсолютной величине элемент строки.
106 Глава 9. Процедуры и функции 12. Составьте программу поиска минимального элемента, расположенного под главной диагональю, и максимального элемента, расположенного над глав- ной диагональю заданной вещественной матрицы А(п х и). 13. Пусть задана вещественная матрица. Рассматривая ее как вектор строк, упо- рядочьте ее по количеству нечетных элементов в каждой строке. 14. Определите номера строк в матрице, в которых элементов, принадлежащих отрезку [Л, В], больше, чем элементов, принадлежащих отрезкам [-«>, А], [В, ©о]. 15. Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент которого принимает значение true, если среди элементов i-й строки матри- цы А есть хотя бы два равных, и значение false — в противном случае. Вос- пользуйтесь логической функцией, которая для i-й строки выполняет ука- занную проверку. 16. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого равен наибольшему количеству равных элементов в соответствующей строке матрицы А. Воспользуйтесь функцией, которая определяет это количество в i-й строке матрицы А. 17. Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент которого равен true, если в строке существует элемент, делящий весь массив на две части с одинаковой суммой элементов в каждой. 18. Проверьте, верно ли, что количество строк матрицы А(п х и), в которой все числа нечетные, кратно заданному числу х. 19. Пусть дана матрица А(п х п). Постройте логический вектор, каждый элемент которого равен true, если среди элементов соответствующей строки матри- цы А есть хотя бы один элемент, принадлежащий отрезку [0,5; 1], и false — в противном случае. Воспользуйтесь логической функцией, делающей соот- ветствующую проверку в i-й строке. 20. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого равен количеству элементов в i-й строке матрицы А, не принадлежащих от- резку [0, 10]. Воспользуйтесь функцией, делающей соответствующую про- верку в i-й строке. 21. Пусть дана матрица А(п х п). Постройте вектор, каждый элемент которого равен сумме элементов i-й строки матрицы А, больших, чем значение мини- мального элемента в этой строке. Воспользуйтесь функцией, определяющей соответствующую операцию в каждой строке матрицы А. 22. Пусть дана матрица А(п х п). Упорядочьте строки по неубыванию сумм цифр элементов этой строки. Воспользуйтесь функцией, определяющей для каж- дого числа сумму его цифр. 23. Напечатайте строки и столбцы матрицы W(n х п), на пересечении которых находятся максимальные и минимальные элементы, если элементы матри- цы вычисляются по формулам:
Задания для самостоятельной работы 107 24. Элементы матрицы А(п х п) вычисляются по формуле: 4j = / * sin(y) + sin(z) (ij = 1,2,3,..., п). Требуется: а) сформировать матрицу В: вм = ; ,4,у;—г’ =1’2’3’ •••’ A,+i +j b) вывести на печать сформированные матрицы Л, В и их произведение А *В. 25. Пусть дана матрица А(п х п), где AhJ = (-1)' */ * у. Постройте и выведите на печать матрицу В, элементы которой определяются по правилу: В. . = А: : * max 4 к J l,J \<k<n l'K 26. Выведите на печать матрицу К(п х п). Вычислите и выведите на печать ска- лярное произведение i-й строки на г-й столбец (всего п произведений). Эле- менты матрицы вычисляются по формуле: 27. Элементы матрицы А(п х п) вычисляются по формуле: 4,у = sin(z *у), (z, j = 1,2,3,..., п). Требуется: а) построить матрицу В, каждый элемент которой вычисляется по формуле: J к=\ Ь) вывести на печать матрицы А и В.
Глава 10 Рекурсивные подпрограммы Теоретические вопросы 1. Как называются процедуры или функции, которые вызывают сами себя? 2. Для каких целей создаются рекурсивные алгоритмы? 3. Что называется стеком? 4. Верно ли, что значения всех локальных переменных при очередном вызове рекурсивной процедуры или функции помещаются в стек? 5. В какой последовательности происходит заполнение стека и выбор элемен- тов из стека? 6. Всегда ли в рекурсивном алгоритме должно присутствовать условие выхода из рекурсии? 7. Что произойдет, если рекурсивный алгоритм будет вызывать сам себя «бес- конечное» число раз? 8. Верно ли, что решение задачи, реализуемое рекурсивным алгоритмом, мож- но выразить нерекурсивным алгоритмом? Задачи, программы 1. Напишите рекурсивную функцию для нахождения биномиальных коэффи- циентов (для заданного М > i >j > 0 вычислите все С/ ): 1, при т = 0,п > 0 или т = п > О, < 0, при т > п > О, СХ-'+СЛ иначе. ♦2. Пусть задано конечное множество имен жителей некоторого города, причем для каждого жителя перечислены имена его детей. Перечислите все пары жи- телей города, которые являются родственниками, причем жители А и Б на- зываются родственниками, если:
Задачи, программы 109 а) А — это ребенок Б; Ь) Б — это ребенок А; с) существует некий В такой, что А является родственником В,ъВ является родственником Б. *3. Подсчитайте количество различных представлений заданного натурального числа Wb виде суммы не менее двух попарно различных положительных сла- гаемых. Представления, отличающиеся порядком слагаемых, различными не считаются. ♦4. Вычислите определитель заданной матрицы, пользуясь формулой разложе- ния по первой строке (матрица В получается вычеркиванием из А первой строки и &-го столбца): п det А= £(-1)к+| А1>к detBk, к=1 5. Постройте синтаксический анализатор для понятия идентификатор. <Идентификатор> :: = <буква> | <идентификатор> (<цифра> | <буква>). * 6. Постройте синтаксический анализатор для понятия простое—выражение. <простое_выражение> ::= <простой_идентификатор> | (<простое_выражение><знак_операции><простое_выражение>); <простой_идентификатор> <буква>; <знак_операции> :: = + | - | *. * 7. Напишите процедуру, которая по заданному простому логическому выраже- нию вычисляет его значение. <логическое_выражение> ::=TRUE | FALSE | NOT <логическое_выражение> | (<логическое_выражение><знак_операции><логическое__выражение>): <знак_операции> ::=AND | OR. ♦ 8. Расставьте на шахматной доске 8 ферзей таким образом, чтобы ни один не угрожал другому. * 9. Получите расстановки 8 ладей на шахматной доске, при которых ни одна ладья не угрожает другой. * 10. Получите все перестановки элементов 1,..., 6. * 11. Получите все размещения из 10 элементов 1,2,..., 10 по 3 в каждом. Размеще- нием называется выборка из п указанных элементов т неповторяющихся элементов. * 12. На шахматной доске определите поля, в которые может попасть конь за п хо- дов из указанной позиции. * 13. Пусть имеются п городов. Некоторые из них соединены дорогами известной длины. Найдите: а) кратчайшие маршруты из заданного города в остальные; Ь) кратчайший маршрут, начинающийся в заданном городе и проходящий через все остальные.
110 Глава 10. Рекурсивные подпрограммы * 14. Найдите расстановку 5 ферзей, при которой каждое поле шахматной доски будет находиться под ударом хотя бы одного из них. * 15. «Задача о рюкзаке». Пусть имеется М различных предметов, известны вес каждого предмета и его стоимость. Определите, какие предметы надо поло- жить в рюкзак, чтобы общий вес не превышал заданной границы, а общая стоимость была максимальной. * 16. Пусть даны целое п от 2 до 20 и вещественное Е > 0. Найдите с точностью Е все корни n-го многочлена Чебышева Тп(х), определяемого формулами: Г0(х) = 1; 7](х) = х; Tk (х) = 2xTk_}(x)-Tk_2(x)9 (k = 2, 3,...). ПРИМЕЧАНИЕ Многочлен ТЛ(х) имеет k различных корней в интервале [-1,1]; если xt<x2<... <xk — корни многочлена Тк(х), то многочлен ТЬ1(х) имеет по одному корню в каждом из интервалов [-l,xj, [xhx2[,..., [х*, 1]. 17. «Ханойские башни». Пусть имеются три колышка А, В, Сип дисков разно- го размера, перенумерованных от 1 до п в порядке возрастания их разме- ров. Сначала все диски надеты на колышек А в виде пирамиды. Требуется перенести все диски с колышка А на колышек В, соблюдая следующие пра- вила: диски можно переносить только по одному, диск большего размера нель- зя ставить на меньший. Диск С можно использовать в качестве промежу- точного. * 18. Напишите программу перевода инфиксной записи арифметического выра- жения в постфиксную. ♦ 19. Напишите программу вычисления выражения, записанного в постфиксной форме. 20. Пусть дана строка текста, оканчивающаяся точкой. Напечатайте этот текст в обратном порядке. 21. Опишите рекурсивную логическую функцию, которая проверяет, является ли симметричной часть заданной строки, начинающаяся г-м и кончающаяся j-м символом. ♦ 22. Напишите две функции вычисления z-ro числа Фибоначчи (рекурсивную и не рекурсивную) и напечатайте таблицу для сравнения времени вычисления i-го числа. Вычислите/(Л), k - 15,20,30,40. ПРИМЕЧАНИЕ Функция /(и) определена для целых чисел следующим образом: 1,л = 1 п . 2 /(«) = div 2), п > 2. 23. Проверьте, является ли вводимая последовательность символов констант- ным—выражением.
Задания для самостоятельной работы 111 <конст_выр> :: = <целое_без_знака>| (<целое_без_знака><знак_операции><конст_выр>) <целое_без_знака> :: = <цифра>[<цифра>] <знак_операции> ::= + | - * <цифра> ::= 0 | 1 | 2 | 3 4 | 5 | 6 | 7 | 8 | 9 * 24. Напишите программу, которая по заданному правильному константному выражению (см. условие предыдущей задачи) вычисляет значение этого вы- ражения либо печатает сообщение об ошибке, если происходит переполне- ние в результате вычислений. ♦ 25. Проверьте, соответствует ли вводимая последовательность символов поня- тию скобки: <скобки> :: = <круглые> | <квадратные> <круглые> ::= (<квадратные><квадратные>) | + <квадратные> :: = [<круглые><круглые>] | - ♦ 26. Проверьте, соответствует ли вводимая последовательность символов поня- тию список_списков: <список_списков> ::= <список>[:<список>] <список> ::= <элемент>[,<элемент>] <элемент> ::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z ♦ 27. Проверьте, соответствует ли вводимая последовательность символов поня- тию скобки'. <скобки> ::= <круглые>|<квадратные> <круглые> :: = А|((<круглые>)[<квадратные>]) <квадратные> ::= В|[[< квадратные >](<круглые>)] * 28. Вводимая последовательность символов представляет собой формулу пока- занного ниже вида (М означает функцию max, am — min). Вычислите значение данной формулы: <формула> ::=<цифра> М(<формула>.<формула>)| т(<формула>.<формула>) <цифра> ::=0|1|2|3|4|5|6|7|8|9 ♦ 29. Проверьте, удовлетворяет ли вводимая последовательность символов поня- тию текст'. <текст> ::= <элемент>|<элемент><текст> <элемент> ::= а | b | (<текст>) | [<текст>] | {<текст>} ♦ 30. Опишите рекурсивную функцию, которая по заданным границам а и Ь, за- данной функции f(x) и заданной точности е методом деления отрезка попо- лам находит с точностью е корень уравнения f(x) = 0 на отрезке [а, 6]. Счи- тать, что е > 0, а < Ь,/(а) х/(6) < 0,/(х) — непрерывная и монотонная на [а, 6]. Задания для самостоятельной работы 1. Для заданного целого п вычислите значение суммы: п п п , п /i=l/2=1 i„
112 Глава 10. Рекурсивные подпрограммы Опишите рекурсивную функцию, которая по заданным вещественному хи це- лому п вычисляет величину х" согласно формуле: 1, л = 0, п Напишите программу вычисления функции Аккермана для всех неотрица- тельных целых аргументов т и и: А(09п) = л + 1, А(т9 п) = ’ А(т9 0) = А(т -1,1), т > 0, А(т9п) = А(т~1, А(т9п-1))9 т9п>0. Напишите рекурсивную функцию, которая вычисляет у = у/х по следую- щей формуле: л = 1; к.+1 = п = 0,1,2,.... За ответ принять приближение, для которого выполняется уело- вие |у„ - г/я+1| < е, где е - 0,0001. По вещественному числу а > 0 вычислите величину: а2 1+ Корни у = >[х вычислять с точностью Е - 0,00001 по следующей итерацион- ной формуле: k-\ Уп Уп 9 п = 0,1,2,..., приняв за ответ приближение г/л+1, для которого |z/n+1 - уп\ < Е. Для заданных границ интегрирования а и b вычислите значение определен- ного интеграла следующего вида: _ sin" !xcosx п -1 п п X 1 . _ ------sin2x, п = 2, 2 4 -cosx, и = 1;
Задания для самостоятельной работы 113 cos" xsinx п —1 п п cos” xdx = ( — + — sin 2х, 2 4 sinx, л = 1; п = 2, 1 cosx л 1 sin X п-2 г dx п -1 J sin"-2 х 1 х х lntg-,H = l, х, п = 0; d)f 1 sinx п-2 е dx п -1 cos'*”1 х п -1 J cos”"2 dx cos” x x, n = 0; —(ах-Ци = 1; . fl e™ cos'1"1 x(acosx + nsinx) л(и-1)р a2 + n2 a2 +n2 cos'1"2 x dx, 9 C ax n i le cos x dx = g) -e" (sin x+a cos x) -------------------L n = 1 2 2 ’ a +n* е<гп n —, « = 0; l a
114 Глава 10. Рекурсивные подпрограммы I е" sin” bx dx = h) easin'* 1 1 bx (a sin x-nb cos bx) + + —--2Tje sin 2 bx dx, n>2, „2 .1,2 CL + и Л —, И = О; I а , я = 1, xln" х-и|1пл 1 X |x In x - x9 n = 1; dx9 n > 1, dx = ' -ln|cosx|, « = 1, X, n = fy m) pg"* dx = < ln|sinx|, n = 1, x, n = 0;
Задания для самостоятельной работы 115 xm m cos ax +— [xw'1 cosaxJx, m > 1, n) Jx^sinax = < a aJ cosax ,m = 0; a cosax = х —sin ax а sinaxdx, m > 1, sin ax ------, m = 0. a
Глава 11 Строковый тип Теоретические вопросы 1. Является ли тип strl ng структурированным типом данных? Обоснуйте свой ответ. 2. Что представляет собой тип string: а) последовательность английских букв; Ь) последовательность русских букв; с) последовательность символов ПЭВМ? 3. Какое максимально возможное количество символов может содержать строка? 4. Каково функциональное назначение типа strl ng? 5. Как при описании строкового типа указывается длина строки? 6. Может ли пользователь задать длину строки? Если да, то каким образом? 7. Всегда ли фактическая длина строки равна объявленной в описании? 8. Перечислить типовые операции над строками. 9. Каким образом в переменную типа string можно поместить какое-то кон- кретное значение? 10. Может ли в процессе выполнения программы изменяться фактическая дли- на строки? 11. Может ли в процессе выполнения программы фактическая длина строки стать больше, чем объявлено в описании? Что произойдет в этом случае? 12. Если длина строки не указана при объявлении типа stri ng, то чему она равна по умолчанию? 13. Могут ли переменные строкового типа быть операндами выражений? 14. Верно ли, что тип string аналогичен одномерному массиву символов array [0..n] of char? 15. Чем отличается тип string от одномерного массива символов array [0..п] of char?
Задачи, программы 117 16. Верно ли, что к любому символу в строке можно обратиться точно так же, как к элементу одномерного массива? 17. Какие операции отношения можно применять к переменным типа string? Каков их приоритет? 18. Как происходит сравнение строк: а) одинаковой длины; Ь) разной длины? 19. Пусть s — переменная типа strl ng. Что является результатом действия стан- дартных операторов read(s), write(s), readln(s), writeln(s)? 20. Перечислите основные процедуры и функции для обработки строк. Задачи, программы 1. Напишите программу, которая включала бы в себя подпрограммы, имитирую- щие основные стандартные процедуры и функции работы со строками. 2. Выясните, имеются ли среди вводимых символов все буквы, входящие в слово «змея». *3. Для большинству существительных, оканчивающихся на -онок и -енок, мно- жественное число образуется от другой основы. Как правило, это происходит по образцу: цыпленок — цыплята, мышонок — мышата и т. д. (в новой основе перед последней буквой т пишется а или я в зависимости от предыдущей буквы: если это шипящая, то а, иначе — я). Имеются слова-исключения, из которых укажем следующие: ребенок (дети), бесенок (бесенята), опенок (опя- та), звонок (звонки), позвонок (позвонки), подонок (подонки), колонок (ко- лонки), жаворонок (жаворонки), бочонок (бочонки). Есть еще ряд малоупо- требительных слов-исключений, которые мы не рассматриваем. Пусть дан текст, среди символов которого имеется пробел. Группа символов, пред- шествующая первому пробелу, представляет собой русское слово, оканчиваю- щееся на -оцок или -енок. Получите это слово во множественном числе. *4. Пусть дан русский текст, слова которого разделены пробелами, запятой или точкой. Все слова, оканчивающиеся на -онок или -енок, представьте во мно- жественном числе. *5. Вводится строка. Если она является записью римского числа, то преобра- зуйте ее в целое число. 6. Напишите программу, позволяющую перемещать курсор в пределах экрана вверх-вниз, влево-вправо и допускающую ввод и отображение только рус- ских букв независимо от того, осуществлялось ли переключение на русскую раскладку клавиатуры. ПРИМЕЧАНИЕ Такие приемы удобно использовать для ввода информации в тех приклад- ных задачах, которые работают только с русскими текстами, чтобы не тра- тить время на переключение с латинской раскладки на русскую, что осо- бенно актуально для неквалифицированного пользователя.
118 Глава 11. Строковый тип * 7. Пусть вводится 10 произвольных имен. Необходимо распечатать их в алфа- витном порядке. Попытайтесь решить задачу, не сортируя сами имена. По- скольку требуется просто распечатать их в алфавитном порядке, заведите массив, содержащий порядковые номера имен. При необходимости пере- становки переставляйте не сами имена, а их порядковые номера. Такой под- ход особенно удобен, когда приходится сортировать сложные и «громозд- кие» объекты. ♦ 8. Напишите функцию revpositn, которая получает два параметра strl и str2 типа string и возвращает позицию начала первого появления в strl текста, содержащего литеры str2 в обратном порядке. Например, revpositn('внеш- ность '. ’ сон') должно возвратить 5, потому что подстрока ' нос' (переверну- тое 'сон') содержится в слове 'внешность' начиная с 5-й позиции. Заметим также, что revposltn(' внешность ’. ' нос') дает 0. ♦ 9. Напишите функцию rightposition, которая получает два параметра strl и str2 типа string и возвращает позицию начала последнего появления str2 в strl. Например, rightpos1t1on( 'Миссисипи', 'си') дает значение 6. ♦ 10. Напишите функцию count, которая получает два параметра strl и str2 типа string и возвращает число, указывающее, сколько раз str2 встречается в strl. Функция не должна изменять свои параметры. Кроме того, любая литера в strl может учитываться не более чем в одном вхождении str2. Например, count(' балалайка', ' ала') должна возвращать 1, а не 2. И. Напишите функцию nonalpha, которая получает параметр str типа string и возвращает позицию его первой литеры, не являющейся буквой (как латин- ского, так и русского алфавитов) строчной или прописной. Например, поп- alpha(' stev7n') дает 5. ♦ 12. Напишите функцию splite( name: string; var first, last: string), которая из параметра name, хранящего имя и фамилию человека, извлекает их в пере- менные fl rst (имя) и 1 a st (фамилия). Имя и фамилия разделены некоторым числом пробелов. Например, после обращения spl 1 te(' Вася Иванов'. strl, stг2) в strl должно оказаться слово 'Вася', а в str2 — 'Иванов'. Необходимо также предусмотреть обнаружение и обработку некорректных данных. В частно- сти, если в name вообще не окажется ни одного пробела, процедура должна установить в обоих выходных параметрах специальное значение 'error' (ошибка). Какие еще ошибочные ситуации следует учесть? ♦ 13. Пусть даны две строки strl и str2. Выясните, можно ли из strl путем пере- становки литёр получить строку str2. Напишите подпрограмму, которая ре- шала бы указанную задачу. ♦ 14. Напишите процедуру sortml d, которая сортировала бы ряд из п строк в алфа- витном порядке, основываясь на k-й литере каждой строки, где k является параметром, передаваемым процедуре sortml d. Например, если k = 3, то эле- менты ряда должны быть отсортированы по возрастанию значения в третьей литере каждой строки. Если длина строки меньше k, то будем предполагать, что его k-й литерой, реально не существующей, служит пробел. ♦ 15. Напишите процедуру сортировки строк в обратном алфавитном порядке.
Задачи, программы 119 16. Напишите подпрограммы encode (зашифровать) и decode (расшифровать), которые получают два параметра str и alpha типа st г 1 ng. В первом параметре задается слово, подлежащее шифрованию (дешифровке), второй представ- ляет собой некоторую перестановку 26 латинских букв алфавита. Принцип преобразования для шифрации состоит в следующем. Если некоторая буква в str является А?-й буквой в обычном алфавите, то вместо нее должна быть взята буква из k-и позиции «нового» алфавита alpha. Для подпрограммы де- шифровки используется обратный принцип. 17. Расширим предыдущую задачу. Напишите программу для тестирования под- программ encode и decode. Она должна начинаться с ввода ключа для шифро- вания и дешифровки — 26-буквенной строки. Затем вводится серия строк, подлежащих обработке. Над каждой строкой применяется сначала операция шифрования, а затем дешифровки. При этом необходимо контролировать не- которые ошибочные ситуации. Например, каждая содержащаяся в ключе буква должна быть представлена только один раз. 18. Напишите программу, которая будет вводить значения типа string и опре- делять, является ли каждое из них правильным идентификатором, удовле- творяющем требованиям языка Турбо Паскаль. Напомним вкратце правила построения имен. Всякое имя может содержать от 1 до 127 литер; первой ли- терой должна быть латинская буква (строчная или прописная); любая дру- гая литера (начиная со второй) может быть буквой, цифрой (от 0 до 9) или знаком подчеркивания. Если обнаружена ошибка, необходимо выдать сооб- щение, квалифицирующее ее. 19. Усовершенствуйте программу из предыдущей задачи, чтобы она умела рас- познавать служебные слова языка Турбо Паскаль и отвергать попытки их предъявления. Для простоты ограничьте набор служебных слов, взяв за осно- ву только некоторые из них. 20. Усовершенствуйте программу из задачи 18, сделав возможным автоматиче- ское преобразование неправильных идентификаторов в синтаксически до- пустимые. Если исходная строка имеет слишком большую длину, укоротите ее до допустимого размера путем отбрасывания избыточных литер; если она пуста, добавьте букву х. Если первая литера не является буквой, то вставьте перед ней букву х. Если в строке присутствуют какие-то «незаконные» лите- ры, удалите их. 21. Напишите процедуру convert (преобразовать), получающую один параметр date (дата) типа string, содержащий значение календарной даты в форме мм/дд/гг (месяц/день/год). Например, 14 декабря 1960 г. будет изображено как 12/14/60. Задача процедуры convert состоит в преобразовании получен- ного значения к форме 'Месяц день. год'. Так, результатом преобразования только что приведенной даты должно стать'Декабрь 14. I960* (предполага- ется, что все даты относятся к XX веку). 22. Усовершенствуйте процедуру convert из задачи 21 так, чтобы месяц и (или) день в параметре date могли быть изображены не только двумя, но и при необ- ходимости однойдцифрой. Например, 17 мая 1929 г. может быть с одинако- вым успехом представлено как 05/17/29 или как 5/17/29.
120 Глава 11. Строковый тип * 23. Усовершенствуйте процедуру convert из задачи 21 так, чтобы любое некор- ректное значение даты отвергалось. В каких случаях исходную строку, опре- деляющую дату, можно считать некорректной? ♦ 24. Пусть задан текст, представляющий собой последовательность строк. При- знак конца текста вводится пользователем. Выведите на печать количество каждой из содержащихся в строке латинских и русских прописных букв в порядке частоты их появления. ♦ 25. Пусть задан текст, представляющий собой последовательность строк. При- знак конца текста вводится пользователем. Выведите на печать заданный - текст в порядке возрастания длин строк. ♦ 26. Пусть текст представляет собой последовательность строк. На каждой стро- ке находится имя, фамилия и отчество. Распечатайте все отчества по алфа- виту, а также текст, содержащий строки, состоящие только из имен и фами- лий. 27. Пусть задано десять русских имен. Проверьте, все ли эти имена написаны с прописной буквы; если нет, то исправьте ситуацию.
Глава 12 Записи,оператор присоединения Теоретические вопросы lf Верно ли, что запись относится к структурированным типам данных? 2. Дайте определение поля записи. 3. Верно ли, что поля записи должны иметь один и тот же тип? 4. Как осуществляется ссылка на компоненты записи? 5. Может ли компонент записи быть помечен более чем одним именем? 6. Может ли типом поля записи быть массив? 7. Могут ли записи иметь вложенную структуру? 8. Каков максимально допустимый уровень вложенности записей? 9. Могут ли во вложенных записях имена полей повторяться на разных уров- нях вложенности? 10. Верно ли, что значения переменных типа запись можно присваивать пере- менным того же типа? 11. Могут ли совпадать имена полей различных записей? 12. Могут ли совпадать имена, полей одной и той же записи? 13. Как можно оценить объем памяти, необходимой для хранения записи? 14. Можно ли значения полей записи использовать в выражениях? 15. Дайте определение составного имени. Из каких частей оно состоит и как за- писывается? 16. Чем запись отличается от массива? 17. Какой оператор используют для упрощения доступа к полям записи? 18. Когда применяется запись с вариантами? 19. Из каких частей состоит запись с вариантами? 20. Сколько вариантных частей может быть в любой записи с вариантами?
122 Глава 12. Записи, оператор присоединения 21. Верно ли то, что вариантная часть расположена за всеми фиксированными полями? 22. Что такое поле признака? Для чего оно используется в записи с вариан- тами? 23. Как описываются компоненты каждого варианта записи? 24. Сколько вариантов может иметь вариантная часть записи? 25. Как можно оценить объем памяти, выделяемой для записи с вариантами? 26. Почему в вариантной части записи не ставится слово end, закрывающее опе- ратор case... of? 27. Верно ли, что ключ выбора должен быть стандартным или предварительно объявленным порядковым типом? 28. Как влияет ключ выбора на количество следующих ниже вариантных полей? 29. Можно ли ключу выбора в исполняемой части программы присвоить неко- торое значение и таким образом повлиять на выбор полей? 30. Пусть Zap — переменная типа запись, состоящая из нескольких полей. Мож- но ли инициализировать значение этой переменной с помощью стандартной процедуры ввода read (Zap)? 31. Верно ли, что все поля записи должны быть разных типов? 32. Почему при описании записи ее поля могут перечисляться в любом порядке? 33. Верно ли, что названия полей записи могут совпадать с именами переменных, констант и других объектов программы, но не могут совпадать с названиями полей других записей? 34. Почему при обращении к полю записи имя поля должно указываться явно и не может быть задано в виде выражения? Задачи, упражнения, программы 1. Опишите комбинированный тип для определения следующего понятия: а) цена в рублях и копейках; Ь) время в часах, минутах и секундах; с) дата (число, месяц, год); / d) адрес (город, улица, дом, квартира); е) семинар (предмет, преподаватель, номер группы, день недели, часы заня- тия, аудитория); f) бланк требования на книгу (сведения о книге: шифр, автор, название; све- дения о читателе: номер читательского билета, фамилия, дата заказа); g) экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 стро- чек с полями: фамилия студента, номер его зачетной книжки, экзаме- национная оценка).
Задачи, упражнения, программы 123 2. Опишите следующее понятие в виде массива или записи, а если возможно, то и в том и другом виде: а) обозначение поля шахматной доски (а5, h8 и т. п.); Ь) комплексное число; с) точка в 50-мерном пространстве. 3. Пусть дан фрагмент программы: type точка1 = array [ (х. у) ] of real: точка2 = record х. у: real end: var pl: точка1;' p2: точка2; d: real: а) объясните, почему допустим данный раздел типов, хотя в нем одними и те- ми же именами (х и у) обозначены разные объекты (индексы и поля); Ь) присвойте переменной d значение расстояния между точками pl и р2; с) подумайте, допустимы ли конструкции pl[succ(х)] и p2.succ(x). 4. Пусть дан фрагмент программы. Требуется переменной К присвоить значе- ние, соответствующее кругу радиуса 2,5 с центром в точке (0; 1,8). В каких из перечисленных ниже операторов присоединения правильно решается эта за- дача, а в каких нет? type круг = record радиус: real: центр: record х. у real end end: var К: круг: a) with К do begin радиус := 2.5: х := 0: у :» 1.8 end: b) with К do begin радиус := 2.5; with центр do begin x := 0; У := 1.8 end end;
124 Глава 12. Записи, оператор присоединения с) with К, центр do begin радиус := 2.5; х 0; у:= 1.8 end; / d) with центр. К do begin радиус ;= 2.5; х ;= 0; у ;= 1.8 end; 5. Используя следующий фрагмент программы, опишите логическую функцию Бьет (KI. К2, КМ), проверяющую, «бьет» ли карта К1 карту К2, с учетом того, что масть КМ является козырной. type масть = (пики, трефы, бубны, червы); достоинство = (шесть, семь, восемь, девять. десять, валет, дама, король, туз); карта = record м: масть; д: достоинство end; 6. Используя следующий фрагмент программы, опишите логическую функцию ПравильныйРяд(г), которая проверяет, правильно ли выставлены кости доми- но в ряду г (равна ли правая цифра очередной кости левой цифре следую- щей кости). type КостьДомино = record левая, правая; 0 .. 6 end; ряд = array [1..28] of КостьДомино; 7. Используя следующий фрагмент программы, опишите перечисленные ниже функции: type поле = record вертикаль; (a. b. с. d. е. f. g. h); горизонталь: 1 .. 8 end; а) функция ХодСлона(п1, п2) проверяет, находится ли фигура с поля п2 под боем у слона, который стоит на поле nl; Ь) функция ХодЛадьи(п1, п2. пЗ) проверяет, может ли ладья за один ход пе- рейти с поля nl шахматной доски на поле п2. Если нет, надо указать про- межуточное поле пЗ, через которое ладья может попасть на поле п2 за два хода; с) функция ХодКоня(п1, п2) проверяет, можно ли конем с поля nl объявить шах, если король находится на поле п2; d) функция ХодФерзя (n 1. п2) проверяет, может ли ферзь за один ход перейти с поля nl шахматной доски на поле п2.
Задачи, упражнения, программы 125 8. Используя следующий фрагмент программы, найдите самую длинную реку из списка С и напечатайте ее название. type строка = array [1..15] of char; река = record название: строка; длина: integer end; список = array [1..30] of река; 9. Пусть дан фрагмент программы. Используя оператор присоединения, при- свойте переменной Ад pl значение, соответствующее адресу: Воронеж, ул. Осту- жева, д. 1, кв. 70. Кроме того, переменной Адр2 присвойте такое же значение, заменив в нем номер квартиры на 99. type строка = array [1..15] of char; адрес = record город, улица: строка; дом. квартира: 1..999 end; var Адр1. Адр2: адрес; ч 10. Определите комбинированный тип для представления анкеты школьника, включающий в себя его возраст, номера школы и класса и оценки по каким- либо пяти предметам. Опишите некоторую переменную данного типа и при- свойте ей значение, соответствующее следующей анкете: Петров Иван Иль- ич, 16 лет, 194-я школа, класс 96, оценки: 5,3,4,5,2. И. Используя следующий фрагмент программы, опишите перечисленные ниже функции: type имя = (Аня, Валя, Женя. Петя. Саша. Таня. Шура. Юра); данные = record пол: (муж. жен); рост: 140..200 end; группа = array [имя] of данные; а) функция СредРост( ГР ) определяет средний рост женщин из группы ГР; Ь) функция Высокий( ГР ) определяет имя самого высокого мужчины из груп- пы ГР; с) логическая функция ОдинРост ( ГР ) проверяет, есть ли в группе ГР хотя бы два человека одинакового роста. 12. Используя следующий фрагмент программы, опишите процедуру ИронияСудь- бы ( С ), которая печатает фамилии двух (любых) жителей из списка С, живу- щих в разных городах по одному адресу. type строка = array [1..20] of char; житель = record фамилия, город: строка; адрес: record
126 Глава 12. Записи, оператор присоединения улица: строка: дом. квартира: 1..999 end end: var список: array Cl..15] of житель: 13. Используя следующий фрагмент программы, опишите перечисленные ниже процедуры: type строка = аггау[1..16] of char: дата = record число: 1..31: месяц: 1..12: год: 1901..1997 end; анкета = record фамилия : строка; пол : (муж. жен); день рожд : дата end; группа = аггау[1..25] of анкета; а) процедура Старший(Гр, Фам) присваивает строке Фам фамилию самого стар- шего мужчины из группы Гр (считать, что такой есть и он единственный); Ь) процедура Печать (Гр. Бук) печатает все фамилии людей из группы Гр, на- чинающиеся с литеры Бук, и даты рождения этих людей. ♦ 14. В массиве содержится информация о зимней сессии 3-го курса. Сведения о каждом студенте (максимальное число студентов — 150) содержат следую- щие данные: фамилию (до 12 символов), номер группы (от 1 до 7), оценки по трем предметам (функциональный анализ, численные методы и экономика соответственно). Напишите программу, которая вводит эту информацию и пе- чатает следующие данные: а) фамилии студентов, имеющих задолженность хотя бы по одному предмету; Ь) процент студентов, сдавших все экзамены на 5 и 4; с) название предмета, который был сдан лучше всего; d) номера групп в порядке убывания средней успеваемости их студентов. ♦15. Сведения о студентах вуза записаны в массиве и содержит следующую ин- формацию: фамилия, имя, отчество, пол (М или Ж), возраст (от 16 до 35), курс (от 1-го до 5-го). Напишите программу, которая вводит эту информа- цию и печатает следующие данные: а) номер курса, на котором наибольший процент мужчин; Ь) самые распространенные мужские и женскце имена; с) фамилии (в алфавитном порядке) и инициалы всех студенток, возраст и отчества которых являются одновременно самыми распространенными. 16. Пусть дан фрагмент программы: type complex = record
Задачи, упражнения, программы 127 re, Im: real end: point = record x. у: real end; var z, w: complex; p: point; re: real: Определите, какие значения будут иметь переменные z, w, р и ге после выпол- нения следующих операторов: with z do begin re := 0; Im ;= 1 end; w := z; re := 2; with z do re := 1; z.lm := -w.lm; with p do begin x := re; У := 2 end: 17. Используя следующий фрагмент программы, опишите перечисленные ниже подпрограммы: type рац = record числ: integer; знам: 1..maxint end; массив = array[l..20] of рац; а) логическая функция Равно( а. b ) проверяет на равенство два рациональ- ных числа а и Ь; Ь) процедура Слож( а, b ) складывает рациональные числа а и Ь; с) процедура Сокр( г ) приводит рациональное число г к несократимому виду; d) процедура Мах( х. m ) присваивает параметру m наибольшее из рацио- нальных чисел массива х. 18. Используя следующий фрагмент программы, опишите процедуру Value( р. х. у ), которая вычисляет у — значение квадратного трехчлена ах2 +6х + с с коэффициентами из р в комплексной точке х. type complex = record re. Im: real end: coeff = record a, b. c complex { a<>0 } end:
128 Глава 12. Записи, оператор присоединения 19. Пусть даны комплексное число г (пара вещественных чисел) и веществе! ное число е > 0. Вычислить с точностью е значение следующей комплексно функции: 1 Z Z sn Z = Z +-------1---- 3! 5! 2л+1 Z 4* + • • •, (2л +1)! + (2л)! + "'; ♦ с) ch (~l)"z2,,+l + (2л+ 1)! ♦ е) cos , С-iy *2я ! . (2л)! f) ln(l + z) = 2л+1 (|z| < 1); arctg z = 2 2л + 1 20. Используя следующий фрагмент программы, опишите перечисленные ни» подпрограммы: const MaxN = 30: к type ВещТип = record знак: boolean; мантисса, порядок: real; end; список = array[l..MaxN] of ВещТип; а) функция MaxNeg(C) предназначена для нахождения минимального отр] цательного числа из списка чисел С; Ь) функция MaxDI (С) предназначена для нахождения максимального поря; ка числа из списка вещественных чисел С; с) процедура EqualDec(C, р) приводит все числа из списка С к единому п< рядку р. 21. Используя следующий фрагмент программы, опишите процедуру flfl(d, р преобразующую координаты точки на плоскости из декартовых d в поля] ные р, и процедуру ПД(р, d), выполняющую обратное преобразование. type декарт = record х, у: real end:
Задачи, упражнения, программы 129 поляр record г. fl: real { г >= 0. -pi < fi >= pi } end: 22. Используя следующий фрагмент программы и считая, что все даты даются по григорианскому календарю (в «новом стиле»), опишите перечисленные ниже функции: type число = 1..31: месяц = 1..12: год = 1..2000: дата e record ч: м: г: число: месяц: год end: ДеньНедели = (пн. вт. ср. чт. пт. сб. вс): а) функция ПослЧисло (d) вычисляет количество дней в том месяце, которому принадлежит дата d; b) логическая функция ВернаяДата(d) проверяет правильность даты d; с) функция ЧислоДней(d) подсчитывает, сколько дней прошло с 1 января 1-го года нашей эры до даты d; d) функция flH(d) предназначена для определения дня недели, на который приходится дата d (учтите, что 1 января 1-го года нашей эры было поне- дельником); е) функция riHTHHual3(d) определяет количество дней до даты d, которые были пятницами 13-го числа. 23. Пусть дан массив, содержащий даты. Каждая дата — это число, месяц, год. Найти: а) год с наименьшим номером; Ь) все весенние даты; с) самую позднюю дату. ' 24. Сведения об ученике состоят из его имени и фамилии, названия класса (года обучения и буквы), в котором он учится, оценок, полученных учеником за последнюю четверть. Пусть дан массив, содержащий сведения об учениках школы: а) выясните, имеются ли в школе однофамильцы; Ь) выясните, имеются ли однофамильцы в каких-либо параллельных клас- сах; с) ответьте на первые два вопроса, но в отношении учеников, у которых сов- падают и имя, и фамилия; d) выясните, в каких классах насчитывается более 15 учащихся; е) выясните, на сколько человек в восьмых классах больше, чем в десятых; ♦ f) соберите все сведения об учениках 9-х и 10-х классов, упорядочив их по году обучения и букве; 5 Зак. 906
130 Глава 12. Записи, оператор присоединения g) выясните, сколько учеников школы имеют оценки не ниже «четырех»; h) сформируйте массив из лучших учеников школы, то есть из учеников, не имеющих отметок ниже «четырех» и по сумме баллов не уступающих дру- гим ученикам своего и параллельных классов; i) проверьте правильность заполнения массива: всегда ли год обучения ле- жит в пределах от 1 до 11. 25. Багаж пассажира характеризуется количеством вещей и общим весом вещей. Пусть дан массив, содержащий информацию о багаже нескольких пассажиров: а) найдите багаж, средний вес каждой вещи которого отличается не более чем на 0,3 кг от среднего веса вещей всех пассажиров; Ь) найдите число пассажиров, имеющих более двух вещей, и число пасса- жиров, количество вещей которых превосходит среднее число вещей; с) определите, имеются ли два пассажира, багажи которых совпадают по числу вещей и отличаются по весу не более чем на 0,5 кг; d) выясните, имеется ли пассажир, багаж которого превышает багаж каждо- го из остальных пассажиров и по количеству вещей, и по весу; е) выясните, имеется ли пассажир, багаж которого состоит из одной вещи весом не менее 30 кг; f) дайте сведения о багаже, число вещей в котором не меньше, чем в любом другом багаже, а вес вещей не больше, чем в любом другом багаже с этим же количеством вещей; g) упорядочьте сведения о багаже по невозрастанию веса багажа; h) удалите сведения о багаже, общий вес вещей в котором меньше чем 10 кг. ♦2 6. Пусть дан массив, содержащий сведения о книгах. Сведения о каждой кни- ге — это фамилия автора, название и год издания: а) найдите названия книг данного автора, изданных с 1977 года; Ь) определите, имеется ли книга с названием «Информатика»; если да, то сообщите фамилию автора и год издания книги, если таких книг несколь- ко, то сообщите имеющиеся сведения обо всех этих книгах. ♦27. Пусть дан массив, содержащий сведения об экспортируемых товарах: указы- вается наименование товара, страна, импортирующая товар, и объем постав- ляемой партии в штуках. Составьте массив стран, в которые экспортируется товар (наименование задается пользователем), и общий объем его экспорта. 28. Пусть дан массив, содержащий сведения об игрушках: указывается название игрушки (например, кукла, кубики, мяч, конструктор и т. д.), ее стоимость в копейках и возрастные границы детей, для которых игрушка предназначена (например, для детей от 2 до 5 лет). Получите информацию: ♦ а) о названиях игрушек, цена которых не превышает 4 рублей и которые под- ходят детям до 5 лет; Ь) о цене самого дорогого конструктора; ♦ с) о названиях наиболее дорогих игрушек (цена которых отличается от цены самой дорогой игрушки не более, чем на 1 рубль);
Задачи, упражнения, программы 131 ♦ d) о названиях игрушек, которые подходят как детям 4 лет, так и детям 10 лет; ♦ е) о ценах всех кубиков; ♦ f) можно ли подобрать игрушку, любую, кроме мяча, подходящую ребенку 3 лет, и дополнительно мяч так, чтобы суммарная стоимость игрушек не превышала 5 рублей; ♦ g) имеется ли мяч ценой 2 рубля 50 копеек, предназначенный детям от 3 до 8 лет; если да, то выведите сведения об этой игрушке. 29. Пусть даны два массива М1 и М2. Массив М1 — это инвентарный массив, содержащий сведения о том, сколько изделий каких видов хранится на скла- де (вид продукции задается ее порядковым номером). Массив М2 — это вспо- могательный массив, содержащий сведения о том, на сколько уменьшилось или увеличилось количество изделий по некоторым видам продукции. Вспо- могательный массив может содержать несколько сведений по продукции одного вида или не содержать такого сообщения. Обновите инвентарный массив на основе вспомогательного. 30. Пусть дан массив, содержащий сведения о претендентах на руку и сердце. Сведения могут содержать следующие данные: фамилию, имя, отчество, воз- раст, рост, цвет глаз, цвет волос, зарплату, наличие квартиры, наличие маши- ны и т. п' Сформулируйте несколько критериев, по которым претенденты бу- дут отбираться. Напишите программу, предназначенную для ввода данных о претендентах и печати сведений о наиболее подходящих кандидатах в за- висимости от того или иного критерия. 31. Пусть дан массив, который содержит сведения о продаваемых квартирах. Сведения могут содержать следующую информацию: общая площадь, жи- лая площадь, площадь кухни, наличие санузла и его характеристики (совме- щенный'или нет), наличие лоджии, панельный или кирпичный дом, общее количество этажей в доме, этаж, на котором расположена квартира, район, в котором она находится, адрес, стоимость квартиры и т. п. Сформулируйте несколько критериев, по которым можно отобрать ту или иную квартиру для покупки и, основываясь на этих критериях, выведите сведения о ней. Если подходящих квартир несколько, то выведите сведения обо всех. 32. Пусть дан массив, содержащий сведения о жителях, обслуживаемых данной поликлиникой. Сведения содержат следующую информацию: фамилию, имя, отчество жителя, адрес, место работы, наличие прививки от дифтерии, дату прохождения последней флюорографии: а) напечатайте фамилии и адреса тех жильцов, которые не сделали привив- ку от дифтерии; Ь) сформируйте массив с данными о жильцах, у которых на данный момент просрочена дата флюорографии (дата просрочена, если с ее момента про- шло больше года). 33. Сведения о каждой машине включают в себя следующую информацию: мо- дель (строка длиной 10 символов), номер (код региона, цифровой код, бук- венный код), цвет, сведения о владельце (фамилия, имя, отчество), дата по- следнего техосмотра:
132 Глава 12. Записи, оператор присоединения а) выберите данные обо всех машинах, не прошедших техосмотр в текущем году; Ь) напечатайте информацию обо всех владельцах «Волг» черного цвета; с) по номеру машины выдайте всю имеющуюся информацию о ней. 34. Пусть дан фрагмент программы: type Строка = array [1..20] of char: ДеньНедели = (пн, вт. ср, чт, пт. сб, вс); Время e record часы: 0..23: минуты: 0..59 end; Семинар = record предмет, преподаватель: Строка: день: ДеньНедели; часы: record начало, конец: Время end; номер_группы: 1..300; аудитория: Integer; end; а) напечатайте расписание группы с номером п; Ь) опишите логическую функцию РасписаниеНеВерно, которая проверяет, нет ли «накладок» (одновременно проходят занятия у разных преподавате- лей в одной и той же аудитории или один преподаватель ведет занятия в разных аудиториях в одно и то же время); с) напечатайте названия предметов, которые ведет преподаватель с фами- лией Fam; d) выясните, в какое время проходит больше всего занятий; е) определите, есть ли занятия по субботам; f) определите, сколько преподавателей ведет занятия у группы с номером т; g) напечатайте названия тех предметов, занятия по которым проводятся по средам; h) определите количество занятий в неделю по каждому из предметов. 35. На факультете ПММ ВГУ существует две специализации: прикладная мате- матика (номера групп с 1-го по 6-й) и механика (группа 7). Сведения о препо- давателях имеют следующий вид: const Кол_воПреподавателей = 100; type Группа = 1..7; Группы_курса = array [Группа] of boolean; Группы_факультета = array[1..5] of Группы_курса; Преподаватель = record ФИО: string; Специализация: (математика, механика); { Обучаемые преподавателем группы }
Задачи, упражнения, программы 133 Список_групп: Группы_факультета end: Все_преподаватели = array [1..Кол_воПреподавателей] of Преподаватель: а) найдите всех преподавателей, которые ведут занятия только у студентов со специализацией «механика»; Ь) посчитайте количество преподавателей, у которых количество обучаемых групп максимально; с) напишите логическую функцию, которая определяет, есть ли преподава- тель, ведущий занятия только в одной группе, и, если такой есть, выведи- те его фамилию; d) напечатайте фамилии преподавателей, которые ведут занятия у студен- тов 2-го курса по обеим специальностям; е) выясните, есть ли преподаватели, которые ведут занятия у групп со спе- циализацией, отличной от собственной. 36. Точка задается своими координатами, которые могут быть полярными или декартовыми. Напишите функцию, которая определяет расстояние между двумя точками. 37. Пусть дан фрагмент программы: type Person = record Surname. Name, Address. City: string [20]: Post_index: string [4]: Telephone: string [12]: case hobby: (Computer. Music) of Computer: (type_computer: string [20]: Mbyte: byte): Music: (Instrument: array[1..3] of string [10]) end: tList = array [1..20] of Person: var List: tList: а) напечатайте фамилии всех людей, у которых имеется компьютер IBM PC XT; b) посчитайте количество людей, которые увлекаются музыкой; с) напечатайте данные обо всех различных музыкальных инструментах, ко- торые есть в списке List. 38. Пусть дан фрагмент программы: type tFigure = (circle, rectangle, triangle): tColor = (red. green, blue): Point = record x. y: real end;
134 Глава 12. Записи, оператор присоединения Figures = record color: tColor: case FigureType: tFigure of circle: (center: point: radius real ): rectangle: (si. s2 : point): triangle: (tl. t2. t3: point) end: tlist = array [1..20] of Figures: var List: tlist; Определите: ♦ а) суммарную площадь всех фигур; * b) лежит ли хотя бы один круг внутри какого-нибудь прямоугольника; ♦ с) количество треугольников голубого цвета; ♦ d) на сколько количество прямоугольников красного цвета превышает сум- марное количество кругов и треугольников зеленого цвета;
Глава 13 Множества Теоретические вопросы 1. Верно ли, что множество — это набор объектов, сгруппированных по како- му-либо признаку или группе признаков? 2. Дайте определение элемента множества. 3. Что называется базовым типом множества? 4. Может ли базовый тип множества быть вещественным? 5. В каких пределах можно изменять количество элементов, входящих во мно- жество? 6. Может ли множество не содержать ни одного элемента? 7. Как обозначается пустое множество? 8. Какой объем памяти занимает один элемент множества? 9. Каково внутреннее представление множества? 10. Может ли множество содержать элементы различных типов? 11. Может ли множество содержать несколько одинаковых элементов? 12. Что называется мощностью множества? 13. Какова мощность множества, базовый тип которого boolean? 14. Может ли тип диапазон быть базовым типом множества? 15. Могут ли два множества содержать одинаковые элементы? 16. Верно ли, что два множества эквивалентны тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов во множестве не имеет значения? 17. Какие операции допустимы над множествами? 18. Как работает операция in? 19. Какие множества считают равными; неравными? Имеет ли значение для срав- ниваемых множеств порядок следования элементов? 20. Каково назначение операций «больше или равно», «меньше или равно», при- мененных к данным множественного типа?
136 Глава 13. Множества 21. Что называется объединением множеств? 22. Что называется пересечением множеств? 23. Что называется разностью множеств? 24. Верно ли, что спецификациями элементов конструктора множеств могут быть константы или выражения базового типа, а также тип диапазон того же базо- вого типа? 25. Может ли конструктор множества стоять в правой части оператора присваи- вания? 26. Можно ли конструктор множества использовать в выражении? Упражнения, задачи, программы 1. Пусть дан фрагмент программы. type bits = set of 0..1; var x: bits; y: set of ( a, b. c ); z: set of Определите: а) базовый тип каждого из указанных множественных типов; Ь) сколько и каких значений может принимать каждая из переменных х, у и z. 2. Если в базовом типе п различных значений, то сколько различных значений в построенном на его основе множественном типе? 3. Пусть дан фрагмент программы: type ДеньНедели = ( пн. вт. ср. чт. пт. сб. вс ); Опишите множественный тип, включающий в себя множества из перечи- сленных ниже элементов: а) названия любых дней недели; Ь) названия рабочих дней недели. 4. Какие из следующих описаний не верны и почему? type точки = set of real; байт = array [ 1..8 ] of 0..1; данные = set of байт; месяц = ( янв. фев. мар. апр. май. июн, июл. авг. сен. окт. ноя-, дек ); Ml = set of месяц; М2 = set of июн..авг; М3 = set of дек..фев; М4 = set of ( июн. июл. авг ); 5. Какие из следующих конструкций являются множествами (в смысле языка Паскаль), # какие нет? а) [ 7. 15. 2, 4 ]; Ь) [ 3 9, 12. 45 ]; с) [ 7 ..15 . 9 25 ];
Упражнения, задачи, программы 137 d) [ '!' .. '!' ]; е) [ 1 .. 1 ]; f) [ true .. false ]; g) [.3 .. sqrt( 25 ) ]; h) [ •>='. ’>• ]; i) [ [ ]. [ 5 ] ]; j) [ odd( 9 ). 0<2 ]. 6. Пусть дан фрагмент программы: var р: set of 0..25: 1, j: Integer; Если 1 - 4 и j = 7, то какие значения получит переменная р при выполнении перечисленных ниже операторов присваивания: а) р := [ 1 + 5. j div 3. j .. sqr( i ) - 8 ]; b) p := [ i .. 3*j ]; c) p := [ 1. j. 5*1. 3*j ]. 7. Пусть дан фрагмент программы: var s: set of char: c. d: char: Присвойте переменной s перечисленные ниже множества: а) пустое множество; Ь) множество из строчных гласных латинских букв (а, е, i, о, и); с) множество из всех цифр; d) множество литер, которые больше с, но меньше d(c<d). 8. Вычислите значения отношений: а) [ 6 ] <> [ 6. 6. 6 ]; Ь) [ 'Г. '8' ] = [ '8'. 'Г ]; с) [ 6. 7, 8 ] = [ б .. 8 ]; d) [ 'п', 'пГ ] = [ 'п' .. 'ш' ]; е) [ 1, 7 ] <- [ 1 .. 9 ]; f) [ 2. 5 .. 8 ] <= [ 1 .. 6. 9 ]; g) [ ] <= [ 0 .. 9 ]; h) 'д' in [ 'а' .. 'z' ]; i) trunc( 6.7 ) in [ 1. 5. 6 ]; j) odd( 8 ) in [ ]; k) [ 6 ] < [ 4 .. 9 ]. 9. Эквивалентны ли выражения: a) p in [ 6, 7. 35 ] и ( p=6 ) or ( p=7 ) or ( p=35 ); b) p in [ 2 .. 57 ] и ( p >= 2 ) and ( p <= 57 ).
138 Глава 13. Множества 10. Пусть дан фрагмент программы. Присвойте переменной t значение true, если wd — рабочий день, и значение false — в противном случае. Какими из пере- численных ниже операций правильно решается эта задача? type ДеньНедели = ( пн. вт. ср. чт. пт. сб. вс ): РабочийДень = пн..пт: var wd: ДеньНедели; t: boolean: a) t := wd In РабочийДень; b) t := wd = РабочийДень; c) t := wd In [ РабочийДень ]; d) t := wd in [ пн .. пт ]; e) t := [ wd ] <= [ пн .. пт ]; f) t := [ wd ] = [ пн .. пт ]. ♦И. Вычислите значения выражений: a) [ 4. 6. 8 ]+[ 5. 7 ]; b) [ 4. 6. 8 ]*[ 5. 7 ]; c) [ 4. 6. 8 ]-[ 5. 7 ]; d) [ 7 ...12 M 9 .. 18 ]; e) [ 7 .. 12 ]*[ 9 .. 18 ]; f) [ 7 .; 12 ]-[ 9 .. 18 ]; g) [ 4, 7 ]+[ 1 .. 9 ]; h) [ 4. 7 ]*[ 1 .. 9 ]; i) [ 4. 7 ]-[ 1 .. 9 ]; j) [ ]+[ 23 ]; k) [ ]*[ 23 ]; 1) [ ]-[ 23 ]. 12. Вычислите значения выражений: a) [ 2 .. 13 ]*[ 3. 13 .. 60 ]+[ 4 .. 10 ]-[ 5 .. 15 ]*[ 6 ]; b) [ 2 .. 10 ]-[ 4. 6 ]-[ 2 .. 12 ]*[ 8 .. 15 ]; c) ( [ JO’ .. '7' ]+[ '2' .. ’9' ] )*( [ ’a' ]+[ ’z‘ ]). 13. Упростите (А и В — множества): a) A*B-A\ b) A-(A-B); c) (A + В) - (A - B) - (B - A); d) (А -В) + (B - A) + A*B. 14. Пусть дан фрагмент программы. Присвойте переменной В множество, полу- ченное из А перечисленными далее способами: var А. В: set of char:
Упражнения, задачи, программы 139 х: char; а) добавлением элемента х; Ь) удалением элемента х. 15. Найдите все ошибки в следующем фрагменте программы: type М = set of char; function f( a. b; M; x; char ); M; begin if a * b = 0 then a:= [ x ] else if a < b thpn a;= b + x else if ord (x) in a - b then a:e a - [ x..'<=' ]; f:= a + b end; 16. Пусть дан текст. Посчитайте общее число вхождений английских букв в текст. 17. Пусть дан текст. Верно ли, что в нем имеются буквы, входящие: а) в слово «шина»; ♦Ь) в слово, задаваемое пользователем? 18. Напишите процедуру, которая осуществляет ввод текста, состоящего из не- повторяющихся букв. 19. Пусть дан текст. Распечатайте те буквы, которые встречаются в каждом сло- ве текста только один раз. 20. Пусть дан текст. Найдите наибольшее количество цифр, идущих подряд. 21. Пусть вводится последовательность символов длиной не более 4. Если все вводимые символы — цифры, то выполните преобразование данной после- довательности в целое число. 22. Пусть дан текст. Определите, содержит ли он символы, отличные от букв и пробелов. 23. Пусть дан фрагмент программы. Опишите процедуру Print (А), печатающую в алфавитном порядке все элементы множества А типа TLetter. type TLetter = set of ’a’..'z *; 24. Пусть дан текст, состоящий из строчных латинских букв и цифр. Определи- те, каких букв — гласных (а, е, i, о, и) или согласных — больше в этом тексте. 25. Пусть дан текст, оканчивающийся точкой. Напечатайте: ♦ а) первые вхождения символов в текст, сохраняя их исходный порядок; * Ь) символы, входящие в текст не менее двух раз; с) симолы, ходящие текст только один раз в порядке их пояления; ♦ d) символы, входящие в текст только один раз, в порядке их кодов. 26. Пусть дана непустая последовательность слов из строчных русских букв. Между соседними словами присутствует запятая, за последним — точка. На- печатайте в алфавитном порядке: ♦ а) гласные буквы, которые входят в каждое слово; Ь) согласные буквы, которые не входят ни в одно слово; с) все звонкие согласные буквы, которые входят хотя бы в одно слово; ♦ d) все глухие согласные буквы, которые не входят хотя бы в одно слово;
140 Глава 13. Множества ♦ е) все глухие согласные буквы, которые не входят только в одно слово; f) все звонкие согласные буквы, которые входят более чем в одно слово; ♦ g) все гласные буквы, которые не входят более чем в одно слово; ♦ h) все звонкие согласные буквы, которые входят в каждое нечетное слово и не входят ни в одно четное слово; * i) все глухие согласные буквы, которые входят в каждое нечетное слово и не входят хотя бы в одно четное слово. ПРИМЕЧАНИЕ Буквы а, е, и, о, у, ы, э, ю, я — гласные; все остальные — согласные, кроме й, ь, ъ. Звонкие согласные — б, в, г, д, ж, з, л, м, н, р; глухие согласные — к, п, с, т, ф, х, ц, ч, ш, щ. 27. Пусть дано натуральное число п (п > 2). Найдите все меньшие п простые числа, используя решето Эратосфена. Решетом Эратосфена называют следующий способ определения простых чисел. Выпишем подряд все целые числа от 2 до п. Первое простое число 2. Подчеркнем его, а все большие числа, кратные 2, зачеркнем. Первое из оставшихся чисел — 3. Подчеркнем его, а все большие числа, кратные трем, зачеркнем. Первое число из оставшихся теперь — 5, так как 4 уже зачеркнуто. Подчеркнем его как простое, а все большие числа, крат- ные пяти, зачеркнем и т. д. ♦28. С помощью решета Эратосфена (см. предыдущее задание) найдите четверки меньших п простых чисел, принадлежащих одному десятку (например, И, 13,17,19). 29. Пусть дано 100 целых чисел от 1 до 50. Определите, сколько среди них чисел Фибоначчи и сколько чисел, первая значащая цифра в десятичной записи которых — 1 или 2. 30. Пусть дан фрагмент программы. Опишите функцию QuantDays(m), определя- ющую количество дней в месяце m невисокосного года. type month = 1..12; 31. Пусть дан фрагмент программы. Опишите функцию Gard (А), подсчитываю- щую количество элементов во множестве А типа М. Например, Card([5. 8, 23])=3. type М - set of 1..99; 32. Пусть дан фрагмент программы. Опишите функцию Sum(A, SI. S2), вычи- сляющую сумму тех элементов матрицы А, номера строк и номера столб- цов которых принадлежат соответственно непустым множествам S1 и S2 типа num. const n = 10; type number = 1..n; matrl*» array [ number, number ] of real; num = set of number; 33. He используя дополнительных переменных, поменяйте местами значения А и В множественного типа (предполагается, что множествах и В не содержат общих элеиентов ).
Упражнения, задачи, программы 141 34. Пусть дан фрагмент программы. Определите х, у, z, где х — множество целых чисел от 5 до 33, у — множество простых чисел, z — множество составных чисел. var х. у. z: set of 5..33: 35. Пусть дан фрагмент программы. Опишите перечисленные ниже подпро- граммы: type NatDig = 1..Maxint: а) функция Dlgit(n) подсчитывает количество различных значащих цифр в десятичной записи числа; Ь) процедура Print(n) печатает в возрастающем порядке все цифры, не вхо- дящие в десятичную запись числа п. 36. В возрастающем порядке напечатайте все целые числа из диапазона 1... 10 000, представимые в виде п2 + ти2, где т, п > 0. 37. В порядке убывания напечатайте все целые числа из диапазона 1 ...4900, кото- рые представимы в виде п2 + 2k2, но не представимы в виде lij + j + 3 (и, k, i,j > 0). 38. Пусть дан фрагмент программы. Опишите процедуру НаличиеСМа г, А. В, С), которая по информации из массива Маг типа магазины присваивает парамет- рам А, В, С типа ассортимент значения, перечисленные ниже. type продукт « ( хлеб, масло, молоко, мясо. рыба. соль. сыр. колбаса, сахар, чай. кофе ): ассортимент - set of продукт: магазины « array El..20] of ассортимент: а) А — продукты, которые есть во всех магазинах; Ь) В — продукты, которые есть хотя бы в одном магазине; с) С — продукты, которых нет ни в одном магазине. 39. Пусть дан фрагмент программы. Опишите логическую функцию Везде(ГР), определяющую, есть ли в группе ГР хотя бы один человек, побывавший в гос- тях у всех остальных из группы (ГР[х] — множество людей, побывавших в гостях у человека с именем х; х ё ГР[х]). type имя = ( Вася. Володя. Ира. Лида, Марина. Миша. Наташа. Олег. Оля. Света. Юля ): гости = set of имя: группа = array [ имя ] of гости; 40. Пусть дан фрагмент программы. Опишите процедуру МожноПопасть(Р, Н. К), которая по рейсам Р (Р[х] — множество городов, в которые можно за один рейс доехать из города х) определяет К — множество городов, в которые мож- но попасть автобусом (за один рейс или через другие города) из города Н. type город = ( а .Ь .с ,d .е ,f . g. h ): города = set of город: рейсы - array [город] of города; 41. Вычислите определитель заданной квадратной матрицы А n-го порядка (п = 15), используя формулу: л det(^) = £(-1) + аи • det(^t), к=\
142 Глава 13. Множества где Ak — матрица, полученная удалением первой строки и k-vo столбца. Для этого определите рекурсивную функцию от параметров I и s, которая по фор- муле вычисляет определитель матрицы, полученной из А удалением первых / строк и всех столбцов, номера которых принадлежат множеству s. Задания для самостоятельной работы 1. Составьте программу вычисления суммы номеров мест, на которых в слове S стоят гласные буквы. 2. Пусть вводится последовательность чисел в диапазоне от 1 до 255. Признак конца последовательности — 0. Определите переменные min и max как мини- мальное и максимальное из введенных чисел. Напечатайте по одному разу все числа из интервала (min, max), которые не были введены. 3. Пусть вводится последовательность символов. Признак конца последователь- ности — точка. Напечатайте все латинские буквы, которые есть в данной по- следовательности символов. 4. Пусть задана произвольная последовательность символов. Признак конца последовательности — точка. Напечатайте те символы, которые встречают- ся в данной последовательности более одного раза. 5. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен- ных пробелами. Слова представляют собой произвольную последователь- ность символов, отличных от пробела. Напечатайте все слова, которые со- стоят из тех же литер, что и последнее слово текста. 6. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен- ных пробелами. Слово представляет собой последовательность латинских букв. Напечатайте те слова, в которые не входит ни одна из букв первого слова. 7. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен- ных пробелами. Слово — последовательность русских букв (как строчных, так и прописных). Напечатайте слова, имеющие четный номер, которые со- стоят только из повторяющихся букв. 8. Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделен- ных пробелами. Слово — последовательность латинских букв. Напечатайте слова текста, имеющие нечетный номер, в которых нет ни одной повторяю- щейся буквы. 9. Пусть задана целочисленная квадратная матрица размерности п. Напечатайте все значения i (1 < i < и), при которых i-я строка симметрична, а i-й столбец упорядочен по убыванию. 10. Пусть задана целочисленная квадратная матрица размерности п. Элементы матрицы находятся в диапазоне от 1 до 100. Напечатайте все цифры из за- данного диапазона, которых нет ни в одной из строк заданной матрицы. И. Пусть задана целочисленная квадратная матрица размерности п. Известно, что значения элементов матрицы не меньше 0 и не больше 30. Напечатайте
Задания для самостоятельной работы 143 номера тех строк матрицы, которые содержат все целочисленные элементы, лежащие в диапазоне от минимального элемента рассматриваемой строки до ее максимального элемента. Например, рассмотрим строки матрицы размер- ности 5. Если строка состоит из элементов 1,3, 2, 5,4, то ее минимальный элемент равен 1, а максимальный — 5. Значения 2,3,4 как раз составляют все те числа, которые попадают в промежуток от 1 до 5, поэтому номер такой стро- ки необходимо напечатать. Если же строка состоит из элементов 7, 6,3,2,5, то весь диапазон от минимального элемента 2 до максимального элемента 7 не заполняется имеющимися в строке значениями. Не хватает значения 4. Поэтому номер такой строки печатать не следует. 12. Пусть задана символьная квадратная матрица размерности п. Напечатайте элементы матрицы, лежащие на ее главной диагонали, если все они отличны от элементов, принадлежащих побочной диагонали. Если это условие не вы- полняется, то напечатайте элементы побочной диагонали данной матрицы. 13. Пусть задана символьная матрица размерности п х т. Напечатайте все сим- волы, находящиеся в столбцах, элементы которых симметричны. 14. Напечатайте все целые числа, лежащие в диапазоне от 5 до 2500, которые представимы в виде 5п + 7т, где п и т — целые числа (т, п > 0). 15. Напечатайте все целые числа в диапазоне от 1 до 3600, которые представи- мы в виде п2 + т2, но которые нельзя представить как 5/ + 5k (т, n,k,l> 0). 16. Напечатайте все целые числа в диапазоне от 1 до 1600, которые представимы в виде х2 + у2, но которые нельзя представить в виде ху - с2, где с изменяется от 1 до 5. 17. Пусть заданы п отрезков с целочисленными координатами концов. Коорди- наты концов находятся в диапазоне от 0 до 100 включительно. Определите, существует «ли точка с целочисленными координатами, которая принадле- жит всем этим отрезкам. 18. В классе учатся 25 учеников. Каждому ученику были выставлены оценки за четверть по 15 предметам. Определите, сколько в классе отличников, хоро- шистов и троечников. 19. Известны результаты анкетирования ста человек. Анкета состоит из 150 пунк- тов, на которые предлагалось ответить утвердительно, отрицательно или «нет определенного мнения по данному вопросу». Напечатайте номера тех пунк- тов анкеты, на которые были получены только утвердительные и только от- рицательные ответы всех опрошенных (если, конечно, такие пункты есть). 20. В городе У имеется 100 кондитерских магазинов. Известно, что в каждом из этих магазинов не более 20 видов сластей в ассортименте. Какие виды слас- тей есть во всех имеющихся магазинах? Существует ли магазин, торгующий уникальной продукцией? Перечислите 5 видов сластей, которые есть в боль- шинстве магазинов города ЛГ(ассортимент кондитерских магазинов рассмат- ривайте как данные перечислимого типа). 21. Пусть заданы два предложения, слова в которых разделены запятыми или пробелами. Каждое предложение заканчивается точкой. Можно ли из букв
144 Глава 13. Множества первого предложения составить второе предложение и наоборот? Если нельзя ни то ни другое, то перечислите буквы, которых не хватает в первом (вто- ром) предложении, чтобы составить второе (первое). 22. В столовой имеются отдельные меню на завтрак, обед и ужин. Известно, что в каждом из этих меню не более 10 видов блюд. Определите, какие виды блюд имеются и на завтрак, и на обед, и на ужин, если такие есть. Определите виды блюд, которые есть только на завтрак, только на обед, только на ужин (виды блюд рассматривайте как данные перечислимого типа). 23. Вводится последовательность слов. Определите, какое количество слов по- требуется, чтобы задействовать все буквы английского (русского алфавита). Ввод слов оканчивается, когда задействованы все буквы. 24. Вводится слово-образец. Затем вводится список слов (не более 100). Опре- делите слова, в которых нет хотя бы одной буквы из слова-образца. Выведи- те такие слова, а также буквы, которых нет в слове-образце.
Глава 14 Файлы Теоретические вопросы 1. Что такое последовательный файл? 2. Какого типа могут быть компоненты файла? 3. Сколько компонентов может содержать файл? 4. Как определяется длина файла? 5. Нужно ли при определении файла заранее указывать его длину? 6. Могут ли одновременно быть доступны несколько компонентов последова- тельного файла? 7. Могут ли быть записями одного и того же файла следующие значения: "1", -5,1.73? 8. Куда помещается при записи очередной компонент файла? 9. Какая запись будет прочитана по команде чтения? 10. Какие действия выполняются системой по команде «открыть файл»? 11. Отличаются ли действия, соответствующие командам reset и rewrite? 12. Можно ли открыть одновременно для чтения и записи: а) типизированный файл? б) текстовый файл? 13. Можно ли прочитать файл, открытый для записи? 14. Можно ли изменить какую-то запись уже существующего последовательно- го файла? 15. Приведите описание и фрагмент программы для формирования последова- тельного файла из целых чисел и последующего его считывания. 16. Можно ли добавить новую запись в файл после того, как он был прочитан до конца? 17. Что произойдет при попытке чтения файла после того, как все записи про- читаны? 18. В каких случаях стандартная функция eof принимает значение true, а в ка- ких false при чтении файла и при записи?
146 Глава 14. Файлы 19. Может ли файл не содержать ни одной записи? Если может, то как об этом узнать? 20. В чем отличие процедур read и write? 21. В чем отличие процедур read и readln, write и writein? Какие из этих проце- дур применимы к: а) текстовым файлам? б) типизированным файлам? 22. Каково назначение операции close? 23. Что делает следующая программа? program WhatIsIt; var f: file of integer; i: i nteger; begin reset( f ); while not eof( f ) do begin read( f. i ); writeln( i ) end; close(f) end. {Whatlslt} Каковы действия программы в случае пустого файла f? Изменится ли смысл программы, если использовать следующий цикл? repeat read( f. i ); writeln( i ) until eof( f ); 24. Пусть дано описание файла. Можно ли из описания определить, какие опе- рации (чтение, запись) над этим файлом разрешены? 25. Пусть файл открыт для записи. Можно ли по состоянию флага eof(f) опре- делить, была ли сделана хотя бы одна запись в файл f ? 26. Как осущестить прямой доступ к компоненту файла? 27. Какой номер имеет первый компонент файла? 28. Какова структура текстового файла? 29. Каким образом можно дополнить данными: а) текстовый файл? б) типизированный файл? 30. Можно ли организовать прямой доступ к символам текстового файла? Упражнения, задачи, программы 1. Создайте файл целых чисел /. Числа считываются из стандартного устрой- ства ввода. Признаком конца ввода является число 9999. 2. Создайте файл целых чисел, занося в него числа Фибоначчи, не превос- ходящие заданного числа N.
Упражнения, задачи, программы 147 3. Пусть даны два файла целых чисел j\ и f2. Найдите в файле /2 число, самое близкое по величине к минимальному значению файла/Р ♦ 4. Пусть даны два файла целых чисел. Определите, в каком из них больше по- ложительных, отрицательных и нулевых значений. ♦ 5. Пусть дан файл целых чисел. Определите, являются ли числа в файле упоря- доченными по возрастанию. ♦ 6. Пусть дан файл целых чисел. Определите, являются ли числа в файле упоря- доченными (по возрастанию или по убыванию). ♦ 7. Пусть дан файл, хранящий последовательность целых чисел. Определите, является ли последовательность знакопеременной. 8. Пусть дан файл целых чисел. Выберите наибольшее из них, принадлежащее интервалу [а, Ь]. Концы интервала a, b вводятся со стандартного устройства ввода. * 9. Пусть дан файл целых чисел. Создайте новый файл, значения в который за- писываются по следующему правилу: суммируются подряд идущие значе- ния одного знака; вместо группы нулей записывается один нуль. Например: исходный файл: 20 10 4 -1 -2 0 0 0 -10 41 62; ш файл-результат: 34 -3 0 -10 103. * 10. Пусть дан файл целых чисел. Определите, сколько раз в нем повторяется максимальное значение. * 11. Пусть дан файл целых чисел. Определите, сколько в нем интервалов воз- растания. 12. Пусть дан файл целых чисел/. Создайте два новых файла/2 и /3 из положи- тельных и отрицательных чисел соответственно. Если какой-то из создан- ных файлов окажется пустым, сообщите об этом. 13. Пусть дан файл целых чисел. Сформируйте два выходных файла целых чи- сел, записывая поочередно числа, образующие возрастающую последователь- ность, то в один то в другой файл. Например: зй исходный файл: fl: 2 4 3 8 15 -1 -3 10 1; первый файл-результат: f2: 2 4-11; второй файл-результат: f3: 3 8 15 -3 10. 14. Пусть дан файл целых чисел. Определите, где больше нулей — на четных или на нечетных позициях. 15. Пусть дан файл целых чисел. Создайте файл вещественных чисел, компонентами которого будут средние арифметические значения каждой пятерки подряд идущих чисел. Последняя группа может содержать меньше пяти значений. 16. Пусть в файлах^ и/2 целые числа упорядочены по возрастанию. Создайте файл /3, объединив/ и /2 и сохранив упорядоченность. * 17. Пусть дан файл целых чисел. Определите длину наибольшего интервала воз- растания и среднее арифметическое чисел этого интервала.
148 Глава 14. Файлы / * 18. Пусть дан файл целых чисел. Определите наибольшую сумму подряд иду- щих чисел, образующих возрастающую последовательность. ♦ 19. Пусть дан файл целых чисел. Определите, образуют ли числа арифмети- ческую прогрессию. 20. Пусть дан файл целых чисел. Значения в нем имеют следующий смысл: п\ fw /12 — Л», ni fn /22 — fin2 •••» где ~ количество оценок первого сту- дента, /, fn ... / — оценки первого студента, п2 — количество оценок второ- го студента, /21 f22 ... f2n^ — оценки второго студента и т. д. Задание: а) найдите номер студента, имеющего наибольшую среднюю оценку; Ь) создайте файл вещественных чисел со средними оценками каждого сту- дента. ♦ 21. Пусть даны два файла целых чисел. Определите, сопадают ли они. ♦ 22. Пусть даны два файла целых чисел. Определите, больше ли минимальное значение первого файла, чем максимальное значение второго. 23. Пусть дан файл целых чисел с диапазоном значений от а до Ь. Определите, сколько раз встречается каждое значение в файле. ♦ 24. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай- ле. Определите, есть ли в ней нулевые строки. ♦ 25. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай- ле. Определите, является ли она единичной. ♦ 26. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай- ле. Перенесите в новый файл т-й столбец матрицы (т задается вводом). *27. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай- ле. Определите, упорядочены ли значения m-го столбца по возрастанию (т задается вводом). ♦ 28. Пусть матрицаЛ целых чисел размером 100 х 100 записана по строкам в фай- ле. Найдите значение первого максимального элемента, а также номер стро- ки и номер столбца, соответствующие этому значению. ♦ 29. Пусть матрица Л целых чисел размером п х п записана по строкам в файле/. Создайте новый файл /2, в который перепишите ненулевые строки в следую- щем формате: kaki ak2... akkn, где k — номер ненулевой строки, kaki ak2... akk„ - значения k-й строки. ♦ 30. См. условие задания 13. Пусть дан файл /2. Создайте файл/. 31. Студентам 5-го курса была предложена анкета о том, знание каких из прочи- танных курсов могут потребоваться в будущей работе. Результаты анкети- рования были занесены в файл. Напишите программу создания файла анке- тирования. Список прочитанных курсов: ав математический анализ; 88 алгебра; 8g информатика; as численные методы; & дифференциальные уравнения;
Упражнения, задачи, программы 149 & теория вероятности; & функциональный анализ. 32. См. условие задания 31. Напишите программу обработки файла анкетиро- вания: по заданному предмету определите, сколько студентов назвали его полезным. 33. См. условие задания 31. Напишите программу обработки файла анкетирова- ния: выберите и напечатайте название предмета, получившего наибольшую оценку (если таких несколько — перечислите все). 34. См. условие задания 31. Напишите программу обработки файла анкетиро- вания: сколько студентов не оценили положительно ни один из предметов и сколько студентов оценили все предметы как полезные. 35. См. условие задания 31. Напишите программу обработки файла анкетирова- ния: определите, сколько студентов назвали полезными k и более предметов. 36. См. условие задания 31. Напишите программу обработки файла анкетирова- ния: распечатайте названия предметов в порядке убывания их рейтинга. 37. См. условие-задания 31. Напишите программу обработки файла анкетирова- ния: определите количество студентов, оценивших положительно все семь предметов, шесть предметов и т. д. 38. См. условие задания 31. Создайте новый файл, в который перенесите записи в следующем порядке: сначала ответы со всеми положительными оценками, затем ответы, в которых шесть положительных оценок, и т. д. 39. См. условие задачи 31. Напишите программу обработки файла анкетирова- ния: перенесите в новый файл записи с положительными оценками заданно- го предмета. 40. Полугодовая информация о подписных изданиях по каждому подписчику имеет следующую структуру: ФИО, участок доставки, адрес, количество выписанных изданий, список изданий. Адрес в свою очередь состоит из сле- дующих компонентов: улица, номер дома, номер квартиры. Список изданий состоит из следующих компонентов: название, вид, то есть газета или жур- нал, месяцы, на которые оформлена подписка. Список изданий представляет собой массив структур, содержащий У элементов, из которых заполнены К — количество выписанных изданий. Если подписчик оформил подписку на более чем N изданий, то для него имеется две или более записи, идущие под- ряд. Информация о месяцах подписки может, например, быть представлена в виде массива из двенадцати логических элементов. Создайте файл с ин- формацией о подписных изданиях. 41. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному номеру месяца и заданному изданию найдите коли- чество экземпляров, подлежащих доставке. 42. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному номеру месяца и названию издания распечатайте количество экземпляров, необходимых для каждого участка. Считайте, что записи в файле упорядочены по номеру участка доставки.
150 Глава 14. Файлы 43. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданным ФИО распечатайте список подписных изданий дан- ного подписчика (записей, относящихся к одному подписчику, может быть несколько). 44. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному названию издания и номеру месяца определите учас- ток, получающий больше всего экземпляров. * 45. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданному участку доставки и месяцу определите издание, на которое подписалось наибольшее число подписчиков. 46. См. условие задания 40. Напишите программу обработки файла подписных изданий: распечатайте ФИО подписчиков, оформивших подписку на наи- большее число изданий, независимо от количества месяцев. I ♦ 47. См. условие задания 40. Напишите программу обработки файла подписных изданий: определите участок доставки, на котором наибольшее число под- писчиков (учесть, что записей, относящихся к одному подписчику, может быть несколько). Пусть записи упорядочены по номеру участка. ♦ 48. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданным ФИО, участку доставки, адресу, названию издания выполните исключение данного издания из списка подписных изданий, то есть создайте новый файл, который будет соответствовать новому состоя- нию. Если указанное издание было единственным в записи, исключите запись. ♦ 49. См. условие задания 40. Напишите программу обработки файла подписных изданий: по заданным ФИО, участку доставки, адресу, названию издания, виду, месяцам, на которые оформлена подписка, добавьте информацию в файл, то есть создайте новый файл, который будет соответствовать новому состоянию информации. Если список изданий в записи заполнен, создайте новую запись. 50. Пусть дан файл, содержащий сведения об абонентах телефонной станции: ФИО, номер телефона, содержащий номер АТС и собственно номер. Пусть за- писи упорядочены по номеру телефона. Напишите программу создания фай- ла сведений об абонентах телефонной станции. * 51. См. условие задания 50. Добавьте новую запись в файл, сохраняя упорядо- ченность по номеру телефона. ♦ 52. См. условие задания 50. Распечатайте свободные номера по каждой АТС в виде интервалов, например: 45671-46000 46007 47000-47100... * 53. См. условие задания 50. Отсортируйте записи по полю ФИО. Реализуйте алгоритм внешней сортировки простым слиянием. & Используются один входной и два выходных файла. $ Z-проход (Z = 1,2,3,...) состоит из двух фаз: разделения и слияния. Разделе- ние — отсортированные серии длиной L из входного файла поочередно пе- реписываются в два выходных. Слияние — выходные файлы становятся входными, а входной — выходным, упорядоченные серии длиной L слива-
Упражнения, задачи, программы 151 ются в упорядоченные серии длиной 2L и записываются в выходной файл. Так продолжается до тех пор, пока длина серии после слияния не станет большей или равной по общему числу сортируемых записей. Результат помещается на место исходного файла. 54. Пусть файл Wages содержит сведения о заработной плате сотрудников пред- приятия в формате: № отдела, ФИО, Сумма к получению. Записи упорядоче- ны по полю № отдела. Напишите программу создания файла W^ges. 55. См. условие задания 54. Напишите программу распечатки ведомости по от- делам. ♦ 56. См. условие задания 54. Найдите отдел с самой высокой средней заработной платой. 57. См. условие задания 54. Найдите отдел с самой большой общей суммой вы- платы. 58. Пусть файл Ma rk содержит оценки учащихся класса за год в формате: Фамилия, Оценки по 10 предметам. Пусть таблица Name содержит названия предметов в том же порядке, в котором перечислены оценки в файле Mark. Задание: а) распечатайте фамилии отличников; ♦ Ь) по заданному названию предмета определите среднюю оценку класса по этому предмету; ♦ с) сравните средние оценки класса по двум заданным предметам; ♦ d) распечатайте название предмета с наилучшей средней оценкой. ♦59. Пусть файл содержит сведения о билетах спортлото, участвующих в тираже. Используя следующий фрагмент программы, напишите процедуру, которая по файлу типа Lottery (сведения о билетах, участвующих в тираже) и масси- ву типа Gain (выигрышные номера тиража) определяет количество билетов, в которых угадано три номера, четыре номера и все пять номеров. type Nom = 1..36: Rec - set of Nom; Lottery = file of rec; Gain = array Cl..5] of Nom; ПРИМЕЧАНИЕ В заданиях с 60-го по 84-е предполагается, что текстовый файл содержит строки длиной не более 80 символов. Строка состоит из слов, разделен- ных произвольным количеством пробелов. 60. Создайте текстовый файл. Текст вводится со стандартного устройства ввода. 61. Пусть дан текстовый фацл. Подсчитайте количество пустых строк. 62. Пусть дан текстовый файл Перепишите его содержимое в файл /2, сохра- няя строчную структуру и удаляя пустые строки. 63. Пусть дан текстовый файл. Слова не переносятся с одной строки на другую. Напечатайте строку с наибольшим количеством слов. Если таких строк не- сколько, напечатайте первые десять.
152 Глава 14. Файлы * 64. Пусть дан текстовый файл. Перенесите в новый файл все строки, содержа- щие заданное слово. * 65. Пусть дан текстовый файл. Перенесите в новый файл все строки, не содер- жащие заданного слова. ♦ 66. Пусть дан текстовый файл. В новый файл перенесите каждое слово как от- дельную строку. Переход к новой строке в исходном файле соответствуем пустой строке в новом файле. Пустых строк в заданном файле нет. 67. По файлу, содержащему строки-слова (см. условие предыдущего задания), получите первоначальный файл, в котором слова разделены одним пробелом. * 68. Пусть дан текстовый файл. Распечатайте первую строку, содержащую наи- большее число различных слов. ♦ 69. Пусть дан текстовый файл. Для каждой строки распечатайте слово наиболь- шей длины. Если их несколько, то распечатайте все. 70. Пусть дан текстовый файл. Распечатайте строку с заданным номером. ♦ 71. Пусть дан текстовый файл. Удалите строку с заданным номером. Если строки с указанным номером нет, сообщите об этом. 72. Пусть дан текстовый файл. Распечатайте все строки, начинающиеся с задан- ного слова. ♦ 73. Пусть дан текстовый файл. Распечатайте все строки, оканчивающиеся за- данным словом. 74. Пусть дан текстовый файл. Найдите строку максимальной длины. * 75. Пусть дан текстовый файл. Создайте новый файл на основе данного, оставив в каждой группе подряд идущих строк, отличающихся между собой только количеством пробелов между словами, одну с минимальным числом про- белов. 76. Пусть дан текстовый файл. Определите, сколько строк файла имеют длину, большую, равную и меньшую, чем заданное значение k. ♦ 77. Пусть дан текстовый файл. Создайте два выходных файла: в один перепи- шите из каждой строки первые р слов (р задается вводом), в другой — остав- шиеся. Если в строке меньше чем р слов, то во втором файле соответствую- щая строка должна быть пустой. 78. Пусть даны файлы, созданные по условию предыдущего задания. Выполни- те объединение двух файлов: из соответствующих двух строк входных фай- лов получите одну строку выходного файла путем их конкатенации. ♦ 79. Пусть дан текстовый файл. Распечатайте строки, предшествующие строкам, начинающимся с заданного слова. * 80. Пусть дан текстовый файл. Напечатайте первое из слов, в котором наиболь- шее число различных букв. Если длина слова больше 20, то распечатайте пер- вые 20 букв. * 81. Пусть дан текстовый файл. Для каждой строки распечатайте первое из слов, содержащее наибольшее число различных букв.
Упражнения, задачи, программы 153 ♦ 82. Пусть дан текстовый файл. Для каждой строки распечатайте слово с номе- ром (п + 1) div 2, где п — количество слов в строке. 83. Пусть дан текстовый файл. Создайте файл целых чисел, в котором каждой строке исходного файла соответствует в выходном файле число, равное коли- честву слов в строке. Пустой строке или строке, состоящей из одних пробе- лов, соответствует число 0. ♦ 84. Пусть дан текстовый файл. Максимальная длина слова в этом файле равна пяти символам. Создайте пять файлов. Каждой строке входного файла соот- ветствует одна строка в каждом из пяти файлов, в которые переписаны через пробел слова соответствующей длины: в первом файле — слова длины 1, во втором — слова длины 2 и т. д. Если слов длины k нет, то соответствующая строка k-ro должна быть пустой. 85. Пусть даны два текстовых файла. Определите, равны ли они. Равенство по- нимается в смысле совпадения соответствующих символов и одинакового деления на строки. ♦ 86. Пусть дан текстовый файл. Заменить последовательность Р1 подряд идущих символов последовательностью Р2. Последовательности Р1 и Р2 задаются пользователем. 87. Создайте файл информации по итогам сессии result.dat. Для каждой группы каждого курса в файл заносится следующая информация (количество кур- сов и групп на курсе фиксировано, сами номера курсов и групп в записи не хранятся): ss количество студентов в группе; & количество допущенных к сессии; & количество сдавших на «отлично»; $ количество сдавших на «отлично» и «хорошо»; & количество получивших «неудовлетворительно». 88. Используя прямой доступ к файлу result.dat (см. задание 87), распечатайте по заданному номеру курса и номеру группы информацию о результатах сессии. 89. Используя прямой доступ к файлу result.dat (см. задание 87), найдите и рас- печатайте информацию о количестве отличников на заданном курсе. 90. Напишите программу создания файла прямого доступа result3 итогов сес- сии факультетов ПММ (1), физического (2), математического (3). Структу- ру записи см. в задании 87. Названия (номера) факультетов, курсов и групп в запись не включайте. Считайте, что количество курсов и групп фиксировано. 91. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданному номеру факультета, номеру курса и номеру группы распечатайте информа- цию о результатах сдачи сессии группой. 92. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданному номеру факультета найдите группу с наименьшим числом неуспевающих. 93. Используя прямой доступ к файлу result3.dat (см. задание 90), по заданным
154 Глава 14. Файлы номерам факультетов сравните успеваемость заданных курсов (по количест- ву отличников и количеству неуспевающих). ♦94. Пусть в файле фамилий ffam находятся фамилии студентов (одна запись - одна фамилия), в файле оценок fnote — в том же порядке оценки студентов (одна запись — массив оценок одного студента), в файле fchg — изменения к файлу оценок (структура записи: номер студента, совпадающий с номером фамилии в файле ffam, номер измененной оценки, новая оценка). Записи упо- рядочены по номеру студента. Распечатайте список фамилий студентов, по- лучающих стипендию, то есть сдавших сессию на «хорошо» и «отлично». Фай- лы ffam, fnote, fchg читаются один раз. ♦95. Пусть заданы файлы ffam, fnote, fchg (см. задание 94). Используя прямой до- ступ, по заданной фамилии распечатайте оценки студента, учитывая возмож- ные пересдачи. 96. Создайте копию файла a.dat, скопировав его содержимое в файл b.dat. 97. Создайте нетипизированный файл info.dat, содержащий текстовую инфор- мацию о сотрудниках: & ФИО; & дата рождения: число, месяц, год; & адрес: улица, дом, квартира. 98. Используя нетипизированный файл info.dat (см. задание 97), распечатайте список сотрудников, у которых в заданном месйце день рождения. 99. Используя нетипизированный файл info.dat (см. задание 97), напечатайте список сотрудников, проживающих на заданной улице. * 100. Используя нетипизированный файл info.dat (см. задание 97), напечатайте список улиц, на которых проживают сотрудники (в списке названия не долж- ны повторяться). ♦ 101. Используя нетипизированный файл info.dat (см. задание 97), напечатайте фа- милии самого старшего и самого младшего сотрудников. Задания для самостоятельной работы Описание файлов Файл Студент Структура записи: & ФИО (40 знаков1); ® номер курса (1 знак); & номер группы (1 знак); & успеваемость — 5 экзаменов в каждой из 10 сессий; & форма обучения (целевая, договорная) (1 знак); 1 Число знаков здесь и далее рекомендуется, но не является обязательным.
Задания для самостоятельной работы 155 ss экзамен: — наименование предмета (10 знаков); — оценка (1 знак). Записи упорядочены по номеру курса, внутри курса — по номеру группы, в груп- пе — по ФИО. Файл Телефонный справочник Структура записи: « ФИО (40 знаков); ю адрес: — улица (20 знаков); — номер дома (4 знака); — квартира (3 знака); вв номер телефона (6 знаков). Записи упорядочены по ФИО. Файл Каталог файлов Структура записи: вв имя файла (8 знаков); спецификация (3 знака); as дата создания: — день (2 знака); — месяц (2 знака); — год (2 знака); зв количество блоков (4 знака). Записи упорядочены по именам файлов. Файл Каталог книг Структура записи: ® автор (40 знаков); & название (80 знаков); & год издания (4 знака); зв специальность (40 знаков). Записи упорядочены по фамилиям авторов. Варианты заданий 1. Создайте файл Студент. Напечатайте количество студентов, обучающихся на каждом курсе в Каждой группе. Информацию представьте в виде таблицы. 2. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент, добавив оценки заданной групры за последнюю сессию. Считать, что зимняя сессия сдана, а добавляются оценки за летнюю сессию.
156 Глава 14. Файлы 3. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент, добавив сведения о новых студентах. 4. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент, исключив сведения об отчисленных студентах. Студент считается отчислен- ным, если он имеет хотя бы одну неудовлетворительную оценку. 5. Создайте файл Студент. Из файла Студент занесите в отдельный файл записи об отличниках. 6. Создайте файл Студент. Из файла Студент занесите в отдельный файл записи о неуспевающих студентах. 7. Создайте файл Студент. Подсчитайте средний балл по заданному предмету на заданном курсе. 8. Создайте файл Студент. Подсчитайте средний балл каждой группы по задан- ному номеру курса и средний балл курса. 9. Создайте файл Студент. На каждом курсе найдите группу (группы), в кото- рой больше всего отличников. 10. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент о студентах, имеющих не более одной четверки за последнюю сессию. И. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент о студентах 5-го курса, упорядочив их по убыванию сумм баллов за все вре- мя обучения (ФИО, балл). 12. Создайте файл Студент. Занесите в отдельный файл записи из файла Студент, выполнив перевод студентов на следующий курс. Данные о студентах 5-го удалить. 13. Создайте файл Студент. Занесите в отдельные файлы записи о студентах раз- личных форм обучения. 14. Создайте файл Студент. Подсчитайте количество студентов, имеющих хоро- шие и отличные оценки за весь период обучения, по каждому курсу, по каж- дой форме обучения. 15. Создайте файл Каталог книг. Занесите в отдельный файл все произведения заданного пользователем автора. 16. Создайте файл Каталог книг. По заданному значению года издания занесите в отдельный файл сведения о произведениях, изданных в указанном году. 17. Создайте файл Каталог книг. По заданной специальности занесите в отдель- ный файл сведения обо всех изданиях (ФИО, название, год издания). 18. Создайте файл Каталог книг. Найдите специальность, по которой имеется наи- большее число книг. Считать, что различных специальностейне более 100. 19. Создайте файл Каталог файлов. Выберите и занесите в отдельный файл сведе- ния о файлах, размер которых превышает заданное число блоков. 20. Создайте файл Каталог файлов. Перепишите его в отдельный файл, упорядо- чив записи по количеству блоков.
Задания для самостоятельной работы 157 21. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах с заданной спецификацией. 22. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах с заданным именем. 23. Создайте файл Каталог файлов. Занесите в отдельный файл записи о файлах, созданных ранее указанной даты. 24. Создайте файл Каталог файлов. Найдите такие файлы, которые есть в трех модификациях — со спецификациями .PAS, .OBJ, .EXE. 25. Создайте файл Телефонный справочник. Выберите и занесите в отдельный файл по заданному адресу (улица, номер дома) сведения об абонентах, имеющих телефоны. 26. Создайте файл Телефонный справочник. Выберите и занесите в отдельный файл сведения об абонентах, имеющих телефоны, номера которых начинаются с заданных двух цифр. 27. Создайте файл Телефонный справочник. Найдите по ФИО номера телефонов и адреса абонентов. 28. Создайте файл Телефонный справочник. Найдите номер АТС (первые две циф- ры номера телефона), имеющей наибольшее число абонентов. 29. Создайте файл Телефонный справочник. По номеру телефона найдите ФИО и адрес владельца. 30. Напечатайте в произвольном порядке все разные слова, встречающиеся в дан- ном текстовом файле. Словами считать последовательности (длиной не бо- лее 20) прописных и строчных латинских букв. Для накопления слов исполь- зовать таблицу. 31. Напечатайте все разные числа из файла целых чисел в порядке их первого появления. 32. Пусть даны три упорядоченных по возрастанию файла целых чисел. Напе- чатайте наименьшее из чисел, встречающихся во всех трех файлах. Файлы должны быть прочитаны не более одного раза.
Глава 15 Динамические структуры данных Теоретические вопросы 1. У кажите принципиальное отличие статических переменных от динамических. 2. Приведите примеры нерационального использования оперативной памяти при применении статических переменных. 3. На каком этапе (компиляции, выполнения) происходит выделение памяти под динамические структуры данных? 4. На каком этапе (компиляции, выполнения) происходит выделение памяти под статические структуры данных? 5. Укажите причины использования динамических переменных. 6. Что называется указателем? 7. Какой объем памяти необходим для хранения указателя. 8. В каких случаях память под указатель выделяется статически, а в каких ди- намически? 9. Когда происходит выделение памяти для указателей, а когда для данных, на которые они указывают? 10. Что описывается в первую очередь — тип указателя или тип данных, на ко- торый он указывает? 11. Определено ли значение по умолчанию для переменных ссылочного типа? 12. Поясните роль базового типа при работе с указателями. 13. Для чего необходимо значение nl 1 при работе с указателями? 14. Что такое базовый тип? 15. Можно ли в качестве базового типа использовать тип, определяемый поль- зователем? 16. Что является значением переменной ссылочного типа?
Задачи, решения 159 17. Какое универсальное значение может быть присвоено любой переменной ссы- лочного типа? 18. Назвать операции, которые допускаются над значениями ссылочного типа. 19. Какие стандартные процедуры реализуют основные действия над динами- ческими переменными? 20. Каково назначение стандартных процедур new, dispose? Сколько параметров они имеют? Каков тип этих параметров? 21. К чему приводит «потеря» указателя на данные, хранимые в динамической памяти? 22. Ограничена ли динамическая память? Задачи, решения Списки Односвязный (однонаправленный) список 1. Реализуйте следующие операции для списков без заглавного (рис. 15.1) эле- мента и с заглавным (рис. 15.2) звеном (элементом): & инициализация списка; » добавление элемента в начало списка; & добавление элемента в конец списка; % удаление первого вхождения заданного элемента в список; переворот списка, то есть такая переустановка ссылок в списке, при кото- рой элементы списка следуют друг за другом в обратном порядке; «8 печать элементов списка; аз удаление всех элементов списка. Рис. 15.1. Список без заглавного звена 4 Заглавное звено Рис. 15.2. Список с заглавным звеном ♦2. Реализуйте процедуру удаления всех вхождений элемента Е в список L. 3. Подсчитайте число вхождений элемента Е в список L.
160 Глава 15. Динамические структуры данных 4. Упорядочьте элементы списка по убыванию, используя сортировку посред- ством выбора максимального элемента. Используйте список без заглавного элемента. 5. В решении предыдущей задачи (см. приложение 1) при сортировке списка обмен двух элементов списка реализован как обмен информационных час- тей. В реальных задачах обмен информационных частей неэффективен из-за их большого размера. Поэтому выгоднее переустанавливать указатели в спис- ке, не затрагивая информационных частей. На основе этого замечания реали- зуйте процедуру, упорядочивающую элементы списка по убыванию. 6. Слейте два упорядоченных по невозрастанию списка в один (также упоря- доченный по невозрастанию): а) построив новый список; Ь) поменяв соответствующим образом указатели в исходных списках. 7. Упорядочьте по возрастанию только: а) положительные элементы списка; Ь) элементы с четными порядковыми номерами в списке; ♦ с) элементы с порядковыми номерами, являющимися простыми числами. ♦ 8. В результате проведенного анкетирования Иванова Ивана Ивановича были определены ответы на поставленные вопросы (табл. 15.1). Представьте по- лученную информацию в виде списка характеристик, каждой из которых со- ответствует список значений характеристики. Определите процедуры добав- ления и удаления для характеристик и их значений. Таблица 15.1. Анкетные данные Иванова Ивана Ивановича Вопрос (характеристика) Ответ (список значений характеристики) Год рождения 1961 Семейное положение холост Увлечения программирование, футбол Любимые времена года весна, лето ♦ 9. Пусть дан упорядоченный список названий книг. Необходимо добавить ин- формацию о новой книге, сохранив упорядоченность списка. ♦ 10. Пусть дан список, хранящий слова некоторого предложения. Удалите из списка те вхождения слова «программирования», которым предшествует слово «языки». ♦ И. Пусть дан список. После каждого элемента добавьте предшествующую ему часть списка. * 12. Пусть элементы списка хранят следующие друг за другом символы некоторого предложения. Замените в списке каждое рхождение слова «тысячелистник» на словосочетание «лекарственное растение». 13. Проверьте, совпадают ли два списка А и В,
Задачи, решения 161 ♦ 14. Проверьте, содержатся ли элементы списка А в списке В в указанном спис- ком А порядке. ♦ 15. Упорядочьте элементы списка, используя сортировку простыми вставками. 16. Вычислите сумму тех элементов списка, значения которых меньше значе- ний всех элементов, непосредственно следующих за ними. 17. Пусть дан список Л, содержащий целые числа. Занесите в список В поряд- ковые номера максимальных элементов списка Л. 18. Определите, что является результатом работы следующей процедуры: procedure ZZZ( hl: TList ): var h2. h3 : TLIst: f: boolean: begin while hl <> nil do begin h2 := hl*.next: h3 := hl: f := true: while (h2 <> nil) and f do if hl*.info = h2*.info then f := false else begin h3 := h2: h2 := h2*.next end: if not f then begin h2 := hl*.next: new( hl*.next ): hl*.next*.info := h3*.info: hl*.next*.next : = h2; hl := hl*.next end: hl := hl*.next end end: { ZZZ } 19. Пусть дан список студентов. Элемент списка содержит: фамилию, имя, отче- ство, № курса, № группы, оценки по пяти экзаменам последней сессии. Вы- полните перечисленные ниже операции: а) предполагая, что фамилии студентов в списке упорядочены по алфавиту, удалите подсписок студентов, начиная с фамилии Петров и заканчивая фамилией Сидоров включительно; Ь) предполагая, что информация о студентах в списке упорядочена по но- меру курса, перенесите студентов 2-го курса в конец списка; ♦ с) удалите информацию о студентах 5-го курса и переведите остальных сту- дентов на следующий курс; б Зак. 906
162 Глава 15. Динамические структуры данных d) выведите информацию о начисленной стипендии, предполагая, что от- личникам выплачивается сумма S1, студентам, имеющим только «четвер- ки» и «пятерки», выплачивается сумма 52, троечникам стипендия не вы- плачивается. ♦ 20. Вычислите среднее арифметическое элементов непустого списка. ♦ 21. Опишите процедуру, которая формирует список L, включив в него по одно- му разу элементы, которые входят хотя бы в один из списков L1 и 12. ♦ 22. Опишите подпрограмму, которая в списке L из каждой группы идущих под- ряд равных элементов оставляет только один. 23. Многочлен Р(х) = апхп +апЧп~1 +... + а,х + а0 с вещественными коэффициен- тами можно представить в виде списка (рис. 15.3), причем если я, я 0, то соот- ветствующее звено в список не включается. Опишите: а) функцию Vai ue( Р, х), вычисляющую значение многочлена — списка Р в точ- ке х; ♦ Ь) подпрограмму, рассчитывающую производную многочлена — списка Р по переменной х; ♦ с) подпрограмму, интегрирующую многочлен — список Р по переменной х. Рис. 15.3. Представление многочлена в виде списка 24. Опишите подпрограмму, которая проверяет, есть ли в списке Хотя бы два одинаковых элемента. 25. Пусть в файле хранятся записи со сведениями об автомобилях и их владель- цах (марка, номер ГАИ, фамилия владельца). Необходимо: а) для каждой марки автомобиля составить список, содержащий фамилии владельцев автомобилей данной марки; Ь) для каждой фамилии владельца составить список, содержащий инфор- мацию об автомобилях, принадлежащих данному владельцу.. Двусвязный (двунаправленный) список 1. Пусть дан текстовый файл. Создайте двусвязный список, каждый элемент которого содержит количество символов в соответствующей строке текста. ♦ 2. Пусть с клавиатуры вводится последовательность хи х2,..., хп вещественных чисел, где п — заранее не известная величина. Ввод завершается символом перевода строки. Вычислите сумму произведений: 5 - хрсп + х2хп_1 +... + х^. Кольцевой список ♦ 1. «Считалка». N ребят располагаются по кругу. Начав отсчет от первого, уда- ляют каждого Х-го, смыкая круг после каждого удаления. Определите поря- док удаления ребят из круга.
Задачи, решения 163 ♦ 2. Пусть имеется кольцевой двусвязный список, содержащий целые числа из диапазона [0...1000]. Произвольный элемент выбирается в качестве рабочего. Для работы со списком определены только 4 перечисленные ниже операции: а) ШагВлево — смена рабочего элемента. Рабочим становится левый сосед те- кущего рабочего элемента; Ь) Ша гВправо — рабочим становится правый сосед текущего рабочего элемента; с) Прочитать — поместить в заданную переменную значение рабочего элемента списка; d) Записать — записать в рабочий элемент списка значение заданной пере- менной (значение переменной принадлежит диапазону 0... 1000). Необходимо определить число элементов кольцевого списка. Двоичное дерево 1. Реализуйте процедуру ввода двоичного дерева. 2. Реализуйте процедуру копирования двоичного дерева. 3. Подсчитайте число листьев (терминальных элементов) в заданном двоич- ном дереве. 4. Определите высоту заданного двоичного дерева. 5. В заданном двоичном дереве подсчитайте число элементов, равных макси- мальному. 6. Замените в заданном двоичном дереве все отрицательные элементы их абсо- лютными величинами. ♦ 7. Поменяйте местами максимальный и минимальный элементы заданного двоичного дерева, все элементы которого различны. * 8. Пусть для дерева А была сделана копия — дерево В, и из дерева В были уда- лены некоторые из ветвей. Необходимо сформировать список указателей на удаленные ветви дерева Л. 9. Проверьте, является ли заданное двоичное дерево сбалансированным. ♦ 10. Опишите процедуру, которая для заданного значения Устроит дерево сле- дующего вида: корнем является узел, информационная часть которого рав- на У; второй уровень содержит узлы со значениями У-1 и У-2; третий уро- вень — У-3, У-4, У-5, У-6; й т. д. Последний уровень может быть неполным и содержать узел с конечным значением — 1. 11. Формулу, описание которой дано ниже, можно представить в виде двоично- го дерева по следующим правилам: формула из одного терминала (цифры или переменной) представляется деревом из одной вершины с этим терми- налом, а формула вида (f{ s f2) — деревом, в котором корень — это знак 5, а левое и правое поддеревья — это соответствующие представления формул Л и/2- <формула>::=<терминал>|(<формула><знак><формула>) <знак>::= + | - | ★ | /
164 Глава 15. Динамические структуры данных <терминал>::=<переменная>|<цифра> <переменная>::=a|b|c|d|e|f|g|h|1|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z <цифра>::=0|1|2|3|4|5|6|7|8|9 Опишите подпрограмму, которая решает перечисленные ниже задачи: а) вычисляет значение дерева-формулы (считайте, что значения перемен- ных заданы массивом Value: array ['a’./z'] of real); * b) по формуле, содержащейся в текстовом файле, строит соответствующее дерево-формулу; ♦ с) печатает дерево-формулу в виде формулы; d) проверяет, является ли заданное двоичное дерево деревом-формулой; * е) упрощает дерево-формулу, заменяя в нем все поддеревья, соответствую- щие формулам (/+ 0), (0 +/),(/- 0), (/*1) и (1*/), поддеревьями, соот- ветствующими формуле/; поддеревья, соответствующие формулам (/*0) и (0*Д — с вершиной 0; поддеревья (а + ft), (а - 6), (а*й), (а/й), где а и b — константы, вершиной с, равной а + Ь, а - Ь, а*Ь, а/b соответственно; ♦ f) преобразует дерево-формулу, заменяя в нем все поддеревья, соответствую- щие формулам ((/У ± f2)*f3) и (J1*(f2 ±/3)), поддеревьями, соответствую- щими формулам (<J1*f3) ± (J2*f3)) и <SJ1*f2) ± (f1*f3))} * g) находит производную дерева-формулы по заданной переменной. Дерево двоичного поиска 1. Пусть задано дерево двоичного поиска. Реализуйте подпрограмму: а) добавления элемента в дерево двоичного поиска; ♦ Ь) удаления элемента из дерева двоичного поиска; с) поиска элемента в дереве двоичного поиска; * d) преобразования данного дерева в сбалансированное дерево двоичного поиска; е) подсчета числа элементов, больших заданного. 2. Пусть дан файл, содержащий целые числа. Сформируйте из них дерево поиска и выведите элементы дерева в порядке убывания значений. 3. Проверьте, является ли данное двоичное дерево деревом поиска. * 4. Пусть дан текстовый файл, содержащий слова, разделенные одним или не- сколькими пробелами. Слова содержат не более 20 символов. Определите частоту использования каждого слова в тексте. Результат оформить в виде таблицы, содержащей слова в лексикографическом порядке. Для хранения слов и ускорения поиска использовать дерео двоичного поиска. * 5. В заданном дереве найти поддерево двоичного поиска с максимальным коли- чеством элементов. Очередь 1. Реализуйте операции работы с очередью, построенной на основе: а) массива;
Задачи, решения 165 b) динамических структур. ♦ 2. Пусть дан текстовый файл А. Перепишите его содержимое в файл В, удалив при этом слова, длина которых меньше заданной. ♦ 3. Пусть дан текстовый файл А. Перепишите его содержимое в файл В, пере- нося при этом в конец каждой строки все входящие в нее знаки препинания. ♦ 4. Пусть задан массив Name[l. .N] (элементы имеют тип аггау[1. .15] of char), содержащий имена людей, и массив Chi 1 dren[l. .N, 1. .N] (элементы имеют тип bool еап), в котором Chi 1 dren[x, у]=true, если человек под номером у явля- ется ребенком человека под номером х. Для человека с заданным номером к напечатайте сначала имена всех его детей, затем — всех его внуков, затем — всех правнуков и т. д. * 5. Напечатайте элементы двоичного дерева в следующем порядке: сначала — элементы первого уровня, затем — элементы второго уровня, затем — эле- менты третьего уровня и т. д. ♦ 6. Пусть имеется три конвейера. Конвейеры работают независимо друг от друга. Изначально на первом конвейере располагаются детали N типов, а второй и третий — пусты. Время обработки детали каждого типа с каждого конвейера задается матрицей T1me[l..N,1..3]. После обработки детали с конвейера к она поступает на конвейер к+1. Назовем обработанную деталь с третьего конвейера изготовленной. Требуется по начальному расположению деталей на первом конвейере определить время, через которое все детали будут изготовлены. ♦ 7. Пусть даны две очереди X и У, содержащие вещественные числа. Из каждой очереди одновременно извлекается по одному числу х и у соответственно. Если х < у, то число (х + у) помещается в конец очереди X, иначе число (х - у) помещается в конец очереди У. Необходимо определить число шагов, через которое одна из очередей станет пустой. Стек 1. Реализуйте операции работы со стеком, построенным на основе: а) массива; Ь) динамических структур. 2. Распечатайте в обратном порядке символы введенной пользователем стро- ки, длина которой может превышать 255 символов. ♦3. Пусть в текстовом файле записана без ошибок показанная ниже формула (М обозначает функцию max, a m — mi п). Вычислите значение данной формулы (например, М(5.т( 6,8)) =>6). <формула>::=<цифра> | М(<формула>.<формула>) | т(<формула>,<формула>) <цифра>::»0|1|2|3|4|5|6|7|8|9 ♦4. Проверьте, является ли содержимое заданного текстового файла правиль- ной записью формулы следующего вида: <формула>::=<терм> | <терм> + <формула> | <терм> - <формула>
166 Глава 15. Динамические структуры данных <терм>::=<переменная>|<цифра>|(<формула>) <переменная>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z <цифра>::=0|1|2|3|4|5|6|7|8|9 5. Пусть в текстовом файле записано без ошибок логическое выражение следую- щего вида: <ЛВ>: :=*true | false | (not <ЛВ>) | (<ЛВ> and <ЛВ>) | (<ЛВ> or <ЛВ>), где not, and и or обозначают соответственно отрицание, конъюнкцию и дизъ- юнкцию. Вычислите значение этого выражения. *6. Преобразуйте арифметическое выражение в постфиксную форму. В выра- жение входят: а) переменные; Ь) целые числа; с) знаки плюс (+), минус (-), умножить (*) и разделить (/); d) круглые скобки. ♦7. Вычислите значение арифметического выражения, хранящегося в постфикс- ной записи. В выражение входят: а) целые числа; Ь) знаки плюс (+), минус (-), умножить (*), разделить (/) и унарный ми- нус (-). ♦ 8. Преобразуйте выражение из постфиксной формы в инфиксную. * 9. Карту, определяющую прямоугольную область моря, представили матрицей с логическими элементами (false — море, true — суша). Островом будем на- зывать совокупность соприкасающихся (вертикальной или горизонтальной стороной) клеток матрицы со значениями true. Рассчитайте число островов на матрице-карте. ♦ 10. Пусть даны два стека. Используя операции Извлечь, Занести и функцию Пуст- ЛиСтек (проверка факта очистки стека), подсчитайте общее число элементов в стеках. В качестве вспомогательных структур разрешается использование переменных целых типов. Алгоритм должен предусматривать восстановле- ние исходного расположения элементов в стеках. 11. Пусть дана логическая матрица, описывающая лабиринт (true — стена, false — проход) и начальное положение человека в лабиринте (х, у). Необходимо предложить вариант обхода всех доступных клеток лабиринта: ♦а) любой; *Ь) оптимальный. * 12. Распечатайте возрастающие серии последовательности целых чисел в обрат- ном порядке (серия — упорядоченная подпоследовательность максимальной длины). 13. Проверьте правильность расстановки скобок трех типов (круглых, квадрат- ных и фигурных) в выражении.
Задания для самостоятельной работы 167 Задания для самостоятельной работы 1. Реализуйте функцию поиска элемента Е в односвязном списке L. 2. Реализуйте процедуру Swap_Elems(Pl, Р2: TList), где Р1 и Р2 — указатели на звенья в двусвязном списке. Процедура предназначена для обмена местами двух звеньев путем переустановки ссылок в списке. 3. Подсчитайте число максимальных элементов списка. 4. Пусть в списке А хранится информация о людях (фамилия, имя, отчество, профессия). Имеется список В, содержащий перечень профессий. Удалите из списка А тех людей, чья профессия не указана в списке В. 5. Пусть дан список штучных товаров, хранящихся на складе (наименование, цена). В списке могут присутствовать одинаковые товары. Задание: а) составьте прайс-лист на товары (список, содержащий перечень различ- ных товаров и цен на них); Ь) вычислите среднюю цену на каждый товар; с) выведите перечень наименований товаров, чья цена ближе всего к сред- ней. 6. Пусть имеется У городов и задан список пар городов (i,j), между которыми существует прямая дорога. Напечатайте список городов, которые напрямую сообщаются более чем с тремя городами. 7. Пусть дан список слов. Из каждой группы подряд идущих одинаковых слов оставить только одно. 8. Пусть дан текстовый файл. Распечатайте слова, имеющие максимальную длину. 9. Пусть дан список вещественных чисел. Проверьте, упорядочены ли числа по возрастанию или по убыванию. 10. Пусть дан список вещественных чисел. Для каждого элемента списка напе- чатайте число отрицательных элементов, следующих за ним. И. Пусть дан список вещественных чисел. Проверьте, образуют ли числа, хра- нящиеся в списке, арифметическую или геометрическую прогрессию. 12. Опишите процедуру, вставляющую в список Z, элементы которого упорядо- чены по неубыванию, новый элемент так, чтобы сохранялась упорядочен- ность. 13. Опишите процедуру, формирующую список I, включив в него по одному разу элементы, которые входят в список L1, но не входят в список L2. 14. Опишите функцию, подсчитывающую количество элементов списка Z, у ко- торых равные «соседи». 15. Пусть с клавиатуры вводится последовательность xif х2,..., х„ вещественных чисел, где п — заранее неизвестная величина. Ввод завершается символом перевода строки. Вычислите произведение сумм: S = (х( + х2 + 2х„)(х2 + х3 + 2х„_|).. ,(х„-1 + Х„_2 + 2х2) .
168 Глава 15. Динамические структуры данных 16. Пусть с клавиатуры вводится последовательность xif х2,..., хп вещественных чисел, где п — заранее неизвестная величина. Ввод завершается символом перевода строки. Вычислите произведение разностей: s = (xi2 - х2 )(х2 - х„2_,) • • (х„2 - х2). 17. Подсчитайте число узлов в заданном двоичном дереве. 18. Подсчитайте число узлов на k-м уровне заданного двоичного дерева (корень считать узлом 1-го уровня). 19. Пусть даны два текстовых файла А и В. Максимальная длина слова — 20 сим- волов. Слова разделены одним или несколькими пробелами. Занесите в файл С те слова файла А, которых нет в файле В. Для хранения слов файла В и ускорения поиска среди них воспользуйтесь деревом двоичного поиска. 20. Реализуйте нерекурсивную процедуру печати всех элементов заданного двоич- ного дерева. 21. Реализуйте рекурсивную процедуру печати всех элементов заданного двоич- ного дерева. 22. Опишите логическую функцию, проверяющую на равенство два заданных двоичных дерева. 23. Опишите логическую функцию, определяющую, есть ли в заданном двоич- ном дереве хотя бы два одинаковых элемента. 24. Опишите процедуру, строящую для заданного значения N двоичное дерево, в котором N полных уровней и на каждом уровне i располагаются узлы, ин- формационные части которых равны г.
Приложение 1 Ответы и решения Глава 1. Числовые типы данных Упражнения Задание 3 Ответы: а) 2 * In ( х / 15 ) / 1п( 2 ); b) arctan ( х / sqrt ( 1 - sqr ( х ) ) ); с) 0.5 * sin ( 3.1415927 / 6 ); d) sqr ( sqr ( sqr ( х ) ) ); e) exp ( 250 * In ( x ) ); f) 1E3 + betta / ( x2 - gamma * delta ). Задание 4 Ответы: a) 4; b) -1; c) 4; d) 1; e) 3; Задание 6 Ответы: a) real; b) real; c) integer; d) integer; e) integer. f) 0,1415; g) 8; h) 1,0; i) 3; j) 3,1415926536.
170 Приложение 1. Ответы и решения Глава 2. Оператор присваивания, ввод и вывод информации Упражнения, задачи, линейные программы Задание 3 Ответы: а) 4; Ь) 10. Задание 4 Ответы: а) 5; Ь) 5. Задание 6 Ответ: т:= ( х mod 10 ) * 100 + ( х div 10 mod 10 ) * 10 + х div 100 Задание 9 Ответ: { должна быть объявлена вещественная переменная t } t х; х := у: У := t: Задание 11 Решение: program Geron: var a .b. с: real: { длины сторон треугольника } р : real: { полупериметр треугольника } s : real: { площадь треугольника } begin write ('Введите длины сторон треугольника: '): readln ( а, b, с ): р := ( а + b + с ) / 2: s := sqrt( p*(p-a)*(p-b)*(p-c) ): writelnC ’ Площадь треугольника равна s ) end. { Geron } Задание 19 Решение: program Rocket: var hour. min. sec. time integer: begin writeln ( 'Введите время запуска ракеты' ):
Глава 3. Логический тип 171 write ( ’ час в ' ); readin ( hour ); write ( * мин » ' ); readln ( min ): write ( ’ сек = ' ): readln ( sec ): write ( ’ Введите время полета = ' ): readln ( time ); { вычисление времени возвращения ракеты на Землю } sec sec + time; min :» min + sec div 60; sec ;» sec mod 60; hour ;= hour + min div 60: min :« min mod 60; hour ;- hour mod 24; writein ( 'Результаты' ); write ( 'Время взлета = ’ ); writein ( hour: 2, ' час, ', min: 2, ' мин, sec: 2. ’ сек.'); writein ( 'Время полета = ' . time: 3 , 'сек' ); write ( 'Ожидаемое время прибытия = ' ); writein ( hour: 2. ' час. ', min: 2. ' мин, sec: 2, ' сек.') end. { Rocket } Глава 3. Логический тип Упражнения Задание 1 Ответы: d) а not а a and not a true false false false true false a not a not not a true false true false true false Задание 2 Ответы: a) true; b) false; с) false;
172 Приложение 1. Ответы и решения d) true; е) false. Задание 3 Ответ: с) true. Задание 4 Ответы: а) ( х <= у ) and ( х <= z ); d) ( х > 2 ) and ( х <= 10 ) or abs ( x ) < 2; i) ( к mod 400 = 0 ) or ( к mod 4 = 0 ) and ( к mod 100 <>0 ). Линейные программы Задание 2 Решение: program Roots; var a, b. c. d: real; begin write ( ’Введите коэффициенты a.b.c ’); write ( 'квадратного уравнения: ' ); readln ( a. b. c ); d := sqr ( b ) - 4 * a * c; writein ( d >= 0 ) end. { Roots } Задание 4 Решение: program Triangle: var a. b. c: real; t: boolean; begin writein ( 'Введите три числа' ); readln (a, b. c ); t := ( a + b > c ) and ( a + c > b ) and ( b + c > a ): wri tel n ( t ) end. { Triangle } Задание 9 Ответы: a)t := (x=y) and (y=z); b)t := ((x=y) or (z=x) or (y=z)) and not ((x=y) and (y=z)); c)t := odd(n) = odd(m);
Глава 4. Условный оператор 173 f)t := (к mod 10=7) or (к div 10 mod 10=7) or (к div 100=7); h)t := sqr(xlM sqr(x2) <= r*r; i)t : = (r<=xl*xl+x2*x2) and (I>=xl*xl+x2*x2); j)t := odd(gl+vl) = odd(g2+v2). Глава 4. Условный оператор Упражнения Задание 2 Решение: program FlndMax: var a. b, с, max: real: begin if a > b then Max : = a else Max := b: if c > max then max:=c; writeln ( ’Max = ’. max ) end. { FlndMax } Задание 3 Ответ (фрагмент программы): if abs( a ) <= 3.14159/2 then x := exp ( sin ( a ) - 1 ): Задание 4 Решение: program YFunction; var x. y: real; begin write ( ’Введите x: ' ); readln ( x ); у := sqr ( x )+4 * x - 7: if x >- 2 then у := 1 /у: write ( 'x = ', x , ' у = '. у ). end. { YFunction } Задание 9 Решение: program Regulating: var x, y. z: real: begin write ( 'Введите два числа: ’ ); readln ( x. у ): if x > у then
174 Приложение 1. Ответы и решения begin z := х; х :» у; У := z end; writein ( ’После упорядочения: х, у ) end. { Regulating } Задание 11 Ответ: х :e a or b and с Задание 12 Решение: program Roots; var a, b, с, d: real; begin write ( ’Введите коэффициенты a. b. с ’ ); write ( 'квадратного уравнения: ' ): readln (a. b. c,); d := sqr ( b ) - 4 * a * c: if d < 0 then writein ( 'Корней нет.' ) el se begin d := sqrt ( d ); writein ( 'xle', (-b + d ) / (2*a), 'x2='. (-b - d ) / (2*a)) end end. { Roots } Задание 13 Решение: program Overflow: var a, b: integer; sign_a, sign_b: integer: t: boolean; begin read ( a, b ): if a = 0 then sign_a := 0 else sign_a := a div abs ( a ); if b « 0 then sign_b :- 0 else sign_b : = b div abs ( b ): t := sign_a * sign_b > 0: if t then begin a :- abs ( a ); b :- abs ( b ); t := Maxint - a < b end:
Глава 5. Операторы цикла 175 write ( 'Переполнение при суммировании: ' ): if t then write ( 'да' ) else write ( 'нет' ); writein end. { Overflow } Глава 5. Операторы цикла Упражнения, задачи, программы Задание 1 Ответы: а)В-Л + 1; Ь) 0. Задание 3 Ответы: а) 120; Ь) у 1; for 1 2 to 5 do у у * 1: write ( у ): с) У :» 1: i :в 2: repeat У := у * i: i i + 1 until i > 5; write ( у ): Задание 4 Решение: program Degree: var i, n: integer: x. y: real: begin write ( *n - ’ ): readln ( n ): write ( 'x » ' ): readln ( x ): i :» 1: у 1: while i <- n do begin У у * x; i :- i + 1 end: write ( 'y » '. у ) end. { Degree }
176 Приложение 1. Ответы и решения Задание 8 Решение: program MaxFactorial:. var i. f; integer: begin 1 := 1; f := 1: repeat 1 := i + 1; f := f * i until f > Maxint div 2; writelnC ’FC, 1-1:2, ')=', f ) end. { MaxFactorial } Задание 9 Решение: a) program NumbersCount: var n. k: integer; begin write ( 'Введите число: ' ); readln ( n ): к := 0: repeat к := к + 1: n := n div 10 until n = 0: writeln ( 'В числе ', к . 'цифр' ) end. { NumbersCount } b) program NumbersSum; var n, s: integer; begin write ( 'Введите число: ' ); readln ( n ); s := 0; repeat s := s + n mod 10; n := n div 10 until n = 0: writeln ( ' Сумма цифр равна '. s ) end. { NumbersSum } d) program ReverseOrder; var n, m: integer; begin write ( 'Введите число: ' ); readln ( n ); m := 0; repeat m := m * 10 + n mod 10:
Глава 5. Операторы цикла 177 п :» n div 10 until n = 0; write ( 'Цифры числа в обратном порядке: т) end. { ReverseOrder } Задание 10 Решение: program Automorphism; var т. п. х. d: integer; begin write( 'Введите левую и правую ' ); write( 'границу отрезка: ? ); readln ( n . m ); d :» 10; for x := m to n do begin while d <= x do d := d * 10; if x * x mod d = x then write ( 'Число '.x. ' автоморфно' ) end end. { Automorphism } Задание 12 Решение: program NOD; var x. y, a. b, result: integer; begin write ( 'Введите два числа: ’ ); readln ( x. у ); a :- x: b :- y; while ( a > 0 ) and ( b > 0 ) do if a >= b then a := a mod b else b := b mod a: result :- a + b; writein ( 'xe'. x. ' y='. у. ' НОД='. result ) end. { NOD } Задание 14 Решение: program Perfect; var i. n. s: integer; begin write( 'Введите проверяемое число: ' ): readln ( n ); s :- 1; for i :» 2 to n div 2 do if n mod i = 0 then s :» s + 1; if s = n then writeln( 'Число является совершенным' ) else writeln( 'Число не является совершенным' ) end. { Perfect }
178 Приложение 1. Ответы и решения Задание 16 Решение: program FirstNegative;' var n: integer: begin n :» 1: while cos(cos(n)/sin(n)) >» 0 do n :« n + 1; write ( 'Номер отрицательного члена равен n end. { FirstNegative } Задание 17 Решение: program FibSequence; var i. n. fnO, fnl. fn2: integer: begin fnl 1: fnO 0: writein ( fnl ): for i :e 1 to n - 1 do begin fn2 := fnl: fnl fnO: fnO fnl + fn2: writein ( fnO ) end end. { FibSequence } Задание 28 Решение: program FindI: var x. y. xm, eps: real: begin read ( eps ): x :» 10: у :e 10: i :• 0: while (abs(x) >- eps) or (abs(y) >« eps) do begin xm :- 0.1 * y: у :» 0.1 *x - 0.12 * y: x xm: i :- i+1 end: write (i) end. { Findl } Задание 29 Решение: program Count: const
Гпава 5. Операторы цикла 179 п - 100; var i, kp. ко. kn: integer; х: real; begin kp :- 0; kn 0; for i:- 1 to n do begin read ( x ); if x > 0 then kp :- kp + 1; if x < 0 then kn kn + 1 end; readln; ко ;» n - kp - kn; writelnC 'Число положительных чисел: ’. kp ); writelnC 'Число отрицательных чисел: '. kn ); writelnC 'Число нулей: ', ко ) end. { Count } Задание 31 Решение: program MaxMinDifference; var x, max. min: real; i: integer; begin read ( x ); min :- x; max :- x; for i :- 2 to 100 do begin read ( x ); 1f x > max then max:- x else if x < min then min:- x end; readln; write ( 'Разность между максимальным и '. 'минимальным числами: '. max - min ) end. { MaxMinDifference } Задание 36 Решение: а) program YFunction; var a. x. у: real; i: integer; begin writeC 'Введите x и a: ' ); readln ( x. a ); У :- x; for i :- 1 to 8 do у :- sqr ( у + a ); writeln ( 'Значение функции равно ’. у ) end. { YFunction }
180 Приложение 1. Ответы и решения Задание 37 Ответ: а) (фрагмент программы) У := 1: for i;= 2 to 11 do У := у * х + i; Задание 39 Решение: Ь) program YFunction; var у: real; х: integer; begin у ;= 1/111; x ;= 109; while x > 0 do begin у ;» 1 / ( у + x ); x := x - 2 end; writein ( ‘у = ’. у ) end. { YFunction } Задание 41 Ответы: a) У 0; n ;= 1; for i ;= 1 to 30 do begin n ;= x * n; у ;« у + COS ( n ) end; b) for i :я 2 to n do begin f ;= f * i; У := у + f end; Задание 44 Решение (фрагмент программы): L ;= 0.0; { левый конец отрезка } R ;= 1.57; { правый конец отрезка } repeat х ;= ( 1_ + R ) / 2; { середина отрезка } if sin(x)/cos(x) < x then L ;= x else R ;= x until R - L < IE-4
Глава 5. Операторы цикла 181 Задание 45 Решение: program Rectangle: var a. b, { длины сторон прямоугольника } п. { наименьшее число квадратов } к. { число одинаковых квадратов } х: integer; begin n :e 0; write ( 'Введите длины сторон прямоугольника: ' ): readln ( а, b ); writein ( 'Дан прямоугольник: ', а:2, Ь:2 ); writein ( 'Квадраты: ' ): repeat if а < b then begin х :» а; а :в Ь: b := х end; k := a div b; а ;= a mod Ь; writein ( b, . Ь. ' ', к ); п := п + к until ( а » 0 ): writein ( 'Всего квадратов; ', п ) end. { Rectangle } Задание 47 Решение: program PythagoreanNumbers; var a. b. с. ex; integer: begin for a :» 1 to 20 do for b := a to 20 do begin ex :» a * a + b * b; c :» sqr( round( sqrt( ex ) ) ); if c e ex then writeln( a. b, c ) end end. { PythagoreanNumbers } Задание 48 Решение: program Line; var N. i: integer; begin repeat write ( 'Введите натуральное число N: ' ); readln ( N ) until N > 0; write ( 'S = ' ); i ;= 2 - ord( odd( N ) ):
182 Приложение 1. Ответы и решения repeat if i < 3 then writeC i ) else writeC . i ); i ;= i + 2 until i > N end. { Line } Задание 49 Решение: с) program DoubleMin; var i : integer; { счетчик вводимых чисел } x : integer; mini, min2 ; integer; begin i ;e 0; write ( 'Введите x= ' ); read ( x ); {mini ? min2} while x <> 0 do begin i ;» i + 1; if i » 1 then mini ; = x el se begin if x <» mini then begin min2 ;- mini; mini x end else if (i » 2) or (x < min2) then min2 ;= x end; write ( 'Введите х» ' ); read ( x ) end; readln; if i < 2 then writeln ( 'Было введено менее двух чисел' ) else writeln ( 'Два наименьших числа '. mini, '. ’. min2 ) end. { DoubleMin } Задание 50 Решение: с) program Increase; var old. new; real; begin write ( 'x-' ); readlnC old );
Глава 5. Операторы цикла 183 write ( ’х-’ ); readln( new ); while (new <> 0) and (new > old) do begin write ( 'x-' ); old new; readln ( new ) end; write ( 'Последовательность ’ ); if new <- old then writein ( ’не является возрастающей' ) else writein ( 'возрастающая' ) end. { Increase } Задание 54 Решение (фрагмент программы): х :« 1; for i ;» 1 to k do x i*x + 1/i; Задание 62 Решение: program IntegralSqrX; var a. b. { концы отрезка } h. {шаг интегрирования } s, { искомая площадь } с; real; { промежуточная переменная } i. {шаг цикла } n; integer; { количество разбиений отрезка } begin write( 'Введите а, Ь. п: ' ); read ( a. b. п ); h :- ( b - а ) / п; s 0; с :в а — h / 2; for i 1 to n do begin с ;» c + h; s s + sqr( c ) end; S S * h; writein ( 'Интеграл равен '. s ) end. { IntegralSqrX } Задание 63 Ответы: a) -1,84147098; b) -1,73205090; c) = 14,6666666. Задание 67 Решение: program MaxValue; var
184 Приложение 1. Ответы и решения а, Ь, х. у. h. max, xmax: real: 1. n: Integer; begin writeC 'Введите a. b, n: ' ); readln ( a, b, n ); h :» ( b - a ) / n; x := a: for i := 1 to n - 1 do begin x := x + h: у := ( sqr( x ) - 3 * x + 2 ) / sqrtC 2 * x * sqr( x ) - 1 ): if (1 = 1) or (y > max) then begin xmax :e x; max := у end end: write ( *x=', xmax. max=', max ) end. { MaxValue } Глава 6. Литерный тип Упражнения, задачи, программы Задание 1 Решение: program Symbols: var S_pred. S. S_next: char; n: integer: begin write ( 'Введите символ: ' ): readln( S ): n := ord( S ): writelnC 'Порядковый номер символа '. S. ' = ’. n ); if n > 0 then writelnC 'Предыдущий символ = '. pred(S) ) else writelnC 'Предыдущий символ отсутствует’ ): if n < 255 then writelnC 'Последующий символ = '. succ(S) ) else writelnC 'Последующий символ отсутствует' ) end. { Symbols } Задание 2 Решение: program Lati nLetters: var sym: char: begin writeln ( 'Буквы латинского алфавита:' ); writeln ( '1. Прописные'): for sym := 'A* to 'Z' do writeCsym);
Глава 6. Литерный тип 185 writein; writein('2. Строчные'); for sym := 'a' to 'z' do write ( sym ); readln end. { LatinLetters } Результат работы программы: Буквы латинского алфавита: 1. Прописные ABCDEFGHIJKLMNOPQRSTUVWXYZ 2. Строчные abcdefghijklmnopqrstuvwxyz Задание 3 Решение: program Digits; const n = 10; var c: char; i. count: i nteger; begin count ;= 0; writein ( 'Введите '. n. ’ символов:'); for i := 1 to n do begin read ( c ); if (c >= '0') and (c <= '9') then count := count + 1 end; readln; writein ( 'Во введенной последовательности '. 'символов '. count. ' цифр’ ); readln end. { Digits } Задание 4 Решение: program Test: const n = 20; eot = '.'; var c: char; count: integer; begin write ( 'Введите не более '. n. ' символов;' ): writein ( ' признак конца последовательности - '. eot. "" ); count := 0; repeat read ( c ); if (c >= 'a') and (c <= 'z') then count := count + 1 until c = eot; if odd( count )
186 Приложение 1. Ответы и решения then writelп( 'Предположение не верно* ) else writeln( 'Предположение верно' ); readln end. { Test } Задание 5 Решение: program SymbolsCount; var c, ch : char; n. i : integer; S : integer; begin writein ( 'сколько символов будет введено?' ); readln ( n ); writein ( 'вхождения какого символа '. 'будут подсчитываться?’ ); readln ( ch ); S ;- 0; writein ( 'введите последовательность символов' ); for i ;- 1 to n do begin read(c); if c - ch then S ;- S + 1 end; writein ( 'количество вхождений символа ch. S ) end. { SymbolsCount } Задание 6 Решение: program Substitution; var c; char; fi rst; boolean; I begin write( 'Введите последовательность символов; '); first true; while not eoln do begin read ( c ); if first then begin first :» false; write ( 'Результат; ' ) end; write ( c ); if c - '.' then write( ’..' ) end; writein; readln end. { Substitution } Пример работы программы: Введите последовательность символов: asf..e.gf.ws.8jh Результат: asf......е...gf...ws...8jh
I Глава 6. Литерный тип 187 Задание 7 Решение: program Convert; const nul » 'O'; nine - ’9'; point - '.'; n - 10: var result: real; scale: real; c: char; begin result ;- 0; writelnC 'Введите последовательность символов:' ); repeat readC c ) until ( nul <- c) and ( c <- nine ); while ( nul <- c) and ( c <» nine ) do begin result :» n * result + ord( c ) - ord( nul ); read( c ) end; if c - point then begin scale :- 1; read( c ); while ( nul <- c ) and ( c <- nine ) do begin scale :- scale * 10; read( c ); result :- result + C ord(c) - ord(nul) ) / scale; end end; writelnC 'Результат - ', result ); readln end. { Convert } Задание 8 Решение: program Summa; const eot e '.'; var s. d: integer: c. sign: char; begin sign :- '+'; s :- 0; write ( 'Введите выражение в символьном виде: ' ); repeat readC с ); d :- ord(c) - ord('O'); if sign - '+'
188 Приложение 1. Ответы и решения then s := s + d else s := s - d: read( sign ) until sign = eot: readln; writein ( ’Полученная сумма * s ): readln end. { Summa } Пример работы программы: Введите выражение в символьном виде: 1+1+2+1-4. Полученная сумма = 1 Глава 7. Перечислимый тип, ограниченный тип, оператор варианта Перечислимый тип. Упражнения Задание 2 Ответ: t := ml < m2 Задание 3 Ответы: а) if m2 = Dec then ml := Jan else m2 : = succ( m2 ) b) ml := m2: for i := 1 to к mod 12 do if ml = Dec then ml := Jan else ml : = succ( ml ) c) ml := Jan: for i := 1 to n - 1 do ml := succ( ml ) Оператор варианта. Упражнения ч Задание 1 Ответ: case Ch of ’i’: N := 1: ‘j’: N := 5: ’k’: N := 10: ’Г: N := 100: else N := 500 end:
Глава 7. Перечислимый тип, ограниченный тип, оператор варианта 189 Задание 2 Ответы: а) р = false, d = 3; b) р = true, d = 235; с) p = true, d = 1. Задание 3 Ответы: a) spring; b) summer; с) ошибка; d) ошибка. Задание 4 Ответ: По введенному номеру дня недели напечатать название этого дня недели. Задание 5 Решение: type month = ( January, february, march, april, may. June. July, august. September. October, november. december); var num: month; dayscount: 28..31; begin case num of february: dayscount:= 28 april. June. September: dayscount := 30; else dayscount ;= 31;. end; end. Задание 6 Ответ: Среди символов, вводимых с клавиатуры, подсчитать количество символов ’А', ’В’ и ’С’. Задание 8 Решение: program Geometry: const pi = 3.1415926:
190 Приложение 1. Ответы и решения var г. s, 1, v: real; к: integer; begin writeC 'Введите радиус: ’ ); readlnC г ); writeC 'Введите номер варианта: ' ); readlnC к ); case к of 1: begin s :» pi*r*r; writelnC 'площадь круга - ', s) end: 2: begin 1 :» 2*pi*r: writelnC 'длина окружности - 1) end; 3: begin v :»4 / 3 * pi * sqr( r ) * r; writelnC 'объем шара - v) end end end. { Geometry } Задание 9 Решение: program DeleteComments; var state: (copy. beg_comment,comment, end_comment); i: integer; c: char; begin state := copy; while not eof do if eoln then begin readln; writeln; end else begin readC c ); case state of copy: if c - '(' then state :» beg_comment else writeC c ); beg_comment: if c - '*' then state :- comment else if с о (• then
Глава 7. Перечислимый тип, ограниченный тип, оператор варианта 191 begin write( . с ): state copy end else write( ’(' ); comment: if c - then state :» end_comment; end_comment: if c - •)’ then state :« copy else if c <> ’*• then state :- comment end { case } end end. { DeleteComments } Упражнения, задачи, программы Задание 16 Решение: program Zodiac: var m: 1..12: { месяц } d: 1..31: { день } Zod: ( Ari. Tfcu. Cem. Can. Leo. Vir. Lib. Seo, Sag. Cap. Aqu. Fis ): { знаки Зодиака: Ari - Овен. Таи - Телец. Cem - Близнецы. Can - Рак. Leo - Лев. Vir - Дева. Lib - Весы. Sco - Скорпион. Sag - Стрелец. Cap - Козерог. Aqu - Водолей. Fis - Рыбы } begin write( 'Введите месяц рождения '. '(целое число от 1 до 12): '): readln( m ): write( 'Введите день рождения '. '(целое число от 1 до 31): '): readln( d ): case m of 1: if d <« 20 then Zod » Cap else Zod » Aqu: 2: if d <« 18 then Zod » Aqu else Zod = Fis: 3: if d <« 20 then Zod - Fis else Zod - Ari: 4: Tf d <= 20 then Zod - Ari else Zod » Tau: 5: if d <= 21 then Zod - Tau else Zod e Cem: 6: if d <« 21 then Zod » Cem else Zod - Can:
192 Приложение 1. Ответы и решения 7; if d <= 22 then Zod : »Can else Zod = Leo; 8: if d <= 23 then Zod ; = Leo else Zod “ Vir; 9; if d < == 23 then Zod ; = Vir else Zod = Lib; 10; if d <= 23 then Zod := Lib else Zod :« Sco; 11; if d <= 22 then Zod : = Sco else Zod ;- Sag: 12; if d <“21 then Zod ;- Sag else Zod Cap end; write( 'Ваш знак Зодиака: ’ ): case Zoc i of Ari; writelnC 'Овен' ); Tau; writeln( 'Телец' ); Cem: writelnC 'Близнецы' ); Can; writelnC 'Рак' ): Leo: writelnC 'Лев' ); Vir; writelnC 'Дева' ): Lib: writelnC 'Весы' ); Sco: writelnC 'Скорпион' ); Sag: writelnC 'Стрелец' ); Cap: writelnC 'Козерог' )/ Aqu: writelnC 'Водолей' ): Fis: writelnC 'Рыбы' ) end end. { Zodiac } Глава 8. Регулярные типы данных Векторы. Задачи, программы Задание 2 Решение: program NumbersLocate; const m = 50; var C; array [0..m] of char; B: array [0..mJ of boolean; i: 1nteger; begin writelnC 'Введите элементы массива ', 'в количестве ', m+1 ); for 1 0 to m do read( C[i] ); readln; for 1 := 0 to m do B[i] := ( C[i] >= 'O' ) and ( C[i J <= '9' ); for i := 0 to m do writeC B[i], ' ' ) end. { NumbersLocate } Задание 5 Решение: program ReverseAnd6Columns; const m = 100; { количество элементов массива } n = 6: { по n элементов в строке }
Глава 8. Регулярные типы данных 193 van х: array [l..m] of integer: i: 1nteger: begin writelnC ’Введите '. m. ’ элемента(ов) массива’): for i :» 1 to m do readC x[i] ); readln; for i :e m downto 1 do begin writeC x[i], ' ’ ); if ( m - i + 1 ) mod n » 0 then writeln end end. { ReverseAnd6Columns } Задание 8 Решение: program Derivative; const n = 20: var a: array [0..n] of real: x. t: real; у : real; { значение многочлена в точке t } yl: real; { значение производной в точке t } i: integer; begin writelnC 'Введите коэффициенты многочлена:' ): for i :- 0 to n do readC a[i] ): readln: writeC 'Введите значение переменной x: ’ ); readlnC t ): x ;e t’; У := 0; yl := 0: for i := 1 to n - 1 do begin у :e у + a[1] * x; yl :» yl + (i + 1) * a[i+l] * x; x :- x * t end: . у := у + a[0] + a[n] * x; yl :« yl + a[l]; writelnC ’y(x)=', y:7:3. ' y” (x)»’. yl:7:3 ) end. { Derivative } Задание 9 Решение: program RusLetters; const num_letters - 33: type set_of_letters: array [1..num_letters] of char: const smallJetters: set_of_letters = C’a'. ’6’. 'в', 'г', ’д’, ’e'. 'e'. 7 Зак. 906
194 Приложение 1. Ответы и решения 'ж' . *3’. ’и’. *й’, ’к’. ’л', ’м’, 'н'. 'О', ’ гГ. 'р'. ’с’, 'т'. 'у', ’ф’. ’х'. 'ц'. 'ч'. 'ш'. 'щ'. 'ъ'. 'ы'. *ь*. 'э'. 'ю'. ’я'): big_letters: set_of_l etters = ('A'. ’Б'. 'B'. •t . 'Д’. ’E’ . 'E* 'Ж'. ’3'. 'И'. 'Й'. 'К'. 'Л'. 'M', 'H*. ’O'. 'П*. P'. 'C. T. •y. 'Ф'. 'X'. •it. '4'. 'Ш'. 'Щ'. 'b'. 'Ы'. 'b'. 'Э'. •Ю'. 'Я'): var 1 i: integer; begin writeln ( 'Буквы русского алфавита: ' ); writein ( '1. Прописные' ): for i := 1 to num_letters do write( big_letters[i] ); writeln: writeln ( ’2. Строчные' ): for i := 1 to num_letters do write( small_letters[i] ): readln end. { RusLetters } Результат работы программы: Буквы русского алфавита: 1. Прописные АБВГДЕЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ 2. Строчные абвгдеежзийклмнопрстуфхцчшщъыьэюя Задание 10 Решение: а) program Points: const njnax = 80: var txt: array [1..njnax] of char: i, n: i nteger: point: boolean: begin writeln ( 'Введите последовательность символов*. ' длиной не больше n max, ':’): i :ж 0: while not eoln and (i < njnax) do begin i := i + 1: read( txt[i] ) end: readln: n :- i: point :- false: writeln( 'Преобразованная последовательность:' ): for i :- 1 to n do
. Глава 8. Регулярные типы данных 195 begin if txt[i] = then begin if not point then { это первая встретившаяся точка } begin writeC txt[i] ): point := true end end el se begin writeC txt[i] ): point := false end end { for } end. { Points } Задание 11 Решение: program Spaces: const njnax = 80: ch = ' ’: var i, n, max, count: integer: txt: array [1..njnax] of char: begin writelnC 'Введите последовательность символов’, ’ длиной не больше n max, i := 0: while not eoln and (i < njnax) do begin i := i + 1: readC txt[i] ) end: readln: n := i: max := 0: \ count := 0: for i := 1 to n do if txt[i] = ch then begin count := count + 1: if count > max then max : = count end else count := 0: writelnC 'Максимальное количество ', 'символов " ', ch. " ’ = ', max ); readln end. { Spaces }
196 Приложение 1. Ответы и решения Задание 20 Решение: program Notin: var letters: array ['a'..'z'] of boolean: c: char; begin { инициализация массива } for с :» ’a’ to *z' do letters[c] : = false; writelnC ’Введите последовательность символов:’ ); while not eoln do begin readC c ); if (c >= ’a’) and (c <= 'z') then lettersEc] := true end; readln: writelnC 'Буквы, которые не вошли в ', 'последовательность:'); for с := 'a' to *z* do if not letters[c] then writeC c. ’ ’ ); writeln end. { Notin } Пример работы программы: Введите последовательность символов: sdfkj kjhkjhkJhk235kj кJhkjh346457kjh kjh Буквы, которые не вошли в последовательность: abcegi Imnopqrtuvwxyz Задание 25 Решение: program Summa: var х; array [1..100] of real; a: array [1..30] of 1..100: s: real; 1. j: integer; begin writeln ( 'Введите значения элементов’, ’ массива х:' ); for 1 := 1 to 100 do readC x[i] ): readln; writelnC 'Введите значения (1..100) элементов'. ' массива а: for i := 1 to 30 do readC a[1] ): readln: s ;= 0: for i := 1 to 30 do s := s + x[ a[i] ]; writelnC 's * ’. s:7:3 ) end. { Summa }
Глава 8. Регулярные типы данных 197 Задание 28 Решение: program LettersFrequency: type 1etter = ' a'.. 'z': var { массив счетчиков латинских букв } counters: array [letter] of integer: c: char: begin { обнуление счетчиков } for c :e ’a’ to 'z' do counters[c] := 0: writeC 'Введите текст: ' ): while not eoln do begin readC c ): if (c >= 'a *) and (c <= 'z') then counters[c] :» counters[c] + 1 end: readln: { вывод на печать результата } writelnC 'Частота встречаемости ', 'латинских букв:' ): for с := 'a' to 'z' do writelnC с, counters[c] ): readln end. { LettersFrequency } Пример работы программы: Введите текст: my heart is in the highlands, my heart is not here Частота встречаемости латинских букв: а-3 b-0 с-0 d-1 е-5 f-0 g-1 h-6 i-4 j-0 k-0 1-1 m-2 n-3 o-l p-0 q-0 r-3 s-3 t-4 u-0 v-0 w-0 x-0
198 Приложение 1. Ответы и решения У-2 z-0 Задание 47 Решение: с) program Position; const n = 40; var x; array [l..n] of Integer; у. к. 1: integer; t; boolean; begin writelnC ’Введите значения элементов’. ' массива х;' ); for i := 1 to n do readC x[i] ); writeC 'Введите значение у = ' ); readlnC у ); к := 1; while (к <« n) and (у <> х[к]) do к ;» к + 1; writelnC ’к='. к ) end. { Position } Задание 54 Решение (первый вариант): program ArithmeticMeanl; const n « 100; var x; array [1..n] of real; S, b. c; real; i: integer; begin writelnC 'Введите значения элементов'. ' массива х:' ); for i ;= 1 to n do readC x[i] ); readln; b x[l]; S 0; for i ;= 2 to n do begin c ;» x[i]; S :» S + b; x[i] :» S / (i-1); b c end; writelnC 'Полученный массив x:' ); for i := 1 to n do writeC x[i]. ' ' ) end. { ArithmeticMeanl }
Глава 8. Регулярные типы данных 199 Решение (второй вариант): program ArithmeticMean2: const n = 100: var x: array [1..n] of real: S. b. c: real: 1: integer: begin writeln( 'Введите значения элементов'. ' массива х:’); S := 0: for i := 1 to n do begin read( x[i] ): S := S + x[i] end: readln: for i := n downto 2 do begin S := S - x[i]: x[i] := S / (i-1) end: writeln( 'Полученный массив x:’ ): for i := 1 to n do write( x[i], ' ' ) end. { ArithmeticMean2 } Задание 60 Решение: Ь) program ExchangeSort: const n = 100: var x : array [l..n] of integer: y. i. к : integer: begin writelnC 'Введите значения элементов массива х:' ): for к := 1 to n do read( x[k] ): readln: for i := 1 to n - 1 do for к := 1 to n - i do if x[k] > x[k+l] then begin у := x[k+l]: x[k+l] := x[k]: x[k] := у end: writeln( 'Упорядоченный массив x:' ): for к :» 1 to n do write( x[k].' ' ) end.{ ExchangeSort }
200 Приложение 1. Ответы и решения Задание 62 Решение: program Min InAddition; var x : array [1..30] of integer; у : array [1..30] of integer; min, k. 1 ; Integer; begin writelnC ’Введите значения элементов первой ’последовательности х;' ); for к := 1 to 30 do readC х[к] ); readln; writelnC 'Введите значения элементов ', ' второй последовательности у:' ); for к ;= 1 to 30 do readC у[к] ); readln; min ;= Maxint; for 1 ;= 1 to 30 do begin к ;s 1; while (k <= 30) and (x[1] <> y[k]) do к ;= к + 1; if к > 30 then {x[i] не входит во вторую последовательность} if min > x[i] then min ; = x[1] end; writeC ’min=’, min ) end.{ MinlnAddition } Задание 64 Решение: program Un i queEnt ryIntoText; var x ; array [1..26] of char; { массив лат. букв } s ; array C’a’..'z'] of integer; { счетчик букв } с ; char; 1, k, j ; 1nteger; { k - кол-во встретившихся по одному разу латинских букв } begin for с ;= ’a’ to 'z* do s[c] := 0: writelnC 'Введите текст, заканчивающийся ', 'точкой;' ); readC с ); while с <> '.' do begin s[c] ;= s[c] + 1; readC c ) end; readln; { формирование результата } k ;= 0; for c ;= 'a' to 'z' do if s[c] = 1 then
Глава 8. Регулярные типы данных 201 { буква встретилась один раз } begin к ;= к + 1; х[к] := с end; { вывод результата } for i := 1 to к do writeC x[i],' ’ end.{ UniqueEntrylntoText } Задание 76 Решение: e) program Modificationstring; type stroka = array [1..80] of char; var s : stroka; {s - строка символов} i, j, к : integer; {к - количество букв} begin writelnC 'введите текст, заканчивающийся пробелом' ); k ;= 0; repeat k := k + 1; readC s[k] ) until Cs[k] = ' ') or (k=40); {заполняем остаток массива пробелами} for j ;= k + 1 to 80 do s[j] ;= ' '; i := 1; while i<=k do begin if Cs[i] = 'q') then begin {освобождаем место для буквы u} for j ;= k downto i + 1 do s[j + 1] ;e s[j]: s[i + 1] ;= 'u'; 1 := i +2; {т.к. u проверять не нужно} k ;= k + 1 {увеличилось количество букв} end else i ;= i + 1 end; writelnC s ) end.f Modificationstring } Матрицы. Задачи, упражнения Задание 47 Решение: Ь) program Substitution; type vector = array Cl..n] of integer;
202 Приложение 1. Ответы и решения matr = array [l..n] of vector; var A : matr; X ; vector; i.j ; integer; begin writelnC 'введите матрицу A;' ); for i ;= 1 to n do for j : = 1 to n do read( A[i.j] ); readln; writelnC 'введите вектор x;' ); for i :• 1 to n do readC x[i] ); readln; for j := 1 to n div 2 do for i ;= 1 to n do A[i.2*j] ;= x[i]; writelnC 'полученная матрица A;' ); for i ;= 1 to n do begin ♦for j := 1 to n do writeC A[i.j],’ ' ); writeln end end.{ Substitution } Задание 50 Решение: program SumElementInSection; var A : array [1..9. 1..9] of real; S ; real; i.j; integer; begin writelnC 'введите матрицу A;' ); for i ;= 1 to 9 do for j ;= 1 to 9 do readC A[i,j] ); readln; s ;= 0 for i = 1 to 9 do s ;» s + A[i,i] + A[i,10-iJ; { элемент на пересечении диагоналей суммируется дважды } s ;= s - А[5.5]; writeC 'сумма элементов из заштрихованной области» s;5;2 end.{ SumElementInSection } Задание 54 Решение: program DeleteColRow; const m = 20; var A : array [l..m, l..m] of integer; В ; array [l..m - 1. l..m - 1] of integer;
Глава 8. Регулярные типы данных 203 к, п, 1. j : 1..m; begin writelnC 'введите матрицу A;' ); for 1 := 1 to m do for j := 1 to m do read( A[1,j] ); readln; writeC 'введите номер удаляемой строки (1.. '. m. '):' ); readlnC n ); writeC 'введите номер удаляемого столбца Cl..', m. '): ' ); readlnC к ); for 1 := 1 to n - 1 do begin for j := 1 to к - 1 do B[i.j] := A[1,j]; for j := к to m - 1 do B[1,j] := A[1.j + 1]; end; for 1 ;= n to m - 1 do begin for j ;= 1 to к - 1 do B[1,j] ;= A[i + 1,j]; for j := к to m - 1 do BC1.j] ;= A[1 + l.j + 1]; end; writelnC 'полученная матрица В;' ); for 1 ;= 1 to m - 1 do begin for j ;= 1 to m - 1 do writeC B[i J], ' ' ); writeln end end.{ DeleteColRow } Задание 58 Решение: b) program Ordering; const n = 20; nl = 30; var A ; array [l..n, 1..nl] of integer; 1, j. m. к : 1..nl; r. s. sjnax ; Integer; begin writelnC 'введите матрицу A;' ); for 1 ;= 1 to n do for j ;= 1 to nl do readC A[i.j] ); readln; {сортировка по неубыванию выбором} for к := n downto 2 do begin {m - номер строки с максимальной суммой} m ;= 1; sjnax ;= 0; {sjnax - сумма элементов первой строки} for j ;= 1 to nl do
204 Приложение 1. Ответы и решения sjnax sjnax + A[l,j]; for 1 2 to к do begin {s - сумма элементов 1-й строки} s : 0: for j := 1 to nl do S :» S + A[i ,j]; if s > sjnax then begin sjnax s; m :» 1 end; end; if к <> m then {перестановка m-й и k-й строк} for j :» 1 to nl do begin г ;« A[k,j]; A[kJ] :-A[mJJ; A[m.j] ;« r end; end; writelnC 'полученная матрица:' ); for 1 := 1 to n do begin for j := 1 to nl do writeC A[1.j], ' ’ ); writein end end.{ Ordering } Задание 60 Решение: program Symmetry; const n » 10; var A : array [l..n, 1..nJ of integer; 1. j : l..n; b : boolean; begin writelnC 'введите матрицу A:' ): for i 1 to n do for j :» 1 to n do readC A[i,j] ); readln; i :m 1; b :» true; while (i < n) and b do { 1<n t.k. элемент A[n,n] можно не рассматривать } begin {чтобы не рассматривать диагональный элемент} j i + 1: while (j <= n) and (a[i.j] « a[j,i]) do j j + 1: if j <= n then b := not b
Глава 8. Регулярные типы данных 205 else 1 := 1 + 1 end; if b then writelnC 'матрица А симметрична’ ) else writelnC 'матрица А не является симметричной' ) end.{ Symmetry } Задание 65 Решение: program OftenMet; { непустая последовательность слов (не более 30) } type { 1-я и последняя буквы слова } Bukva = array [1..2] of char; var В : array [1..30] of Bukva; { число появлений пары букв } А ; arrayz[l..30] of 0..30; i, j. k. max. i_max : integer; c. p_c : char; begin writelnC 'введите текст, заканчивающийся точкой' ); i := 1; repeat readC c ); B[i,1] := c; while (c <> '.') and (c <> ',') do begin p_c := с; {p_c - предыдущий для с символ} readC с ) end; B[i,2] ;= p_c; {в с либо точка, либо запятая} i ;= i + 1 until (с = '.') or (i > n); k := i - 1; {k - количество слов} for i ;= 1 to k do A[i] := 0; for i := 1 to k do if A[i] = 0 then {пара букв еще не обрабатывалась} for j ;= i + 1 to k do if B[i] = B[j] then begin A[i] ;r A[i] + 1; A[j] := A[j] + 1 end; max ;= A[l]; ijnax ;= 1; {нахождение номера максимального элемента в массиве А} for i := 2 to k do if max < A[i] then begin max ;= A[i]; i_max ;= i end; if max = 1 then writelnC 'все пары встречаются по '. 'одному разу’ )
206 Приложение 1. Ответы и решения else writelnC ’наиболее часто встреч-ся пара:', B[ijnax.l]. B[i_max.2] ) end.{ OftenMet } Задание 68 Решение: program CorrectRecord; type color = (red, blue, green, yellow, black, white); stroka= array [1..6] of char; var cl : array [1..6] of stroka; {cl - матрица цветов} s : stroka; { s - вводимая строка } x. у : color; i. j, k : integer; c : char; begin cl[l] := ’red ’; cl [2] := ’blue ’: cl[3] := ’green '; cl[4] ;= ’yellow’; cl[5] := ’black ’; cl[6] := 'white '; writelnC 'введите строку, заканчивающуюся ', 'пробелом:' ); readC с ); i := 0; while (с <> ' ’) and (i < 6) do begin i := i + 1; S[i] :- c; readC c ) end; while (c <> ' ’) do begin i := i + 1; readC c ) end; readln; if i > 6 then writelnC 'ошибка' ) el se begin {заполнение оставшейся части массива пробелами} for k := i + 1 to 6 do S[k] у :- red; j :- 1: while (j <= 6) and (s о cl[j]) do begin j j + 1: у :» succC у ) end; if j <= 6 then x у else writelnC 'ошибка' ) end
Глава 8. Регулярные типы данных 207 end.{ CorrectRecord } Задание 72 Решение: Таблица 1. Массив Data — даты начала действия знака Зодиака (индекс — месяц, Data[i] — число) 1 2 3 4 5 6 7 8 9 10 11 12 20 19 21 20 21 22 23 23 23 23 23 22 Таблица 2. Массив D_m — количество дней в месяце (индекс — месяц, D_m[i] — число) 1 2 3 4 5 6 7 8 9 10 11 12 31 29 31 30 31 30 31 31 30 31 30 31 program SignsOfTheZodiac; type stroka= array Cl..8] of char: { 8 - максимальное количество букв в названии знака Зодиака } var zz : array [1..12] of stroka: Data : array [1..12] of 19..23: D_m : array [1.12] of 28..31 m.d : integer: fl : boolean: { верно ли введена дата: true - верно, false - нет } begin Data[1]:=20: Data С2]:=19: Data С3]:=21: Data C4]:=20: Data[5]:=21: Data[6]:=22: Data[7]?=23: Data[8]:=23: Data[9]:=23: Data[10]:=23: Data[ll]:=23: Data[12]:=22: D_m[l]:=31: D_m[2]: =29: D_m[3]:=31: D_m[4]:=30: Djn[5]:=31: D_m[6]:=30: D_m[7]:=31: D_m[8]:»31: Djn[9]:=30; D_m[10]:=31: D_m[ll]:=30: D_m[12]:=31; zz[l]:='Водолей '; zz[2]:«’Pbi6bi ': гг[3]:='0вен zz[4]:='Телец ': zz[5]:='Близнецы': zz[6]:='PaK ’: zz[7]: = 'JleB ': zz[8]:='fleBa ': zz[9]: = 'Becbi ': гг[10]:='Скорпион': гг[11]:='Стрелец ': zz[12]:='Козерог ': repeat writeC 'введите месяц в диапазоне 1-12:' ): readln( m ): until (m >= 1) and (m <= 12): repeat fl := true:
208 Приложение 1. Ответы и решения wrlte( ’введите день:' ); readlnC d ); { проверка корректности ввода } if (d > D_m[m]) or (d < 1) then begin fl :» false; writelnC 'такого дня в '. m. ' месяце нет ! ) end until fl; if d>-Data[m] then writelnC zz[m] ) el se if m » 1 then writelnC zz[12] ) else writelnC zz[m-l] ) end.{ SignsOfTheZodiac } Глава 9. Процедуры и функции Задачи, программы Задание 1 Решение: program Calculate!: var х, у, func : real; function SignC x : real ) : integer; begin if x < 0 then Sign -1 el se if x > 0 then Sign :- 1 else Sign ;= 0 end;{ Sign } begin writeC 'Введите значения переменных X, Y: ’ ): readlnC x. у ); func:= (SignC x ) + SignC у ))*Sign( x + у ); writelnC ‘Значение функции: *. func ) end.{ Calculatel } Задание 2 Решение: program Calculate2; var s, t. func. hl : real: { функция нахождения максимума } function max( x. у : real ) : real; begin if x < у then max : = у else max ; = x; end;{ max } { функция H(a.b) }
Глава 9. Процедуры и функции 209 function Н( а. b : real ) : real; var t : real; begin t := a - b; H ;- a / (1 + sqr( b )) + b / (1 + sqr( a )) - sqr( t ) * t; end;{ H } begin writeC 'Введите1'значения переменных S, T: ’ ); readlnC s, t ); hl ;» H( s - t, s + t ); func H( s. t ) + max( sqr( H( s - t, s * t ) ), sqr( sqr( hl ) ) ) + H( 1. 1 ); writelnC ’Значение функции: ', func ); end.{ Calculate2 } Задание 7 Ответ: а) в результате работы программы будет напечатано: 2 О 2 5 Задание 8 Решение: program CaclculateNOD; var А. В, C, N : Integer; function NODC x, у : integer ) : integer; var t : integer: begin if x < у then { помещаем в X наибольшее число } begin t := x; x := у; У := t end; while у > 0 do begin t := x mod y; x ;= y; У := t end; NOD :» x end;{ NOD } begin writelnC 'Введите 3 числа’ ); readlnC А. В, C ); N ;= NODC A. В ); N :« NODC C. N ); writelnC 'Наибольший делитель 3 чисел - N ) end.{ CaclculateNOD }
210 Приложение 1. Ответы и решения Задание 12 Решение: program SimpleNumbers; var 1. x, N : integer; function Test( X ; integer ) ; boolean; var i ; integer; b ; boolean; begin i ;= 2; b ;= true; while (i <- sqrtC X )) and b do begin b ;- X mod I <> 0; i ;» i + 1 end; Test ;= b end;{ Test } begin writeC 'Введите количество простых чисел ' ); readlnC N ); i := 0; X ;= 2; while (i < N) do begin if TestC X ) then begin writelnC X ); i ;= i + 1 end; X ;- X + 1 end end.{ SimpleNumbers } Задание 17 Решение: function vowels ( ch : char ) ; boolean: const num_vowels - 20; vowel : array [1.. num_vowels] of char = С'а'.’е'.'е'.'и'.'о’.'у'.'ы'.'э'.’ю'.'я'. 'A','E','E','И','O','У','ЬГ ,'Э','Ю','Я'); var yes ; boolean; i : integer; begin yes ;- false; i := 1; while not yes and (i <- num_vowels) do begin yes ch - vowel [i]; i i + 1; end; vowels yes end;{ vowels }
Глава 9. Процедуры и функции 211 Задание 19 Решение: program Repl асе; const N = 20: type { тип - последовательность } Seq - array[l..N] of Integer: var A. В : Seq; { ввод последовательности } procedure InputSeqC var X : Seq ): var 1 : integer: begin for 1 :- 1 to N do begin write( 'Введите i. '-и элемент последовательности' ); readlnC X[i] ) end end;{ InputSeq } { печать последовательности } procedure PrintSeqC X : Seq ); var 1 : integer; begin for i :» 1 to N do writeC X[i] ); writein end:{ PrintSeq } { поиск минимального элемента } function MinimumSeqC X : Seq ) : integer; var i. Min : integer; begin Min := X[l]; for i : = 2 to N do if X[i] < Min then Min : = X[i]; MinlmumSeq :e Min end;{ MinimumSeq } { поиск индекса максимального элемента } function MaximumSeqC X : Seq ) : integer; var i. Max : integer; begin Max :» 1; for i 2 to N do if X[i] > X[Max] then Max : = i; MaximumSeq := Max end;{ MaximumSeq } { замена элементов, которые располг
212 Приложение 1. Ответы и решения procedure ReplaceMaxMin( var X : Seq ): var Min. Max : integer; I : integer; begin Min ;= MinimumSeqC X ); Max := MaximumSeqC X ): for i ;= Max + 1 to N do X[i] ;= Min end;{ ReplaceMaxMin } begin writelnC ’Введите первую последовательность' ); InputSeqC A ); writelnC 'Введите вторую последовательность' ); InputSeqC В ); ReplaceMaxMin( A ); ReplaceMaxMin( В ); writelnC 'Результаты замены в', 'первой последовательности' ); PrintSeqC А ); writelnC 'Результаты замены во', ' второй последовательности' ); PrintSeqC В ) end.{ Replace } Задание 23 Решение: program SummaS; const N = 10; . M = 5; type Matr - array[l..N. 1..M] of real: var A ; Matr; В : array [1..N, 1..M] of boolean; i. j : i nteger; S : real; function TestSumC il, jl ; integer; S ; real ) : boolean; var i, j ; integer; Summa : real; begin Summa ;= 0; for i il - 1 to il + 1 do for j := jl - 1 to jl + 1 do if (i >« 1) and (i <= N) and (j >= 1) and (j <= M) then Summa : = Summa + A[i,j]; TestSum :e Summa < S end;{ TestSum } begin writelnC 'Введите исходную матрицу' ); for i := 1 to N do { Ввод матрицы A } begin for j := 1 to M do readC A[i,j] ):
Глава 9. Процедуры и функции 213 readln end; writeC 'Введите значение суммы' ); readlnC S ); for i 1 to N do { Вычисление матрицы В } for j := 1 to M do B[i.j] := TestSumC 1. j, S ); writelnC 'Матрица В' ); for i :s 1 to N do { Печать результатов } begin for j :e 1 to M do writeC B[i,j] ); writein end end.{ SummaS } Задание 28 Решение: program Change; const N = 100; var A ; array[l..N, 1..N] of real; i. j. Maxi, MaxJ ; integer; procedure InputMatr; begin { ввод матрицы } end;{ InputMatr } procedure PrintMatr; begin { печать матрицы } end;{ PrintMatr } { обмен строк } procedure ExchangeRowsC x, у ; integer ); var i : integer; Buffer : real; begin for i ;s 1 to N do begin Buffer := A[x.i]; A[x.i] ;= A[y.i]; A[y.i] ;= Buffer end end;{ ExchangeRows } { обмен столбцов } procedure Exchangecolumns( x, у ; integer ); var i ; integer; Buffer ; real; begin for i := 1 to N do
214 Приложение 1. Ответы и решения begin Buffer := A[i,х]; A[i,х] := A[i.y]; A[i,y] := Buffer end end;{ Exchangecolumns } begin InputMatr; Maxi := 1: MaxJ : 1: for 1 :=1 to N do for j :=1 to N do if A[i.j] > A[MaxI.MaxJ] then begin Maxi := i; MaxJ :* j end; for 1 := Maxi - 1 downto 1 do ExchangeRowsC i. i + 1 ); for i :e MaxJ - 1 downto 1 do Exchangecolumns (1.1 + 1): PrintMatr end.{ Change } Задание 33 Решение: program Symetric; const N = 100; M = 10; var A : array[l..N, 1..MJ of real; i. Count. Row. MaxCount : integer; procedure InputMatr; begin { ввод матрицы } end;{ InputMatr } procedure PrintMatr; begin { печать' матрицы } । end;{ PrintMatr } { проверка, является ли число симметричным } function TestSym( х ; integer ) : boolean; var у . z ; integer; begin у ;= 0; z x; while z >» 0 do begin у := у * 10 + z mod 10; z ;= z div 10; end; TestSym : = x = у
Глава 9. Процедуры и функции 215 end:{ TestSym } { подсчет в строке симметричных чисел } function CalculateRowC х : integer );integer; var . i, Count : i nteger; begin Count :* 0: for i := 1 to M do if TestSymC A[x,i] ) then Count Count + 1; CalculateRow ;= Count; end;{ CalculateRow } begin InputMatr; MaxCount ;= 0; Row := 0; for i 1 to N do begin Count = CalculateRowC i ); If Count > MaxCount then begin MaxCount ;= Count; Row :» i; end end; if Row = 0 then writelnC 'Нет строк с симметричными числами' ) else writelnC 'Строка с максимальным кол-вом симметричных чисел; ', Row ) end.{ Symetric } Задание 44 Решение: program DeleteWords; const N = 80; type str s array [1..N] of char; var A ; Str; I ; integer; { удаление в строке слова, начинающегося с указанной позиции и имеющего 'Заданную длину } procedure DeleteWC var S : str; Pos, Length : integer ); var i : integer; begin for i := Pos to N - Length do S[i] S[i + Length]; for i := N - Length + 1 to N do S[i] ;- ' ’; end;{ DeleteW } begin i ;= 0; { ввод строки } repeat
216 Приложение 1. Ответы и решения 1 := i + 1; read( A[i] ); until (1 = N) or (A[i] = ’.'): 1 := 1: { просмотр всей строки } while (1 <= N) and (A[i] <> ’.*) do begin { пропуск пробелов } while (1 <= N) and (A[i] = ' ') do i ;= i + 1; Pos := 1; { пропуск букв слова } while (i <= N) and (A[i] <> ' ') do 1 i + 1; if odd( Pos ) and (1 - Pos > 0) then begin DeleteW( A. Pos, 1 - Pos ); 1 := Pos end end end.{ DeleteWords } Задание 65 Решение: const N = 10; type Poli nonrial = array CO. .N] of real; { A[i] коэффициент перед XAi } procedure Sum ( A, В ; Pol 1 nonrial; var C ; Poli nomi al ); var i : integer; begin for i ;= 0 to N do C[i] ;= A[i] + B[i]; end;{ Sum. } Глава 10. Рекурсивные подпрограммы Задачи, программы Задание 5 Решение: program Identificator; const Mien = 20; { максимальная длина идентификатора } var Ch ; char; Id ; array[l..Mien] of char; IdLen, i : integer; procedure Idd; begin if Ch in [ ’A’.. ’Z’, ’a'./z', ’O’..‘9'] then begin
Глава 10. Рекурсивные подпрограммы 217 IdLen := IdLen + 1; IdEIdLen] := Ch; readC Ch ); Idd end; end;{ Idd } procedure Ident; begin if Ch in ['A'./Z', ’a’./z’] then begin IdLen ;= 1; Id[l] ;= Ch; readC Ch ); Idd end; end;{ Ident } begin read( Ch ); IdLen ;= 0; Ident; writeC ‘Идентификатор; ' ); for 1 := 1 to IdLen do writeC Id[i] ); readln end.{ Identlflcator } Задание 17 Решение задачи удобно сформулировать в виде рекурсии: для того чтобы перемес- тить п дисков с башни А на башню В, нужно выполнить следующую последова- тельность шагов. 1. Перёместить и-1-диск с башни А на башню С. 2. Переместить диск с номером п с башни А на башню В. 3. Переместить и-1-диск с башни С на башню В. Таким образом, решение задачи перемещения п дисков выражается через решение задачи перемещения п-1-диска. { Программа распечатывает порядок перемещения дисков } program Hanoi; var Towl.Tow2.Tow3; char; n: integer; { количество дисков } { процедура перемещения дисков с башни tl на башню t2. } { башня t3 - вспомогательная } procedure Hano1_Tower(tl.t2.t3; char; k; integer); begin if k<>l then begin Hano1_Tower(tl. t3. t2. k-1); writeln(tl:10. t2:10); Hanoi_Tower(t3. t2. tl. k-1) end else writeln(tl;10. t2:10)
218 Приложение 1. Ответы и решения end: { Hanoi_Tower } begin writeC'Введите количество дисков: '): readln(n): writelnC’с диска' :10. '- на диск':10): Towl := 'А': Tow2 := 'В': Tow3 := 'С: Hanoi_Tower(fowl, Tow2, Tow3, n); writeC'Нажмите клавишу <Enter>... ’): readln end. { Hanoi } Глава 11. Строковый тип Задачи, программы Задание 1 Решение: program test: const n = 255: type str s array[l..n] of char: var ll. 12 : integer: si. s2 : str: c : char: p : integer: { ВВОД СТРОКИ (имитация оператора readln) } procedure readln_string (var S : str: var length : integer): begin length := 0: while (length < n) and not eoln do begin length := length + 1 readC S[length] ); end: readln end: { readln_string } { ПЕЧАТЬ СТРОКИ (имитация оператора write) } procedure write_string(var S : str: length : integer): var i : integer: begin for i :• 1 to length do writeC S[i] ) end:{ write_string } { ПОИСК СИМВОЛА В ПОДСТРОКЕ Частный случай поиска подстроки. Результат: порядковый номер искомого символа в строке. Если символ не найден, функция возвращает
Глава 11. Строковый тип 219 значение 0 } function find_char (var S : str; length : integer; ch ; char ) ; integer; var i ; integer; no ; boolean; begin i := 1; no true; while (i <= length) and no,do begin no := S[i] <> ch; i ;= i + 1 end; if no then find_char : = 0 else find_char ;= i - 1 end;{ find_char } { ПОИСК ПОДСТРОКИ Здесь S - строка, в которой ищем. subS - подстрока, которую ищем. Результат - номер позиции вхождения или 0. если подстрока не содержится в строке. Пример. 5=подлесок. subS=nec результат: 4 Для типа string p:=pos (искомая подстрока, строка поиска). где р=0. если подстрока не найдена. иначе - номер позиции вхождения) } function find_substring( var S. subS : str; length_S, length_subS: integer ) : integer; var i. j : integer; begin j := 0; i := 1; while (i <= length_S - length_subS + 1) and (j <- length_subS) do begin j := 1; while (j <= length_subS) and (i + j - 1 <= length_S) and (S[i + j - 1] = subS[j]) do j := J + 1: i := i 1; end; if j <= length_subS then find_substring :» 0 else find_substring i - 1 end;{ find_substring } { ПРОВЕРКА НА СОВПАДЕНИЕ Для string: sl=s2 Результат true, если строки идентичны.
220 Приложение 1. Ответы и решения иначе false } function equal_string( var SI, S2 : str; lengthl, length2 : integer ) : boolean; var 1 ; integer; OK ; boolean; begin OK ;= lengthl = length2; if OK then begin i : 1; while OK and (i <« lengthl) do begin OK ;« Sl[i] « S2[i]; i :e i + 1 end end; equal ; = OK end;{ equal_string } { ИСКЛЮЧЕНИЕ ПОДСТРОКИ Здесь pos - индекс первого исключаемого символа, num - количество исключаемых символов. Имитация оператора delete. Пример. подлесок, pos=4, num=3 результат; подок } procedure delete_substring ( var S ; str; var length .; integer; pos, num ; integer ); var i ; i nteger; begin if (pos > 0) and (pos <= length) and (num >= 0) then begin .for i ;» pos to length - num do S[i] :e S[i + num]; if pos + num - 1 <= length then length := length - num else if pos <= length then length := pos - 1 end end;{ delete_substring } { ВСТАВКА ПОДСТРОКИ Здесь SubS - вставляемая подстрока, S - принимающая строка, length_subS. length_S - их длины, pos - позиция вставки. Имитация оператора insert. Пример; подок подстрока = лес, позиция вставки=4 результат; подлесок. }
Глава 11. Строковый тип 221 procedure insert_substring ( var SubS, S : str; length_subS : integer; var length_S ; Integer; pos ; Integer ); var d. 1 : integer; begin d ;= length_subS + length_S; if d <= n then begin for i ;= 0 to length_subS - 1 do begin S[ d - i ] ;= S[ length_S - i ]; S[ pos + length_subS - 1 - i ] SubS[ length_subS - i ]; end; 1ength_S:=d end • end; { insert_substring } { ИНВЕРСИЯ СТРОКИ Пример; подлесок результат; коселдоп } procedure inverse_string( var S ; str; length : integer ); var k. i ; integer; c ; char; begin k := length div 2; for i := 1 to k do begin c ;= S[i]; S[i] ;= S[length - i + 1]; S[length - i + 1] c end end; { inverse_string } begin writelnC ’Введите строку и подстроку 'для проверки' ); readln_string( si, 11 ); readln_string( s2, 12 ); writelnC 'Введите символ для поиска’ ); readlnC с ); writeC "" . с, "’ входит в "' ); write_string( si, 11 ); ,writelnC '" с позиции ’, find_char( si, 11, с ) ); writeC ); write_string( s2, 12 ): writeC '" входит в ); write_string( si. 11 ); writelnC '" с позиции ', find_substring( si, s2. 11. 12 ) ); if equal_string( si. s2. 11. 12 )
222 Приложение 1. Ответы и решения then writelnC 'Строки совпадают' ) else writelnC 'Строки не совпадают' ): р : = find_substring( si, s2. 11, 12 ): if р = О then begin writeC 'Подстрока '" ): write_string( s2, 12 ): writeC '" не содержится в '" ): write_string( si, 11 ): writelnC "" ) end el se begin writeC 'Подстрока "' ): write_string( s2. 12 ): writeC '" содержится в ): write_string( si, 11 ); writelnC с позиции N', p ): delete_substring( si. 11, p. 12 ): writeC 'После исключения подстроки ', 'имеем '"); wri te_string(sl.U): writelnC "" ) end: insert_substring( s2. si, 12, 11, p ): writeC 'После вставки подстроки имеем '" ): write_string( si. 11 ): writelnC "" ): inverseC si. 11 ): writeC 'После инверсии: "' ): write_string( si. 11 ): writeC "" ): readln end. { test } Задание 2 Решение: program check: const wrd : array [1..4] of char » ( '3', 'm'. 'e'. 'я' ): var s : string: i : integer: OK : boolean: begin writelnC 'Введите последовательность символов:' ): readlnC s ): OK true: i := 1: while OK and (i <- 4) do begin OK := pos( wrd[i], s ) <> 0:
Глава 11. Строковый тип 223 1 := 1 + 1 end: if OK then writelnC ’предположение верно’ ) else writelnC 'предположение не подтвердилось' ): readln end. { check } Задание 6 Решение: program example: uses Crt: const kbEsc = #27: kbEnter = #13: kbLeft - #75: kbRight = #77: kbUp = #72: kbDown = #80: maxX = 80: maxY = 23: type key = (left, right, up. down, symbol): var x. у : integer: c : char: action : key: lowX. lowY, highX, highY : integer: function key_type( var ch : char ) : key: begin ch := ReadKey: if ord( ch ) = 0 then begin ch := ReadKey: case ch of kbLeft : key_type :e left: kbRight : key_type := right: kbUp : key_type := up: kbDown : key_type := down else end: { case } end { if } else key_type :- symbol end:{ key_type } function replace ( ch : char ) : char: const strLen = 92: charFrom : string[strLen] = ’'1234567890'+ 'qwertyuioptlasdfghjkl:’’zxcvbnm'+ ',./-»’~!@#$Г&*()’+ 'QWERTYUIOP[]ASDFGHJKL:'’ZXCVBNM'+
224 Приложение 1. Ответы и решения charTo : string[strLen] = ’ё1234567890’ + 'йцукен гшщзхъфывапролджэячсмитьбю.+ ’Ё1234567890'+ ’ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ?..'; var Stop : boolean; i : Integer; begin Stop ;= false; 1 :« 1; while not Stop and (i <= strLen) do begin if CcharFrom[i] = ch) or CcharTo[i] = ch) then Stop :« true else inc( i ); end; if Stop then replace := charTo[i] else replace : = ’ ' end;{ replace } begin x := whereX;- у := whereY; lowX ;= 1; lowY ;= 1; highX := maxX - lowX + 1; highY ;= maxY - lowY + 1; repeat action ;= key_type( c ); case action of left : if x > lowX then x := x - 1; right : if x < highX then x := x + 1; up : if у > lowY then у := у - 1; down : if у < highY then у ;= у + 1; el se end; { case } if action = symbol then writeC replaceC c ) ) else GotoXYC x. у ); until (c = kbEsc) or (c s kbEnter); end.{ example } Глава 12. Записи, оператор присоединения Задачи, упражнения, программы Задание 1 Ответы: а) type Цена = record рубли: integer; копейки: 0 .. 99 end;
Глава 12. Записи, оператор присоединения 225 Ь) type Время - record часы: 0 .. 23: минуты, секунды: 0 .. 59 end: с) type Дата - record число: 1 .. 31: месяц: 1 .. 12: год: integer end: d) type Строка = array [1..20] of char; Адрес “record город, улица: Строка: дом. квартира: 1 .. 999 end: е) type Строка = array [1..20] of char; ДеньНедели = (пн. вт. ср. чт. пт. сб. вс): Время «record часы: 0 .. 23: минуты: 0 .. 59 end: Семинар = record предмет, преподаватель: Строка; день: ДеньНедели; часы: record начало, конец: Время end; номер_группы: 1 .. 300; аудитория: integer end; Задание 4 Правильный ответ — Ь. Задание 7 Решение: type pole “ record ver: ( a. b. c. d. e. f. g. h ): hor: 1 .. 8 end: c) { Ход коня } function HodKonyaC nl. n2 : pole ): boolean; begin HodKonya :“ (abs( ord( nl.ver ) - ord( n2.ver ) ) - 2) and (abs( nl.hor - n2.hor ) “ 1) or (abs( ord( nl.ver ) - ord( n2.ver ) ) - 1) and 8 Зак. 906
226 Приложение 1. Ответы и решения (abs( nl.hor - n2.hor ) = 2) end;{ HodKonya } d) { Ход ферзя } function HodFerzyaC nl. n2 : pole ); boolean; begin HodFerzya (nl.hor = n2.hor) or (nl.ver = n2.ver) or CabsC nl.hor - n2.hor ) = abs( ord( nl.ver ) - ord( n2.ver ) )) end;{ HodFerzya } Задание 8 Решение: program MaxLengthRiver; const MaxLen » 15; {Максимальная длина названия реки} MaxRiver » 30; {Максимальное количество рек} type { Тип 'Строка’ } tString = array [0..MaxLen] of char; tRiver « record { Тип 'Река' } Name; tString; { название } Len: Integer { длина } end; { Тип 'Массив рек' } tAlIRiver e array [1..MaxRiver] of tRiver; var Riv: tAlIRiver; { Массив рек } i. n: 1..MaxRiver; j; integer; { Процедура печати названия самой длинной реки } procedure MoreLengthC riv : tAlIRiver ); var i, IndMax: 1..MaxRiver; j; 1..MaxLen; begin { определение индекса самой длинной реки в массиве } IndMax 1; for i 2 to n do if riv[i].len > riv[IndMax].len then IndMax := i; { Печать названия этой реки } with riv[IndMax] do for j != 1 to ord( Name[0] ) do writeC Name[j] ); writeln end;{ MoreLength } begin { ввод количества рек } writelnC 'Введите количество рек', z '(от 1 до '. MaxRiver, ')' ); readlnC n ); { ввод массива рек } for i 1 to n do begin { ввод названия реки } writelnC 'Введите название реки' );
Глава 12. Записи, оператор присоединения 227 j := 0; while not eoln and (j < MaxLen) do begin j :» j + 1: read( riv[i].name[j] ) end; readln; { определение длины названия реки } riv[i].name[0] ;- chr( j ); { ввод длины реки } writelnC 'Введите ее длину' ); readlnC riv[i].len ) end; { вывод результатов } writeC 'Самая длинная река ' ); MoreLengthC riv ); readln end.{ MaxLengthRiver } Задание 11 Решение: с) type { Имена } Name e (Vacya. Volodya, Ira, Lida, Marina, Misha. Natasha, Oleg, Olya, Sveta. Yulya); Data = record { Тип 'Данные о человеке' } sex: (male, female); { пол } rost: 140..200; { рост } end; Group » array [Name] of Data; { Тип 'Группа' } function EqualRostCvar Gr : Group); boolean; var namel, name2; Name; flag: boolean; begin flag := false; namel : = Vacya; while ( namel < Yulya ) and not flag do begin name2 :e namel; repeat name2 succC name2 ); flag :» Gr[namel].rost » Gr[name2]-.rost until flag or ( name2 = Yulya ); namel :» succC namel ) end; Equal Rost :» flag end;{ Equal Rost } Задание 13 Решение: a) const LenStr - 16:
228 Приложение 1. Ответы и решения MaxQuantPerson « 10: type tString = array [O..LenStr] of char: date = record day: 1..31: month: 1..12: year: 1901..1997 end: tPerson = record SecondName: tString: Sex: (Male. Female): Birthday: date end: tGroupe = array [1..MaxQuantPerson] of tPerson: { Функция для определения самого старшего мужчины в группе Gr. Если мужчины есть, то возвращается значение true, в противном случае false. Самым старшим считается мужчина, у которого наименьшая дата рождения. Если таких (старших) мужчин несколько, то переменной SecName присваивается имя первого из них по списку. } function Oldest( var Gr: tGroupe: var SecName: tString ): boolean: var 1. k: Integer: { функция сравнения двух дат: возвращает значение true, если dl меньше d2 } function LessThen( dl. d2: date ): boolean: begin LessThen := ( dl.year < d2.year ) or ((dl.year = d2.year) and (dl.month < d2. month)) or ((dl.year = d2.year) and (dl.month = d2. month) and (dl.day < d2.day)) end:{ LessThen } begin { поиск первого мужчины из группы } 1 :* 1: while (1 <e MaxQuantPerson ) and (Gr[i].Sex <> Male) do 1 := 1 + 1: { если мужчина не найден, присваиваем имени функции false } if 1 > MaxQuantPerson then Oldest := false { если мужчина найден } else begin { поиск самого старшего } for k :- i + 1 to MaxQuantPerson do if (Gr[k].Sex e Male) and LessThen( Gr[k].birthday. Gr[i].birthday ) then i := k: { запоминание фамилии } Oldest := true: SecName :» Gr[i].SecondName: end end:{ Oldest }
Глава 12. Записи, оператор присоединения 229 Задание 16 Ответ: z = (l,-l) w = (0,-1) Р = (2,2) re = 2 Задание 17 Решение: с) type tNatDig = 1..Maxint: TracDig » record chi si: integer: znam: tNatDig end: procedure Sokr( var r: tRacDig ): var k: tNatDig: { Функция, возвращающая наибольший общий делитель двух чисел } function NOD( a, b: tNatDig ): tNatDig: begin repeat if a<b then b := b-a else a :- a-b until a = b: NOD :» b end:{ NOD } begin if r.chisl о 0 then begin with r do Ijegin k :- N0D( abs( Chi si ). znam ): chisl :- chisl div k: znam := znam div k end end end:{ Sokr } Задание 19 Решение: a) program ComplexExp; const CompPrec e le-10: type complex - record re. im: real end:
230 Приложение 1. Ответы и решения var Eps : real: z, res : complex: { Функция для определения модуля комплексного числа } function AbsComplex( z: Complex ): real: begin AbsComplex :» sqrt( sqr( z. re ) + sqr( z. Im )) end:{ AbsComplex } { Процедура сложения двух комплексных чисел } procedure AddComplexC zl. z2: Complex: var res:Complex ): begin res.re :- zl.re + z2.re: res.im :- zl.im + z2.im end:{ AddComplex } { Процедура умножения двух комплексных чисел } procedure MultyComplexC zl. z2: Complex: var res:Complex ); begin res.re :- zl.re * z2.re - zl.im * z2.im: res.im :- zl.re * z2.im + zl.im * z2.re end:{ MultyComplex } { Процедура деления комплексного числа на вещественное } procedure DivComlToReaK var z: Complex: c: real ): begin if c < CompPrec then writelnC 'На ноль делить нельзя' ) else begin z.re := z.re / c: z.im := z.im / c end end:{ DivComlToReal } { Процедура вычисления экспоненты комплексного числа } procedure ExpComplex( z: Complex: Eps: real: var Res: Complex ): var CurZ: Complex: i: real: begin Res.re :- 1: Res.im :» 0: CurZ :- z: i := 1: while AbsComplexC CurZ ) >» Eps do begin AddComplexC Res. CurZ. Res ): i :-i +1: MultyComplexC CurZ. Z. CurZ ): DivComlToReaK CurZ. i ) end end:{ ExpComplex } begin { Ввод комплексного числа z } writelnC 'Введите комплексное число' ): writeC 'Вещественная часть: ' ):
Глава 12. Записи, оператор присоединения 231 readlnC z. re ); writeC ’Комплексная часть: ' ); readlnC z. im ): { Ввод точности вычислений } writelnC ’Введите Eps - точность вычислений’. ’( Eps > 0 )’ ): repeat writeC 'Eps -’ ); readlnC Eps ): if Eps <= 0 then writelnC 'Неправильно. Повторите ввод.' ) until ( Eps > 0 ): { Вычисление экспоненты комплексного числа } ExpComplexC z. Eps. res ): { Вывод результатов } writeC 'Экспонента равна '. res.re:5:2 ); if res.im >= 0 then writeC ' + ' ): writeC res.im:5:2 . ’*i’ ): readln end.{ ComplexExp } Задание 20 Решение: с) const MaxN - 20: type tReal =record Sign: boolean: Mant: real: Dec: integer end: tIndex - 1..MaxN: tList = array [tlndex] of tReal: { Процедура приводит все числа из списка List к виду, в котором порядок равен FixDec } procedure EqualDecC var List: tList: FixDec: integer ); var i: tlndex: k . Maxk: integer: begin for i :- 1 to MaxN do begin { если фиксированный порядок больше текущего } if FixDec > List[i].Dec then { делим на 10 в нужной степени } for k :« 1 to FixDec - List[i].Dec do List[iJ.Mant :» List[i].Mant / 10 else { иначе умножаем на 10 в нужной степени } for k := 1 to List[i].Dec - FixDec do List[i].Mant :« List[i].Mant * 10: { Переопределяем порядок текущего числа } List[i].Dec :e FixDec end
232 Приложение 1. Ответы и решения end:{ Equal Dec } Задание 36 Решение: type Coordinate = record case Kind : (Decant, Polar) of Decart : (x. y: real); Polar : (r: real; Fi: real) end; function DistanceC a. b; Coordinate ); real; var d; real; begin case a.Ki nd of { Если точка а задана декартовыми координатами } Decart: case b.kind of { Если точка b задана декартовыми координатами } Decart: d : = sqrt( sqr( a.x - b.x ) + sqr( a.у - b.y ) ); { Если точка b задана полярными координатами } Polar: d := sqrt( sqr( a.x - b.r * cos( b.fi )) + sqr( a.у - b.r * sinC b.fi ))): end; { Если точка а задана полярными координатами } Polar: case b.kind of { Если точка b задана декартовыми координатами } Decart: d : = sqrt( sqr( a.r * cos( a.fi ) - b.x ) + sqr( a.r * sin( a.fi ) - b.y ) ); { Если точка b задана полярными координатами } Polar: d sqrt( sqr( a.r ) + sqr( b.r ) - 2 * a.r * b.r * cos( a.fi - b.fi ) ) end end; Distance := d end;{ Distance } Глава 13. Множества Упражнения, задачи, программы Задание 3 Ответы: а) ВсеДниНедели = set of ДеньНедели; b) РабочиеДни = set of пн .. пт.
Глава 13. Множества 233 Задание 5 Ответ: множествами являются конструкции a, b, с, d, е, f. Задание 6 Ответы: а) [ 9. 2. 7 .. 8 ]; Ь) [ 4 .. 21 ]; с) [ 4. 7. 20. 21 ]. Задание 8 Ответы: Результатом выполнения отношений b, с, е, g, h, i, к является true. Результатом выполнения отношений a, d, f, j является false. Задание 10 Ответы: а) неправильно; Ь) не правильно; с) неправильно; d) правильно; е) правильно; f) неправильно. Задание 12 Ответы: а) [ 3 .. 5. 7 .. 10. 13 ]; Ь) [ 2. 3. 5. 7 ]; с) [ ]. Задание 13 Ответы: а) []; Ь) А*В; с) А*В; d) А+В. Задание 16 Решение: program LettersCount: const MaxLen = 80: { максимальная длина текста } eot = *.': { признак окончания ввода }
234 Приложение 1. Ответы и решения type TLetter - set of char; TStr - array [1..MaxLen] of char; var Str; TStr; StrLen; O..MaxLen; { длина введенной строки } Count; 0..MaxLen; { счетчик букв } i; O..MaxLen; Letter; TLetter; begin { инициализация множества } Letter := [ 'A' .. 7'. ‘a’ .. 'z' ]; { ввод текста } writelnC 'Введите текст* ); 1 ;= 0: repeat 1 1 + 1; readC str[1] ) until ( 1 - MaxLen ) or ( Str [ 1 ] - eot ); if Str[i] - eot then StrLen := 1 - 1 else StrLen :« 1; { обработка текста } count ;» 0; for 1:=1 to StrLen do if Str[1] in Letter then count : = count + 1; { вывод результатов } writelnC 'Количество английских букв 'в тексте равно « count ) end. { LettersCount } Задание 17 Решение: а) program Find; const MaxLen » 80; { максимальная длина текста } eot » '.'; { признак окончания ввода } type TLetter = set of char; TStr - array [I..MaxLen] of char; var Str; TStr; { строка } StrLen: 0..MaxLen; { длина введенной строки 1 : 0..MaxLen; { множество букв слова 'шина' ; Letter: TLetter; { флаг, который принимает значение true, } { если в строке есть буквы из слова 'шина', } { false - в противном случае } flag: boolean; begin { инициализация множества } Letter :» [ 'ш’. 'и'. 'н’, 'а' ]; { ввод текста } writelnC 'Введите текст’ ); 1 :- 0; repeat
Глава 13. Множества 235 1 := 1 + 1; readC str[1] ) until ( 1 = MaxLen ) or ( Str [ i ] = eot ): if Str[i] = eot then StrLen := i - 1 else StrLen := i; { обработка текста } 1 :» 0; repeat 1 := 1 + 1; flag := Str [ 1 ] in Letter until ( i = StrLen ) or flag: { вывод результатов } if flag then writelnC 'В тексте есть буквы, 'входящие в слово, "шина"’ ) else writelnC ’В тексте нет букв, ', 'входящих в слово "шина"' ) end. { Find } Задание 18 Решение: { В данном примере строка представлена в виде } { массива символов, 0-й элемент, которого } { зарезервирован для хранения длины строки } const MaxLen = 80: { максимальная длина текста } eot = ’.': { признак окончания ввода } type TStr = array [0..MaxLen] of char: procedure DifferentLettersC var str: TStr ): var InputLetters: set of char: i: 0..MaxLen: begin InputLetters := []: i := 0: repeat i : - 1 + 1; repeat readlnC str[i] ): if str[i] in InputLetters then writeln ( 'Символ ', str[i], ' был введен ранее. ', 'Повторите ввод.' ): until not ( str[i] in InputLetters ): InputLetters InputLetters + [ str[i] ]: until ( i = MaxLen ) or ( str[i] - eot ): if str[i] = eot then str[0] := chr( i-1 ) else str[0] := chr( i ) end: { DifferentLetters }
236 Приложение 1. Ответы и решения Задание 21 Решение: program Number: const n » 4: var error: boolean: digits: set of 'O’..*9': c: char: num, d. 1: i nteger: begin writelnC 'Введите последовательность символов: ’): error := false: digits := [ 'O'..'9' ]: num := 0: 1 1: while not eoln and not error and ( 1 <= n ) do begin readC c ): if c in digits then begin d := ord(c) - ord('O’): num num * 10 + d end else error true: i 1 + 1: end: { while } readln: if error then writelnC 'Преобразование невозможно: 'символ " ', с. "'не является цифрой') else writelnC 'Полученное число » ', num ): readln end. { Number } Задание 23 Решение: procedure Print ( A: TLetter ); var ch: char: begin for ch :» 'a' to 'z' do if ch in A then writeC ch ) end: Задание 24 Решение: program Greater: const MaxLen - 80: { максимальная длина текста } eot признак окончания ввода } type TLetter » set of char: TStr » array [1..MaxLen] of char: var
Глава 13. Множества 237 Str: TStr: { строка } StrLen: 0..MaxLen: { фактическая длина строки } 1: 0..MaxLen: { счетчики гласных и согласных букв } countGL. countSGL: 0..MaxLen; { множества гласных и согласных букв } LetGL. LetSGL: TLetter: begin { инициализация множества гласных букв } LetGL := [ ’а', 'е'. '1'. 'о'. ’и’ ]; { инициализация множества согласных букв } LetSGL := [ ’a'..'z' ] - LetGL: { ввод текста } writelnC ’Введите текст' ); 1 := 0: repeat i := i + 1; readC str[1] ) until ( i = MaxLen ) or ( Str [ i ] = eot ): if Str[i] = eot then StrLen := 1 - 1 else StrLen := 1; { обработка текста } i := 0: countGL := 0: countSGL := 0; for 1 := 1 to StrLen do begin if str[i] in LetGL then countGL : = countGL + 1: if Str[i] in LetSGL then countSGL :» countSGL + 1 end: { сравнение и вывод результатов } if countGL » countSGL then writelnC 'Количества гласных 'и согласных букв равны') el se if countGL > countSGL then writelnC 'Гласных букв больше' ) else writelnC 'Согласных букв больше' ): readln end. { Greater } Задание 25 Решение: с) program Order; const MaxLen ” 80; { максимальная длина текста } eot = '.'; { признак окончания ввода } type TLetter = set of char; TStr = array [1..MaxLen] of char; var Str: TStr; { строка } StrLen: 0..MaxLen; { фактическая длина строки } i: 0..MaxLen;
238 Приложение 1. Ответы и решения Once, Twice: TLetter; begin { инициализация множества букв, которые } { встречаются один раз в тексте } Once []; ’ инициализация множества букв, которые } встречаются 2 и более раз в тексте } "wice []; { ввод текста } writelnC 'Введите текст' ); i := 0; repeat i :e i+1; readC str[i] ) until ( i e MaxLen ) or ( Str[i] » eot ); readln; if Str[i] « eot then StrLen :» i - 1 else StrLen : = i; { обработка текста } for i 1 to StrLen do begin if Str[i] in Once then Twice :- Twice + [ Str[i] ] else Once ;- Once + [ Str[i] ] end; Once Once - Twice; { печать результатов } i :e0; while Once<>[] do begin i i + 1; if Str[i] in Once then begin Once Once - [ Str[i] ]; writeC Str[i]. ’ ' ) end end; end. { Order } Задание 26 Решение: О program VowellsAbsent; const MaxLen - 80; { максимальная длина текста } eot - '.'; { признак окончания ввода } type TLetter - set of char; TStr - array [1..MaxLen] of char; var Str: TStr; { строка } StrLen: 0..MaxLen; { фактическая длина строки } i: 0..MaxLen; Once, Twice, Words: TLetter; ch: char; begin
Глава 13. Множества 239 { инициализация множества букв, которые } { встречались в тексте } Once { инициализация множества букв, которые } { встречаются в двух и более словах} Twice := []; { ввод текста } writelnC 'Введите текст' ); i : = 0; repeat i : = i+1; readC str[i] ) until ( i = MaxLen ) or ( Str[i] = eot ); readln; if Str[i] = eot t hen StrLen :» i - 1 else StrLen := i; { обработка текста } i := 1; repeat { пропуск запятых } while (i <= StrLen) and (str[iJ » ',’) do i := i+1; { обработка слова } words := []; while (i <» StrLen) and (str[iJ <> '.') do begin words :» words + [ str[i] ]; i:= i+1 end; twice ;= twice + words * once; once once + words until (i >« StrLen); { выбор только звонких согласных букв } twice;» twice * [ 'б', 'в', 'г', 'д', 'ж', 'з', 'л', 'м'. 'н', 'р' ]; { печать результатов } ; for ch :» chr(128) to chr(255) do • if ch in twice then writeC ch. ' ' ); end. { VowellsAbsent } Задание 29 Решение: program OneOrTwo; const MinDig - 1; { минимально возможное число } MaxDig - 50; { максимально возможное число } type TRange - MinDig..MaxDig; { множество возможных чисел } TSetRange - set of TRange; var i, n, Last. Current; integer; Fib: TSetRange; { множество чисел Фибоначчи } digit: TRange; { обрабатываемые числа } CountFib, Count: integer; ; функция определения первой } значащей цифры числа к } ’unction FirstDig ( к: TRange ): integer;
240 Приложение 1. Ответы и решения var i: integer; begin repeat i :e к mod 10; к ;e к div 10 until к = 0; FirstDig :« i end; begin { формирование множества чисел Фибоначчи. } { принадлежащих заданной границе чисел } Fib []; Last 1; Current :•!; repeat Fib :« Fib + [ Current ]; Current ;= Last + Current; Last ;« Current - Last until Current > MaxDig: { ввод количества чисел, с которыми } { пользователь будет работать} writelnC 'Введите количество чисел (больше 0).' ); repeat readlnC n ); if n <- 0 then writeln ( 'Данные введены неправильно.'. ' Повторите ввод.') until (n > 0); { ввод чисел } Count;-0; CountFib;-0; writeC 'Вводите числа в границах от ' ); writelnC MinDig. ' до '. MaxDig ); for i :» 1 to n do begin readC digit ); if digit in Fib then countFib := CountFib + 1; if FirstDigC digit ) in [1.2] then count count + 1 end; { вывод результатов } writeln; writeln ( 'Количество чисел Фибоначчи равно '. CountFib ): write ( 'Количество чисел с первой значащей'); ' цифрой, равной 1 или 2. равно '. Count ); readln end. { OneOrTwo } Задание 32 Решение: function Sum (var A: matrix; SI. S2; num): real; var summa: real; i. j: number; begin summa :» 0;
Глава 13. Множества 241 for i := 1 to n do if 1 in SI then for j := 1 to n do if j in s2 then summa := summa + A[i. j]: Sum := summa; end: Задание 33 Ответ: A :« A + В; В := A - В; A :» A - В Задание 35 Решение: a) function Digit( n: NatDig ): integer; var count. 1: integer; SetDig: set of 0..9; begin SetDig := []; { инициализация* множества } count;= 0; { обработка числа }- repeat i ;= n mod 10: n := n div 10; if not (i in SetDig) then begin count := count + 1; SetDig := SetDig + [ i ] end until n = 0: Digit := count end; { Digit } Задание 36 Решение: program InRange: const MinDig = 1; { минимально возможное, число } MaxDig = 10000; { максимально возможное число } MaxSizeSet = 256; { максимальный размер мн-ва } SizeSet = MaxDig div MaxSizeSet; { размер массива множеств } MinM = 0; MinN = 0; type TRange = MinDig..MaxDig: TSet = set of 0..MaxSizeSet - 1: TArraySet = array [0..SizeSet] of TSet: var ArraySet: TArraySet; { массив множеств }
242 Приложение 1. Ответы и решения т, п: 0..MaxDig: МтпМ, МахМ. Digit, j: integer: { определение максимального N } function MaxN ( т: integer): integer: var h: integer: begin h := round( sqrt( MaxDig - sqr(m) ) ): if m > h then MaxN : = h else MaxN := m end: begin { инициализация массива множеств } for j := 0 to SizeSet do ArraySetEj] { определение максимально возможного значения х } МахМ := round( sqrt( MaxDig ) ): { перебор всех чисел, которые попадают в } { заданные границы, причем без повторений. } { которые могут получиться из-за перестановки } { значений тип} for m:=MinM to МахМ do for n:= Mi nN to MaxN(m) do begin { вычисление числа } digit := sqr(m) + sqr(n); if (digit >e MinDig) and (digit <= MaxDig) then begin { вычисление индекса элемента массива. } { в котором содержится данное число }' j := digit div MaxSizeSet: { вычисление положения чисра } { в множестве } digit :e digit mod MaxSizeSet: ArraySetEj] : = ArraySetEj] + E digit ] end end: { печать элементов множества } for Digit :- MinDig to MaxDig do begin { вычисление индекса элемента массива. } { в котором содержится данное число } j :- digit div MaxSizeSet: { вычисление положения числа в множестве } digit :- digit mod MaxSizeSet: '{ есть ли элемент в множестве? } if digit in ArraySetEj] then writeC digit + j * MaxSizeSet. ’ ’ ) end: readln end. { InRange } Задание 39 Решение: type Name - ( Vacya. Volodya. Ira, Lida. . Marina. Misha. Natasha. Oleg.
Глава 13. Множества 243 Olya, Sveta, Yulya ); Guests = set of Name; Group - array [Name] of Guests; function Everywhere ( Gr: Group ): boolean; var namevar; Name; result; Guests; begin result ;= [ Vacya .. Yulya ]; for namevar :» Vacya to Yulya do result ;= result * ( Grfnamevar] + [namevar] ); Everywhere := ( result <> [] ) end; { Everywhere } Задание 41 Решение: { Вычисление определителя матрицы } program Determinant; const MaxN - 15; { максимальный размер матрицы } type Index - l..MaxN; { индекс матрицы } TMatrix - array [Index. Index ] of real; TIndexes = set of Index; { множество индексов } var matrix: TMatrix; n, i. j: Index; { рекурсивная функция для вычисления определителя } { матрицы, полученной удалением 1 первых строк и } { тех столбцов, номера которых есть в множестве s } function Det( L: integer; S: TIndexes ): real; var j ; Index; c ount: real; c oef; -1 .. 1; begin { если осталась матрица размерности 1x1 } i f L - n - 1 then begin j :- 1; while j in S do j :- j + 1; Det matrix[n, j]; end else { если матрица размерности больше 1 } begin count :- 0; Coef :- -1: { вычисление по формуле } for j :- 1 to n do if not (j 1n s) then begin coef -coef; count:- count + coef * matrix[ 1+1, j ] *
244 Приложение 1. Ответы и решения DetC 1+1. s+[j] ) end; Det:= count end end; begin { ввод реальной размерности матрицы } writelnC ‘Введите размерность матрицы'. ‘ (от 1 до '. MaxN. ')’ ); readlnC n ); { ввод матрицы } writelnC 'Введите матрицу’ ); for 1 ;= 1 to n do for j :=1 to n do readC matrix[i,j] ); readln; { подсчет и печать значения определителя } writelnC 'Определитель равен '. DetC 0. [] ); 5; 2 ); end. { Determinant } Глава 14. Файлы / Упражнения, задачи, программы Задание 1 Решение: program CreatelntegerFiIе; const Marker = 9999; var f; file of integer; { создаваемый файл } a; integer; { буфер для ввода } begin rewriteC f ); writeln ( 'Введите числа. '. 'Признаком конца последовательности '. 'является число '. Marker ); readlnC а ); while а <> Marker do begin writeC f. a ); readlnC a ) end; closeC f ); writelnC 'файл создан' ) end. { CreatelntegerFiIe } Задание 8 Решение: program MaxInAB;
Глава 14. Файлы 245 var f; file of integer; { заданный файл } a. b: Integer; { заданный интервал поиска } x: integer; { буфер для ввода } max; integer; { искомое максимальное значение } fl; boolean; { флаг для поиска } begin reset(f); repeat writelnC 'Введите интервал для поиска' ); writeC 'а = ' ); readlnC а ); writeC 'b= ’ ); readlnC b ); until а < b; { поиск первого числа из [а, Ь] } fl ;= true; while not eof( f ) and fl do begin readC f, x ); if ( x >= a ) and ( x <= b ) then { нашли первое число из [а. b] } begin max ;= х; fl := false end end; { поиск максимального числа, принадлежащего } { [а. Ь]. в оставшихся числах файла } while not eof( f ) do begin readC f. x ); if ( x >= a ) and ( x <= b ) then if max < x then max : = x end; closeC f ); if fl then writelnC ’чисел из интервала [’. a. '. '. b, '] в файле нет') else writelnC ’максимальное значение. ’. 'принадлежащее интервалу [’. а. ’. ' , Ь. ']. равно ’, max) end. { MaxInAB } Задание 12 Решение: program NegativPositivFiles; var fl. { входной файл } f2. f3: file of integer; { выходные файлы } a: integer; { буфер для ввода } emf2. emf3: boolean; { флаги пустого файла } begin { инициализация } reset( fl ); rewrite( f2 ); rewriteC f3 ); emf2 := true; { файл f2 пуст ; emf3 := true; { файл ТЗ.пуст { чтение и анализ значений входного файла }
246 Приложение 1. Ответы и решения while not eof( fl ) do begin readC fl. a ); if a > 0 then begin writeC f2. a ): emf2 := false end; if a < 0 then begin writeC f3. a ); emf3 := false end end: closeC fl ); closeC f2 ); closeC f3 ); { вывод результатов } if not emf2 and not emf3 then writelnC 'оба файла созданы' ) else begin if emf2 then writelnC 'положительных чисел в исходном файле нет'): if emf3 then writelnC 'отрицательных чисел в исходном файле нет') end end. { NegativPositivFi1es } Задание 16 Решение: program Merge; var fl. f2. { входные файлы } f3: file of integer; { файл-результат } rdfl, rdf2: boolean; { флаги прочтения записи } al. a2. a3: integer; begin { инициализация } reset( fl ): reset( f2 ); rewriteC f3 ); if not eof( fl ) then begin readC fl. al ); rdfl := true end else rdfl := false: if not eof( f2 ) then begin readC f2. a2 ); rdf2 := true end else rdf2 ; = false; { объединяем значения, если файлы непустые } while rdfl and rdf2 do
Глава 14. Файлы 247 begin { выбираем из двух очередных } { значений меньшее } if al < а2 then begin аЗ := al; if not eof( fl ) then read( fl. al ) el se begin rdfl := false; writeC f3, a3 ); аЗ ;= a2 end end el se begin a3 := a2; if not eof( f2 ) then readC f2. a2 ) else begin rdf2 := false; writeC f3. a3 ); аЗ := al end end; writeC f3. a3 ) end; while not eof( fl ) do begin readC fl. al ); writeC f3. al ) end; while not eof( f2 ) do begin readC f2. a2 ); writeC f3. a2 ) end; closet fl ); closet f2 ); closet f3 ) end. { Merge } Задание 31 Решение: program Anketa; const { максимальная длина названия предмета } Inname = 26; type sub « ( MA. A. I. NM. DE. PT. FA ); { тип предметов: } { MA - математический анализ } { А- алгебра } { I - информатика }
248 Приложение 1. Ответы и решения { NM - численные методы } { DE - дифференциальные уравнения } { РТ - теория вероятности } { FA - функциональный анализ } quest = array [sub] of boolean; name = string [Inname]; { название предмета } var ans: quest; { заполняемый экземпляр анкеты } fin; char; { флаг*окончания ввода } names; array [sub] of name; { названия предметов } fquest: file of quest; { создаваемый файл } res; char; { ответ } k: sub; begin { инициализация } rewriteC fquest ); names[MA] : = 'математический анализ'; names[A ] := 'алгебра'; names[I ] := 'информатика'; names[NM] := 'численные методы’f names[DE] := 'дифференциальные уравнения': names[PT] := 'теория вероятности'; names[FA] ^’функциональный анализ'; writelnC 'добавить запись в файл?' ); writelnC 'д - да, любое другое значение - нет' ); readlnC fin ); while fin в 'д’ do begin - writelnC 'вводите ответы очередной анкеты:'-): writelnC 'д - да, любое другое '. 'значение - нет' ); for k := МА to FA do begin writeC names[k], ' -> ' ); readlnC res ); ans[k] ;= ( res = 'д’ ) end; writeC fquest. ans ); writelnC 'добавить запись в файл?' ); writelnC 'д - да, любое другое значение - нет' ); readlnC fin ) end;f{ while } closeC fquest ) end. { Anketa } Задание 33 Решение: program PopularSub; const { максимальная длина названия предмета } Inname = 26; type sub = ( MA. A, I. NM, DE. PT. FA ); { тип предметов: } { MA - математический анализ } { А - алгебра } { I - информатика }
Глава 14. Файлы 249 { NM - численные методы } { DE - дифференциальные уравнения } { РТ - теория вероятности } { FA - функциональный анализ } quest = array [sub] of boolean; name = string [Inname]; { название предмета } var ans; quest: { заполняемый экземпляр анкеты } fquest; file of quest; { обрабатываемый файл } { счетчики для каждого предмета } count:.array [sub] of integer; all: integer; { общее количество анкет } { максимальное число положительных оценок } max: integer; names: array [sub] of name: { названия предметов } cm: integer; { счетчик максимальных значений } k. j: sub; begin { инициализация } reset( fquest ); names[MA] : = 'математический анализ'; names[A ] := 'алгебра'; names[IJ : = 'информатика'; names[NM] : = 'численные методы’; names[DE] : = 'дифференциальные уравнения': names[PT] : = 'теория вероятности’: names[FA] := 'функциональный анализ'; for k := МА to FA do count[k] := 0: all := 0; { вычислить количество положительных } { оценок для каждого предмета } while not eof( fquest ) do begin read( fquest. ans ); all := all + 1; for k ;• MA to FA do if ans[k] then count[k] : = count[k] + 1 end; closeC fquest ); { найти максимальное число } { положительных ответов } max := 0; cm := 0: for k := MA to FA do if count[k] > max then begin max :e count[k]; cm := 1; j := k end else if count[k] = max then cm := cm + 1; if max = 0 then writelnC 'ни один предмет не получил положительной оценки') el se if cm = 1 then
250 Приложение 1. Ответы и решения { предмет с максимальной оценкой один } begin writeC 'Наилучшую оценку получил ' ); writelnC 'курс , names[j], "" )'; writelnC 'Всего ответов '. all*, ' из них положительных - '. max ) end el se { предметов несколько } begin writelnC 'Наилучшую оценку '. max, из '.all, ' получили предметы:' ); for k := МА to FA do if count[к] » max then writelnC names[k] ) end end. { PopularSub } Задание 61 Решение: program EmptyLines: var f : text; { исходный файл } count : integer; { счетчик пустых строк } begin reset( f ); count 0; while not eof( f ) do begin if eolnC f ) then count :- count + 1; readlnC f ) { пропуск строки } end; writelnC 'Количество пустых строк в файле равно ', count ); closet f ) end. { EmptyLines } Задание 62 Решение: program Copy; var fl, { входной файл } f2: text; выходной файл } ch: char: буфер для ввода символа } begin { инициализация }ч reset( fl ); rewrite( f2 ); { обработка } while not eof( fl ) do begin { пропуск пустых строк } while eolnC fl ) do readlnC fl ); { копирование непустой строки } while not eoln(fl) do begin readC fl, ch ); writeC f2, ch )
Глава 14. Файлы 251 end; readlnC fl ); пропуск конца строки в fl } writelnC f2 ) запись конца строки в f2 } end; closeC fquest ) end. { Copy } Задание 63 Решение: program PowerLines: var f; text; { исходный файл } max; integer; { максимальное количество слов в строке } count: integer; { количество слов в очередной строке } { список номеров строк с максимальным количеством слов } list: array [1..10] of integer; klist: integer; { указатель списка номеров } num: integer: { номер строки } ch: char; { очередной символ } i. p: integer; { индексы } begin { инициализация } resetC f ); max := 0; num := 0; klist := 0; while not eof( f ) do begin count := 0; num := num + 1; while not eoln( f ) do begin { пропустить пробелы } repeat read( f. ch ) until ( ch о ' ' ) or eoln( f ); if ch <>' ’ then count := count + 1; { пропустить слово } while not eoln( f ) and ( ch<>' ’ ) do read( f, ch ) end; { закончилась строка } if count > max then begin max := count; klist ;= 1; list[l] • = num end else if count « max then if klist < 10 then begin klist := klist + 1; list[klist] := num end; { пропуск конца строки } readlnC f )
252 Приложение 1. Ответы и решения end; { распечатать первые kl1st строк с } { максимальным количеством слов } reset( f ); num := Г. for i := 1 to kl1st do begin { найти строку с номером 11st[1J } p := listfi]; while p о num do begin readlnC f ); num := num + 1 end; { распечатать строку с номером 1ist[i] } while not eolnC f ) do begin readC f, ch ); writeC ch ) end; { пропустить конец строки } readlnC f ): num ;= num + 1; { перейти на новую строку на печати } writein end; closeC f ) end. { Powerlines } Задание 87 Решение: program Create; const nc = 5; { количество курсов } ng = 6; { количество групп на курсе } num = 30; { максимальное количество студентов в группе } type tree = record num_stud; O..num; { количество студентов в группе } num_admit; O.;num; { количество допущенных к сессии } num_ex; 0..num; { количество сдавших на "отлично" } { количество сдавших на "отлично" и "хорошо" } num_ex_good: O..num; { количество получивших "неудовлетворительно" } num no sat; 0..num end; var f; file of tree; { создаваемый файл } ic; l..nc; 1g: 1..ng; rec : tree; begin assignCf,'result.dat'); rewriteCf); writelnC’ вводите информацию по итогам сессии'); for ic;=l to nc do begin writelnC’курс ’.ic);
Глава 14. Файлы 253 for 1g:=l to ng do begin writelnC‘группа 1g); writeC'количество студентов; '); readl n( rec. num_stiid); writeC'допущены к сессии; '); readlnCrec.num_adm1t); writeC'сдали на "отлично"; '); readln(rec.num_ex); writeC'сдали на "хорошо" и "отлично": '); readln(rec.num_ex_good); writeC'неуспевающих: '): readln(rec.num_no_sat); writeCf.rec) end end: close(f); writelnC'файл создан') end. { Create } Задание 88 Решение: program PrintInfo; const nc = 5; { количество курсов } ng = 6; { количество групп на курсе } { максимальное количество студентов в группе } num = 30; ' 1 type tree = record num_stud: O..num; { количество студентов в группе } num_adm1t: O..num; { количество допущенных к сессии } num_ex: O..num; { количество сдавших на "отлично" } { количество сдавших на "отлично" и "хорошо" } num_ex_good: O..num: { количество получивших "неудовлетворительно" } num_no_sat : 0..num end; var f: file of tree; { обрабатываемый файл } ic: 1..nc; 1g: 1..ng; rec : tree; Irec: byte; { номер записи о нужной группе в файле} begin assignCf.'result.dat'); reset(f); writeC'курс: '); readln(lc); writeC'группа: '): readln(lg): if 1c>nc then writelnC'неверно задан номер курса') el se if 1g>ng then writelnC'неверно задан номер группы') el se begin
254 Приложение 1. Ответы и решения irec : = (iic-l)*ng+(ig-l); seek(f.irec); read(f.rec); writelnC'информация о результатах сессии ig, ' группы ic. ’ курса'); writelnC'количество студентов '. rec.num_stud); wri teln('допущены к сессии '. rec.num_admi t); writelnC'сдали на "отлично" '. rec.num_ex); writelnC'сдали на "хорошо" и "отлично" '. rec.num_ex_good); wri teln('неуспевающих '. rec.num_no_sat); end end. { PrintInfo } Задание 89 Решение: program PrintBestlnfo; const nc = 5; { количество курсов } ng « 6; { количество групп на курсе } num = 30; { максимальное количество студентов в группе } type tree = record num_stud: O..num; { количество студентов в группе } num_admit: O..num; { количество допущенных к сессии } пш_ех: O..num; { количество сдавших на "отлично" } { количество сдавших на "отлично" и "хорошо" } num_ex_good: O..num; { количество получивших "неудовлетворительно" } • num_no_sat; 0..num end; var f; file of tree; { обрабатываемый файл } ic; l..nc; ig: l..ng; rec ; tree; irec; byte; { номер записи о нужной группе в файле} num_ex_c : O..num; { искомое число отличников } begin {$!-}{ отключить проверку ошибок ввода-вывода } assign(f.'result.dat'); reset(f); {$!+} { отключить проверку ошибок ввода-вывода } if IOResult<>0 then writelnC'файла нет') el se begin writeC'курс; '); readln(ic); if ic>nc then writelnC'неверно задан номер курса') else begin irec:=(ic-l)^ng; seekCf.irec); num_ex_c;-0; for ig:=l to ng do
Гпава 15. Динамические структуры данных 255 begin read(f.rec); num_ex_c:=num_ex_c+rec.num_ex end; writelnC'Ha '.ic, ' курсе сдали сессию на "отлично"'. num_ex_c.' студентов') end end end. { PrintBestlnfo } Задание 96 Решение: { Прообраз решения взят из справочной } { системы Turbo Pascal } program CopyFile; const BufSize = 2048; var FromF. ToF: file; { для типа file размер записи указывается } { при открытии файла на чтение-запись } NumRead. NumWritten; Word; { Word - тип для представления целых } { неотрицательных чисел } Buf; array[l..BufSize] of Char; begin assignCFromF. ’a.dat'); { открываем входной файл } resetCFromF, 1); { Размер записи = 1 байт } assignCToF. 'b.dat'); { создаем выходной файл } rewrite(ToF. 1); { Размер записи = 1 байт } writelnC'Копирование '. FileSize(FromF), ’ байт...'); repeat BlockReadCFromF. Buf. BufSize. NumRead); BlockWriteCTof. Buf, NumRead. NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); closeCFromF); close(ToF); writelnC'Копирование завершено.'); end. { CopyFile } Глава 15. Динамические структуры данных Списки. Задачи, решения Задание 1 Решение: program List_Proc; type TElem = integer; { Тип информационной части } TList = ATNode; { Представление списка } TNode = record { Звено списка } Info; TElem; { Информационная часть } Next; Tlist { Следующий элемент, списка }
256 Приложение 1. Ответы и решения end; { 1. Инициализация списка } { Список без заглавного звена } procedure BL1st_Init (var L: TList); begin L := nil end; { Список с заглавным звеном } procedure ZList_Init (var L; TList); var N; TH si; { заглавный элемент } begin new( N ); hT.Next ;= nil; L ;» N end; { 2. Добавление элемента в начало спйска } { Список без заглавного звена } procedure BL1st_AddFirst (var L: TList; E: TElem); var N: TList; { добавляемое звено списка } begin new( N ); NMnfo ;= E; N^.Next ;= L; L := N end; { Список с заглавным звеном } procedure ZL1st_AddF1rst (L; TList; E; TElem); var N: TList; { добавляемое звено списка } begin BL1st_AddF1rst( Lx.Next, E ) end; { 3. Добавление элемента в конец списка } { Список без заглавного звена } procedure BList_AddLast (var L: TList; E: TElem); var N; TList; { добавляемое звено списка } { вспомогательный указатель для } { поиска последнего элемента списка } Р; TList; begin new( N ); NMnfo ;= E; NA.Next ;= nil; if L - nil then L ;- N el se begin { поиск последнего элемента списка } Р := L; while P\Next <> nil do P P*.Next; { добавление в список нового звена } P*.Next ;= N end
Глава 15. Динамические структуры данных 257 end; { Список с заглавным звеном } procedure ZL1st_AddLast (L: TList; E: TElem); begin { поиск последнего элемента списка } while LA.Next <> nil do L :» LA.Next; { добавление в список нового звена } new( LA.Next ); L :» LA.Next; LMnfo := E; LA.Next ;= nil end; { 4. Удаление первого вхождения элемента Е в список L } { Результат функции: } { true - элемент найден и удален } { false элемент в списке не найден } { Список без заглавного звена. Решение 1 } function BList_DelEleml(var L: TList; E; TElem): boolean; var N; TList; { указатель на удаляемое из списка звено } { вспомогательный указатель для поиска звена списка. } { предшествующего удаляемому } Р: TList; { признак: найден ли элемент Е } { в списке ? } found: boolean; begin found :- false; if L <> nil then { если список не пуст } if LA.Info - E then { если первое звено является удаляемым } begin found ;- true; ' запоминаем указатель на } удаляемое звено } N ;- L; L :e LA.Next; { удаляем звено из списка } dispose( N ) { освобождаем память } end el se begin { ищем звено, предшествующее удаляемому } Р :- L; while not found and (PA.Next <> nil) do if PA\NextA.Info » E then found :«true else P :- PA.Next; if found then { если найдено удаляемое звено } begin { запоминаем указатель } { на удаляемое звено } N :« PA.Next; { удаляем звено из списка } PA.Next := NA.Next; { освобождаем память } disposeC N ) 9 Зак. 906
258 Приложение 1. Ответы и решения end end; BList_DelEl eml :« found end; { Список без заглавного звена. Решение 2 } { Рекурсивный вариант } function BL1st_DelElem2(var L; TLIst; E; TElem); boolean; var N; TList; { указатель на удаляемое звено списка } begin if L <> nil then { если список не пуст } if LA.Info « E then { если первое звено является удаляемым } begin { запоминаем указатель на удаляемое звено } N ;- L: L :» LA.Next; { удаляем звено из списка } disposeC N ); { освобождаем память } BList_DelElem2 true end el se BList_DelElem2 BList_DelElem2( LA.Next, E ) else BLIst_DelElem2 false; end; { Список с заглавным звеном } function ZL1st_DelElem(L; TList: E; TElem); boolean; var N; TLIst; { указатель на удаляемое звено списка } { вспомогательный указатель для поиска звена списка, } { предшествующего удаляемому } Р: TList; признак; найден ли элемент Е в списке? } round: boolean; begin { ищем звено, предшествующее удаляемому } found false; Р L; while not found and ( PA.Next <> nil ) do if PA.Next*.Info - E then found :-true else P P*.Next: if found then { если найдено удаляемое звено } begin { запоминаем указатель на удаляемое звено } N P*.Next; PA.Next NA.Next; { удаляем звено из списка } disposeC N ) { освобождаем память } end; ZList-DelElem ;- found end; { 5. Переворот списка } { Список без заглавного звена } procedure BList_Invert (var L; TList);
Глава 15. Динамические структуры данных 259 van Н: TList; { вспомогательный указатель } Р: TList; { указатель на обработанный элемент списка } begin Р := nil; while L<>nil do begin { запоминаем указатель на следующий } Н :« LA.Next; { теперь следующим за текущим будет звено Р } LA.Next г- Р; { текущий становится предыдущим } { для следующего шага } Р := L; { перемещаемся к следующему элементу списка } L := Н end; L := Р { самый последний становится первым } end; { Список с заглавным звеном } procedure ZList_Invert (L; TList); begin BL1st_Invert ( LA.Next ) end; { 6. Печать элементов списка } { Список без заглавного звена } p rocedure BL1st_Print ( L: TList ); begin writeC'< ’): while L <> nil do begin writeC LA.Info ); if LA.Next <> nil then writeC’.'); L ;- LA.Next end; writelnC' >') end; { Список с заглавным звеном } procedure ZList_Print (L: TList); begin BList_Print ( LA.Next ) end; { 7. Удаление всех элементов списка } { Список с заглавным звеном и без него } procedure L1st_Clear ( var L; TList ); var N: TList; { указатель на удаляемое звено списка } begin while L <> nil do begin N L; L LA.Next; disposeC N ) end end;
260 Приложение 1. Ответы и решения { Процедура демонстрирует работу приведенных } ’ выше процедур. Параметр isB позволяет выбрать } тип списка: с заглавным звеном или без него } procedure TestC IsB: boolean ): const FirstElem » 4444: { Сообщение о результате выполнения } { операции удаления } procedure DelMessaged b: boolean ): begin if b then writelnC 'Элемент в списке найден и удален' ) else writelnC 'Заданный элемент в списке не найден' ) end: var L: TList: { список } { вводимая пользователем информационная часть } Е : TElem: begin if isB then BListJnit ( L ) else ZListJnit ( L ): writelnC 'Список инициализирован' ); if isB then BList_AddFirst ( L, FirstElem ) else ZList_AddFirst ( L, FirstElem ); writelnC 'В список добавлен элемент’, ' co значением '. FirstElem ); writeC 'Введите значение элемента, ', 'добавляемого в начало списка: ' ): readlnC Е ): if isB then BList_AddFirst ( L, E ) else ZList_AddFirst ( L. E ): writeC 'Введите значение элемента, '. 'добавляемого в конец списка: ' ): readlnC Е ): if IsB then. BL1st_AddLast ( L. E ) else ZList_AddLast ( L. E ): writeC 'Элементы списка: ' ): { Печать списка } if isB then BList_Print ( L ) else ZList_Print ( L ): { Переворот списка } if isB then BList_Invert ( L ) else ZListJnvert ( L ); writeC ’Элементы списка в обратном порядке: ’ ): { Печать списка } if IsB then BL1st_Print ( L ) else ZList_Print ( L ): writeC 'Введите значение элемента, ', 'удаляемого из списка: ' ): readlnC Е ):
Глава 15. Динамические структуры данных 261 if IsB then begin DelMessageC BList_DelElemi ( L. E ) ): writeC 'Введите значение элемента, 'удаляемого из списка: ' ); readlnC Е ): DelMessageC BList_DelElem2 ( L, E ) ) end else DelMessageC ZList_DelElem ( L. E ) ); writeC 'Элементы списка: ' ): { Печать списка } if isB then BList_Print( L ) else ZList_Print( L ); L1st_Clear( L ): writelnC 'Элементы списка удалены' ): writeC'Нажмите <Enter> ... '): readln end: begin writelnC 'Список без заглавного звена' ); TestC true ): writelnC 'Список с заглавным звеном’ ): TestC false ): end. { List_Proc } Задание 4 Решение: procedure List_Sort( L: TList ): { обмен информационных частей двух звеньев списка } { L.R - указатели на звенья } procedure SwapInfoC L, R: TList ): begin with LA do Info :» RA.Info - Info: with RA do Info :- Info - LA.Info: with LA do Info :e RA.Infq + Info: end: var { указатель, используемый при поиске максимума } R: TList: Max: TList: { указатель на максимальный элемент } begin if L<>nil then { если список не пуст } begin while LA.Next <> nil do { сортируем подсписок, если в } { нем более одного элемента } begin { сначала считаем, что первый элемент } { подсписка является максимальным } Max :e L: R := LA.Next: { ищем максимальный элемент } while R о nil do begin if RA.Info > MaxA.Info { запоминаем указатель } { на максимальный }
262 Приложение 1. Ответы и решения then Мах :« R; { переходим к следующему } { элементу подсписка } R :- RA.Next end: if Max <> L { обмениваем информационные части } then SwapInfoC L, Max ); { переходим к следующему элементу списка } L LA.Next end end end; { L1st_Sort } . Задание 6 Решение: program Merge: type TElem = integer; { Тип информационной части } TList - ATNode: { Представление списка } TNode » record { Звено списка } Info: TElem: { Информационная часть } Next: TList { Следующий элемент списка } end: { Предполагается, что здесь описаны следующие процедуры: procedure List_Sort(L: TList) procedure BList_Print(L: TList) procedure BList_InitCvar L: TList) procedure BList_AddLast(var L: TList: E: TElem) procedure List_Clear(var L: TList) Ввод пользователем элементов списка } procedure List-Input(var L: TList): var E: TElem: { введенное число } begin ' BList_Init ( L ): { Инициализируем список } writeC 'Введите элементы списка '( эл1 эл2 ... 3nN<Enter> ): '): while not eoln do begin readC E ): { заносим новый элемент в конец списка } BList_AddLast ( L. Е ) end: readln { считываем символ перевода строки } end; { Процедура сливает два упорядоченных по невозрастанию списка А и В в список С. также упорядоченный по невозрастанию. Исходные списки не удаляются } procedure L1st_Merge( А.В: TList: var С: TList );
Глава 15. Динамические структуры данных 263 var Н: TList; { указатель на конец списка } { Процедура добавляет элемент из } { списка L в результирующий список С } procedure AddFromList(var L; TList); begin { является ли добавляемый элемент } { первым в списке? } if С - nil then begin new( С ); H С end el se begin new( K.Next ); H HA.Next end; FT.Info LA.Info; { переходим к следующему элементу списка } L LA.Next end; begin С ;» nil; H ;» nil; { пока есть хотя бы один элемент } { вчисходных списках } while ( А <> nil ) or ( В <> nil ) do begin { список А пуст, добавляем из В } if А - nil then AddFromList(В) else { список В пуст, добавляем из А } if В e nil then AddFromList(А) else if AA.Info > BA.Info then AddFromList( A ) else AddFromList( В ) end: if H <> nil then HA.Next nil { завершаем список } end; { Ниже приведен пример работы } { с процедурой List_Merge } var А, В ; TList; { сливаемые списки } С : TList; {результат слияния двух списков } begin { ввод исходных списков } Li St-Input( А ); List-Input( В ); { отсортируем списки по невозрастанию } List_Sort( А ); List_Sort( В );
264 Приложение 1. Ответы и решения { слияние списков А и В в список С } List_Merge( А, В. С ); { напечатаем результат слияния } writeC ‘Результат слияния: ’ ); BList_Print( С ): { очищаем списки } List_Clear( А ); L1st_Clear( В ); L1st_Clear( С ); writeC 'Нажмите <Enter> ... ' ); readln end. { Merge } b) { Процедура производит слияние двух упорядоченных } { по невозрастанию списков А и В в список С. } { также упорядоченный по невозрастанию, путем } { перестановки указателей в исходных списках. } procedure List_Join ( А, В: TList: var С: TList ); var h: TList: { указатель на конец списка } procedure Joint var S: TList ); begin { если список-результат пуст } if С = nil { запоминаем указатель на "голову” списка } then С S { подсоединяем элементы к концу списка } else h\Next : S: h :» S; { переходим к следующему элементу списка } S := SA.Next end; begin С := nil; { пока оба списка не пусты, сравниваем ; { первые элементы и минимальный из них { помещаем в список-результат } while (А <> nil) and (В <> nil) do if AA,info < BA.info then Joint A ) else Joint В ); { добавляем элементы непустого списка к списку-результату } if А о nil then Joint А ) else .if Во nil then Joint В ) end; { List_Join } Двоичное дерево. Задачи, решения Задание 2 Решение: type TElem = integer; { Тип информационной части } TTree = ATNode; { Представление дерева } TNode = record { Узел дерева } Info: TElem; { Информационная часть }
Глава 15. Динамические структуры данных 265 Left: ТТгее: Указатель на левое поддерево } Right: ТТгее Указатель на правое поддерево } end: { Функция создает копию двоичного дерева А } { Результатом функции является указатель } { на копию дерева А } function TreeCopy( А: ТТгее ): ТТгее: var Tree: ТТгее: { Указатель на копию дерева } begin if А о nil then begin { создаем новое звено дерева } new( Tree ): { копируем информационную часть } Tree*.Info :- A*.Info; { сохраняем указатель на копию } { левого поддерева } ’ Tree*.Left :- TreeCopy(AA.Left): { сохраняем указатель на копию.} { правого поддерева } Tree*.Right :e TreeCopy(A*.Right) end else Tree nil: TreeCopy := Tree end: { TreeCopy } Задание 4 Решение: type TElem - integer: { Тип информационной части } ТТгее » *TNode: { Представление дерева } TNode » record { Узел дерева } Info: TElem; { Информационная часть } Left: ТТгее: { Указатель на левое поддерево } Right: ТТгее { Указатель на правое поддерево } end: { Функция вычисляет высоту } { заданного двоичного дерева А } function TreeHeightC А: ТТгее ): integer; var lh: integer; { высота левого.поддерева } rh: integer; { высота правого поддерева } begin if А = nil then TreeHeight :- О else begin lh :- TreeHeightC A*.Left ); rh :» TreeHeightC A*.Right ); if lh > rh ' then TreeHeight lh + 1 else TreeHeight :- rh + 1 end end: { TreeHeight }
266 Приложение 1. Ответы и решения \ ' • Дерево двоичного поиска. Задачи, решения Задание 2 Решение: program FindTree; type TElem * record { Тип информационной части } Number: integer: { Число } Count: Integer { Количество повторений } end: TTree - *TNbde: { Представление дерева } TNode » record { Узел дерева } Info : TElem: { Информационная часть } Left : TTree: { Указатель на левое поддерево } Right: Ttree { Указатель на правое поддерево } end: { Процедура добавляет в дерево двоичного поиска } { новый элемент i. Если элемент i в дереве уже } { присутствует, увеличивается счетчик числа } { вхождений элемента i в соответствующем узле дерева } procedure Add ( var Tree: TTree: i: integer ); begin if Tree <> nil then with Tree* do begin if Info.Number < i then Add( Right, i ) else if Info.Number > i then Add( Left, i ) el se { элемент i в дереве } { присутствует, увеличиваем } { счетчик числа вхождений } { элемента } Infо.Count := Infо.Count + 1 end el se begin { Добавляем новый узел } new( Tree ): with Tree* do begin Info.Number : = i: Info.Count :- 1: Left :- nil; Right nil end end end: { Процедура печати элементов дерева } { в порядке убывания значений } procedure Print ( Tree: TTree ): begin if Tree <> nil then with Tree* do
Глава 15. Динамические структуры данных 267 begin { обходим дерево справа налево } PrintC Right ); writeCInfo.Number, '(’, Info.Count. *p) '); PrintC Left ) end end; { Процедура удаления дерева. После выхода } { из процедуры значение Tree не определено } procedure Delete ( Tree: TTree ); begin if Tree <> nil then begin { удаляем правое поддерево } DeleteC Tree*.Right ); { удаляем левое поддерево } DeleteC Tree*.Left ): { удаляем корень } disppseC Tree ) end end; var F: file of integer; { исходный файл } FileName: string; { имя файла } Number: integer; { считываемое из файла число } Tree: TTree: { дерево двоичного поиска } begin writeC 'Введите имя обрабатываемого файла: ' ); readlnC FileName ); AssignC F. FileName ); {$!-} Reset(F); {$!+} { при открытии файла возникали } { ошибки ввода-вывода? } if lORdsult о 0 then begin writelnC 'Возникла ошибка при 'открытии файла! Выполнение *, 'программы прекращено.' ); Exit end; Tree :- nil; { заполняем дерево двоичного поиска } while not eof( F ) do begin readC F. Number ); AddC Tree, Number ) end; CloseC F ); if Tree = nil then writelnC 'Исходный файл пуст' ) el se begin writelnC 'Элементы дерева в порядке убывания значений' ); { печатаем элементы в порядке } { убывания значений } PrintC Tree ); writeln; DeleteC Tree ) { освобождаем память }
268 Приложение 1. Ответы и решения end; end. { FindTree } Очередь. Задачи, решения Задание 1 Решение: а) const { Максимальное число элементов очереди + 1 } MaxN = 100; type TElem = Integer; { Тип элементов очереди } TElements = array [l..MaxN] of TElem; TQueue = record { Представление очереди } { Массив для хранения элементов очереди } Elements: TElements; Head: Integer; { "Голова" очереди } Tail : integer { "Хвост" очереди } end; { Инициализация очереди Q } procedure Queue_Init( var Q : TQueue); begin { Изначально очередь не содержит элементов } Q.Head : = 1; Q.Tail := 1 end;f Queue_Init } •’ Проверка очереди Q на пустоту } Результат функции: } true - очередь пуста } { false - очередь не пуста } function Queue_IsEmpty( Q: Tqueue ): boolean; begin Queue_IsEmpty := ( Q.Head = Q.Tail ) end;{ Queue_IsEmpty } { Поместить элемент E в очередь Q } procedure Queue_Push( var Q : TQueue; E : TElem); const ErrorCode = 255; begin with Q do begin { заносим новый элемент в очередь } Elements[Tail] := Е; { вычисляем значение индекса для следующего } { элемента очереди } Tail := (Tail mod MaxN) + 1; if Tail = Head then begin writelnC 'Переполнение очереди !’!' ); { Аварийное завершение программы } Halt( ErrorCode ) end end end;{ Queue_Push } { возможна другая реализация операции
Глава 15. Динамические структуры данных 269 помещения значения в очередь } { Поместить элемент Е в очередь Q } { Результат функции: } { true - операция выполнена успешно } { false - переполнение очереди } function Queue_Push_Func( var Q: TQueue; E: TElem): boolean: var newTail: integer: { индекс для следующего } { элемента очереди } begin newTail := (Q.Tail mod MaxN) + 1; with Q do if newTail <> Head then begin Tail := newTail: Elements[Tail] := E: Queue_Push_Func := true end else { Переполнение очереди } Queue_Push_Func := false end:f Queue_Push_Func } { Извлечь элемент из “головы" очереди Q } { Результат функции: } { Извлеченный из очереди элемент } function Queue_Pop( var Q : TQueue): TElem: const ErrorCode = 255: begin if Queue_IsEmpty( Q ) then begin writelnC 'Извлечение элемента из пустой очереди !!!' ); { Аварийное завершение программы } HaltC ErrorCode ) end else with Q do begin Queue_Pop := Elements[Head]: Head := (Head mod MaxN) + 1: end end:{ Queue_Pop } { возможна другая реализация операции извлечения значения из очереди Извлечь элемент из "головы" очереди Q } procedure Queue_Pop_Proc( var Q : TQueue: var E : Telem ); const ErrorCode e 255; begin if Queue_IsEmpty( Q ) then begin writelnC 'Извлечение элемента из пустой очереди !!!’); { Аварийное завершение программы } HaltC ErrorCode )
270 Приложение 1. Ответы и решения end else with Q do begin E Elements[Head]; Head (Head mod MaxN) + 1; end end; { Queue_Pop_Proc } b) type TElem - integer; { Тип элементов очереди } TList - ATElement: { Список, предназначенный для хранения элементов очереди TElement - record { Элемент списка } Info; TElem; { Информационная часть } Next; TList { Указатель на следующий элемент списка } end; TQueue - record { Представление очереди } Head; TList; { "Голова” очереди } Tail; TList { "Хвост" очереди } end; { Инициализация очереди Q } procedure Queue_Init( var Q: TQueue ); begin { Изначально список, хранящий } { элементы очереди, пуст } Q.Head ;- nil end; { QueueJnit } { Проверка очереди Q на пустоту } { Результат функции: } { true - очередь пуста } { false - очередь не пуста } function Queue_IsEmpty( Q: TQueue ): boolean; begin Очередь пуста, если пуст } соответствующий список } Queue_IsEmpty ( Q.Head - nil ) end; { Queue_IsEmpty } { Поместить элемент E в "хвост" очереди Q } procedure Queue_Push( var Q: TQueue; E: TElem ); var Z: TList; begin new( Z ); { Создаем новое звено списка } ZA.Info E; ZA.Next nil; if Queue_IsEmpty( Q ) then Q.Head Z else Q.Tail*.Next Z; Q.Tail Z end; { Queue_Push } { Извлечь элемент из очереди Q } { Результат функции: } { Извлеченный из "головы" очереди элемент } function Queue_Pop( var Q: TQueue ): TElem; const ErrorCode - 255; var Z: TList; begin if Queue_IsEmpty( Q ) then begin writelnC 'Извлечение элемента из пустой очереди ’!! ' );
Глава 15. Динамические структуры данных 271 { Аварийное завершение программы } HaltC ErrorCode ) end else begin { Сохраняем указатель на звено списка } Z :» Q.Head; { Перемещаемся к следующему звену } Q.Head : = ZA.Next; Queue_Pop : = ZA.Info; disposeC Z ) { Удаляем звено списка } end end; { Queue_Pop } Стек. Задачи, решения Задание 1 Решение: а) const MaxN = 100; { Максимальное число элементов стека } type TElem = Integer; { Тип элементов стека } TElements = array [1..MaxN] of TElem; TStack = record { Представление стека } Elements: TElements; { Элементы стека } Top: integer { Индекс вершины стека } end; { Инициализация стека S } procedure Stack_Init ( var S: TStack ); begin { Изначально стек не содержит элементов } S.Top := 0 end; { Проверка стека S на пустоту } { Результат функции: } { true - стек пуст } { false - стек не пуст } function Stack_IsEmpty( S: TStack ):_ boolean; begin ' x { Стек пуст, если он не содержит элементов } Stack_IsEmpty :« ( S.Top » 0 ) end; { Поместить элемент Е в стек S } procedure Stack_Push ( var S: TStack; E: TElem ): const ErrorCode = 255; begin with S do if Top < MaxN then begin Top := Top + 1; Elements[Top] := E end el se begin writelnC 'Переполнение стека !!!’ ); { Аварийное завершение программы } HaltC ErrorCode )
272 Приложение 1. Ответы и решения end end; { возможна другая реализация операции помещения значения в стек Поместить элемент Е в стек S } Результат функции: } true - операция выполнена успешно } false - переполнение стека } wetion Stack_Push_Func ( var S: TStack; E: TElem ): boolean; begin with S do if Top < MaxN then begin Top Top + 1; Elements[Top] E; Stack Push Func :- true end else { Переполнение стека } Stack Push Func :- false end; ’ Извлечь элемент с вершины стека S } ’ Результат функции: } Извлеченный из стека элемент } wetion Stack_Pop ( var S: TStack ): TElem; const ErrorCode - 255; begin if Stack_IsEmpty( S ) then begin writelnC ’Извлечение элемента из пустого стека !’!’ ); { Аварийное завершение программы } HaltC ErrorCode ) end else with S do begin Stack_Pop :- Elements[Top]: ' Top :- Top - 1 end end; { возможна другая реализация операции извлечения значения из стека * Извлечь элемент Е с вершины стека S } procedure Stack_Pop-Proc( var S: TStack; var E: TElem ); const ErrorCode - 255; begin if Stack_IsEmpty( S ) then begin writelnC ’Извлечение элемента из пустого стека !!!’ ); { Аварийное завершение программы } HaltC ErrorCode )
Глава 15. Динамические структуры данных 273 end el se with S do begin E := Elements[Top]; Top :* Top-1 end end; b) type TElem = integer; { Тип элементов стека } TStack = *TElement; { Представление стека } { Элемент списка, предназначенного для } { хранения элементов стека } TElement = record Info; TElem; { Элемент списка } Next; TStack { Указатель на следующий элемент списка } end; { Инициализация стека S } procedure Stack_Init ( var S: TStack ); begin { Изначально список, хранящий } { элементы стека, пуст } S := nil end; { Проверка стека S на пустоту } { Результат функции; }. { true - стек пуст } { false - стек не пуст } function Stack_IsEmpty(S; TStack): boolean; begin { Стек пуст, если пуст } { соответствующий список Stack—IsEmpty := ( S = nil ) end; { Поместить элемент E в стек S } procedure Stack_Push (var S: TStack; E: TElem); var'Z: TStack; begin new( Z ); { Создаем новое звено сгг^ска } ZA.Next := S: { Присоединяем новое звено } { к имеющемуся списку } Z\Info := Е; S := Z { Новая вершина стека } end; ’ Извлечь элемент с вершины стека S } ’ Результат функции: } Извлеченный из стека элемент } function Stack_Pop ( var S: TStack ): TElem; const ErrorCode = 255; var Z: TStack; begin if Stack_IsEmpty( S ) then begin writelnC 'Извлечение элемента из '. 'пустого стека !!!' ); { Аварийное завершение программы } 10 Зак. 906
274 Приложение 1. Ответы и решения HaltC ErrorCode ) end el se begin Z := S; { Сохраняем указатель } { на звено списка } { Перемещаемся к следующему звену } S : = S*.Next; Stack_Pop := Z^.Info; disposeC Z ) { Удаляем звено списка } end end; ПРИМЕЧАНИЕ Приведенные выше реализации стека (на основе массива и динамических структур) позволяют однообразно обращаться к данной логической струк- туре, а также использовать стек без знания его внутреннего представле- ния (хотя, конечно, имеется множество случаев, когда та или иная реали- зация предпочтительней при обработке конкретной информации). Ниже демонстрируется функционирование подпрограмм для работы со стеком, program StackTest: var Stack: TStack; { Стек } E: TElem; { Помещаемый в стек элемент } begin { Пример использования стека } { Инициализация стека } Stack_Init ( Stack ); { Проверка стека на пустоту } writeln ( 'Stack-IsEmpty = Stack_IsEmpty( Stack ) ); writeC 'Введите 1-й элемент стека: ' ): readlnC Е ); { Помещение элемента в стек } Stack_Push( Stack. Е ); { Проверка стека на пустоту } writeln ( ’Stack-IsEmpty = Stack_IsEmpty( Stack ) ): writeC ’Введите 2-й элемент стека: ' ); readlnC Е ); { Помещение элемента в стек } Stack_Push( Stack, Е ): writelnC 'Извлечение и печать элементов стека:' ): while not Stack_IsEmpty( Stack ) do writelnC Stack_Pop( Stack ) ); writeC 'Нажмите <Enter> ... ' ); readln end. { StackTest } Задание 2 Решение: program Inversestring; type TElem = char; { Тип элементов стека } TStack = *TElement; { Представление стека } { Список, предназначенный для хранения элементов стека } TElement = record Info : TElem; { Элемент списка }
Глава 15. Динамические структуры данных 275 { Указатель на следующий элемент списка } Next : TStack end; { Предполагается, что здесь описаны следующие подпрограммы работы со стеком, реализованным на основе динамических структур: procedure Stack_Init ( var S: TStack ); procedure Stack-Push ( var S: TStack; E: TElem ); function Stack_IsEmpty( S.; TStack ): boolean; function Stack_Pop ( var S: TStack ); TElem; } var Stack: TStack; { Стек } E; TElem; { Помещаемый в стек элемент } begin { Инициализация стека } Stack_Init ( Stack ); writeC 'Введите строку текста: ' ); { Помещение символов строки текста в стек } while not eoln do { Пока не конец строки } begin { Читаем следующий символ } readC Е ); { Помещаем его в стек } Stack_Push( Stack, Е ) end; readln; { Читаем признак конца строки } writeC 'Символы строки в обратном порядке: ' ); while not Stack_IsEmpty( Stack ) do { Пока стек не пуст, извлекаем } { символ из стека и выводим его } writeC Stack_Pop( Stack ) ); writeln; writeC 'Нажмите <Enter> ... ' ); readln end. { Inversestring } Задание 5 Решение: program Logical Expression; const TerminateChar = chr(O): type TSymbol = ( sNone, sTerminate. sTrue. sFalse. sNot, sAnd. sOr. sLParen. sRParen ); TElem = TSymbol; { Тип элементов стека } TStack = ATElement; { Представление стека } { Список, предназначенный для хранения элементов стека } TElement = record Info : TElem; { Элемент списка } Next : TStack { Следующий элемент списка } end; { Предполагается, что здесь описаны следующие подпрограммы: procedure Stack_Init (var S: TStack): function Stack_IsEmpty(S: TStack): boolean: procedure Stack_Push (var S: TStack; E: TElem);
276 Приложение 1. Ответы и решения function Stack_Pop (var S: TStack): TElem: } { функция рассчитывает значение выражения. } { хранящегося в текстовом файле F } function BooleanExpressionC var F: Text ) : boolean: var Sym : TSymbol: Ch : char: procedure NextSym; { процедура читает следующий символ из файла } procedure NextChar: begin if eof( F ) then Ch :- TerminateChar else if eoln( F ) then begin readlnC F ): Ch := ' ' end else readC F. Ch ): end: { процедура пропускает конец текущего слова } procedure Ski pWordTail: begin while Ch in ['a*..’z’] do NextChar end: begin while Ch=' ' do NextChar: { пропускаем пробелы } Sym := sNone: case Ch of ')': begin Sym := sRParen; NextChar end: '(': begin Sym := sLParen: NextChar end: *t*: begin Sym := sTrue; SkipWordTail en0: ’f’: begin Sym := sFalse: SkipWordTail end: ’n’: begin Sym := sNot: SkipWordTail end: ’a': begin Sym : = sAnd: SkipWordTail end; ’o': begin Sym := sOr: SkipWordTail end; TerminateChar: Sym := sTerminate end end: var {извлекаемые из стека операнды и операция } opl. ор2. fun : TSymbol: { вспомогательный массив для преобразования } { false в sFalse, a true в sTrue } B2Sym : array [false..true] of TSymbol: { стек для хранения операций и операндов } S : TStack: begin StackJnitC S ): B2Sym[false] := sFalse; B2Sym[true] := sTrue: Ch := ' ': NextSym: { читаем первый символ } while Sym <> sTerminate do
Глава 15. Динамические структуры данных 277 begin case Sym of sTrue, sFalse, sNpt, sAnd, sOr : Stack_Push(S,Sym); sRParen : begin { при чтении правой скобки извлекаем операцию и операнд(ы). } { и производим вычисления } ор2 : = Stack_Pop( S ): fun := Stack_Pop( S ): case fun of sNot: Stack_Push ( S. B2Sym[op2 = sFalse] ): sOr : begin opl := Stack_Pop( S ): Stack Push ( S, B2Sym[(op.l = sTrue) or (op2 = sTrue)]): end: sAnd : begin opl := Stack_Pop( S ): Stack Push ( S. B2Sym[(opl = sTrue) and Cop2 = sTrue)]): end end end else : { пропускаем '(' } end: * NextSym { читаем следующий символ } end: BooleanExpression := (Stack_Pop( S ) = sTrue) end: var F: Text: { файл, хранящий логическое выражение } FileName : string: { имя файла } begin writeC 'Введите имя файла, содержащего логическое ', ’выражение заданного формата: '): readlnC FileName ): AssignC F. FileName ): {$!-} Reset(F): {$!+} { при открытии файла возникали ошибки ввода-вывода? } if lOResult <> О then begin writelnC 'Возникла ошибка при открытии файла! Выполнение программы прекращено.' ): Exit-' end: writelnC 'Значение выражения равно ’,
278 Приложение 1. Ответы и решения BooleanExpression( F ) ): Close( F ): write( 'Нажмите <Enter> ... ' ): readln end. { LogicalExpresslon } Задание 13 Решение: program TestBrRIght: const { Максимальная длина вводимой строки } MaxStrLen « 80: { Максимальное число элементов стека } MaxN = MaxStrLen: type TElem = char: { Тип элементов стека } TElements » array [l..MaxN] of TElem: TStack = record { Представление стека } { Массив для хранения элементов стека } Elements : TElements: { Вершина стека } Тор : integer end: { Строка символов } TStrlng - array [1..MaxStrLen] of char: { Предполагается, что здесь описаны следующие подпрограммы работы со стеком, реализованном на основе массива: procedure Stack_Init ( var S: TStack ): procedure Stack_Push ( var S: TStack: E: TElem ): function Stack_IsEmpty( S: TStack ): boolean: function Stack_Pop ( var S: TStack ): TElem: Функция проверяет правильность расстановки } ; скобок в выражении, хранимом в строке s } { ExprLen - длина выражения } { Результат функции: } { true - скобки расставлены правильно } { false - несоответствие скобок } function TestExpresslonC s: TStrlng: ExprLen: integer ): boolean: var Stack: TStack: { Стек для хранения открывающих скобок } curChar: TElem; { Обрабатываемый символ выражения } 1: Integer: Good: boolean: { Признак соответствия скобок в выражении } { Определение символа левой скобки для данной правой } function ToLeft( г: char ): char: begin case r of ' '}’: ToLeft ;= '{': ')': ToLeft := '(': ']': ToLeft := end end: begin { Инициализация стека }
Глава 15. Динамические структуры данных 279 Stack_In1t ( Stack ); { Изначально будем считать. } { что скобки расставлены верно } Good : = true; { Начинаем обработку с первого } { символа выражения } 1 := 1: while (1 <= ExprLen) and Good do begin curChar :» s[i]; case curChar of '{’. ’[’. ’(’: { Открывающую скобку заносим в стек } Stack-Push( Stack. curChar ): 1}1 * J * 1)1 * begin Good := false; { Проверим ситуацию, когда } {есть закрывающая скобка. } { но нет открывающей } if not Stack_IsEmpty( Stack ) then { Проверим соответствие } { левой и правой скобок } if Stack-Pop( Stack ) = ToLeftC curChar ) then Good ;= true end end; 1 :• i+1 { Переходим к следующему символу } end; { Проверяем ситуацию незакрытых левых скобок } Good ;= Good and Stack_IsEmpty( Stack ); { Очищаем стек в случае ошибки } if not Good then while not Stack_IsEmpty( Stack ) do curChar := Stack_Pop( Stack ); { Возвращаем результат выполнения функции } TestExpression : = Good; end; var s: TString; { Введенное пользователем выражение } ExprLen; integer; { Число символов в выражении } begin { Ввод выражения } writeC ’Введите проверяемое выражение; ' ); ExprLen ;= 0; while (ExprLen < MaxStrLen) and not eoln do begin ExprLen ;= ExprLen + 1; readC s[ExprLen] ); end; if not eoln then { Если пользователь ввел более } { MaxStrLen символов } writelnC 'Обрабатываемое выражение-усечено до '. MaxStrLen,' символов !' ); readln; { Сейчас в ExpLen хранится длина } { выражения в символах } { Проверка правильности расстановки скобок }
Приложение 2 Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет Задачи для самостоятельного решения Задача 1. «Абракадабра» Последовательность из латинских букв строится следующим образом. На первом шаге она пуста. На каждом последующем шаге последовательность удваивается, после чего к ней слева дописывается очередная буква латинского алфавита (а, Ь, с,...). Ниже приведены первые шаги построения последовательности. Пустая последовательность: Шаг 1. а Шаг 2. baa ШагЗ. cbaabaa Шаг 4. dcbaabaacbaabaa Задача состоит в том, чтобы по заданному числу Доопределить символ, который стоит на ЛО-м месте в последовательности, получившейся после 26-го шага. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд. Формат входных данных Во входном файле записано одно натуральное число У (1 <N< 226). Формат выходных данных Запишите в выходной файл символ, стоящий в позиции У получившейся последо- вательности.
Задачи для самостоятельного решения 281 Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 4 w Задача 2. «Divide et impkra!» На плоскости задано N прямых. Напишите программу, которая определяет, на сколько кусков разбивают плоскость эти прямые. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд. Формат входных данных Исходные данные во входном файле записаны в следующем порядке: N, alf bucbdu ..., aN, bN, cN, dN, где 1 < N< 100, а пары чисел (a„ />,) и (c„ rf,) — целочисленные коор- динаты двух различных точек, через которые проходит прямая с номером i. Все данные разделяются пробелами и/или символами перевода строки. Формат выходных данных В выходной файл необходимо вывести одно целое число — искомое количество кусков. Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 3 7 0 0 0 2 0 2 2 0 2 0 0 0 Задача 3. «Два конвейера» В цехе по производству напитков работают два конвейера. На первом конвейере напиток разливается по бутылкам, а на втором происходит закупоривание буты- лок. После схода с первого конвейера очередной бутылки она сразу же поступает на второй. Поскольку тара используется различная, каждая бутылка имеет свое время заполнение и время закупорки. Требуется написать программу, которая для заданной последовательности бутылок: а) определяет время, через которое последняя бутылка в этой последовательно- сти будет закупорена (закупоривать можно лишь наполненные бутылки); Ь) находит такую перестановку заданных бутылок, при которой суммарное время разлива и закупорки бутылок было бы минимально, и определяет это время. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд.
282 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет Формат входных данных В первой строке входного файла содержится целое число У(1 <N< 1000) — коли- чество бутылок. Далее идут N пар чисел: Х2 Y2, ..., XNYN. Здесь X, означает время разлива, a Yt — время закупорки бутылки с номером i. Xi и Yt — неотрица- тельные целые числа, не превосходящие 1 000 000. Все числа разделяются пробе- лами и/или символами перевода строки. Формат выходных данных Первая строка выходного файла должна содержать время, требуемое для исход- ной последовательности бутылок, вторая — минимально возможное время для пункта b задачи. Третья строка должна содержать перестановку номеров бутылок от 1 до ЛГ, для которой достигается минимальное время. Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 3 490 200 40 370 100 100 321 30 90 Задача 4. «Антивирус» Для распознавания различных вирусов программа HIVTEST использует набор сигнатур. Если сигнатура вируса встречается в файле (последовательности литер), то файл считается зараженным этим вирусом. Напишите программу, которая по заданному набору сигнатур определяет, какими вирусами инфицирован анализи- руемый файл. Сигнатура вируса формально описывается следующим образом: <сигнатура>::= <байт>|| | <сигнатура> <сигнатура> <байт>::= <шестнадцатеричная цифра> <шестнадцатеричная цифра> <шестнадцатеричная цифра>::='0’|'Г ’2’ '3' ’4' '5' *6' '7' ’8' '9' ’А’ ’В' ’С ’D' ’Е’ ’F’ Например, 1F71E* — сигнатура, a *?FFF — не является сигнатурой. Байт (две шестнадцатеричные цифры) в сигнатуре означает, что на этом месте в файле дол- жен быть именно этот байт. Символ ' ?' означает, что на соответствующем месте может быть любой байт. Символ ' * ’ заменяет любую, в том числе и пустую, после- довательность байтов. Считается, что сигнатура присутствует в файле, если она может быть правильно прочитана, начиная с некоторой позиции этого файла. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд. Формат входных данных Первая строка входного файла содержит количество различных вирусов N( 1 < N < 10). В каждой из следующих N строк указано имя одного из вирусов, а через пробел —
Задачи для самостоятельного решения 283 соответствующая ему сигнатура. Имена вирусов не повторяются и состоят не более чем из 20 латинских букв и цифр. Длина сигнатуры не превышает 100 символов. В (N + 2)-й строке записан анализируемый файл (последовательность литер) в шестнадцатеричном представлении (байты последовательно записаны как пары шестнадцатеричных чисел). Длина анализируемого файла не превышает 10 000 байт. Формат выходных данных Выведите в выходной файл имена вирусов, которыми инфицирован заданный анализируемый файл. Имена вирусов должны разделяться символами перевода строки. Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 4 small virus small virus 2F3E?4F/ polymorph bigvirus A5*FF?00*A6*23??24 vIRusamarlNA 1F?O7?5F polymorph 22*33 22312F3E454F763318 Задача 5. «Новые гвозди» На прямоугольный стол разложили У одинаковых листков бумаги со сторонами, параллельными краям стола. Необходимо прибить листки к столу гвоздями так, чтобы в каждый листок был вбит ровно один гвоздь, а каждым гвоздем прикреп- лялся к столу хотя бы один листок. Гвозди нельзя забивать в границы листков бумаги. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд. Формат входных данных В файле исходных данных записано количество листков N (1 < N< 100), длина листка L и его ширина W (1 < L; W < 1000). Далее следуют описания АГ листков, заданных координатами левого нижнего угла. Оси координат расположены по кра- ям стола, начало координат находится в левом нижнем углу стола. Координаты точек — пары неотрицательных целых чисел, не превосходящих 1000. Все числа разделяются пробелами и/или символами перевода строки. Формат выходных данных Если вбить гвозди требуемым в условии способом невозможно, то необходимо поместить в выходной файл строку вбить гвозди невозможно. Если искомый способ существует, то программа должна вывести в выходной файл координаты гвоздей в произвольном порядке. Координаты гвоздей — вещественные числа. Числа в вы- ходном файле должны разделяться пробелами и/или символами перевода строки.
284 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 3 6 6 10 10 13 7.5 0 0 5 5 12 3 ПРИМЕЧАНИЕ Следующая группа задач предлагалась на университетской олимпиаде студентов по информатике в 1997 году. Задача 6. «Телефонная связь» Поселок состоит из ЛГ домов, расположенных вдоль прямой дороги с одной сторо- ны на равных расстояниях. Дома пронумерованы последовательно: 1, 2, 3, N. В поселке проводят телефонную связь. В таблице Т указано, сколько телефонных аппаратов надо установить в каждом доме. Расстояние между двумя соседними домами считается равным единице. Создать программу для определения номера дома, в котором надо установить АТС, чтобы суммарное расстояние от АТС до всех телефонных аппаратов было минимальным. Если таких домов несколько, достаточно найти любой. Каждый телефон связан с АТС отдельным проводом. Под расстоянием до телефонного аппарата подразумевается расстояние до дома, в котором будет установлен аппарат. Расстояние от АТС до телефонного аппарата, установленного в доме, где стоит АТС, считается равным нулю. Технические требования Входные данные берутся из текстового файла inputl.txt, первая строка которого содержит число домов, вторая — линейную таблицу Т. Исходные данные коррект- ны, их проверка не требуется. Выходные данные — номер дома, где нужно поставить АТС, и суммарное рас- стояние до всех телефонных аппаратов — выводятся на экран. Пример файлов входных и выходных данных 6 АТС - в доме 4 10 3 113 Суммарное расстояние - 13 Задача 7. «Функция» Целое положительное число М записывается в двоичной системе счисления, за- тем разряды переставляются в обратном порядке. Получившееся число принима- ется за значение функции В(М). Создать программу для вывода в текстовой файл OUT.TXT значений функции В(М) на отрезке [512,1023]. Задача 8. «Считалка» Вокруг считающего стоят У человек, один из которых назван первым, а остальные пронумерованы по часовой стрелке числами от 2 до N. Считающий ведет счет до М начиная с первого. Человек, на котором остановился счет, выходит из круга. Счет
Задачи для самостоятельного решения 285 вновь начинается со следующего за выбывшим человека (при этом выбывшие из круга не считаются), и так до тех пор, пока не останется один человек. Определить начальный номер оставшегося человека. Технические требования Входными данными являются числа N и М, которые вводятся с клавиатуры. Ре- зультат — номер оставшегося человека — выводится на экран. Пример файлов входных и выходных данных 5 3 Номер оставшегося - 4 ПРИМЕЧАНИЕ Следующие задачи предлагались на городской студенческой олимпиаде по информатике в 1997 году. Задача 9. «Многоугольник» Выпуклый многоугольник на плоскости задан целочисленными координатами своих вершин. Требуется подсчитать количество точек с целочисленными коор- динатами, лежащих на границе многоугольника. Технические требования Входными данными являются число вершин многоугольника и их координаты в по- рядке обхода по часовой стрелке. Координаты вершин — целые числа и по модулю не превосходят 1 000 000. Входные данные берутся из текстового файла INPUT4.TXT, в первой строке кото- рого указывается число вершин многоугольника, в каждой следующей строке — пара координат. Результаты выводятся на экран. Исходные данные корректны, их проверка не требуется. Пример файлов входных и выходных данных 4 80 -10 -10 -10 10 10 10 10 -ГО Задача 10. «Метеостанции» На Южном полюсе расположены N пронумерованных метеорологических стан- ций. Каждая станция соединена с другими станциями линиями связи. В результа- те стихийного бедствия некоторые линии связи оказались нарушенными. Исправ- ность линии связи между I-й и K-й станциями определяется из целочисленной таблицы NET: элемент с индексами (/, К) равен 1, если связь между I-й и K-й стан- циями не нарушена, и 0 — в противном случае. Требуется определить, между какими парами станций связь невозможна даже через цепочки других станций. Создать программу для определения пар станций, между которым невозможно установить связь.
286 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет Технические требования Входными данными являются число станций N и целочисленная таблица NET раз- мером NxN. Входные данные берутся из текстового файла INPUT5.TXT, в первой строке кото- рого указывается число станций, в каждой следующей строке — очередная строка таблицы. Результаты — пары номеров станций — выводятся построчно на экран. Исходные данные корректны, их проверка не требуется. Пример файлов входных и выходных данных 4 1 1 0 11 3 1 1 0 02 3 0 0 1 03 4 10 0 1 Задача 11. «Скобки» Дано арифметическое выражение, состоящее из букв, однозначных чисел, знаков арифметических операций и скобок, записанное в общепринятой форме. Требует- ся удалить из выражения лишние пары скобок (то есть пары, не влияющие на по- рядок выполнения операций). Создать программу для удаления из заданного выражения лишних пар скобок. Технические требования Исходная строка с выражением вводится с клавиатуры. Результат — упрощенное выражение — выводится на экран. Пример файлов входных и выходных данных ((6/2)*А+(8-5))/(Е) (6/2*А+8-5)/Е Задача 12. «Криптограмма» Текст закодирован с помощью сетки, представленной ниже, где цифрой 0 обозна- чено отверстие. Для того чтобы декодировать сообщение (криптограмму), нужно наложить сетку на текст так, чтобы в отверстия можно было видеть символы зако- дированного текста. Первый раз сетка накладывается так, чтобы сторона, отмечен- ная знаком «+», была верхней, затем сетка поворачивается по часовой стрелке на 90 градусов, читается следующий набор символов и так далее до полного обо- рота сетки на 360 градусов. 10 10 10 11110 1 110 111 10 110 1 111110 1110 11 Создать программу для ввода закодированного текста по строкам и расшиф- ровки его с помощью данной сетки.
Задачи для самостоятельного решения 287 Технические требования Исходные данные — текст и сетка — задаются в виде квадратных таблиц в тексто- вых файлах inpl.txt и inp2.txt, каждая строка таблицы размещается в отдельной строке файла. Результат выводится на экран. у Пример файлов входных и выходных данных ж б в у н р бурямглоюнебокроетвихриснежныекрутя и ы н е я е к х м б р р о г у р л к т и р я о о с е н ю е т 10 10 10 11110 1 110 111 10 110 1 111110 1110 11 Задача 13. «Зоны» Двумерная таблица Р[1:М, 1:7V] заполнена нулями и единицами. Цепочкой будем называть последовательность единичных элементов таблицы, в которой последо- вательно расположенные пары элементов таблицы являются соседними по гори- зонтали, вертикали или диагонали. Смыкаясь концами друг с другом и с краями таблицы, цепочки делят таблицу на «зоны», заполненные нулями. Своими индек- сами Р и Q задается элемент таблицы. Требуется заполнить единицами зону таб- лицы, в которой находится заданный элемент. Если заданный элемент окажется единичным, то таблица не преобразуется. Создать программу для получения из заданной таблицы другой таблицы, в ко- торой зона с указанным элементом заполнена единицами, если указанный эле- мент — нулевой. Технические требования Входными данными являются число строк Ми столбцов ЛГтаблицы, значения эле- ментов таблицы и индексы задаваемого элемента. Входные данные берутся йз текстового файла INP5.TXT, в первой строке которо- го указываются числа М nN, в каждой следующей строке — очередная строка таб- лицы, в последней строке файла — числа Р и Q. Результат — новая таблица — выводится на экран. Пример файлов входных и выходных данных 12 12 000000000000 011000000000 010111110000 010000001000 010011000100 010101000010 010011011110 010000010000 000000000000 011000000000 011111110000 011111111000 011111111100 011101111110 011111111'110 011111110000
288 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет 010010011000 010101001000 011000110000 000000000000 5 8 011111111000 011101111000 011000110000 000000000000 Задача 14. «Лист бумаги» Имеется прямоугольный лист бумаги, длина которого равна У см, а ширина М см. С листом можно производить следующие операции: сгибать лист пополам, совме- щая противоположные стороны листа; сгибать лист, совмещая одну строну с па- раллельной ей линией сгиба; разгибать лист, при этом оставляя на нем линию сгиба. Написать программу, которая определяет, можно ли свернуть лист так, чтобы получился прямоугольник длиной Р см и шириной Q см. В случае утвердительно- го ответа программа должна выдавать минимальное количество операций с лис- том, необходимых для этого. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 5 секунд. Формат входных данных В первой строке входного файла содержатся вещественные числа ЛГ, А/, Ри Qb ви- де десятичных дробей. Формат выходных данных Если лист можно свернуть, то первая строка текста должна содержать слово YES и минимальное число операций, необходимых для этого. В противном случае пер- вая строка текста должна содержать слово No. Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 1 2 1 0.75 YES 4 Задача 15. «Система счисления» Множество символов Z-ричной системы счисления (2 < 1< 36) образуют символы О,..., 9, А, В,..., Z. Если I < 36, то соответствующее количество последних букв ла- тинского алфавита в качестве цифр не используются. Если 1< 10, то не использу- ются соответствующие цифры. Необходимо написать программу, которая по двум текстовым строкам, означающим одно и то же число в Z-ричной и J-ричной систе- ме счисления, определяет минимальные значения Z и J. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 10 секунд.
Задачи для самостоятельного решения 289 Формат входных данных Во входном файле хранятся две строки символов, означающих первое и второе числа. Длина строки — не более 40 символов. Формат выходных данных В выходном файле в текстовом виде должны содержаться пары чисел I и J или слово No, если заданные числа не равны ни в каких из указанных (2 < I < 36 и 2 <J < 36) системах счисления. Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 10 2 3 2 Задача 16. «Электрическая цепь» В электрическую цепь включено N устройств. Устройство с номером I реагирует на поступающие в сеть сигналы определенной частоты (частота — неотрицатель- ное вещественное число), причем само тоже генерирует сигналы и посылает их в цепь. Для каждого устройства задан диапазон частот сигналов (Л(7), В(Г)) (А(Г) и В(Т) — неотрицательные вещественные числа, причем А(Г) < В(1)), на которые это устройство реагирует (исключая эти числа) и посылает в цепь сигнал с частотой, равной С(Г)*Х + D(I) (С(Г) и D(I) — вещественные числа), где X — частота посту- пившего сигнала. Диапазоны различных устройств могут пересекаться, в этом слу- чае все генерируемые сигналы распространяются одновременно. Работа цепи за- канчивается, если ни один из распространяемых по ней сигналов не попадает в диапазон ни одного устройства. Напишите программу, определяющую по описанию всех устройств сети мно- жество всех сигналов X, при подаче которых работа цепи никогда не закон- чится. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд. Формат входных данных В первой строке входного файла содержится число устройств Х(1 < N< 20). В по- следующих строках файла указываются четверки вещественных чисел Л(7), В(Г), С(1), D(I) в виде десятичных дробей. Каждая четверка занимает отдельную строку файла. Формат выходных данных В выходном файле указываются пары вещественных чисел — начала и концы диа- пазойов частот сигналов, при подаче которых цепь никогда не закончит свою работу. Если таких сигналов нет, то файл должен содержать слово No.
290 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 2 О 5 2 10 05 10 15 1 -10 10 15 Задача 17. «Точки» Имеется ЛГ точек и известны расстояния между некоторыми из них. Нужно напи- сать программу, которая проверяет, можно ли эти точки расположить на плоско- сти так, чтобы указанные расстояния между ними сохранились. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд. Формат входных данных В файле исходных данных записано количество точек N (1 < ЛГ< 100) и расстояния между некоторыми из них в виде: номер первой точки, номер второй точки, расстоя- ние. Расстояние — вещественное неотрицательное число, не превосходящее 1000. Номер точки — целое число из отрезка Все числа разделяются пробелами и/или символами перевода строки. Формат выходных данных Ответом должно быть слово Yes или No (Yes — точки можно расположить, No — точ- ки нельзя расположить). Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT 3 No 1 2 10 2 3 20 3 1 100 Задача 18. «Выражение» Заданы два математических выражения, содержащие целые числа, знаки сложе- ния, вычитания и умножения, круглые скобки и переменные, длина которых не более одного символа. Нужно написать программу, которая по заданным выраже- ниям определяет, равны ли они тождественно при всех значениях переменных. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение времени: 20 секунд. Формат входных данных В файле исходных данных записаны в отдельных строках два выражения.
Задачи с комментариями и решениями 291 Формат выходных данных Ответом должно быть слово Yes или No (Yes — выражения тождественно равны, No — выражения тождественно не равны). Пример файлов входных и выходных данных INPUT.TXT OUTPUT.TXT a+b*(c+d) Yes b*d+a+b*c Задачи с комментариями и решениями Задача 1. «Монеты» Задача была предложена на Красноярской краевой олимпиаде школьников, а так- же на Воронежской городской студенческой олимпиаде 2000 года. Одним из при- зеров олимпиады был студент 3-го курса факультета прикладной математики и ме- ханики Максим Сергеевич Ефремов. Ниже приводится его вариант решения задачи. Условие задачи В сундуке у мистера Z имеется У монет. На следующий год мистер Z взял из сун- дука М монет. В каждый следующий год мистер Z добавлял в сундук столько мо- нет, сколько у него было два года назад. Известно, что наХ-й год в сундуке мистера Z было Y монет. Требуется определить, сколько монет было в сундуке изначально и сколько монет мистер Z взял на второй год. Формат входных данных Файл Input.txt содержит числа X и У. Формат выходных данных Файл Output.txt содержит числа У и М. Алгоритм решения Алгоритм решения — чисто математический. Рассмотрим последовательность чисел: А(1),А(2), ...,А(и),... Здесь A(k) — число монет в сундуке на k-и год. Из условия задачи получаем: А(1)=У, А(2)=Х-М, А(3) = 2N - М, А(4) = 3N - 2М, А(5) = 5N - ЗМ, А(6) = 8N - 5М, А(Х) = F(X)N - F(X - 1)М - У. Здесь F(n) — последовательность чисел Фибоначчи, которые определяются рекуррентными соотношениями:
292 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет F(l) = l F(2) = 1 F(K) = F(K- 1) + F(X-2),X>2 Вполне очевидно, что для нахождения Ми Nдостаточно найти целочисленное решение уравнения: F(X)N - F(X-1)M « Y Такое уравнение, вообще говоря, имеет счетное множество решений. Однако в данном случае это множество конечно, поскольку А(п) > 0 для всех п. Следова- тельно: Л(Х)>Л(Х-2)дляК>2. Таким образом: M<N<Y Программная реализация Программная реализация сводится к нахождению целочисленного решения урав- нения F(X)N - F(X-V)M - Y при условии М< N< Y. Программа находит все воз- можные варианты ответа или выдает сообщение о том, что решения нет. Program MoneY; Var F;Text; X.Y;Integer; Procedure Init; {ввод из файла} Begin As s1gn(F.’Input.txt');ReSet(F); ReadLn(F.X.Y); Close(F) End; Function GetValueCK;Integer);Integer; {получение F(k)} Var I.A.B.C;Integer; Begin If K<=2 Then GetValue;=l Else Begin A;=1;B;=1; For I:=3 To К Do Begin C:=B; B:=B+A; A:=C End; GetValue:=B End End; Procedure Run;{решение уравнения} Var M.N;Integer; A,В;Integer; T:Boolean: {флаг разрешимости уравнения; true - если решение есть} Begin Assign(F.'Output.txt');ReWrite(F); A:=GetValue(X); B:=GetValue(X-l);
Задачи с комментариями и решениями 293 T:=False; For N;=l То Y Do For М:ь0 To N Do If A*N-B*M=Y Then Begin T:=True; WriteLn(F.N,' \M) End; If Not T Then WriteLn(F.'Задача не имеет решения!'); Close(F) End; Begin Init; Run End. Задача 2. «Функция» Задача была предложена на Московской олимпиаде школьников в 1991 году и на Олимпиаде первокурсников факультета ПММ в 1998 году. Ниже приводится про- грамма, разработанная студентом 4-го курса факультета ПММ ВГУ Олегом Вик- торовичем Гладышевым. Условие задачи Функция F(n) для целых неотрицательных п определена так: F(0) = О, F(l) = 1, F(2ri) = F(rc), F(2n + 1) = F(n) + F(w+1) Для данного N нужно найти и напечатать F(ri). Обязательное условие: N столь велико, что недопустимо заводить массив из У чисел. Алгоритм решения Основная идея алгоритма заключается в том, что при разложении F(2n + 1) на F(n) и F(n + 1) мы должны вычислить 2 значения функции. Либо п, либо п + 1 окажется нечетным, и для его вычисления понадобится опять вычислять 2 значения функ- ции, а для четного аргумента еще одно. На первый взгляд кажется, что теперь нам надо вычислить значения F для 3 аргументов, но на самом деле 2 из аргументов всегда совпадут! То есть количество вычислений функции на каждом шаге не уве- личивается. Пример: F(26) = F(13) = F(6) + F(7) - F(3) + F(3) + F(4) = 2F(3) + F(4) = « 2(F(1) + F(2)) + F(2) = 2F(1) + 3F(2) = 5F(1) = 5 Программная реализация Program func; {Автор - Гладышев 0. В.} var с. {Текущий четный аргумент} пс. {Текущий нечетный аргумент} кс, {Коэффициент при четном аргументе} кпс, {Коэффициент при нечетном аргументе} n;LongInt; {В переменной с всегда должен быть четный аргумент, а в пс - нечетный. Эта процедура меняет местами значения переменных с и пс. если это необходимо} Procedure Correct;
294 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет var Temp:LongInt; Begin if odd(c) then Begin Temp;=c; c:=nc; nc:=Temp; Temp;=kc; kc:=knc; knc:=Temp; End; End; Begin WriteC'Введите число '); ReadLn(N); n:=abs(n); {Вычислим модуль n} if n=0 then WritelnC’0’) else Begin while n mod 2 = 0 do n;=n div 2; {уменьшаем n до нече'тного числа} c:=n div 2; {Разложим n на четное} nc;=n-c; {и нечетное числа} if с=0 then kc;e0 else kc;el; knc;=l; while (c>2) or (nc>2) do Begin Correct; {поменяем с и nc, если нужно} c;=c div 2; {получим новый аргумент} kc;=kc+knc; {получим коэфф, при нем} пс;=пс-с; {вычислим второй аргумент} End; WriteLn(Kc+knc); {Выведем результат} ReadLn;{Подождем} End; End. Задача 3. «Лабиринт» Задача была предложена на общеуниверситетской олимпиаде по программирова- нию, посвященной дню рождения факультета ПММ (март 2001 года). Ниже при- ведено решение победителя олимпиады, студента 4-го курса факультета ПММ ВГУ Антона Александровича Клинских. Условие задачи В результате рейда налоговой полиции города Обломова в фирму «Real» в одном из небоскребов был обнаружен секретный уровень, на который вела только одна лестница, а в некоторых местах были аварийные выходы (в виде люков в полу). Согласно агентурным данным уровень представляет собой прямоугольник из М х N комнат одинакового размера (М комнат вдоль западной стены, — вдоль север- ной), причем между некоторыми парами соседних комнат есть двери. Положение осложняется тем, что точные координаты входа и выходов неизвестны. На разведку были отправлены обезьянки из местного зоопарка. Каждая из них поднималась по лестнице и ходила по уровню, пока не натыкалась на какой-ни- будь выход. После этого она спускалась по нему и сообщала свой маршрут началь-
Задачи с комментариями и решениями 295 ству. При этом первая обезьянка в начальной точке смотрела на север, а осталь- ные — неизвестно куда. Маршрут каждой обезьянки представлен в виде последо- вательности символов, представляющих движения и повороты: * F— шаг вперед; w R — поворот направо; $ L — поворот налево; & В — разворот; я W — впереди стена, движения не было; & Е — выход, конец маршрута (мржет идти только непосредственно после F). Задача состоит в том, чтобы построить план обследованной части уровня, со- держащий всю собранную информацию: стенки, проходы, выходы. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Время тестирования: 20 с/тест. Входные данные В первой строке входного потока задаются числа М и У, разделенные пробелами. На следующей строке задается общее количество маршрутов. Далее идут мар- шруты, представляющие собой последовательность символов F, R, L, В, W, Е, воз- можно разделенных символами пробела. Каждый маршрут заканчивается симво- лом Е, после которого начинается следующий маршрут. Ограничения Входные данные удовлетворяют следующим ограничениям: 1 < М < 50,1 < ЛГ< 50, общее количество маршрутов — не более 100, общее количество символов в запи- си маршрутов — не более 255. Результат Программа должна напечатать карту уровня размером (2М + 1) х (2^+ 1), нарисо- ванную символами: « пустая комната или проход обозначаются пробелом; $ угол комнаты — знак +; « северная/южная стенка — знак -; * западная/восточная стенка — знак |; & вход — знак *; » выход — знак #; я неизвестное состояние комнаты или стенки — знак ?. Если существует несколько планов уровней, удовлетворяющих условиям зада- чи, достаточно напечатать любой, если план построить не удается, программа долж- на напечатать строку N0.
296 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет Алгоритм решения Для построения плана необходимо соотнести донесения всех обезьянок так, что- бы они не противоречили друг другу. Используется бэк-трэкинг, расшифровываю- щий маршрут очередной обезьянки, и, если это приводит к конфликту, последний маршрут отменяется и производится попытка согласовать маршрут этой обезьян- ки, предположив, что в начальный момент она смотрела в другую сторону, и т. д. Если все четыре начальных направления обезьянки приводят к конфликтам, счи- тается, что план для этой обезьянки построить не удается, что вызовет изменение начального направления предыдущей обезьянки, и так далее до первой. Откат реа- лизуется путем рекурсии, а состояния плана хранятся в стеке. Если при ка^ой-либо комбинации начальных состояний всех обезьянок план построен, он и является ответом. Если такой комбинации нет, плана не существует. Программная реализация Program Labirint; {Автор - Клинских А. А.} const MaxN=50; МахМ=50; type TPolnt=record x.y:integer end; PPlan=ATPlan; TPlan=array[-2*MaxN..2*MaxN,-2*MaxM..2*MaxM] of char; {План} TStack=ATElem; TE1em=record Plan;TPlan; L,R.T.B:1nteger; Next;TStack end; var Stack;TStack; {Стек} Input,Output:Text; {Файлы ввода-вывода} M.N:integer; {Размеры поля} NOfM:integer; {Число маршрутов} L,R,T,В:integer; {Текущие границы поля} Cur.Next.Dir:TPoint; {Текущая и следующая точки и направление, куда смотрит обезьяна} Р1ап:ТР1ап; {План} Monkeys:аггау[1..10] of string; {Маршруты} Тл лллядлкХХкХХлллXХХХлХлХХдX I {Процедуры работы со стеком} {Инициализация стека} procedure InitStack; begin Stack;=nil end; {Добавление в стек} procedure PushStack(var Pl an:TP1anJ.B.L.R:integer); var p:TStack; begin p:=Stack; new(Stack);
Задачи с комментариями и решениями 297 Stack*.Plan;=Plan; Stack*.Т:=Т; Stack*.L;=L; Stack*.R;=R; Stack*.B;=B; Stack*.next:=p end; {Извлечение из стека} procedure Popstack(var Plan;TPlan;var T.B.L.R;Integer); var p:TStack; begin p;=Stack; Stack;=Stack*.next; T;=p*.T; L:=p*.L; R;=p*.R; B;=p*.B; Plan:=p*.Plan; dispose(p) end; {Проверка стека на пустоту} Function Empty;boolean; begin Empty:'Stack=nil end; лТлдлдлХллХХХлкЖкХХХХХдХХХХлХХккI {Процедура чтения} procedure InitlO; var 1;1nteger; begin assignCinput,’input.txt’); ass1gn(output,’output.txt’); reset(input); rewrite(output); readd nput.M); readln(input.N); readln(input.NOfM); For i:=l to NofM do readln(1nput,Monkeys[1]) end; { - » I - « 11 i t I — 1.1-1-11 -I I i-_ t-_l--l .it—1_ I — l.l__l i__l^l l l l t l--l.ll l.i l-1 \ XXXXkXXXдлХХХХХХХлХХХХХХХХХддХХкХХХХкХХхХI /----------------Алгоритм---------.---------} Функция, "пытающаяся” расшифровать очередной маршрут} Если удалось Построить план,возвращает true} Function GetNextMonkey(norndnteger);boolean; var index;byte; c:char; begin GetNextMonkey;=False; index;=l; {Номер очередного символа в маршруте} repeat с:'Monkeys[nom][1ndex]; case c of ’F’.begin {Если был шаг вперед} if (Plan[Next.x.Next.y] in [‘ ’,’?’]) then {Если впереди стенка,}
298 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет begin {шагать туда нельзя} Cur:=Next; Next.x:=Cur.x+D1r.x; Next.у:“Cur.y+D1r.y; Plan[cur.x.cur.y]: = ' ': if Monkeys[nom][1ndex+1’E’ then {Обезьянка здесь вышла} begin i GetNextMonkey:=Plan[Next.x,Next.y] in ['?'.'#']; {если это невозможно} if [Plan[Next.x.Next.y]]*[’?’,'#']“[] then exit; {запоминаем ошибку} Plan[Next.x.Next.y]:“'#' {иначе устанавливаем выход} end; if Plan[Next.x,Next.y] in ['?’] then Plan[Next.x,Next.y]:=' ’; Cur:“Next; Next.x:“Cur.x+Di r. x; Next.у:=Cur.y+Di г.у; if cur.y>“T then T:“cur.y+1; {Изменяем местоположение обезьянки} if cur.y<=B then B:ecur.y-1: {и габариты плана(если нужно)} if cur.x>=R then R:“cur.x+1: if cur.x<=L then L:ecur.x-1; if ((T-B+1)>2*M+1) or ((R-L+l)>2*N+1) then exit; {План слишком большой} if РТапЕсиг.х.сиг.у]’'#' then begin {Пришли на выход:проверим сообщение обезьянки} GetNextMonkey:=FMonkeys[nom][index+l]“'E’; {и выйдем} exit end end else exit end; ’L':begin {Повернем обезьянку налево} if dir.x=0 then begin dir.x:“-dir.y; dir.y:e0 end el se begin dir.y:“dir.x; dir.x:“0 end; Next.x:*Cur.x+Di г.x; Next.y:=Cur.y+Di г.у end; 'R’:begin {Повернем обезьянку направо} if dir.x-0 then begin dir.x:“dir.y; dir.y:=0 end else begin dir.y:“-dir.x; dir.x:“0 end; Next.x:“Cur.x+Di r.x; Next.y:-Cur.y+Di г.у end; 'B^begin {Развернем обезьянку} dir.x:e-dir.x; dir.y:“-dir.y;
Задачи с комментариями и решениями 299 Next.х:=Cur.x+Di г. х; Next.у:=Cur.y+Di г.у end; 'W: begin {Впереди стенка} if Pl an[Next.х.Next.у] in |then begin if dir.x=0 then Plan[Next.x.Next.y]:=’-' {вертикальная или горизонтальная} else Plan[Next.x.Next.y]:='Г: if Next.y>T then T:=Next.y; if Next.y<B then B:=Next.y; if Next.x>R then R:=Next.x; {Изменяем габариты плана(если нужно)} jf Next.x<L then L:=Next.x end el se exit end end; inc(index) until c='E': GetNextMonkey;=True {Если не было аварийных выходов.все в порядке} end; {Функция, находящая план по всем маршрутам начиная с рог.} {Рекурсивно вызывает саму себя, пока не использует все маршруты} {Если удалось построить план.возвращает true} Function GetMonkeys(рог;i nteger);boolean; var tO.b0.10.r0:integer; D;TPoint; p;PPlan; OK:boolean; Count:integer; begin if por>NOfM then begin {Все маршруты согласованы} GetMonkeys:=True; {Запоминаем.что план построен} new(p); while not Empty do {Очищаем стек} PopStack(px.TO.BO.LO.RO); exit end; Count;=1; d.x:=0; d.y:=l; repeat Dir:=D; Cur.x:=0; Cur.y:=0: Next.x:=Cur.x+Dir.x: Next.y:=Cur.y+Dir.y; PushStack(Plan.T.B.L.R): {Сохраняем настройки} OK:=GetNextMonkey(por) and GetMonkeys(por+1); {Добавляем маршрут} if OK then break: {Если OK. выходим} PopStack(Plan.T.B.L.R); {иначе восстановим настройки} if d.x=0 then {и повернем обезьянку} begin d.x:=d.y; d.y:=0 end el se begin d.y;=-d.x;d.x:=0 end;
300 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет inc(Count) until (Count=5) or OK; GetMonkeys;=0K end; it********************************** {Инициализация поля} procedure Clear; var i. j; i nteger; begin For i;=-MaxN to MaxN do For j;=-MaxM to MaxM do if oddCabsCi)) and oddCabsCj)) then Plan[i,else Plan[i.; PlanEO.O]:»’*' end; {Вывод плана} procedure ShowPTan; var i .j integer;' begin For i:=T downto T-2*M do begin For j;=L to L+2*N do begin if (i=T) or (i=T-2*M) then if odd(j-L) then writeCoutput. el se writeCoutput,’+’) el se if (j=L) or (j=L+2*N) then if odd(T-i) then writeCoutput.'|') el se writeCoutput.'+’) el se writeCoutput.Plan[j.1]); end; writeln(output); end end; {Вывод,сообщения об ошибке} procedure ShowError; begin writelnCoutput.’NO’) end; {Закрываем использованные файлы} procedure CloselO; begin close(input);close(output) end; begin {Основная программа} InitIO; Clear; if GetMonkeys(l) then ShowPlan el se
Задачи с комментариями и решениями 301 ShowError: CloselO end. Задача 4. «Прямоугольники» Задача предлагалась в 1998 году на олимпиаде первокурсников факультета ПММ ВГУ. Автор решения — одна из призеров олимпиады, Лусине Азатовна Мхитарян, в настоящее время студентка 5-го курса факультета ПММ. Условие задачи На плоскости задано У прямоугольников с координатами вершин (XU, YU), (X2i, Y2i), (X3i, Y3i), (X4i, У40, i - 1,2, 3, ...tN. Известно, что все стороны прямоуголь- ников параллельны осям координат. Все прямоугольники являются замкнутыми множествами, то есть содержат свою границу. Будем считать, что прямоугольники пересекаются, если они имеют хотя бы одну общую точку (в том числе и на границе). Необходимо определить количество фигур, образованных в результате нало- жения прямоугольников. Входные данные В первой строке (1 < N < 100) — число прямоугольников. В каждой последующей — их координаты, заданные целыми числами: -1000<Х17. Г17 ,Х21 ,Y2i ,X3i ,Y3i Mi. Г47<1000) 7=1. 2. 3.N. Выходные данные Число фигур. Алгоритм решения Задача решается с использованием элементов теории графов. Строится матрица инцидентности М, где M[I,J] - 1, если /-й прямоугольник пересекается с J-м. Остается лишь определить число компонентов связности по- лученного графа. Программная реализация Program Rectangular: {Автор - Мхитарян Л. А.) Const MaxN=100: Type TRec=Record XA.YA.XB.YB:Integer End: Var PA:Array [l..MaxN] of TRec: M:Array[l..MaxN.1..MaxN] of Boolean: N.FC:Integer: BA:Array[1..MaxN] of Boolean: Function Min(A.В:Integer):Integer: Begin If A>B Then Min:=B Else Min:=A End: Functi on Max(A.В:Integer):Integer: Begin
302 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет If А<В Then Мах—В Else Мах—А End; Procedure Init; Var F:Text;I,X1,Y1,X2,Y2,X3,Y3,X4.Y4:integer; Begin AssignCF,’input.txt’);ReSet(F); ReadLn(F.N); For I—1 to N do Begin ReadLn(F,Xl,Yl,X2,Y2,X3,Y3,X4,Y4); PA[I].XA—Min(Min(Xl,X2) ,Min(X3.X4)); PA[I].YA—Min(Min(Yl,Y2) ,Min(Y3,Y4)); PA[I] .XB—Max(Max(Xl,X2) ,Max(X3,X4)); PA[I].YB—Max(Max(Yl,Y2) ,Max(Y3,Y4)); End; For I—1 to N do For Xl—1 to N do M[I ,X1J—False; For I—1 to N do BA[IJ—False; Close(F) End; Function Check (I, J; Integer) -.Boolean; {Проверка: пересекаются ли I-й и J-й прямоугольники} Var Rl,R2:TRec; Begin Check—False; If PA[I].XA<PA[J].XA Then Begin R1 -PA[I];R2-PA[J] End Else Begin R1-PA[J];R2-PA[I] End; If R1.XB>=R2.XA Then Begin If (Rl.YB>=R2.YA) and (R1.YB<=R2.YB) Then Check-True; If (R2.YB>=R1.YA) and (R2.YB<=R1.YB) Then Check-True End Else End; Function GetPodGraph:Boolean; {Выделение компонента связности графа} Var U.К,Т:Integer; Begin Т—-1; For I—1 to N do If not BA[I] Then Begin T—I;Break End; If T=-l Then Begin GetPodgraph—False; Exit End; . M[T.T]—True; For I—1 to N do For J—1 to N do For К—1 to n Do If M[J.J] Then If M[J.K] Then M[K,K]:-True: For I—1 to N do If not BA[I] and MCI.I] Then BA[I]-True; GetPodGraph—True End; Procedure Run; {Вычисление количества подграфов} Var I.J:Integer; Begin FC—0;
Задачи с комментариями и решениями 303 For I:=l to N do For J:=l to N do If I<>J Then M[I,J]:=Check(I,J); While GetPodgraph do Begin Inc(FC); For I:=l to N do If M[I.I] then M[I.I]-False; End; End; Procedure Done; {Вывод результатов} Var F;Text; Begin Assign(F,’output.txt');ReWrite(F); WriteLn(F.FC); Close(F); End; Begin Ini t; Run; Done End. Задача 5. «Трубопровод» В основу условия положена задача, которая предлагалась на четвертьфинале ми- рового первенства по программированию 2000 года (г. Саратов). Автор програм- мы — член сборной ВГУ по программированию, в настоящее время студент 5-го курса факультета ПММ ВГУ Андрей Евгеньевич Поляков. Условие задачи Пусть имеется трубопровод, заданный прямой линией на плоскости Ах + By + С = О, и два города с координатами (XI, Yl), (Х2, Y2). Необходимо соединить эти два города трубопроводом, истратив при этом наименьшее число труб; указать суммарную длину использованных труб и две точки, где происходит соединение трубопроводов. Входные данные Целые числа -100 000 < А,В,С < 100 000 — параметры трубопровода. Целые числа -100 000 < XI, У1 < 100 000 — координаты первого города. Целые числа -100 000 < Х2,У2 <• 100 000 — координаты второго города. Выходные данные В первой строке указывается суммарная длина использованных труб. Во второй и третьей соответственно — координаты точек соединения трубопро- водов. Алгоритм решения Рассмотрим две возможности. « Точки лежат с разных сторон от прямой. Тогда для их соединения достаточно опустить на прямую перпендикуляры из этих точек. На выходе получим сумму длин этих перпендикуляров и их точки пересечения с прямой.
304 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет & Точки лежат по одну сторону от прямой. Здесь возможны три случая. □ Одна точка соединяется с другой, из которой затем опускается перпендику- ляр на прямую. На выходе: длина перпендикуляра плюс расстояние между точками, координаты точки пересечения перпендикуляра и прямой, коор- динаты самой ближней к прямой точки. □ Существует третья точка, для которой выполняется условие: перпендику- ляр из этой точки к прямой и отрезки, соединяющие эту точку с двумя за- данными, образуют угол 120 градусов. На выходе — длина перпендикуля- ра + сумма расстояний, координаты третьей точки и ее проекции на прямую. □ Для соединения точек достаточно Спустить из них перпендикуляры на пря- мую. Программная реализация Program Tubes; {Автор - Поляков А. Е.} Var XI.Yl.Х2.Y2.А,В.С;Longlnt; Procedure Init; {Инициализация} Var F;Text; Begin Assign(F.’input.txt');ReSet(F); ReadLn(F.A.B.C); ReadLn(F.Xl.Yl); ReadLn(F.X2.Y2); Close(F) End; Function TestLocation;Boolean; {Проверка местонахождения заданных точек. Возвращает True, если точки расположены с одной стороны, и False - в противном случае } Begin TestLocation;=(A*Xl+B*Yl+C)*(A*X2+B*Y2+C)>0 End; Function Dest(X.Y:Double):Double; {Вычисление длины вектора} Begin Dest:=Sqrt(Sqr(X.)+Sqr(Y)) End; Procedure Proj(X,Y:Double;Var TX.TY:Double); {Вычисление проекции точки (X.Y) на прямую} Begin TX:=(-C*A+Sqr(B)*X-A*B*Y)/(Sqr(A)+Sqr(B)); TY;=(-C*B-A*B*X+Sqr(A)*Y)/(Sqr(A)+Sqr(B)); End; Function FindDifferentSideDest(Var txl.Ту1.Tx2.ty2;Double);Double; {Решение задачи для случая 1} Var D;Double; Begin Proj(Xl.Yl.Txl.Tyl); D:=Dest(TXl-Xl.TY1-Y1); Proj(X2.Y2.Tx2.Ty2); Fi ndDi fferentSi deDest:=D+Dest(TX2-X2.TY2-Y2) End; Procedure FindPoint(PX.PY.X.Y.D:Double;Var TX,TY:Double);
Задачи с комментариями и решениями 305 {Нахождение координат точки на прямой, из которой точка (х.у) видна под углом 30 градусов Var TX1.TX2.TY1.Ty2.Sq;Double; Begin Sq:=sqrt(3)*D/Sqrt(Sqr(A)+Sqr(B)); TXl;=PX+B*sq;TYl:=PY-A*Sq; TX2:=PX-B*Sq;TY2:=PY+A*Sq; PX:-Dest(TXl-X.Tyl-Y); PY:=Dest(TX2-X.Ty2-Y); If Px<Py Then Begin Tx:=Txl;Ty:=Tyl End Else Begin Tx:=Tx2;Ty:=Ty2 End End; Function FindOneSideDest(Var txl.Tyl.Tx2.ty2;Double):Double; {Решение задачи для случая 2 Var DI.D2.РХ1.PY1.Px2.Py2.LX1.LY1.LX2.LY2. T.Res:Doubl e; Begin Proj(Xl.Yl.PXl.PYl); Dl;=Dest(PXl-Xl,PYl-Yl); F1ndPoint(PXl.PYl.X2.Y2.Dl.Lxl.Lyl); Proj(X2,Y2.PX2.PY2); D2;»Dest(PX2-X2.PY2-Y2): FindPoint(PX2,PY2.Xl,Yl.D2,Lx2.Ly2); {Случай 2 в} Res;=Dl+D2: Txl;=Pxl;Ту1;=Pyl;Tx2:=Px2;Ty2:=Py2; {Случай 2 a} T:=Dest(X2-Xl.Y2-Y1); If (D2>T) or (D1>T) Then If D1>D2 Then Begin Txl;=x2;tyl;«Y2;Tx2:=Px2;Ty2;=Py2;Res;=D2+T End Else Begin Txl;»xl;tyl:=Yl;Tx2:=Pxl;Ty2:=Pyl;Res:=Dl+T End; Случай 2 6} T;=Dest(LXl-LX2.LYl-LY2)/2; T;=T/sqrt(3):PXl;»Dest(Lxl-Xl.Lyl-Yl);PYl;«Dest(Lx2-X2.Ly2-Y2); If (2*T < PX1) and (2*T < PY1) and (Dest(Lx2-Xl.Ly2-Yl)<PYl) and (Dest(Lxl-X2.Lyl-Y2)<PXl) then Begin Pxl;=(Lxl+Lx2)/2;Pyl:=(Lyl+Ly2)/2; Px2;»Pxl-T*A/Sqrt(Sqr(A)+Sqr(B));Pxl;-Pxl+T*A/Sqrt(Sqr(A)+Sqr(B)); PY2;=Pyl-T*B/Sqrt(Sqr(A)+Sqr(B));PYl;=Pyl+T*B/Sqrt(Sqr(A)+Sqr(B)); T;»2*(D1+D2)-3*T; If Res>T Then Begin Res;=T; If (A*PXl+B*PYl+C)*(A*X2+B*Y2+C)>0 Then Begin Tx2;=Pxl;Ty2;=Pyl End Else Begin Tx2;=Px2;Ty2:=Py2 End; Txl;=(Lxl+Lx2)/2;Tyl;=(Lyl+Ly2)/2 End End; F i ndOneSi deDest:=Res End; Procedure Done; {Вывод результатов} Var F;Text;Txl.Tyl.tx2.ty2.D;Double; Begin AssignCF.’output.txt’);ReWrite(F); If not TestLocation Then D;=F1ndD1fferentSideDest(Txl.Tyl.Tx2.Ty2) Else D:eFindOneSideDest(Txl.Туl.Tx2.Ty2); WriteLn(F.D:l:4); 11 Зак. 906
306 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет Wr1teLn(F,Txl:l:4,’ ’,Ту1:1:4): WriteLn(F,Tx2:l:4,' ',Ту2:1:4); Close(F) End: Begin Init; Done End. Задача 6. «Телебашня» Задача была предложена на общеуниверситетской олимпиаде по программирова- нию, посвященной дню рождения факультета ПММ (март 2001). Ниже приводится решение победителя олимпиады, студента 4-го курса факультета ПММ ВГУ Ми- хаила Михайловича Ширяева. Условие задачи В результате пожара полностью сгорела телевизионная башня города Обломова, и все население города осталось без телевидения. Чтобы восстановить телевеща- ние в кратчайшие сроки, мэр города распорядился разместить передатчики на кры- шах некоторых домов. Однако ситуация осложняется наличием в городе нескольких небоскребов, владельцы которых установили у себя на крыше антенну спутнико- вой системы See++ и поэтому не дают согласия на установку там передатчиков. Более того, эти небоскребы являются преградой на пути распространения сигна- ла, поэтому установки одного передатчика может оказаться недостаточно. Мэр хочет установить минимальное количество передатчиков так, чтобы зоны распро- странения сигнала покрывали весь город, исключая, возможно, территорию, зани- маемую упомянутыми выше небоскребами. Город Обломов представляет собой прямоугольник кварталов. Все кварта- лы имеют форму квадрата равной площади, а ширина улиц незначительна по срав- нению с размерами квартала. Каждый небоскреб занимает полностью один квар- тал. Каждый квартал (кроме небоскребов) имеет единственную телевизионную ан- тенну точно в центре и считается охваченным телевещанием, если существует ка- кой-нибудь передатчик, который находится в прямой видимости от антенны. Пере- датчики могут располагаться только точно в центре квартала. Сигнал распространяется строго по прямой. Если на пути от передатчика к ан- тенне сигнал лишь касается небоскреба, сигнал доходит до антенны. Других не- боскребов в городе нет. Квартал, в котором установлен передатчик, считается охва- ченным телевещанием. Программа должна найти минимальное количество необходимых передатчи- ков и указать места их размещения. Технические требования Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Время тестирования: 20 с/тест.
Задачи с комментариями и решениями 307 Входные данные Первыми задаются два числа от 1 до 14, которые определяют количество кварта- лов в городе с запада на восток по оси х и с юга на север по оси у соответственно. Далее идет число от 1 до 195, задающее количество кварталов, занятых небоскре- бами, после чего перечисляются пары х, у координат кварталов. Координаты квар- талов отсчитываются от 1. Все числа во входных данных разделяются произвольным количеством про- бельных символов. В городе существует хотя бы один квартал (дом мэра), не являю- щийся небоскребом. Результат Программа должна напечатать минимально необходимое число передатчиков, по- сле чего перечислить координаты кварталов, в которых они должны быть установ- лены. Алгоритм решения Алгоритм основан на рекурсии. На каждом ее шаге на карту ставится антенна и вы- числяются кварталы, охваченные вещанием. Если до всех кварталов доходит сиг- нал, то расположение антенн запомцнается, при условии, что до этого не найдено расположение с меньшим числом антенн. Для хранения информации о расположении антенн, небоскребов и кварталов, охваченных вещанием, используются множества. Кроме того, информация о рас- положении небоскребов дублируется в массиве, что позволяет ускорить работу программы. Программная реализация program Town; {Автор - Ширяев М. М.} const Nmax=14; {макс, число кварталов по горизонтали<=16} Мтах=14; {по вертикали<=16} Lmax=Nmax*Mmax; {макс, число кварталов} type TNum=l..Lmax; {тип индексов кварталов} TSet=set of TNum; {тип множества кварталов} TRec=record {координаты квартала} х.у:integer end; TArr=array[TNum]of TRec; var neb. {множество небоскребов} ant;TSet; {множество антенн} arr_neb;TArr; {массив небоскребов} n.m, {число кварталов по горизонтали и вертикали} neb_num, {число небоскребов} ant_num:integer; {число антенн} function Getlndex(x,y:integer):integer;{индекс квартала} begin GetIndex:=(y-l)*Nmax + x end;
308 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет procedure GetCoordCa:integer;var x.у integer): {поиск координат квартала} begin х:=(а-1) mod Nmax + 1; y:=(a-l) div Nmax + 1 end; procedure Load;{загрузка карты} var f;text; 1:integer; begin neb:=[]: Assign(f.'input.txt’):Reset(f); read(f.n.m.nebjnum); for i;=l to neb_num do with arr_neb[i] do begin read(f,x,y); neb;=neb+[GetIndex(x. у)] end: Close(f) end; procedure Save:{запись числа и расположения антенн} var f:text; i.x.y:integer; begin Assign(f.’output.txt');Rewrite(f); write!n(f,’Число антенн:'); write!n(f,ant_num); writeln(f.’Координаты антенн:'); for i;=l to Lmax do if i in ant then begin GetCoord(i,x,y); writeln(f,x.’ ’ .y) end: Close(f) end; function Wave(al.a2:integer):boolean: {проходит ли волна между кварталами al и а2} const eps=O.01;{допустимое отклонение от угла квартала} half=0.5-eps; var xl.у1,х2,у2.х.у.{координаты кварталов al. а2 и проверяемого небоскреба} i.t:integer: ^коэффициент наклона прямой},р1.р2{точки пересечения с небоскребом}:real; begin Wave:=true: GetCoord(al.xl.yl); GetCoord(a2.x2.y2); if xl=x2 then begin if yl>y2 then begin t:=yl: yl:=y2: y2:=t end; for i:=l to neb_num do with arr_neb[i] do
Задачи с комментариями и решениями 309 if (x=xl)and(yl<=y)and(y<=y2)then begin Wave:=false: Exit end end el se if yl=y2 then begin if xl>x2 then begin t:-xl; xl:=x2; x2:=t end; for i:=l to neb_num do with arr_neb[i] do if (y=yl)and(xl<=x)and(x<=x2)then begin Wave:=false; Exit end end el se begin k:=(y2-yl)/(x2-xl); for i:=l to neb_num do with arr_neb[i] do begin k:=(y2-yl)/(x2-xl); pl:»k*(x-0.5-xl)+yl; {можно задеть угол} if (y-half<pl)and(pl<y+half)then begin Wave:=false; Exit end; p2:=‘k*(x+0.5-xl)+yl; if (y - half<p2) and (p2<y+half) then begin Wave;=false; Exit end; if (abs(y-0.5-pl)<eps)and(abs(y+0.5-p2)<eps)or (abs(y+0.5-pl)<eps)and(abs(y-0.5-p2)<eps) then begin Wave:=false; Exit end;{проходит через углы небоскреба} k:=(x2-xl)/(y2-yl); pl:»k*(y-0.5-yl)+xl; if (x-half<pl)and(pl<x+half)then begin Wave:=false; Exit end: p2:«k*(y+0.5-yl)+xl; if (x-half<p2)and(p2<x+half)then begin Wave:=false; Exit end end end; end; function Cover(var map;TSet:new_a:integer):boolean; {покрыть карту map проходящим сигналом из антенны new_a} var х.у.а:integer; begin Cover:=true; for x:»l to n do for y;=l to m do begin a:»GetIndex(x,y); if not(a in map) and not(a in neb) then if Wave(new_a.a) then map:»map+[a] else Cover:=false end end; procedure Think:{расстановка антенн} var vspomiTSet;{рабочее расположение} num:integer;{рабочее число антенн} procedure Step(map:TSet:new_a:i nteger); {поставить антенну new_a на карту map} var x.y:integer: begin if not Cover(map,new_a) then for x:=l to n do
310 Приложение 2. Задачи по информатике, предлагавшиеся на олимпиадах прошлых лет for у:=1 to m do begin new_a:=GetIndex(x.y): if not(new_a in map)and not(new_a in neb) then begin vspom:=vspom+[new_aj; inc(num): Step(map,new_a): vspom:=vspom-[new_a]; dec(num) end end else if num<ant_num then begin ant_num:=ni|m; ant:=vspom end end: var x.y, a integer: begin ant:=[]: ant_num:=Lmax+l: for x:=l to n do{ciaBHM в качестве 1-й различные антенны} for у:=1 to m do begin a:=GetIndex(x.y): if not(a in neb) then begin vspom:=[a]: num:=l: Step(CJ.a) end end end: begin Load: Think: Save end.
Приложение 3 Интегрированная инструментальная среда Turbo Pascal (Borland International) После того как вы завершили процесс разработки алгоритма и записали его в виде программы на языке Паскаль, необходимо поместить этот текст в файл на магнит- ном диске, перевести на язык машинных команд и загрузить в память ЭВМ для выполнения с тем или иным набором исходных данных. Каждое из перечислен- ных действий реализуется с помощью соответствующей компьютерной програм- мы, относящейся к классу инструментальных, то есть используемых в качестве средств для создания других программ. Размещение текста программы (исходного текста) в файле на магнитном диске осуществляется с помощью программ, называемых текстовыми редакторами. Они позволяют создавать и корректировать текст, отображая его на экране дисплея. Программа в виде исходного текста не может быть непосредственно выполнена компьютером: предварительно она должна быть преобразована в последователь- ность машинных команд. Это преобразование выполняется специальными про- граммами компиляции (компиляторами) и компоновки (компоновщиками, или лин- керами). Фирмой Borland International (США) была разработана система, объединив- шая основные инструментальные средства для разработки программ на собствен- ном диалекте языка Паскаль — языке Turbo Pascal. Эта система получила название интегрированной инструментальной системы Turbo Pascal. Термин «интегриро- ванная» указывает на связь всех входящих в нее компонентов. Войдя в среду Turbo Pascal, вы сможете выполнить все этапы разработки программы начиная от созда- ния исходного текста до ее отладки. В состав системы входят: экранный редактор; & компилятор с языка Паскаль;
312 Приложение 3. Интегрированная инструментальная среда Turbo Pascal & компоновщик; отладчик. Для входа в систему Turbo Pascal необходимо ввести в командной строке ко- манду turbo. При использовании средств оболочки Norton Commander то же самое можно сделать, установив курсор на строку оглавления с именем файла turbo.exe или лю- бого файла с расширением .pas и нажав затем клавишу Enter. В обоих случаях сразу после загрузки системы начинает работать экранный редактор, выводящий на экран терминала окно редактора. При вызове системы по имени файла с расширением .pas в окне размещается содержимое этого файла, а в верхней строке окна — его название. При первом способе входа в систему окно редактора, как правило, бывает пустым, а в строке имени файла указывается NОNА- MEOO.PAS — неименованный (файл). Теперь вы можете либо начать редактировать файл, либо, если имеющийся текст программы вас устраивает, приступить к ее выполнению. Но прежде, чем перейти к описанию соответствующих действий, обратим ваше внимание на еще одно об- стоятельство. В первой строке экрана терминала размещается основное меню сис- темы. Оно представляет собой строку с названиями пунктов меню, каждый из которых позволяет выполнить определенное действие. Для перехода в меню сле- дует нажать клавишу F10. С отдельными пунктами меню мы будем знакомиться по ходу дальнейшего изложения. Пока же отметим, что система Turbo Pascal снаб- жена справочной подсистемой, обращение к которой осуществляется выбором пункта Help основного меню. При этом на экране разворачивается окно с кон- текстной подсказкой, то есть информацией, относящейся к конкретной ситуации, в которой вы обратились за справкой. К сожалению, справочные тексты даны на английском языке, что делает их совершенно бесполезными для некоторых пользо- вателей. Экранный редактор Экранный редактор системы Turbo Pascal выполняет разнообразные команды ре- дактирования, которые условно можно разбить на пять групп: & команды перемещения курсора; & команды поиска фрагментов; команды вставки и удаления; & команды работы с блоками текста; & прочие команды. Язык Паскаль не накладывает жестких требований на формат записи текста программы. Однако для удобства работы с текстом настоятельно рекомендуем вам соблюдать следующие правила. & Использовать систему отступов при записи вложенных операторов или опера- торов, заключенных в операторные скобки begin и end. Такой способ записи на- глядно показывает структуру программы.
Экранный редактор 313 Например: while х<>у do begin if х>у then х := х-у else у := у-х: writeln ( х:5, у:5 ) end Не следует в одной строке записывать несколько операторов, кроме, может быть, простейших. В противном случае вы рискуете сильно усложнить себе жизнь при отладке программы. $ Объектам программы следует давать имена, отражающие их суть. Не избегайте длинных имен, если они помогают лучше понять смысл программы. За редким исключением не следует использовать однобуквенные имена вроде А, В и т. д. ® Используйте комментарии для выделения в тексте логически завершенных фрагментов. Например: { поиск минимального элемента в массиве } (* сортировка таблицы записей *) Теперь рассмотрим комбинации клавиш, предназначенные для выполнения отдельных групп команд. Клавиши перемещения курсора & или —> — перемещение на один символ влево или вправо. ? или чк — перемещение на одну строку вверх или вниз. Ctrl+<--перемещение на одно слово влево. CtrL+—> — перемещение на одно слово вправо. & Ноте — перемещение к началу строки. & End — перемещение к концучСтроки. Ctrl+Home — перемещение в начало первой строки окна редактора. Ctrl+End — перемещение в начало последней заполненной строки окна. зв PgUp — перемещение на одну страницу вверх, то есть сдвиг по тексту на величину экрана минус одна строка. PgDn — то же, но перемещение на страницу вниз. a Ctrl+PgUр — перемещение на начало текста. Ctrl+PgDn — перемещение в конец (на последний символ) текста. Клавиши поиска фрагментов С помощью клавиш этой группы вы имеете возможность производить поиск в тек- сте любого фрагмента. Это бывает полезно, например, при необходимости провести замену во всем тексте одного идентификатора другим. » Ctrl+Q, затем F — открывается окно диалога, в котором нужно задать фрагмент текста. Затем, после нажатия клавиши Enter, производится поиск первого вхож- дения этого фрагмента в текст.
/314 Приложение 3. Интегрированная инструментальная среда Turbo Pascal ® Ctrl+Q, затем А — то же, что и в предыдущей команде, но в окне диалога задаются фрагмент текста поиска и фрагмент текста для замены. Ctrl+L — осуществляется поиск следующего фрагмента, заданного одним из двух предыдущих сочетаний. a Ctrl+Q, затем ] или Ctrl+Q, затем [ — ищется парный к одному из следующих сим- волов: }. Если парный символ найден, то курсор перемещает- ся к нему, в противном случае он остается на месте. Клавиши вставки и удаления информации Сочетания клавиш этой группы позволяют помещать в текст и удалять из него символы, слова и строки. Редактор может работать либо в режиме вставки, либо в режиме замены. В первом случае вновь вводимый символ располагается в месте нахождения курсора, раздвигая уже существующий текст. Во втором случае вво- димый символ заменяет тот, на который указывал курсор. Переключение между режимами вставки и замены осуществляется нажатием клавиши Ins. Ctrl+N — в текст добавляется пустая строка. Ctrl+Y — удаление строки. ж Backspace — удаление символа слева от курсора. в Del — удаление символа над курсором. Ctrl+T — удаление слова (части слова) справа от курсора. Ctrl+Q, затем Y — удаление части строки справа от курсора. Клавиши работы с блоками текста Термином «блок» обозначается особым образом выделенный фрагмент текста. На экране он имеет цвета символов и фона, отличные от остальной части текста. Блок может иметь любую величину, начиная от одного символа и кончая всем тек- стом. Блок можно выделить следующими способами: использованием комбинаций клавиш Shift+<—, Shift+—>, Shift+T, Shift+Ф; & с помощью клавиш Ctrl+K, затем В, помечающей начало блока, и Ctrl+K, затем К, помечающей его конец. Следует иметь в виду, что выделение в тексте нового блока отменяет предыду- щее выделение. При выполнении ряда команд этой группы используется промежуточный бу- фер обмена (Clipboard, иногда называемый «карман»), в который помещаются и из которого выбираются фрагменты текста. Промежуточный буфер удобно исполь- зовать для переноса фрагментов текста из одного файла в другой. Перечислим клавиши этой группы. a Ctrl+Ins — скопировать блок в промежуточный буфер. Shift+Del — перенести блок в промежуточный буфер (при этом блок удаляется из текста). w Shift+Ins — перенести блок из промежуточного буфера и разместить в тексте, начиная с позиции, помеченной курсором.
Отладка и тестирование 315 Ctrl+K, затем С — блок копируется в место расположения курсора в окне редак- тирования. & Ctrl+K, затем V — блок перемещается в место расположения курсора в окне ре- дактирования. & Ctrl+K, затем Y, или Ctrl+Del — удалить блок. $ Ctrl+K, затем Н — снять-восстановить выделение блока на экране. & Ctrl+K, затем I — сдвинуть блок вправо на одну позицию. Ctrl+K, затем U — сдвинуть блок влево на одну позицию. & Ctrl+K, затем Р — напечатать блок на принтере. Прочие клавиши В эту группу включены комбинации клавиш, связанные с чтением и сохранением редактируемого файла, входом в основное меню и выходом из среды. ss F10 — войти в основное меню. ® F3 — загрузить файл для редактирования. Это же действие можно выполнить, выбрав в меню File команду Open. При этом на экране появится окно диалога, в котором можно выбрать (или задать) имя требуемого файла. В меню File име- ется команда New. Выбрав эту команду, вы откроете пустое окно редактирова- ния для ввода текста новой программы. Первоначально файлу с текстом этой программы присваивается имя NONAMEXX, где XX — порядковый номер файла. Это имя можно изменить при записи файла на диск. F2 — сохранить файл на диске. Это же действие можно выполнить, выбрав ко- манду Save в меню File. По этой команде текст сохраняется в файле на диске. Окно редактирования остается активным, что позволяет продолжить работу с текстом. Alt+X — выход из среды Turbo Pascal. То же можно сделать выбором команды Exit в меню File. Отладка и тестирование Тестирование — один из наиболее трудоемких этапов создания программ. Если ваша программа выдала правдоподобный результат, то это еще не значит, что сама по себе она является правильной. Вполне возможно, что при повторном запуске с новым набором исходных данных вас постигнет разочарование. Дадим некоторые практические рекомендации, касающиеся отладки и тести- рования. Одним из способов тестирования является тестирование по данным или те- стирование с управлением по входу-выходу. В этом случае знания о внутренней структуре программы не учитываются, тестовые данные используются лишь в соответствии со спецификацией программы. При таком подходе для полного тес- тирования пришлось бы перебрать все возможные наборы входных данных, что, как правило, недостижимо из-за большого количества вариантов. Однако очень часто использование при прогоне даже ограниченного числа вариантов исходных
316 Приложение 3. Интегрированная инструментальная среда Turbo Pascal данных «открывает глаза» на явно неверное в некоторых случаях поведение про- граммы. Другой способ тестирования — это тестирование, управляемое логикой програм- мы. Оно позволяет исследовать внутреннюю структуру программы. При таком те- стировании можно поступать по-разному. Представляется полезным ответить на вопросы, которые позволяют выявить специфические для языка программирова- ния Паскаль ошибки. Разумеется, каждый программист вправе пополнять для себя подобный список по мере накопления опыта. Ошибки обращения к данным Существуют ли в программе обращения к переменным, которым не присвоены значения? Если в программе используются массивы, то не выходят ли значения соответ- ствующих индексов за границы, определенные при описании массива? Проверьте корректность обращения к памяти с помощью указателей, если та- кие обращения используются. Например, следует избегать ситуации, когда указатель существует дольше, чем память, к которой производится обращение. Такое может произойти, если указа- тель задает локальную переменную в теле процедуры, его значение присваивается либо глобальной переменной, либо выходному параметру, а память при выходе из процедуры освобождается. Ошибки вычисления Не используются ли при некоторых вычислениях недопустимые типы дан- ных? Не может ли возникнуть переполнение или потеря значимости во время вы- числения выражения? & Не может ли делитель в операторе оказаться равным нулю? & Может ли значение переменной выходить за пределы установленного для нее диапазона? & Правильно ли используются приоритеты операций для записи выражения? Ошибки при сравнении 8 Нет ли в программе бесконечных циклов? Типичные ситуации: U неверно сформулированное условие цикла (следует всегда помнить, что для цикла с предусловием while формулируется условие его выполнения, а для цикла с постусловием repeat формулируется условие его прекраще- ния)', □ постоянное значение переменной цикла (циклы типа while, repeat). ш Нет ли в программе циклов, которые никогда не будут выполняться? & Правильно ли расставлены операторные скобки begin и end? Ошибка в их рас- становке может нарушить логику программы.
Отладка и тестирование 317 Ошибки интерфейса ® Правильно ли заданы аргументы при вызове встроенных функций? « Не портит ли подпрограмма некоторые параметры и глобальные переменные, которые должны использоваться только как входные величины? Исправление ошибок При обнаружении ошибки в программе начинается процесс отладки. Прежде всего ошибку необходимо локализовать. Для этого, в первую очередь, следует сделать предположение о характере ошибки и уже исходя из этого при- нимать меры. Например, предполагая ошибку интерфейса, следует при входе в процедуры и функции распечатать их имя и значения всех фактических парамет- ров, которые передаются по значению, а при выходе из процедуры или функции — значения фактических параметров-переменных, а также глобальных переменных. При ошибках передачи управления полезно напечатать сообщения о прохожде- нии тех участков программы, управление на которые передается при любых на- чальных данных. Можно завести счетчики, которые позволяют контролировать прохождение различных ветвей программы, и т. д. Если происходит выход за гра- ницу индекса (а это наиболее распространенная ошибка), то следует обратить вни- мание на используемые в программе массивы и в циклах, где происходит их обра- ботка, поставить вывод на печать значений индексов в тех местах, где имеет место изменение индекса. При обнаружении места ошибки следует внимательно изучить условие цикла — весьма вероятно, что некорректная формулировка послужила при- чиной данной ошибки. Существуют стандартные программы-отладчики. Они существенно облегчают пользователю поиск и локализацию ошибок. Использование отладчика Существует два основных типа программных ошибок: ж ошибки времени компиляции; ® ошибки времени выполнения. Синтаксические ошибки легко устранимы, поскольку Turbo Pascal выдает пол- ный их перечень с указанием местоположения в программе. Процесс компиляции не будет завершен до полной ликвидации ошибок такого сорта. Ошибки времени выполнения (семантические ошибки) устраняются не так легко, поскольку их не всегда просто локализовать и понять причину возникнове- ния. Особенно незаметны и трудны для прослеживания логические ошибки и ошиб- ки, связанные с взаимодействием модулей одной большой программы. В этой си- туации было бы удобно останавливать программу по достижении определенного места, чтобы проследить, как она проработала данный набор операторов, прона- блюдать значения некоторых переменных и выражений, может быть, попытаться изменить их значения и посмотреть на реакцию программы. Интегрированный отладчик Turbo Pascal имеет все упомянутые возможности (и не только). Он представляет собой встроенную часть интегрированной усовер- шенствованной среды Turbo Pascal.
318 Приложение 3. Интегрированная инструментальная среда Turbo Pascal При отладке программы очень часто возникает потребность просмотра значе- ния некоторых используемых переменных на определенной стадии выполнения программы. Традиционно для решения данной проблемы применялась отладоч- ная печать. Однако отладчик позволяет делать это гораздо проще: достаточно вос- пользоваться командой Debug ► Watches (запись Debug ► Watches означает, что необ- ходимо выбрать в меню Debug команду Watches). В окне Watch можно задавать некоторые объекты (переменные, структуры данных, выражения). При этом про- сматриваемые данные меняются, отражая текущие изменения при пошаговом вы- полнении программы. Добавление объектов в окно просмотра осуществляется путем нажатия клавиш Ctrl+F7 или выбора в меню Debug команды Add Watch. Следует заметить, что стандартное расположение окна Watch в нижней части экрана не всегда удобно, поэтому можно воспользоваться командами управления окнами, задав размер и расположение окон по своему усмотрению. Это особенно актуально, когда программа включает в себя набор модулей и когда окна, в кото- рых отображены тексты соответствующих модулей, перекрывают окно Watch. Для того чтобы управлять окном, необходимо нажать клавиши Ctrl+F5, а затем использовать клавиши со стрелками, а также клавиши PageUp, PageDown (для пере- мещения окна по экрану) или сочетание клавиши Shift и клавиш со стрелками (для изменения размеров окна). После получения желаемых вида и расположения окна следует нажать клавишу Enter. Можно для тех же целей использовать меню Window. Теперь рассмотрим, как можно осуществить пошаговое выполнение (трасси- ровку) программы. Для этого можно воспользоваться командой Run ► Trace Into или клавишей F7. Тем самым появляется возможность выполнить одну строку програм- мы, затем прерваться и посмотреть на результаты. При вызове процедуры или функции внутри пользовательской программы моле- но задать режим выполнения вызова как одного шага или режим трассировки этой процедуры или функции строка за строкой. При выполнении пошаговой отладки Turbo Pascal будет иногда переключаться на экран пользователя. Это происходит тогда, когда предусматривается вывод ин- формации на экран или требуется ввод информации. Затем выполняется возврат в интегрированную среду. Можно управлять переключением экрана с помощью установок, выполняемых по команде Options ► Debugger ► Display Swapping. Smart. Это режим по умолчанию. Переключение на экран пользователя проис- ходит при вызове программы или в вышеупомянутой ситуации. & Always. Переключение на экран пользователя происходит на каждом шаге. ® None. Переключение экранов не происходит. Интегрированная среда остается видимой все время. При выводе информации текст будет отображаться на экране среды. Кроме того, можно установить экран вывода в отдельном окне с помощью ко- манды Window ► Output. Построчное выполнение программы может оказаться достаточно неудобным, когда хочется обойти циклы или другие утомительные участки программы. Кроме того, отладку программы бывает удобно начать с определенного места. В этом слу-
Отладка и тестирование 319 чае можно воспользоваться клавишей F4 или командой Run ► Go to Cursor. Можно передвинуть курсор на определенную строку программы, а затем указать отладчи- ку на необходимость выполнения программы до достижения этой строки. Для проверки значений переменных, структур данных и выражений в интерак- тивном режиме пользователь может вызвать окно Evaluate, используя клавиши Ctrl+F4 или команду Debug ► Evaluate ► Modify. Используя окно Evaluate, можно изменить значение любой переменной, вклю- чая строки, указатели, элементы массива и поля записей. Это обеспечит простой механизм для проверки, как программа реагирует на определенную установку зна- чений и условий. С помощью команды Debug ► Breakpoints можно пометить строки в'ттользова- тельской программе как точки прерывания. Когда в процессе выполнения програм- мы достигается точка прерывания, выполнение программы останавливается и отображается исходный текст. Курсор при этом оказывается на строке с точкой прерывания. После этого можно проверить значения переменных, начать трасси- ровку или выполнить программу до другой точки прерывания. Можно в любой точке прервать выполнение программы, нажав клавиши Ctrl+Break. Произойдет остановка в следующей строке исходной программы, как если бы в этой строке была установлена точка прерывания. Точки прерывания являются важным инструментом отладки. Точка прерыва- ния подобна знаку остановки, введенному в программу пользователя. Когда про- грамма встречает такую точку, она останавливает свое выполнение и ждет даль- нейших отладочных инструкций. Пользователь может иметь до 16 активных точек прерывания. После задания точек прерывания можно начать выполнение программы с по- мощью команды Run ► Run (Ctrl+F9). Сначала программа будет выполняться нор- мально, но, когда встретится точка прерывания, остановится. При этом если ка- кие-нибудь переменные или выражения были добавлены в окно Watch, то они тоже выводятся на экран с соответствующими значениями. Затем пользователь может использовать любой режим отладки: & можно осуществлять пошаговое выполнение программы, используя команды Run ► Trace Into, Step Over, Go to Cursor (F7, F8, F4); & можно проверить или изменить значения переменных; $ можно добавить или удалить выражения из окна Watch; & можно назначить или удалить точки прерывания; & можно просмотреть выходные результаты программы, используя команду Win- dows ► User Screen (Alt+F5); & можно перезапустить программу сначала (Run ► Program Reset и затем команду пошагового выполнения); £ можно продолжить выполнение до следующей точки прерывания или до конца программы, выполнив команду Run ► Run (Ctrl+F9). Для удаления точки прерывания необходимо переместить курсор на данную строку и выполнить команду Debug ► Toggle Breakpoint (Ctrl+F8) еще раз. Эта коман- да включает или отключает точку прерывания в строке.
320 Приложение 3. Интегрированная инструментальная среда Turbo Pascal ПРИМЕЧАНИЕ Следует заметить, что основным элементом в отладчике является строка. Если на одной строке имеется несколько операторов, они будут выпол- няться вместе при нажатии клавиши F7. Однако, если один оператор разме- щен на нескольких строках, то при нажатии клавиши F7 будет выполняться весь оператор. Все команды выполнения, включая команды пошаговой отладки и работы с точками прерывания, основываются на строках. Выпол- няемая строка всегда помечена курсором выполнения. Пользователь может быстро находить объявления процедур или функций, даже если программа разбита на несколько модулей: для этого используется команда Search ► Find ► Procedure. Во время трассировки можно быстро вернуться обратно из вызовов процедур или функций и проверить параметры каждого вызова — с по- мощью команды Window ► Call ► Stack. Если в процессе отладки программы возникает необходимость начать все сна- чала, то нужно выбрать команду Program reset в меню Run. Система отладки повтор- но инициализируется, и команда следующего шага вернет пользователя к первой строке главной программы. При этом производится закрытие всех файлов, кото- рые были открыты программой, очистка стека всех вложенных программ, осво- бождение всего использованного пространства кучи. Turbo Pascal предлагает перезапуск программы, если пользователь произвел какие-либо изменения в программе во время отладки. Например, если изменена часть программы, а затем пользователь выбирает любую команду выполнения (F7, F8, F4, Ctrl+F9 и т. д.), на экране появится сообщение «Исходный модуль модифици- рован, повторить сборку? Д/Н»: Source modified, rebuild? (Y/N) Если пользователь ответит «У», Turbo Pascal перекомпилирует программу и во- зобновит отладку программы сначала. Если ответ — «N», то сеанс отладки продол- жается дальше (любые изменения в программе, произведенные пользователем, не будут влиять на ее выполнение до тех пор, пока он не перекомпилирует программу).
Приложение 4 Зарезервированные слова Turbo Pascal 7.0 Слово 'Назначение absolute Признак переменной, расположенной по определенному адресу and Операция логического умножения array Тип-массив asm Начало блока, написанного на ассемблере assembler Подпрограмма, написанная на ассемблере begin Начало тела программы, тела подпрограммы или составного оператора case Оператор выбора или описание вариантной части в записи const Начало раздела описания констант constructor Конструктор объекта destructor Деструктор объекта idiv Операция целочисленного деления do Начало операторов цикла for и while или оператора with downto Признак изменения счетчика цикла for на -1 else Часть «иначе» условного оператора или оператора выбора end Конец тела программы, подпрограммы, конец составного оператора, конец оператора выбора, конец описания записи или объекта, конец модуля, конец блока на ассемблере external Директива внешней подпрограммы far Директива формирования «дальнего» адреса file Файловый тип for Оператор цикла с известным числом повторений forward Директива предварительного описания заголовка подпрограммы продолжение &
322 Приложение 4. Зарезервированные слова Turbo Pascal 7.0 Продолжение таблицы Слово Назначение function Начало заголовка подпрограммы-функции goto Оператор безусловного перехода if Условный оператор implementation Начало исполнительной части модуля in Операция проверки элемента на вхождение в множество inherited Наследуемый метод inline Директива, разрешающая включение в программу блока на ассемблере interface Начало интерфейсной части модуля interrupt Директива процедуры, обрабатывающей прерывания label Начало раздела описания меток mod Операция вычисления остатка от целочисленного деления near Директива формирования «ближнего» адреса nil Пустая ссылка Not Операция логического отрицания object Тип-объект of Начало типа элементов в описании массива, множества или файла, начало перечисления констант в операторе выбора or Операция логического сложения packed Признак упакованного массива private Начало секции описания скрытых методов объекта procedure Начало заголовка подпрограммы-процедуры program Начало заголовка программы public Начало секции методов объекта, доступной другим модулям record Тип-запись repeat Цикл с постусловием set Тип-множество shl Операция сдвига битов влево shr Операция сдвига битов вправо string Строковый тип then Часть «тогда» в условном операторе to Признак изменения счетчика цикла for на +1 type Начало раздела описания типов unit Начало модуля until Конец цикла с постусловием
Зарезервированные слова Turbo Pascal 7.0 323 Слово Назначение uses Начало раздела описания используемых модулей var Начало раздела описания переменных или описание параметров-переменных virtual Директива виртуального метода while Начало цикла с предусловием with Оператор присоединения xor Логическая операция исключающего «ИЛИ»
Приложение 5 Комбинации клавиш быстрого управления в среде Turbo Pascal Команда (комбинация клавиш) Назначение Стрелка влево Ctrl+S Перемещение курсора на одну позицию влево Стрелка вправо Ctrl+D Перемещение курсора на одну позицию вправо Ctrl+стрелка влево Ctrl+A Перемещение курсора на первый символ слова, находящегося слева от текущей позиции курсора, или, в случае отсутствия такого слова, на конец предыдущей строки Ctrl+стрелка вправо Ctrl+F Перемещение курсора на первый символ слова, находящегося справа от текущей позиции курсора, или, в случае отсутствия такого слова, на конец строки Стрелка вверх Ctrl+E Перемещение курсора на одну строку вверх Стрелка вниз Ctrl+X Перемещение курсора на одну строку вниз Ctrl+W Перемещение экрана на одну строку вверх (если такая строка существует) Ctrl+Z Перемещение экрана на одну строку вниз (если такая строка существует) PgUp Перемещение экрана на одну страницу вверх (если эта страница существует) PgDn Перемещение экрана на одну страницу вниз (если эта страница существует) Home Ctrl+QS Перемещение курсора в первую позицию текущей строки
Комбинации клавиш быстрого управления в среде Turbo Pascal 325 Команда (комбинация клавиш) Назначение end Ctrl+QD Перемещение курсора в конец текущей строки Ctrl+Home Ctrl+QE Перемещение курсора на первую строку окна Ctrl+end Ctrl+QX Перемещение курсора на последнюю строку окна Ctrl+PgUp Ctrl+QR Перемещение курсора на начало текста Ctrl+PgDn CtrlH-QC Перемещение курсора на конец текста Ctrl+QB Перемещение курсора на начало выделенного блока Ctrl+QK Перемещение курсора на конец выделенного блока Ctrl+QP Возврат курсора на предыдущую позицию Ctrl+QW Перемещение курсора в место обнаружения последней ошибки и вывод сообщения об ошибке в верхней строке Ctrl+Kn Установить маркер с номером п в текущей позиции курсора Ctrl+Qn Перемещение курсора в позицию, помеченную маркером с номером п Ctrl+QF Поиск фрагмента текста Ctrl+QA Поиск и замена фрагмента текста Ctrl+QL Повтор поиска фрагмента текста < Ctrl+Ql Поиск парной скобки для скобки вида: ([{<”’>}]) вперед по тексту Ctrl+Q] Поиск парной скобки для скобки вида: ([{<”’>}]) назад по тексту Ins Ctrl+V Изменение режима вставки. Возможны два режима: 1) добавляемые символы помещаются в место текущего положения курсора, уже имеющиеся символы сдвигаются; 2) добавляемые символы помещаются в место текущего положения курсора, уже имеющиеся символы заменяются на вводимые Tab Ctrl+I Поместить знак табуляции (величина табуляции по умолчанию — 8 символов) Enter 1 Переход на новую строку Ctrl+N Вставка строки Ctrl+Y Удаление строки Ctrl+QO Поместить в текст программы ключи компиляции, используемые по умолчанию Backspace Ctrl+H Удаление символа слева от курсора Del Ctrl+G Удаление символа в месте текущего положения курсора Ctrl+T Удаление слова или части слова, находящегося справа от курсора продолжение &
326 Приложение 5. Комбинации клавиш быстрого управления в среде Turbo Pascal Продолжение таблицы Команда (комбинация клавиш) Назначение Ctrl+QY Удаление части строки от текущего положения курсора до конца строки Ctrl+KB Пометить начало выделяемого блока Ctrl+KK Пометить конец выделяемого блока Ctrl+KT Пометить блок в одно слово, на котором находится курсор Ctrl+Ins Скопировать помеченный блок в буфер обмена (Clipboard) Shift+Del Перенести помеченный блок в буфер обмена (Clipboard) Shift+Ins Перенести блок из буфера обмена (Clipboard) в файл и поместить в текущей позиции курсора Ctrl+KC Скопировать помеченный блок в текущую позицию курсора Ctrl+KV Перенести помеченный блок в текущую позицию курсора Ctrl+Del Ctrl+KY Удаление помеченного блока из файла Ctrl+KH Погасить (высветить) выделение помеченного блока Ctrl+KW Сохранить помеченный блок на диске (имя файла запрашивается) Ctrl+KR Вставить в текст блок из файла на диске (имя файла запрашивается) Ctri+KP Вывод помеченного блока на принтер Ctrl+KI Сдвиг помеченного блока вправо на одну позицию Ctrl+KU Сдвиг помеченного блока влево на одну позицию Fl Вызов контекстной помощи F2 Сохранение редактируемого файла на диске F3 Открыть существующий файл F4 Выполнить программу до строки, в которой находится курсор F5 Расширение окна до полного экрана F6 Активизация следующего окна F7 Пошаговая трассировка с заходом в подпрограммы F8 Трассировка без захода в подпрограммы F9 Компиляция программы начиная с основного файла F10 Выход в меню Alt+Fl Вывод предыдущего окна помощи Alt+F3 Закрыть окно Alt+F5 Открыть окно пользователя Alt+F7 Переход к предыдущей строке окна сообщений
Комбинации клавиш быстрого управления в среде Turbo Pascal 327 Команда (комбинация клавиш) Назначение Alt+F8 Переход к следующей строке окна сообщений Alt+F9 Компиляция программы из окна редактирования Alt+F10 Вызов подменю Alt+Backspace Отмена изменений в текущей строке Alt+C Вызов меню Compile Alt+D Вызов меню Debug Alt+E Вызов меню Edit Alt+F Вызов меню File Alt+H Вызов меню Help Alt+O Вызов меню Options Alt+R Вызов меню Run Alt+S Вызов меню Search Alt+T Вызов меню Tools All+W Вызов меню Window Alt+X Выход в операционную систему Alt+O Вывод списка открытых окон Ctrl+Fl Предметный поиск помощи к слову, на котором находится курсор Ctrl+F2 Прекращение выполнения программы Ctrl+F3 Вызов окна используемых подпрограмм Ctrl+F4 Вычисление или модификация выражения Ctrl+F5 Изменение размера или положения окна Ctrl+F7 Добавить проверяемое значение в окно Watch Ctrl+F8 Поставить (удалить) в текущей строке точку прерывания Ctrl+F9 Запуск программы Shift+Fl Вывод словаря контекстной помощи Shift+F6 Активизация предыдущего окна Esc Выход из меню или информационного окна
Приложение 6 Некоторые сообщения об ошибках периода компиляции № Сообщение Комментарий 1 Out of memory Выход за границы памяти 2 Identifier expected Ожидается идентификатор 3 Unknown identifier Неопределенный идентификатор 4 Duplicate identifier Повторное описание идентификатора 5 Syntax error Ошибка в синтаксисе (обнаружен недопустимый символ) 6 Error in real constant Ошибка в вещественной константе 7 Error in integer constant Ошибка в целой констан те 8 String constant exceeds line Строковая константа превышает допустимые размеры 10 Unexpected end of file Не найден конец файла И Line too long Слишком длинная строка 12 type identifier expected Не указан тип идентификатора 14 Invalid file name Неверное имя файла 15 File not found Файл не найден 16 Disk full Диск заполнен 20 Variable identifier expected Не указан идентификатор переменной 21 Error in type Ошибка объявления типа 22 Structure too large Структура слишком велика 23 Set base out of range Базовый тип множества выходит за допустимые границы 24 File components may not be files Компонентами файла не могут быть файлы
Некоторые сообщения об ошибках периода компиляции 329 № Сообщение Комментарий 25 Invalid string length Неверная длина строки 26 type mismatch Несоответствие типов 27 Invalid subrange base type Неверный базовый тип для типа диапазон 28 Lower bound greater than upper bound Нижняя граница описания типа диапазон больше верхней 29 Ordinal type expected Необходим порядковый тип 30 integer constant expected Необходима целая константа 31 Constant expected Необходима константа 32 integer or real constant expected Необходима целая или вещественная константа 33 type identifier expected Необходим идентификатор типа 34 Invalid function result type Неверный тип результата функции 35 Label identifier expected Необходим идентификатор метки 36 BEGIN expected Необходим BEGIN 37 END expected Необходим END 38 integer expression expected Необходимо выражение целого типа 39 Ordinal expression expected Необходимо выражение порядкового типа 40 boolean expression expected Необходимо выражение логического типа "41 Operand types do not match operator Типы операторов не соответствуют операции 42 Error in expression Ошибка в выражении 43 Illegal assigment Неверное присваивание 44 Field identifier expected Необходим идентификатор поля 50 DO expected Необходим DO 54 OF expected Необходим OF 57 THEN expected Необходим THEN 58 TO or DOWNTO expected Необходимы ТО или DOWNTO 59 Undefined forward Неопределенное опережающее описание 60 Too many procedures Слишком много процедур 61 Invalid typecast Неверное преобразование типа 62 Division by zero Деление на ноль 63 Invalid file type Неверный файловый тип 64 Cannot read or write variables of this type Невозможно считать или записать переменные этого типа 65 Pointer variable expected Необходима переменная-указатель 66 String variable expected Необходима строковая переменная продолжение &
330 Приложение 6. Некоторые сообщения об ошибках периода компиляции Продолжение таблицы № Сообщение Комментарий 67 String expression expected Необходимо выражение строкового типа 74 Constant and case types do not match Тип констант и тип выражения оператора CASE не соответствуют друг другу 75 Record variable expected Необходима переменная-запись 76 Constant out of range Константа выходит за допустимые границы 77 File variable expected Необходима файловая переменная 78 Pointer expression expected Необходимо выражение ссылочного типа 79 integer or real expression expected Необходимо выражение целого или вещественного типа 80 Label not within current block Метка не находится внутри данного блока 81 Label already defined Повторное определение метки 85 «;» expected Необходима «;» 86 «:» expected Необходимо «:». 87 «,» expected Необходима «,» 88 «(» expected Необходима «(» 89 «)» expected Необходима «)» 90 «=» expected Необходимо «=» 91 «:-» expected Необходимо «:в» 92 «[» expected Необходима «[» 93 «]» expected Необходима «]» 94 «.» expected Необходима «.» 95 «..» expected Необходимо «..» 97 Invalid FOR control variable Неверный параметр цикла FOR 98 integer variable expected Необходима переменная целого типа 102 String constant expected Необходима константа строкового типа 103 integer or real variable expected Необходима переменная целого или вещественного типа 104 Ordinal variable expected Необходима переменная порядкового типа 106 Character expression expected Необходимо выражение символьного типа 112 CASE constant out of range Константа CASE выходит за допустимые границы ИЗ Error in statement Ошибка в операторе 123 Too many symbols Слишком много символов 124 Statement part too large Слишком большой раздел операторов 126 File must be var parameters Файлы должны передаваться как параметры-переменные
Некоторые сообщения об ошибках периода компиляции 331 № Сообщение Комментарий 133 Cannot evaluate this expression Невозможно вычислить данное выражение 137 Structured variable cannot allowed here Здесь недопустима переменная структурного типа 140 Invalid floating-point operation к Недопустимая операция с плавающей запятой (возможно, произошло переполнение или деление на ноль) 149 VIRTUAL expected Необходимо слово VIRTUAL 150 Method identifier expected Необходим идентификатор метода 151 Virtual constructor not allowed Конструктор не может быть виртуальным
Литература 1. Абрамов С. А.> Гнездилова Г. Г, Капустина Е. Н, Селюн М. И, Задачи по про- граммированию. — М.: Наука, 1988. 2. Абрамов С. А., Зима Е. В. Начала программирования на языке Паскаль. — М.: Наука, 1987. 3. Абрамов В. Г., Трифонов Н П., Трифонова Г. И Введение в язык Паскаль. — М.: Наука, 1988. 4. Бородич Ю. С., Вальвачев А. Н, Кузьмич А. И. Паскаль для персональных компьютеров: Справочное пособие. — Минск: Высшая школа; БФ ГИТМП «Ника», 1991. 5. Ван ТасселД. Стиль, разработка, эффективность, отладка и испытание про- грамм. — М.: Мир, 1981. 6. Вирт Н. Алгоритмы + структуры данных - программы. — М.: Мир, 1989. 7. Горбенко О. Д., Попов В. Б., Ускова О. Ф. и др. Региональный стандарт обще- го среднего образования по информатике. — Воронеж: ВИПКРО, 1995. 8. Грогоно П. Программирование на языке Паскаль. — М.: Финансы и статистика, 1982. 9. Джонсон Ж., Харроу К. Решение задач в системе Turbo Pascal. — М.: Финансы и статистика, 1991. 10. Емелина Е. И. Основы программирования на языке Паскаль. — М.: Финансы и статистика, 1997. И. Йодан Э. Структурное программирование и конструирование программ. — М.: Мир, 1987. 12. Йенсен К., Вирт Н. Паскаль: Руководство для пользователя и описание язы- ка. — М.: Финансы и статистика, 1982. 13. Касьянов В. Н, Сабельфельд В. К. Сборник заданий по практикуму на ЭВМ. М.: Наука, 1986. 14. Мейер Д., Бодуэн К. Методы программирования: В 2 т. — М.: Мир, 1985. 15. Немнюгин С. A. Turbo Pascal. Учебник. — СПб.: Питер, 2002. 16. Немнюгин С. A. Turbo Pascal. Практикум. — СПб.: Питер, 2002. 17. Немнюгин С. А., ПерколабЛ, В. Изучаем Turbo Pascal. — СПб.: Питер, 2002.
Литература 333 18. Пильщиков В. Н. Сборник упражнений по языку Паскаль. — М.: Наука, 1989. 19. Попов В. Б. Турбо Паскаль для школьников. — М.: Финансы и статистика, 1996. 20. Турбо Паскаль 7.0. Самоучитель. — СПб.: Питер; К.: Издательская группа BHV, 2002. 21. Ускова О. Ф., Горбенко О. Д. Задачник-практикум по алгоритмическому язы- ку. — Воронеж: Издательство ВГУ, 1987. 22. Ускова О. Ф., Вощинская Г, Э. Алгоритмический язык: Задачи и решения. — Воронеж: Издательство ВГУ, 1989. 23. Фаронов В. В. Turbo Pascal 7.0: Учебное пособие. — М.: Нолидж, 1997. 24. Федоренко Ю. П. Алгоритмы и программы на Turbo Pascal. Учебный курс. — СПб.: Питер, 2002. 25. Хершель Р. Турбо Паскаль. — Вологда: МП МИК, 1991. 26. Юркин А. Г. Задачник по программированию. — СПб.: Питер, 2002.
Ускова Ольга Федоровна, Бакланов Михаил Владимирович, Воронина Ирина Евгеньевна, Горбенко Олег Данилович, Вощинская Гильда Эдгаровна, Огаркова Наталья Владимировна, Мельников Вадим Митрофанович Программирование на языке Паскаль: задачник Главный редактор Е. Строганова Заведующий редакцией А. Кривцов Руководитель проекта Ю. Суркис Литературный редактор А. Жданов Корректоры Н. Лукина, Н. Келле-Пелле Верстка А. Дорошенко Лицензия ИД № 05784 от 07.09.01. Подписано к печати 27.08.04. Формат 70x100 ’Лб- Усл. п. л. 27,09. Доп. тираже 4000. Заказ 906 ООО «Питер Принт», 194004, Санкт-Петербург, Б.Сампсониевский пр., д. 29а. Налоговая льгота — общероссийский классификатор продукции ОК 005-93, том 2; 95 3005 — литература. Отпечатано с готовых диапозитивов в ОАО «Техническая книга» 190005, Санкт-Петербург, Измайловский пр., 29