bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723...

393
ИНФОРМАТИКА И ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА ACADEM' A А А. | И. Г. Семакин g А. П. Шестаков т < 5 основы I АЛГОРИТМИЗАЦИИ I И ПРОГРАММИРОВАНИЯ в о о. с ш ш X ш Ь 3-е издание

Transcript of bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723...

Page 1: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ИНФОРМАТИКА ♦

И ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА ACADEM 'A

А А.

| И. Г. Семакин g А. П.

Шестаковт<

5 основы

I АЛГОРИТМИЗАЦИИ I И ПРОГРАММИРОВАНИЯвоо.сшшXшЬ 3-е издание

Page 2: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

С Р Е Д Н Е Е П Р О Ф Е С С И О Н А Л Ь Н О Е О Б РАЗ О В АН И Е

ОСНОВЫ АЛГОРИТМИЗАЦИИ

И ПРОГРАММИРОВАНИЯ

УЧЕБНИК

Допущено

Министерством образования Российской Федерации в качестве учебника для студентов

образовательных учреждений среднего профессионального образования

3-е издание, стереотипное

ACADEM'A ^

Москва ' f,('

Издательский центр «Акад?мия’г b ! d, |\/о -72012 ------------------------------- —-—-~™

Page 3: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

УДК 681.3.06(075.32) ББК22.18я723 С30

Рецензенты:

Семакин И. Г.С 30 Основы алгоритмизации и программирования : учебник для студ.

учреждений сред. проф. образования / И. Г. Семакин, А. П. Шестаков.— 3-е изд., стер. — М. : Издательский центр «Академия», 2012. —400 с.

ISBN 978-5-7695-8957-7

Рассмотрены основы структурной методики построения алгоритмови программирования на базе языка Паскаль (версия ТурбоПаскаль (7.0),а также основные понятия объектно-ориентированногопрограммирования и его реализация на языке ТурбоПаскаль. Описанаинтегрированная среда программирования Delphi и рассмотрены

Page 4: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ПРЕДИСЛОВИЕ

Программирование все в большей степени становится занятием лишьдля профессионалов. Объявленный в середине 1980-х гг. лозунг«Программирование — вторая грамотность» остался в прошлом. В понятие«компьютерная грамотность» сегодня входит, прежде всего, навыкиспользования многообразных средств информационных технологий. Прирешении той или иной информационной задачи сначала следуетпопытаться подобрать адекватное программное средство (электронныетаблицы, системы управления базами данных, математические пакеты идр.), и только если эти средства не позволяют решить поставленную задачу,использовать универсальные языки программирования.

Различают программистов двух категорий: прикладных и системных.Системные программисты — это разработчики базовых программныхсредств ЭВМ (операционных систем, трансляторов, сервисных средств ит.д.), являющиеся профессионалами высочайшего уровня. Прикладныепрограммисты разрабатывают средства программного обеспечения ЭВМ,предназначенные для решения задач в отдельных областях деятельности(науке, технике, производстве, сфере обслуживания, обучении и т.д.).Требования к качеству прикладных программ, так же высоки, как и к каче-ству системных. Любая программа должна не только правильно решатьзадачу, но и иметь современный интерфейс, быть высоконадежной,дружественной к пользователю и т.д. Только такие программы могутвыдержать конкуренцию на мировом рынке программных продуктов.

По мере развития компьютерной техники развивались методика итехнология программирования. Сначала возникли командное иоператорное программирование, в 1960-х гг. бурно развивалисьструктурное программирование, линии логического и функциональногопрограммирования, а в настоящее время широко распространяютсяобъектно-ориентированное и визуальное программирование.

Задача, которую следует ставить в начале изучения программирования,— это освоение основ его структурной методики с помощью языкаПаскаль, который его автор — швейцарский профессор Никлаус Вирт —создавал именно для этого. Структурная методика до настоящего времениостается основой программистской культуры. Не освоив ее, человек,взявшийся изучать программирование, не имеет никаких шансов статьпрофессионалом.

3

Page 5: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Реализации языка Паскаль в версиях фирмы Borland для IBM,известные под названием TurboPascal, значительно расширили язык посравнению с вариантом Н. Вирта. Начиная с версии 5.5 TurboPascal сталтакже и языком объектного программирования.

Содержание главы 2 настоящего учебника ориентировано на глубокоеусвоение учащимися базовых понятий языков программирования высокогоуровня в их реализации на языке Паскаль, что значительно облегчитизучение других языков программирования. В главе 4 излагаются основыобъектно-ориентированного программирования на примере их реализациина языке Паскаль. Здесь же рассматривается язык программированияDelphi, являющийся объектно-ориентированным расширением языкаПаскаль с реализацией технологии визуального программирования.

При подготовке к изучению данного курса желательно усвоениеучащимися основ алгоритмизации в рамках школьного базового курсаинформатики. Обычно в школе алгоритмизация изучается сиспользованием учебных исполнителей, позволяющих успешно освоитьосновы структурной методики:• построение алгоритмов из базовых структур;• применение метода последовательной детализации.

Желательно также иметь представление об архитектуре ЭВМна уровне машинных команд (достаточно на модельных примерах учебныхкомпьютеров, изучаемых в школьной информатике, т.е. не обязательнознание реальных языков команд или ассемблера). Это позволяет усвоитьосновные понятия программирования (переменной, присваивания);«входить в положение транслятора» и не делать ошибок, даже не помнякаких-то деталей синтаксиса языка; предвидеть те «подводные камни», накоторые может «напороться» программа в процессе выполнения. Посуществу все эти качества и отличают профессионального программиста отдилетанта.

Еще одно качество профессионала — это способность восприниматькрасоту программы, т.е. получать эстетическое удовольствие от хорошонаписанной программы. Нередко это чувство помогает интуитивноотличить неправильную программу от правильной. Однако основнымкритерием оценки программы должна быть, безусловно, не интуиция, аграмотно организованное тестирование.

Процесс изучения и практического освоения программированияподразделяется на три части:• изучение методов построения алгоритмов;• изучение языка программирования;• изучение и практическое освоение определенной системы про-граммирования.

Решению задач первой части посвящены главы 1 и 3 данного учебника.В главе 1 даются основные, базовые, понятия и принципы построенияалгоритмов работы с величинами. В главе 3 излага

4

Page 6: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ются некоторые известные методики полного построения алгоритмов,рассматриваются проблемы тестирования программ и оценки сложностиалгоритмов.

Языки программирования ТурбоПаскаль и Delphi излагаютсясоответственно в главах 2 и 4 учебника. Однако подчеркнем, что даннаякнига — это, прежде всего, учебник по программированию, а не по языкамПаскаль и Delphi, поэтому исчерпывающего описания данных языков выздесь не найдете, они излагаются в объеме, необходимом для начальногокурса программирования. Более подробное описание этих языков можнонайти в книгах, указанных в списке литературы.

В данном учебнике нет инструкций по работе с конкретнымисистемами программирования для изучаемых языков, с ними студентыдолжны познакомиться в процессе выполнения практических работ наЭВМ, используя специальную литературу.

В главе 5 учебника содержатся задачи по программированию, которыеможно использовать для организации практических и лабораторныхзанятий на любом из изучаемых языков.

Page 7: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Г Л А В А 1

ОСНОВНЫЕ ПРИНЦИПЫ АЛГОРИТМИЗАЦИИ И

ПРОГРАММИРОВАНИЯ

1.1. Алгоритмы и величиныЭтапы решения задачи на ЭВМ. Работа по решению любой задачи с

использованием компьютера включает в себя следующие шесть этапов:1. Постановка задачи.2. Формализация задачи.3. Построение алгоритма.4. Составление программы на языке программирования.5. Отладка и тестирование программы.6. Проведение расчетов и анализ полученных результатов.

Часто эту последовательность называют технологической цепочкойрешения задачи на ЭВМ (непосредственно к программированию из этогосписка относятся п. 3...5).

На этапе постановки задачи следует четко определить, что дано и чтотребуется найти. Важно описать полный набор исходных данных,необходимых для решения задачи.

На этапе формализации чаще всего задача переводится на языкматематических формул, уравнений и отношений. Если решение задачитребует математического описания какого-то реального объекта, явленияили процесса, то ее формализация равносильна получениюсоответствующей математической модели.

Третий этап — это построение алгоритма. Опытные программистычасто сразу пишут программы на определенном языке, не прибегая ккаким-либо специальным средствам описания алгоритмов (блок-схемам,псевдокодам), однако в учебных целях полезно сначала использовать этисредства, а затем переводить полученный алгоритм на языкпрограммирования.

Первые три этапа — это работа без компьютера. Последующие дваэтапа — это собственно программирование на определенном языке вопределенной системе программирования. На последнем — шестом —этапе разработанная программа уже используется в практических целях.

Таким образом, программист должен уметь строить алгоритмы, знатьязыки программирования, уметь работать в соответствующей системепрограммирования.

6

Page 8: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Основой профессиональной грамотности программиста являетсяразвитое алгоритмическое мышление.

Понятие алгоритма. Одним из фундаментальных понятий винформатике является понятие алгоритма. Сам термин «алгоритм»,заимствованный из математики, происходит от лат. Algorithmi —написание имени Мухамеда аль-Хорезми (787 — 850), выдающегосяматематика средневекового Востока. В XII в. был осуществлен латинскийперевод его математического трактата, из которого европейцы узнали одесятичной позиционной системе счисления и правилах арифметикимногозначных чисел. Именно эти правила в то время называлиалгоритмами. Сложение, вычитание, умножение «столбиком», деление«уголком» многозначных чисел — это первые алгоритмы в математике.Правила алгебраических преобразований и вычисление корней уравненийтакже можно отнести к математическим алгоритмам.

В наше время понятие алгоритма трактуется шире. Алгоритм — этопоследовательность команд управления каким-либо исполнителем. Вшкольном курсе информатики с понятием алгоритма и методамипостроения алгоритмов ученики знакомятся на примерах учебныхисполнителей: Робота, Черепахи, Чертежника и др. Эти исполнителиничего не вычисляют. Они создают рисунки на экране, перемещаются влабиринтах, перетаскивают предметы с места на место. Такихисполнителей принято называть исполнителями, работающими вобстановке.

В разделе «Программирование» информатики изучаются методыпрограммного управления работой ЭВМ, т.е. в качестве исполнителявыступает компьютер. Компьютер работает с величинами — различнымиинформационными объектами: числами, символами, кодами и др., поэтомуалгоритмы, предназначенные для управления компьютером, называютсяалгоритмами работы с величинами.

Данные и величины. Совокупность величин, с которыми работаеткомпьютер, принято называть данными. По отношению к программеразличают исходные, окончательные {результаты) и промежуточныеданные, которые получают в процессе вычислений (рис. 1.1).

Например, при решении квадратного уравнения ах2 + Ьх + с - 0исходными данными являются коэффициенты а, Ь, с, результатами — корниуравнения хи х2, а промежуточными данными — дискриминант уравненияD - Ь2 - 4ас.

Программа(промежуточные

данные)

Результаты

>Рис. 1.1. Уровни данных относительно программы

7

Page 9: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Тип Значения Операции Внутреннеепредставление

Целые Целые положи-тельные и отрица-тельные числа в некотором диапа-зоне, например: 23, -12, 387

Арифметическиеоперации с целымичислами: сложение,вычитание, умноже-ние, целое деление иделение с остатком.Операции отношений(<, >, = и др.)

Формате фикси-рованной точкой

Вещественные

Любые (целые и дробные) числа в некотором диапа-зоне, например: 2.5, -0.01, 45.0, 3.6x109

Арифметические операции. Операции отношений

Формате плава-ющей точкой

Логические True (истина) False (ложь)

Логические операции:И (and), ИЛИ (or), НЕТ (подоперации отношений

1 — True; 0 — False

Символьные Любые символы компьютерного алфавита, напри-мер: а, 5, +, $

Операции отношений Коды таблицысимвольной ко-дировки, например:ASCII — одинсимвол —1 байт; Unicode —один символ —2 байт

Page 10: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

8

в ходе выполнения программы и представляются в алгоритме сим-волическими именами — идентификаторами, например: X, S2, cod 15 и др.Любые константы и переменные занимают ячейку памяти, а значения этихвеличин определяются двоичным кодом в этой ячейке. •

Теперь о типах величин — типах данных — понятии, котороевстречается при изучении в курсе информатики баз данных и электронныхтаблиц. Это понятие является фундаментальным в программировании.

В каждом языке программирования существует своя концепция и своясистема типов данных. Однако в любой язык входит минимальнонеобходимый набор основных типов данных: целые, вещественные,логические и символьные. С типом величины связаны три ее свойства:множество допустимых значений, множество допустимых операций, формавнутреннего представления. В табл. 1.1 представлены свойства основныхтипов данных.

Типы констант определяются по контексту (т.е. по форме записи втексте), а типы переменных устанавливаются в описаниях переменных.

По структуре данные подразделяются на простые и структурированные.Для простых величин, называемых также скалярными, справедливоутверждение одна величина — одно значение, а для структурированных —одна величина — множество значений. К структурированным величинамотносятся массивы, строки, множества и др.

ЭВМ — исполнитель алгоритмов. Как известно, каждый алгоритм(программа) составляется для конкретного исполнителя, т.е. в рамках егосистемы команд. О каком же исполнителе идет речь при изучении темы«Программирование для ЭВМ»? Ответ очевиден: исполнителем здесьявляется компьютер, а точнее говоря, комплекс ЭВМ + системапрограммирования (СП). Программист составляет программу на том языке,на который ориентирована СП. Схематически это изображено на рис. 1.2,где входным языком исполнителя является язык программирования Паскаль.

Независимо от того, на каком языке программирования будет написанапрограмма, алгоритм решения любой задачи на ЭВМ

Рис. 1.2. Компьютер как исполнитель программ на языке Паскаль

9

Page 11: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

может быть составлен из следующих команд: присваивания, ввода, вывода,обращения к вспомогательному алгоритму, цикла, ветвления.

Далее для описания алгоритмов будут использоваться блок-схемы иучебный алгоритмический язык (АЯ), применяемый в школьном курсеинформатики.

1.2. Линейные вычислительные алгоритмы

Основным элементарным действием в вычислительных алгоритмахявляется присваивание значения переменной величине.

Если значение константы определено видом ее записи, то переменнаявеличина получает конкретное значение только в результате присваивания,которое может осуществляться двумя способами: с помощью командыприсваивания и с помощью команды ввода.

Рассмотрим пример. В школьном учебнике математики правило делениядвух обыкновенных дробей описано следующим образом:1) числитель первой дроби умножить на знаменатель второй дроби;2) знаменатель первой дроби умножить на числитель второй дроби;3) записать дробь, числитель которой есть результат выполнения п. 1, азнаменатель — результат выполнения п. 2.

Алгебраическая форма записи этого примера следующая:

а 4 с _ а ■ d _ т b

d be п

Теперь построим алгоритм деления дробей для ЭВМ, сохранив те жеобозначения переменных, которые были использованы в алгебраическомвыражении.

Исходными данными здесь являются целочисленные переменные а, Ь, с,d, а результатом — целые величины т и п . Блок-схема алгоритма делениядробей приведена на рис. 1.3. Данный алгоритм на учебномалгоритмическом языке будет иметь следующий вид:

алг деление дробей

нач

цел а, Ь, с, d, ш, п ввод а, Ь, с, d m := а х d n : = Ь х с

10

Page 12: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Формат команды присваивания следу-ющий:

Знак «:=» следует читать как «присво-ить».Команда присваивания означает следу-ющие действия, выполняемые компьюте-ром:1) вычисляется выражение,2) полученное значение присваивает-си переменной.В приведенном алгоритме присутству-ют две команды присваивания. В блок-схе-мах команды присваивания изображаютсяп прямоугольниках. Такой блок называет-ся вычислительным.При описании алгоритмов не обязатель-I ю соблюдать строгие правила записи вы-ражений, это можно делать в обычной ма-тематической форме, так как это еще не язык программированиясо строгим синтаксисом.

В рассматриваемом алгоритме имеется команда ввода:

Рис. 1.3. Блок-схема алго-ритма деления дробей

ввод а, Ь, с, d

В блок-схемах команда ввода записывается в параллелограмме — блокеввода-вывода. При выполнении этой команды процессор прерывает работуи ожидает действий пользователя. Пользователь должен набрать наустройстве ввода (клавиатуре) значения вводимых переменных и нажатьклавишу ввода <Enter>. Значения следует вводить в том же порядке, вкаком эти переменные рас-Iюложены в списке ввода. Обычно с помощью команды ввода при-сваиваются значения исходных данных, а команда присваиванияиспользуется для получения промежуточных и конечных величин.

Полученные компьютером результаты решения задачи должны бытьсообщены пользователю, для чего и предназначена команда вывода:

С помощью этой команды результаты выводятся на экран или черезустройство печати на бумагу.

Поскольку присваивание является важнейшей операцией ввычислительных алгоритмах, обсудим ее более подробно.

11

Page 13: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Команда а b

а := 1 1 —

b := 2 х а 1 2

а := b 2 2

b := а + b 2 4

Команда X Y Z

ввод X, Y 1 2 —

Z := X 1 2 1

X := Y 2 2 1

Y := Z 2 1 1Рассмотрим последовательное выполнение четырех команд

присваивания, в которых участвуют две переменные величины — а, Ь. Втабл. 1.2 для каждой команды присваивания указаны значения переменных,которые устанавливаются после ее выполнения.

Этот пример иллюстрирует три основных свойства присваивания:• пока переменной не присвоено значение, она остается нео-пределенной;• значение, присвоенное переменной, сохраняется вплоть довыполнения следующего присваивания этой переменной;• новое значение, присваиваемое переменной, заменяет ее предыдущеезначение.

Рассмотрим алгоритм, который часто используется при про-граммировании. Даны две величины: X и Y. Требуется произвести междуними обмен значениями. Например, если сначала было Х= 1, Y = 2, топосле обмена должно стать X = 2, Y = 1.

Этой задаче аналогична следующая ситуация. Имеются два стакана:один — с молоком, другой — с водой. Требуется произвести между нимиобмен содержимым. Ясно, что в этом случае необходим третий стакан —пустой. Последовательность действий при обмене будет следующей:1) перелить молоко из 1-го стакана в 3-й;2) воду из 2-го стакана в 1-й;3) молоко из 3-го стакана во 2-й.

Аналогично для обмена значениями двух переменных требуется третьядополнительная переменная. Назовем ее Z. Тогда задачу обменазначениями можно решить последовательным выполнением трех командприсваивания (табл. 1.3).

Пример со стаканами не совсем точно характеризует ситуацию обменамежду переменными, так как при переливании жидкостей один из стакановстановится пустым. В результате же выполнения команды присваивания (X:= Y) переменная, стоящая справа (Y), сохраняет свое значение.

Таблица 1 . 2

Изменение значений переменных привыполнении команды присваивания

Таблица 1 . 3

Обмен значениями междупеременными

12

Page 14: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Алгоритм деления дробей имеет линейную структуру, т. е. в нем псекоманды выполняются в строго определенной последовательности, каждаяпо одному разу. Линейный алгоритм состоит из команд присваивания,ввода, вывода и обращения к вспомогательным алгоритмам (что будетрассмотрено далее).

При описании алгоритмов с помощью блок-схем типы данных, какправило, не указываются (но подразумеваются). В учебных алгоритмах (наАЯ) для всех переменных типы данных указы- иаются явно, и их описаниепроизводится сразу после заголовка алгоритма. При этом используютсяследующие обозначения: цел — целые, вещ — вещественные, лит —символьные (литерные), лог — логические. В алгоритме деления дробейвсе переменные целого типа.

1.3.Ветвления и циклы в вычислительных алгоритмах

Составим алгоритм решения квадратного уравнения ах2 + Ьх

+ с = 0.Эта задача хорошо знакома из математики. Исходными данными здесь

являются коэффициенты а, Ь, с, а решением в общем случае — два корня(х, и х2), которые вычисляются по формуле

-b ± 4b2 -4ас*1,2 =---------~----------•

2 а

Все используемые в этой программе величины вещественного типа.Алгоритм решения кваратного уравнения будет иметь следующий вид:

алг корни квадратного уравнения

вещ а, Ь, с, d, xl, х2

нач ввод а, Ь, с d := b2 - 4ас xl:= (-b + Vd)/(2а) х2 := (-b - Vd)/(2а) вывод xl, х2

кон

Недостаток такого алгоритма виден «невооруженным глазом». Он необладает важнейшим свойством, предъявляемым к качественным

13

Page 15: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

выполняться до конца. Результатом может быть числовой ответ, но можетбыть и сообщение о том, что при таких данных задача решения не имеет.Недопустимы остановки в середине алгоритма из-за невозможностивыполнения какой-либо операции. Данное свойство в литературе попрограммированию называют результативностью алгоритма (получениекакого-то результата в любом случае).

Для построения универсального алгоритма сначала требуется тщательно проанализировать математическое содержание задачи.

Решение квадратного уравнения зависит от значений коэффициентов а, Ь, с.

Проанализируем эту задачу, ограничиваясь поиском только вещественных корней:

если а = О, b = 0, с = 0, любое значение х — решение уравнения; если а = О, b = 0, с ф о, уравнение решений не имеет; если а = О, b Ф 0, это линейное уравнение, имеющее одно решение х =-с/Ь;

если а * 0 и d = b2- 4ас > 0, уравнение имеет два вещественных корня хь х2;

если а Ф 0 и d < 0, уравнение не имеет вещественных корней. Блок-схема алгоритма решения квадратного уравнения показана на рис. 1.4.

Этот же алгоритм на алгоритмическом языке будет иметь следующий вид:

алг корни квадратного уравнения вещ а, Ь, с, d, xl, х2 нач ввод а, Ь, с

если а = О то если Ь = Ото если с = О

то вывод «Любое х — решение» иначе вывод «Нет решений»

КВ

иначе х := —с/Ь вывод X

КВ

иначе d := Ь2 - 4ас

14

Page 16: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

х:= -с/Ь

d := Ь2 - 4ас

b < О

xl := (-b + Vd)/(2a)

х2 := (-b —>/d)/(2a)

Вывод xl, х2.

Конец

Рис. 1.4. Блок-схема алгоритма решения квадратного уравнения

Page 17: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В данном алгоритме многократно использована структурная командаветвления, общий вид которой в виде блок-схемы показан на рис. 1.5. Наалгоритмическом языке команду ветвления можно записать в следующемвиде:

если условие

то серия 1

иначе серия 2КВ

В соответствии с приведенной блок-схемой команды ветвления сначалапроверяется условие (вычисляется логическое выражение). Если условиеистинно, то выполняется последовательность команд, на которуюуказывает стрелка с надписью «Да» (положительная ветвь) — «Серия 1». Впротивном случае выполняется отрицательная ветвь команд — «Серия 2».

НаАЯ условие записывается после служебного слова «если»,положительная ветвь — после слова «то», а отрицательная — после слова«иначе». Буквами «кв» в такой записи обозначают конец ветвления.

Если на ветвях одного ветвления содержатся другие ветвления, значит,алгоритм имеет структуру вложенных ветвлений. Именно такую структуру

П!1, если п = 0;

1х2х...х«, если п > 1.

На рис. 1.6 приведена блок-схема алгоритма вычисления п\ с тремяпеременными целого типа: п — аргумент, / — промежуточная переменная,F— результат. Для проверки правильности указанного алгоритма построимтрассировочную табл. 1.4, в которой для конкретных значений исходныхданных по шагам прослеживается изменение переменных, входящих валгоритм. Данная таблица составлена для случая п = 3.

Приведенная трассировка доказывает правильность рассматриваемогоалгоритма. Теперь запишем этот алгоритм на алгоритмическом языке:

алг факториал цел n, i, F нач ввод п

16

Page 18: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 1.5. Блок-схема команды ветвления

Рис. 1.6. Блок-схема алгоритма вычисления п\ 3-5"

17

Page 19: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Шаг п F Условие

1 3

2 1

3 1

4 1 < 3, да

5 1

6 2

7 2 < 3, да

8 2

9 3

10 3< 3, да

11 6

12 4

13 4 < 3, нет

14 вывод

F := 1; i := 1пока i < п, повторятьнц F := F X i i := i +

1кцвывод F

кон

№Данный алгоритм имеет циклическую структуру. В нем использована

структурная команда цикл «Пока», или цикла с предусловием. Блок-схемакоманды цикла «Пока» показана на рис. 1.7. На АЯ она имеет следующийвид:

пока условие, повторять

нц

серияКЦ

18

Page 20: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 1.7. Блок-схема команды цикла «Пока»

мение цикла заканчивается. Служебные слова «нц» и «кц» обозначаютсоответственно начало и конец цикла.

Цикл с предусловием — это основная, но не единственная формаорганизации циклических алгоритмов: существует цикл с постусловием.

Вернемся к алгоритму решения квадратного уравнения, рассмотрев егосо следующей позиции: если а = 0 — это уже не квадратное уравнение иего можно не решать. В данном случае будем считать, что пользовательошибся при вводе данных, и ввод следует повторить (рис. 1.8). Иначеговоря, в алгоритме будет предусмотрен контроль достоверности исходныхданных с предоставлением пользователю возможности исправленияошибки. Наличие такого контроля — еще один признак хорошего качествапрограммы.

На АЯ алгоритм решения квадратного уравнения с контролем нводаданных будет иметь следующий вид:

алг квадратное уравнение

вещ а, Ь, с, d, xl, х2нач

повторять

ввод а, Ь, с до а / О

19

Page 21: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 1 .8 . Блок-схема алгоритма решения квадратного уравнения с контролемввода данных

Блок-схема структурной команды цикла с постусловием цикла «До»показана на рис. 1.9. На АЯ данную команду можно записать следующимобразом:

повторять

серия

до условие

20

Page 22: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 1.9. Блок-схема команды цикла «До»

Эта задача решается с помощью метода, известного под названиемалгоритма Евклида. Идея этого метода основана на утверждении, что еслиМ > N, то НОД (М, N) = НОД (М - N, N). Попробуйте доказать этосамостоятельно. Другое утверждение,

Рис. 1.10. Блок-схема алгоритма Евклида

21

Page 23: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

лежащее в основе решения данного алгоритма, очевидно: НОД (М, М) = М.Для «ручного» выполнения этот алгоритм можно описать в формеследующей инструкции:1) если числа равны, взять их общее значение в качестве ответа. Впротивном случае продолжить выполнение алгоритма;2) определить большее из чисел;3) заменить большее число разностью большего и меньшего значений;4) вернуться к выполнению п. 1.

Блок-схема алгоритма Евклида приведена на рис. 1.10. На АЯ данныйалгоритм можно записать следующим образом:

алг Евклидцел М, N

нач ввод М, Nпока М * N, повторять нц если М > N

то М := М - N иначе N := N — М кв

кц

кон

Алгоритм Евклида имеет структуру цикла с вложенным ветвлением.Выполните самостоятельно трассировку этого алгоритма для случая М= 18,N= 12. В результате должен получиться НОД = 6.

1.4. Логические основы алгоритмизации

Прямое отношение к программированию имеет дисциплина,называемая математической логикой, основу которой составляет алгебралогики, или исчисление высказываний. Под высказыванием понимаетсялюбое утверждение, в отношении которого можно однозначно сказать,истинно оно или ложно. Например, утверждение «Луна — спутник,Земли»— истинно, «5 > 3» — истинно, «Москва — столица Китая» — ложно, «1 =0» — ложно. ИСТИНА и ЛОЖЬ являются логическими значениями.Логические значения приведенных утверждений однозначно определены.Другими словами, их значения являются логическими константами.

Логическое значение неравенства х<0, где х— переменная, являетсяпеременным, т. е. в зависимости от значения х оно может быть либо22

Page 24: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

№ п/п А в НЕ А А Н В А ИЛИ В

1 И и Л И И2 И л Л Л и3 Л и и Л и

4 л л и Л л

23

Page 25: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Последовательность выполнения операций в логических выра-жениях определяется старшинством операций: отрицание, конъ-юнкция, дизъюнкция. Кроме того, порядок выполнения опера-ции в логических формулах можно менять с помощью скобок.

(А И В) ИЛИ (НЕ А И В) ИЛИ (НЕ А И НЕ В)

Рассмотрим для примера вычисление значения логической фор-мулы

не xw у ш и х и г

при следующих значениях логических переменных: X = ЛОЖЬ,Y = ИСТИНА, Z = ИСТИНА.Отметим цифрами порядок выполнения операций в заданном

выражении:

® © @ ®нех и y w j v w x w z .

Используя таблицу истинности, выполним вычисление по ша-гам:

1) НЕ ЛОЖЬ = ИСТИНА;2) ИСТИНА И ИСТИНА = ИСТИНА;3) ЛОЖЬ И ИСТИНА = ЛОЖЬ;4) ИСТИНА ИЛИ ЛОЖЬ = ИСТИНА.

Значение рассмотренной логической формулы — ИСТИНА.Рассмотрим следующее утверждение: «Значение X находится в

интервале от 0 до 1». Это утверждение можно записать в виде си-стемы неравенств

О < Х < 1 .

Соответствующее логическое выражение будет иметь вид

СХ > 0) И (Х < 1).А теперь усложним задачу и запишем в виде логического выра-жения следующее утверждение: точка на плоскости с координа-

тами ( X , Y ) находится в кольце с центромв начале координат, с внутренним радиу-сом, равным 1, и внешним радиусом, рав-ным 2 (рис. 1.11). Это выражение будет иметьвид

(.X 2 + Y 2 > 1) И ( X 2 + Y 2 < 4).

Операция конъюнкции выполняется сле-дующим образом: выбирается множествоточек, удовлетворяющих первому неравен-ству ( X 2 + Y 2 > 1), и из полученного мно-

24

Page 26: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

жсства вьщеляется подмножество, удовлетворяющее второму не-рмнснству ( X 2 + Y 2 < 4), что и будет окончательным результатом. Можнотакже сказать, что искомое множество есть пересечение двух множеств,первое из которых удовлетворяет первому неравенству, а второе —второму. Конъюнкция — логическое умножение, т.е. операция,вычисляющая такое пересечение.

Запишем в виде логического выражения следующее утверждение: точкана плоскости с координатами ( X , У) находится вне кольца с центром вначале координат с внутренним радиусом, рапным 1, и внешним радиусом,равным 2 (см. рис. 1.11). Это выражение будет иметь вид

( X 2 + У 2 < 1) ИЛИ ( X 2 + Г 2 > 4).

Выполнение операции дизъюнкции происходит следующим образом:выбирается множество точек, удовлетворяющих первому неравенству ( X 2

+ Y 2 < 1), и к нему прибавляется множество, удовлетворяющее второмунеравенству ( X 2 + Y 2 > 4). Так проясняется смысл другого названияоперации дизъюнкции — логическое сложение, т.е. сложение двухмножеств.

Последнюю задачу можно было решить иначе. Соответствующееиогическое выражение можно записать как отрицание первого ло- Iического выражения, поскольку точки, находящиеся вне кольца, — этоточки, которые НЕ принадлежат кольцу:

НЕ ((.X 2 + У2 > 1) И ( X 2 + Y 2 < 4)).

Следовательно, справедливо равенство между двумя логическимивыражениями:

НЕ ((X 2 + Y 2 > 1) И ( X 2 + Y 2 < 4)) = ( X 2 + Y 2 < 1) ИЛИ

( X 2 + Y 2 > 4).

Из этого примера становится понятным следующее правилопреобразования: операция отрицания, примененная к двум неравенствам,связанным конъюнкцией, изменяет знаки этих неравенств напротивоположные, а конъюнкцию — на дизъюнкцию (или дизъюнкцию наконъюнкцию).

Рассмотрим пример алгоритма, в котором используется сложноелогическое выражение. По длинам трех сторон а , Ь , с треугольникавычислим его площадь.

Для решения данной задачи используется формула Герона:

у / р ( р - а ) ( р - Ь ) ( р - с ) , где р

= ( а + Ь + с)/2 — полупериметр треугольника.

25

Page 27: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 п

Исходные данные должны удовлетворять основному соотношению длясторон треугольника: длина каждой из сторон должна быть меньше суммыдлин двух других его сторон.

Алгоритм вычисления площади треугольника имеет ветвящуюсяструктуру. Условие в структурной команде ветвления запишем в видесложного логического выражения, которое позволит «отфильтровать» всеварианты неверных исходных данных:

алг Герон

вещ А, В, С, Р, S

нач ввод А, В, С

1.5. Вспомогательные алгоритмы и процедурыВ теории алгоритмов существует понятие вспомогательного алгоритма,

т.е. алгоритма решения некоторой подзадачи из основной решаемой задачи.При этом алгоритм решения исходной задачи называется основным.

В качестве примера рассмотрим следующую задачу. Требуетсясоставить алгоритм вычисления степенной функции с целым показателем:у = хк, где к — целое число; л: * 0.

В алгебре такая функция определена следующим образом:

1 при п = 0;

----- при п < 0;х~"

х” при п > 0.

В данной задаче в качестве подзадачи можно рассматривать возведениечисла в целую положительную степень.

Учитывая, что 1/х~" = (1/х)-", запишем основной алгоритм решения этойзадачи:

алг степенная функция цел п; вещ х, у нач ввод х, п если п = 0

26

Page 28: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

то у: =1 иначе если п >О

то СТЕПЕНЬ (х, п, у) иначе СТЕПЕНЬ (1/х, —п, у)КВ

КВ

вывод укон

В основном алгоритме дважды повторяется команда обращения квспомогательному алгоритму с именем СТЕПЕНЬ — алгоритмувозведения вещественного основания в целую положительную степеньпосредством его многократного перемножения. Величины, стоящие вскобках в команде обращения к iu иомогательному алгоритму, называютсяфактическими параметрами.

В учебном алгоритмическом языке вспомогательные алгоритмыоформляются в виде процедур. Запишем на АЯ процедуру СТЕПЕНЬ:

процедура СТЕПЕНЬ (вещ а, цел к, вещ z)

цел i

нач z := 1; i := 1

пока i < к, повторять

нц z := z х а i :=i + 1

кц

КОН

Заголовок вспомогательного алгоритма начинается со слова■ процедура», после которого следуют имя этой процедуры и вскобках — список формальных параметров. В этом списке перечисляютсяпеременные аргументы и переменные результаты с ука- шнием их типов. Вданном примере а, к — формальные параметры-аргументы, z — параметр-результат. Следовательно, процедура СТЕПЕНЬ производит вычисления поформуле z = ак.

27

Page 29: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• по типам (типы соответствующих формальных и фактическихпараметров должны совпадать).

Фактические параметры-аргументы могут быть выражениямисоответствующего типа.

Обращение к процедуре инициирует следующие действия:1) значения параметров-аргументов присваиваются соответствующимформальным параметрам;2) выполняется тело процедуры (команды внутри процедуры);3) значение результата передается соответствующему фактическомупараметру, и происходит переход к выполнению следующей командыосновного алгоритма.

В процедуре СТЕПЕНЬ нет команд ввода исходных данных и выводарезультатов. Здесь присваивание начальных значений аргументам (а, п)производится через передачу параметров-аргументов, а присваиваниерезультата переменной (у) происходит через передачу параметра-результата (z).

Таким образом, передача значений параметров процедур являетсятретьим способом присваивания (наряду с командами присваивания иввода).

Использование процедур позволяет строить сложные алгоритмыметодом последовательной детализации.

1.6. Основы структурного программирования

Прошло уже более полувека со времени появления первой ЭВМ. Всеэто время вычислительная техника стремительно развивалась. Изменяласьэлементная база ЭВМ, росли их быстродействие и объем памяти,изменялись средства интерфейса человека с машиной. Безусловно, этиизменения сказывались самым непосредственным образом на работепрограммиста. Определенный общепринятый способ производства чего-либо (в данном случае — программ) называют технологией, поэтому далеебудем говорить о технологии программирования.

Для первых ЭВМ с «тесной» памятью и небольшим быстродействиемосновным показателем качества программы была ее экономичность позанимаемой памяти и времени счета. Чем программа получалась короче,тем класс программиста считался выше. Такое сокращение программычасто требовало больших усилий. Иногда программа получалась настолько«хитрой», что могла «перехитрить» самого автора: возвратившись черезнекоторое время к собственной программе и желая что-то изменить,программист мог запутаться в ней, забыв свою «гениальную идею».

Очень сложный алгоритм всегда увеличивает вероятность ошибки впрограмме, как и вероятность выхода из строя сложного техническогоустройства больше, чем простого.

28

Page 30: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Серия 1 Серия 2 Серия N

Рис. 1.12. Линейная структура программирования Следование

29

Page 31: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Ветвление — это алгоритмическая альтернатива, которую можнозаписать в виде

если условие

то серия 1иначе серия 2

К В

Управление в этой структуре передается на одну из двух ветвей(серий команд) в зависимости от истинности или ложности усло-вия. Затем происходит выход на общее продолжение (см. рис. 1.5).

Неполная форма ветвления имеет место при отсутствии ветви«иначе»:

если условието серия

К В

Цикл — это повторение некоторой группы действий по усло-вию. Различают два типа циклов. Первый тип циклической струк-туры — цикл с предусловием (см. рис. 1.7):

пока условие, повторять

нц

сериякц

■ • : .л... . ^Здесь пока условие истинное, выполняется серия, образующая

тело цикла.Второй тип циклической структуры — цикл с постусловием

(см. рис. 1.9):

повторять

30

Page 32: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

и II.Iкс программирования можно было бы ограничиться исполь- шнаниемцикла «Пока», однако в ряде случаев применение цикла -До» оказываетсяболее удобным, и поэтому он используется.

Иногда в литературе структурное программирование называютпрограммированием без GOTO (без оператора безусловного перехода).Действительно, при таком подходе к программированию нет местабезусловному переходу. Неоправданное использо- паиие в программахGOTO лишает их структурности, а значит, и т ех связанных с этимположительных свойств алгоритма: про- фачности и надежности. Хотя вовсех процедурных языках про- I раммирования этот операторприсутствует, для обеспечения i труктурного подхода к программированиюего употребления еподует избегать.

Сложные алгоритмы состоят из соединенных между собой ба- юныхструктур. Соединение этих структур может выполняться двумя способами: последовательным и вложенным. Это аналогично ситуации вэлектротехнике, где любую сложную электрическую цепь можноразложить на последовательно и параллельно соединенные участки.

Однако вложенные алгоритмические структуры не являются .шалогомпараллельно соединенных электрических проводников. Здесь большеподходит аналогия с матрешками, помещенными друг в друга. Если блок,составляющий тело цикла, сам является циклической структурой, этозначит, что имеют место вложенные циклы. В свою очередь внутреннийцикл может иметь внутри себя еще один цикл и т.д. В связи с этим введенопонятие глубины вложенности циклов. Точно также и ветвления могут бытьвложенными друг в друга.

Структурный подход требует стандартного изображения блок- схемалгоритмов. Каждая базовая структура должна иметь один вход и одинвыход. Нестандартно изображенная блок-схема алгоритма плохо читаетсяи теряет свою наглядность.

Примеры структурных блок-схем алгоритмов приведены на рис. 1.13.Такие блок-схемы легко читаются и хорошо воспринимаются зрительно,при этом каждой структуре можно дать название.

В учебном алгоритмическом языке, предназначенном для описанияструктурных алгоритмов, команда безусловного перехода отсутствует.Использование этого языка при обучении способствует «структурномувоспитанию» программиста.

Наглядность структурам алгоритмом на АЯ придает структуризациявида их текста. Основной используемый для этого прием — сдвиги строк,которые должны подчиняться следующим правилам:• конструкции одного уровня вложенности располагаются на одномвертикальном уровне (т. е. начинаются с одной позиции в строке);

31

Page 33: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 1.13. Примеры структурных блок-схем алгоритмов:

а — вложенные ветвления с глубиной вложенности, равной единице; б — цики с вложенным ветвлением; в — вложенные циклы «Пока» с глубиной

32

Page 34: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

чема

Алгоритм Схема Алгоритм

а если <У1> то если <УЗ> то <С1>КВиначе если <У2> то <С2>

иначе <СЗ>КВКВ

б пока < У1>, повторять нцесли <У2> то <С1> иначе <С2> кв

кц

в пока <У1>, повторять нцпока <У2>, повторять нц

<С>кцкц

г если <У1> то если <У>то <С1> иначе <С2> квесли <УЗ> то <СЗ> иначе <С4> кв

иначе пока <У4>, повторять<С5> кц

кв

<) если <У1> то <С1> иначе <С2> квповторять

СЗ до <У2>

е пока <У1>, повторять не повторять

<С>до <У2>

кц

Page 35: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

33

Еще одним важнейшим технологическим приемом структурногопрограммирования является декомпозиция решаемой задачи на подзадачи,т.е. более простые для программирования части исходной задачи.Алгоритмы решения таких подзадач называются вспомогательными. Приэтом возможны два подхода к построению алгоритма:• сверху вниз — сначала строится основной алгоритм, а затем —вспомогательные;• снизу вверх — сначала составляются вспомогательные алгоритмы, азатем — основной.

Первый подход к построению алгоритма также называют методомпоследовательной детализации, а второй — сборочным методом.

При последовательной детализации сначала строится основнойалгоритм и в него вносятся обращения к вспомогательным алгоритмампервого уровня. Затем составляются вспомогательные алгоритмы первогоуровня, в которых могут присутствовать обращения к вспомогательнымалгоритмам второго уровня и т.д. Вспомогательные алгоритмы самогонижнего уровня состоят только из простых команд.

Метод последовательной детализации применяется при конст-руировании любых сложных объектов. Это естественная логическаяпоследовательность мышления конструктора: постепенное уг лубление вдетали. В программировании речь идет тоже о констру ировании, нотолько не технических устройств, а алгоритмов. Достаточно сложныйалгоритм другим способом построить практи чески невозможно.

Методика последовательной детализации позволяет организоватьработу коллектива программистов над сложным проектом, Например,руководитель группы строит основной алгоритм, ;i разработкувспомогательных алгоритмов и написание соответству ющих подпрограммпоручает своим сотрудникам. При этом участ никам рабочей группыследует лишь договориться об интерфейсе1 (т.е. взаимосвязи) междусвоими программными модулями, а вну| ренняя организация программы —личное дело программиста.

Сборочный метод предполагает накопление и использование библиотеквспомогательных алгоритмов, реализованных в языках программированияв виде подпрограмм, процедур, функций.

1.7. Развитие языков и технологий программирования

Язык программирования — это способ записи программ реше нияразличных задач на ЭВМ в «понятной» для компьютера фор ме. Процессоркомпьютера непосредственно служит для воспри

Page 36: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

•| I mi и пика машинных команд (ЯМК). Однако, программы на ЯМК ии чт()лтывались лишь для ламповых ЭВМ первого поколения. I |рш раммирование на ЯМК — дело непростое. Программист дол- шить числовые коды всех машинных команд и сам распреде- памятьпод команды программы и данные.

И 1950-х гг. появились первые средства автоматизации програм-мирования — языки автокоды. Позднее языки этого уровня стали нин.пшть ассемблерами. Языки типа автокода и ассемблера облегчи пнработу программистов. Переменные величины стали изобрази.символическими именами. Числовые коды операций заменилимнемоническими (словесными) обозначениями, которые легче шпомнить.При этом язык программирования стал понятнее щи человека, удалился отязыка машинных команд. Чтобы компь- инер мог исполнять программы наавтокоде, требовался специ- шн.ный переводчик — транслятор, т.е.системная программа, переводящая текст программы на автокоде в текстэквивалентной lipoi раммы на ЯМК.

Компьютер, оснащенный транслятором с автокода, понимает имюкод. Вэтом случае можно говорить о псевдо-ЭВМ (аппарату- ри I транслятор савтокода), языком которой является автокод. Н и.1ки типа автокода иассемблера являются машинно-ориентированными, т.е. они настроены наструктуру машинных команд► он к ротного компьютера. Разные компьютеры с различными ти-пмми процессоров имеют разный ассемблер. Языки программированиивысокого уровня (ЯПВУ) являются машинно-независимыми, г. с. одна и таже программа на таком языке может выполнятся ни ЭВМ разных типов,оснащенных соответствующим транслятором. Форма записи программ наЯПВУ по сравнению с автокодом ближе к традиционной математическойформе и естественному N нику. Например, программа на языке Паскальпочти такая же, »• «к на школьном алгоритмическом языке. ЯПВУ легкоподдаются и (учению и хорошо поддерживают структурную методику про-фмммирования.

11ервыми популярными языками высокого уровня, появивши- миеи в1950-х гг., были Фортран, Кобол (в США) и Алгол (в I иропе). ЯзыкиФортран и Алгол были ориентированы на научно технические расчетыматематического характера. Кобол — это к шк для программированияэкономических задач, в котором слабее развиты математические средства,однако хорошо развиты сред-I I на обработки текстов и лучше организован вывод данных в форме Iребуемого документа. Для первых ЯПВУ была характерна пред- а яориентация.

Ьольшое число языков программирования появилось в 1960 — 1470 хгг. (за всю историю существования ЭВМ их было создано Понсе тысячи),однако распространились и выдержали испытания мременем немногие.

35

Page 37: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В 1965 г. в Дартмутском университете был разработан язык Бейсик. Позамыслу авторов это должен был быть простой язык, легко изучаемый,предназначенный для программирования несложных расчетных задач.Наибольшее распространение Бейсик получил на микроЭВМ иперсональных компьютерах. На первых моделях школьных компьютеровпрограммировать можно было только на языке Бейсик, однако этонеструктурный язык, и поэтому он плохо подходит для обучениякачественному программированию. Справедливости ради следует заметить,что более поздние версии Бейсика для персональных компьютеров (ПК),например QBasic, стали более структурными и по своим изобразительнымвозможностям приблизились к таким языкам, как Паскаль.

В эпоху ЭВМ третьего поколения большое распространение получилязык PL/1 (Program Language One), разработанный фирмой IBM. Это былпервый язык, претендовавший на универсальность, т.е. на возможностьрешать любые задачи: вычислительные, обработки текстов, накопления ипоиска информации. Однако PL/1 оказался слишком сложным языком. Длямашин типа IBM 360/370 транслятор с языка PL/1 оказался недостаточнооптимальным, и содержал ряд не выявленных ошибок. Для мини- имикроЭВМ язык PL/1 вообще не получил распространения. Однако линияна универсализацию языков программирования была поддержана: былиразработаны универсальные версии старых языков: Алгол-68 и Фортран-77.

Значительным событием в истории языков программирования сталосоздание в 1971 г. языка Паскаль как учебного языка структурногопрограммирования.

Широкое распространение языку Паскаль обеспечили персональныекомпьютеры. Фирма Borland International, Inc (США) разработала системупрограммирования ТурбоПаскаль для ПК. ТурбоПаскаль — это не толькоязык и транслятор с него, но еще и интегрированная средапрограммирования, обеспечивающая пользователю удобство работы наязыке Паскаль. ТурбоПаскаль вышел за рамки учебного предназначения истал языком профессионального программирования с универсальнымивозможностями. Транслятор с ТурбоПаскаля по оптимальностисоздаваемых им программ близок к лидеру по этому качеству —транслятору с Фортрана. В силу своих достоинств Паскаль сталисточником многих основных современных языков программирования,например Ада, Модула-2 и др.

Язык программирования Си (английское название — С) создавался какинструментальный язык для разработки операционных систем,трансляторов, баз данных и других системных и прикладных программ.Так же, как и Паскаль, язык Си — это язык структурногопрограммирования, но в отличие от Паскаля в нем заложены возможностинепосредственного обращения к некото

36

Page 38: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

рым машинным командам и к определенным участкам памятиI имш.ютера.

Мндула-2— это еще один язык, предложенный Н.Виртом, миииющийсяразвитием языка Паскаль и содержащий средства для с шшшми большихпрограмм.

ЖМ будущего — пятого — поколения называют машинамиИскусственного интеллекта. Но прототипы языков для этих машин былисозданы намного раньше их физического появления. )и> я 1 ыки ЛИСП иПролог.

I 1срвое упоминание о языке ЛИСП относится к 1958 г. Создан им наоснове понятия рекурсивно определенных функций. Апо-

• кильку доказано, что любой алгоритм может быть описан с помощьюнекоторого набора рекурсивных функций, то ЛИСП по | yin являетсяуниверсальным языком. Сего помощью на ЭВМ ми* 110 моделироватьдостаточно сложные процессы, в частности им и.\ллектуальнуюдеятельность людей. Парадигму программиро-...... . реализованную в языке ЛИСП, называют функциональнымп I'o, ■ /шммированием.

Язык Пролог разработан во Франции в 1972 г. также для решения

проблем искусственного интеллекта. Этот язык позволяет в формальномвиде описывать различные утверждения, логику рассуждений и заставляетЭВМ давать ответы на заданные вопросы.II языке Пролог реализована логическая парадигма программировали.

И конце XX в. новым значительным направлением в развитиипрограммного обеспечения ЭВМ стал объектно-ориентированный подход.Объекты — это структуры, объединяющие в единое целое мипые ипрограммы их обработки. Приобрели популярность объек- I ноориентированные операционные системы (например, Windows),прикладные программы, а также системы объектно-ориентированногопрограммирования (ООП).

11ервым языком с элементами объектно-ориентированной технологиипрограммирования был язык Симула-67. Развитие языка

* и привело к появлению его объектно-ориентированной версии подназванием Си++. В Турбо Паскале, начиная с версии 5.5, также появилисьсредства ООП.

И последнее время возникло новое направление в технологиипрограммирования — визуальное. Стали создаваться системы визуальногопрограммирования, работающие под Windows, исполь- кжание которых, вчастности, позволяет легко и быстро про- I рмммировать сложныйграфический интерфейс. Появились визуальные версии популярных языковпрограммирования: Visual Basic, I )elphi (развитие ТурбоПаскаля), BorlandC++ Builder и др.

Способы трансляции. Реализовать тот или иной язык програм-мирования на ЭВМ — это значит создать транслятор с этого языка дляданной ЭВМ. Существует два принципиально различных

37

Page 39: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

метода трансляции — компиляция и интерпретация. Для объясненияразличия этих методов можно предложить следующую аналогию: лектордолжен выступить перед аудиторией на незнакомом ей языке. При этомвозможны:• полный предварительный перевод, т.е. лектор заранее передает текствыступления переводчику, тот записывает перевод, размножает его ираздает слушателям (после чего лектор может и не выступать);• синхронный перевод, т.е. лектор читает доклад, а переводчикодновременно с ним слово за словом переводит выступление.

Компиляция является аналогом полного предварительного перевода, аинтерпретация — аналогом синхронного перевода. Транслятор,работающий по принципу компиляции, называется компилятором, атранслятор, работающий по принципу интерпретации, —интерпретатором.

При компиляции в память ЭВМ загружается программа-компилятор.Она воспринимает текст программы на ЯПВУ как исходную информацию,которая называется исходным модулем, загружаемым из текстового файла.После обработки компилятором программы на ЯПВУ получают объектныймодуль. Следующий этап обработки программы, называемыйредактированием связей (или линкованием), выполняет специальнаяпрограмма — редактор связей. Этот редактор подключает к исходнойпрограмме необходимые для ее работы программные модули: процедуры,функции и др., в результате чего получают загрузочный модуль —программу на языке машинных команд, готовую к выполнению. При этом воперативной памяти остается только программа на ЯМК, выполнениекоторой и дает искомые результаты.

Интерпретатор в течение всего времени работы программы находитсяво внутренней памяти — оперативном запоминающем устройстве (ОЗУ),куда помещается и программа на ЯПВУ. Интерпретатор впоследовательности выполнения алгоритма считывает очередной операторпрограммы, переводит его в команды и тут же выполняет эти команды,после чего переходит к переводу и выполнению следующего оператора.При этом результаты предыдущих переводов в памяти не сохраняются, т.е.при повторном выполнении одной и той же команды она снова будеттранслироваться.

При компиляции исполнение программы включает в себя три этапа:компиляцию, линкование и выполнение. При интерпретации, посколькутрансляция и выполнение совмещены, обработка программы на ЭВМпроходит в один этап. Однако откомпилированная программа выполняетсябыстрее, чем интерпретируемая, поэтому использование компиляторовудобнее для больших программ, требующих быстрого счета. Программы наязыках Паскаль, Си, Фортран всегда компилируются. Бейсик чаще всегореализу-

38

Page 40: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

г и н через интерпретатор. Некоторые языки имеют реализацию кик черезкомпилятор, так и через интерпретатор. В режиме ин- цриретации удобноотлаживать программу, а рабочие расчеты лучше осуществлять в режимекомпиляции.

1.8.Структура и способы описания языков программирования высокого уровня

Но всех языках программирования определены способы орга- ни шцииданных и действий над данными. Кроме того, сухцеству- || ч шсментыязыка, включающие в себя множество символов (ал- фпиит), лексемы идругие изобразительные средства программи- |1 ииамия. Несмотря наразнообразие языков программирования ин изучение происходитприблизительно по одной схеме. Это обу- I и пшено общностью структурыязыков высокого уровня (рис. 1.14).

Описание в данном учебном пособии языков Паскаль и Delphi Пунегвыполняться в соответствии с этой схемой.< ледует отметить сходство изучения естественных языков и и никовпрограммирования. Во-первых, для того чтобы читать и пт .iib наиностранном языке, надо знать алфавит этого языка. Ни нторых, следуетзнать правила написания слов и предложений, т.е. синтаксис языка. В-третьих, необходимо понимать• мысл слов и фраз, чтобы адекватно реагировать на них. Например, всалоне самолета засветилось табло «Fasten belts!» (За-• H I ните ремни!). Зная английскую грамматику, можно правиль-

Рис. 1.14. Структура языка программирования высокого уровня

39

Page 41: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

но прочитать эту фразу, однако не понять ее смысл и, следовательно, невыполнить соответствующих действий. Из грамотно написанных словможно составить абсолютно бессмысленную фразу. Смысловое содержаниеязыковой конструкции называется семантикой.

Любой язык программирования образуют три основные составляющие:алфавит, синтаксис и семантика.

Соблюдение правил в языке программирования должно быть болеестрогим, чем в разговорном языке. Человеческая речь содержитзначительное количество избыточной информации, т.е. не расслышав какое-то слово, можно понять смысл фразы в целом. Слушающий или читающийчеловек может додумать, дополнить, исправить ошибки в воспринимаемомтексте.

Компьютер же — это автомат, воспринимающий все «всерьез». Втекстах программ нет избыточности и компьютер сам не исправит дажеочевидной (с точки зрения человека) ошибки. Он может лишь указатьместо, которое «не понял» и вывести замечание о предполагаемомхарактере ошибки. Исправить же ошибку должен программист.

Для описания синтаксиса языка программирования также необходимкакой-то язык, т.е. метаязык (надьязык), предназначенный для описаниядругих языков. Наиболее распространенными метаязыками в литературе попрограммированию являются металингвистические формулы Бэкуса—Наура(язык БНФ) и синтаксические диаграммы. Далее мы будем использовать восновном язык синтаксических диаграмм, так как они более наглядны илегче воспринимаются. Однако, когда это будет удобно, будем применять инекоторые элементы языка БНФ.

В БНФ всякое синтаксическое понятие имеет вид формулы, состоящейиз правой и левой частей, соединенных знаком «::=», смысл которогоэквивалентен фразе «по определению есть». Левая часть формулысодержит имя определяемого понятия (метапеременную), заключенное вугловые скобки о, а правая часть — формулу или диаграмму,определяющую все множество значений, которое может приниматьметапеременная.

Синтаксис языка создается посредством последовательного усложненияпонятий, т.е. сначала определяются простейшие (базовые) понятия, а затемвсе более сложные, включающие в себя предыдущие понятия каксоставляющие.

В такой последовательности, очевидно, конечным определяемымпонятием должна быть «программа».

При записи метаформул приняты определенные соглашения. НапримерБНФ, определяющая понятие «двоичная цифра», имеет вид

Сдвоичная цифра> ::= 0 | 1

40

Page 42: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

нпичнпи цифра» ^___________ <Двоичный код>

Т*®—iL—0—

<Двоичная цифра>

Гl*in I 15. Синтаксическая диа- Рис. 1.16. Синтаксическая диаграммаишмма двоичной цифры двоичного кода

1нак «|» здесь эквивалентен слову «или» (либо).Синтаксическая диаграмма двоичной цифры показана на | 1.15.Н них диаграммах стрелки указывают на последовательность |

Niuположения элементов синтаксической конструкции, а кружкамиобведены символы, присутствующие в данной конструкции.

11онятие «двоичный код» как непустая последовательность двоичныхцифр в БНФ описывается следующим образом:

■ двоичный код> ::= <двоичная цифра> | <двоичный

к< (дхдвоичная цифра>

< )нределение, в котором некоторое понятие определяется само черезсебя, называется рекурсивным. Рекурсивные определения ха- |шк горны дляБНФ.

( интаксическая диаграмма двоичного кода представлена на рис. 1.16.Здесь возвратная стрелка обозначает возможность мно- ратногоповторения.

(Невидно, что синтаксическая диаграмма более наглядна, чем 1.НФ.

Упражнения

I Определить значение логического выражения НЕ (X > Z) И НЕI V Y) при следующих значениях переменных: а) Х= 3, Y= 5, Z= 2;Г.) X = О, Y= 1, Z= 19;и) Х= 5, Y = О, Z = -8; г) Х= 9, У = -9, Z= 9.

2. Записать логические выражения (формулы), являющиеся истиннымипри следующих условиях:

а) точка с координатами (X, У) принадлежит первой четверти еди-ничного круга с центром в начале координат;

Г») точка с координатами (X, У) не принадлежит единичному кругу Iиеитром в начале координат и принадлежит кругу с радиусом, равным 2, и I'центром в начале координат (изобразите это графически).

У Даны декартовы координаты трех вершин треугольника на плоскости, Составить алгоритм определения площади треугольника.

41

Page 43: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

4. Дана скорость ракеты при выходе за пределы атмосферы Земли.Составить алгоритм определения движения ракеты после выключениядвигателей. (Значения трех космических скоростей: 7,5 км/с; 11,2 км/с; 16,4км/с.)5. Даны три положительных числа. Составить алгоритм, определяющий,могут ли эти числа быть длинами сторон треугольника?6. Пусть компьютер способен выполнять только две арифметическиеоперации: сложение и вычитание. Составить следующие алгоритмы:

а) умножения двух целых чисел;б) целочисленного деления двух чисел;в) получения остатка от целочисленного деления двух чисел.

7. Построить алгоритм решения биквадратного уравнения, используя вкачестве вспомогательного алгоритм решения квадратного уравнения.8. Составить алгоритм нахождения НОД трех натуральных чисел, ис-пользуя вспомогательный алгоритм нахождения НОД двух чисел.

Page 44: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ГЛА ВА 2

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПАСКАЛЬ

2.1. Первое знакомство с языком Паскаль<' груктура программы на языке Паскаль. По определению стан-

Шфпюго языка Паскаль программа состоит из заголовка и тела (Лини/), вконце которого следует точка — признак конца про- i |мммы. В своюочередь, блок содержит разделы описаний и раздел чт/шторов:

I’rogram <имя программы>;

l. nbel <раздел меток>;

Const <раздел констант>;

Тур* <раздел типов>;

Var <раздел переменных>;

I’tocedure (Function) <раздел подпрограмму

Begin

43

Page 45: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ните алгоритм деления простых дробей, записанный на АЯ, ссоответствующей программой на Паскале:

Program Division;Var a,b,c,d,m,n : Integer;Begin ReadLn (a, b, c, d) ; m := a *

K O H End.

Здесь учтено следующее математическое равенство:

а с _ a- d b d

be

Эту программу можно понять даже не заглядывая в учебник языкаПаскаль, особенно зная английский язык.

Заголовок программы начинается со слова Program (программа), закоторым следует произвольное имя, придуманное программистом (Division— деление). Раздел описания переменных начинается со слова Var(variables — переменные), за которым следует список переменных. Типуказывается после двоеточия словом Integer (целый). Начало и конецраздела операторов программы отмечаются словами Begin (начало) и End(конец). В конце программы обязательно ставится точка.

Ввод исходных данных с клавиатуры производится с помощьюпроцедуры ReadLn (read line — считывать строку). На клавиатуре набираютчетыре числа, отделяемые друг от друга пробелами, которые отражаютсястрокой на экране дисплея, и нажимают клавишу ввода.

Операторы присваивания в Паскале записываются так же, как в АЯ.Знак умножения обозначается звездочкой (*).

Вывод результатов на экран дисплея производится с помощьюпроцедуры WriteLn (write line — писать в строку), которая выводит встроку два целых числа шип. После этого курсор на экране переходит вначало следующей свободной строки, и работа программы завершается.

Необходимо строго соблюдать правила правописания — синтаксиспрограммы. В частности, в Паскале однозначно определено назначениезнаков пунктуации:• точка с запятой (;) ставится в конце заголовка программы, в концераздела описания переменных, после каждого оператора. Перед словомEnd точку с запятой можно не ставить;• запятая (,) является разделителем элементов во всевозможныхсписках (списке переменных в разделе описания, списке вводимых ивыводимых величин).

44

Page 46: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

| грогий синтаксис в языке программирования необходим, Н|Х'Жлсвсего, для транслятора. Транслятор — это программа, кон < 1 >нчисполняется формально. Если, допустим, разделителем в• пт кс переменных должна быть запятая, то любой другой знак в ней будетвосприниматься как ошибка. Если точка с запятой явим- и н разделителемоператоров, то транслятор в качестве операции воспринимает всю частьтекста профаммы от одной точки с Ининой до другой. Следовательно, еслине поставить точку с зашипи между какими-то двумя операторами,транслятор будет принимать их за один, т.е. неизбежна ошибка.

Основное назначение синтаксических правил — это придание однотачного смысла языковым конструкциям. Если какая-то конструкция можеттрактоваться двусмысленно, значит, в ней есть ошибка. Поэтому лучше неполагаться на интуицию, а выучить Правила языка.

М и лее будет дано строгое описание синтаксических правил Пас- |ШЛИ, а пока для получения первоначального представления о языкепОрагимся еще к нескольким примерам программирования не- I и 1 * 1 и,|халгоритмов.

■•< ^транслируем» алгоритм вычисления факториала (TV!) на н инкеПаскаль:

•лг факториал Program Factorial;

цел N, I, F Var N, I, F: Integer;

нач ввод(Ы) Begin ReadLn(N);

F := 1 F := 1;

I := 1 I := 1;

пока I <= N While I <= N Do

45

Page 47: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 x2 =', x2) ;

Во-вторых, из примера видно, что в Паскале нет специальных слов дляобозначения начала цикла (нц) и конца цикла (кц). На все случаи естьслужебные слова Begin и End.

Рассмотрим еще один пример программы решения квадратногоуравнения:

алг корни; Program Roots;

вещ а, Ь, с, d, xl, х2 Var а,b, с, d, xl, х2 : Real; нач Begin {Ввод данных сконт

ролем}повторять Repeat

вывод «Введите a,b,c; WriteLn(1 Введите а, Ь, с;

а * 0») аоО ') ;

ввод а, Ь, с ReadLn(а, Ь, с)до а * 0 Until а О 0;

d ЬА2 — 4ас {Вычисление дискриминанта}

d := b*b - 4*а*с; если d > 0 If d >= 0то Then Begin {Есть корни}

End

иначе вывод «Нет вещест- Else WriteLn('Нет вещественных корней»венных корней') кв End. кон

В этой программе по сравнению с приведенными ранее, появилосьмного новых элементов. Имя вещественного типа данных в Паскале —Real.

Цикл с постусловием (цикл «До») программируется оператором

Repeat <тело цикла> Until <условие окончания>

Repeat — повторять, Until — до. Тело цикла может представлять собойкак одиночный, так и составной оператор, однако употребления слов Beginи End не требуется, поскольку слова Repeat и Until сами выполняют рольоператорных скобок.

Знак * (не равно) в Паскале имеет обозначение о, а знак > (больше илиравно) обозначается >=.

Правила записи арифметических выражений будут подробнорассмотрены немного позже. Используемая в формулах вычислениякорней стандартная функция квадратного корня ( J x ) , в Паскалезаписывается в виде sqrt (х). Порядок выполнения операций в вы-

46

Page 48: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

г.I * i ими определяется скобками и старшинством операций. Старики иню операций определяется так же, как в алгебре. Операции...... . по старшинству выполняются в порядке их записии 'и ми направо).

Нетление в Паскале программируется с помощью условного im/iumopa,имеющего следующую форму:

If •условие> Then <оператор 1> Else соператор 2>

If если, Then — то, Else — иначе. Операторы 1 и 2 могут быть какодиночными, так и составными. Составной оператор следует и к лючлть воператорные скобки Begin и End.I....нк же, как и в алгоритмическом языке, возможно использо- игнеполной формы условного оператора:

If •условие> Then <оператор>

Характерной чертой данной программы является использование итексте комментариев. Комментарий — это любая последова- li»iiiaiocTi>символов, заключенных в фигурные скобки {...}. МожноI ик *с использовать в качестве ограничителей комментариев круглыескобки со звездочками (*...*). Комментарий не определяет никакихдействий программы, а является лишь пояснительным it м юм. Он можетдаваться в любом месте программы, где можно Н<п гаиить пробел.Программист пишет комментарии не для ком- шаип-ра, а для себя,придавая тексту программы большую яс- Iин н>.

Хорошо откомментированные программы называют самодоку-мпмнрованными. В некоторых программах объем комментариевнргнышает объем вычислительных операторов.

Удачное использование комментариев — признак хорошего стиляпрограммирования.

Дни ныполнения программы на ЭВМ ее следует ввести в па- мчти,оттранслировать и исполнить. Для этого на компьютере дол- *им иметьсяспециальные средства программного обеспечения, на ПКсоставляют систему ТурбоПаскаль.

Упражнения

*| >ттранслировать» с алгоритмического языка на язык Паскаль:it) алгоритм Евклида;П) алгоритм выбора большего значения из трех;и) алгоритм определения существования треугольника с заданными

шишами сторон;I) алгоритм умножения двух целых чисел, ограничиваясь только опе- |

нн111нмм сложения и вычитания;47

Page 49: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2.2. Некоторые сведения о системе ТурбоПаскаль

Название ТурбоПаскаль имеет два смысловых значения:• диалект, представляющий собой расширение стандартного языкаПаскаль;• система программирования ТурбоПаскаль, являющаяся со-вокупностью системных программ, предназначенных для создания,отладки и выполнения Паскаль-программ.

Далее будем рассматривать именно ТурбоПаскаль, так как онреализован на основных типах персональных компьютеров (IBM PC исовместимых с ними).

Во избежание терминологической путаницы договоримся, что названиеТурбоПаскаль означает язык программирования, а стандартный Паскальвходит в ТурбоПаскаль как подмножество. Поэтому далее везде, где речьбудет идти о расширенных возможностях турбоварианта по сравнению состандартным, это будет оговариваться.

Система программирования ТурбоПаскаль, или турбосистема,обеспечивает удобную операционную обстановку для работы про-граммиста. Ее назначение — предоставлять пользователю необходимыесредства работы с Паскаль-программой.

Система ТурбоПаскаль (как язык программирования и как опе-рационная оболочка) значительно изменилась за историю своегосуществования. Первый ее вариант фирма Borland выпустила в середине1980-х гг. Впоследствии этой фирмой было создано шесть модификацийсистемы, известных как версии 3.0, 4.0, 5.0, 5.5, 6.0, 7.0. Каждая из нихпредставляет собой усовершенствованную предыдущую версию. Все онисоздавались для семейства машин IBM PC И совершенствовались вместе сними.

Версия 3.0 ориентирована на ПК малой мощности (IBM PC/XT).Разрабатываемые на ней программы имеют ограничение на длину (не более64 Кбайт), в ней нет средств раздельной компиляции взаимосвязанныхпрограмм и ее операционная среда весьма несовершенна.

Большие изменения были внесены в версию 4.0. Появилисьсовременная диалоговая среда, средства раздельной компиляциипрограммных модулей, мощная графическая библиотека.

Версия 5.0 отличается в основном дальнейшим усовершенствованиемсреды, к которой добавлен встроенный отладчик. В эту версию впервыебыли включены средства поддержки объектноориентированногопрограммирования — современной технологии создания программ.

Главные отличия версии 6.0 — это наличие новой среды, ори-ентированной на работу с устройством ввода типа «мышь» и ис-пользующей многооконный режим работы, наличие объектно-ори-ентированной библиотеки Turbo Vision, а также возможности включения втекст программы команды ассемблера.

48

Page 50: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Мерсия 7.0 не содержит каких-то принципиальных новшеств ни1 1 >,чтению с версией 6.0. В ней введены некоторые расширения к м.м . 1

программирования, а также дополнительные сервисные возможностисистемной оболочки.

Программа на ТурбоПаскале проходит три этапа обработки:• со щание текста программы;• компиляция;• исполнение откомпилированной программы.II соответствии с этими функциями турбосистема включает в Mini грмглавных компонента: редактор текстов, компилятор и in мониительнуюсистему.< помощью встроенного в систему текстового редактора можноформировать в памяти любые тексты, а не только программы H I 11аскале.В частности, это могут быть исходные данные решае- мо|| идачи втекстовой форме. Текст программы, созданный ре- ник юром, можносохранить на диске в виде файла с именем слепую i не го формата:

■ими файла>.РАБ

I 'AS — это стандартное расширение имени файла, созданного• ишемным редактором. Имя файла задается пользователем.

()<>ращение к текстовому редактору происходит по команде Edit.Компилятор переводит программу с языка Паскаль на язык машинных

команд. При этом осуществляется контроль правильна, ш написанияпрограммы, т.е. выполнения правил языка про- I рпммирования(синтаксический и семантический контроль). При мПпнружении ошибкикомпьютер выдает о ней сообщение пользо- маюню и прекращает работу.Программа, полученная в результате компиляции, может быть сохраненана диске в файле с именем | немующего формата:

■ имя файла>.ЕХЕ

Работа компилятора инициируется системной командой Сога- 1>11а.Исполнение откомпилированной программы производится по команде

Run. При этом исполнение программы остается под кон- фопемтурбосистемы, которая, в частности, помогает обнаружим. ошибку впрофамме, если при исполнении произошел сбой. I In n, ювателюсообщается причина сбоя и его место в Паскаль- нрофпмме, после чегопроисходит автоматический возврат в режим редактирования.II более поздних версиях ТурбоПаскаля имеется система отлад-I и (l)ebug), с помощью которой можно просмотреть на экране нмченислюбой переменной, найти значение любого выражения,

49

Page 51: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

установить новое значение переменной. Можно также прерыватьвыполнение программы в указанных местах, называемых контрольнымиточками. Система отладки существенно облегчает программисту поискошибок.

Подробные сведения о работе с конкретными версиями ТурбоПаскаляможно найти в специальной литературе.

2.3. Элементы языка ТурбоПаскаль

Алфавит. Алфавит языка ТурбоПаскаль включает в себя буквы, цифрыи специальные символы:• латинские буквы от А до Z (прописные) и от о до г (строчные);• цифры 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;• шестнадцатеричные цифры 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F;• специальные символы + - * / = < > [ ] . , ( ) : ; { } л @ $ # .

Следующие комбинации специальных символов являются единымисимволами, которые нельзя разделять пробелами:

:= знак присваивания;>= больше или равно;<= меньше или равно;о не равно;(* *) ограничители комментариев (наряду с { });(. .) эквивалент [ ].

Пробелы — это символ пробела (ASCII-32) и все управляющие символыкода ASCII (от 0 до 31).

К специальным символам относятся также служебные слова, смыслкоторых определен однозначно и которые не могут быть использованы длядругих целей. Для языка — это единые символы.

Служебные слова языка ТурбоПаскаль: absolute, and, array, begin, case,const, div, do, downto, else, end, external, file, for, forward, function, goto, if,implementation, in, inline, interface, interrupt, label, mod, nil, not, of, or,packed, procedure, program, record, repeat, set, shl, shr, string, then, to, type,unit, until, uses, var, while, with, xor.

Последние версии языка ТурбоПаскаль содержат также ряд служебныхслов, относящихся к работе с объектами и встроенным ассемблером.

Идентификаторы. Идентификатором называется символическое имяопределенного программного объекта: константы, переменные, типыданных, процедуры, функции, программы. С помощью синтаксическойдиаграммы идентификатор можно представить в виде, показанном на рис.2.1.

50

Page 52: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

<Буква>

<Буква>

Рис. 2.1. Синтаксическая диаграмма идентификатора

I’acшифровать диаграмму можно следующим образом: иденти- фикшор— это любая последовательность букв и цифр, начинаю- iinnii и с буквы.В ТурбоПаскале к буквам приравнивается также так подчеркивания.<'срочные и прописные буквы в идентификаторах и служебных• HI пых не различаются. Например: max, МАХ, МаХ, тАх — одно п ю жеимя.И ТурбоПаскале длина идентификатора может быть произвольной, нозначащими являются только первые 63 символа.Комментарии. Конструкции следующего вида представляют со- ПоИкомментарии и поэтому игнорируются компилятором:

liVKiibi русского алфавита употребляются только в комментарии ч,литерных и текстовых константах.* фока, начинающаяся с символов «{$» или «(*$», является iht/irhтивой компилятора. За этими символами следует мнемоника командыкомпилятора.

2.4. Концепция типов данных

Концепция типов данных является одной из центральных в нмПом языкепрограммирования. С типом величины связаны три И I аойства: формавнутреннего представления, множество принимаемых значений имножество допустимых операций. Турбо-11 in каль характеризуется большим разнообразием типов данных(рис. 2.2).

И стандартном Паскале отсутствует строковый тип данных. Кроме......., а ТурбоПаскале целые и вещественные — это группы типовминных. В более поздних версиях ТурбоПаскаля существуют про- inаурный тип данных и тип данных «объект».Кпждый тип данных имеет свой идентификатор.И шбл. 2.1 представлена информация о простых типах данных,определенных в ТурбоПаскале. Для вещественных типов данных в |коГжах указано количество сохраняемых значащих цифр мантис-

51

Page 53: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Идентификатор Длина, байт Диапазон (множество) значений

Целые

Integer 2 -32768..32767

Byte 1 0..255

Word 2 0..65535

Shortint 1 -128. .127

Longint 4 -2147483648. .2147483647

Вещественные

Real 6 2,9 10-39— 1,7 1038 (11 — 12)

Single 4 1,5 • 10-45—3,4 • 1038 ( 7 -8)

Double 8 5 .10 - 3 2 4 —1, 7- 10308 (15 — 16)

Extended 10 3,4 -КН» 2 —1, 1 ■ 104932 (19-20 )

Логический

Boolean 1 True, False

Символьный

Char 1 Все символы кода ASCII

Page 54: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В стандартном Паскале из вещественных типов определен только типReal, а из целых — Integer.

Типы данных Single, Double, Extended употребляются в Паскаль-программах только в том случае, если ПК снабжен сопроцессором«плавающей арифметики». (Для процессоров IBM PC, начиная с Intel-80486 и далее, это условие всегда выполняется.)

Тип данных называется порядковым, если состоит из счетного числазначений, которые можно пронумеровать. Отсюда следует, что для этогомножества значений существуют понятия «следующий» и «предыдущий».

Описание переменных. Для всех переменных величин, используемых впрограмме, должны быть указаны их типы в разделе переменных. Структурараздела переменных показана на рис. 2.3.

Пример раздела переменных программы:

Var m, n, k : Integer; х, у, z : Real;

Symbol : Char;

Константы. Тип константы определяется по контексту, т.е. по форме еезаписи в программе.

Целые десятичные константы записывают в обычной форме целогочисла со знаком или без знака. Например: 25, -24712, 376.

Целые шестнадцатеричные константы записывают с префиксом «$».Они должны находиться в диапазоне от $00000000 до $FFFFFFFF.

Вещественные константы с фиксированной точкой записывают вобычной форме десятичного числа с дробной частью. Разделителем целойи дробной частей является точка. Например: 56.346, 0.000055, -345678.0.

Вещественные константы с плавающей точкой имеют следующуюформу:

<мантисса>Е<порядок>

< Раздел переменных>Var ——*- «Эписание переменных>

----о -—53

Page 55: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

<Раздел констант>

Const <Описание константы>

<Описание констаь

Символьная константа — это любой символ алфавита, заключенный вапострофы. Например: 'W, Т, '9'.Логическая константа — это слова: True, False.Строковая константа — это строка символов, заключенная в апострофы.Например: 'TurboPascal', 'Ответ: ', '35-45-79'. Максимальная длинастроковой константы 255 символов.Константе может быть поставлено в соответствие определенное имя,назначение которого производится в разделе констант программы.Например:

Const

Мах = 1000;

G = 9.81;

Описание типизированной константы приведено на рис. 2.5.В ТурбоПаскале имеется ряд имен, зарезервированных за оп-

ределенными значениями констант, которые можно использовать безпредварительного определения в программе (табл. 2.2).

Типы данных пользователя. Один из принципиальных моментов языкаПаскаль состоит в том, что пользователю разрешается

12.67;

I * I .

<Типизированная константа>

<Константа>

Рис. 2.5. Описание типизированной константы

54

Page 56: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Идентификатор Тип Значение

True Boolean ИСТИНА

False Boolean ЛОЖЬ

Maxlnt Integer 32767

определять свои типы данных. Причем типы данных пользователя всегдабазируются на стандартных типах данных Паскаля.

Для описания типов данных пользователя в Паскале существует разделтипов, структура которого представлена на рис. 2.6.

Данные перечисляемого типа (рис. 2.7) задаются непосредственноперечислением всех значений, которые может принимать переменнаяданного типа.

Определенное имя типа данных затем используется для описанияпеременных. Например:

Type Gaz = (С, О, N, F);

Metal = (Fe, Со, Na, Си, Zn) ;

Var Gl, G2, G3: Gaz;

<Раздел типов> _ - - -Туре ■ «Эписание типа>

— О —<Описание типа> ^----------------------------»- <Имя типа>--------► (=) ---------► <Тип>------------►

Рис. 2.6. Структура раздела типов данных

<Перечислимый тип> . /т\----------------------------(JJ --------—»- <Идентификатор>------—•- ^

---о -—55

Page 57: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

няемым к константам. Каждое значение в перечисляемом типе занимает впамяти 2 байт, поэтому число элементов не должно превышать 65 535.Перечисляемый тип данных — упорядоченное множество. Его элементыпронумерованы, начиная от 0 в порядке следования в описании.В программе, в которой имеется приведенное ранее описание, возможеноналичие следующего фрагмента:

If Day = Sun Then WriteLn('Ура! Сегодня выходной!');

Данные интервального типа (рис. 2.8) задаются как упорядоченноеограниченное подмножество некоторого порядкового типа.Порядковый номер первой константы не должен быть больше номера второйконстанты в данных соответствующего базового типа.При исполнении программы автоматически контролируется принадлежностьзначений переменной интервального типа установленному диапазону. Привыходе из диапазона исполнение программы прерывается. Например:

Type Numbers 1..31;

Alf = 1А'..'Z';

Var Data: Numbers;

Bukva: Alf;

2.5. Арифметические операции, функции, выражения.

Оператор присваивания

К арифметическим типам данных относятся группы вещественных и целыхтипов данных. К ним применимы арифметические операции и операцииотношений.Различают операции над данными унарные (применимые к одному операнду)и бинарные (применимые к двум операндам).Унарная арифметическая операция одна — это операция изменения знакаследующего формата:

— <величина>.56

Page 58: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Знак Выражение Типы операндов Тип результата Операция

+ А+ВR, R I, I

I, R; R, I

R

I

R

Сложение

А-ВR, R I, I I, R; R, I R

I

R

Вычитание

* А* ВR, R I, I I, R; R, I R

I

R

Умножение

/ А/В R, R R Вещественное

I, II, R; R, I

R

R

div A div В I, I I Целое деление

<Остаток от целого

деленияmod A mod D I, I 1

1---о---1

К арифметическим величинам могут быть применены стандартные функцииязыка Паскаль. Структура обращения к функции представлена на рис. 2.9.

Функция в выражении выступает как операнд. Например, в оператореприсваивания

X := 2 * sin(А)/1п(3.5) + cos(С - D)

операндами являются три функции: sin, In, cos, записываемые так же, как вматематике. Аргументы называются фактическими параметрами, являются вобщем случае выражениями арифметического типа и записываются в круглыхскобках. Результатом вычисления функции является величинасоответствующего типа.

Табл. 2.4 содержит описания стандартных математических функцийТурбоПаскаля.

< Функция > <^мя фуНКЦИИ>_^«Фактический параметр>—р»- (7)-

Page 59: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Обращение Типаргумента

Типрезультата

Функция

Pi — R Число к = 3.1415926536Е+00

abs (х) I, R I, R Модуль аргумента х

arctan (х) I, R R Арктангенс х, рад

cos (х) I, R R Косинус х, рад

exp (х) I, R R е*— экспонента х

frac (х) I, R R Дробная часть х

int (х) I, R R Целая часть х

1п(х) I, R R Натуральный логарифм х

random R Псевдослучайное число в интервале [0, 1)

random (х) I I Псевдослучайное число в интервале [0, х)

round (х) R I Округление х до ближайшего целого

sin (х) I, R R Синус х, рад

sqr (х) I, R I, R Квадрат х

sqrt (х) I, R R Корень квадратный из х

trunc (х) R I Ближайшее целое, не превышающее х по модулю

Page 60: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

58

Для верной записи арифметических выражений следует соблюдатьопределенные правила.1. Все символы писать в строку, т.е. на одном уровне. Проставлять всезнаки операций, не пропуская знак «*».2. Не допускать записи двух знаков операций подряд, т. е. нельзя писать А+ -В, следует писать А + (-В).3. Операции с более высоким приоритетом выполняют раньше операций сменьшим приоритетом. Порядок убывания приоритетов операций следующий:• вычисление функции;• унарная операция смены знака (-);• *, /, div, mod;• +, -•4. Несколько записанных подряд операций с одинаковым приоритетомвыполняют последовательно слева направо.5. Часть выражения, заключенная в скобки, вычисляется в первую очередь.(Например, в выражении (А + В) * (С - D) умножение производится послесложения и вычитания.)6. Не следует записывать выражения, не имеющие математическогосмысла, например: деление на нуль, логарифм отрицательного числа и т.п.

Приведем пример. Арифметическое выражение, записанное по указаннымправилам (цифрами в кружке указан порядок выполнения операций),

© © © © © © © @ (П) © © ©

(1+у)*(2*х + sqrt(у) - (х + у))/(у + l/(sqrt(x) - 4))

соответствует следующей математической формуле:

2 x + Jy-(x +у)

(1 + JO-1

У + х2 -4

В Паскале нет операции или стандартной функции возведения числа впроизвольную степень. Для вычисления ху рекомендуется поступатьследующим образом:• если у — целое значение, следует использовать умножение, например: х3

х * х * х. Для больших степеней следует использовать умножение в цикле;• если у — вещественное значение, используется следующаяматематическая формула: ху = еу]пМ, запись которой на Паскале имеет вид

exp(Y * In(х))

59

Page 61: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

•<Арифметическое выражение>

Рис. 2.10. Структура арифметического оператора присваивания

Очевидно, что при вещественном типе у недопустимо нулевое илиотрицательное значение х. Для у целого типа такого ограничения нет.

!Например, формула На + 1 = (а + 1)3, записанная на Паскале будем

иметь вид

ехр(1/3 * In(А + 1))

Выражение имеет целый тип, если в результате его вычисления получаетсявеличина целого типа. Выражение имеет вещественный тип, еслирезультатом его вычисления является вещественная величина.Арифметический оператор присваивания имеет структуру, представленную нарис. 2.10.

Например, это может быть запись вида

Y := (F * N — 4.5)/cos(X).

Порядок выполнения оператора присваивания рассматривался ранее.Следует только обратить внимание на следующее правило: типы переменнойи выражения должны быть одинаковыми. Исключением является случай,когда выражение имеет целый тип, а переменная — вещественный.

Упражнения

1. Записать арифметические выражения на Паскале для следующих формул:а) а + bx + cyz; б) [(ах- b)x + с]х- d; в) а + + —;

с abг ) ,0-a-3lft е)

2. Записать математические формулы, соответствующие следующимвыражениям на Паскале:а) (р + q) / (г + s) - р * q/ (г * s) ;б) 1ЕЗ + beta/ (х - gamma * del ta) ;в) a /b * (с + d) - (а - b) /b /c + 1Е - 8 .3. Почему в Паскале аргумент функции всегда записывают в скобках, напримерпишут 1п(5), а не In 5?

60

Page 62: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

4. Записать соответствующие арифметические выражения на Паскале для следующих формул:

5. Вычислить значения следующих выражений:

а) t runc(6.9) ;б) t runc(6.2) ;в) 20 d iv 6 ;г) 2 d iv 5 ;д) round(6.9) ;е) round(6 .2) ;ж) 20 mod 6;з) 2 mod 5 ;и) 3 * 7 d iv 2 mod 7 /3 - t runc(s in(1)) .

6. Определить типы следующих выражений:

а) 1 + 0.0 ;б) 20/4 ;в) sqr(4) ;г) sqr t (16) ;Д) s in (0) ;е) t runc(-3.14) .

7. Определить, какие из следующих операторов присваивания правильные, если у— вещественная переменная, а я — целая:

а) у := n + 1;б) п : = у — 1;в) п := 4.0 ;г) у := t runc(у) ;д) у := n d iv 2 ;е) у := у d iv 2 ;ж) п := п/2 ;з) п := sqr(sqr t (п)) .

8. Поменять местами значения целых переменных х и у, не используядополнительные переменные. Определить недостаток найденного алгоритма посравнению с методом обмена значений через третью переменную. Можно ли применятьданный алгоритм для вещественных чисел?9. Присвоить целой переменной h значение цифры, стоящей в разряде сотен взаписи положительного целого числа к (например, если к =

10. Присвоить целой переменной S значение суммы цифр трехзначного целогочисла к.

11. Определить, какую задачу решает следующая программа:

а) (1 + х)2; б) V1 + х2; в) cos2*2;

ж) х'Я;

г) 1оё2тг;

д) arcsinx; е)ех + е х

з) 3/1 +х;

= 28 796, то h = 7).

61

Page 63: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Program Test;

Type Natur = l..MaxInt;

Var N : Natur;

X : Real;

Begin ReadLn(N);

X := 0;

While N > 0 Do Begin

X := X + 1.0;

N := N - 1 End;

WriteLn(X)

End.

Указать, можно ли полученный результат получить более простым способом.

2.6. Ввод данных с клавиатуры и вывод на экран

Ввод данных — это передача информации от внешних устройств воперативную память. Вводятся, как правило, исходные данные решаемойзадачи.

Вывод данных — это передача данных из оперативной памяти на внешниеносители (печать, дисплей, магнитные устройства и т.д.). Результаты решениялюбой задачи должны быть выведены.

Основными устройствами ввода-вывода персонального компьютераявляются клавиатура и дисплей (экран монитора). Именно через этиустройства, главным образом, осуществляется диалог между человеком и ПК.

Процедура ввода с клавиатуры имеет следующий формат:

Read(<cnncoK ввода>)

Здесь Ссписок ввода> — это последовательность имен переменных,разделенных запятыми, a Read (читать) — оператор обращения к стандартнойпроцедуре ввода. Например:

Read(а, Ь, с, d)

62

Page 64: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Var T : Real;

J : Integer;

К : Char;

Begin

Read(T, J, K);

на клавиатуре следует набрать

253.98 100 G [Enter].

Если в программе имеется несколько операторов Read, то данные для нихвводятся потоком, т.е. после считывания значений переменных для одногооператора Read данные для следующего оператора до окончания строкисчитываются из той же строки на экране, что и для предыдущего затемпроисходит переход на следующую строку. Например, при выполнении ввода впрограмме

Var А, В : Integer;

С, D : Real;

Begin

Read(А, В) ;

63

Page 65: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Оператор вывода на экран (обращение к стандартной процедуре вывода)имеет следующий формат:

Write(<список вывода>)

Здесь элементами списка вывода могут быть выражения различных типов(в частности, константы и переменные), напри мер:

Write (234); {Выводится делая кон

станта }

Write(А + В — 2); {Выводится результат

вычисления выражения)

Write(X, Summa, Argl, Arg2); {Выводятся значения

переменных}

При выводе на экран нескольких чисел в строку они не отделяются друг отдруга пробелами, об этом должен позаботиться программист. Пусть,например, I = 1; J = 2; К = 3. Тогда при вы полнении оператора

Write(I, ' ' , J, ' К);

на экране получим следующую строку: 12 3. Причем после вы водапоследнего символа курсор останется в той же строке, и следующий ввод наэкран будет начинаться с этой позиции кур сора.

64

Page 66: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Ынчсние I Оператор Результат

1 «4 Write (I) 134

/НУ Write(I,1,1) 287287287

Ьшчсние I иператор РезультатI 14

II 2

Write(1:6)

Write((I + I) : 7)

- 134~_624

1||ичение R Оператор Результат

/ I S.4 32 Write(R) 7.1543200000E+02

1.919E+01 Write(R) _-1.9190000000E+01

1 : 1 ' - выводится десятичное представление величины I в крайни» правые позиции поля шириной Р.

К в поле шириной 18 символов выводится десятичное пред- Угимсниевеличины R в формате с плавающей точкой (если R> 0.0, И* нппыуетсяформат__________________#.##########Е*##; если R<0.0, формой имеетвид _-#.##########Е*##):

Page 67: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Значение R Оператор Результат

511.04 Write(R : 8 4) 511.0400

-46.78 Write(R : 7 2) _-4 6.78

Значение Ch Оператор Результат

'X' Write(Ch : 3)

Write(Ch : 2,Ch : 4)

___X

1 i

Значение S Оператор Результат

'Day N' Write(S) Day N

'RRDD' Write(S,S) RRDDRRDD

Значение S Оператор Результат

'Day N' Write (S 10) Day N

'RRDD' Write (S 5,S : 5) _RRDD_RRDD

Значение В Оператор Результат

True Write(B) True

False Write(B, Not B) FalseTrue

Значение В Оператор Результат

True Write(B 6) ___True

False Write(B 6, Not B : 7) _False_______True

Ch: Р — в крайнюю правую позицию поля шириной Р выводится значениеCh:

S — начиная с позиции курсора выводится значение S:

S: Р — значение S выводится в крайние правые позиции поли шириной Рсимволов:

В — выводится результат выражения В (Тпхе или False), нами ная стекущей позиции курсора:

В: Р — в крайние правые позиции поля шириной Р символом выводитсярезультат булевского выражения:

Page 68: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2.7. Управление символьным выводом на экран

Использование для вывода на экран только процедур Write и WriteLnобеспечивает программисту очень мало возможностей по управлениюрасположением на экране выводимого текста. Печать н м in можетпроизводиться только сверху вниз, слева направо. При »гом невозможнывозврат к предыдущим строкам, стирание нш кчатанного текста, изменениецвета символов и т.д.

Пополнительные возможности управления выводом на экран нПп почиваютпроцедуры и функции модуля CRT. Для установлении снязи пользовательскойпрограммы с этим модулем перед раз- иг ними описаний должна бытьпоставлена строка

Uaaa CRT

Рассмотрим понятия, необходимые при работе с модулем CRT: режимыэкрана, координаты позиции на экране, текстовое окно, пип фона и цветсимвола.

Режимы экрана. Во-первых, вывод на экран может происхо- |н t it itтекстовом или графическом виде (на графических диспле- И11 Мы здесь будемговорить только о текстовом выводе.

Дисплеи могут быть монохроматическими (черно-белыми) и Киотными.Монохроматические дисплеи могут работать только в Ч»рно-белом режиме, ацветные — как в черно-белом, так и в нпг I ном. Кроме того, текстовые режимыразличаются по числу I нм мольных строк и столбцов, умещающихся наэкране.

I» модуле CRT каждый режим имеет определенный номер, за мио|)ымзакреплено символическое имя (описанная константа). Дим установки режимаэкрана используется процедура

Ti'xtMode (<номер режима>) .

Мри обращении к процедуре <номер режима> может задавать- I и кикчислом, так и именем соответствующей константы. Например. I к ни валентныследующие два оператора:

Ti*xt Mode (1) ;

'Г.1x1 Mode (С040) ;

67

Page 69: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Например, в режиме 80 х 25 символ в верхнем левом углу экрана имееткоординаты (1; 1), символ в нижнем правом углу экрана*— (80; 25); символ всередине экрана — (40; 13).

Для установления курсора на экране в позицию с координатами (X, У) вмодуле CRT существует процедура

GoToXY(X,Y)

Здесь координаты курсора задаются выражениями типа Byte.Приведем для примера программу, которая очищает экран и выставляет в

центре экрана символ «*»:

Uses CRT;

Begin

ClrScr;

GoToXY(40,13);

Write ('*')

End.

Используемая здесь процедура ClrScr выполняет очистку экрана.Текстовое окно. Прямоугольное пространство на экране, в которое

производится вывод символов, называется текстовым окном. Положение этогоокна определяется координатами верхнего левого и нижнего правого угловпрямоугольника. Если окно занимает весь экран, то в режиме 80 х 25 егокоординаты (1; 1) и (80; 25). Это исходное окно, изменить положение и размеркоторого можно с помощью процедуры68

Page 70: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Процедура назначения цвета символа

TextColor(Color)

Если цвет фона назначается до очистки текстового окна, то мосле очисткионо «заливается» этим цветом. Если фон устанавливается после очисткиэкрана, то чистое окно будет иметь черный цвет (по умолчанию), а назначенныйцвет фона будет устанавливаться в тех позициях, в которые выводятсясимволы.

Для примера приведем программу, которая по очереди откроет четыреокна, и каждое из этих окон «зальется» разным фоновым цветом:

Uses CRT;

Begin

Window(1, 1, 4 0, 12); .

TextBackGround(White); ClrScr;

Window(41, 1, 80, 12);

TextBackGround(Red) ; ClrScr;

Window(1, 13, 40, 25);

TextBackGround(LightRed) ; ClrScr;

Window(41, 13, 80, 25);

69

Page 71: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• процедура DelLine — уничтожает всю строку с курсором. При этом нижниестроки сдвигаются на одну вверх;• процедура InsLine — вставляет пустую строку перед строкой, в которойстоит курсор;• процедуры LowVideo, NormVideo, HighVideo — устанавливаютсоответственно режимы пониженной, нормальной и повышенной яркостисимволов.

Весьма полезной является функция KeyPressed из модуля CRT, приисполнении которой происходит опрос клавиатуры и определяется, не нажатали какая-нибудь клавиша. В результате эта функция выдает логическоезначение True, если нажата любая клавиша, и значение False — в противномслучае. Часто данную функцию используют для организации задержки окнарезультатов на экране (после выполнения программы ТурбоПаскаль вызываетна экран окно редактора), для чего перед концом программы записываютследующий оператор:

Repeat Until KeyPressed;

Это пустой цикл, который «крутится на месте» до нажатия какой-либоклавиши. В это время на экране выведено окно результатов. После нажатияклавиши значение KeyPressed станет равно True, цикл завершится, исполнениевыйдет на конец программы и на экран вернется окно редактора. Этот приемможно использовать для задержки выполнения программы в любом ее месте.

В приведенную ранее программу получения на экране четырехразноцветных окон внесем следующее дополнение: после установкичетырехцветного экрана выполнение программы останавливается иизображение сохраняется, а затем после нажатия любой клавиши экранвозвращается в исходное состояние (80x25, черный фон, белые символы). Дляэтого перед концом программы следует добавить следующее:

Repeat Until KeyPressed;

Window(1, 1, 80, 25);

TextBackGround(Black);

ClrScr;

Описание других процедур и функций модуля CRT приведено вспециальной литературе по ТурбоПаскалю.

70

Page 72: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Program Roots;

Var В, C, D : Real;

Begin

Read(В, C);

D := Sqrt(Sqr(B) - 4 * C) ;

WriteLn ( 1 xl =', (-B + D)/2,

'x2 = ', (-B - D) /2)

End.

2. Определить, что будет напечатано следующей программой при по-следовательном введении значений 3.4 и 7.9:

Program Less;

Var X : Real; T : Boolean;

Begin

Read(X);

T := X < Round(X);

Read(X);71

Page 73: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

<Операция отношения>

В Паскале логические значения обозначаются служебными ело вами False(F) и True (Т), а идентификатор логического типа Boolean.Кроме величин (констант и переменных) типа Boolean, логи ческие значенияFalse, True принимают результаты операций от ношения.Операции отношения осуществляют сравнение двух операндом иопределяют, истинно или ложно соответствующее отношение между ними.Структура операции отношения представлена на рис. 2.11, где

<знак отношения> : ( р а в н о ) | о (не равно) |

> (больше) 1 < (меньше) | >= (больше или равно) |

<= (меньше или равно).

Приведем примеры записи отношений:

Логические операции выполняются над операндами булевского типа.Имеются четыре логические операции: Not — отрицание, And — логическоеумножение (конъюнкция); Ог — логическое сложение (дизъюнкция). Кромеэтих трех обязательных операций, в ТурбоПаскале имеется еще операция«Исключающее ИЛИ», обо значаемая служебным словом Хог. Этодвухместная операция, которая в результате дает значение ИСТИНА, если обаоперанд;! имеют разные логические значения.

Логические операции были перечислены в порядке убывании приоритетов.Результаты выполнения логических операций для раз личных значенийоперандов приведены в табл. 2.5.

Результат

72

Page 74: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

А В Not А A And В A Or В АХог В

Т Т F Т Т F

Т F F F Т Т

F F Т F F F

F Т Т F Т Т

Операции отношения имеют самый низкий приоритет, поэтому еслиоперандами логической операции являются отношения, и к следует заключатьв круглые скобки. Например, математиче- I кому неравенству 1 <х<50соответствует следующее логическое выражение:

(1 <= х) And (х <= 50)

Логическое выражение — это логическая формула, записанная ни языкепрограммирования. Логическое выражение состоит из логических операндов,связанных логическими операциями и круг- пи ми скобками. Результатомвычисления логического выражения шшиется булевская величина (False илиTrue). Логическими опе- Iмндами могут быть логические константы,переменные, функции, операции отношения. Один отдельный логическийоперанд Является простейшей формой логического выражения.

Приведем примеры логических выражений, в которых d, b, % — логическиечисла; х, у — вещественные; к — целая переменная:

1) х < 2 * у; 2) True; 3) d;

-1) Odd (к) ; 5) Not Not d; 6) Not (x > y/2) ;

7) d And (x О у) And b;

B) (c Or d) And (x = y) Or Not b.

11ри d = True, b = False, с = True, x = 3.0, у = 0.5, к = 5 результатыВычислений будут следующими:1) False; 2) True; 3) True; 4) True;

73

Page 75: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Обращение Тип аргумента Тип результата Действие

Ord (х) Любойпорядковый

I Дает порядковый номер значения х в его типе

Pred (х) То же Тот же, что у х Дает предыдущее по отношению к х значение в его типе

Succ (х) » Тот же, что у х Дает следующее по отношению к х значение в его типе

Chr (х) Byte Char Дает символ с порядковым номером х

Odd (х) I Boolean Дает True, если х — нечетное число, иFalse, если х — четное

Page 76: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

74

Если аргумент целый, то, например, оператор у := Pred(x) эквивалентен у :=х - 1, а оператор у := Succ(x) эквивалентен у := х + 1.

Для аргумента символьного типа эти функции дают соответственнопредыдущий и следующий символы в таблице внутренней кодировки.Поскольку латинский алфавит всегда упорядочен по кодам, т.е.

Ord ('а') < Ord('b') < ... < Ord('z'), то, например,

можно записать

Pred('b') = 'a'; Succ('b') = 'с'.

То же относится и к цифровым литерам:

Pred('5') = 1 4 1 ; Succ('5') = 'б 1.

Функция Chr (х) является обратной к функции Ord (х), если х — символьнаявеличина. Например, для кода ASCII справедлива запись:

Ord('а') = 97; Chr(97) = 'а'.

Эту их «взаимообратность», если х— символьная величина, можновыразить формулой

Chr(Ord(х)) = х .

В некоторых случаях возникает задача преобразования символьногопредставления числа в числовое. Например, получить из литеры '5' целоечисло 5 можно следующим образом:

N := Ord ('5') — Ord(10') .

Здесь N— целая переменная и использован тот факт, что код литеры '5' напять единиц больше кода 'О'.

Булевский тип данных также является порядковым. Порядок расположениядвух его значений следующий: False, True. Тогда справедливы следующиеотношения:

75

j

Page 77: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

z := x * Ord(x >= у) + у * Ord(у > x).

Ответ: z = max(x, у), т.е. данную задачу можно решить без использованияусловного оператора if..then..else.

Упражнения

1. Вычислить значения следующих логических выражений:

а) К mod 7 = К div 5-1 при К = 15;

б) Odd(Trunc(10 * Р) ) при Р = 0.182;

в) Not Odd(n) при п = 0;

г) t And (Р mod 3 = 0) при t = True, Р = 10101;

д) (х * у о 0) And (у > х) при х = 2, у = 1;

е) a Or Not b при а = False, b = True.

2. Определить какое значение получит логическая переменная d при а = True и х = 1после выполнения следующих операторов присваивания:

а) d := х < 2;

б)d := Not a Or Odd(x);

76

Page 78: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Then-----*- <Оператор>

--------—■ Else----► <Оператор>-------------

Рис. 2.13. Синтаксическая диаграмма условного оператора

равно True, то будет выполняться <Оператор 1> (после Then), если же егозначение равно False, будет выполняться <Оператор 2> (после Else) дляполной формы или сразу оператор, следующий после условного, для неполнойформы (без Else).

Пример 2.1. Требуется составить программу вычисления площади

у}р(р-а)(р-Ь)(р-с),

где р = (а + Ь + с) / 2 — полупериметр треугольника.Исходные данные должны удовлетворять основному соотношению для

сторон треугольника: длина каждой стороны должна быть меньше суммы длиндвух других сторон.

Имея возможность в одном условном операторе записывать достаточносложные логические выражения, можно сразу «отфильтровать» все вариантыневерных исходных данных:

Program Geron;

Var А, В, С, Р, S : Real;

Begin

WriteLn(1 Введите длины сторон треугольника:'); Write('а = ');

ReadLn(А);

Write('Ь = '); ReadLn(В);

77

Page 79: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Пример 2.2. Требуется составить программу решения квадратногоуравнения.

Алгоритм решения данной задачи подробно рассматривался в подраэд. 1.3(см. рис. 1.8). Алгоритм имеет структуру вложенных ветвлений. Его описание наалгоритмическом языке также приведено в подразд. 1.3. Программа наПаскале будет иметь вид

Program Roots;

Var А, В, С, D, XI, Х2 : Real;

Begin

WriteLn('Введите коэффициенты

квадратного уравнения: 1);

Write('а = '); ReadLn (А) ;

Write('Ь ='); ReadLn(В);Begin

XI := (-b + sqrt(d))/2/a; X2 := (—b —

sqrt(d))/2/a; WriteLn('XI = ', XI);

WriteLn('X2 = ', X2)End

End

End.Пример 2.3. Требуется составить программу перевода пятибалльной оценки

в ее наименование: 5 — отлично, 4 — хорошо, 3 — удовлетворительно, 2 —неудовлетворительно.

Блок-схема алгоритма решения задачи приведена на рис. 2.14.Этот алгоритм имеет структуру вложенных ветвлений и соответствующую

программу на Паскале можно записать следующим образом:

78

Page 80: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 2.14. Блок-схема алгоритма перевода пятибалльной оценки в еенаименование

Program Marks-2;

Var N : Integer;

Begin

WriteLn('Введите оценку:'); ReadLn(N);

End.

79

Page 81: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Структуру вложенных ветвлений можно запрограммировать с помощьюодного оператора выбора, имеющегося в языке Паскаль:

Program Marks;

Var N: Integer;

Begin

WriteLn('Введите оценку:');

ReadLn(N);

Case N Of

5: WriteLn('Отлично') ;

4: WriteLn('Хорошо');

3 : WriteLn('Удовлетворительно ');

< Оператор выбора>Case <Селектор> -----► Of ■

<Константа> -г-»- (7) —»- <Оператор> —j*-Else —*- <Оператор> —*- End-

-оГ

Рис. 2.15. Синтаксическая диаграмма оператора выбора

80

Page 82: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Case N Of

3, 4, 5 : WriteLn('Экзамен сдан 1)

2 : WriteLn('Экзамен не сдан')

Else WriteLn('Нет такой оценки');

Так же, как условный оператор, оператор выбора может использоваться внеполной форме, т.е. без ветви Else.

2.10. Программирование циклических алгоритмов

Суммирование прекращается, когда очередное слагаемое становитсяменьше е или когда целая переменная / достигает значения Maxlnt:

S := 0;

I := 1;

While (1/1 >= Eps) And (I < Maxlnt) Do

Begin

S := S + 1/1;

I := I + 1

End;

Цикл с постусловием. Синтаксическая диаграмма оператора Цикла «До», илицикла с постусловием, приведена на рис. 2.17.

Исполнение данного цикла повторяется до того момента, когда <Логическое

Do-----------------*- <Оператор>

Рис. 2.16. Синтаксическая диаграмма цикла с предусловием

81

Page 83: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Until ---------------*- <Логическое выражение>

Рис. 2.17. Синтаксическая диаграмма цикла с постусловием

Предыдущая задача с использованием цикла с постусловием решаетсяследующим образом:

S := 0;

I := 1;

Repeat

Summa - ■

N

Блок-схема алгоритма решения этой задачи приведена на рис. 2.18, асоответствующую программу с использованием структуры цикла «Пока» можнозаписать следующим образом:

Program Adding;

Var I, M, N, Summa : Integer;

Begin

Write('M = ') ;

ReadLn(M);

82

Page 84: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 2.18. Блок-схема алгоритма суммирования целых чисел

Теперь введем новый тип циклической структуры, которая называется «циклпо параметру». Блок-схема алгоритма суммирования с использованием этойструктуры приведена на рис. 2.19, а программу на Паскале для решенияданной задачи можно записать следующим образом:

Program Summering_2;

Var I, M, N, Summa: Integer;

Begin Write ('M =');

ReadLn(M);

Write('N =') ;

ReadLn(N);

83

Page 85: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 2.19. Блок-схема алгоритма суммирования с циклом по параметру

For I := М То N Do

Summa := Summa + I;

WriteLn('Сумма равна Summa)

End.

Здесь целая переменная I принимает последовательность всех значений вдиапазоне от М до N. При каждом значении I выполняется тело цикла. Послепоследнего выполнения цикла при I = N происходит выход из цикла напродолжение алгоритма. Цикл выполнится хотя бы один раз, если М < N, и невыполнится ни разу при М > N.В приведенной программе используется оператор цикла по параметру,

84

Page 86: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

I Вычисляются значения <Выражение 1> и <Выражение 2>, причем толькоодин раз при входе в цикл.

’ 11араметру цикла присваивается значение <Выражение 1>.t Значение параметра цикла сравнивается с значением < Выразите 2>.

Если параметр цикла меньше или равен этому значении). го выполняется телоцикла, в противном случае выполнение цикла заканчивается.

•I {пачение параметра цикла изменяется на следующее значение и его типе(для целых чисел — увеличивается на единицу) и происходит возврат к п. 3данной схемы.

Оператор цикла For объединяет в себе действия, которые при in I к hi i>ювании цикла While выполняют различные операторы: при иканиепараметру начального значения, сравнение с конечным шачением, изменениезначения на следующее.

Как известно, результат суммирования целых чисел не зависит.......орядка суммирования. Например, в рассматриваемой задаче•пн на можно складывать и в обратном порядке, т.е. от N до М IN • М). Дляэтого можно использовать второй вариант оператора пик на For:

Summa := 0;

Гог I := N DownTo М Do

Summa := Summa + I;

DownTo буквально переводится «вниз до». В данном случае параметрцикла изменяется по убыванию, т.е. при каждом повторении цикла параметризменяет свое значение на предыдущее (ра- йносильно i :=pred(i)).Следовательно, цикл не выполнится ни рту, если N < М.

Работая с оператором For, следует учитывать следующие пра- мила:• параметр цикла не может иметь тип real;• в теле цикла нельзя изменять переменную —параметр цикла;• при выходе из цикла значение переменной —параметра цикла являетсянеопределенным.

И следующем примере в качестве параметра цикла For исполь- |уем

«• • Выражение 1> —i—»-То----т-»- <Выражение 2>—*- Do—<Оператор>

85

Page 87: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

X sin х COS X

0.0000 0.0000 1.0000

0.1000 0.0998 0.9950

1.0000 0.8415 0.5403

1. Напечатать в возрастающем порядке все трехзначные числа, в десятичной записикоторых нет одинаковых цифр.2. Дано целое п > 2. Напечатать все простые числа из интервала [2; я].

2.11. Подпрограммы

Понятие вспомогательного алгоритма уже рассматривалось в подразд. 1.5.В языках программирования вспомогательные алгоритмы называютсяподпрограммами. В Паскале различают два вида подпрограмм: процедуры ифункции.

86

Page 88: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рассмотрим следующий пример: даны два натуральных числа а и Ь.Требуется определить наибольший общий делитель трех величин: а + Ь, \а - Ь\,а Ь. Запишем это в виде: НОД (а + Ь, \а - Ь\, а ■ Ь).

Идея решения данной задачи состоит в следующем математическомфакте: если x,y,z — три натуральных числа, то НОД (х, у, z) = = НОД (НОД (х, у),z). Иначе говоря, сначала следует найти НОД двух величин, а затем НОДполученного значения и третьего числа (попробуйте это доказать).

Очевидно, что вспомогательным алгоритмом для решения поставленнойзадачи является алгоритм получения наибольшего общего делителя двухчисел. Следовательно, эта задача решается с помощью известного алгоритмаЕвклида (см. подразд. 1.3), который запишем в форме процедуры наалгоритмическом языке:

процедура Евклид(цел М, N, К); нач

пока М о N нц

если М > N

ю М := М - N иначе N

:= N — М квкц;

К := М кон

Здесь М и N являются формальными параметрами процедуры, г. е. это параметры-аргументы, а К — параметр-результат. Основной алгоритм решенияисходной задачи следующий:

алг задача цел а,

Ь, с нач ввод(а, Ь)

Евклид (а + Ь, |а — Ы, с)

87

Page 89: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure Evklid(M, N : Integer; Var К : Integer);

Begin

While M о N Do

If M > N

Then M := M - N

Else N := N - M;

К := M

End;

Begin

Write(1A =');

<Описание процедуры> <Заголовок процедуры>------(^7^-----------»- <Блок>-

С® <Список формальных параметров> ^7) -

«Нормальные параметры> ::= <Параметрьг -значения> | <Параметры-

переменные> <Параметры-переменные> ^

Рис. 2.21. Синтаксическая диаграмма описания процедуры

Page 90: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• (7) —<Список фактических параметров> —*- (Т)

иРис. 2.22. Структура оператора обращения к процедуре

Процедура в качестве результата может передавать в вызывающуюпрограмму множество значений (в частном случае — одно), а может и непередавать ни одного значения. Теперь рассмотрим правила обращения кпроцедуре. Обращение к процедуре производится в форме операторапроцедуры (рис. 2.22).

Если описана процедура с формальными параметрами, то и обращение кней производится оператором процедуры с фактическими параметрами.Правила соответствия между формальными и фактическими параметрамиследующие: соответствие по количеству, по последовательности и по типам.

Первый вариант взаимодействия формальных и фактических параметровназывается передачей по значению: вычисляется значение фактическогопараметра (выражения) и это значение присваивается соответствующемуформальному параметру. Второй вариант взаимодействия формальных ифактических параметров называется передачей по имени: при выполнениипроцедуры имя формальной переменной заменяется именемсоответствующей фактической переменной (в откомпилированной программеимени переменной соответствует адрес ячейки памяти).

В рассмотренном примере формальные параметры М и N являютсяпараметрами-значениями. Это аргументы процедуры, при обращении ккоторой первый раз им соответствуют значения выражений А + В и Abs(A - В), авторой раз — значения С и А В. Параметр К является параметром-переменной,в которой получают результат работы процедуры. В обоих обращениях кпроцедуре соответствующим фактическим параметром является переменнаяС, через которую основная программа получает результат.

Теперь рассмотрим пример программы, решающей исходнуюпоставленную задачу с использованием процедуры без параметров:

Program NOD2;

Var А, В, К, М, N : Integer;

Procedure Evklid;

Begin

While M о N Do

If M > N

Then M := M - N

Else N := N - M;

89

Page 91: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Begin

Write('A =');

ReadLn(A);

Write('В =');

ReadLn(B);

M : = A + B;

N := Abs(A - B);

Evklid;

M := K;

N := A * B;

Evklid;

90

Page 92: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

кале допускаются функции строкового типа. Синтаксическая диаграммаописания функции представлена на рис. 2.23.

Как и у процедуры, у функции в списке формальных параметров могутиметься параметры-переменные и параметры-значения, которые являются ееаргументами. При этом если аргументы передаются глобально параметры всписке могут отсутствовать.

Программа решения исходной поставленной задачи с использованиемфункции будет иметь следующий вид:

Program N0D3;

Var А, В, Rez: Integer;

Function Evklid(М, N : Integer) : Integer;

Begin

Write('A = ') ;

Из данного примера видно, что в отличие от процедуры в теле функциирезультат присваивается переменной с именем функции.

Обращение к функции является операндом в выражении и записывается вследующей форме:

<имя функции> (<список фактических параметров>)

Правила соответствия между формальными и фактическими параметрамиу функции те же, что и у процедуры. Сравнивая рассмотренные программы,

End;

End.

< Описание функции ><Заголовок> —( ; ) —»- <Блок>—*-

<Заголовок>Function —<Имя> (j^) —*- <Тип>

Рис. 2.23. Синтаксическая диаграмма описания функции

91

Page 93: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ма NOD3 имеет определенные преимущества перед другими. Функцияпозволяет получить результат посредством выполнения одного оператораприсваивания. Здесь же показано, что фактическим аргументом приобращении к функции может быть эта же функция.

По правилам стандартного Паскаля возврат в вызывающую программу изподпрограммы происходит, когда выполнение подпрограммы доходит до конца(последний End). Однако в ТурбоПаскале имеется средство, позволяющеевыйти из подпрограммы в любом ее месте. Это оператор-процедура Exit.Например, функцию определения наибольшего из двух заданныхвещественных чисел можно описать следующим образом:

Function Мах(Х, Y : Real): Real;

Begin

Max := X;

If X > Y Then Exit Else Max := Y

End;

Еще раз об области действия описаний. В Паскале неукоснительно действуетследующее правило: любой программный объект (константа, переменная, типи др.) должен быть описан перед использованием в программе. Иначе говоря,описание объекта должно предшествовать его первому появлению в другихфрагментах программы. Это правило относится и к подпрограммам.

На рис. 2.24 схематически показана структура взаимного расположенияописаний подпрограмм в некоторой условной программе. Попробуем,используя эту схему, разобраться в вопросе об области действия описанийподпрограмм.

Любая подпрограмма может использоваться лишь в пределах областидействия ее описания. Например, область действия подпрограмм А и В —основная программа, поэтому из основной программы можно обратиться кподпрограммам А и В. В свою очередь, в подпрограмме В могут бытьобращения к подпрограмме А, однако из А нельзя обратиться к В, посколькуописание А предшествует описанию В. Подпрограммы А\ и А2 локализованы вподпрограмме А и могут использоваться только в ней, причем из А2 можнообратиться к А1, а из А\ в А2 нельзя.

Из подпрограммы 51 можно обратиться к подпрограмме А, поскольку ееописание является глобальным по отношению к В\, но нельзя обратиться к А\,поскольку область действия описания А\ не распространяется на блокподпрограммы В.92

Page 94: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Подпрограмма B\

Подпрограмма B2

Подпрограмма 521

Подпрограмма 522

Рис. 2.24. Пример структуры программы

рекрывает первое в пределах внутреннего блока. Рассмотрим две программы:

В результате работы первая программа выдаст результат X =..., где наместе отточия будет какое-то произвольное значение, соответствующеенеопределенной величине х.

Вторая программа выдаст результат X = 1.В первой полпрограмме переменная с именем X описана и глобально, и

локально, но процедура выводит значение локальной переменной, которойничего не присвоено. Здесь идентификатором X обозначены две совершенноразные величины, которым соответствуют две разные ячейки памяти.

Во второй программе переменная X одна на всю программу и описанаглобально, поэтому значение 1, присвоенное ей в основной программе,передается и в подпрограмму.

Program Examplei;

Var X : Integer;

Procedure P;

Program Example2;

Var X : Integer;

Procedure P;

Begin

93

Page 95: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ak+i - ак)', ак+2 = F(ai> —, a*+i); ak+3 = F(a3,..., ak+2)...,

Упражнения

1. Составить два варианта программы вычисления площади кольца позначениям внутреннего и внешнего радиусов: с процедурой и с функцией,используя подпрограмму вычисления площади круга.2. По координатам вершин треугольника вычислить его периметр,используя подпрограмму вычисления длины отрезка между двумя точками.3. Даны три целых числа. Определить, используя подпрограмму, у которогоиз них больше сумма цифр.4. Определить площадь выпуклого четырехугольника по заданным ко-ординатам вершин, используя подпрограмму-функцию вычисления длиныотрезка и подпрограмму-процедуру вычисления площади треугольника поформуле Герона.

2.12. Вычисление рекуррентных последовательностей

Рекуррентная последовательность. Понятие рекуррентной по-следовательности известно из курса математики. Вводится оно следующимобразом: пусть известно А:чисел: а,,..., ак, которые являются началом числовойпоследовательности. Следующие элементы этой последовательностивычисляются по формулам:

где F(...) — функция от к аргументов.Формула вида

О; — i, dj_2,... ,CJj fc)

называется рекуррентной, а величина к — глубиной рекурсии.Другими словами, рекуррентная последовательность — это бесконечный

ряд чисел, каждое из которых, за исключением к начальных, вычисляется черезпредыдущие.

Примерами рекуррентных последовательностей являются соответственноарифметическая и геометрическая прогрессии:

о, = 1, а2 = Ъ, я3 = 5, о4 = 7, а5 = 9, (2.1)

а, = 1 ,а2 = 2, аъ = 4, а4 = 8, а5 = 16,... (2.2)Рекуррентная формула данной арифметической прогрессии

я, = a,_i + 2.

Рекуррентная формула данной геометрической прогрессии

а, = 2а,_х.

94

Page 96: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Глубина рекурсии в обоих случаях равна единице (такую зависимость такженазывают одношаговой рекурсией). В целом рекуррентная последовательностьописывается совокупностью начальных значений и рекуррентной формулой.Все это можно объединить в одну ветвящуюся формулу, которая дляарифметической прогрессии будет иметь вид

известная в математике под названием чисел Фибоначчи, в которой начиная стретьего элемента, каждое число равно сумме значений двух предыдущих,является рекуррентной последовательностью с глубиной, равной двум(двухшаговая рекурсия). Опишем ее в ветвящейся форме:

Введение представления о рекуррентных последовательностях позволяетпо новому взглянуть на некоторые уже известные нам задачи. Например,факториал от целого числа п\ можно рассматривать как значение «-гоэлемента следующего ряда чисел:

Рекуррентное описание такой последовательности будет иметь вид

_ Г1, если i - 1;

' |вм + 2, если / > 1, а для

геометрической —

j 1, если i = 1;

' [2ом, если/>1. Числовая

последовательность вида

1; 1; 2; 3; 5; 8; 13; 21; 34; 55 ...,

OQ= 1; а,= 1!; а2 = 2!; о3 = 3!; а4= 41

1, / = 0; дм /, i

> 0.

95

Page 97: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

4) определение номера первого элемента, удовлетворяющегоопределенному требованию;5) вычисление и сохранение в памяти заданного числа элементовпоследовательности.

Данный перечень, не претендуя на полноту, охватывает наиболее частовстречающиеся типы задач. В задачах 1... 4 не требуется одновременнохранить в памяти множество элементов числового ряда: его элементы могутполучаться последовательно в одной переменной, сменяя друг друга.

Пример 2.4. Требуется вычислить л-й элемент арифметической прогрессии(2.1).

Программа, решающая данную задачу, следующая:

Var N, I: 0..Maxlnt;

А : Real;

Begin

Write(1N = ');ReadLn(N);

A := 1;

For I := 2 To N Do

A := A + 2;

WriteLn('A(' , N:1, A : 6 : 0)

End.

96

Page 98: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

+ 2! + 3!+-

При вычислении рекуррентной последовательности с глубиной, равнойдвум, уже нельзя обойтись одной переменной, что видно из следующегопримера.

Пример 2.6. Требуется вывести на печать первые п (п > 3) чисел Фибоначчи и подсчитать, сколько среди них четных чисел. Программа решения данной задачи следующая:

Var N, I, К, F, FI, F2 : 0..Maxlnt;

Begin

FI := 1; F2 := 1;

К := 0;

WriteLn('F(l) = ', FI, ' F(2) = ', F2);

For I 3 To N Do Begin

F := FI + F2 ;

WriteLn('F(', I : 1, ') = ', F);

If Not Odd(F) Then К := К + 1;

FI := F2; F2 := F

End;

WriteLn(1 Количество четных чисел в последовательности равно 1, К)

включив в нее только слагаемые, превышающие е.Из математики известно, что сумма такого бесконечного рада имеет

конечное значение, равное е*, где е = 2,71828... — основание натуральногологарифма. Поскольку элементы этого рада представляют собой убывающуюпоследовательность чисел, стремящуюся к нулю, суммирование следуетпроизводить до первого слагаемого, по абсолютному значению непревышающего е.

Если слагаемые в этом выражении обозначить

х2 х3 ab = 1; ах = х; а2 = а3 = —, ...,

то обобщенная формула для /-го элемента будет следующей:

97

Page 99: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

a'=7fао = 1; ! = Oq —; о3 = а2 — ...

XlНетрудно увидеть, что между элементами данной последовательностиимеется рекуррентная зависимость. Ее можно найти интуитивно, но можно ивывести формально. Правда, для этого требуется догадаться, что рекурсия —одношаговая, и что каждый следующий элемент получается посредствомумножения предыдущего на некоторый множитель, т. е.

а, = Kdi_\.

Используя обобщенную формулу, запишем:

*/ _ к

откуда

К =

г. (/-1)!’Xi/H

~ 1)! i'

Действительно,

х XСледовательно, данная рекуррентная последовательность может бытьописана следующим образом:

я, =

1, если / = 0;

X ■ песли i > 0.

/И, наконец, приведем программу, решающую поставленную задачу:

Var А, X, S, Eps : Real; .

I : Integer;

Begin

Write('X = '); ReadLn(X);

98

Page 100: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Значения одношаговой рекуррентной последовательности здесь, как ипрежде, вычисляются в одной переменной.

Каждое повторное выполнение цикла в этой программе приближаетзначение S к искомому (уточняет значащие цифры в его записи). Такойвычислительный процесс в математике называется итерационным процессом.Соответственно циклы, реализующие итерационный вычислительный процесс,называются итерационными циклами. Для их организации используютсяоператоры While или Repeat.

Пример 2.8. Для заданного натурального числа N и вещественного х (х > 0)требуется вычислить значение выражения

В этом случае рекуррентность не столь очевидна. Попробуем найти ееметодом индукции. Будем считать, что искомое выражение есть TV-й элементпоследовательности вида

Теперь поставленную задачу решить очень просто:

Var А, X : Real; I, N : Integer;

Begin

Write('X = '); ReadLn(X);

Однако к решению всех приведенных задач можно подойти и иначе,используя возможность рекурсивоного определения функции в Паскале.

Подробно рекурсивные подпрограммы Паскаля рассматриваются вподразд. 2.17. Из описания арифметической прогрессии в форме рекуррентнойпоследовательности непосредственно следует способ определения функциидля вычисления заданного элемента.

Сделаем это для общего случая, определив арифметическую прогрессию сначальным значением а0 и разностью d:

а1 =

откуда видна следующая связь:

<?2 - \]х + а\; аз — -Jx + а2; ...; О/ = yjx + о,_].

End.

99

Page 101: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

<3, = а0, если i = 1;

о,_| + d, если i > 1.

Соответствующая подпрограмма-функция будет иметь вид

Function Progres(A0, D : Real; I : Integer): Real;

Begin

If I = 1

Then Progres := AO

Else Progres := Progres(AO, D, I - 1) + D

End;

Следующая программа выводит на экран первые 20 чисел Фибоначчи,значения которых вычисляет рекурсивная функция Fibon:

Var К : Byte;

Function Fibon(N : Integer) : Integer;

Begin

If (N = 1) Or (N = 2)

Then Fibon := 1

100

Page 102: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

т.е. имеем последовательность, описываемую следующей рекуррентнойформулой:

Коэффициент К можно найти, используя условие pi0 -70 и выполнив «обратные» подстановки:

Ло — (1 ~ К)Р2.9 - (1 _ К)2 Р28 - (1 ~ ку Рп = ... = = (1 ~ К)30 PQ = (1 - Аг)3096.

Из равенства (1 - А)3096 = 70 находим:

Дальнейшее программирование становится очевидным:

Var I : Byte;

Q := Exp(1/30 * Ln (70/96));

For I := 1 To 2 9 Do Begin

1. Рекуррентная последовательность определена следующим образом:

если / = 0;

если 1 < / < 30.

Р := 96;

End.

Упражнения

1, если /' = 0;

a, _ii + 7, если /' > 0.

Для заданного натурального и получить значение а„.2. Дана последовательность

если / = 0, i = 1;

если / > 1.

Вычислить произведение элементов с 1-го по 20-й.

101

Page 103: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

f х 4

3. Используя рекуррентный подход, вычислить сумму многочлена 10-й степени поформуле Горнера:

Юл:10 + 9х9 + 8.x8 + ... + 2х2 + х= (((((((((10х + 9)х+ 8)х+ ...+ 2)х+ 1)х.

где х — заданное вещественное число.4. Для заданных вещественного х и натурального 7V вычислить следующую цепнуюдробь:

х/(1 +х/(2 +х/(Ъ + */(... /(N+x))...).

5. Вычислить и вывести все члены числового ряда

1- 1 . 1 . • _ L’ 2!’ 3!’ ” ’ N\

превышающие значение 10~5.6. Функцию у -л1х можно вычислить как предельное значение последовательности,определяемой следующей рекуррентной формулой:

У к-1 +-ч Л-1

для к = 1, 2, ...

Здесь начальное значение уй задается произвольно (желательно ближе к 4х). Заприближенное с точностью е значение корня берется первое ук, для котороговыполняется условие Ь*_ Л - il < е- Составить соответствующую программу вычисления.

2.13. Графические средства ТурбоПаскаля

До сих пор мы использовали экран компьютера только для выводасимвольной информации — чисел, текстов. Однако ТурбоПаскаль позволяетвыводить на экран рисунки, чертежи, графики функций, диаграммы, т.е. все то,что принято называть компьютерной графикой.

В стандартном Паскале графический вывод не предусмотрен. Однако наразных типах компьютеров, в разных реализациях Паскаля существуютразличные программные средства графического вывода: специальные наборыданных, функций, процедур. При этом имеются общие понятия и средства,свойственные любому варианту реализации графики в любом языкепрограммирования. Рассмотрим такие базовые средства.

Начиная с четвертой версии ТурбоПаскаля для IBM PC появилась мощнаяграфическая библиотека, организованная в модуль Graph. В приложении 2 всправочной форме дано описание основных компонентов этого модуля. Дляподключения модуля Graph в начале программы необходимо написать строку

Uses Graph;

102

Page 104: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Графические режимы экрана. Для вывода графических изображенийнеобходимо перевести экран в один из графических режимов. В графическомрежиме можно с помощью программы управлять состоянием каждого пиксела— точечного элемента экрана.

Графическое режимы отличаются:• размером графической сетки (Л/х N, где М— число точек по горизонтали;N— число точек по вертикали);• цветностью (числом воспроизводимых на экране цветов).

Допустимые режимы зависят от типа монитора и соответствующегографического драйвера, используемого на компьютере.

Для установки графического режима экрана существуют соответствующиепроцедуры. В модуле Graph процедура установки графического режима экранаимеет следующий заголовок:

Procedure InitGraph(Var Driver, Mode : Integer; Path :

String);

Здесь целая переменная Driver определяет тип графического драйвера,целая переменная Mode задает режим работы графического драйвера, a Path— выражение типа String, содержащее маршрут поиска файла графическогодрайвера.

Списки констант модуля Graph, определяющих типы драйверов и режимы,даны в приложении 2 (см. табл. П2.1 и П2.2).

Приведем пример программы, инициализирующей графический режимVGAHi для работы с драйвером VGA (монитор типа VGA):

Uses Graph;

Var Driver, Mode : Integer;

Begin

Driver : = VGA;{Драйвер}

103

Page 105: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

(л, I )

104

Page 106: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Расположение на экране графических осей координат показано на рис. 2.25.Горизонтальная ось X направлена слева направо, вертикальная ось Y —сверху вниз.

На рис. 2.25 указаны предельные графические координаты, со-ответствующие режиму VGAHi.

Можно определить максимальные координаты по осям, соответствующиеданному драйверу, с помощью следующих двух целочисленных функций:

Function GetMaxX;Function GetMaxY;

Графическое окно. Область вывода изображения может быть ограниченалюбым прямоугольником в пределах экрана. Такая область называетсяграфическим окном. Существует процедура, устанавливающая положениеграфического окна на экране.

Заголовок процедуры назначения графического окна

Procedure SetViewPort(XI, Yl, Х2, Y2 : Integer; Clip :

Boolean);

Здесь (XI, Yl) — координаты левого верхнего угла окна; (Х2, Y2) —координаты правого нижнего угла окна; Clip — ограничитель фигур.

Если Clip = True, то все построения производятся только в пределах окна, впротивном случае они могут выходить за его пределы.

После установки окна координаты точек внутри него отсчитываются от еговерхнего левого угла.

Существует понятие графического курсора, который в отличие отсимвольного курсора он на экране не виден. Графический курсор указывает натекущую позицию на экране. При входе в графический режим координатытекущей позиции (0, 0).

Процедура назначения координат графического курсора:

Procedure MoveTo(X, Y : Integer);

Здесь X, Y— устанавливаемые координаты курсора, которые указываютсяотносительно левого верхнего угла окна или (если окно не установлено) экрана.

Процедура поставить точку — основная процедура полученияизображения, поскольку любой рисунок складывается из точек. Состояниесветящейся точки определяется ее координатами на экране и цветом.

Заголовок процедуры выставления точки на графическом экране

105

Page 107: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure PutPixel(X, Y : Integer; Color : Word);

Здесь X, Y — координаты точки; Color — цвет точки.

Пример 2.10. Программа, устанавливающая по центру экрана графическоеокно размером 100 х 100, заливающая его желтым фоном и заполняющаясиними точками, расположенными через четыре позиции, будет иметьследующий вид:

Uses Graph;

Var Driver, Mode : Integer;

X, Y, XI, Yl, X2, Y2, Xc, Yc : Integer;

Begin

{---------Инициализация графического режима----------------------------}

Driver : = Detect;

InitGraph(Driver, Mode, 'C:\TP\BGI');

{---------Определение координат центра экрана-------------------------------}

Xc := GetMaxX Div 2;

Yc := GetMaxY Div 2;

{---------Определение координат графического окна---------------------------------}

XI := Xc - 50;

Yl := Yc - 50;

X2 := Xc + 50;

Y2 := Yc + 50;

106

Page 108: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рассмотрим несколько основных процедур рисования графическихпримитивов, имеющихся в модуле Graph.• Линия с заданными координатами концов (XI, Y1) и (Х2, Y2):

Procedure Line (XI, Yl, Х2, Y2 : Integer);

• Линия от текущей точки до точки с координатами (X, Y):

Procedure LineTo(X, Y : Integer);

• Линия от текущей точки до точки с заданными приращениями координат(DX, DY):

Procedure LineRel(DX, DY : Integer);

• Прямоугольник с заданными координатами верхнего левого угла (XI, Y1) инижнего правого угла (Х2, Y2):

Procedure Rectangle(XI, Yl, Х2, Y2 : Integer);

Окружность с центром в точке (X, Y) и с радиусом R в пикселах:

Procedure Circle(X, Y : Integer; R : Word);

• Дуга окружности с центром в точке (X, Y), с радиусом R, с начальнымуглом BegA и конечным углом EndA (углы измеряются в градусах противчасовой стрелки от направления оси X):

Procedure Arc(X, Y : Integer; BegA, EndA, R : Word);

• Эллипсная дуга с центром в точке (X, Y), с начальным и конечным угламисоответственно BegA и EndA, с горизонтальным радиусом RX и вертикальным

107

Page 109: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

100 150 250 300

Begin

{---------Инициализация графического режима----------------------------}

Driver := Detect;

InitGraph(Driver, Mode, 'C:\TP\BGI');

SetColor(White); {Белый цвет рисунка}

SetBkColor(Black); {Черный цвет фона}

Rectangle(100, 100, 300, 300); {Голова}

Circle(150, 170, 30); {Левый глаз}108

Page 110: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

пение редкими точками, крестиками, штрихами и т.д. В табл. П2.5 даныконстанты для указания типа заполнения.

Процедура определения типа заполнения (Fill) и цвета (Color) имеетследующий заголовок:

Procedure SetFil lStyle(Fill , Color : Word);

Процедура заполнения прямоугольной области с заданными координатамиуглов:

Procedure Bar(Xl, Yl, Х2, Y2 : Integer);

Процедура обведения линией (SetLineColor, SetLineStyle) и закраски(SetFillStyle) эллипса:

Procedure Fil lEll ips(X, Y, RX, RY : Integer);

Процедура обведения линией и закраски эллипсного сектора:

Procedure Sector(X, Y : Integer; BegA, EndA, RX, RY

: Word);

Процедура обведения линией и закраски сектора окружности:

Procedure PieSlice(X, Y : Integer; BegA, EndA : Word);

Наконец, можно закрасить любую область, ограниченную замкнутойлинией. Для этого нужно указать какую-нибудь точку внутри этой области (X, Y)и цвет граничной линии (Border). Соответствующая процедура имеет вид

109

Page 111: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Построение графика функции. Одно из приложений компьютерной графикиобеспечивает наглядное представление результатов математических расчетов.Нарисованный график функции, начерченные диаграммы, линии уровнейраспределения пространственных зависимостей и другие делают результатырасчетов обозримее, нагляднее, понятнее.

Рассмотрим сейчас лишь один простейший вариант математическойграфики — построение графика функции.

Решение задачи построения на экране дисплея графика функции у = F(x)удобно проводить в следующем порядке.1. Определить границы значений аргумента, в пределах которых будетстроиться график, обозначив их Хтт (нижняя граница) и Хтах (верхняя граница).2. Для данной области значений аргумента определить предельныезначения функции: Ктш и Утах. Эти значения необязательно должны бытьточными. Они могут быть оценочными.3. Задать границы графического окна, в пределах которого будетрисоваться график: [Agmin, Xgmm], [Kgmln, Ygmax\. Поскольку в графическихкоординатах вертикальная ось направлена вниз, то Yg min ^ Yg max*

Таким образом, имеются две системы координат: (X, Y) — математическиекоординаты (в литературе чаще используется термин «мировые координаты»)и (Xg, Yg) — графические координаты.

Нетрудно получить формулы, связывающие графические и ма-тематические координаты:

Здесь квадратные скобки означают округление до целого значения(функция Round).

Построение графика функции может производиться либо точечнымметодом, либо кусочно-линейным. При точечном методе график строится какпоследовательность точек, расположенных максимально близко, т.е.производится «попикселный» перебор значений аргумента в интервале [Xgmin,Xgmax] с выставлением точек с соответствующими У-координатами.

При кусочно-линейном методе задается математический шаг АХ,рассчитывается последовательность значений (Хп Y)\

X&min

Yg = Ygmin +

X^X^ + iAX; Yj = F(Xj) ;

110

Page 112: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

и график строится в виде отрезков прямых, проведенных через точки (Xh Yt),(X l + i, Yi+l).

Пример 2.12. Требуется составить программу построения графика функции у = sin х для Jt е [0; 2п], используя точечный метод.

Из условия задачи следует, что Zmin = 0, Хтах - 2п. В этих пределах функция sin х изменяется от -1 до 1, поэтому Kmin = -1, Утах = 1-

Выберем следующие границы графического окна: ^gmin=10; Xg „ах = 200; Ygmin = 140; Yg max = 40.

График строится в виде последовательности точек со следующими математическими координатами:

Xi = ^min + ih\ Yi = sin (Xj); /= 0,...,190.

Шаг h выбирается минимально возможным, соответствующим шагу графической сетки:

^ _ -^max ~ пии _ 2л ТС Л&тах-Л&тт 190 95'

Приведенные формулы пересчета математических координат в

^ = 10 +200-10

Yg = 140 +

2 п

40

-140

X = 10 +95т

(У + 1) = 90-[50Г].

Вместе с графиком функции строятся оси координат. Ось X имеет координату3^= 90, а ось Y — координату Xg= 10. Программа построения графика следующая:

Uses Graph;

Инициализация графического режима---------------------------}

Driver := Detect;

111

Page 113: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

PutPixel(Xg, Yg, Yellow);

X := X + Pi/95 End;

Упражнения

1. Составить программу «Звездное небо»: расстановки в черном окнеслучайным образом белых точек, работа которой заканчивается нажатиемклавиши.2. Изменить программу «Звездное небо» таким образом, чтобы наряду сзажиганием новых звезд происходило угасание (закрашивание цветом фона) ужесветящихся звезд.3. В программу из примера 2.11 внести изменения, в результате которых роботокажется раскрашенным в разные цвета.4. Используя линии и другие графические примитивы, составить программу,рисующую дом.5. Составить программу рисования на экране шахматного поля.6. Написать универсальную процедуру построения графика функции у = F(x)

точечным методом. Процедура должна иметь следующие параметры: А1™,,,

■^max? ^rnin» ^max? A?min, -*£max> Ygmin, Ygmax- ФУНКЦИЯ F(x) ОПИсывается во внешней подпрограмме-функции.7. Исследовав область определения и выбрав расположение координатныхосей, построить на экране, используя процедуру из предыдущей задачи, графикиследующих функций:

2.15. Символьные строкиРассмотрим тип данных, относящийся к числу структурированных —

строковый (строка). Следует заметить, что строковый тип данных есть вТурбоПаскале и отсутствует в стандартном Паскале.

Строка — это последовательность символов. Каждый символзанимает 1 байт памяти (код ASCII). Количество символов в строкеназывается ее длиной. Длина строки может находиться в диапазоне от 0до 255. Строковые величины могут быть константами и переменными.

112

Page 114: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Строковая константа — это последовательность символов, зак-люченная в апострофы. Например:

' Язык программирования ПАСКАЛЬ'

' IBM PC — computer',

' 33-45-12'.

Строковая переменная описывается в разделе описания переменныхследующим образом:

Var <идентификатор> : String[<максимальная длина

строки>].

Например:

Var Name : String[20].

Длина строки может и не указываться в описании. В этом случаеподразумевается, что она максимальна — 255 символов. Например:

Var Slovo : String.

Строковая переменная занимает в памяти на 1 байт больше, чемуказанная в описании ее длина. Дело в том, что один (нулевой) байтсодержит значение текущей длины строки. Если строковой переменнойне присвоено никакого значения, ее текущая длина равна нулю.

По мере заполнения строки символами ее текущая длина возрастает,113

Page 115: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Выражение Результат

'cosml' < 'cosm2' True

'pascal' > 'PASCAL' True

'Ключ ' о 'Ключ' True'MS DOS' = 'MS DOS' True

Значение S Выражение Результат

'ABCDEFG' Copy(S, 2, 3) 'BCD'

'ABCDEFG' Copy(S, 4, 4) 'DEFG'

Выражение РезультатConcat( ' A A ' , ' X X ' , ' Y ' ) ' AAXXY'

• Функция Copy (S, Poz, N) — выделяет из строки S подстрокудлиной N символов, начиная с позиции Poz. Здесь N и Poz —целочисленные выражения. Например:

Функция Concat(Sl, S2,..., SN) выполняет сцепление (конкатенацию)строк S1,..., SN в одну строку. Например:

• Функция Length (S) — определяет текущую длину строки S. Результатом будет являться значение целого типа. Например:

114

Page 116: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 test-5'Значение S2 Выражение Результ

ат' abcdef ' P o s ( ' cd', S2) 3

' abcdcdef ' P o s ( ' cd', S2) 3

'abcdef' P o s ( ' k ' , S2) 0

Исходное значение S

Оператор Конечное значение

'abcdefg' 'abcdefg'

Delete(S,3,2)Delete (S, 2,6)

'abefg' ' a'

Начальное S2 Оператор Конечное S2

'ЭВМ PC' 'Рис.' 2'

Insert('IBM-'Inser t(1N',S2,

S2,5) 6)

'ЭВМ IBM-PC''Рис. N2'

Значение S Выражение Результат

'(А+В)*С'

Length(S)

6

7

• Функция Pos(Sl,S2)— обнаруживает первое появление в строке S2подстроки S1. В результате получают целое число, равное номерупозиции, где находится первый символ подстрокиS1. Если в S2 подстроки S1 не обнаружено, результат равен 0.Например:

• Процедура Delete (S, Poz, N) — удаляет N символов из строки S, начиная с позиции Poz. Например:

В результате выполнения процедуры уменьшается текущая длинастроки в переменной S.• Процедура Insert (SI, S2, Poz) — вставляет строку S1 в строкуS2, начиная с позиции Poz. Например:

Пример 2.13. Программа получения из слова «ВЕЛИЧИНА» слова«НАЛИЧИЕ»:

Program Slovol;

Var Sll, S12 : String[10];Begin

511 := 'ВЕЛИЧИНА';

115

Page 117: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Begin

SI := 'СТРОКА';

Delete(SI,3,2) ;

Insert('E',SI,2);

WriteLn(SI)End.

Пример 2.15. Программа, формирующая символьную строку, состоящую из N звездочек (где N — целое число, 1 < N < 255):

Program Stars;

Var А : String;

N, I : Byte;Begin

Write ('Введите число звездочек');

ReadLn(N);

116

Page 118: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

кончится при первом же выходе на символ «!» или (если в строке такогосимвола нет) при выходе на конец строки. Символ S[I] является цифрой,если истинно отношение 'O' < S[I] < '9'.

Пример 2.17. Дана символьная строка вида: 'А© В='. Здесь А и В —десятичные цифры; знаком ф обозначен один из знаков операций (+, -, *).Иначе говоря, дано арифметическое выражение с двумя однозначнымичислами и знаком равенства, например: '5 + 7 =’. Требуется, чтобымашина вычислила это выражение и после знака «=» вывела результат.Операция деления не рассматривается, чтобы иметь дело только сцелыми числами.

Программа решения такой задачи называется интерпретатором.Интерпретатор должен расшифровать содержание строки и выполнитьсоответствующую арифметическую операцию. От исходной символьнойинформации он должен перейти к работе с числовой информацией.

Если предположить, что строка составлена только из четырехсимволов в соответствии с указанным форматом, то программа решениябудет довольно простой:

Program Interpretator;

Var Str : String[4];

А, В : 0..9;

С : -100..100;

Begin{-----Ввод исходной строки-------}

WriteLn('Введите выражение!') ;WriteLn;Read(Str);

{----Преобразование цифровых символов в числа----------}А : = Ord(Str[ 1 ] ) - Ord('O');В := Ord(Str[3]) - Ord('O');

117

Page 119: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

+ ' : С : = А + В ;

_1 : С : = А - В ;

* * : С : = А * В

Else WriteLn(1 Неверный знак операции')

End;

Разберемся теперь в том, как будет выполняться программаInterpretator.

После ввода строки цифровые символы переводятся в соответ-ствующие десятичные числа. Затем интерпретируется знак операции. Взависимости от этой интерпретации выполняется одно из трехарифметических действий. Далее результат выводится на экран послесимвола «=».

Упражнения

1. Составить программу получения из слова «дисковод» слова «воск»,используя операцию сцепления и функцию Сору.2. Составить программу получения слова «правило» из слова «операция»,используя процедуры Delete и Insert.3. В заданном слове заменить первый и последний символы на символ «*».4. В заданном слове произвести обмен первого и последнего символов.5. К заданному слову присоединить столько символов «!», сколько в немимеется букв (например, из строки «УРА» получить «УРА!!!»).6. В заданной строке вставить пробел после каждого символа.7. Удвоить каждую букву введенного слова.8. Перевернуть введенную строку (например, из строки «ДИСК» получить«КСИД»).9. В заданной строке удалить все пробелы.10. Составить программу перевода строки, представляющей собой записьцелого числа, в соответствующую величину целого типа.

2.16. Массивы

118

Page 120: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Месяц года 1 2 3 4 5 6 7 8 9 10 11 12

Температура, °С -21 -18 -7,5 5,6 10 18 22,2 24 17 5,4 -7 -18

Год Месяц года

1 2 3 4 5 6 7 8 9 10 11 12

1981 -23 -17 -8,4 6,5 14 18,6 25 19 12.3 5,6 -4,5 -19

1982 -16 -8,5 -3,2 7,1 8,4 13,8 28,5 21 6,5 2 -13 -20

1983 -9,8 -14 -9,2 4,6 15,6 21 17,8 20 11,2 8,1 -16 -21

1990 -25 -9,7 -3,8 8,5 13,9 17,8 23,5 17,5 10 5,7 -14 -20

деленный год. Такая таблица, представляющая собой последовательностьупорядоченных чисел, называется линейной. Если требуется какая-томатематическая обработка этих данных, то для их обозначения обычновводят индексную символику. Например, Тх обозначают температуруянваря (первого месяца), а Т5 — мая и т.д. В общем виде множествозначений, содержащихся в таблице, обозначается следующим образом:

{У}}, /=1, .... 12.Порядковые номера элементов (1, 15, / и др.) называются индексами.

Индексированные величины удобнее использовать при записи их дляматематической обработки. Например, для вычисления среднегодовойтемпературы используется следующая формула:

1 12

Т-ШЩТ-

Теперь представьте, что требуется собрать информацию о сре-днемесячных температурах за 10 лет, например с 1981 по 1990 г.Используем для этого прямоугольную таблицу (табл. 2.8), в которойстолбцы соответствуют годам, а строки — месяцам.

Удачно выбранная форма записи данных обеспечивает удобство ибыстроту получения требуемой информации. Например, из

Т а б л и ц а 2 . 8

Прямоугольная таблица температур

119

Page 121: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

я"=То 21ZU /=1981 7=1

табл. 2.8 легко узнать, в каком году был самый холодный январь или вкаком месяце был самым нестабильный температурный режим зауказанное десятилетие.

Для значений, хранящихся в подобной таблице, удобно использоватьдвухиндексные обозначения. Например, #|9 8i, 2 — обозначить температурув феврале 1981 г. и т.д. При этом всю совокупность данных,составляющих таблицу, математически можно записать следующимобразом:

{H,J; /= 1981... 1990; у = 1... 12.Обработка таких данных производится с использованием двух-

индексных величин. Например, средняя температура марта за 10 летJ 1990

^ср.март = ТХ Я„3,/=1981

а средняя температура за весь десятилетний период

| 1990/=1981 1 1990 12

У20 ^В Паскале аналогом таблиц является структурированный тип данных,

который называется регулярным типом, или массивом. Как и таблица,массив представляет собой совокупность пронумерованных однотипныхзначений, имеющих общее имя. Элементы массива обозначаются какпеременные с индексами. Индексы записываются в квадратных скобкахпосле имени массива. Например:

т[1], Т[5], T[i], Н[1981, 9], Н[i, j]

Массив, хранящий линейную таблицу, называется одномерным, апрямоугольную — двухмерным. В программах могут использоватьсямассивы и большей размерности.

Тип элементов массива является его базовым типом. Очевидно, длярассмотренных массивов температур базовым типом являетсявещественный (Real).

Описание массивов. Переменная регулярного типа описывается вразделе описания переменных в следующей форме:

Var <идентификатор> : Array [<тип индекса>] Of <тип

компонент^

Чаще всего в качестве типа индекса употребляется интервальный.Например, рассмотренный ранее одномерный массив среднемесячныхтемператур можно описать следующим образом:

120

Page 122: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Описание массива определяет его размещение в памяти и правиладальнейшего употребления в программе. Последовательные элементымассива располагаются в последовательных ячейках памяти (Т[ 1 ], Т[2] ит.д.), причем значения индекса не должны выходить из диапазона 1..12. Вкачестве индекса может употребляться любое выражениесоответствующего типа. Например, T[i + j], T[m div 2].

Тип индекса может быть любым скалярным порядковым типом, кромеInteger. Например, в программе могут присутствовать следующиеописания:

Var Cod : Array[Char] Of 1..100;

• L : Array[Boolean] Of Char;

В данной программе допустимы следующие обозначения элементовмассивов:

Cod['x']; L[True]; Cod[Chr(65)]; L[a > 0].

В некоторых случаях бывает удобно в качестве индекса использоватьперечисляемый тип данных. Например, данные о количестве учеников вчетырех десятых классах одной школы могут храниться в следующеммассиве:

Type Index = (А, В, С, D);

Var Class_10 : Array[Index] Of Byte;

И если, например, элемент Class_10[A] равен 35, это означает, что в 10А классе 35 человек. Такое индексирование делает программу болеенаглядной.

Часто структурированному типу данных присваивается имя в разделетипов, которое затем используется в разделе описания переменных:

Type Masl = Array [1..100] Of Integer;

Var Н : Аггау[1981..1990] Of Array[1..12] Of Real;

Page 123: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Приведем примеры обозначения некоторых элементов этого массива:

Н[1981] [1] ; Н[1985][10]; Н[1990] [12] .

Однако чаще употребляется следующая, эквивалентная формаобозначения элементов двухмерного массива:

Н [1981, 1]; Н[1985, 10]; Н[1990, 12].

Здесь переменная Н[1981] обозначает всю первую строку таблицы,т.е. весь массив температур за 1981 г.

Эквивалентным вариантом приведенного описания двухмерногомассива является также следующее:

Type Month = Array [1..12] Of Real;

Year = Array [1981..1990] Of Month;

Var H : Year;

Наиболее краткий вариант описания данного массива имеет вид

Var Н : Аггау[1981..1990, 1..12] Of Real;

Аналогично трехмерный массив можно определить как одномерныймассив, у которого элементами являются двухмерные массивы.Например:

Var А : Array[1..10, 1..20, 1..30] Of Integer;

Это описание массива, состоящего из 10 • 20 • 30 = 6 000 целых чисел

122

Page 124: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Теперь для изменения размеров массива Mas и всех операторовпрограммы, связанных с этими размерами, достаточно отредактироватьтолько одну строку в программе — раздел констант.

Действия над массивом как единым целым. Такие действия до-пустимы лишь в двух случаях:• присваивание значений одного массива другому;• в операциях отношений «равно», «не равно».

В обоих случаях массивы должны иметь одинаковые типы (типиндексов и тип элементов). Например:

Var Р, Q : Array[1..5,1..10] Of Real;

При выполнении операции присваивания

Р := Q

все элементы массива Р станут равны соответствующим элементаммассива Q.

Как уже отмечалось, в многомерных массивах переменная с индексомможет обозначать целый массив. Например, если в таблице Н требуетсяданные за 1989 г. сделать такими же, как за 1981 г. (девятой строкеприсвоить значение первой строки), то это можно сделать следующимобразом:

Н[198 9] := Н[1981] .

Поменять местами значения этих строк в таблице можно через третьюпеременную того же типа:

Р := Н[1989]; Н[1989] := Н[1981]; Н[1981] := Р;

Здесь Р описана следующим образом:

123

Page 125: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Аналогично в цикле по индексной переменной организуется выводзначений массива. Например:

For I := 1 То 12 Do Write(Т[I] : 8 : 4);

Следующий фрагмент программы организует построчный выводматрицы на экран:

For I := 1 То IMax Do Begin

For J := 1 To JMax DoWrite(Mas[I,J]:6);

WriteLnEnd;

После печати очередной строки матрицы оператор WriteLn безпараметров переведет курсор в начало новой строки. Следует заметить,что в последнем примере матрица на экране будет получена вестественной форме прямоугольной таблицы, если JMax не превышает 12

(самостоятельно объясните, почему).Рассмотрим несколько примеров типовых программ обработки

массивов.

Пример 2.18. Для заданного ранее массива среднемесячных тем-ператур Т[1...12] требуется вычислить среднегодовую температуру иежемесячные отклонения от этого значения.

Программа решения данной задачи следующая:

Program Example;Cont N = 12;

Type Vec = Array [1..N] Of Real;

124

Page 126: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

{----Вычисление таблицы отклонений от среднего-----}

For I := 1 То N DoDt[I] := St - T[I];

{----Вывод результатов------}WriteLn(1 Средняя температура равна St : 6 : 2) ;WriteLn;WriteLn('Отклонения от средней температуры:');For I := 1 То N DoWriteLn(1:1, ': ', Dt[I] : б : 2)End.

По этой программе можно рассчитать среднее значение и векторотклонений от среднего значения для любого одномерноговещественного массива. Настройка размера массива осуществляетсятолько редактированием раздела констант.

Пример 2.19. Требуется выбрать максимальный элемент из рас-смотренного ранее массива температур, т. е отобрать самую высокуютемпературу и номер месяца, соответствующий ей.

Идея алгоритма решения этой задачи следующая: чтобы получитьмаксимальную температуру в вещественной переменной ТМах, сначала внее заносится первое значение массива Т[1]. Затем поочередно значениеТМах сравнивается с остальными элементами массива температур, икаждое значение, большее ТМах, присваивается этой переменной. Дляполучения номера самого теплого месяца в целую переменную NumMaxследует засылать номер элемента массива температур каждый разодновременно с занесением в ТМах его значения.

Программа решения данной задачи следующая:

ТМах := Т[1];

NumMax := 1;

For I := 2 То 12 Do

If T[I] > TmaxThen

125

Page 127: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

рестановку значений таким образом, чтобы они расположились повозрастанию: Xi < Х2 < ... < XN.

Существует целый класс алгоритмов сортировки. Опишем алгоритм,называемый методом пузырька.

Производится последовательное упорядочивание смежных парэлементов массива: Xi и Х2, Х2 и Х3,..., XN _, и XN. В итоге максимальноезначение переместится в XN. Затем ту же процедуру повторяют дополучения XN _ i и т.д., вплоть до получения цепочки из двух элементовXj и Х2. Такой алгоритм имеет структуру двух вложенных циклов,причем внутренний цикл будет переменной (сокращающейся) длины.

Программа решения данной задачи следующая:

For I := 1 То N - 1 Do

For К := 1 То N - I Do

If X [К] > X [К + 1]Then

Begin

А := Х[К];

Х[К] := Х[К + 1];

Х[К +1] := АEnd;

Пример 2.21. Для описанного ранее двухмерного массива сред-немесячных температур за 10 лет требуется определить, в каком годубыло самое теплое лето, т. е. в каком году была наибольшая средняятемпература летних месяцев.End;

126

Page 128: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

{- -Вычисление вектора средних летних температур-------}For I := 1981 То 1990 Do Begin

S [I] := 0;For J:= 6 To 8 Do

S [ I ] := S [I] + H [ I, J];

SCI] := S[I]/3End;

{----Определение года с самым теплым летом---------}

К := 1981;For I := 1982 То 1990 Do

If S[I] > S[K] Then К := I;

WriteLn('Самое теплое лето было в К,1-м году')End.

Упражнения

1. Дан вектор {<$}, i = 1, ..., 50. Вычислить его длину:

L = y j z f + z\ +... + 4,.

2. Вычислить полином 10-й степени по формуле Горнера:

Page 129: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рекурсивным называется любой объект, который частично оп-ределяется через самого себя.

Например, рекурсивным является следующее определение двоичногокода:

Сдвоичный код> ::= <двоичная цифра> | Сдвоичный код><двоичная цифра>

<двоичная цифра> ::= 0 | 1

В рекурсивном определении обязательно должно присутствоватьограничение, т. е. граничное условие, при выходе на которое дальнейшаяинициация рекурсивных обращений прекращается.

Приведем примеры рекурсивных определений некоторых ма-тематических функций.

Классическим примером рекурсии является определение факториала.С одной стороны, факториал определяется в виде: п\ = = 1 - 2 - 3 . . . п , а сдругой стороны, его можно определить следующим образом:

Граничным в данном случае является условие п < 1. Рекурсивное определение функции К ( п ) , возвращающей количество цифр в заданномнатуральном числе п , имеет вид

Рекурсивное определение функции S ( n ) , вычисляющей сумму цифрзаданного натурального числа, запишите самостоятельно по аналогии.

Рекурсивное определение функции С ( т , п ), где 0 <т <п , длявычисления биномиального коэффициента С™ по имеет следующийвид:

Обращение к рекурсивной подпрограмме ничем не отличается отвызова любой другой подпрограммы. При этом при каждом новомрекурсивном обращении в памяти создается новая копия подпрограммысо всеми локальными переменными. Такие копии будут создаваться домомента выхода на граничное условие. Очевидно, что в случаеотсутствия граничного условия, неограниченный рост числа таких копийприведет к аварийному завершению программы, т. е. переполнения стека.

1, если п < 1;

(й-1)!я, если п > 1.

если п < 10;

если п > 10.

128

Page 130: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рекурсивныйподъем

Рекурсивныйспуск

Рекурсивный спуск и рекурсивный подъем

Begin Begin Begin

P; операторы; операторы;операторы; P Р;End; End; операторы

End;

Page 131: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Здесь Р — рекурсивная подпрограмма.Действия в рекурсивной подпрограмме могут выполняться либо на

одном из этапов рекурсивного обращения, либо на обоих сразу. Способорганизации действий диктуется логикой разрабатываемого алгоритма.

Реализуем приведенные ранее рекурсивные определения в видефункций и процедур на Паскале.

Пример 2.22. Программные реализации рекурсивного определенияфакториала:

{Функция на Паскале}

Function Factrial (N : Integer) : Extended;Begin

If N <= 1

Then Factorial := 1

End;

129

Пример 2.23. Программные реализации рекурсивного определенияфункции K ( N ) , возвращающей количество цифр в заданномнатуральном числе N :

{Функция на Паскале}

Function К(N : Longint) : Byte;Begin

If N < 10 Then К := 1

Else К := К (N Div 10) + 1 End;

{Процедура на Паскале}

Procedure K(N : Longint; Var Kol : Byte)Begin

If N < 10 Then Kol := 1 Else Begin

К(N Div 10, Kol);

Kol := Kol + 1 EndEnd;

Пример 2.24. Программные реализации рекурсивного вычислениябиномиальных коэффициентов:

End;

130

Page 132: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Пример 2.25. Вычисление суммы элементов линейного массива.При решении данной задачи используем следующее утверждение:

сумма равна нулю, если число элементов равно нулю, и равна сумме всехпредыдущих элементов плюс последний, если число элементов не равнонулю.

Программа будет иметь следующий вид:

{Программа на Паскале }Program Rec2;

Type LinMas = Array[1..100] Of Integer;

Var A : LinMas;

I, N : Byte;

{Рекурсивная функция}

Function Summa(N : Byte; A : LinMas): Integer;Begin

If N = 0

Then Summa := 0

131

Page 133: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Program Palindrom;

{Рекурсивная функция}

Function Pal(S : String): Boolean;Begin

If Length(S) <= 1

Then Pal := True

Else Pal := (S[1] = S[Length(S)]) AndPal(Copy(S, 2, Length (S) — 2));

End;

Var S : String;

{Основная программа}Begin

Write('Введите строку: ');

ReadLn(S);

132

Page 134: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

3. Описать рекурсивную функцию pow(jc, п) от вещественного Х ( ХФО) и целого я, вычисляющую величину х п по следующей формуле

1

1

х~

"X

при п = 0;

при я < 0;

при я > 0.

4. Даны натуральные числа я и т . Найти НОД(я, /и), используя программу,включающую в себя рекурсивную процедуру вычисления НОД, основанную насоотношении НОД (я, т ) = НОД(ш, г ) , где г — остаток от деления я на т.

2.18. Множества

Одним из фундаментальных разделов математики является теориямножеств. Некоторые моменты математического аппарата этой теорииреализованы в Паскале через множественный тип данных (множества).

Множеством называется совокупность однотипных элементов,рассматриваемых как единое целое. В Паскале могут быть толькоконечные множества. В ТурбоПаскале множество может содержать от 0до 255 элементов.

В отличие от массива элементы множества не пронумерованы и неупорядочены. Каждый отдельный элемент множества не иден-тифицируется и с ним нельзя выполнять какие-либо действия. Действиямогут выполняться только над множеством в целом.

Тип элементов множества называется базовым типом. Базовым можетбыть любой скалярный тип за исключением типа Real.

Конструктор множества. Конкретные значения множества задаются спомощью конструктора множества, представляющего собой списокэлементов, заключенный в квадратные скобки. Сами элементы могутбыть либо константами, либо выражениями базового типа.

Приведем несколько примеров задания множеств с помощьюконструктора:

[ 3 , 4 , 7 , 9 , 1 2 ] — множество из пяти целых чисел;

[1.. 100] — множество целых чисел от 1 до 100; ['а', 'Ь','с'] — множество, содержащее три литеры

а, Ь, с;[ 1 а1. . ' z ' , ' ? ' , ' ! ' ] — множество, содержащее все строчные

латинские буквы, а также знаки ? и !.

Символом «[]» обозначают пустое множество, т.е. множество, несодержащее никаких элементов.

133

Page 135: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Не имеет значения порядок записи элементов множества внутриконструктора. Например, [1, 2, 3] и [3, 2, 1] — это эквивалентныемножества.

Каждый элемент в множестве учитывается только один раз, поэтомумножества [1, 2, 3, 4, 2, 3, 4, 5] и [1..5] эквивалентны.

Переменные множественного типа описываются следующим образом:

Var <идентификатор> : Set Of <базовый тип>.

Например:

Var A, D : Set Of Byte;В : Set Of 'a'..'z';

С : Set Of Boolean;

Нельзя вводить значения в множественную переменную операторомввода и выводить оператором вывода. Множественная переменная можетполучить конкретное значение только в результате выполнения оператораприсваивания следующего формата:

<множественная переменная> := <множественное выражение>

Например:

А := [50,100,150,200];

В := ['пГ , 'п', 'к' ] ;

С := [True,False];

134

Page 136: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Отношение Результат

True False

А= В Множества А и В совпадают В противном случае

А о В Множества А и В не совпадают То же

А< - В Все элементы А принадлежат В »

А>= В Все элементы В принадлежат А »

135

Page 137: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В разделе операторов ей присваивается значение

М := [3,4,7,9];

Тогда операции отношения дадут следующие результаты:

М = [4, 7, 3, 3, 9, ] - True;

М о [7, 4, 3, 9, ] — False;[3, 4] <= м - True;

[] <= М — True;М >= [1..10] - False;М <= [3..9] - True.

Операция вхождения устанавливает связь между множеством искалярной величиной, тип которой совпадает с базовым типоммножества, т.е. если jc— скалярная величина данного типа, а М —множество, то операция вхождения записывается в виде

х in м.

Результатом здесь будет логическая величина True, если значение хвходит в множество М, и False — в противном случае. Для описанногоранее множества

4 In М — True,

5 In М — False.

Рассмотрим несколько задач, для решения которых удобноиспользовать множества.

Пример 2.27. Дана символьная строка. Требуется определить в нейколичество знаков препинания (.— , * : ! ? ) .

Программа для решения данной задачи:

Program Р1;

Var S: String; I, К: Byte;Begin

Page 138: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

иие (s [ I ] = Or (s [I] = и т.д. Использованиемножества сокращает запись.

Пример 2.28. Даны две символьные строки, содержащие толькострочные латинские буквы. Требуется построить строку S3, в которуювойдут только общие символы S1 и S2 в алфавитном порядке и безповторений.

Программа для решения данной задачи:

Program Р2;

Type Mset = Set Of 'а'..'z';

Var SI, S2, S3 : String;

MSI, MS2, MS3 : Mset;

С : Char;

Procedure SM(S : String; Var MS : Mset);

{Процедура формирует множество MS, содержащее всесимволы строки S}Var I: Byte;

Begin MS := [];

For I := 1 To Length(S) Do MS := MS + [S [I]]

End;

137

Page 139: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

3) если после удаления всех кратных чисел последовательность нестала пустой, возвращаются к выполнению первого пункта.

Приведем пример работы такого алгоритма для N =1 5 (здесьподчеркнуты выбранные простые числа):

2 3 4 5 6 7 8 9 10 11 12 13 14 153 5 7 9 11 13 15 5 7 И 137 11 13И 13 13

В программе решения данной задачи удобно использовать мно-жественный тип данных:

Program Eratosfen;

Const N = 201;

{Возможно любое значение 1 < N < 25 6}

Var А, В : Set Of 2. .N;

К, Р : Integer;Begin

{Формирование исходного множества А; В — искомоемножество простых чисел, сначала — пустое}

А := [2..N];

Page 140: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Как уже говорилось, нельзя вводить значения непосредственно вмножество. Однако такая потребность у программиста можетвозникнуть. В этом случае можно использовать процедуру INSET.

Для примера рассмотрим множество с символьным базовым типом,предполагая, что в основной программе глобально объявлен тип SetChar:

Type SetChar : Set Of Char;

Procedure INSET(Var M : SetChar);

Var I, N : Byte; С : Char;Begin

Write('Укажите размер множества: '); ReadLn(N);

M := [];For I := 1 To N Do Begin

Write(I:1,'-й элемент: '); ReadLn(С);

M := M + [C]End;

WriteLn(1 Ввод завершен!')End;

В основной программе для ввода значений в множество, например сименем SIM, достаточно записать оператор INSET(SIM). В результате

139

Page 141: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

д) [ 1 . . 6 ] * [ 3 . . 8 ] ; е ) [ 1 . . 6 ] - [ 3 . . 8 ] ;ж ) [ ] + [ 4 ] ; з ) [ ] * [ 4 ] ;и ) [ ] - [ 4 ] .

4. Составить программу подсчета количества различных значащих цифр вдесятичной записи натурального числа.5. Составить программу, печатающую в возрастающем порядке все целыечисла из интервала 1 . . . 2 5 5 , представленные в виде п 2 + т 2, где п , т > 0.6. Дана строка из строчных русских букв. Между соседними словами —запятая, за последним словом — точка. Составить программу, печатающую валфавитном порядке:

а) все гласные буквы, которые входят в каждое слово;б) все согласные буквы, которые не входят ни в одно слово;в) все согласные буквы, которые входят только в одно слово;г) все гласные буквы, которые входят более чем в одно слово.

2.19. Файлы

С термином «файл» вам уже приходилось встречаться. Прежде всегоэто понятие обычно связывают с информацией на устройствах внешнейпамяти.

В Паскале понятие файла имеет два значения:• поименованная информация на внешнем устройстве (внешнийфайл);• переменная файлового типа в Паскаль-программе (внутреннийфайл).

В программе между этими объектами устанавливается связь.Вследствие этого все, что происходит в процессе выполнения программыс внутренним файлом, дублируется во внешнем файле. С элементамифайла можно выполнять только две операции: считывать из файла,записывать в файл.

Файловый тип переменной — структурированный тип, представ-ляющий собой совокупность однотипных элементов, число которыхзаранее (до исполнения программы) не определено.

Структура описания файловой переменной имеет вид

Var <имя переменной> : File Of <тип элемента>;

Здесь <тип элемента> может быть любым, кроме файлового.Например:

140

Page 142: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Эл. 0 Эл. 1 Эл. N М.к.

Эл. 0 Эл. 1 М.к.

Эл. 0 Эл. 1 Эл. N М.к.

Число элементов, хранящихся в данный момент в файле, называетсяего текущей длиной. Существует специальная ячейка памяти, котораяхранит адрес элемента файла, предназначенного для текущей обработки(записи или считывания). Этот адрес называется указателем, или окном,файла.

Для того чтобы начать запись в файл, его следует открыть длязаписи. Это обеспечивает процедура Rewrite(FV); (где FY— имяфайловой переменной). При этом указатель устанавливается на началофайла. Если в файле до этого была информация, она исчезает.

Схематически выполнение процедуры Rewrite можно представить вследующем виде:

До:

После: М.к.

Т

Rewrite (FV);

Стрелкой снизу отмечается позиция указателя.Запись в файл осуществляется процедурой Write (FV, V); (где V —

переменная того же типа, что и файл FV). Запись происходит в томместе, на которое установлено окно (указатель файла). Сначалазаписывается значение, затем указатель смещается в следующуюпозицию. Если новый элемент вносится в конец файла, сдвигаетсямаркер конца.

Схема выполнения данной процедуры следующая:

До:

Write(FV, V);

После: Эл. О Эл. 1 Эл. N М.к.

Т

Пример 2.30. Требуется в файловую переменную Fx внести 20 ве-щественных чисел, последовательно вводимых с клавиатуры.

141

Page 143: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Эл. 0 Эл. 1 Эл. N М.к.

ResetfFW Т

Эл. 0 Эл. 1 Эл. N М.к.

Эл. 0 Эл. 1 Эл. К Эл. К+ 1 Эл. N М.к.

ТRead(FV, V);

V

Эл. 0 Эл. 1 Эл. К Эл. К+ 1 Эл. N М.к. Эл. К

Т

Считывние из файла осуществляется процедурой Read (FV, V); (где V— переменная того же типа, что и файл FV). При этом значение текущегоэлемента файла записывается в переменную V, а указатель смещается кследующему элементу.

Схема выполнения данной процедуры следующая:

Page 144: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Т

Доступ к элементам файла может быть последовательным илипрямым. В стандартном Паскале допускается только последовательныйдоступ к элементам.

142

Принцип последовательного доступа', для того чтобы прочитать я-юзапись файла, сначала следует прочитать все предыдущие записи с 1-й по(я - 1)-ю.

Пример 2.31. Требуется в переменной jc получить 10-й элементвещественного файла Fx.

Программа решения следующая:

Program А;

Var Fx : File Of Real;

X : Real;Begin

Reset(Fx);

For I := 1 To 10 Do Read(Fx, X)End.

Функция Eof(FV) проверяет маркер конца файла (end of file). Этологическая функция, которая получает значение True, если указательустановлен на маркер конца, и значение False — в противном случае.

Пример 2.32. Требуется просуммировать все числа из файла Fx,описанного в примере 2.31.

Программа решения следующая:

Reset(Fx);

Sx := 0;While Not Eof(Fx) Do

Begin

143

Page 145: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ческие устройства с файловой структурой организации данных. Всенемагнитные внешние устройства — однофайловые. Иначе говоря, скаждым из них связан один файл со стандартным именем,предназначенный для обмена с внутренней памятью ЭВМ текстовой(символьной) информацией.

Стандартные имена логических устройств определяются опе-рационной системой, в среде которой работает Паскаль. В системе MSDOS определены следующие имена:

CON (консоль) — логическое устройство, связанное при вводе склавиатурой, при выводе — с экраном;

PRN (принтер) — логическое имя файла, связанного с устройствомпечати;

AUX — логическое имя коммуникационного канала, которыйиспользуется для связи ПК с другими машинами;

INPUT — стандартное устройство ввода, связанное с клавиатурой,причем вводимые с клавиатуры символы отражаются на экране дисплея;

OUTPUT — стандартное устройство вывода на экран.Магнитный диск (МД) — многофайловое устройство. На нем могут

храниться как стандартные (системные) файлы, так и файлы,создаваемые пользователем. На магнитном диске могут создаватьсяфайлы любых типов. Файлы на МД могут использоваться как в режимесчитывания, так и в режиме записи.

Список файлов на диске хранится в директории (каталоге) диска.Каталог вызывается на экран системной командой DIR. В полной формекаталог содержит идентификаторы файлов, объем занимаемой памяти,дату и время создания файла. Идентификатор файла состоит из имени итипа файла:

<имя файла>.<тип файла>

Имя файла содержит от одной до восьми латинских букв и (или)цифр; тип файла — необязательный элемент (от нуля до трех символов),указывающий на характер информации, хранимой в файле. Например:

PROGRAM.PAS — в файле текст программы на Паскале;NUMBER.DAT— файл числовых данных;NAMES.TXT — текстовый файл.Для организации связи между файловой переменной и внешним

файлом в ТурбоПаскале используется следующая процедура назначения:

Assign(<имя файловой переменной>,

144

Page 146: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Assign(Fi, 'Number.dat');

После выполнения процедур Assign и Rewrite создается новыйвнешний файл, имя которого заносится в директорию.

Если файл открывается для считывания (Assign и Reset), то вуказанном каталоге уже должен содержаться указанный внешний файл.В противном случае будет обнаружена ошибка.

Работа с файлом в программе завершается его закрытием с помощьюследующей процедуры:

Close(<имя файловой переменной>);

Например:

Close(Fi).

Итак, последовательность действий при создании и заполнениифайла:• описать файловую переменную;• описать переменную того же типа, что и файл;• произвести назначение (Assign);• открыть файл для записи (Rewrite);• записать в файл данные (Write);• закрыть файл (Close).

Пример 2.33. Требуется создать файл, содержащий среднесуточныетемпературы за некоторое количество дней. При этом не обязательнопредварительно указывать количество чисел во вводимой информации.Можно договориться о каком-то условном шачении, которое будетпризнаком конца ввода, например число 9999.

Программа решения следующая:

Program Taskl;

Var Ft : File Of Real; T : Real;

Begin145

Page 147: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В результате работы этой программы на диске будет создан файл сименем Temp.dat, в котором сохранится введенная информация.

Для последовательного считывания данных из файла требуетсявыполнить следующие действия:• описать файловую переменную;• описать переменную того же типа;• выполнить назначение (Assign);• открыть файл для считывания (Reset);• в цикле считывать из файла (Read);• закрыть файл (Close).

Пример 2.34. Требуется определить среднюю температуру длязначений, хранящихся в файле Temp.dat.

Программа решения следующая:

Program Task2;

Var Ft : File Of Real;

T, St : Real; N : Integer;

Begin Assign(Ft, 'Temp.dat');

Reset(Ft);

St := 0;While Not Eof(Ft) Do

Begin

Read(Ft, T) ;

146

Page 148: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

S, S2 S*. М.к.с. S, ^2 S*2 М.к.с. М.к.ф.

При этом каждый символ представлен во внутреннем коде (ASCII) изанимает 1 байт. Однако не только делением на строки отличаетсятекстовый файл от символьного: в текстовый файл можно записать, атакже считать из него информацию любого типа. Если эта информациясимвольная, то в процессе считывания или записи происходит еепреобразование из символьной формы во внутреннюю, и обратно.

Текстовый файл можно создать или преобразовать с помощьютекстового редактора, его также можно просмотреть на экране дисплеяили распечатать на принтере.

В программах на Паскале для работы с текстовыми файлами наряду спроцедурами Read и Write употребляются процедуры ReadLn и WriteLn.

Процедура, считывающая строку из файла с именем FV и по-мечающая прочитанное в переменные из списка ввода:

ReadLn(FV, <список ввода>).

Процедура, записывающая в файл FV значения из списка вывода ивыставляющая маркер конца строки:

WriteLn(FV, <список вывода>).

Функция Eoln (FV) используется для обнаружения конца строки в147

Page 149: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ла достиг маркера конца строки, и значение False — в противном случае.Употребление операторов Read и ReadLn без указания имени

файловой переменной означает считывание из стандартного файла Input(ввод с клавиатуры). Употребление операторов Write и WriteLn без именифайловой переменной означает запись в стандартный файл Output (выводна экран). Эти варианты операторов мы уже многократно использовали.Считается, что файлы Input и Output открываются соответственно длясчитывания и записи при работе любой программы.

При вводе с клавиатуры маркер конца строки обнаруживается принажатии клавиши <Enter>.

Процедура ReadLn может использоваться без списка ввода. В этомслучае происходит пропуск текущей строки в считываемом файле.

Употребление процедуры WriteLn без списка вывода означает выводпустой строки (в файле выставляется маркер конца строки).

При записи в текстовый файл в списке вывода могут присутствоватьформаты. Действия форматов уже рассматривались при описании выводаданных на экран (см. подразд. 2.6). Точно также форматы работают и привыводе в текстовые файлы, связанные с любыми другими устройствами.

Пример 2.35. Пусть файл с именем Note.txt содержит некоторыйтекст. Требуется определить количество строк в этом тексте.

Программа решения следующая:

Var Note : Text; К : Integer;Begin

Assign(Note, 'Note.txt');

Reset(Note);

К := 0;

While Not Eof(Note) DoBegin

148

Page 150: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

М (кг) 36,3 F (Н) 2 000 V (м/с) К (кг/м) 50,5 0,5

Координаты контрольных точек (м)

Д1) Х(2) Х(3 ) Х(4 ) Х(5 )

10 100 150 1 000 3 000

149

Page 151: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Следует ввести числовые данные в вещественные переменные М, F,V, К и массив Х[1..5], произвести расчеты, получить результаты вмассиве Т[1..5], вывести их на экран, а также в текстовый файл на диске сименем Result.txt.

Приведем программу решения без расчетной части, показав тольковвод исходных данных и вывод результатов:

Var М, F, V, К : Real; I : Integer;

Т, X : Array[1..5] Of Real;

FR, FD : Text;Begin

{РАСЧЕТНАЯ ЧАСТЬ ПРОГРАММЫ}

{----Вывод результатов на экран и в файл FR---------}

WriteLn('Результаты '); WriteLn;

WriteLn(FR, ' Результаты'); WriteLn(FR);

WriteLn ( ' T(l) T(2) T(3) T(4) T (5) ');

WriteLn(FR, ' T(l) T(2) T(3) T(4) T(5)');For I := 1 To 5 Do

150

Page 152: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2. Даны два файла целых чисел. Определить, являются ли они тожде-ственными.3. Даны два символьных файла одинакового размера. Произвести об-мен информацией между ними.4. Имеется внешний текстовый файл. Напечатать первую из самыхкоротких его строк.5. Описать процедуру Lines (Т), которая построчно печатает содержи-мое непустого текстового файла Т, вставляя в начало каждой печатаемойстроки ее порядковый номер, занимающий четыре позиции, и пробел.6. В текстовом файле Т записана непустая последовательность веще-ственных чисел, разделенных пробелами. Описать функцию Мах(Т) длянахождения наибольшего из этих чисел.

2.20. Комбинированный тип данных

Все структурированные типы данных, которые уже рассматри-вались, представляют собой совокупности однотипных величин.

Комбинированный тип данных— структурированный тип, со-стоящий из фиксированного числа компонент (полей) разноготипа. Другое его название — запись.

Обычно запись содержит совокупность разнотипных атрибу-тов, относящихся к одному объекту. Например, анкетные сведе-ния о студенте вуза можно представить в виде информационнойструктуры, показанной на рис. 2.28, которая называется одноуров-невым деревом. В Паскале эта информация может храниться в од-ной переменной типа Record (запись). Задать тип и описать соот-ветствующую переменную можно следующим образом:

Type Anketal = Record

FIO : String[50];

Pol : Char;

{Поля}

{записи}

Рис. 2.28. Одноуровневое дерево

151

Page 153: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Такая запись, как и соответствующее ей дерево, называетсяодноуровневой.

К каждому элементу записи можно обратиться, используя составноеимя, которое имеет следующую структуру:

<имя переменной>.<имя поля>

Например, Student.FIO; Student.Dat и т.д.Если, например, полю «Курс» требуется присвоить значение

3,то это делается следующим образом:

Student.Curs := 3;

Поля записи могут иметь любой тип, в частности, сами могут бытьзаписями. Такая возможность используется в случае, если требуетсяпредставить многоуровневое дерево (более одного уровня). Например, теже сведения о студентах можно отобразить двухуровневым деревом,показанным на рис. 2.29.

Такая организация данных позволит, например, делать выборкиинформации по году рождения или по городу, где живут студенты. В этомслучае описание соответствующей записи будет иметь следующий вид:

Type Anketa2 = Record

FIO: String[50];

Pol: Char;Dat: Record

God: Integer;

Mes: String[10];

152

Page 154: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 2.29. Двухуровневое дерево

В программе могут использоваться массивы записей. Если нафакультете 500 студентов, то все анкетные данные о них можнопредставить в массиве:

Var Student : Array[1..500] Of Anketal;

В этом случае, например, год рождения 5-го в списке студента хранитсяв переменной Student[5].Dat.God.Любая обработка записей (в том числе ввод и вывод) производитсяпоэлементно. Например, ввод сведений о 500 студентах можновыполнить следующим образом:

For I := 1 То 500 Do

With Student[I] DoBegin

< Комбинированный тип>Record —<Список> —*- End

<Список> <Имя поля> -1--О —<Тип>

Рис. 2.30. Структура описания комбинированного типа

Page 155: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В этом примере использован оператор присоединения, имеющийследующий вид:

With <переменная типа запись> Do <оператор>;

Этот оператор позволяет, один раз указав имя переменной типа«Запись» после слова With, работать в пределах оператора с именамиполей как с обычными переменными, т.е. не писать громоздкихсоставных имен.

Тип «Запись» в Паскале может иметь переменный состав полей,который изменяется в ходе выполнения программы. Эта возможностьреализуется с использованием так называемой вариантной части записи(подробнее см. в специальной литературе по языку Паскаль).

Работа с файлами записей. Чаще всего записи используются какэлементы файлов, составляющих компьютерные информационныесистемы. Рассмотрим примеры программ, работающих с файламизаписей.

Пример 2.38. Требуется сформировать файл FM.DAT, содержащийэкзаменационную ведомость одной студенческой группы. Записи файласостоят из следующих элементов: ФИО; номер зачетной книжки; оценка.

Программа решения задачи:

Program Examen;

Type Stud - Record

FIO : String[30];

Nz : String[6];

Mark : 2..5 End;

Var Fstud : File Of Stud;

154

Page 156: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Прежде чем перейти к следующему примеру, связанному собработкой сформированного файла, рассмотрим еще одно средствоработы с файлами.

Прямой доступ к записям файла. В стандартном языке Паскальдопустим только последовательный доступ к элементам файла. Одной издополнительных возможностей, реализованных в ТурбоПаскале,является прямой доступ к записям файла.

Как уже отмечалось, элементы файла пронумерованы в порядке ихзанесения в файл, начиная с нуля. Задав номер элемента файла, можнонепосредственно установить на него указатель, после чего можносчитывать или перезаписывать данный элемент.

Установка указателя на заданный элемент файла производитсяпроцедурой

Seek(FV, n).

Здесь FV — имя файловой переменной, п — порядковый номерэлемента.

Приведем пример использования этой процедуры.

Пример 2.39. Имеется файл, сформированный программой из примера2.38. Пусть некоторые студенты пересдали экзамен и получили новыеоценки. Требуется составить программу внесения результатовпереэкзаменовки в файл, которая будет запрашивать номер студента введомости и его новую оценку. Работа заканчивается при вводенесуществующего номера (9999).

Программа решения следующая:

Program New_Marks;Type Stud = Record

FIO : String[30]; Nz : String[6];

Mark : 2..5 End;

Var Fstud: File Of Stud;

Page 157: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ReadLn(S.Mark) ;

Seek(Fstud, N — 1);

Write(Fstud, S);

Write('Номер в ведомости? ');

ReadLn(N);End;

WriteLn('Работа закончена!');

Close(Fstud)End.

Данный пример требует некоторых пояснений. Список студентов введомости пронумерован, начиная с единицы, а записи в файленумеруются с нуля. Следовательно, если п — это номер в ведомости, тономер соответствующей записи в файле равен п - 1. После прочтениязаписи номер п-\ указатель смещается к следующей п-й записи. Дляповторного внесения на то же место исправленной записи повторяютустановку указателя.

Упражнения

1. Описать запись, содержащую сведения о рейсе самолета.2. Описать массив записей, содержащий таблицу химических элементов Д. И.Менделеева. Составить программу заполнения массива.

Page 158: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Указатель Величина

Адрес Значение

Рис. 2.31. Схема действия указателя

157

Page 159: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Приведем примеры описания указателей:

Type Massiv = Array[1..100] Of Integer;

Var PI : AInteger;

P2 : AChar;

Pm : ''Massiv;

Здесь PI — указатель на динамическую величину целого тала; Р2 —указатель на динамическую величину символьного типа; РМ — ука-затель на динамический массив, тип которого задан в разделе Туре.

Сами динамические величины не требуют описания в программе,поскольку во время компиляции память под них не выделяется. Во времякомпиляции память выделяется только под статические величины.Указатели — это статические величины, поэтому они требуют описания.

Память под динамическую величину, связанную с указателем,выделяется в результате выполнения стандартной процедуры NEW.Формат обращения к этой процедуре следующий:

NEW(<указатель>);

Статическая память Динамическая память

158

Рис. 2.32. Связь указателей с динамическими величинами

Page 160: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Например, Р1л — это обозначение динамической переменной, накоторую ссылается указатель Р1.

На схеме, представленной на рис. 2.32, показана связь междудинамическими величинами и их указателями.

Далее работа с динамическими переменными происходит точно гакже, как со статическими переменными соответствующих типов, т.е. имможно присваивать значения, их можно использовать в качествеоперандов в выражениях, параметров подпрограмм и т.д. Например, еслипеременной Р1Л требуется присвоить число 25, переменной Р2Л

присвоить значение символа «W», а массив РМА заполнить по порядкуцелыми числами от 1 до 100, это делается следующим образом:

Р1Л := 25; Р2Л := 'W';For I := 1 То 100 Do РМЛ[1] := I;

Кроме процедуры NEW значение указателя может определятьсяследующим оператором присваивания:

<указатель> := <ссылочное выражение:»;

В качестве ссылочного выражения можно использовать:• указатель;• ссылочную функцию (т.е. функцию, значением которой являетсяуказатель);• константу Nil.

Nil — это зарезервированная константа, обозначающая пустуюссылку, т.е. ссылку, которая ни на что не указывает. При присваиваниибазовые типы указателя и ссылочного выражения должны бытьодинаковыми. Константу Nil можно присваивать указателю с любымбазовым типом.

Ссылочная переменная до присваивания ей значения (с помощьюоператора присваивания или процедуры NEW) является неопределенной.

Ввод и вывод указателей не допускается.Рассмотрим пример. Пусть в программе описаны следующие

указатели:

Var D, Р : AInteger;

К : лВоо1еап;

Тогда допустимыми являются операторы присваивания 159

Page 161: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Если динамическая величина теряет свой указатель, она становится«мусором». В программировании так называют не нужную информацию,занимающую память.

Представьте, что в программе с описанными ранее указателями вразделе операторов записано следующее:

NEW(D); NEW(Р);

{Выделено место в динамической памяти под две целыепеременные. Указатели получили соответствующие значения }

DA := 3; РЛ := 5;

{Динамическим переменным присвоены значения}

Р := D;

{Указатели Р и D стали ссылаться на одну и ту жевеличину, равную 3}

WriteLn(P/', DA) ; {Дважды печатается число 3}

Таким образом, динамическая величина, равная 5, потеряла свойуказатель и стала недоступной. Однако место в памяти она занимает. Этои есть пример возникновения «мусора». На рис. 2.33 показано, чтопроизошло в результате выполнения оператора Р := D.

В Паскале имеется стандартная процедура, позволяющая осво-

Рис. 2.33. Механизм возникновения «мусора»

160

Page 162: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

заться недостаточно. Размер динамической памяти намного больше(сотни килобайт), поэтому ее использование позволяет существенноувеличить объем обрабатываемой информации.

Следует отчетливо понимать, что работа с динамическими даннымизамедляет выполнение программы, поскольку доступ к величинепроисходит в два шага: сначала определяется указатель, а штем по нему— величина. Как это часто бывает, действует «закон сохранениянеприятностей», т. е. выигрыш в объеме памяти компенсируетсяпроигрышем во времени.

Пример 2.40. Требуется создать вещественный массив из 10 ОООчисел и заполнить его случайными числами в диапазоне от 0 до 1.Вычислить среднее значение массива. Очистить динамическую память.Создать целый массив размером 10000, заполнить его случайнымицелыми числами в диапазоне от -100 до 100 и иычислить его среднеезначение.

Программа решения следующая:

Program Sr;

Const NMax = 10000;

Type Diapazon = l..NMax;

Maslnt = Array[Diapazon] Of Integer;

MasReal = Array[Diapazon] Of Real;

Var Plint : ''Maslnt;

PReal : AMasReal;

161

Page 163: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

X , Рг — » * 2 Рг - > * 3 РА — > * 4 N i l

*i Рг — » *2 Рз — > *3 РА —> *4 Рь —» *5 N i l

Каждый элемент списка состоит из двух частей: информационной (хь

х2,...) и указателя на следующий элемент ( р 2 , р ^„...). Последний элементимеет пустой указатель Nil. Связанный список такого типа называетсяоднонаправленной цепочкой.

В сформулированной задаче информационная часть содержитследующие вещественные числа: х х — результат первого измерения; х 2

— результат второго измерения; х3 — результат третьего измерения; х 4

— результат последнего измерения. Связанный список обладает темзамечательным свойством, что его можно дополнять по мерепоступления новой информации. Дополнение происходитприсоединением нового элемента к концу списка, а значение Nil впоследнем элементе заменяется ссылкой на новый элемент цепочки:

Связанный список не занимает лишней памяти. Память расходуется втом объеме, который требуется для поступившей информации.

В программе для представления элементов цепочки используетсякомбинированный тип данных — запись. В нашем примере тип такогоэлемента может быть следующим:

162

Page 164: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Туре Ре = AElem;Elem = Record

T : Real;

P : Pe End;

Здесь Ре — это ссылочный тип на переменную типа Elem. Этимименем обозначен комбинированный тип, состоящий из двух полей: Т —вещественной величины, хранящей значение температуры, и Р —указателя на динамическую величину типа Elem.

В данном описании нарушен один из основных принципов языкаПаскаль, согласно которому на любой программный объект можноссылаться только после его описания. В самом деле, тип Ре определяетсячерез тип Elem, который, в свою очередь, определяется через тип Ре.Однако в Паскале существует единственное исключение из этогоправила, связанное со ссылочным типом. Приведенный фрагментпрограммы является правильным.

Пример 2.41. Программа формирования связанного списка в чодеввода данных:

Туре Ре = АТурЕ1еш;

TypElem = Record

Т : Real; Р : РеEnd;

163

Page 165: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

{Вывод полученной числовой последовательности}

WriteLn('Контрольная распечатка');

Elem := Beg;Repeat

WriteLn(N, ElemA.T : 8 : 3);

Elem := Е1етЛ.Р

Until Elem = NilEnd.

Здесь ссылочная переменная Beg используется для сохранения адресаначала цепочки. Всякая обработка цепочки начинается с ее первогоэлемента. В программе показано, как происходит продвижение поцепочке при ее обработке (в данном примере при распечаткеинформационной части списка по порядку).

Однонаправленная цепочка — простейший вариант связанногосписка. В практике программирования используются такжедвунаправленные цепочки (когда каждый элемент хранит указатель наследующий и предыдущий элементы списка) и двоичные деревья.Подобные структуры данных называются динамическими.

Одной из часто употребляемых в программировании динамическихструктур данных является стек. Стек — это связанная цепочка, началокоторой называется вершиной и состав элементов которой постоянноменяется. Каждый вновь поступающий элемент устанавливается ввершине стека. Удаление элементов из стека также производится свершины.

Стек подобен детской пирамидке, в которой на стержень надеваютсякольца. Всякое новое кольцо оказывается на ее вершине. Снимать кольца164

Page 166: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

входе в процедуру и при выходе из нее. Следовательно, этот параметрявляется и аргументом, и результатом процедуры. В случае когда стекпустой, указатель Beg равен Nil.

Procedure INSTEK(Var Beg : Pe; Sim : Char);

Var X : Pe;

Begin New(X);

ХЛ.С := Sim;

ХЛ.Р := Beg;

Beg := XEnd;

В приведенной далее процедуре OUTSTEK параметр Beg играет ту жероль, что и в предыдущей процедуре, т. е. после удаления последнегосимвола его значение станет равным Nil. Ясно, что если стек пустой, тоудалять из него нечего. Логический параметр Flag позволяет распознатьэтот случай: если на выходе из процедуры Flag = True, это значит, чтоудаление произошло, а если Flag = False, это значит, что стек был пуст иничего не изменилось.

Procedure OUTSTEK (Var Beg : Pe; Var Flag : Boolean);

Var X : Pe;165

Page 167: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2. В программе имеются описания

Туре А = AChar;

В = Record FI : Char; F2 : A End;Var Р : ЛВ; Q: А;

Определить значения всех указателей и динамических переменных послевыполнения следующих операторов:

NEW (Q) ; <2Л := '7';NEW(Р); Рл.FI := Succ(QA); PA.F2 :=Q;

3. Найти ошибки в следующей программе:

Program Example;

Var А, В : AInteger;

Begin If А = Nil Then Read(A);

AA := 5; В := Nil; ВЛ := 2;

NEW(В); Read(BA); WriteLn(В, Вл);

NEW (A); В := A; DISPOSE (A) ; Вл:= 4End.

4. Составить программу занесения в динамическую память вещественногомассива из 10 000 чисел, хранящегося в файле на магнитном диске, а также поискав нем значения и номера первого максимального элемента.5. Выполнить четвертое упражнение при условии, что размер числового166

Page 168: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

пилируются отдельно и в дальнейшем могут быть использованы нетолько самим разработчиком. Если программист имеет достаточнобольшие наработки и если те или иные подпрограммы могут бытьиспользованы при написании новых приложений, приходится этиподпрограммы целиком включать в новый текст.

В ТурбоПаскале это ограничение преодолевается, во-первых,введением внешних подпрограмм, а во-вторых, созданием и ис-пользованием модулей. Рассмотрим оба способа.

Введение внешних подпрограмм. В этом случае исходный тексткаждой процедуры или функции хранится в отдельном файле и принеобходимости с помощью специальной директивы компиляторавключается в текст создаваемой программы.

Проиллюстрируем этот прием на примере следующей задачицелочисленной арифметики: дано натуральное число «, требуется иайтисумму первой и последней цифр этого числа.

Для решения задачи используем функцию, вычисляющую число цифрв записи натурального числа. Например:

Function Digits(N : Longint): Byte;

Var Kol : Byte;Begin

Kol := 0;While N о 0 Do

Begin

Kol := Kol + 1;

N := N Div 10End;

167

Page 169: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Program Examplel;

Var N, S : Integer;

{$1 digits.inc} {Подключение внешней функции из файлаdigits.inc, вычисляющей количество цифр в записи числа} {$1power.inc} {Подключение внешней функции из файла power.inc,

вычисляющей результат возведения числа А в степень N}Begin

Write('Введите натуральное число: '); ReadLn(N); {Дляопределения последней цифры числа N берется остаток отделения этого числа на 10, а для определения первойцифры число N делится на число 10, возведенное встепень, на единицу меньшую, чем количество цифр взаписи числа N (так как нумерация разрядов начинаетсяс 0) }

S := N Mod 10 + N Div Power(10, Digits(N) — 1);WriteLn('Искомая сумма: ', S)

End.

Директива компилятора {$1 <имя файла>} позволяет в данное местотекста программы вставить содержимое файла с указанным именем.

Файлы с расширением .inc можно накапливать на магнитном диске,формируя таким образом личную библиотеку подпрограмм.

Внешние процедуры создаются и внедряются в использующие ихпрограммы так же, как и функции в рассмотренной задаче.

Создание и использование модулей. Рассмотрим теперь структуру,разработку, компиляцию и использование модулей.

Модуль — это набор ресурсов (функций, процедур, констант, пере-менных, типов и т.д.), разрабатываемых и хранимых независимо отиспользующих их программ. В отличие от внешних подпрограмм, мо-дуль может содержать достаточно большой набор процедур и функций,168

Page 170: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

После служебного слова Unit записывается имя модуля, которое (дляудобства дальнейших действий) должно совпадать с именем файла,содержащего данный модуль. Следовательно (как принято в MS DOS),имя не должно содержать более восьми символов.

В разделе Interface объявляются все ресурсы, которые будут вдальнейшем доступны программисту при подключении модуля. Дляподпрограмм здесь указывается лишь полный заголовок.

В разделе Implementation описываются все подпрограммы, которыебыли ранее объявлены. Кроме того, в нем могут содержаться своиконстанты, переменные, типы, подпрограммы, которые носятвспомогательный характер и используются для написания основныхподпрограмм. В отличие от ресурсов, объявленных в разделе Interface,все, что дополнительно объявляется в Implemen- lation, уже не будетдоступно при подключении модуля. При описании основнойподпрограммы достаточно указать ее имя, не переписывая полностьювесь заголовок, а затем записать тело.

Раздел инициализации (зачастую отсутствующей) содержитоператоры, которые должны быть выполнены сразу же после запускапрограммы, использующей модуль.

Приведем пример разработки и использования модуля. (Посколькурассматриваемая далее задача достаточно элементарна, ограничимсяраспечаткой текста программы с подробными комментариями.)

Пример 2.43. Реализовать в виде модуля набор подпрограмм длявыполнения над обыкновенными дробями вида Р/Q (где Р — целоечисло, Q— натуральное число) следующих операций: сложения,вычитания, умножения, деления, сокращения, возведения в степень N(где N— натуральное число), а также функций, реализующих операцииотношения (равно, не равно, больше или равно, меньше или равно,больше, меньше).

При этом дробь представить следующим типом:

Type Fraс = Record

Р : Integer;

Q : 1 . . 3 2 7 6 7 End;

С использованием разработанного модуля решить две задачи.1. Дан массив А, элементы которого — обыкновенные дроби. 11айтисумму всех элементов и их среднее арифметическое. Ответыпредставить в виде несократимых дробей.2. Дан массив А, элементы которого — обыкновенные дроби. < )тсортировать его в порядке возрастания.

169

Page 171: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Unit Droby;Interface

Type

Natur = 1..High(Longint);

Frac = Record

P : Longint;

Q : Natur End;

Procedure Sokr(Var A : Frac);

Procedure Summa(A, В : Frac; Var С : Frac); Procedure Raznost(A, В : Frac; Var С : Frac); Procedure Proizvedenie(A, В : Frac; Var С : Frac) Procedure Chastnoe(A, B: Frac; Var С : Frac); Procedure Stepen(A : Frac; N : Natur; Var С : Frac) Function Menshe(A, В : Frac): Boolean;

Function Bolshe(A, В : Frac): Boolean;

170

Page 172: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

N := NodEvklid(M, A.Q);

A.P := A.P Div N;

A.Q := A.Q Div NEnd

End;

Procedure Summa; {Сумма дробей}Begin

{Знаменатель дроби}

C.Q := (A.Q * B.Q) Div NodEvklid(A.Q, B.Q); {Числитель дроби}

C.P := A.P * C.Q Div A.Q + B.P * C.Q Div B.Q; Sokr(C)

End;

Procedure Raznost; {Разность дробей}Begin

End;

171

Page 173: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Function Menshe;{Отношение «<» между дробями}Begin

Menshe := A.P * B.Q < A.Q * B.P End;

Function Bolshe; {Отношение «»> между дробями} Begin

Bolshe := A.P * B.Q > A.Q * B.P End;

Function Ravno; {Отношение «=» между дробями}Begin

Ravno := A.P * B.Q = A.Q * B.P End;

Function BolsheRavno; {Отношение «>» между дробями}Begin

BolsheRavno := Bolshe(A, B) Or Ravno(A, B)End;

Function MensheRavno; {Отношение «<» между дробями}Begin

172

Page 174: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Program Sum;

Uses Droby;

Var A : Array[1..100] Of Frac;

I, N : Integer;

S : Frac;Begin

Write('Введите количество элементов массива: ');

ReadLn(N);

S.P := 0; S.Q := 1; {Первоначально сумма равна нулю]

For I := 1 To N Do {Вводим и суммируем дроби}Begin

Write('Введите числитель ', I, '-й дроби: ');

Page 175: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Г Л А В А 3

МЕТОДЫ ПОСТРОЕНИЯ АЛГОРИТМОВ

3.1. Метод последовательной детализацииВ соответствии с основами структурного программирования, метод

последовательной детализации является приемом проектированиясложных алгоритмов. Суть этого метода (см. подразд. 1.6) заключается вследующем: сначала анализируется исходная задача, в ней выделяютсяподзадачи и строится иерархия таких подзадач (рис. 3.1). Далеесоставляются алгоритмы (или программы), начиная с основногоалгоритма (основной программы), а затем — вспомогательныеалгоритмы с последовательным углублением уровня, пока не будутполучены алгоритмы (подпрограммы), состоящие из простых команд.

Вернемся к примеру 2.17, в котором приведена программаInterpretator для решения исходной символьной строки вида ’А + В =’.

Сформулируем требования к программе Interpretator, которыесделают ее более универсальной, чем вариант, рассмотренный вподразд. 2.15.1. Операнды а и b могут быть многозначными целыми положи-тельными числами в пределах Maxlnt.2. Между элементами строки, а также в ее начале и конце могут бытьпробелы.

Задача

Подзадача 1 Подзадача 2 Подзадача 3

Подзадача 11) (Подзадача 12) (Подзадача 31) (Подзадача 32

174

Рис. 3.1. Иерархия подзадач

Page 176: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

-

3. Должен осуществляться синтаксический контроль текста,который ограничивается простейшим вариантом: строка должнасостоять только из цифр, знаков операций, знака «=» и пробелов.4. Должен проводиться семантический контроль: строка должна бытьпостроена по схеме 'а® b ='. Ошибка, если какой-то элемент отсутствуетили нарушен их порядок.5. Должен осуществляться контроль диапазона значений операндови результата (значения не должны выходить за пределы Maxlnt).

Из приведенного перечня требований ясно, что программа будетнепростой. Составлять ее будем, используя метод последовательнойдетализации. Начнем с представления в самом общем виде алгоритмакак линейной последовательности этапов решения задачи.1. Ввод строки.2. Синтаксический контроль (определение, нет ли недопустимыхсимволов).3. Семантический контроль (определение, правильно ли построеновыражение).4. Выделение операндов, проверка их соответствия допустимомудиапазону значений и перевод в целые числа.5. Выполнение операции, проверка соответствия результатадопустимому диапазону значений.6. Вывод результата.

Этапы 2...5 будем рассматривать как подзадачи первого уровня,соответственно назвав их (и будущие подпрограммы) Sintax, Semantika,Operand, Calc. Для их реализации потребуется решение следующихподзадач: пропуск лишних пробелов (Propusk) и преобразованиесимвольной цифры в целое число (Cifra). Кроме того, при выделенииоперандов потребуется распознавать операнд, превышающиймаксимально допустимое значение (Error). Обобщая все сказанное всхематической форме, получаем некоторую структуру подзадач, которойбудет соответствовать аналогичная структура программных модулей(рис. 3.2).

175

Page 177: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Первый шаг детализации. Сначала наметим все необходимые под-программы, указав лишь их заголовки (спецификации). На местеподпрограмм запишем поясняющие комментарии (такой вид под-программы называют заглушкой). Затем напишем основную частьпрограммы.

Program Interpretator;

Type Pozlnt = 0..Maxlnt;

Var Line : String;

A, В : Pozlnt;

Znak : Char;

Flag : Boolean;

Rezult : Integer;

Procedure Propusk(Stroka : String; M : Byte; Var N :Byte);

Begin

{---Пропускает подряд стоящие пробелы в строке Stroka,

176

Page 178: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

End;

Procedure Calc(A, В : Pozlnt; Znak : Char; Var Rez: Integer; Var Flag : Boolean);

Begin

{- - - -Вычисляет результат операции. Проверяет при-надлежность результата диапазону от — Maxlnt до Maxlnt.Flag — признак результата проверки. Результат операции

получается в переменной Rez--------}End;

Begin {-----Начало основной части программы---------}

WriteLn('Введите выражение: ');

WriteLn;

Read(Line);

If Not Sintax(Line)

Then WriteLn('Недопустимые символы1)

177

Page 179: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

For I := 1 To Length(Stroka) Do

If Not ((Stroka[I] = ' ') Or Cifra(Stroka[I]) Or (Stroka[I] = '+') Or (Stroka[I] = '-') Or (Stroka[I] = '*') Or (Stroka[I] = '=')) Then Sintax : = False End;

Function Semantika(Stroka : String): Boolean;

Var I : Byte;Begin

Semantika := True;

Propusk(Stroka, 1, I);

If Not Cifra(Stroka[I])Then

Begin

Semantika :— False;

ExitEnd;

178

Page 180: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

If I < Length(Stroka)Then

Begin

Semantika := False;

ExitEnd

End;

Procedure Operand(Stroka : String; Var A, В : Pozlnt; VarZ: Char; Var Flag : Boolean);

Var P, Q : String;

I : Byte;

Code : Integer;

Function Error(S : String): Boolean;

{Функция принимает значение True, если в строке SP . — I I .

179

Page 181: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Y : = А;Z : = В;

Case Znak Of' + ' :

X := Y + Z;I _ I . X := Y - Z;

X := Y * Z

End;If Abs(X) > Maxlnt

ThenBegin

Flag := False;

ExitEnd;

Rez := Round(X)End;

180

Page 182: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

№ п/п Что вводим Что должно получиться

1 25 + 73 = 98

5274- 12315 = П А А 1

2 - 7 0413 614*25 = 15 3504 25,5 + 31,2 = Недопустимые символы5 5 = 6- 1 Неверное выражение6 72 315- 256 = Слишком большие операнды7 32 000* 100 = Большой результат

181

Page 183: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Правильное прохождение всех тестов — это необходимое условиеправильности программы. Заметим, однако, что данное условие невсегда является достаточным. Чем сложнее программа, тем труднеепостроить исчерпывающий план тестирования. Опыт показывает, чтодаже в «фирменных» программах в процессе эксплуатацииобнаруживаются ошибки, т. е. проблема тестирования программы —очень важная и одновременно очень сложная.

3.2. Рекурсивные методы

Суть рекурсивных методов — это сведение задачи к самой себе.Как уже говорилось, в Паскале существует возможность рекур-

сивного определения функций и процедур, реализацующих рекурсивныеалгоритмы. Однако создать рекурсивный алгоритм решения задачи частобывает очень непросто.

Рассмотрим классическую задачу, известную в литературе подназванием «Ханойская башня» (рис. 3.3).

На площадке (назовем ее А) находится пирамида, составленная издисков уменьшающегося от основания к вершине размера. Этупирамиду в том же виде требуется переместить на площадку В. Привыполнении этой работы необходимо соблюдать следующиеограничения:• перекладывать можно только по одному диску, взятому сверхупирамиды;• класть диск можно только или на основание площадки, или на дискбольшего размера;• в качестве вспомогательной можно использовать площадку С.

Название «Ханойская башня» связано с легендой, согласно которой вдавние времена монахи одного ханойского храма взялись переместитьпо этим правилам башню, состоящую из 64 дисков. Монахи все ещеработают и еще долго будут работать!

ABC

Рис. 3.3. Задача о ханойской башне

182

Page 184: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Нетрудно решить данную задачу для двух дисков. Обозначивперемещения диска, например с площадки А на площадку В как А => В,запишем алгоритм для этого случая:

А => С; А ■=> В; С => В,

т.е. всего три хода.

Алгоритм решения задачи для трех дисков будет длиннее:

А=> В; А => С; В => С; А => В; С => А; С =* В; А => В,

т. е. уже семь ходов.Определить число ходов N для к дисков можно по следующей

рекуррентной формуле:

N(1) = 1; N(k) = 2xN(k - 1) + 1.Например, N(10) = 1 023, N(20) = 104 857, а N(64) = = 18 446 744073

709 551 615, т.е. столько перемещений придется сделать ханойскиммонахам. Попробуйте прочитать это число.

Теперь составим программу, по которой машина рассчитает алгоритмработы монахов и выведет его для любого числа дисков N. Пусть наплощадке А находится N дисков, тогда алгоритм решения задачи будетследующим:1. Если N = 0, то ничего не надо делать.2. Если N > 0, то следует:• переместить N - 1 дисков на С через В;• переместить диск с А на В (А => В);• переместить N - 1 дисков с Сна В через А.

При выполнении второго пункта алгоритма последовательно будемиметь три этапа перемещения дисков, показанные на рис. 3.4.

Описание алгоритма имеет явно рекурсивный характер. Пере-мещение N дисков описывается через перемещение N - 1 дисков. А гдеже выход из этой последовательности рекурсивных ссылок алгоритма насамого себя? Он в первом пункте алгоритма, каким бы странным неказалось его тривиальное содержание.

А теперь построим программу решения рассматриваемой задачи наПаскале. В ней имеется рекурсивная процедура Hanoi, выполнениекоторой заканчивается только при N = 0. При обращении к этойпроцедуре используются фактические имена площадок, заданныесоответственно их номерами: 1, 2, 3, поэтому на выходе цепочкаперемещений будет описываться следующим образом:

1 => 2 1 =» 3 2 => 3 и т.д.Программа решения задачи будет иметь следующий вид:

Program Monahi;

Var N: Byte;

183

Page 185: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ABC Рис. 3.4. Три этапа перемещения дисков

Begin

If N > 0 Then

Begin Hanoi(N - 1, А, С, B);

WriteLn(A, '=>', B) ;

Hanoi(N - 1, С, B, A)End

End;

Page 186: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

3.3. Методы перебора в задачах поиска

Рассмотрим некоторые задачи, связанные с проблемой поискаинформации. Это огромный класс задач, достаточно подробноописанный в классической литературе по программированию.

Общий смысл задач поиска сводится к следующему: из даннойинформации, хранящейся в памяти ЭВМ, выбрать необходимыесведения, удовлетворяющие определенным условиям (критериям).

Подобные задачи мы уже рассматривали. Например, поиск ма-ксимального числа в числовом массиве, поиск необходимой записи вфайле данных и т.д. Такой поиск осуществляется перебором всехэлементов структуры данных и их проверкой на соблюдение условийпоиска.

Перебор, при котором просматриваются все элементы структуры икоторый называется полным перебором, является «лобовым» способомпоиска и, очевидно, не всегда самым лучшим.

Рассмотрим пример. В одномерном массиве X заданы координаты Nточек, лежащих на вещественной числовой оси. Точки пронумерованы.Их номера соответствуют последовательности в массиве X. Требуетсяопределить номер первой точки, наиболее удаленной от началакоординат.

Легко понять, что это знакомая нам задача определения номеранаибольшего по модулю элемента массива X, которая решаетсяпосредством полного перебора:

Const N = 100;

Var X : Array[1..N] Of Real; I, Number : 1..N;

Number := 1;

For I := 2 To N Do

If A b s ( X[ I ] ) > Ab s ( X[ N u m b e r ] )

Then Number := I;

WriteLn(Number)

End.

Здесь полный перебор элементов одномерного массива производитсяс помощью одной циклической структуры.

185

Page 187: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Number1 := 1;Number2 := 2;

For I := 1 To N Do For J := 1 To N Do

If Abs(X[I] - X[J] > Abs(X[Numberl] - X[Number2]) Then Begin Numberl := I;

Number2 := J End;

Однако очевидно, что такое решение задачи нерационально. Здеськаждая пара точек будет просматриваться дважды, например при 1=1, J= 2 и 1 = 2, J = 1. Для случая N = 100 выполнение циклов будетповторяться 100 х 100 = 10000 раз.

Выполнение программы ускорится, если исключить повторения.Исключить также следует и совпадения значений I и J. Тогда

„ я N ( N - 1) хт 1ПЛчисло повторении цикла будет равно ———-, т.е. при N = 100

получится 4 950 повторений.Для исключения повторений в предыдущей программе следует

изменить начало внутреннего цикла с 1 на I + 1. Тогда программапримет следующий вид:

Numberl := 1;

Number2 := 2;

For I := 1 To N Do

For J := I + 1 To N Do

If Abs (X[I] -X[J]) > Abs (X[Numberl] -X[Number2])

Then

Begin

Numberl := I;

Number2 := JEnd;

Рассмотренный вариант алгоритма назовем перебором без повторений.

П р и м е ч а н и е . Конечно, эту задачу можно было решить и другим способом,но в данном случае нас интересовал именно переборный алгоритм. Для точек,расположенных не на прямой, а на плоскости или в пространстве, поискальтернативы переборному алгоритму становится весьма проблематичным.

В следующей задаче требуется выбрать все тройки чисел безповторений из массива X, сумма которых равна десяти.

186

Page 188: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В этом случае алгоритм будет состоять из трех вложенных циклов,имеющих переменную длину:

For I := 1 То N Do

For J := I + 1 То N Do

For К := J + 1 To N Do

If X[I] + X[J] + X[K] = 10 Then WriteLn(X[I], X[J], X[K]);

А теперь представьте, что из массива X требуется выбрать всегруппы чисел, сумма которых равна десяти. Количество чисел в группахможет быть любым, т.е. от 1 до N. В этом случае количество вариантовперебора резко возрастает, а сам алгоритм становится нетривиальным.

Казалось бы, ну и что? Машина работает быстро! И все же по-считаем. Число различных групп из N объектов (включая пустую)составляет 2N. При N = 100 это будет 2100 = Ю30. Следовательно, ком-пьютер, работающий со скоростью миллиард операций в секунду,будет осуществлять такой перебор приблизительно 10 лет. Дажеисключение перестановочных повторений не сделает такой переборныйалгоритм практически осуществимым.

Путь практической разрешимости подобных задач состоит внахождении способов исключения из перебора бесперспективных сточки зрения условия задачи вариантов. Для некоторых задач >тоудается сделать с помощью алгоритма, описанного далее.

Рассмотрим алгоритм перебора с возвратом на примере задачио прохождении лабиринта (рис. 3.5).

Дан лабиринт, оказавшись внутри которого необходимо найти иыходиз него. Перемещаться можно только в горизонтальном и вертикальномнаправлениях. На рис. 3.5, а... в показаны все варианты путей выхода изцентральной точки лабиринта.

При создании программы решения этой задачи встают два вопроса:как организовать данные и как построить алгоритм?

Рис. 3.5. Варианты (а . . . в ) путей прохождения лабиринта

Page 189: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

м м м м м м м м м м мм + + + мм м + м + м м м мм + м + м м м м мм м + м + м мм м + м + + м м м мм м + м м м м м м м мм м + + + мм м + м м м м мм м м м + + + + + мм м м м м + м м

Исходные данные для анализа — профиль лабиринта (исходнаяматрица LAB без крестиков); требуетмый результат — все возможныетраектории выхода из центральной точки лабиринта (для каждого путивыводится матрица LAB с траекторией, отмеченной крестиками).

Алгоритм перебора с возвратом также называют методом проб, и сутьего состоит в следующем:1. Из каждой очередной точки траектории просматриваютсявозможные направления движения в одной и той же последова-тельности. Договоримся, что просмотр будет происходить каждый разпротив часовой стрелки (справа—сверху—слева—снизу); шагпроизводится в первую же обнаруженную свободную соседнюю клетку;клетка, в которую сделан шаг, отмечается крестиком.2. Если из очередной клетки дальше пути нет (тупик), следуетвозврат на один шаг назад и просмотр еще не испробованных путейдвижения из этой точки. При возвращении назад покинутая клеткаотмечается пробелом.3. Если очередная клетка, в которую сделан шаг, оказалась на краюлабиринта (на выходе), на печать выводится найденный путь.

Программу будем строить методом последовательной детализации.Первый этап детализации:

188

Page 190: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Program Labirint;

Const N = 11; {размер лабиринта N x N клеток}

Type Field = Array[1..N, 1..N] Of Char;

Var LAB : Field;

Procedure GO(LAB : Field; X, Y : Integer);

Begin

{Поиск путей из центра лабиринта до края - каждыйнайденный путь печатается}

End;

Begin

{Ввод лабиринта}

GO(LAB, N Div 2 + 1 , N D i v 2 + 1 ) {Начинаем с

середины}

End.

Процедура GO пытается сделать шаг в клетку с координатами (X, Y).Если эта клетка оказывается на выходе из лабиринта, выводится напечать пройденный путь, если же нет, то делается шаг в соседнююклетку в соответствии с установленной ранее последовательностью.Если клетка тупиковая, делается шаг назад. Из всего сказанного следует,что процедура носит рекурсивный характер.

Запишем сначала общую схему процедуры без детализации:

Procedure GO(LAB : Field; X, Y : Integer);

Begin189

Page 191: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure PRINTLAB(LAB : Field);

{Печать найденного пути в лабиринте}

Var X, Y : Integer;

Begin For X := 1 To N Do Begin

For Y := 1 To N Do

Write(LAB[X, Y] ) ;

WriteLnEnd;

WriteLn End; {Печати}

Procedure GO(LAB : Field; X, Y : Integer);

Begin

If LAB[X, Y] = 1 ' {Если клетка свободна}

Then

Begin

LAB[X, Y] := '+'; {Делается шаг}

If (X = 1) Or (X = N) Or (Y = 1) Or (Y = N) {Край}Then

PRINTLAB(LAB){Печатается найденный путь}

Else

190

Page 192: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

мер, популярные задачи об обходе шахматной доски фигурами или орасстановке фигур на доске таким образом, чтобы они «не били» другдруга, а также множество задач оптимального выбора (задачи окоммивояжере, об оптимальном строительстве дорог и т.д.)

П р и м е ч а н и е . Из-за использования массива LAB в качестве параметра-значения в процедуре GO могут возникнуть проблемы с памятью при исполнениипрограммы на ЭВМ. В этом случае следует перейти к глобальной передачемассива.

3.4. Методы сортировки данных и сложность алгоритмов

Сложность алгоритмов. Сначала обсудим проблему оценки слож-ности алгоритма. Традиционно принято оценивать степень сложностиалгоритма по объему используемых им основных ресурсов компьютера:процессорного времени и оперативной памяти. В связи с этим вводятсяпонятия временной и объемной сложности алгоритма.

Временная сложность становится особенно важна для задач,предусматривающих интерактивный режим работы программы, или длязадач управления в режиме реального времени. Часто программисту,составляющему программу управления каким-нибудь техническимустройством, приходится искать компромисс между точностьювычислений и временем работы программы. Как правило, повышениеточности ведет к увеличению времени.

Объемная сложность программы становится критической, когдаобъем обрабатываемых данных оказывается на пределе объема опе-ративной памяти ЭВМ. Для современных компьютеров острота этойпроблемы снижается благодаря росту объема их ОЗУ и эффективномуиспользованию многоуровневой системы запоминающих устройств.При этом программе становится доступной очень большая, практическинеограниченная область памяти (виртуальная память), и недостатокосновной памяти приводит лишь к некоторому замедлению работы из-завыполнения обменов с диском. Существуют приемы, позволяющиеминимизировать потери времени при таком обмене: использование кэш-памяти и аппаратного просмотра команд программы вперед, чтопозволяет заблаговременно переносить с диска в основную памятьнеобходимые значения. Из сказанного можно заключить, чтоминимизация емкостной сложности не является первоочереднойзадачей, поэтому далее мы будем интересоваться в основном временнойсложностью алгоритмов.

Время выполнения программы пропорционально числу исполняемыхопераций. Разумеется, в единицах времени (с) оно также

191

Page 193: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

зависит и от скорости работы процессора. Для того чтобы показательвременной сложности алгоритма был инвариантен техническимхарактеристикам компьютера, его измеряют в относительных единицах.Обычно временная сложность оценивается числом выполняемыхопераций.

Как правило, временная сложность алгоритма зависит от исходныхданных, причем как от величин, так и от их объема. Если обозначитьзначение параметра временной сложности алгоритма а символом Та, анекоторый числовой параметр, характеризующий исходные данные,буквой V, временную сложность можно представить как функцию Ta(V).Выбор параметра V зависит от типа решаемой задачи или видаиспользуемого для решения алгоритма.

Пример 3.1. Требуется оценить временную сложность алгоритмавычисления факториала целого положительного числа.

Программа решения:

Function Factorial(х : Integer) : Integer;

Var m, i : Integer;

Begin m : = 1;

For i := 2 To x Do m := m * i;

Factorial := m

End;

Подсчитаем общее число операций, выполняемых программой приданном значении х. Один раз выполняется оператор ш := 1; тело цикла(в котором две операции: умножение и присваивание) выполняется (х -1) раз; один раз выполняется присваивание Factorial := ш. Если каждуюиз операций принять за единицу сложности, временная сложность всегоалгоритма будет иметь вид 1 + 2(х - 1) + 1 = 2х, откуда понятно, что вкачестве параметра V следует принять значение х. Функция временнойсложности получится следующей:

T„(V) = 2V.

В этом случае можно сказать, что временная сложность линейнозависит от параметра данных — значения аргумента функции Factorial.

Пример 3.2. Требуется вычислить скалярное произведение двух192

Page 194: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

В этой задаче объем входных данных п = 2к. Число выполняемыхопераций 1 + Зк = 1 + 3(п/2). Здесь можно принять V = к = п/2.Сложность алгоритма не зависит от значений элементов векторов А и В.Как и в примере 3.1, здесь можно говорить о линейной зависимостивременной сложности от параметра данных.

С параметром временной сложности алгоритма обычно связываютдве теоретические проблемы. Первая проблема состоит в поиске ответана следующий вопрос: до какого предела значения временнойсложности можно дойти, совершенствуя алгоритм решения задачи? Этотпредел зависит от самой задачи и, следовательно, является еесобственной характеристикой.

Вторая проблема связана с классификацией алгоритмов по вре-менной сложности. Функция Ta(V) обычно растет с ростом V. Какбыстро она растет? Существуют алгоритмы с линейной зависимостьюТ„ от V (как в рассмотренных примерах), с квадратичной зависимостьюи зависимостью более высоких степеней, которые называютсяполиномиальными. Существуют также алгоритмы, сложность которыхрастет быстрее любого полинома. Проблема, которую часто решаютисследователи алгоритмов, заключается в следующем вопросе:возможен ли для таких задач полиномиальный алгоритм?

Постановка задачи сортировки данных. Существует традиционноеделение алгоритмов на две категории: численные и нечисленные.Численные алгоритмы предназначены для математических расчетов:вычисления по формулам, решения уравнений, статистическойобработки данных и т. п. В таких алгоритмах основным типомобрабатываемых данных являются числа. Нечисленные алгоритмыимеют дело с самыми разнообразными типами данных: символьными,графическими, мультимедийной информацией. К этой категорииотносятся многие алгоритмы системного программирования(трансляторы, операционные системы), систем управления базамиданных, сетевого программного обеспечения и др.

Для программных продуктов второй категории наиболее частоиспользуются алгоритмы сортировки данных, т.е. упорядоченияинформации по некоторому признаку. От эффективности этихалгоритмов, и прежде всего от скорости их выполнения, во многомзависит эффективность работы всей программы.

Различают алгоритмы внутренней сортировки — сортировки вовнутренней памяти — и алгоритмы внешней сортировки — сортировкифайлов. Далее будем рассматривать только внутреннюю сортировку.

Как правило, сортируемые данные располагаются в массивах. Впростейшем случае — это числовые массивы. Однако для нечисленныхалгоритмов более характерна сортировка массива. Поле, по значениюкоторого производится сортировка, называется клю

193

Page 195: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

чом сортировки и обычно имеет числовой тип. Например, массивсортируемых записей содержит два поля: наименование товара иколичество товара на складе. В программе на Паскале его описаниеимеет следующий вид:

Const п = 1000;

Type Tovar = Record

Name : String;

Key : Integerend;

Var A : Array[l..n] Of Tovar;

Сортировка данных производится либо по возрастанию, либо поубыванию значения ключа A[i].key.

Далее во всех примерах программ предполагается, что приведенныеранее описания в программе присутствуют глобально и их областьдействия распространяется на процедуры сортировки.

Алгоритм сортировки методом «пузырька» рассматривался вподразд. 2.16. Теперь обсудим сортировку простым включением ибыструю сортировку.

Алгоритм сортировки простым включением. Предположим, что нанекотором этапе работы алгоритма левая часть массива с 1 -го по (i - 1)-й элемент отсортирована, а правая его часть с i-ro по n-й элементостается неотсортированной. Очередной шаг алгоритма заключается врасширении левой части массива на один элемент и соответственносокращении правой части. Для этого берется первый элемент правойчасти (с индексом i) и вставляется на подходящее место в левую частьтаким образом, чтобы ее упорядоченность сохранилась. Процессначинается с левой части массива, состоящей из одного элемента А[ 1], азаканчивается, когда его правая часть становится пустой.

Программа сортировки простым включением следующая:

Procedure Straightlnsertion;

Var i, j : Integer; x : Tovar;

Begin For i := 2 To n Do

Page 196: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

А[j + 1] := х {Включение A[i] в «дырку» в левой

части}

End

End;

Теперь оценим сложность алгоритма сортировки простым вклю-чением. Очевидно, что временная сложность зависит как от размерасортируемого массива, так и от его исходного состояния, т.е.упорядоченности элементов. Временная сложность будет минимальной,если исходный массив уже отсортирован в требует- мом порядкезначений ключа (в данном случае по возрастанию). Максимальноезначение временной сложности соответствует противоположнойупорядоченности исходного массива, т.е. в этом случае ономаксимально, если исходный массив упорядочен по убыванию значенийключа. Обычно временная сложность алгоритмов сортировкиоценивается числом пересылок элементов.

Оценим минимальную временную сложность алгоритма. Еслимассив уже отсортирован, тело цикла While не будет выполняться ниразу. Выполнение процедуры сведется к работе следующего цикла:

For i := 2 То n Do

Begin

x : = A [ i ]; j := i - 1;

A [ j +1] := x

End;

Поскольку тело цикла For исполняется n - 1 раз, то число пересылокэлементов массива Mmin = 2(п - 1), а число сравнений ключей = п - 1.

Сложность алгоритма будет максимальной, если исходный массивупорядочен по убыванию. Тогда каждый элемент A[i] будет«прогоняться» к началу массива, т.е. устанавливаться в первуюпозицию. Цикл While выполнится один раз при i = 2, два раза при i = 3 ип - 1 раз при i = п. Таким образом, общее число пересылок записей

Mmax = 2(п -1) + £ (i -1) = 2(п - 1) + п(п - 1)/2 = i (п2 + Зп- 4).

i = 2 ^

195

Page 197: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Логично допустить, что среднее число выполнений цикла While длякаждого конкретного значения i равно i/2, т.е. в среднем каждый разприходится просматривать половину массива до тех пор, пока ненайдется подходящее место для очередного элемента. Тогда формуладля вычисления среднего числа пересылок (средняя оценка сложности)будет следующей:

Мср = 2(л -1) + £ i = 2(п -1) + (п - 2)(п -1)/4 = I (п2 + 9п -10).i=2 ^ ^

Максимальная и средняя оценки сложности алгоритма квадратичны(полином второй степени) по параметру п — размеру сортируемогомассива.

Алгоритм быстрой сортировки. Этот алгоритм был разработанЭ.Хоаром. В алгоритме быстрой сортировки используются:• разделение сортируемого массива на две части — левую и правую;• взаимное упорядочение двух частей (подмассивов) таким образом,чтобы все элементы левой части не превосходили элементов правойчасти;• рекурсия, при которой подмассив упорядочивается точно таким жеспособом, как и весь массив.

Для разделения массива на две части необходимо выбрать некотороебарьерное значение ключа. Это значение должно удовлетворятьединственному условию: находиться в диапазоне значений для данногомассива (т.е. между минимальным и максимальным значениями). Вкачестве барьерного можно выбрать значение ключа любого элементамассива, например первого, последнего или находящегося в егосередине.

Далее следует сделать так, чтобы в левом подмассиве оказались всеэлементы с ключом, меньше барьера, а в правом — с ключом, больше«барьера». Затем, просматривая массив слева направо, надо найтипозицию первого элемента с ключом, больше «барьера», а просматриваяего справа налево, найти первый элемент с ключом, меньше «барьера».Поменяв эти значения местами, продолжить встречное движение доследующей пары элементов, предназначенных для обмена. Процесснеобходимо продолжать пока индексы левого и правого просмотров несовпадут. Место их совпадения станет границей между двумя взаимно196

Page 198: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure Quicksort;

Procedure Sort(L, R : Integer);

Var i, j, bar : Integer; w : Tovat;Begin

i := L; j := R;

bar := A[(L+R)div2].key; {Установка барьера} Repeat

{Поиск элемента слева для обмена}

While A[i].key < bar Do i := i + 1;

{Поиск элемента справа для обмен}

While А[j].key > bar Do j := j — 1;

197

Page 199: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Упражнения

1. Даны декартовы координаты Лоточек на плоскости. Составить про-граммы решения следующих задач:

а) найти две самые близкие друг к другу точки;б) найти две самые удаленные друг от друга точки;в) найти три точки, лежащие в вершинах треугольника с наиболь-

шим периметром;г) найти две ближайшие точки, отрезок между которыми может слу-

жить радиусом окружности, заключающей внутри себя все остальныеточки, и указать, какая из них является центральной.2. Изменить программу Labirint таким образом, чтобы на печатьвыводился лишь кратчайший путь из центра лабиринта до края.3. Составить программу, в соответствии с которой шахматный коньобойдет всю доску, побывав на каждом поле всего один раз.4. Составить программу расстановки на шахматной доске восьмиферзей таким образом, чтобы они не угрожали друг другу.

Page 200: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Г Л А В А 4 ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ

ПРОГРАММИРОВАНИЕ

4.1. Что такое объектно-ориентированное программирование

История ООП. Основоположниками объектного подхода в про-граммировании считаются норвежцы Оле Джохан Дал и КристенНюгорт — авторы языка Симула. История Симулы началась в 1962 г. спроекта Simulation Language, предназначенного для программногомоделирования метода Монте-Карло. В 1965 г. у авторов этого проектавозникла идея объединить данные с процедурами, их об-рабатывающими. В язык были введены новые средства моделирования иимитации мультипроцессорной работы, а также термины «класс» и«объект». Тогда же возникла и технология наследования, т.е. создателиСимулы ввели в язык возможность использования разными классамиобщих свойств посредством указания названия класса в виде префикса.

Алан Кей ввел новую концепцию разработки программ, в со-ответствии с которой набор последовательно выполняющихся ин-струкций мог быть заменен на многомерную среду взаимодействияобъектов, общающихся друг с другом посредством асинхронногообмена сообщениями. Эту идею он воплотил в новом языке SmallTalk,первоначально названном им Biological System и смоделированном наБейсике, а затем реализованном на ассемблере. Термин «объектно-ориентированное программирование» впервые был применен именно поотношению к языку SmallTalk. Наиболее известна версия языкаSmallTalk 80.

В 1980 г. Бьерн Страуструп дополнил язык процедурного про-граммирования Си концепцией классов, а в 1983 г. дал этому новомупродукту окончательное название Си++. С тех пор Си-н- стал наиболеепопулярным языком объектно-ориентированного программирования.

В дальнейшем возможности объектного программирования сталивключаться и в другие языки. В ТурбоПаскале средства ООП появилисьс версии 5.5. Элементы ООП включены в Фор- гран, начиная с версииФортран-90. Современными языками программирования,объединившими технологию ООП с визуальными методамипрограммирования, являются Delphi, Visual Basic, Java.

199

Page 201: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Основные понятия ООП. Основополагающей идеей объектно-ориентированной парадигмы программирования является объединениеданных и обрабатывающих их процедур в единое целое — объекты.

Объектно-ориентированное программирование— это методологияпрограммирования, которая основана на представлении программы ввиде совокупности объектов, каждый из которых является реализациейопределенного класса (типа данных особого вида), а классы образуютиерархию, основанную на принципах наследования. При этом объектхарактеризуется как совокупностью всех своих свойств и их текущихзначений, так и совокупностью допустимых для данного объектадействий.

Несмотря на то что в различных литературных источниках делаетсяакцент на те или иные особенности внедрения и применения ООП, триосновных (базовых) его понятия остаются неизменными:• инкапсуляция (Encapsulation);• наследование (Inheritance);• полиморфизм (Polymorphism).

Эти понятия лежат в основе ООП.При процедурном подходе к программированию требуется описать

каждый шаг, каждое действие алгоритма для достижения конечногорезультата. При объектно-ориентированном подходе право решать, какотреагировать и что сделать в ответ на поступивший вызов, остается заобъектом. Для этого достаточно в стандартной форме поставить передним задачу и получить ответ.

Объект состоит из трех частей:• имени;• состояния (переменных состояния);• методов (операций).

Можно дать обобщающее определение: объект ООП — это со-вокупность переменных состояния и связанных с ними методов(операций), которые определяют, как объект взаимодействует сокружающим миром.

Методы объекта — это процедуры и функции, объявление которыхвключено в описание объекта и которые выполняют действия.Возможность управлять состояниями объекта посредством вызоваметодов в итоге и определяет поведение объекта. Эту совокупностьметодов часто называют интерфейсом объекта.

Инкапсуляция — это механизм, который объединяет данные и методы,манипулирующие этими данными, и защищает и то и другое отвнешнего вмешательства или неправильного использования. Когдаметоды и данные объединяются таким способом, создается объект.

Применяя инкапсуляцию, мы защищаем данные, принадлежащиеобъекту, от возможных ошибок, которые могут возник

Page 202: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

нуть при прямом доступе к этим данным. Кроме того, применение этогомеханизма очень часто помогает локализовать возможные ошибки вкоде программы, что намного упрощает процесс их поиска иисправления. Можно сказать, что под инкапсуляцией подразумеваетсясокрытие данных, т.е. их защита. Применение инкапсуляции ведет кснижению эффективности доступа к элементам объекта, чтообусловлено необходимостью вызова методов для изменения еговнутренних элементов (переменных). Однако при современном уровнеразвития вычислительной техники эти потери в эффективности неиграют существенной роли.

Наследование — это процесс, посредством которого один объект можетнаследовать свойства другого объекта и добавлять к ним черты,характерные только для него. В итоге создается иерархия объектныхтипов, где поля данных и методов «предков» автоматически являются иполями данных и методов «потомков».

Смысл и универсальность наследования заключается в том, что ненадо каждый раз заново (с нуля) описывать новый объект, а можноуказать «родителя» (базовый класс) и описать отличительныеособенности нового класса. В результате новый объект будет обладатьвсеми свойствами «родительского» класса и своими собственнымиотличительными особенностями.

Например, можно создать базовый класс «Транспортное средство»,который будет универсальным для всех средств передвижения начетырех колесах. Этот класс «знает», как движутся колеса, как ониповорачивают, тормозят и т.д. Затем на основе этого класса можносоздать класс «Легковой автомобиль». Поскольку новый классунаследован от класса «Транспортное средство», то унаследованы и всеосновные черты этого класса, т.е. не надо в очередной раз описывать,как движутся колеса и т.д., а следует просто добавить те черты,особенности поведения, которые характерны для легковых автомобилей.В то же время можно, взяв за основу тот же класс «Транспортноесредство», построить класс «Грузовые автомобили», описав ихотличительные особенности, и на основании уже этого нового классаописать определенный подкласс грузовиков и т.д. Таким образом,сначала формируется простой шаблон, а затем посредством усложненийи конкретизации поэтапно создаются все более сложные шаблоны.

Полиморфизм — это свойство, которое позволяет одно и то же имяиспользовать для решения нескольких технически разных задач.Полиморфизм подразумевает такое определение методов в иерархиитипов, при котором метод с одним именем может применяться кразличным родственным объектам. В общем виде концепциейполиморфизма является идея «один интерфейс — множество методов»,т.е. полиморфизм помогает снижать сложность программ, разрешаяиспользование одного интерфейса для еди

201

Page 203: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ного класса действий. При этом выбор конкретного действия взависимости от ситуации возлагается на компилятор.

Например, пусть есть класс «Автомобиль», в котором описано, какдолжен передвигаться автомобиль, как он поворачивает, как подаетсигнал и т.д. Там же описан метод «Переключение передач». Допустим,что в этом методе класса «Автомобиль» описана автоматическая коробкапередач. Требуется описать класс «Спортивный автомобиль», у которогомеханическое (ручное) переключение скоростей. Конечно, можно былобы описать заново все методы для нового класса. Однако вместо этогоможно указать, что класс «Спортивный автомобиль» унаследован откласса «Автомобиль», а следовательно, обладает всеми свойствами и ме-тодами, описанными для «родительского» класса. Единственное, чтонадо сделать — это переписать метод «Переключение передач» длямеханической коробки передач. В результате при вызове метода«Переключение передач» будет выполняться метод не родительскогокласса, а вновь созданного.

Механизм работы ООП в этих случаях можно описать примернотаким образом. При вызове того или иного метода класса сначаласледует искать метод в самом классе. Если метод найден, онвыполняется и поиск его завершается. Если же метод не найден, следуетобратиться к «родительскому» классу и искать вызванный метод в нем.Если метод найден, он выполняется и поиск его также прекращается, аесли не найден, поиск продолжается далее вверх по иерархическомудереву, вплоть до корня (верхнего класса) иерархии. Этот примеротражает так называемый механизм раннего связывания.

4.2. Объекты в ТурбоПаскале

Описание объектов. Инкапсуляция. Для описания объектов вТурбоПаскале зарезервировано слово «object». Тип «Object» — этоструктура данных, которая содержит поля и методы. Описаниеобъектного типа имеет следующий вид:

Туре сидентификатор типа объекта> = Object <поле>;

202

Page 204: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

в том числе и особые процедуры, создающие и уничтожающие объекты(конструкторы и деструкторы). Объявление метода внутри описанияобъектного типа состоит только из заголовка (как в разделе Interface вмодуле).Р 1

Пример 4.1. Опишем объект «Обыкновенная дробь» с методами«ЙОД числителя и знаменателя», «Сокращение» и «Натуральнаястепень»:

Type Natur = 1.. 32767;

Frac = Record Р : Integer; Q : Natur End;

Drob = Object A : Frac;Procedure NOD(Var С : Natur);

Procedure Sokr;

Procedure Stepen(N : Natur; Var С : Frac);End;

Описание объектного типа собственно и выражает такое свойство,как инкапсуляция.

Проиллюстрируем далее работу с описанным объектом, реализациейего методов и обращение к указанным методам (при этом понадобятсянекоторые вспомогательные методы):

Type Natur = 1..Maxlnt;

Frac = Record P : Integer; Q : Natur End;

203

Page 205: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Begin

If A.P О 0 Then Begin

Drob.NOD(N) ;

A.P := A.P div N; A.Q := A.Q div NEnd

Else A.Q := 1 End;

Procedure Drob.Stepen;

Var I : Natur;Begin

C.P := 1; C.Q := 1;For I := 1 To N Do

Begin C.P := C.P * A.P; C.Q := C.Q * A.Q End;

End;

Procedure Drob.Vvod;Begin

Write(1 Введите числитель дроби: '); ReadLn(A.P); Write('Введите знаменатель дроби: ') ; ReadLn(A.Q) ; End;

204

Page 206: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Во-вторых, все действия над объектом выполняются только спомощью его методов.

В-третьих, для работы с отдельным экземпляром объектного типа вразделе описания переменных должна быть объявлена переменная (илипеременные) соответствующего типа. Из примера видно, что объявлениестатических объектов не отличается от объявления других переменных,а их использование в программе напоминает использование записей.

Наследование. Объектные типы можно выстроить в иерархию. Одинобъектный тип может наследовать компоненты другого объектного типа.Наследующий объект называется «потомком», а объект, которомунаследуют — «предком». Если «предок» сам является чьим-либо«наследником», то «потомок» наследует и эти поля и методы. Следуетподчеркнуть, что наследование относится только к типам, но неэкземплярам объекта.

Описание типа «потомка» имеет отличительную особенность:

<имя типа потомка> = Object(<имя типа предка>),

Далее запись описания — обычная.Следует помнить, что поля наследуются без какого-либо исключения,

поэтому, объявляя новые поля, необходимо следить за уникальностью ихимен, иначе совпадение имени нового поля с именем наследуемого полявызовет ошибку. На методы это правило не распространяется, но обэтом далее.

Пример 4.2. Опишем объектный тип «Вычислитель» с методами«Сложение», «Вычитание», «Умножение», «Деление» (моделированиенекоторого исполнителя) и производный от него тип «Продвинутыйвычислитель» с новыми методами «Степень», «Корень п-й степени»:

Type BaseType = Double;

Vichislitel = Object

А, В, С : BaseType;

End;

205

Page 207: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Обобщая сказанное ранее, перечислим правила наследования:• информационные поля и методы «родительского» типа на-следуются всеми его типами-«потомками» независимо от числапромежуточных уровней иерархии;• доступ к полям и методам «родительских» типов в рамкахописания любых типов-«потомков» выполняется таким образом, какбудто они описаны в самом типе-«потомке»;• ни в одном из типов-«потомков» не могут использоватьсяидентификаторы полей, совпадающие с идентификаторами полейкакого-либо из «родительских» типов. Это правило относится и кидентификаторам формальных параметров, указанных в заголовкахметодов;• тип-«потомок» может доопределить произвольное число соб-ственных методов и информационных полей;• любое изменение текста в «родительском» методе автоматическиоказывает влияние на все методы типов-«потомков», которые еговызывают;• в противоположность информационным полям идентификаторыметодов в типах-«потомках» могут совпадать с именами методов в«родительских» типах. При этом одноименный метод в типе-«потомке»подавляет одноименный ему «родительский», и в рамкахтипа-«потомка» при указании имени такого метода будет вызыватьсяименно метод типа-«потомка», а не «родительский».

Вызов наследуемых методов осуществляется согласно следующимпринципам:• при вызове метода компилятор сначала ищет метод, имя которогоопределено внутри типа объекта;• если в типе объекта не определен метод с указанием его воператоре вызова метода, то компилятор в поисках метода с такимименем поднимается выше к непосредственному «родительскому» типу;• если наследуемый метод найден и его адрес указан, следуетпомнить, что вызываемый метод будет работать так, как он определен икомпилирован для «родительского» типа, а не для типа- «потомка». Еслиэтот наследуемый «родительский» тип вызывает еще и другие методы,то вызываться уже будут только «родительские» или расположенныевыше методы, так как вызов методов из расположенных ниже поиерархии типов не допускается.

Полиморфизм. Как уже отмечалось, полиморфизм (многообразие)предполагает определение класса или нескольких классов методов дляродственных объектных типов таким образом, чтобы каждому классуотводилась своя функциональная роль. Методы одного класса обычнонаделяются общим именем.

Пример 4.3. Пусть имеется «родительский» объектный тип «Вы-пуклый четырехугольник» (поля типа — «координаты вершин»,

206

Page 208: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

заданные в порядке их обхода) и производные от него типы: «Па-раллелограмм», «Ромб» и «Квадрат». Описать для указанных фигурметоды «Вычисление углов» (в градусах), «Вычисление диагоналей»,«Вычисление длин сторон», «Вычисление периметра», «Вычислениеплощади».

Программа описания следующая:

Type BaseType = Double;

FourAngle = Object

xl, yl, x2, y2, x3, y3, x4, y4,

А, В, C, D, Dl, D2,

Alpha, Beta, Gamma, Delta,

P, S : BaseType;Procedure Init;

Procedure Storony;

Procedure Diagonali;Procedure Angles;

Procedure Perimetr;

Procedure Ploshad;

End;

207

Page 209: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure FourAngle.Diagonali;Begin

D1 := Sqrt(Sgr(xl — x3) + Sqr(yl - y3));

D2 := Sqrt(Sqr(x2 - x4) + Sqr(y2 - y4) ) ;End;

Procedure FourAngle.Angles;

Function Ugol(Aa, Bb, Cc : BaseType): BaseType; VarVspCos, VspSin: BaseType;Begin

VspCos := (Sqr(Aa) + Sqr(Bb) —

Sqr(Cc))/(2 * Aa * Bb);

VspSin := Sqrt(l - Sqr(VspCos));

If Abs(VspCos) > le—7

208

Page 210: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Var Per : BaseType;Begin

Per := (A + D + D2)/2;

S := 2 * Sqrt (Per * (Per - A) * (Per - D) * (Per - D2) ) End;

Procedure Romb.Storony;Begin

A := Sqrt(Sqr(x2 - xl) + Sqr(y2 - yl));

В := A; С := A; D := A End;

Procedure Romb.Perimetr;

Begin P := 2 * A End;

Procedure Kvadrat.Angles;

Begin Alpha := 90; Beta := 90; Gamma := 90;209

Page 211: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

типа), «Период дроби» (существует, если соответствующая десятичная дробь неявляется конечной, в общем случае результат — «длинное» число). Реализовать ипротестировать эти методы.3. Описать объекты-«потомки» для объектов, указанных в первом уп-ражнении. Реализовать объявленные в объектном типе методы.4. Реализовать методы объекта «Вычислитель» из примера 4.2.5. Дополнить набор объектов из примера 4.3 объектом «Прямоугольник», атакже другими выпуклыми четырехугольниками, не являющимисяпараллелограммами (трапеция и т.д.), и реализовать соответствующие им методы.6. Построить, последовательно применяя методы «Отобразить», «Сдвинуть»,«Изменить размеры», «Спрятать», иерархии следующих объектов:

а) координаты — точка — горизонтальная линия — горизонтально-вертикальное перекрестье;

б) координаты — точка — наклонная под углом 45° линия — наклонноеперекрестье;

в) координаты — точка — окружность — дуга (процедура Arc);г) координаты — точка — эллипс (процедура FillEllipse) — эллиптическая

дуга (процедура Ellipse);д) координаты — точка — окружность — сектор (процедура PieSlice);е) координаты — точка — сектор (процедура PieSlice) — эллиптическая дуга

(процедура Ellipse);ж) координаты — точка — прямоугольник (процедура Rectangle) —

трехмерная полоса (процедура Bar3D);з) координаты — точка — заштрихованный эллипс (процедура FillEllipse) —

заштрихованный сектор (процедура Sector);и) координаты — точка — окружность — заштрихованный сектор (процедура

Sector);к) координаты — точка — окружность — эллиптическая дуга (процедура

Ellipse).

4.3. Интегрированная среда программирования Delphi

История и назначение Delphi. Delphi — интегрированная средапрограммирования, разработанная фирмой Borland, является ре-зультатом развития языка ТурбоПаскаль, который, в свою очередь,является результатом развития языка Паскаль. Изначально Паскаль былполностью процедурным языком. ТурбоПаскаль, начиная с версии 5.5,обладает средствами объектно-ориентированного программирования.Языком программирования в Delphi является объектно-ориентированный язык Object Pascal, в основу которого положеныконструкции ТурбоПаскаля версии 7.0. В России Borland Delphi

Page 212: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

dows, поэтому она получила название RAD (Rapid Application Deve-lopment — среда быстрой разработки приложений).

Процесс разработки в Delphi предельно упрощен. И в первуюочередь это относится к созданию интерфейса, на которое обычноприходится порядка 80 % времени разработки программы.Программисту необходимо просто поместить необходимые компонентыв окне Windows (в Delphi оно называется формой) и настроить ихсвойства с помощью специального инструмента — Object Inspector. Спомощью данного инструмента можно связать события этихкомпонентов (нажатие кнопки, выбор мышью элемента в списке и т.д.) спроцедурой обработки, и простое приложение готово. Причемразработчик имеет в своем распоряжении необходимые средстваотладки (вплоть до пошагового выполнения команд процессора),удобную контекстную справочную систему, средства коллективнойработы над проектом и т.д.

Delphi позволяет создавать распределенные Internet- и Intranet-приложения, используя для доступа к данным Borland DataBase Engine.

Язык Delphi Pascal (ранее — Object Pascal), используемый в Delphi,постоянно расширяется и дополняется компанией Borland, в полноймере поддерживая все требования, предъявляемые к объектно-ориентированному языку программирования. Как в строготипизированном языке, классы поддерживают только простоенаследование, но зато интерфейсы могут иметь сразу несколько«предков». К числу особенностей языка следует отнести поддержкуобработки исключительных ситуаций (exceptions), а также перегрузкуметодов и подпрограмм (overload). Имеются также открытые массивы,варианты и вариантные массивы, позволяющие размещать в памятилюбые структуры данных.

В Delphi можно создавать свои собственные компоненты, им-портировать их, а также разрабатывать шаблоны проектов и мастеров,создающих заготовки проектов. Delphi предоставляет разработчикуинтерфейс для связи приложений (или внешних программ) синтегрированной оболочкой Delphi (IDE).

Интерфейс. Вид среды программирования Delphi отличается от видамногих других сред, которые можно увидеть в Windows, так как онаследует спецификации, называемой SDI (Single Document Interface —однодокументный интерфейс), и состоит из нескольких отдельнорасположенных окон.

На рис. 4.1 показан вид среды программирования Delphi не-посредственно после запуска программы. В верхней строке, как и влюбом приложении Windows, находится меню. Слева расположеныдерево компонентов формы и инспектор компонентов, отображающийих свойства и события, по центру — собственно фор-

211

Page 213: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

|<None>

TFowl

f*ied.*TopiTaj.F «heMLa*TofiiflH

Рис. 4.1. Окно Delphi после запуска

Панель кнопок Палитра компонентов

Форма

Рис. 4.2. Элементы интерфейса Delphi

Редактор кода

212

Page 214: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Сохранить все файлы Открыть проект

Сохранить рабочий файл

Открыть файл

Создать файл -

Выбрать рабочий модуль

Выбрать рабочую форму

Добавить файл в проект

Удалить файл из проекта

^/Открыть справочник

Пройти подпрограмму

Зайти в подпрограмму

Остановить программуПереключиться между формой и модулем

Создать новую форму Создать проект и запустить программу Рис. 4.3.

Назначение кнопок панели инструментов

ма, а позади формы — редактор кода. Ниже строки меню располагаютсяпанель инструментов и палитра компонентов.

Более детально элементы интерфейса Delphi показаны на рис. 4.2, аназначение некоторых кнопок панели инструментов поясняет рис. 4.3.

Форма. Имеет все признаки главного окна традиционных прило-жений Windows: размерную рамку, значок, заголовок, кнопки [Свер-нуть], [Развернуть], [Закрыть] (рис. 4.4) и управляется мышью.

ЗначокЗаголовок

Кнопка [Развернуть]

Кнопка[Закрыть]

Рис. 4.4. Элементы формы

213

Page 215: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Окно проектировщика форм (Form Designer) представляет собойзаготовку, т. е. макет одного из окон разрабатываемого приложения.Форма является основным интерфейсным элементом в Delphi. Этовизуальный компонент, присущий любой создаваемой в этой средепрограмме и исполняющий роль контейнера, который содержит другиекомпоненты, определяющие функциональность приложения.

Проектировщик форм позволяет во время разработки приложениявыполнять следующие действия:• добавлять компоненты в форму;• модифицировать форму и ее компоненты;• связывать обработчики событий компонента с программой наDelphi Pascal, содержащейся в редакторе кода.

В общих чертах процесс разработки программы на Delphi можнопредставить следующим образом: из области Палитра компонентов спомощью мыши надо выбрать компонент (кнопку, надпись, редактортекста и т.д.), поместить его в форму и задать значения свойств вобласти Свойства. Среда Delphi проанализирует содержимое формы исоздаст соответствующий программный код, а программисту останетсятолько внести в него детали решения задачи — отклики на события.

4.4. Компоненты Delphi. Свойства компонентов

Компонент Delphi— это функциональный элемент, обладающийнабором свойств, определяющих его внешний вид и состояние, а такженабором методов и событий, определяющих его поведение. Концепцияиспользования компонентов при разработке программ напрямуюсвязана с методологией объектно-ориентированного программирования.В данном случае с помощью компонентов происходит визуализацияобъектов, т.е. отображаются стандартные диалоговые окна, кнопки,списки и др. При этом каждый компонент предполагает собственныйнабор действий.

Все компоненты Delphi являются производными от классаTComponent, в котором инкапсулированы самые общие свойства иметоды компонентов.

Идентификатор компонента строится по тем же правилам, что иидентификаторы других объектов Delphi, а также переменных, константи т.д. По умолчанию имя компонента задается средойпрограммирования, однако возможно и его переименование наусмотрение программиста.

Все компоненты сгруппированы по некоторым признакам, а весь

214

Page 216: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Для помещения компонента в форму необходимо выполнитьследующие действия:• перейти к требуемой вкладке на палитре компонентов;• выбрать необходимый компонент;• отметить в форме место, где должен находиться компонент(при этом он туда помещается);• придать компоненту требуемые размеры, растягивая по вы-соте и ширине, и скорректировать его местоположение.

Основные компоненты интегрированной среды разработки. На-бор и порядок компонентов на каждой вкладке могут настраи-ваться по желанию программиста с помощью контекстного меню.

Опишем некоторые компоненты вкладки Standard типовой ком-плектации. показанной на рис. 4.5.

Д Frames — позволяет формировать на форме фреймы.§р§ TMainMenu — позволяет поместить главное меню в разра-

батываемую программу. Создание меню включает в себя три шага:• помещение TMainMenu на форму;• вызов Дизайнера меню через свойство Items в Инспектореобъектов;• определение пунктов меню в Дизайнере меню.

ИЛ TPopupMenu — позволяет создавать контекстные меню. У всехвидимых объектов имеется свойство PopupMenu, где и указывает-ся требуемое меню. Создается аналогично главному меню.

TLabel — служит для отображения текста на экране.

TEdit — стандартный управляющий элемент Windows дляввода. Может использоваться для отображения короткого фрагментатекста и позволяет пользователю вводить текст во время выполне-ния программы.

ТМето — другая форма TEdit. Подразумевает работу с боль-шими текстами. Может переносить слова, сохранять в ClipBoardфрагменты текста и восстанавливать их, выполнять другие основ-ные функции редактора. Имеет ограничения на объем текста —32 Кбайт.

|Щ TButton — позволяет выполнить какие-либо действия при

нажатии кнопки во время выполнения программы.

l a r ^ j A

Рис. 4.5. Вкладка Standard

215

Page 217: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

TCheckBox — отображает строку текста и небольшое рядом

стоящее окошко, в котором можно поставить отметку, означающую, чточто-то выбрано (объект выбора описывается указанной строкой текста).

TRadioButton — позволяет выбрать только одну опцию из

нескольких.TListBox — требуется для показа прокручиваемого списка.

Ц ТСошЬоВох — аналогичен TListBox и кроме того позволяетводить информацию в поле ввода поверх TListBox. Имеется несколькотипов ТСошЬоВох, но наиболее популярен спадающий вниз.

TScrollbar — полоса прокрутки, появляющаяся автоматически вобъектах редактирования при необходимости прокрутки текста дляпросмотра.

Вкладка Additional, показанная на рис. 4.6, содержит дополни-тельные компоненты создания пользовательского интерфейса. Приведемописание некоторых из них.

Еёз§| TBitBtn— кнопка, аналогичная TButton, однако на нейможно разместить картинку (glyph). Имеет несколько предопределенныхтипов (bkClose, bkOK и др.), при выборе которых принимаетсоответствующий вид.

TTabSet — горизонтальные закладки, обычно используемые

вместе с TNoteBook для создания многостраничных окон.

Щ TNoteBook — используется совместно с TTabSet для созданиямногостраничного диалога, причем на каждой странице располагаетсясвой набор объектов.

| TOutline — используется для представления иерархических

отношений связанных данных (например, дерева директорий).

Г В £1 «ь г аадн. | ATT > WBW1

Рис. 4.6. Вкладка Additional

216

Рис. 4.7. Вкладка System

Page 218: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя формы. Используется в программе для управления

формой и для доступа к ее компонентамCaption Текст заголовка

Top Расстояние от верхней границы формы до верхней границы экрана

Left Расстояние от левой границы формы до левой границы экрана

Width Ширина формы

Height Высота формы

ClientWidth,ClientHeight

Соответственно ширина и высота рабочей (клиентской) областиформы, т.е. без учета ширины левой и правой границ

BorderS tyle Вид границы, которая может быть обычной (bsSizeable), тонкой(bsSingle) или отсутствовать (bsNone). Если у окна

обычная граница, то во время работы программы пользовательможет с помощью мыши изменить его размер. Изменить размерокна с тонкой границей нельзя. Если граница отсутствует, то наэкран будет выведено окно без заголовка, положение и размеркоторого во время работы программы изменить нельзя

Page 219: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Borderlcons Кнопки управления окном. Значение свойства определяет, какиекнопки управления окном будут доступны пользователю во времяработы программы. Значение свойства задается посредствомприсвоения значений уточняющим свойствам: biSystemMenu,biMinimize, biMaximize и biHelp. Свойство biSysteinMenuопределяет доступность кнопки [Свернуть] и кнопки системногоменю, biMinimize — доступность кнопки [Свернуть], biMaximize— доступность кнопки [Развернуть], biHelp — доступностькнопки вывода справочной информации

Icon Значок в заголовке диалогового окна, обозначающий кнопку вывода системного меню

Color Цвет фона, который можно задать, указав его название илипривязку к текущей цветовой схеме операционной системы. Впоследнем случае цвет определяется текущей цветовой схемой,выбранным компонентом привязки и изменяется при изменениицветовой схемы операционной системы

Font Шрифт, используемый по умолчанию компонентами, находящимися на поверхности формы

Canvas Поверхность, на которую можно вывести графику

Свойство Описание

Name Имя компонента. Используется в программе для доступа ккомпоненту и его свойствам

Caption Отображаемый текст

Left Расстояние от левой границы поля вывода до левой границы формы

Top Расстояние от верхней границы поля вывода до верхней границыформы

Height Высота поля вывода

Width Ширина поля вывода

AutoSize Признак того, что размер поля определяется его содержимым

Wordwrap Признак того, что слова, которые не помещаются в текущей строке,автоматически переносятся на следующую строку (значениесвойства AutoSize должно быть False)

Т а б л и ц а 4 . 2

Свойства текста

218

Page 220: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Alignment Задает способ выравнивания текста внутри поля: по левому краю(taLeftJustify), по центру (taCenter) или по правому краю(taRightJustify)

Font Шрифт, используемый для отображения текста. Уточняющиесвойства определяют способ начертания символов (Font.Name), ихразмер (Font.Size) и цвет (Font.Color)

ParentFont Признак наследования компонентом характеристик шрифта формы,на которой он находится. Если значение свойства равно True, тотекст выводится шрифтом, установленным для формы

Color Цвет фона области вывода текста

Transparent Управляет отображением фона области вывода текста. Значение True делает область вывода текста прозрачной (область вывода не закрашивается цветом, заданным свойством Color)

Visible Позволяет скрыть текст (False) или сделать его видимым (True)

ГП'Ыи'-'-'-ртЖ 1 *1

Fomnl TForml

Properties | Events |

Action *

ActiveCcrifro!

Align alNone

AlphaBlend Fafcse

AlphaBtemJYal 255

SAnchort lakLeft,aMop!

AntoSaoI Tine —1

AutoS ee Fake

BiDiMode bdLeftToFlight

EtBoideilcons [biSystenoMenu.

; BordeiSye bsSizeable

BoideiWidth 0

Caption [ДНТТП

OentHeighl 453

CtenlWidth 688

Color Q cIBInface

И Constraints (TSizeConsti-airt

СИЗО True

Cuisot ciDefatA »|

All shown . A

Окончание табл. 4.2

Компонент Memo представляет собойэлемент редактирования текста, которыйможет состоять из нескольких строк (табл.4.5).

Компонент RadioButton представляетсобой зависимую кнопку (табл. 4.6), со-стояние которой определяется состояниемдругих кнопок группы. Если в диалоговомокне надо организовать несколько групппереключателей, то каждую группу следуетпредставить компонентом RadioGroup.

Компонент CheckBox представляет собойнезависимую кнопку — переключатель(табл. 4.7).

Компонент ListBox представляет собойсписок, в котором можно выбратьнеобходимый элемент (табл. 4.8)

Компонент ComboBox дает возможностьввести данные в поле редактированияпосредством набора на клавиатуре иливыбора из списка (табл. 4.9).

Page 221: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя компонента. Используется в программе для доступа ккомпоненту и его свойствам

Text Текст, находящийся в поле ввода и редактирования

Left Расстояние от левой границы компонента до левой границы формы

Top Расстояние от верхней границы компонента до верхней границыформы

Height Высота поля

Width Ширина поля

Font Шрифт, используемый для отображения вводимого текста

ParentFont Признак наследования компонентом характеристик шрифта формы,на которой он находится. Если значение свойства равно True, то приизменении свойства Font формы автоматически изменяется значениесвойства Font компонента

Enabled Используется для ограничения возможности изменить текст в полередактирования. Если значение свойства равно False, то текст в полередактирования изменить нельзя

Visible Позволяет скрыть компонент (False) или сделать его видимым (True)

Компонент BitBtn так же, как и компонент Button, являетсякомандной кнопкой. Однако он более универсален и главное можетсодержать картинку (табл. 4.10).

Компонент ScrollBar — полоса прокрутки, предназначенная дляпрокрутки содержимого окна и выбора значений из определенногоинтервала (табл. 4.11)

Свойства компонентов можно изменять на вкладке Properties в ObjectInspector. На рис. 4.8 представлено изменение свойств компонента Form.

Демонстрация настройки свойств компонентов будет приведенадалее в интегрированном примере.

События компонентов и определение процедур на основе событий. Какуже говорилось, события определяют поведение компонента во времяработы программы. Предполагается, что реакцией на действияпользователя будет исполнение того или иного программного кода.Следовательно, при составлении сценария программы необходимоучесть все предполагаемые дей-

220

Page 222: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя компонента. Используется в программе для доступа к компоненту и его свойствам

Caption Текст на кнопке

Left Расстояние от левой границы кнопки до левой границы формы

Top Расстояние от верхней границы кнопки до верхней границы формы

Height Высота кнопки

Width Ширина кнопки

Enabled Признак доступности кнопки. Если значение свойства равно True, то кнопка доступна. Если значение свойства равно False, то кнопка не доступна, например в результате щелчка

мышью на кнопке событие Click не возникает

Visible Позволяет скрыть кнопку (False) или сделать ее видимой (True)

Hint Всплывающая подсказка-текст, который появляется рядом суказателем мыши при позиционировании указателя на команднойкнопке (чтобы текст появился, значение свойства ShowHint должнобытьТгие)

ShowHint Разрешает (True) И Л И запрещает (False) отображение подсказки при позиционировании указателя на кнопке

221

Page 223: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя компонента. Используется для доступа к свойствам компонента

Text Текст, находящийся в поле Memo. Рассматривается как единое целое

Lines Массив строк, соответствующий содержимому поля. Доступ кстроке осуществляется по номеру. Строки нумеруются с нуля

Lines. Count Количество строк текста в поле Memo

Left Расстояние от левой границы поля до левой границы формы

Top Расстояние от верхней границы поля до верхней границы формы

Height Высота поля

Width Ширина поля

Font Шрифт, используемый для отображения вводимого текста

ParentFont Признак наследования свойств шрифта «родительской» формы

Свойство Описание

Name Имя компонента. Используется для доступа к свойствам компонента

Caption Текст, который находится справа от кнопки

Checked Состояние, вид кнопки: если кнопка выбрана, то Checked = True; если кнопка не выбрана, то Checked = False

Left Расстояние от левой границы флажка до левой границы формы

Top Расстояние от верхней границы флажка до верхней границы формы

Height Высота поля вывода поясняющего текста

Width Ширина поля вывода поясняющего текста

Font Шрифт, используемый для отображения поясняющего текста

ParentFont Признак наследования характеристик шрифта «родительской» формы

Т а б л и ц а 4 . 6

Свойства радиокнопки

222

Page 224: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ОСвойство Описание

Name Имя компонента. Используется для доступа к свойствамкомпонента

Caption Текст, который находится справа от флажка

Checked Состояние, вид флажка: если флажок установлен, то Checked = True; если флажок сброшен, то Checked = False

State Состояние флажка. В отличие от свойства Checked, позволяетразличать установленное, сброшенное и промежуточноесостояния. Состояние флажка определяет одна из констант:cbChecked (установлен); cbGrayed (серый, неопределенноесостояние); cbUnChecked (сброшен)

AllowGrayed Определяет, может ли флажок быть в промежуточном состоянии: если AllowGrayed = False, то флажок может быть только установленным или сброшенным; если AllowGrayed = True, то допустимо промежуточное состояние

Left Расстояние от левой границы флажка до левой границы формы

Гор Расстояние от верхней границы флажка до верхней границыформы

Height Высота поля вывода поясняющего текста

Width Ширина поля вывода поясняющего текста

Font Шрифт, используемый для отображения поясняющего текста

I’arentFont Признак наследования характеристик шрифта «родительской»формы

Файл проекта для каждой программы имеет примерно одинаковый вид. Например:

Program Projectl;

Uses Forms, Unitl In 'Unitl.pas1 {Forml};

2 2 3

Page 225: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя компонента. В программе используется для доступа к компонентуи его свойствам

Items Элементы списка — массив строк

Count Количество элементов списка

Sorted Признак необходимости автоматической сортировки (True) спискапосле добавления очередного элемента

Itemlndex Номер выбранного элемента (элементы списка нумеруются с нуля).Если в списке ни один из элементов не выбран, то значение свойстваравно -1

Left Расстояние от левой границы списка до левой границы формы

Top Расстояние от верхней границы списка до верхней границы формы

Height Высота поля списка

width Ширина поля списка

Font Шрифт, используемый для отображения элементов списка

ParentFont Признак наследования свойств шрифта «родительской»

формы

■4 TFo.1

eDPuUshod4> FocmClose

FormQoseQi

FoffnComtia

4» FocmConfex»

4* FamDeate

£j Vanafctet/Comtarts

SCJ Um

procedure TTorml.foraContcxtPopup (Sender; TCtojcct; HouacPoa: lad

!j r*r Handled: Boolean)

m \ Цды ~teafeaz«!i/n2Г*

Рис. 4.9. Окно программного модуля для обработки события

224

Page 226: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя компонента. Используется для доступа к свойствамкомпонента

Text Текст, находящийся в поле ввода-редактирования

Items Элементы списка — массив строк

Count Количество элементов списка

Itemlndex Номер элемента, выбранного в списке. Если ни один изэлементов списка не был выбран, то значение свойства равно -1

Sorted Признак необходимости автоматической сортировки (True)списка после добавления очередного элемента

DropDownCount Количество отображаемых элементов в раскрытом списке. Есликоличество элементов списка больше,

чем DropDownCount, то появляется вертикальная полосапрокрутки

Left Расстояние от левой границы компонента до левой границыформы

Top Расстояние от верхней границы компонента до верхнейграницы формы

Height Высота компонента (поля ввода-редактирования)

Width Ширина компонента

Font Шрифт, используемый для отображения элементов списка

ParentFont Признак наследования свойств шрифта «родительской» формы

225

Page 227: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя компонента. Используется в программе для доступа ккомпоненту и его свойствам

Caption Текст, отображаемый на кнопке

Font Шрифт, который используется для отображения текста

Left Расстояние от левой границы формы до левой границы компонента

Top Расстояние от верхней границы формы до верхней границыкомпонента

Width Ширина поля компонента

Height Высота поля компонента

Enabled Признак доступности кнопки: кнопка доступна, если значениесвойства равно True, и недоступна, если оно равно False

Visible Признак видимости кнопки на поверхности формы: если значениесвойства равно True — кнопка отображается, в противном случае онаневидима

Glyph Картинка, отображаемая на кнопке (файл изображения)

NumGlyphs Количество картинок в файле изображения, указанного в свойствеGlyph

Layout Определяет взаимоположение картинки и текста на кнопке. Можетпринимать следующие значения: blGlyphLeft — картинкарасполагается слева от надписи, blGlyphRight — справа, blGlyphTop— сверху, blGlyphBottom — снизу

Spacing Расстояние от картинки до надписи. Расстояние задается в пикселах

работки поступающих от Windows сообщений о действияхпользователя. Когда пользователь щелкнет мышью на кнопке Close,Windows передаст программе специальное сообщение, которое заставитпрограмму прекратить работу и освободить назначенные ей системныересурсы. Файл проекта полностью формируется самой средой Delphi и вбольшинстве случаев не

226

Page 228: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Свойство Описание

Name Имя компонента. Используется в программе для доступа ккомпоненту и его свойствам

Enabled Признак доступности компонента. Прокрутка доступна, еслизначение свойства равно True, и недоступна, если оно равно False

Kind Определяет положение прокрутки: горизонтальное иливертикальное

Max Задает максимальное значение положения ползунка

Min Задает минимальное значение положения ползунка

Visible Признак видимости компонента на поверхности формы. Прокруткаотображается, если значение свойства равно True. В противномслучае она невидима

LargeChange Указывает, на какое количество точек перемещается ползунок прищелчке мышью по полосе либо при нажатии клавиши [PageUp] и[PageDown]

Left Расстояние от левой границы формы до левой границы компонента

Top Расстояние от верхней границы формы до верхней границыкомпонента

Width Ширина поля компонента

Height Высота поля компонента

предназначен для редактирования (по крайней мере, в учебных задачах).Несколько слов об отличии языка программирования Delphi от языка

TurboPascal: к простым типам данных здесь добавляется тип дата-время(средства для работы с этим типом представлены в табл. П3.1), ксложным — процедурные типы, варианты и классы.

Особую роль в Delphi играют строки, и так как здесь для ввода-вывода (обмена данными между компонентами) чаще всего ис-пользуется именно строковый тип данных, набор необходимых дляработы соответствующих средств приведен в табл. П3.2.

Табли ц а 4 . 11

Свойства полосы прокрутки

227

Page 229: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

4.5. Событийно-управляемое программирование

В Delphi программный код хранится в виде модулей. При этомструктура модуля достаточно близка к аналогичной структуре вТурбоПаскале, хотя имеются и некоторые отличия:

Unit <имя>;

Interface

Интерфейсная часть>

Implementation

<исполняемая часть>

Initialization

Инициализирующая часть>

Finalization

<завершающая часть>

End.

Здесь Unit — зарезервированное слово (единица), начинающеезаголовок модуля; <имя> — имя модуля (правильный идентификатор);Interface — зарезервированное слово (интерфейс), начинающееинтерфейсную часть модуля; Implementation — зарезервированное слово(выполнение), начинающее исполняемую часть; Initialization —зарезервированное слово (инициализация), начинающееинициализирующую часть модуля; Finalization — зарезервированноеслово (завершение), начинающее завершающую часть модуля; End —зарезервированное слово, являющееся признаком конца модуля.

Таким образом, модуль состоит из заголовка и четырех составныхчастей, любая из которых может быть пустой.

Назначение первых двух частей модуля такое же, как в Турбо-Паскале, поэтому не будем останавливаться на них подробно.Инициализирующая и завершающая части модуля чаще всего от-сутствуют вместе с начинающим их словами Initialization и Finalization. Винициализирующей части размещаются операторы, которыеисполняются до передачи управления основной программе и обычноиспользуются для подготовки ее работы. Например, в них могутинициализироваться переменные, открываться необходимые файлы идр. В завершающей части указываются операторы, выполняющиесяпосле завершения работы основной программы. Если несколькомодулей содержат инициализирующие части, эти части выполняютсяпоследовательно друг за другом в порядке перечисления модулей в Usesглавной программы. Если несколько модулей содержат завершающиечасти, эти части выполняются последовательно друг за другом в

Page 230: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рассмотрим использование некоторых стандартных компонентов.Для примера разработаем программу, которая позволяет решать

линейное уравнение вида ах+ b = 0.Спланируем реализуемый проект. Очевидно, что форма для решения

задачи должна содержать заголовок с текстом решаемой задачи. Крометого, должны иметься текстовые поля ввода для значений а, Ь.Результат также должен выводится в определенное поле. Для получениярезультата после ввода данных необходимо на форме разместитьсоответствующую кнопку. Для инициализации переменных и очисткиформы от ранее полученных результатов требуется кнопка сброса.

П р и м еча н и е . Будем полагать, что пользователи вводят корректные данные.Отметим также, что в отличие от ТурбоПаскаля разделителем целой и дробнойчастей вещественного числа в русскоязычной версии Windows (если не выбранадругая настройка) является запятая.

Примерный вид окна программы решения указанной задачи показанна рис. 4.10.

Определим, какие компоненты необходимо помещать на форму. Длявывода сообщения «Программа решения линейного уравнения ах + b =0», надписей «а», «Ь» и ответа используем компонент Label. Для вводаинформации используем компонент Edit, и, наконец, для кнопок —компонент Button.

Итак, поместим все необходимые компоненты на форму, от-регулируем их размеры, установим значения свойств по умолчанию ипереименуем задаваемые по умолчанию идентификаторы компонентовдля лучшей читаемости кода программы.

Рис. 4.10. Форма интерфейса приложения

229

Page 231: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Идентификатор компонента для кнопки [Решить!] назовем Solution,для кнопки [Сброс] — Clear, поле вывода ответа — Answer. Остальныеидентификаторы оставим неизменными.

Для всех компонентов установим необходимое значение свойстваCaption для отображения запланированного текста.

Далее программируем реакцию на действия пользователя при работепрограммы. В нашем случае следует предусмотреть реакцию нанажатие кнопок [Решить!] и [Сброс].

Код для кнопки [Сброс]:

Procedure TForml.ClearClick(Sender : TObject);

Begin

Editl.Text := 'O';

Edit2.Text := 'O';

Answer.Caption := 'Ответ:?';

End;

Код для кнопки [Решить!]:

Procedure TForml.SolutionClick(Sender : TObject);

Var a, b : real; x : real; s : String;

Begin

a := StrToFloat(Editl.Text);

b := StrToFloat(Edit2.Text);

If а о 0

Then Begin

x := -b/a;

230

Page 232: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Полный код модуля для реализуемого проекта имеет следующий вид:

Unit Unitl;Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Type

TForml = Class(TForm)

Labe11 : TLabel;

Labe12 : TLabel;

Editl : TEdit;

Label3 : TLabel;

Edit2 : TEdit;

Solution : TButton;

231

Page 233: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure TForml.ClearClick(Sender: TObject);Begin

Editl.Text :='0';

Edit2.Text := ' 0 ';

Answer.Caption :='Ответ:?';End;

End.

Данная программа готова к работе. Компиляция осуществляетсяследующим образом:• выполнить команду Проект/Опции (Project/Option), после чегооткроется диалоговое окно Опции проекта (Project Options);• выбрать вкладку Каталог/Условия (Directories/Conditionals);• задать в разделе Каталоги в строке Результат (Output directory)путь до папки с файлами проекта, в которой будет записан ре-зультирующий ехе-файл;• выполнить команду Проект/Компилировать проект (Project/Build All).

Имя ехе-файла совпадает с именем файла проекта. Этот файл можнобудет запустить вне среды Delphi. Если ехе-файл не требуется, то строкуРезультат (Output directory) следует очистить, в этом случае файлбудет компилироваться в память.

В процессе отладки для запуска программы можно использоватькнопку Щ или клавишу F9.

Упражнения

1. На основе приложения для решения линейного уравнения разработать:а) приложение для решения квадратного уравнения;б) приложение для решения системы из двух линейных уравнений с двумя

неизвестными.2. Дополнить приложение для решения линейного уравнения и приложения изпервого упражнения проверкой ввода данных.

Page 234: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

приложения, хотя многое из того, что обсуждалось и использовалосьранее, остается в силе. Заметим, что написание учебного приложения —это моделирование действий по разработке «взрослых» программныхпродуктов, подразумевающее некоторое упрощение процесса ссохранением его основных черт. С этих позиций и будем рассматриватьдалее этапы разработки приложений в Delphi. Отметим также, чтопроцесс создания программы чаще всего носит итерационный характер,т.е. сначала выполняются анализ, проектирование и реализацияинтерфейса или его части, а затем программа наращивается дополучения окончательного варианта.

В разработанной в подразд. 4.5 программе большинство из этихэтапов имеется. Остановимся на них подробнее.

Этапы разработки приложений. Упрощенное представление этаповразработки:• постановка задачи, изучение предметной области, построениемодели (математической, информационной), проецированиепостроенной модели на разрабатываемое ООП-приложение;• проектирование ООП-приложения;• разработка интерфейса пользователя;• программирование приложения, тестирование и отладка про-граммного кода;• разработка документации.

Не будем подробно останавливаться на первом этапе, поскольку егосодержание, детально описанное при рассмотрении структурногоподхода к программированию, не имеет принципиальных отличий приОПП.

Более детально обсудим последующие этапы разработки ООП-приложения в визуальной среде.

Проектирование ООП-приложения. Результатом первого этапаразработки является информационная модель исследуемого процесса,явления (в нашем случае решаемой содержательной задачи). По сути,эта модель уже содержит, как минимум, набор объектов и связей междуними (т.е. для исходной системы выполнена декомпозиция). На этапепроектирования ООП-приложения каждому объекту необходимо датьуникальное имя (задать идентификатор). Здесь же принимаетсярешение, какие из объектов требуют визуализации, т.е. в терминахDelphi, какие компоненты будут отображены на форме.

Для каждого выделенного объекта необходимо указать переченьхарактеристик (свойств) и действий над ним. Действия над объектомотображаются посредством набора методов. Далее будет показано, чточаще всего в качестве такого рода действий в ООП-приложе- нии,разрабатываемом для функционирования в операционной системе сграфическим интерфейсом (например, Windows), выступают реакции наразного рода события как внешние, так и внутренние.

233

Page 235: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Разработка интерфейса пользователя. При разработке интерфейсапользователя необходимо отталкиваться от функциональногоназначения приложения. В Delphi особенность разработки интерфейсазаключается в том, что многие его элементы (форма, компоненты и т.д.)уже присутствуют в среде программирования. Таким образом,интерфейс создается на базе имеющихся «кирпичиков» и адаптируетсяпод запросы потенциального конечного пользователя.

При разработке интерфейса пользователя необходимо соблюдать рядправил.1. При проектировании окон (форм) ввода данных:• для команд всегда следует создавать клавишные эквиваленты (приэтом необходимо там, где это уместно, сохранять привычныеэквиваленты), не заставляя пользователя применять исключительномышь;• расположение элементов на главной форме должно быть со-гласовано с задачами пользователя;• при вводе данных должна присутствовать заметная, но нена-вязчивая связь с пользователем (например, синтаксический контроль и,если возможно, исправление ошибок и опечаток);• для нескольких разных форм ввода не следует использоватьсущественно отличающиеся интерфейсы.2. При создании меню:• следовать стандартным соглашениям о расположении пунктовменю, принятым в Windows;• группировать пункты меню в логическом порядке и по содер-жанию;• для группировки пунктов в раскрывающихся меню использоватьразделительные линии;• избегать избыточных меню;• использовать клавиатурные эквиваленты команд и «горячие»клавиши;• помещать на панель инструментов часто используемые командыменю.3. При работе приложения в процессе ожидания следует ин-формировать пользователя о ходе работы (например, с помощьюиндикатора состояния выполнения задания).

Естественными являются общие дизайнерские требования: со-четание цвета фона приложения и цвета выводимого на него текста,количество используемых цветов и др.

Программирование, тестирование, отладка. Как уже отмечалось, наэтапе проектирования приложения выделяется функциональноеназначение всех его элементов и возможные реакции на внешние ивнутренние события.

Часть программного кода, которая касается интерфейса приложения,генерируется автоматически при помещении и настройке

234

Page 236: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

свойств соответствующих элементов. Часть кода, касающуюся обра-ботки событий, создает программист. Кроме того, программный кодможет содержать вспомогательные подпрограммы, необходимые дляфункционирования отдельных частей или приложения в целом.Размещение кода таких подпрограмм будет рассмотрено далее.

Очевидно, что каждый из разработанных методов и вспомогательныхподпрограмм, а затем и комплекс в целом подвергаются процедуретестирования. Приемы тестирования мало отличаются от приемов,применяемых для тестирования кода структурных программ. Длякаждого метода или подпрограммы составляется столько тестов, скольковозможно вариантов прохождения данного метода, проверяютсяграничные и недопустимые состояния. При этом требования к тестовымнаборам сохраняются. В коде программы необходимо предусмотретьверификацию данных при вводе.

Далее тестируется взаимодействие разных элементов программы иприложения в целом. Отметим, что тестовые наборы разрабатываютсядо начала процедуры тестирования. В общем случае они являютсячастью документации приложения. В настоящее время при разработкепрограммного обеспечения используют системы автоматическойгенерации тестовых наборов, которые создаются на основе моделирешаемой задачи. В учебном программировании тестовые наборысоздаются «вручную».

Разработка документации. Любой программный продукт сопро-вождается документацией. При разработке ООП-приложения состав иназначение документации должен отвечать тем же требованиям, что ипри разработке программного обеспечения для других парадигмпрограммирования. Минимальный пакет документации составляютруководство программиста и руководство пользователя. Состав иструктура документации в общем случае стандартизированы.

Важно отметить наличие самодокументирования программного кода,т.е. комментариев к его блокам в тексте программы.

При разработке учебных программ рекомендуется следующий составотчетной документации:• описание постановки задачи;• описание модели;• описание проекта (количество элементов на форме, их функции,взаимодействие между собой, взаимодействие с другимиприложениями) и инициализация свойств объектов;• тестовые наборы для каждого метода, вспомогательных под-программ, интерфейсной части и приложения в целом;• программный код с комментариями;• результаты работы программы (при выполнении расчетов иликаких-либо других действий, предполагающих эти результаты).

235

Page 237: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

4.7. Примеры разработки приложений Delphi

Рассмотрим примеры прохождения этапов разработки программногопродукта.

Пример 4.4. Требуется запрограммировать калькулятор для вы-полнения действий с числами в системе счисления с основанием р(2<р<9).

Спланируем реализуемый проект и примерный интерфейс при-ложения. Форма будет содержать кнопки для набора цифр. Причем, есликакие-либо цифры не входят в систему счисления с текущимоснованием, они скрываются. Выбор основания системы счислениябудем осуществлять из раскрывающегося списка, который имеется наформе. Результаты (как промежуточные, так и итоговые) выводятся вопределенное поле. Еще четыре кнопки обозначим знаками четырехарифметических операций, также необходимы кнопка [=] и кнопкасброса [С].

Опишем предполагаемое функционирование приложения:• при нажатии цифровой кнопки очередная цифра отображается взаписи текущего числа в поле результата;• при нажатии кнопки [С] в поле результата отображается нуль;• при нажатии кнопок со знаками операций текущее значениеиспользуется в качестве второго операнда (предполагается, что первыйуже имеется в памяти или, по крайней мере, равен нулю) в тойоперации, которая была выбрана ранее, результат и текущая выбраннаяоперация запоминаются, в поле результата индицируется нуль (полеготово к вводу следующего числа);• при нажатии кнопки [=] вычисляется окончательный результат всоответствии с последней выбранной операцией;

-:iil - IPI *1 .

-il Ш _lI _J А3| -I

±1 _LI JLJ J _Е]

Основание I® ~E\

Рис. 4 . 11 . Интерфейс приложения «Калькулятор»

236

Page 238: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• при выборе основания системы счисления значение в полерезультата переводится в эту систему счисления.

Вид окна программы решения указанной задачи показан нарис. 4.11.

Приведем некоторые листинги (другие предлагается разработать самостоятельно по аналогии).

Код процедуры для события «Выбор основания системы счисления» (с использованием компонента ComboBox) следующий:

Procedure TCalculator.OsnovanieSelect(Sender:

TObject);

Var a, p : Integer, s : String;Beginp := pOld;

PTolO(Rezalt.Text, p, a);pOld StrToInt(Osnovanie.Text);

10toP(a, pOld, s) ;

Rezalt.Text s

Case StrToInt(Osnovanie.Text) Of2: Begin

2.Visible = False;3.Visible = False;4.Visible = False;5.Visible = False;

6.Visible = False;

7.Visible = False;8.Visible = False;

End;3: Begin

2.Visible = True;3.Visible = False;

4.Visible = False;5.Visible = False;

6.Visible = False;7.Visible = False;

8.Visible = False;

End;4: Begin

2.Visible = True;3.Visible = True;4.Visible = False;5.Visible = False;

6.Visible = False;7.Visible = False;

8.Visible - False;

End;

237

Page 239: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2.Visible = True;3.Visible = True;4.Visible = True;5.Visible = False;6.Visible = False;7.Visible = False;8.Visible = False;

2.Visible = True;3.Visible = True;4.Visible = True;5.Visible = True;6.Visible = False;7.Visible = False;8.Visible = False;2.Visible = True;3.Visible = True;4.Visible = True;5.Visible = True;6.Visible = True;7.Visible = False;8.Visible = False;

2.Visible = True;3.Visible = True;4.Visible = True;5.Visible = True;6.Visible = True;7.Visible = True;8.Visible = False;

2.Visible = True;3.Visible = True;4.Visible = True;5.Visible = True;6.Visible = True;7.Visible = True;8.Visible = True;

End; 6:Begin

End;

7: Begin

End;

8: Begin

End; 9:Begin

End;End;

End;238

Page 240: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Щелчок мышью по кнопке с обозначением цифры на примерекнопки [0]:

Procedure TCalculator._0Click(Sender : TObject); BeginIf Rezalt.Text = 'O' Then Rezalt.Text :=_0.Caption

Else Rezalt.Text := Rezalt.Text + _0.Caption End;

Щелчок мышью по кнопке со знаком операции на примере операции[+]: х

Procedure TCalculator.PlusClick(Sender : TObject); BeginOperation;Znak := '+';

End;

Щелчок мышью по кнопке [=]:

Procedure TCalculator.ButtonlClick(Sender : TObject); Var s : String;Begin

Operation;Znak := ' ';_10ToP(a, POld, s);Rezalt.Text := s; a : = 0 ;

End;

Приведем также реализацию вспомогательных процедур, которыенепосредственно выполняют переводы из десятичной системысчисления в систему с основанием р, и наоборот, а также собственновыполнение арифметических операций:

Procedure _10ТоР(а, р : Integer; Var s : String); Begin

If a = 0 Then s : = 'O' Else s :='';While a о 0 Do Begin

s := IntToStr(a mod p) + s; a:= a div p

End;

End;

Procedure _PTolO (s : String; p : Integer; Var a :Integer);

Var i : Integer;

239

Page 241: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 * ' : a : = a * r ;2.Visible = False;

_3.Visible = False;4.Visible = False;

_5.Visible = False;

6.Visible - False;_7.Visible = False;

8.Visible = False;

pOld := 2; := 0;

Begin

a : = 0;

For i := 1 To length (s) Do

a := a * p + StrToInt (s[i])End;

Procedure Operation;

Var r : Integer;Begin

'/': a := a div r End;

Calculator.Rezalt.Text :='0';End;

Указанные процедуры не входят в состав основных и присутствуютлишь в разделе реализации модуля проекта (Implementation).

Наконец, при запуске приложения инициализируются переменные(глобальные и некоторые поля компонентов):

Procedure TCalculator.FormCreate(Sender : TObject);Begin

End;

Пример 4.5. Требуется реализовать приложение, моделирующееследующую игру для младших школьников. На поле есть две коробки:для черных и для белых шариков, а также некоторое количество черныхи белых шариков (от 2 до 10). Разложить эти шарики по коробкам иуказать, каких больше — черных или белых.

При реализации требуемого приложения будем использоватьспециальный прием связывания программ с данными в Windows,который называется Drag&Drop (перетащи и отпусти). Использо-

Page 242: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 o0 3

вание соответствующих событий и свойств данного механизма при-менительно к объектам Delphi опишем по ходу реализации.

Спланируем проект и примерный интерфейс приложения. Формабудет содержать две коробки (компоненты TLabel) и десять шариков(компоненты TShape). При этом при каждом запуске программы числошариков и их цвет будут задаваться случайным образом.

Опишем предполагаемое функционирование приложения:• при запуске инициализируются необходимые свойства ком-понентов и задаются число и цвет шариков, а лишние шарики при этомскрываются;• при Перетаскивании шарика в «свою» коробку и отпусканиикнопки мыши шарик исчезает и счетчик числа шариков в коробкеувеличивается на единицу;• при перетаскивании шарика в «чужую» коробку его размещение вней запрещается и шарик остается на месте.

Примерный вид формы для создаваемого приложения показан нарис. 4.12.

Возможный результат работы этой программы показан на рис. 4.13.Опишем логику работы создаваемого приложения на основе

программного кода.

Ecft Search View Prefect _____I ШШШШШШШШ H H4 JalM.

Component Database Toots WfcxJow Нф j {]<None>|***оп4| W«32| S«tfe»| DauAcotttl DauCantatl IKOMI Daiabnaol BDC I ADO I Matiaiel We6S«v«*.| IrtMnetili.

lit! » ♦pss

i 0 o10Ia

004005

: -

■ l|ActorЛейу«&*»г>1 Algn

rfJ on

AutcSce FalseBCWo* bdleWToRght

(ilBo«hrtcoot

HaSydenWtnu.

i

Игра

(MHei 013

(bciwrtb m

Cob □citat'K.WConHiartt ITSaeConrtaniCMD W

щШШ :::

:: ;

::::::

Ш

Vrtrxlow* Сажип*» S.. ta^.doc- Were*. ■ |j >OdpM7* "ft 099S 18:50

Рис. 4.12. Форма для создания интерфейса приложения «Игра»

241

: :

Page 243: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Рис. 4.13. Окно приложения «Игра»

При запуске приложения необходимо инициализировать все свойстваи разместить случайное число шариков на форме. Программа даннойпроцедуры следующая:

Procedure TForml.FormCreate(Sender : TObject); Var i : Integer;

a[1] := ol; a[2]a [4] := o4; a [5]a [ 6] := об;

242

Page 244: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

For i := n + 1 To 10 Do With a[i]Do Visible := False;

{Раскрашиваем в белый или черный цвет оставшиеся шарики} For i := 1 То n Do With a[i] Do Begin

If random(2) = 0 Then Begin

Brush.Color := clBlack;

Hint := 'b'End Else Begin

Brush.Color := clwhite;

Hint := 'w'End;

DragMode := dmAutomatic End;

End;

Здесь b, w — соответственно счетчики черных и белых шариков, ужеопущенных в коробки; Black, White — имена компонентов, т.е.«коробок» для хранения черных и белых шариков.

Установка свойства Hint осуществляется для того, чтобы у шарика,243

Page 245: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure TForml.BlackDragOver (Sender, Source: TObject;X, Y : Integer; State: TDragState; Var Accept : Boolean);

Begin

If (Sender Is TLabel) And (Source Is TShape) Then Accept := ((Sender As TLabel).Hint = (Source As TShape).Hint)

End;

Параметр Sender указывает компонент, над которым перемещаетсяобъект. Параметр Source содержит информацию о компоненте-отправителе. В параметрах X и Y содержатся координаты указателямыши, выраженные в пикселах, относительно компонента Sender.Параметр State указывает состояние перемещаемого объектаотносительно компонента Sender. Параметр Accept сообщает, готов лиSender принять перетаскиваемые данные. Если параметр имеет значениеTrue, то Sender готов принять перетаскиваемый объект.

В данном примере обработка указанного события заключается всравнении значений свойства Hint отправителя и приемника.

Обработка события реализована для объекта Black. В объекте Whiteдля соответствующего события сделана ссылка на этот же обработчиксобытия.

При завершении перетаскивания (вне зависимости от того, принятыданные или нет) для перетаскиваемого объекта возникает событиеOnDragEnd. Это событие происходит также при отмене перетаскивания,причем оно не является обязательным для выполнения. Операцияперетаскивания может быть произведена и без обработки этого события.

Реализуем обработку для первого шарика (для остальных сделанассылка на этот же обработчик события):

Procedure TForml.olEndDrag(Sender, Target: TObject; X, Y:Integer);

Var s: String;Begin

End;

244

Page 246: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ol TShape;o2 TShape;o3 TShape;

o4 TShape;

o5 TShape;об TShape;ol TShape;

08 TShape;o9 TShape;

olO : TShape;

Procedure FormCreate(Sender : TObject); ProcedureBlackDragOver(Sender, Source : TObject; X, Y : Integer; State : TDragState; Var Accept : Boolean);

Procedure olEndDrag(Sender, Target : TObject; X, Y : Integer);

End;

Var Forml : TForml; n : Integer; a :245

Page 247: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

White.Height := 80;

White.Width := 80;

White.Hint := 'w'; a[1] :=ol; a[2] := o2; a[3] := o3;a[4] := o4; a [5] := o5; a[6] := об; a [7] := o7; a[8] := 08; a[9] := o9; a[10]: = olO; randomize; n :=random(9) + 2;

{Скрываем лишние шарики}

For i := n + 1 To 10 Do

With a[i] Do Visible := False;

{Раскрашиваем в белый или черный оставшиеся шарики}For i := 1 То n Do With a[i] Do Begin

If random(2) = 0 Then

End

246

Page 248: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Else Begin w := w + 1; str (w, s) ;

(Target As TLabel).Caption :=

'Белых' +#10 + #13 + sEnd;

(Sender As TShape).Visible := False;End;

End;

End.

Упражнения

1. Продолжить программу из примера 4.4, реализовав по аналогиипроцедуры для других цифровых кнопок и кнопок со знаками операций,и получить работающий калькулятор.2. Дополнить форму к примеру 4.5 (см. рис. 4.12) кнопкой [Закрыть],которая появляется после того, как все шарики помещены в коробки.Обработать нажатие кнопки, по которому закрывается приложение.

4.8. Иерархия классов

Терминология, касающаяся объектно-ориентированного про-граммирования, принятая в Delphi, несколько отличатся от тер-минологии в ТурбоПаскале. Рассмотрим эту терминологию, а такжеспособы реализации объектного подхода к программированию иосновные его принципы, принятые в Delphi.

Классы в Delphi. Объявление класса, свойств и методов. То, что вТурбоПаскале именовалось объектом, в Delphi принято называтьклассом. Классы в Delphi — это специальные типы, которые содержатследующие элементы: поля, методы и свойства. Как и любой другойтип, класс служит лишь образцом для создания конкретных экземпляровреализации, которые называются объектами. Данная терминологияупотребляется в C++, откуда и была заимствована.

247

Page 249: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Туре Идентификатор типа класса> = Class Private <скрытыеэлементы класса>;

Protected <защищенные элементы класса>;

Public <общедоступные элементы класса>;

Published <опубликованные элементы класса>;End;

Не все указанные в данном шаблоне секции могут присутствоватьпри объявлении класса. Поясним их смысл.

Секция Private содержит внутренние элементы, обращение к которымвозможно только в пределах модуля, содержащего объявление класса.

Секция Protected содержит защищенные элементы, которыедоступны в пределах модуля, содержащего объявление класса, а такжевнутри «потомков» класса.

Секция Public содержит общедоступные элементы, к которымвозможно обращение из любой части программы.

Наконец, секция published содержит опубликованные элементы,доступ к которым осуществляется так же, как и элементам секцииPublic.

«Потомки» класса могут менять область доступности всех элементов«родительского» класса, за исключением объявленных в секции Private.

Если при объявлении элементов класса не указывать, к какой секцииотносится объявление, то доступ к данным элементам будетосуществляться как к объявленным в секции Public. В Delphiразрешается сколько угодно раз объявлять любую секцию, причемпорядок следования секций не имеет значения и любая секция можетбыть пустой.

Приведем пример объявления класса. Опишем класс «Обыкновеннаядробь» с методами «НОД числителя и знаменателя», «Сокращение»,«Натуральная степень» (см. пример 4.1):

248

Page 250: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

любого типа, в том числе и классами. Инкапсулированные в классепроцедуры и функции являются методами. Свойства — это специальныймеханизм классов, регулирующий доступ к полям. Объявляютсясвойства с помощью зарезервированных слов Property, Read и Write(слова Read и Write считаются зарезервированными только в контекстеобъявления свойства). Обычно свойство связано с некоторым полем иуказывает те методы класса, которые должны использоваться при записив это поле или при считывании из него.

Реализация методов, как и в ТурбоПаскале, осуществляется внеобъявления класса, при этом по-прежнему требуется указывать методкакого класса реализуется. Например, при реализации метода Vvod изпримера 4.1 заголовок будет иметь следующий вид:

Procedure Drob.Vvod;

Наследование. Любой класс может быть образован от другого класса.Для этого при его объявлении указывается имя класса- «родителя»:

<дочерний класс> = Class (<родительский класс>)

Образованный класс автоматически наследует поля, методы исвойства своего «родителя» и может добавлять новые. Принципнаследования обеспечивает поэтапное создание сложных классов иразработку собственных библиотек классов.

Все классы Delphi образованы от одного «родителя» — классаTObject, который не имеет полей и свойств, но включает в себя методысамого общего назначения, обеспечивающие весь жизненный цикллюбых объектов — от создания до уничтожения.

Принцип наследования приводит к созданию ветвящегося дереваклассов, постепенно разрастающегося при перемещении от классаTObject к его «потомкам». Каждый «потомок» дополняет возможностисвоего «родителя» новыми и передает их своим «потомкам».

В Delphi не реализовано множественное наследование, т. е. «до-черний» класс может иметь только одного «родителя».

В качестве примера приведем рассмотренный ранее класс «Вы-числитель» (см. пример 4.2):

Type BaseType = Double;

249

Page 251: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Procedure Umn ;

Procedure Delen;

End;

NovijVichislitel = Class(Vichislitel)

N : Integer;Procedure Stepen;

Procedure Koren;

End;

Полиморфизм, перегрузка методов. В Delphi определение по-лиморфизма аналогично определению в ТурбоПаскале: полиморфизм —это свойство классов выполнять одинаковые по смыслу действияразными способами. Изменив алгоритм того или иного метода«потомков» класса, придадим им отсутствующие у «родителя»специфические свойства. Для изменения метода необходимо перекрытьего у «потомка», т.е. объявить у «потомка» одноименный метод иреализовать в нем необходимые действия. В результате объект«родитель» и объект «потомок» будут иметь два одноименных метода сразной алгоритмической основой, которые, следовательно, придаютобъектам разные свойства. В Delphi полиморфизм достигается не толькос помощью механизма наследования и перекрытия методов «родителя»,но и их виртуализацией, позволяющей «родительским» методамобращаться к методам своих «потомков».

Механизм перекрытия «родительского» метода одноименнымметодом «потомка» приводит к тому, что последний «не видит»перекрытый «родительский» метод и может обращаться к нему лишь спомощью зарезервированного слова Inherited. В Delphi введенозарезервированное слово Overload (перезагрузить), с помощью которогостановятся видны одноименные методы как «родителя», так и«потомка».

Понятие объектно-ориентированного проектирования. Моделиразрабатываемого программного обеспечения при объектном подходеоснованы на предметах и явлениях реального мира, а также на описаниитребуемого поведения разрабатываемого программного обеспечения, т.е.его функциональности, которая связывается с состояниями элементов(объектов) конкретной предметной области.

Объектный подход к разработке программного обеспечения основанна использовании объектной декомпозиции, т.е. представлении250

Page 252: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ного программирования были разработаны соответствующие методыанализа и проектирования программного обеспечения, использующиеразличные модели и нотации.

В 1994 г. был разработан язык UML (Unified Modeling Language —унифицированный язык моделирования), который в настоящее времяфактически признан стандартным средством описания проектов,создаваемых с использованием объектно-ориентированного подхода.(Подробное описание этого языка смотрите в специальной литературе.)

Упражнения

1. Описать следующие классы с указанием их методов:а) «Телефонный звонок» — номер телефона, дата разговора, продол-

жительность, код города и т.д.;б) «Поездка» — номер поезда, пункт назначения, дни следования, время

прибытия, время стоянки и т.д.;в) «Кинотеатр» — название кинофильма, сеанс, стоимость билета, количество

зрителей и т.д . .Реализовать объявленные в классах методы. Описать объекты-«потом- ки» для

указанных классов. Выполнить отладку и тестирование приложения.2. Реализовать в виде класса пример 4.3. Дополнить набор классов классом«Прямоугольник», а также другими выпуклыми четырехугольниками, неявляющимися параллелограммами (трапеция и т.д.), и реализовать соответственноих методы.3. Реализовать в среде Delphi упражнение 6 из подразд. 4.2.

Page 253: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

13. cos * +16xcos(xy)- 2;47TT-MT7;

6"-y+y;

{ у - y j W) f У )V *

; 8. (1 - tg x)ctg* + cos(x - j);2 XL

X +-------

, 4 ,

5.1. Тема «Линейные программы»

1. * • ^ ‘ 4"'' „ У,/ , » ; 2а

3 sm£+cos£tg^;

5.

COS X - sin

у

З + е'-11 + х 2 \у - tg х\ ’

7. In

9.lnlcosxl .1п(1 + Х 2 ) ’

11.Vе

-12х 2у,

n-2x

15. 2ctg(3

x)-

112x2+7x-5’

COSX

19. ex -y 2 +

I2xy

-

2.a b ab- с с

d cd ’

. x + y xy-12

X3 X5

Page 254: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

10.

12

x + 1X -14 /

x 2 - lx + 10

+ 18лу2;

x2 -8x + 12’

14. 2~ x - cos x + sin(2xy);

Ix16. Ix2 -x3|-x3 -15x ’

18. sin Vx +1 - sin

Vx-1;

1 + sin VxTT

20.cos(12y-4) ’

252

21. 2ctg(Зх)- ^ cos * ; 22. e*-x-2 + (l + x)*;ln(l + x2)

23. 3X - 4x + (y - \lbc\y, 24. x-10sinx + |x4 -x5|;

25. x - 10sin* + cos(x - j); 26.1 + sin2(x + y) „~ + x:

f i л 27. cos2

sin— ; 28.cos2 x ax 2 +bx + ccos2 x

5.1.2. Математические задачи

5.1.3. Вычислить периметр и площадь прямоугольноготреугольника по длинам двух катетов аи Ь.

5.1.4. Даны координаты трех вершин треугольника (х,,^), (х 2 ,у2), (х3, уз). Найти его периметр и площадь.

5.1.5. Вычислить длину окружности и площадь круга сзаданным радиусом R.

5.1.6. Найти произведение цифр заданного четырехзначногочисла.

5.1.7. Даны два числа. Найти среднее арифметическое кубов исреднее геометрическое модулей этих чисел.

5.1.8. Вычислить расстояние между двумя точками сзаданными координатами (хь у,) и (х 2 ,у 2).

5.1.9. Даны два действительных числа хи у. Вычислить ихсумму, разность, произведение и частное.

5.1.10. Дана длина ребра куба. Найти площади грани, полнойповерхности и объем этого куба.

5.1.11. Дана длина стороны равностороннего треугольника.Найти площадь этого треугольника, его высоту, радиусывписанной и описанной окружностей.

5.1.12. Известна длина окружности. Найти площадь круга,ограниченного этой окружностью.

5.1.13. Найти площадь кольца, внутренний радиус которого ра-вен г , а внешний — заданному числу R (Я> г).

5.1.14. Треугольник задан значениями углов и радиусомописанной окружности. Найти длины сторон этоготреугольника.

5.1.15. Найти площадь равнобедренной трапеции соснованиями а и b и углом а при большем основании а.

5.1.16. Вычислить корни квадратного уравнения ах 2+Ьх+с = 0с заданными коэффициентами а, b и с, если предполагается, чтоа Ф 0 и что дискриминант уравнения неотрицательный.

5.1.17. Дано действительное число х. Используя минимальноечисло арифметических операций (только умножение, сложение

253

Page 255: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1. Дано число х. Вычислить значения -2х+ Зх2 - 4*3 и 1 + 2х + + Зл2

+ 4Л3, используя минимальное число операций.2. Найти площадь треугольника со сторонами а и b и углом междуними у.3. Дано число а. Используя только умножение, получить значения:

а) а8 за три операции;б) а10 за четыре операции;в) а4 за две операции;г) а6 за три операции;д) а9 за четыре операции;е) а13 за пять операций;ж) а15 за пять операций;з) а21 за шесть операций;и) а28 за шесть операций;к) а64 за шесть операций;л) а7 за четыре операции.

4. Вывести на экран первые четыре степени числа л.5. Найти сумму членов арифметической прогрессии, если известныее первый член, знаменатель и число членов прогрессии.6. Найти (в радианах и градусах) все углы треугольника состоронами а, Ь, с.7. Перевести радианную меру угла в градусы, минуты и секунды.Решить обратную задачу.8. Три резистора Rl, R2, R3 соединены параллельно. Найтисопротивление соединения. Решить обратную задачу: по известномуобщему сопротивлению соединения и двум из трех сопротивленийрезисторов, найти третье.9. Вычислить путь, пройденный лодкой, если ее скорость по озеру встоячей воде — v [км/ч], скорость течения реки — v x [км/ч], времядвижения по озеру — t x [ч], а время движения против течения реки — t 2

[ч].10. Текущее показание электронных часов т часов (0 < т < 23), пминут (0 < п < 59), к секунд (0 < к < 59). Найти, какое время будутпоказывать часы через р часов q минут г секунд.11. Вычислить высоты треугольника со сторонами а, Ь, с.12. Вычислить объемы цилиндра и конуса, имеющих одинаковуювысоту Н и одинаковый радиус основания R.13. Ввести любой символ, определить его порядковый номер иуказать его предыдущий и последующий символы.14. Дана величина А, выражающая объем информации в байтах.Перевести А в более крупные единицы измерения информации.15. Даны натуральные числа М и N. Вывести старшую цифрудробной части и младшую цифру целой части числа M/N.

254

Page 256: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

16. Дано натуральное число Т, представляющее собой длительностьпрошедшего времени в секундах. Вывести это значение длительности вчасах, минутах и секундах в следующей форме: НН ч ММ мин SS с.17. Дано действительное число R вида nnn.ddd (по три цифровыхразряда в дробной и целой частях). Поменять местами дробную и целуючасти этого числа и вывести новое полученное число.18. Даны два вектора с координатами (Хи Yu Z,) и (Х 2 , Y 2 , Z 2).Определить угол между этими векторами.19. Вычислить площадь и периметр правильного ^-угольника,описанного около окружности с радиусом R (N— целого типа, R—вещественного типа).20. Определить, во сколько раз площадь круга с радиусом R большеплощади сегмента, отсеченного хордой длиной а.21. Найти частное от деления произведений четных и нечетных цифрчетырехзначного числа.22. Дан вектор с координатами (х, у, z)■ Найти углы наклона этоговектора к координатным осям.23. Найти площадь круга, вписанного в треугольник с заданнымисторонами.24. Окружность вписана в квадрат с заданной площадью. Найтиплощадь квадрата, вписанного в эту окружность. Определить, восколько раз площадь вписанного квадрата меньше площади заданногоквадрата.25. Представить комплексное число А + Bi (А, В — вещественныечисла) в тригонометрической форме.26. Треугольник задан значениями углов и радиусом вписаннойокружности. Найти стороны этого треугольника.27. С начала суток часовая стрелка повернулась на у градусов (0 <у<360, у — вещественное число). Определить число полных часов иполных минут, прошедших с начала суток. Сформулировать и решитьобратную задачу.28. Дана величина вида а, Ь(с), где а — целая часть вещественногочисла; Ь— начало дробной части числа, с — период. Получить эточисло в виде обыкновенной дроби вида m/п, где т — числитель, п—знаменатель.29. Вычислить площадь полной поверхности треугольной пирамидыс заданными ребрами.30. Дан прямоугольный треугольник ABC (рис. 5.1), для которогоопределен набор характерных параметров: а, Ь, с — сторонытреугольника; угол у =90°; а, р — острые углы треугольника (вградусах); А — высота, опущенная на гипотенузу с\ S— площадь; /’ —периметр. По двум следующим заданным параметрам вычис- ||ить всеостальные:

а) а, Ь\ б) а, с; в) а, /г; г) Ь, а; д) h, Р; е) с, р.

255

Page 257: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

С b А В с А

Рис. 5.1. Прямоугольный треуголь- Рис. 5.2. Треугольник

ник

31. Дан произвольный треугольник ABC (рис. 5.2), для которогоопределен набор характерных параметров: а, Ь, с — стороны тре-угольника; а, р, у — углы треугольника (в градусах); Л — высота,опущенная на сторону с; S— площадь; Р— периметр. По тремследующим заданным параметрам вычислить все остальные:

5.1.18. Логические выражения

Составить программы, печатающие значение True, если следующиеуказанные высказывания являются истинными, и значение False — впротивном случае.1. Сумма двух первых цифр заданного четырехзначного числа равнасумме двух его последних цифр.2. Сумма цифр заданного трехзначного числа N является четнымчислом.3. Точка с координатами (х, у) принадлежит части плоскости,лежащей между прямыми х= т и х= п (т<п).4. Квадрат заданного трехзначного числа равен кубу суммы цифрэтого числа.5. Целое число является четным двухзначным числом.6. Треугольник со сторонами а, Ь, с является равносторонним.7. Треугольник со сторонами а, Ь, с является равнобедренным.8. Среди чисел а, Ь, с есть хотя бы одна пара взаимно проти-воположных чисел.9. Числа а и b выражают длины катетов одного прямоугольноготреугольника, а с и d— другого. Эти треугольники являются по-добными.

256

Page 258: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

10. Даны три стороны одного треугольника и три стороны другого.Эти треугольники равновеликие, т.е. имеют равные площади.11. Заданная тройка натуральных чисел а, Ь, с является тройкойПифагора, т.е. с2 = а 2 + Ь 2 .12. Все цифры заданного четырехзначного числа ./V различны.13. Заданные числа х, у являются координатами точки, лежащей впервой координатной четверти.14. Координаты левой верхней и правой нижней вершин пря-моугольника (jcb j]) и (х 2 , у 2). Точка А(х, у) принадлежит прямо-угольнику.15. Число с является средним арифметическим чисел а и Ь.16. Натуральное число ./Vявляется точным квадратом.17. Цифры заданного четырехзначного числа N образуют строговозрастающую последовательность.18. Цифры заданного трехзначного числа N являются членамиарифметической прогрессии.19. Цифры заданного трехзначного числа N являются членамигеометрической прогрессии.20. Заданные числа с и d являются соответственно квадратом икубом числа а.21. Цифра М входит в десятичную запись четырехзначного числа N.22. Заданное четырехзначное число читается одинаково слеванаправо и справа налево.23. Шахматный конь за один ход может переместиться с одногозаданного поля на другое, если каждое поле задано двумя координатами— целыми числами от 1 до 8.24. В заданном натуральном трехзначном числе N имеется четнаяцифра.25. Сумма каких-либо двух цифр заданного трехзначного нату-рального числа N равна третьей цифре.26. Заданное число N является степенью числа а, если показательстепени может находиться в диапазоне от 0 до 4.27. Сумма цифр заданного четырехзначного числа N превосходитпроизведение цифр этого же числа на 1.28. Сумма двух последних цифр заданного трехзначного числа Nменьше заданного К, а первая цифра больше 5.29. Заданное натуральное число N является двухзначным и кратно К.30. Сумма двух первых цифр заданного четырехзначного числа Nравна произведению двух последних.31. Отрицательное целое число Л'делится на К без остатка.32. Среди заданных целых чисел А, В, С, D есть хотя бы двачетных.33. Прямоугольник с измерениями А, В подобен прямоугольнику ссоответствующими измерениями С, D.

Page 259: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

34.Дробь А/В является правильной, если А, В — целые числа.35. Шахматная ладья за один ход может переместиться с одного

заданного поля на другое, если каждое поле задано двумя коор-динатами — целыми числами от 1 до 8.

36. График функции у = ах 2 + Ьх + с проходит через заданнуюточку с координатами (т , п).

37. Величина d является корнем только одного из уравнений ах 2 +Ьх+с= 0 и тх+п = 0.

38. Среди первых трех цифр дробной части вещественного числаесть нуль.

39. Среди первых трех цифр целой части вещественного числа естьнуль.

40.Дано натуральное число N— некоторый год. Этот год являетсявисокосным.

41.Дано натуральное число N— некоторый год. Этот год являетсяневисокосным.

42. Заданное натуральное число N не является двухзначным.43. Точка с координатами (х, у) не лежит ни на одной из коор-

динатных осей.44. Дано натуральное число N (N< 32). Двоичная запись этого числа

состоит из одних единиц.45. Площадь прямоугольника с измерениями А, В не превышает

площади прямоугольника с измерениями С, D.46. Шахматный слон за один ход может переместиться с одного

заданного поля на другое, если каждое поле задано двумя коор-динатами — целыми числами от 1 до 8.

47. Шахматный ферзь за один ход может переместиться с одногозаданного поля на другое, если каждое поле задано двумя ко-ординатами — целыми числами от 1 до 8.

48. Шахматный король за один ход может переместиться с одногозаданного поля на другое, если каждое поле задано двумякоординатами — целыми числами от 1 до 8.

49.Среди первых трех цифр дробной части положительного ве-щественного числа есть нуль.

50.Трехзначное число кратно второй цифре.51. Точка с координатами (х, у) принадлежит части плоскости,

лежащей между прямыми у = т и у = п (т<п).52. Только одно из чисел а, Ь, с кратно заданному к.53. Заданный символ является русской буквой.54.Заданный символ является цифрой.55. Заданный символ не является латинской буквой.56. Только один из двух введенных символов не является цифрой.57. Два введенных символа не являются последовательно рас-

положенными в кодовой таблице.58.Введенные число и символ обозначают одну и ту же цифру.

258

Page 260: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

59. Первые две цифры в дробной части заданного вещественногочисла совпадают с записью заданного целого числа.60. Заданы координаты трех точек плоскости. Эти точки не лежат наодной прямой.61. Заданное натуральное число обозначает код введенного символа.62. Целая и дробная части заданного вещественного числа оди-наковые.63. Объемы конуса и цилиндра с заданными измерениями со-впадают.64. В прямоугольном параллелепипеде с заданными измерениямиплощади каких-либо непротивоположных граней совпадают.65. В треугольной пирамиде с заданными ребрами площади каких-либо граней совпадают.66. Имеются две даты в формате число.месяц.год час:минута:се-кунда. Первая дата является более поздней.67. Имеется дата в формате число.месяц.год час:минута:секунда. Этоосенняя дата и время после полудня.68. Имеется дата в формате число.месяц.год час:минута:секунда. Этовесенняя дата високосного года двадцатого века.

5.1.19. Области, описываемые логическими выражениями

Составить программу, которая печатает True, если точка с ко-ординатами (х, у) принадлежит заданным закрашенным (заштри-хованным) областям, показанным на рисунках в табл. 5.1, и False — ипротивном случае.

Таблица 5.1

Page 261: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Продолжение табл. 5.1

Page 262: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

У

кV

\

\0 X

У

S

s

0 1 X

У*« ■

\

0 1 X

У1»

у

j \/ \

Jh К

0 .1 X

10

11 12

1 3 1 4

261

Page 263: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Продолжение табл. 5.1

Page 264: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

У

! r v - -

- 1 - - - .. I 1 г к

0 . 1

22

Т-

23

2 4

25

т2 6

1 3 5

263

Page 265: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

3 4

У

6

3

...- 5

i5T"" W9**'

-6

‘J38

>

-i

) ууз X

5.

2 7

2 9

3 1

-2-1

Щ

Продолжение табл. 5.1

A..............

-4 ; 2 4 *

2 8

3 0

3 2

3 3

3 5

3 7

't•kПродолжение табл. 5.1

............................................*

Page 266: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

.i' у

У

x

264265

Окончание табл. 5.

39

-3l 3

40

.....Ж

1 3

у У

1. Даны три действительных числа. Возвестив квадрат неотрицательные из этих чисел и вчетвертую степень — отрицательные.

2. Даны две точки А(хи у {) и В(х 2 , у2).Составить алгоритм, определяющий, какая изэтих точек находится ближе к началу координат.

3. Даны два угла треугольника (в градусах).Определить, возможен ли такой треугольник, иесли возможен, будет ли он прямоугольным.

4. Даны действительные числа х и у, неравные друг другу. Меньшее из этих двух чиселзаменить половиной их суммы, а большее — ихудвоенным произведением.5. На плоскости XOYзадана своимикоординатами точка А. Указать, где онарасположена: на какой оси или в какомкоординатном угле.6. Даны целые числа т, п. Если эти числа неравны, заменить меньшее из них большимисходных числом, а если равны, то заменить оба

7. Найти количество отрицательных чисел в заданных числах а, Ь, с.

8. Определить количество положительных чисел в заданных числах а, Ь, с.

9. Подсчитать количество целых чисел в заданных числах а, Ь, с.

10. Определить, делителем каких чисел а, Ь, с является число к.

266

Page 267: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

11. Услуги телефонной сети оплачиваются по следующему правилу:за разговоры до А минут в месяц платится В рублей, а разговоры сверхустановленной нормы оплачиваются из расчета С рублей за минуту.Вычислить плату за пользование телефоном для введенного времениразговоров за месяц.12. На экране появляется следующий вопрос: «Кто ты: мальчик илидевочка?» Соответственно ввести М или Д. В зависимости от ответа наэкране должен появиться текст «Мне нравятся девочки!» или «Мненравятся мальчики!».13. Грузовой автомобиль выехал из одного города в другой соскоростью Vi [км/ч]. Через время t [ч] в этом же направлении выехаллегковой автомобиль со скоростью v2 [км/ч]. Определить, догонит лилегковой автомобиль грузовой через время t x [ч] после своего выезда.14. Перераспределить значения переменных хну таким образом,чтобы в х оказалось большее из этих значений, а в у — меньшее.15. Определить правильность даты, введенной с клавиатуры (число— с 1 до 31, месяц — с 1 до 12). Если введены некорректные данные,сообщить об этом.16. Определить результат гадания на ромашке: любит — не любит,взяв за исходное заданное число лепестков п.17. Создать модель анализа пожарного датчика в помещении ивывода сообщения «Пожароопасная ситуация». Температура вводится склавиатуры и должна быть больше 60 °С.18. Рис расфасован в два пакета. Масса первого — т [кг], второго —п [кг]. Определить, какой пакет тяжелее и какова масса более тяжелогопакета.19. Проанализировать возраст человека, чтобы отнести к одной изчетырех групп: дошкольник, ученик, работник, пенсионер. Возраствводится с клавиатуры.20. Определить, пройдет ли график функции у = ах 2 + Ьх+ с череззаданную точку с координатами (т , п).21. К финалу конкурса «Лучший специалист электронного офиса»были допущены трое: Иванов, Петров, Сидоров. Соревнованияпроходили в три тура. Иванов набрал в первом туре т\ баллов, вовтором — П\, в третьем — ръ Петров — соответственно т2 , п 2 , р 2 , аСидоров — т г , я3, р 3 . Определить, сколько баллов набрал победитель.22. При нажатии любых клавиш на экран выводятся только буквы ицифры, и при этом указывается, что именно выводится: буква илицифра.23. Для вещественных чисел х, у, z вычислить шах(х + у + z ) и шах(хуг).24. Для вещественных чисел х, у, z вычислить mm2(x + y + z ) /2 +1 и шт2(луг)/2 + 1.

267

Page 268: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

25. Сравнить объемы двух прямоугольных параллелепипедов, заданных своими измерениями.26. Даны вещественные числа ри q. Вычислить:

a = pq 2; b = p 2 + pq\ с =

а(а-Ь), если а > Ь\

если a = b; d=c(p+ q).а\

P-Q,

27. Найти сумму большего и меньшего из трех заданных чисел.28. По длинам сторон имеющихся треугольников распознатьпрямоугольные. Если таковых нет, вычислить угол С.29. Найти max{min(a, b), min(c, d)}.30. Даны три числа а , Ь, с. Определить, какое из них равно d. Еслини одно из них не равно d, то найти таx(d - a, d - b, d - с).31. Даны четыре точки Л,(х,,у,), А 2(х 2 ,у 2), Л3(х3,л), А 4(х 4 ,у4).Определить, будут ли они вершинами параллелограмма.32. Даны три точки А(х х ,у х), В(х 2 ,у2) и С(х3, у3). Определить, будутли они расположены на одной прямой. Если нет, то вычислить уголABC.33. Даны действительные числа а, Ь, с. Удвоить эти числа, еслиа>Ь>с, и заменить их абсолютными значениями, если это не так.34. На оси ОХ расположены три точки а, Ь, с. Определить, какаяточка b или с расположена ближе к точке а.35. Даны три положительных числа а, Ь, с. Проверить, будут ли онисторонами треугольника. Если да, вычислить площадь этоготреугольника.36. Решить уравнение ах 3 + Ьх= 0 для произвольных чисел а и Ь.37. Дан круг с радиусом R. Определить, поместится ли правильныйтреугольник со стороной а в этом круге.38. Даны числа х, у, z■ Найти значение выражения

_ max 2 (х, у, z) - 2 х min(x, у, z)

sin 2х + max(x, у, z) / min(x, у, z)

39. Дано число х. Напечатать в порядке возрастания значения sin х,cos х, In х. Если при каком-либо х некоторые из этих выражений неимеют смысла, вывести сообщение об этом и сравнить значения,имеющие смысл.40. Даны размеры А, В прямоугольного отверстия и размеры х, у, zкирпича. Определить, пройдет ли кирпич через это отверстие.41. Перевести значения величин из радианной меры в градусы илинаоборот, выполнив запрос, какой перевод следует осуществить.42. Два прямоугольника, расположенные в первом квадранте, состоронами, параллельными осям координат, заданы координатами своихлевого верхнего и правого нижнего углов. Для первого прямоугольникаэто точки с координатами (х,, у,) и (х2, 0), для второго —

Page 269: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

(*3 , Уз)> (х4> 0)- Определить, пересекаются ли данные прямоугольники,

и вычислить площадь их общей части, если они пересекаются.43. В небоскребе N этажей и всего один подъезд. На каждом этажепо три квартиры. Лифт может останавливаться только на нечетныхэтажах. Человек входит в кабину лифта и набирает номер необходимойему квартиры М. Определить, на какой этаж лифт должен доставитьпассажира?44. По трем заданным числам определить, является ли сумма каких-либо двух из этих чисел положительной.45. Известно, что одно из четырех чисел аи а 2 , а 3 и а4 отлично оттрех других, равных между собой. Присвоить номер этого числапеременной п.46. Проверить, не приводит ли суммирование двух целых чисел А иВ к переполнению (т.е. к результату больше, чем 32 767). Еслипереполнение будет, сообщить об этом, в противном случае вывестисумму этих чисел.47. Определить по паролю степень доступности сотруднику сек-ретной информации, если доступ к базе данных имеют шесть человек,разбитых на три группы по степени доступа и имеющих следующиепароли: 9 583, 1 747, обеспечивающие доступ к модулям А, В, С базы; 3331, 7 922 — к модулям В, С базы; 9 455, 8 997 — к модулю С базы.48. Реализовать эпизод применения компьютера в книжноммагазине: компьютер запрашивает стоимость книг и сумму, внесеннуюпокупателем, если сдача не требуется, печатает на экране «спасибо»;если денег внесено больше, печатает «возьмите сдачу» и указывает еесумму; если денег недостаточно, печатает об этом сообщение иуказывает размер недостающей суммы.49. В ЭВМ поступают результаты соревнований по плаванию трехспортсменов. Выбрать лучший результат и вывести его на экран ссообщением, что это результат победителя заплыва.50. Определить взаимное расположение точки с координатами (ль,Уо) и окружности с радиусом R и центром в точке (дсь у,).51. По координатам вершин четырехугольника определить,выпуклый он или нет.52. По номеру дня вычислить число и месяц невисокосного года.53. Два круга заданы координатами своих центров и радиусами —соответственно х { , уи гх и х 2 , у 2 , г2 . Определить, пересекаются ли этикруги.54. Даны два целых числа: год и номер месяца. Определить: по-лугодие (первое или второе), квартал (первый, второй, третий иличетвертый), время года (зима, весна, лето или осень), столетие,тысячелетие, високосный ли это год.55. На плоскости заданы координаты вершин четырехугольника.Определить, является ли он ромбом, параллелограммом, пря-моугольником, квадратом.

269

Page 270: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

56. Определить, площадь полной поверхности какой из двухтреугольных пирамид, заданных ребрами, больше и на сколько.57. Даны действительные числа а, Ь, с (а > 0). Полностью иссле-довать биквадратное уравнение ах 4 + Ьх 2 + с = 0, т.е. если действи-тельных корней нет, должно быть выдано соответствующее сообщение,в противном случае следует найти действительные корни и сообщить,сколько из этих корней являются различными.58. Дана точка А(х, у). Определить, принадлежит ли она тре-угольнику с вершинами, имеющими координаты (jcl5 >>i), (х 2 , у 2), (*з,Уз)-59. Определить, будут ли прямые А,х+ В,у+ С, = 0 и А 2х + В 2у + +С2 = 0 перпендикулярны. Если нет, то найти угол между ними.60. Наименьшее из трех попарно различных действительных чиселX, Y, Z, если их сумма меньше единицы, заменить полусуммой двухдругих. В противном случае заменить меньшее из чисел X, Уполусуммой двух оставшихся чисел.61. Решить следующую систему линейных уравнений:

62. Даны три положительных числа. Определить, можно ли по-строить треугольник с длинами сторон, равными этим числам.Если можно, ответить на вопрос, является ли он остроугольным.

63. Дано действительное число h. Определить, имеет ли уравнениеах 2 + Ьх + с = 0 действительные корни, при

Найти действительные корни или сообщить об их отсутствии.64. Даны координаты вершин прямоугольника: (хь уО, (х2, у 2), (х3,уз), (х4, у4). Определить площадь части прямоугольника, расположеннойв 1-й координатной четверти.65. Найти координаты точек пересечения прямой у=кх+Ь иокружности с радиусом R и центром в начале координат. Определить, вкаких координатных четвертях находятся точки пересечения. Если точекпересечения нет или прямая касается окружности, должно быть выданосоответствующее сообщение.66. Дана точка А(х, у). Определить, принадлежит ли она прямо-угольнику с вершинами, имеющими координаты (*i,yi), (х 2 ,у2),(*3,Л), (*4,У4)-

a lx + b ly =

c i , a 2x + b 2y

= с 2 .

с = ah 2 sin bh + ЬИЪ cos ah.

270

Page 271: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 -iпри x > -3.

1 11 о

5.2.2. Значения функций

Вычислить значения следующих функций:

х 2 - Зх + 9 при х < 3;

при JC > 3.1. F(x) = 1

2. Fix) =

3. F(x) =

4. Fix) =

5. Fix) =

6. Fix) =

7. Fix) =

8. Fix) =

9. Fix) =

x 3 +6

-x 2 +3x + 9 при x > 3;x ,

при x < 3.

x3 -6

9 при x < -3;

.X2 + 1

О при х < 1;1 ,

при X > 1.х + 6

-Зх: + 9 при х <7;

при х > 7.

[х-7

Зх - 9 при х <7;1 ,

при х >7.

[х 2 -4

х 2 при О < х < 3;4 при х > 3 или х < О.

х 2 + 4х + 5 при х < 2;

при х > 2.

х 2 +4х + 5

х* -х при О < JC < 1;

х 2 - sin пх 2 при х > 1 или х: < 0.

-х 2 +х-9 при х > 8;10. Fix) = 1

jc4 -6при х < 8.

271

Page 272: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

3

х л

11- /х*)

12. F(x)

13.F(x)

14.F(x)

15. F(

x) =

16. F(

x) =

17. F(

x) =

4x2 + 2x - 19 при x > -3,5;

2x-4x +1

при x < 3,5.

-x2 + Зх + 9 при x < 3;

—, * . при х > 3.x l +1

-Зх + 9 при х > 3;

при х < 3.х3

.х2 +8

-х3 +9 при х < 13;

при х > 13.

X + 1

45х2 +5 при х > 3,6;

^Х при х< 3,6.10х2 +1

х4 + 9 при х < 3,2;

54х4 „ ,при х > 3,2.

1- 5х2 +7

1,2х2 - Зх - 9 при х > 3;

12,1 ,при х < 3.2х2+1

х2 + Зх + 9 при х < 3;

sin х _при х > 3

х2 -9

cos 2х + 9 при х > -4;COS X

-------- при х < -4.х-9

In х + 9 при х > 0;

при х < 0.х2 -7

Page 273: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2~x iпри x < 7.

21. F(x)

22. F(x)

23. F(x) =

24. F(x) =

25. F(x)

-a:2 — 1, Ijc + 9 при x < -3;

ln(x + 3) ~при > -3.x 2 +9

9-х при x > 1,1;sin 3x . ,

при x < -1,1.X + 1

-x2 при x > 7;

x2 -9

-x2 -9 при x > 13;1

x2 +9при х < 13.

О при х < О; х при О <

х < 1; х4 при х > О.

5.3. Тема «Оператор выбора»1. По заданному номеру дня недели (целому числу от 1 до 7)получить число уроков в классе в этот день.

2. По последней цифре заданного числа определить последнююцифру квадрата этого числа.3. По заданным году и номеру месяца т определить число дней вэтом месяце.4. Для каждой введенной цифры (0 — 9) вывести соответствующееей название на английском языке. Например: 0 — zero, 1 — one, 2 — twoи т.д.5. По заданному числу (1 — 12) вывести название соответствующегомесяца.6. Получить словесное описание школьных отметок: 1 — плохо,2— неудовлетворительно, 3 — удовлетворительно, 4 — хорошо, 5 —отлично.7. Пусть элементами круга являются: 1 — радиус, 2 — диаметр,3— длина окружности. По заданному номеру элемента выполнитьзапрос соответствующего значения и вычислить площадь круга.8. Пусть элементами прямоугольного равнобедренного треугольникаявляются: 1 — катет а\ 2 — гипотенуза Ь; 3 — высота, опу-

273

Page 274: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

щенная из вершины прямого угла на гипотенузу А; 4 — площадь S. Позаданным номеру и значению соответствующего элемента вычислитьзначения всех остальных элементов треугольника.9. По заданному номеру месяца получить название следующего заним месяца. Например: при т = 1 получим февраль.10. По введенному номеру времени года (1 — зима, 2 — весна,3— лето, 4 — осень) получить соответствующие этому времени годамесяцы и число дней в каждом месяце.11. В старояпонском календаре был принят двенадцатилетний цикл,годы внутри которого назывались соответственно: крыса, корова, тигр,заяц, дракон, змея, лошадь, овца, обезьяна, курица, собака и свинья. Повведенному номеру некоторого года получить его название постарояпонскому календарю. (Для справки: 1996 г. — год крысы и началоочередного цикла.)12. Для целого числа к от 1 до 99 напечатать фразу «Мне А: лет»,учитывая при этом, что при некоторых значениях к слово «лет» надозаменить на слово «год» или «года». Например: 11 лет, 22 года, 51 год.13. По введенному номеру единицы измерения (1 — дециметр,2 — километр, 3 — метр, 4 — миллиметр, 5 — сантиметр) и длинеотрезка L получить соответствующее значение длины отрезка в метрах.14. По введенному числу от 1 до 11 (номеру школьного класса)получить соответствующее сообщение: «Привет, £-классник». На-пример: если к= 1, получить сообщение «Привет, первоклассник»; еслик= 4 — «Привет, четвероклассник».15. По введенному числу от 1 до 12 (номеру месяца) получить всеприходящиеся на этот месяц праздничные дни. Например, если введемчисло 1, получим следующие праздничные дни: 1 января — Новый год,7 января — Рождество).16. Дано натуральное число N. Если оно делится на четыре, вывестина экран N=4k (где к — соответствующее частное); если остаток отделения на четыре равен единице — N=4k + 1; если остаток от деленияна четыре равен двум — N= 4к + 2\ если остаток от деления на четыреравен трем — N=4k + 3. Например: 12 = 4-3, 22 = 4-5 + 2.17. Имеется пронумерованный список деталей: 1 — шуруп, 2 —гайка, 3 — винт, 4 — гвоздь, 5 — болт. По номеру детали вывести наэкран ее название.18. По последней цифре заданного числа определить последнююцифру куба этого числа.19. Для любого натурального числа напечатать количество цифр взаписи этого числа.20. Даны два действительных положительных числа х и у. Ариф-метические действия над числами пронумерованы: 1 — сложение,2 — вычитание, 3 — умножение, 4 — деление. По введенному номерувыполнить соответствущее действие над этими числами.

274

Page 275: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

21. По введенному номеру единицы измерения (1 — килограмм,2 — миллиграмм, 3 — грамм, 4 — тонна, 5 — центнер) и заданноймассе М получить соответствующее значение массы в килограммах.22. Пусть элементами равностороннего треугольника являются:1 — сторона а\ 2 — площадь S\ 3 — высота Л; 4 — радиус вписаннойокружности г; 5 — радиус описанной окружности R. По заданнымномеру и значению соответствующего элемента вычислить значениявсех остальных элементов треугольника.23. Определить подходящий возраст кандидатуры для вступления вбрак, используя следующее соображение: возраст девушки должен бытьравен половине возраста мужчины плюс 7, а возраст мужчины долженопределяться соответственно как удвоенный возраст девушки минус 14.24. Определить произведение цифр заданного &-значного числа (1<к<4).25. Прочитать натуральное число в десятичном представлении, а навыходе получить это же число в десятичном представлении и егословесное описание. Например: 204 — двести четыре.26. Вычислить номер дня в невисокосном году по заданным числу имесяцу.27. Робот может перемещаться в четырех направлениях (С — север,3 — запад, Ю — юг, В — восток) и принимать три цифровые команды (0— продолжать движение, 1 — повернуть налево, -1 — повернутьнаправо). Заданы исходное направление перемещения робота — С икоманда — число N. Вывести направление перемещения робота послевыполнения полученной команды.28. Локатор ориентирован на одну из сторон света (С — север,3 — запад, Ю — юг, В — восток), может принимать три цифровыекоманды (1 — поворот налево, -1 — поворот направо, 2 — поворот на180°). Заданы исходная ориентация локатора — С и две команды —числа N t и N 2 . Вывести ориентацию локатора после выполненияполученных команд.

5.4. Тема «Циклы»

5.4.1. Циклы с заданным числом повторений

1. Имеется серия измерений элементов треугольника. В серии впроизвольном порядке могут встречаться следующие группы элементовтреугольника: 1 — основание и высота, 2 — две стороны и угол [рад]между ними, 3 — три стороны.

Запросить номер группы элементов, ввести соответствующиеэлементы и вычислить площадь треугольника. Вычисления прекратить,когда в качестве номера группы будет введен нуль.

275

Page 276: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2. Начав тренировки, спортсмен в первый день пробежал 10 км.Каждый день он увеличивал дневную норму на 10 % от нормыпредыдущего дня. Определить, какой суммарный путь пробежитспортсмен за S дней.3. Одноклеточная амеба каждые три часа делится на две клетки.Определить, сколько амеб будет через 3, 6, 9, 12, ..., 3п часов.4. Около стены наклонно стоит палка длиной х [м]. Один ее конецнаходится на расстоянии у [м] от стены. Определить угол а междупалкой и полом для значений х= к [м] и у, изменяющегося от 2 до 3 м сшагом А [м].5. У гусей и кроликов вместе 64 лапы. Сколько может быть кроликови сколько гусей (указать все возможные сочетания)?6. Составить алгоритм решения следующей задачи: сколько можнокупить быков, коров и телят, платя за быка 10 р., за корову — 5 р., а зателенка — 0,5 р., если на 100 р. надо купить 100 голов скота?7. Доказать или опровергнуть гипотезу (перебором всех возможныхсочетаний значений), что для любых величин А, В, С типа Booleanследующие пары логических выражений имеют одинаковыеэквивалентные значения:

а) A OR В и В OR А;б) A AND В и BAND А;в) (A OR В) OR С и A OR С;г) (A AND В) AND С и A AND (В AND С);д) A AND (A OR В) и А;е) A OR (A AND В) и А;ж) A AND (В OR С) и (A AND В) OR (A AND С);з) A OR (В AND С) и (A OR В) AND (A OR С).

8. Проверить утверждение о том, что результатами вычислений поформуле х* + х + 17 при 0<х< 15 являются простые числа. Всерезультаты вывести на экран.9. Проверить утверждение о том, что результатами вычислений поформуле х2 + х + 41 при 0<х<40 являются простые числа. Всерезультаты вывести на экран.10. Создать простые числа на основе формулы 2х2+29 при0 <х< 28. 2 2*+'+\11. Создать простые числа на основе формулы --------------------- при1 <х< 36. 3

12. Создать числа Пифагора а, Ь, с (с2 = а 2 + Ь 2) на основе формула = т 2 - п 2 , Ь= 2тп, с = т 2 + п 2 (где т,п— натуральные числа;1 <т<к\ 1 <п<к\ к — заданное число). Результат вывести на экран ввиде таблицы из пяти столбцов: т, п, а, Ь, с.13. Покупатель должен заплатить в кассу сумму Sрублей. У негоимеются купюры достоинством 10, 50, 100, 500, 1000 и 5 000 р.Определить, сколько купюр разного достоинства отдаст покупатель,если начнет платить с самых крупных.

276

Page 277: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

т

14. Ежемесячная стипендия студента составляет сумму А рублей, арасходы на проживание превышают стипендию и составляют сумму Врублей в месяц. Рост цен ежемесячно увеличивает расходы на 3 %.Рассчитать сумму, которую следует единовременно попросить уродителей, чтобы прожить учебный год (10 месяцев), используя толькоэти деньги и стипендию.15. Напечатать таблицу умножения и сложения натуральных чисел вдесятичной системе счисления.16. Напечатать таблицу умножения и сложения натуральных чисел вшестнадцатеричной системе счисления.17. Найти сумму всех л-значных чисел (1 < п < 4).18. Найти сумму всех «-значных чисел, кратных к (1 < п < 4).19. Показать, что для всех п= 1, 2, 3,..., N

(15 + 25+ ... + п5) + (17 + 27+ ... +я7) = 2(1 + 2+ . . . +п) 4 .

20. В следующем выражении заменить буквы цифрами такимобразом, чтобы соотношение цифр оказалось верным (одинаковымбуквам должны соответствовать одинаковые цифры, разным буквам —разные цифры):

ХРУСТ ГРОХОТ = РРРРРРРРРРР.

21. Запрашивать пароль (например, четырехзначное число) до rexпор, пока он не будет правильно введен.22. Найти наибольшее значение отношения трехзначного числа ксумме его цифр.23. Вычислить сумму кодов всех символов, которые в циклевводятся с клавиатуры до нажатия клавиши ESC.24. Вычислить количество точек с целочисленными координатами,находящихся в круге с радиусом R > 0.25. Напечатать в возрастающем порядке все трехзначные числа, ндесятичной записи которых нет одинаковых цифр, не используяоперации деления и нахождения остатка от деления.26. Вывести на дисплей календарь на 2000 год.27. Составить алгоритм решения ребуса РАДАР = (Р+ А + Д)4 (здесьразличные буквы означают различные цифры, а первая буква — не 0).28. Составить алгоритм решения ребуса МУХА + МУХА + МУХА =СЛОН (здесь различные буквы означают различные цифры, ;i перваябуква — не 0).29. Составить алгоритм решения ребуса ДРУГ - ГУРД = 2727 (здесьразличные буквы означают различные цифры, а первая буква — не 0).30. Составить алгоритм решения ребуса КОТ + КОТ = ТОК (здесьразличные буквы означают различные цифры, а первая буква — не 0).

277

Page 278: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Х-У[ + У_7У+9!’_П! + ТЗ!'

31. Имеется некоторое значение функции косинус. Указать со-ответствующие этому значению аргументы, принадлежащие от-резку [а; Ь\.

5.4.2. Суммы и произведения числовыхпоследовательностей

1. Дано натуральное число N. Вычислить

5 = 1-- + --- + ... + (-1)" ■ —.2 4 8 v ' 2я

2. Дано натуральное число N. Вычислить

о 1 1 1sin 1 sin 1 +sin 2 sinl + sin2 + --- + sinA^

3. Дано натуральное число N. Вычислить произведение первых Nсомножителей выражения

„ 2 4 6 2NР = —— Х...Х-

3 5 7 2W + 1

4. Дано натуральное число N. Вычислить выражение

cos 1 cos 1 + cos 2 cos 1 + cos 2 + . . . + cos N_____________X X____________________sin 1 sin 1 + sin2 " sinl + sin2 + ... + sin7V ’

5. Дано действительное число x. Вычислить выражение

х3 х5 х7 х9 х11 х13

6. Даны натуральное число п и действительное число х. Вычислить

S = sin х + sin sin х + • • • + sin sin .. . sin x .п раз

7. Даны действительное число а и натуральное число п. Вычислить

Р = а(а + 1)х...х(я + п -1).

8. Даны действительное число а и натуральное число п. Вычислить

Р = а(а-п)(а - 2я)х...х (а - и2).

278

Page 279: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Ml Ml /1

г У.. .X f l - — 1

\ 6 , 2» .

Page 280: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

б) а п = ¥ + ¥ ;

г) = е) а„ =

16. Дано натуральное число п > 1. Вычислить

5 = 1! + 2! + 3! + ... + я! .

17. Дано натуральное число п. Вычислить

о 1 1 1 1З2 + 52 + 72 + " ’+ (2/i +1)2 ’

18. Вычислить по схеме Горнера

у = х { 0 + 2х9 +3х8 + ... +1 Ох + 11.

19. Числа Фибоначчи (fn) определяются формулами Уо =/, = 1 и fn =fn -

1 +fn - 2 при п = 2, 3, ... Найти/;.

20. Дано натуральное число п. Вычислить у = 1 • 3 - 5 х... х (2п - 1).

279

21. Дано натуральное число п. Вычислить у = 2 • 4 ■ 6 х... х(2я).22. Вычислить у = cosx + cosx2 + cosx3 + ... + cosx".23. Вычислить у = sin 1 + sin 1,1 + sin 1,2 + ... + sin 2.

24. Даны натуральные числа п и к . Вычислить выражение

\jk + )j2Jc + --- + yJk(n-l) + yfkn .

25. Дано натуральное число п. Вычислить выражение

2 3 4 п+1- + - + - + •■• +--------.

12 3 п

26. Среди первых к членов последовательности хп = sin п + 3 cos 2п найти минимальный.

5.4.3. Итерационные циклы

1. Дан числовой ряд и некоторое число е. Найти сумму тех членовряда, модуль которых больше или равен заданному числу в, еслиобщий член этого ряда имеет следующий вид:

а)

а„ =

в) а„ =

(-D и-i

2 п

V п\Ж) а„ =—;

п"

3 Пп \.(2л)!’

п\ .

(2»)

!’

и) а„ =

л) а„ =

н) а„ =

«ч 1 1

з) ап =1

(Зл - 2)(3/i

+1) ’ п\

(2

«)!’

2"

, «! к>

м) ая =2й

(2и + 1)!2. Найти для указанных последовательностей наименьший номер,

для которого выполняется условие \а„- а„_ ,|<е, и вывести на экранэтот номер и все элементы о, (где /= 1, 2, ..., п):

280

Page 281: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ап-\

f 2 4

an-l +--------а) а„ -

б) а„ =П

в) ап =

г)

а) а„ = arctga„_ ь а, = 0;

б) ап = 2 + -^—, ai = 2;

в) o«=^tgfln_„ о, =0,5;

г) ап =

(2я)

1д) o„=-cosfln_,, о, =0,5;

J- /72е) а„ =

2 + Й2_[

2а„_1

ж) а„ = 0п -' а, =1,02 = 2;з) ап~ „1п л

(In ri) n ’

и) a„=e-fl»-', fl, =0;

хк) ая = а = х.

Page 282: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

-<л-1

, а, =1, Л/:|а2 — 2 |< е;

(-1) л я2" ’

(-1)”

2" я!

1

, Л/: |о„| < е;

, М : к|<е.(и + 1)2

5.4.4. Табулирование функций

Вычислить значения следующих функций F(x) на отрезке | а, Ь] сшагом А, представив результат в виде таблицы, первый столбец которой— значения аргумента, второй — соответствующие значения функции:

281

1. F(x) = x - sin x.3. F(x) = 2 cosx- 1.5. F(x) = ctgx+ 1.

6.

'1'

vxy

+ 2.9. F(x) = x cos

11- F(x) = л/х cos2 x.13. F(x) = cosx + ctgx.

14.F(x) = tg — + 2 cos x.

15. X

16.F(x) = —sin —+ 1.17.4

19.1. F(x) = sin2x -

cos 2x.

20.F(x) = -cos 2x.21.F(x) = sinx +

2. F(x) = sin2x.4. F(x) = tg x.7. F(x) = sinx- cosx.

7. F(x) = sinfi+2.V х J10.2 sin2x+ 1.

22. F(x) = 2tgi + l.

15. JF(X)

= ctg — + - sin x.2 2

17. F(x

) = 2 cos л/х +

0,5.

19. F(x) = -^ 25. F(x)cosx

5.4.5. Ввод и обработка последовательностей

1. Найти сумму элементов последовательности.2. Найти минимальный элемент в последовательности.3. Найти второй по значению элемент в последовательности.4. Определить, сколько раз в последовательности встречаетсязаданное число.5. Известно сопротивление каждого из элементов электрическойцепи, все элементы которой соединены параллельно. Определить общеесопротивление этой цепи.6. Найти произведение элементов последовательности.7. Найти сумму модулей элементов последовательности.8. Определить, сколько соответствующих элементов двух по-следовательностей с одинаковым числом элементов совпадают.9. Вычислить сумму квадратов элементов последовательности.10. Определить среднее арифметическое элементов последова-тельности.11. Определить среднее геометрическое элементов последова-

282

Page 283: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

12. Найти произведение модулей элементов последовательности.13. Даны натуральное число п и вещественные числа аи а2,..., ап . Определить

а) й\ + а 2 , а 2 + йз, fl„_i + ап \б) а, - а 2 + я3 - ... + (-1 )п + 1а„-

в) а > ° 3 Х '' ' Х а ”~ 1 (где п — четное число); а 2 ■ д4 х.. . х ап

-й\ - а3 -... - 1г) ------------------------ (где п — четное число).

2 4 + • • • "Ь

14. Определить, сколько раз встречается минимальный элемент it последовательности.15. Определить, сколько раз встречается максимальный элемент в последовательности.16. Выбрать максимальный из модулей элементов последова-тельности.17. Определить, сколько нулей в последовательности.18. Осуществляя ввод элементов последовательности до тех пор, покане будет введено заданное число, подсчитать их количество.19. Напечатать True, если элементы последовательности упоря-дочены по возрастанию, и False — в противном случае.20. В последовательности натуральных чисел подсчитать количество чисел, оканчивающихся заданной цифрой.21. В заданной последовательности определить максимальное количество подряд идущих положительных чисел.22. Найти сумму тех членов последовательности, которые окан-чиваются на заданную цифру.

23. Найти сумму четных элементов последовательности целыхчисел.

24. Определить количество нечетных отрицательных элементов и последовательности целых чисел.25. Указать минимальный нечетный элемент в последовательности, содержащей целые числа.26. Найти сумму номеров отрицательных элементов последова-тельности, в которой нумерация элементов начинается с единицы.27. Определить количество ненулевых элементов последователь-ности.28. Найти разность максимального и минимального элементов последовательности.29. Определить, между какими степенями двойки расположены все положительные элементы последовательности.30. Вывести на экран -1, если сумма элементов последовательно-11 и отрицательная, 1 — если положительная и 0 — если равна нулю.31. Вводятся произвольные целые числа. Определить:

а) количество четных чисел, введенных до ввода числа, кратного к ;б) сумму первых к положительных чисел;

283

Page 284: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

в) среднее геометрическое первых к положительных нечетных чисел.32. Вводятся произвольные символы. Определить:

а) количество русских букв до появления первой латинской;б) есть ли среди первых к введенных символов хотя бы одна цифра.

33. Найти наибольший общий делитель последовательностинатуральных чисел.34. Определить, сколько раз меняется знак в последовательностичисел, отличных от нуля.35. Определить, сколько пробелов в заданной последовательностисимволов.

5.5. Тема «Целочисленная арифметика»

Уровень сложности А

1. Дано натуральное число л. Найти сумму первой и последней цифрэтого числа.2. Дано натуральное число л. Переставить местами первую ипоследнюю цифры этого числа.3. Даны два натуральных числа m и п (т < 9 999, п < 9 999). Про-верить, есть ли в записи числа т цифры, одинаковые с цифрами в записичисла п.4. Дано натуральное число п (п <9 999). Проверить, есть ли в записиэтого числа три одинаковые цифры.5. Дано натуральное число п < 99. Дописать в конце и в начале этогочисла цифру к.6. Даны натуральные числа пик. Проверить, есть ли в записи числапк цифра т.7. Среди всех л-значных чисел указать те из них, сумма цифркоторых равна заданному числу к.8. Даны три натуральных числа А, В, С, обозначающие число, месяци год. Найти порядковый номер даты, начав отсчет с начала года.9. Найти наибольшую и наименьшую цифры в записи заданногонатурального числа.10. Произведение л первых нечетных чисел равно р. Определить,сколько сомножителей взято для его получения и если введенное число лне является указанным произведением, сообщить об этом.11. Найти в интервале [л; т] натуральное число, имеющее наи-большее количество делителей.12. Задумано некоторое число jc< 100. Известны числа к, т, л —остатки от деления этого числа соответственно на 3, 5, 7. Найти х.13. Игрок А объявляет двухзначное число от 01 до 99. Игрок Вменяет местами цифры, объявленные игроком А, и прибавляет

284

Page 285: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

полученное число к сумме цифр его числа. Полученный результат онобъявляет игроку А, который проделывает с этим числом ту жепроцедуру. Игроки продолжают поочередно объявлять двух- значеныечисла, беря для этого остаток от деления каждого полученногорезультата на 100. Определить, какие числа может объявить игрок А наначальном шаге, чтобы игрок В в некоторый момент объявил число 00.14. Дано натуральное число N. Найти и вывести все числа винтервале от 1 до N- 1, у которых сумма цифр совпадает с суммой цифрзаданного числа. Если таких чисел нет, вывести слово «нет». Например:при N= 44 выводятся числа 17, 26 и 35.15. Дано натуральное число N. Найти и вывести все числа винтервале от 1 до N- 1, у которых произведение цифр совпадает ссуммой цифр заданного числа. Если таких чисел нет, вывести на экранслово «нет». Например: при N= 44 выводятся числа 18 и 24.16. Дано натуральное число N. Определить количество восьми-значных чисел, сумма цифр в записи которых меньше, чем N. Если такихчисел нет, вывести на экран слово «нет».17. Дано натуральное число N. Определить количество восьми-значных чисел, сумма цифр в записи которых больше, чем N. Если такихчисел нет, вывести на экран слово «нет».18. Дано натуральное число N. Найти наибольшее число М> 1, пакоторое сумма цифр в записи числа N делится без остатка. Если такогочисла нет, вывести слово «нет». Например: N= 12 345, Л/= 5. Здесьсумма цифр числа N, равная 15, делится без остатка на 5.19. Дано натуральное число N. Найти наименьшее число N< М < 2N, которое делится на сумму цифр числа N без остатка. Исли такогочисла нет, вывести слово «нет». Например: N= 12 345, М = 12 360. Здесьчисло 12 360 делится без остатка на число 15.20. Дано натуральное число N> 9. Определить количество нулей,идущих подряд в младших разрядах этого числа. Например: н числе N=1 020 000 количество таких нулей — четыре.21. Дано натуральное число N> 9. Определить количество нулей кстарших разрядах этого числа. Например: в числе N - 10 025 000, двануля в старших разрядах.22. Дано натуральное число N> 9. Определить сумму цифр первойполовины этого числа (старших разрядов). Например: в числе N= 12 345678 эта сумма 1 + 2 + 3 + 4=10.23. Дано натуральное число N> 9. Определить сумму цифр во игоройполовины этого числа (младших разрядов). Например: в числе N= 12 345678 эта сумма 5 + 6 + 7 + 8 = 26.24. Дано натуральное число N. Если это число содержит три цифры,получить новое число М посредством перестановки его первой ипоследней цифр. Например: если N= 123, то М=321. ()пределить, прикаком количестве цифр в числе М= N.

Page 286: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

25. Дано натуральное число N. Если это число содержит пять цифр,получить новое число М посредством исключения его средней цифры.Например: если N= 12 345, то М= 1 245. Определить, при какомколичестве цифр в числе М= N.26. Женщина шла на базар продавать яйца. Ее случайно сбил с ногмужчина, в результате чего все яйца разбились. Мужчина предложилоплатить убытки и спросил: сколько у нее было яиц? Женщина сказала,что точного числа не знает, но когда она брала яйца парами, то осталосьодно яйцо. Одно яйцо останется также, если она будет брать по 3, 4, 5 и 6яиц, но если брать по 7 штук, то в остатке ничего не останется.

Определить, какое минимальное число яиц могло быть в корзине.

Уровень сложности В

1. Дано натуральное число п. Проверить, все ли цифры в этом числеразличные.2. Найти целые корни уравнения ax i + bx 2 + cx + d = 0, где а, Ь, с,d— заданные целые числа, причем аФ 0 и ^*0. (Целыми корнями могутбыть только положительные и отрицательные делители коэффициента d.)3. Дано натуральное число п. Поменять порядок следования цифр вэтом числе на обратный или сообщить, что это невозможно в силупереполнения.4. Найти все делители натурального числа п.5. Натуральное число М называется совершенным, если оно равносумме всех своих делителей, включая единицу, но исключая само эточисло. Напечатать все совершенные числа, которые меньше заданногочисла N.6. Натуральные числа а, Ь, с называются числами Пифагора, есливыполняется условие а 2 + Ь 2 = с 2 . Напечатать все числа Пифагора,которые меньше N.7. Дано натуральное число п. В ряду 1, ..., п найти числа, совпа-дающие с последними цифрами в записи их квадратов. Например: 62 =36, 252 = 625.8. По номеру дня в году вывести число и месяц в общепринятойформе. Например: 33-й день года — это 2 февраля.9. Долгожитель в возрасте не менее 100 лет обнаружил однажды, чтоесли к сумме квадратов цифр его возраста прибавить число дня егорождения, то как раз получится его возраст. Определить, сколько летдолгожителю.10. Дано целое число п>2. Напечатать все простые числа изинтервала [2; п).11. Найти наименьшее натуральное число п, которое можнопредставить в виде суммы кубов двух натуральных чисел.

286

Page 287: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

12. Даны натуральные числа пит. Найти натуральные числа,меньше п, квадрат суммы цифр которых равен т.13. В интервале [2; п] определить число с максимальной суммойделителей.14. Даны натуральные числа р и q. Получить делители числа qвзаимно простые с числом р.15. Для заданных натуральных чисел пик определить, равно личисло п сумме к-х степеней своих цифр.16. Найти все и-значные числа, сумма квадратов цифр которыхкратна М.17. Найти все натуральные числа, не превосходящие заданногочисла п, которые делятся на каждую из своих цифр.18. Дано натуральное число п. Найти количество натуральныхчисел, не превышающих л и не делящихся на числа 2, 3 и 5.19. Пусть fn — это п-й член последовательности, определяемойследующим образом:

fn - ~fn-1 _ 2f„-2, f\ = 1; f i - ~ 1-

Показать, что 2"+1 - 7/п2_, есть полный квадрат.

20. Последовательность Хэмминга образуют натуральные числа,не имеющие других простых делителей кроме 2, 3 и 5. Найти:а) первые N членов этой последовательности;б) сумму первых N членов последовательности;в) N-й член последовательности по заданному номеру N;г) первый член, больший заданного числа М, а также номер •тогочлена в последовательности;д) сумму всех членов последовательности от номера N до номераМ.21. В интервале [2, п\ найти все натуральные числа, сумма цифркоторых при умножении на число а не изменится.22. Удалить из десятичной записи числа N единиц, сохранивпорядок следования оставшихся цифр. Сформировать и напеча-I ать полученное число.23. Школа находится на одной стороне улицы с домом Петра.Однажды по дороге в школу он стал складывать номера домов, мимокоторых проходил по своей стороне улицы, начиная с номера своегодома. При сумме номеров домов, равной 99, Петр перешел черезпоперечную улицу и начал складывать номера домов иторогоквартала. При сумме номеров домов, равной 117, он перешел еще однупоперечную улицу и стал складывать номера домов фегьего квартала.Эта сумма оказалась равной 235, включая номер дома школы.Определить номер дома Петра и номер дома школы.24. Дано натуральное число N. Определить количество цифр в miшеи заданного числа, имеющих наименьшее значение. Например: вчисле N=4 548 две цифры с наименьшим значением, т.е. дне цифры 4.

287

Page 288: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

25. Дано натуральное число N. Определить количество цифр в записизаданного числа, имеющих наибольшее значение. Например: в числе N=1 808 две цифры с наибольшим значением, т.е. две цифры 8.26. Дано натуральное число N. Получить новое число М посредствомзамены последней цифры числа N наименьшей цифрой в его записи.Например: если N= 128 452, то М= 128 451.27. Дано натуральное число N. Получить новое число М посредствомзамены последней цифры числа N наибольшей цифрой в его записи.Например: если N= 128 452, то М= 128 458.28. Определить количество А/-значных натуральных чисел, укоторых сумма цифр, стоящих в нечетных разрядах, равна N. Например:если 1 < N< 30, то 0 < М< 5.29. Вычислить сумму натуральных чисел в интервале [а; Ь], в записькоторых входит цифра к.30. Построить для заданного числа п > 1 последовательность Хейсаследующим образом. Если число п четное, разделить его на 2, впротивном случае умножить на 3 и прибавить 1. Если полученное приэтом число не равно 1, то эти действия повторять до тех пор, пока неполучится 1. Указать наибольшее число в полученнойпоследовательности (вершину) и количество шагов.31. Определить, входит ли заданная цифра р в десятичную записьчисла, заданного в системе с основанием q (2 < q < 9).

Уровень сложности С

1. Дано натуральное число к. Напечатать к-ю цифру последова-тельности 12345678910111213..., содержащую подряд все натуральныечисла.2. Дано натуральное число к. Напечатать к-ю цифру последова-тельности 149162536..., содержащую подряд квадраты всех натуральныхчисел.3. Перевести заданное натуральное число из десятичной системысчисления в двоичную.4. Перевести заданное натуральное число п в шестнадцатеричнуюсистему счисления.5. Дано натуральное число п. Переставить его цифры таким образом,чтобы из них образовалось максимальное число.6. Дано натуральное число п. Переставить его цифры таким образом,чтобы из них образовалось наименьшее число.7. Для записи римских цифр используют символы I, V, X, L, С, D, М,обозначающие соответственно числа 1, 5, 10, 50, 100, 500, 1 000.Перевести запись любого заданного арабскими цифрами числа п < 3 999в запись римскими цифрами.8. Используя все цифры от 1 до 9 по одному разу в различныхкомбинациях и операции сложения и вычитания, получить в результатечисло 100.

288

Page 289: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

9. Используя все цифры от 1 до 9 по одному разу и операциисложения и вычитания, получить в результате число 100 при условии,что цифры появляются в возрастающем или убывающем порядке.Например: 123 + 4 - 5 + 67 - 89 = 100; 9-8 + 76-5 + 4 + + 3 + 21 = 100.10. Определить, является ли заданное натуральное число па-линдромом.11. Найти целые числа, при возведении в квадрат которых получаютпалиндромы. Например, 262 = 676.12. Найти целые числа палиндромы, при возведении в квадраткоторых также получают палиндромы. Например: 222 = 484.13. Найти целые числа, при возведении в третью, четвертую илипятую степень которых получают палиндромы. Например: 113 = = 1331.14. Дано натуральное число п. Если это не палиндром, реверсироватьего цифры и сложить исходное число с числом, полученным в результатереверсирования. Если полученная при этом сумма не палиндром,повторять указанные действия до тех пор, пока не получится палиндром.Например, для исходного числа 78 запишем: 78 + 87 = 165; 165 + 561 =726; 726 + 627 = 1 353; 1 353 + 3 531 =4 884.15. Целое число можно представить как сумму его частей, на-зываемых разбиениями. Например, число 4 можно представитьследующим образом: 4; 3 + 1; 2+1 + 1; 2 + 2; 1 + 1 + 1 +1. Тогда,обозначив через Р(п) количество разбиений числа п, можно записатьР(4) - 5. Для заданного числа п выполнить его разбиения и определитьР(п).16. Дано натуральное число к. Напечатать к-ю цифру последова-тельности 24681012141618202224262830..., содержащую подряд всенатуральные четные числа.17. Дано натуральное число к. Напечатать к-ю цифру последова-тельности 1123581321..., содержащую подряд все числа Фибоначчи.

5.6. Тема «Подпрограммы»

5.6.1. Нерекурсивные процедуры и функции

Уровень сложности А

1. Треугольник задан координатами своих вершин. Вычислить егоплощадь.2. Найти наибольший общий делитель и наименьшее общее кратное

289

Page 290: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

3. Найти наибольший общий делитель четырех натуральных чисел.4. Найти наименьшее общее кратное трех натуральных чисел.5. Найти сумму большего и меньшего из трех чисел.6. Вычислить площадь правильного шестиугольника со стороной а,используя подпрограмму вычисления площади треугольника.7. На плоскости заданы координатами п точек. Определить междукакими из пар заданных точек самое большое расстояние. (Координатыточек занести в массив.)8. В массиве Л[Ж| найти второе по значению число (т.е. вывести напечать число, которое меньше максимального элемента массива, нобольше всех других его элементов).9. Проверить, являются ли заданные три числа взаимно простыми.10. Вычислить сумму факториалов всех нечетных чисел от 1 до 9.

А С11. Даны две дроби — и — (где А, В, С, D — натуральные

В Dчисла). Разделить дробь на дробь и получить ответ в виде несократимойдроби.12. Дан массив D. Определить следующие суммы: Z)[l] + D[ 2] + + Z)[3]; D[3] + D[4] + Z)[5]; D[4] + Z)[5] + D[6]. (Составить подпрограммувычисления суммы трех последовательно расположенных элементовмассива с номерами от к до т.)

А С13. Даны две дроби — и — (где А, В, С, D — натуральные

В Dчисла). Умножить дробь на дробь и получить ответ в виде несократимойдроби.

А С14. Даны две дроби — и — (где А, В, С, D — натуральные

В Dчисла). Вычесть из первой дроби вторую и получить ответ в виденесократимой дроби.

А С15. Даны две дроби — и — (где А, В, С, D — натуральные

В Dчисла). Сложить эти дроби и получить ответ в виде несократимой дроби.16. На плоскости заданы координатами п точек. Создать массивразмером п(п - 1), элементами которого являются расстояния от каждойиз точек до п - 1 других точек.17. Длины сторон четырехугольника заданы числами X, Y, Z, Т.Вычислить его площадь, если угол между сторонами длиной Хи Yпрямой.

18. Сформировать массив X(N), N-й член которого определяется

формулой X(N) =

290

Page 291: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

19. Вычислить сумму факториалов всех четных чисел в интервале отт до п.20. Заменить отрицательные элементы линейного массива ихмодулями, не используя стандартную функцию вычисления модуля.Определить число произведенных замен.21. Дан массив A(N). Сформировать массив В(М), элементамикоторого являются большие из двух рядом стоящих в массиве А чисел.Например, если массив А состоит из элементов 1, 3, 5, -2,0,4, 0, элементами массива В будут 3, 5, 4.22. Дан массив A(N), где N— четное число. Сформировать массивВ(М), элементами которого являются средние арифметические соседнихпар рядом стоящих в массиве А чисел. Например, если массив А состоитиз элементов 1, 3, 5, -2, 0, 4, 0, 3, элементами массива В будут числа 2;1,5; 2; 1,5.23. Дано простое число. Составить функцию, которая будет находитьследующее за ним простое число.24. Составить функцию для нахождения наименьшего нечетногонатурального делителя к * 1 любого заданного натурального числа п.25. Написать процедуру перемножения двух многочленов, заданныхмассивами коэффициентов, результатом которой является многочлен,заданный массивом коэффициентов.

Уровень сложности В

1. Дано натуральное число N. Сформировать массив, элементамикоторого являются цифры числа N.2. Определить, в каком из двух заданных чисел больше цифр.3. Заменить заданное натуральное число числом, получаемым изисходного записью его цифр в обратном порядке. Например: заданочисло 156, требуется получить 651.4. Даны натуральные числа К и N. Сформировать массив А, эле-ментами которого являются числа, сумма цифр которых равна К икоторые не больше N.5. Даны три квадратных матрицы А, В, С п-го порядка. Вывести напечать матрицу, имеющую наименьшую норму. (Нормой матрицыназывается максимальное из абсолютных значений ее элементов.)6. Два натуральных числа называются дружественными, если каждоеиз них равно сумме всех делителей другого, кроме самого этого числа.Например, числа 220 и 284. Найти все пары дружественных чисел,которые не больше заданного числа N.7. Два простых числа называются близнецами, если они отличаютсядруг от друга на два. Например, 41 и 43. Напечатать все нары близнецовиз интервала [п; 2и], где п— заданное натуральное число больше двух.

291

Page 292: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 + т + х + ...+ -.

а г~г “3~1о-

8. Для заданного числа п вычислить сумму

Z = i-I + I_...+ (zir,q 2 3 п

р

причем дробь — должна быть несократимой (где р, q— натуральные

числа).9. Для заданного числа п вычислить сумму

• 1 1 1

2 3 пРезультат представить в виде несократимой дроби — (где р,

q— натуральные числа).10. Натуральное число, в записи которого п цифр, называется числомАмстронга, если сумма его цифр, возведенная в степень п, равна самомучислу. Найти все числа Амстронга от 1 до к.11. Найти и вывести на печать все четырехзначные числа вида abed,

для которых выполняется следующее условие:а) а, Ь, с, d — разные цифры;б) ab-cd = a + b + c + d.

12. Найти все простые натуральные числа, не превосходящиезаданного числа п, двоичная запись которых представляет собойпалиндром, т.е. читается одинаково слева направо и справа налево.13. Найти все натуральные и-значные числа, цифры в которыхобразуют строго возрастающую последовательность. Например: 1,2, 3, 4, 5, 6, 7, 8, 9.14. Найти все натуральные числа, не превосходящие заданного числап, которые делятся на каждую из своих цифр.15. Найти числа из интервала [М; 7V], имеющие наибольшееколичество делителей. ^16. Для последовательности a t= 1, ап + { = ап +------------- напечатать

1 + ап

к-й член в виде обыкновенной несократимой дроби. Например:3 19

4 Дано натуральное число п. Определить, можно ли представитьэто число в виде произведения трех последовательных нату-ральных чисел.

5 Имеется часть катушки с автобусными билетами. Номер билеташестизначный. Определить количество счастливых билетов накатушке, если меньший номер билета — N, а больший — М.(Билет является счастливым, если сумма трех первых его цифрравна сумме трех последних цифр.)

292

Page 293: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

17. Определить сумму л-значных чисел, содержащих только нечетныецифры. Найти, сколько четных цифр в этой сумме.18. Из заданного числа вычесть сумму его цифр. Из полученногорезультата также вычесть сумму его цифр и т.д. Определить, сколькотребуется выполнить таких действий, чтобы получить нуль.19. Разложить заданное натуральное число на простые множители.Например: 200 = 23- 52.20. Дано натуральное число л. Найти все числа Мерсена меньшечисла п. (Простое число называется числом Мерсена, если оно можетбыть представлено в виде 2Р - 1, где р— тоже простое число. Например:31 = 25- 1.)21. Дано четное число п > 2. Проверить для этого числа гипотезуГольдбаха, т.е. предположение, что каждое четное число я пред-ставляется в виде суммы двух простых чисел.22. Даны натуральные числа пик, причем л> 1. Напечатать кдесятичных знаков числа 1/л, используя только целые переменные.23. Дано натуральное число я > 1. Определить длину периода де-сятичной записи дроби 1/я.24. Функция /с натуральными аргументами и значениями определенав следующем виде: /(0) = 0, /(1) = 1, /(2л)=/(я), /(2л + 1) = /(л) + /(л + 1).Вычислить /(л) по заданному л.25. В интервале [100; 7V], где 210 < N< 231, найти количество чисел,составленных из цифр а, Ь, с.

5.6.2. Рекурсивные процедуры и функции

Используя рекурсивную подпрограмму, решить следующие задачи:1. Найти сумму цифр заданного натурального числа.2. Найти количество цифр в заданном натуральном числе.3. Описать функцию С(т, л), где 0 < т < п, для вычислениябиномиального коэффициента С™ по следующей формуле: С° = = С" = 1;С™ = С“_, + ОД при 0 < т < п.4. Описать рекурсивную функцию Root (а, Ь, е), которая методомделения отрезка пополам находит с точностью е корень уравнения Дх) =0 в интервале [а; b]. При этом считать, что в > 0, а < b, f(a ) • f(b) < 0 иf(x) — непрерывная и монотонная в интервале [а; Ь\.5. Описать функцию min(A') для определения минимальногоэлемента линейного массива X, введя вспомогательную рекурсивнуюфункцию min (к) , находящую минимум среди последних элементовданного массива, начиная с А:-го.6. Описать рекурсивную логическую функцию Simm (S, I, J),проверяющую, является ли симметричной часть строки S, начинающаяся/-м и заканчивающаяся j-м ее элементами.

293

Page 294: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

7. Вычислить наибольший общий делитель двух натуральных чисел.8. Найти число, которое образуется при записи цифр заданногонатурального числа в обратном порядке. Например: для заданного числа1 234 — это число 4 321.9. Перевести заданное натуральное число в />-ичную системусчисления (2 < р < 9).10. Дана символьная строка, представляющая собой запись на-турального числа в/7-ичной системе счисления (2 <р< 9). Перевести эточисло в десятичную систему счисления.11. Вычислить сумму 1! + 2! + 3! + ... + п\ при п < 15. (Тип значенияфункции Longint.)12. Вычислить сумму: 2! + 4! + 6! + ... + п!, где п < 16 — четноечисло. (Тип значения функции Longint.)13. Дано п различных натуральных чисел. Определить все воз-можные перестановки этих чисел.14. Описать функцию, которая удаляет из строки все лишниепробелы. (Лишними считаются пробелы, если их более двух подряд,если они стоят в конце строки после последней точки послеоткрывающегося парного знака препинания.)15. Разработать функцию для вычисления определителя матрицыпорядка п (1 < п < 20). ^

16. Найти я-ю производную f(x) = е 2, построив для f ( n )(x) ре-

куррентное соотношение.

18. Вычислить значение многочлена

Р„(х) = d 0 + d {x + d 2x 2 + ... + d„xn с вещественными коэффициентами в

комплексной точке х = с + id.

5.7. Тема «Одномерные массивы»

Уровень сложности А

1. В массив j4[./V] включены натуральные числа. Найти суммуэлементов массива, кратных заданному К.2. В целочисленной последовательности есть нулевые элементы.Создать массив из номеров этих элементов.3. Дана последовательность целых чисел аи а 2 , ..., ап . Определить,какое число встречается раньше: положительное или отрицательное.4. Дана последовательность действительных чисел а ь а 2 , ..., а„.Определить, будет ли она возрастающей.5. Дана последовательность натуральных чисел а ь а 2 , . . . , а„.Создать массив из четных чисел этой последовательности. Если такихчисел нет, вывести соответствующее сообщение.

294

Page 295: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

6. Дана последовательность чисел ah а 2 , а„. Указать наименьшуюдлину числовой оси, содержащую все эти числа.7. Дана последовательность действительных чисел аи а 2 , ..., ап .Заменить все ее члены, которые больше заданного числа Z, этим числом.Определить количество выполненных замен.8. Последовательность действительных чисел оканчивается нулем.Найти количество членов в этой последовательности.9. Дан массив действительных чисел с размерностью N. Определить,сколько в нем отрицательных, положительных и нулевых элементов.10. Дана последовательность действительных чисел аи а 2 , . . . , а„.Поменять местами наибольшее и наименьшее числа.11. Дана последовательность целых чисел аи а 2 , . . . , а„. Вывести напечать только те числа, для которых а, > /.12. Дана последовательность натуральных чисел аи а 2 , . . . , а„.Указать те из этих чисел, у которых остаток от деления на Мравен L (0 <L < М- 1).13. В заданном одномерном массиве поменять местами соседниеэлементы, стоящие на четных местах, с элементами, стоящими нанечетных местах.14. При поступлении в вуз абитуриенты, получившие два балла напервом экзамене, ко второму экзамену не допускаются. В массиве А [п]записаны оценки экзаменуемых, полученные на первом экзамене.Определить, сколько человек не допущено ко второму экзамену.15. Дана последовательность чисел, среди которых имеется одиннуль. Вывести на печать все числа до нуля включительно.16. В первых элементах одномерного массива размещены значенияаргумента, а в следующих — соответствующие им значения функции.Напечатать элементы этого массива в виде двух параллельных столбцов:аргумент и значение функции.17. Пригодность детали оценивается по размеру В , который долженнаходиться в пределах значений от А - 5 до А + 8. Определить, имеютсяли в партии из N деталей бракованные. Если имеются, найти ихколичество, в противном случае вывести отрицательный ответ.18. Необходимо имеющиеся доллары выгодно обменять на рубли,если имеется информация о стоимости их купли-продажи в банкахгорода и количестве банков — N.19. Дан целочисленный массив с количеством элементов п. Вывестина печать те его элементы, индексы которых являются степенями двойки:1, 2, 4, 8, 16, ...20. Дана последовательность из N вещественных чисел. Определить,сколько в ней чисел меньше К, равно К и больше К.21. Дана последовательность из ЛГ вещественных чисел. Вычислить

295

к

Page 296: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

где М— среднее арифметическое заданной последовательности.22. Дан массив (Var А : Array [1..N] Of'O'. .’9';). Определить, входитли в него последовательность символов «1,2, 3». Если входит, то сколькораз и начиная с каких позиций (N> 3).23. Дан массив действительных чисел. Определить, сколько разизменяется знак в этой последовательности и отметить номера позиций,в которых происходит смена знака.24. Дана последовательность из N вещественных чисел. Вычислитьсумму чисел, порядковые номера которых являются простыми числами.25. Дана последовательность из N вещественных чисел. Вычислитьсумму чисел, порядковые номера которых являются числами Фибоначчи.26. Дана последовательность из N вещественных чисел. Вычислитьзначение выражения

27.Дана последовательность из N целых чисел. Вычислить суммуэлементов массива, порядковые номера которых совпадают сзначениями этих элементов.

28.Заполнить массив из N элементов с начальным заданнымзначением А[0] *0 по принципу: A[I] = A[I div 2] + А[1- 1].

29.Определить количество членов последовательности натуральныхчисел, кратных числу М и заключенных в интервале от L до N.

30.Определить, сколько процентов от всего количества членовпоследовательности целых чисел составляют нечетные члены.

31.Сформировать массив простых чисел, которые не большезаданного натурального числа N.

32.Сформировать массив простых множителей заданного числа.33.Сформировать одномерный массив. Удалить из него К элементов,

начиная с заданного номера, и добавить элемент с заданнымномером.

34.Дана последовательность действительных чисел аи а 2 , а„.Указать элементы этой последовательности, находящиеся в ин-тервале [с; d].

Уровень сложности В

1. Дан одномерный массив А [А^. Найти

тах(а2, а4,..., а 2 к) + min(a,, а3,..., а 2 к + х).

296

Page 297: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

2. Дана последовательность целых положительных чисел. Найтипроизведение тех чисел этой последовательности, которые большезаданного числа М. Если таких чисел нет, то вывести соответствующеесообщение.3. Последовательность аи а 2 , ..., ап состоит из нулей и единиц.Поставить в начало этой последовательности нули, а затем единицы.4. Дана последовательность действительных чисел а х , а 2 , ..., а„,среди которых есть и положительные, и отрицательные. Заменитьнулями те из них, которые по модулю больше максимального заданногочисла, т.е. \а\ > max {а,, а 2 , ..., а„}.5. Дана последовательность действительных чисел а х , а 2 , ..., а„.Найти

шах (а, + а2п, а 2 + а2п_х, ап+а п + 1 ).

6. В последовательности действительных чисел аи а 2 , ..., ап естьтолько положительные и отрицательные члены. Вычислить произведениеР\ отрицательных членов этой последовательности и произведение Р2

положительных ее членов. Сравнить Р2 с Р х и указать, какое изпроизведений по модулю больше.7. Дан массив действительных чисел, среди которых есть равные.Найти первый максимальный элемент этого массива и заменить егонулем.8. Вставить в заданную последовательность действительных чисел Я|< а 2 < ... < а„ действительное число b таким образом, чтобыпоследовательность осталась неубывающей.9. Дана последовательность целых положительных чисел аь а 2 , а„.Найти в ней числа, являющиеся квадратами некоторого числа т.10. Дана последовательность целых чисел аи а 2 , ..., а„. Создатьновую последовательность, выбросив из заданной члены, равные min (йь

а 2 , ..., а„).11. У прилавка магазина выстроилась очередь из п покупателей.Время обслуживания /-го покупателя равно /,• (где / = 1, ..., п).Определить время С, пребывания /-го покупателя в очереди.12. Секретный замок для сейфа состоит из 10 расположенных в рядячеек, в которые вставляют игральные кубики. Замок открывается тольков том случае, если в любых трех соседних ячейках сумма точек напередних гранях кубиков равна 10. (Игральный кубик имеет на каждойграни от 1 до 6 точек.) Разгадать код замка, если два кубика ужевставлены в ячейки.13. В массиве целых чисел из п элементов найти наиболее частовстречающееся число. Если таких чисел несколько, определить наи-меньшее из них.14. Каждый солнечный день улитка, сидящая на дереве, поднимаетсявверх на 2 см, а каждый пасмурный день опускается вниз на 1 см. Вначале наблюдения улитка находилась в А см от земли

297

Page 298: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

на 5-метровом дереве. Массив данных из 30 элементов содержитсведения о том, был ли соответствующий день наблюдения пасмурнымили солнечным. Определить местоположение улитки к концу 30-го днянаблюдения.15. Дан целочисленный массив из п элементов. «Сжать» этот массив,выбросив из него каждый второй элемент. (Дополнительный массив неиспользовать.)16. Дан массив, содержащий несколько нулевых элементов. «Сжать»его, выбросив эти элементы.17. Дан массив из N элементов. Сформировать из него два массива:первый — из элементов исходного массива с четными номерами, авторой — из элементов с нечетными номерами.18. Дана последовательность целых чисел аи а 2 , ..., ап . Определитьпары чисел ah dj , сумма которых а, + а, = т.19. Дана последовательность целых чисел а х , а 2 , ап . Наименьшийчлен этой последовательности заменить целой частью среднегоарифметического всех ее членов. Если наименьших членов несколько,заменить последний из них по порядку.20. Даны две последовательности целых чисел аи а 2 , ап и Ь\, Ь 2 , ...,Ьп . Преобразовать последовательность Ьи Ь2 , ..., Ьп , используяследующее условие: если я,< 0, то 6, увеличить в 10 раз, в другихслучаях £,• заменить нулем (/ = 1, 2, ..., я).21. Дана последовательность действительных чисел аи а 2 , а „ .Умножить все члены этой последовательности на квадрат ее наи-меньшего члена, если а к> 0, и на квадрат ее наибольшего члена, если а к<0 (где 1 < к < и).22. Даны координаты п точек на плоскости: (Хи У,), ..., (Хп , Y„), гдеп < 30. Найти номера пары точек, расстояние между которыминаибольшее. (Считать, что такая пара единственная.)23. Дана последовательность из п различных целых чисел. Найтисумму ее членов, расположенных между максимальным и минимальнымзначениями. (В сумму включить и оба этих числа.)24. Японская радиокомпания получила ответы N радиослушателей наследующий вопрос: «Какое животное вы связываете с Японией ияпонцами?» Определить к наиболее часто встречающихся ответов и ихдолю в процентах.25. Дан массив, состоящий из п натуральных чисел. Создать новыймассив, элементами которого будут элементы исходного массива,оканчивающиеся на цифру к.26. Дан массив целых чисел. Найти в этом массиве минимальныйэлемент т и максимальный элемент М. Определить в порядкевозрастания все целые числа из интервала (т\ М), которые не входят вданный массив.27. Даны действительное число х и массив чисел А [я]. Найти имассиве два члена, среднее арифметическое которых ближе всего к числух.

298

Page 299: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

28. Даны две последовательности а ь а 2 , ..., а„ и Ь х Ь2 , ..., Ьт (где т< п). В каждой из них члены различны. Определить, верно ли, что всечлены второй последовательности входят в первую последовательность.29. Входные данные — возраст п человек. Определить количествочеловек, возраст которых находится в интервале 10 лет, т.е.0. ..9 лет, 10... 19 лет, 20...29 лет и т.д. Напечатать результаты расчетовв удобочитаемой форме.30. Дан массив Х[УУ] целых чисел. Не используя других массивов,переставить его элементы в обратном порядке.31. Коэффициенты многочлена хранятся в массиве A[N] (где N—натуральное число, степень многочлена). Вычислить значение этогомногочлена в точке х (т.е. a[JV] • xN + ... + я[1] • х+ а[0]) и найти егопроизводную в этой точке.32. В массивах А[К] и B[L] хранятся коэффициенты двух мно-гочленов степеней Ки L. Поместить в массив С[М] коэффициентыпроизведения этих многочленов. (Числа К, L, М— натуральные; М= К+L; элемент массива с индексом / содержит коэффициент при х встепени /.)33. Получить информацию о наибольшем, наименьшем и наименееудаленном от среднего арифметического членах последовательностивещественных чисел.34. Дан массив чисел А. Определить значение к , при котором сумма |Л[1] +А[2] + ... +А[к] - {А[к+ 1] +... +Л[ЛП)| минимальна (т.е.минимален модуль разности сумм элементов правой и левой частей, накоторые массив делится этим к).

Уровень сложности С

1. В одномерном массиве все отрицательные элементы переместить вначало, а остальные — в конец с сохранением порядка следования, неиспользуя при этом дополнительный массив.2. Одномерный массив с четным количеством элементов (2N)содержит координаты N точек плоскости, которые располагаются вследующем порядке: хь у ь х 2 , у2, *з, Уз и Т-Д- Определить:

а) минимальный радиус окружности с центром в начале координат,которая содержит все точки;

б) кольцо с центром в начале координат, которое содержит псе точки;в) номера точек, которые могут являться вершинами квадрата;г) номера точек, которые могут являться вершинами равнобедренного

треугольника;д) номера наиболее удаленных и наименее удаленных друг от друга

точек;е) три точки, являющиеся вершинами треугольника, для которого

разность точек вне его и внутри является минимальной.

299

Page 300: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

3. Дан целочисленный массив размерности N. Определить, есть лисреди элементов этого массива простые числа, и если есть, вывести наэкран номера этих элементов.4. Дана последовательность целых чисел. Найти количество раз-личных чисел в этой последовательности.5. Дан массив из п четырехзначных натуральных чисел. Вывести наэкран только те числа, у которых сумма первых двух цифр равна суммедвух последних.6. Даны две последовательности целых чисел я,, а 2 , ..., а„ и Ь\,Ь 2 , . . . , Ь п , все члены которых — различные числа. Определить, сколькочленов первой последовательности совпадают с членами второйпоследовательности.7. Дан целочисленный массив А[п\, среди элементов которого естьодинаковые. Создать массив из различных его элементов.8. На плоскости п точек заданы своими координатами, а также заданаокружность с радиусом Лис центром в начале координат. Указатьмножество всех треугольников с вершинами в заданных точках,пересекающихся с окружностью, и множество всех треугольников,содержащихся внутри окружности.9. Некоторое число содержится в каждом из следующих трех це-лочисленных неубывающих массивов: х[1] < . . . < ^ [ l ] <... <y[q \;г[1] < ... ^z[r\. Найти одно из таких чисел, при этом число действийдолжно быть порядка р + q + г.10. Определить, есть ли одинаковое число в каждом из следующихтрех целочисленных неубывающих массивов: х[1] < ...<л:[^], у[1] <...<y[q\, г[1] ^... ^ z[r\ . Найти одно из таких чисел или сообщить оботсутствии такого числа.11. Дан массив целых чисел А[п]. Найти наименьшее число Кэлементов, которые можно исключить из этой последовательности, чтобыподпоследовательность осталась возрастающей.12. Разделить заданный массив чисел на две части, включив в первуючасть элементы, большие среднего арифметического их суммы, а вовторую — меньшие (части не сортировать).13. Даны два одномерных массива с различным количествомэлементов и натуральное число к. Объединить их в один массив,включив второй массив между к-м и (к+ 1)-м элементами первого и неиспользуя при этом дополнительный массив.14. Даны две последовательности я, < а 2 < ... < ап и Ь х < Ь 2 <... < Ьт .Образовать из них новую неубывающую последовательность чисел, неиспользуя дополнительный массив.15. Дана последовательность чисел аи а 2 , ..., а„. Переставить ееэлементы в порядке убывания. Для этого в массиве выбрать наибольшийэлемент (начиная с первого) и поставить его на первое место, а первый— на место наибольшего. Затем эту процедуру повторить, начиная совторого элемента. Записать алгоритм сортировки массива выбором.

300

Page 301: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

16. Дана последовательность чисел яь а 2 , ..., а„. Переставить ееэлементы в порядке возрастания, для чего сравнить два соседних числа я,и ам . Если я, > я,- + ,, выполнить перестановку. Процесс продолжать дотех пор, пока все элементы будут расположены в порядке возрастания.Записать алгоритм сортировки массива обменами (методом пузырька),подсчитывая при этом количество перестановок.17. Дана последовательность чисел я,, я2, ..., я„. Переставить ееэлементы в порядке возрастания следующим образом. Пусть а ь я2,..., я, —упорядоченная последовательность, т.е. а х < а 2<... <я(. Следующеечисло я,+1 вставляется в последовательность таким образом, чтобы новаяпоследовательность также была возрастающей. Процесс повторяется дотех пор, пока все элементы от / + 1 до п будут выбраны. (Месторазмещения очередного элемента в отсортированной части определить спомощью двоичного поиска, который оформить в виде отдельнойфункции.) Записать алгоритм сортировки массива вставками.18. Записать алгоритм сортировки Шелла, основная идея которогозаключается в сортировке элементов массива, отстоящих друг от друга нарасстояние h. При этом каждая такая А-сортировка программируется каксортировка простыми вставками. Затем расстояние И уменьшается исортировка повторяется. Процесс заканчивается, когда h уменьшается до1.19. Дан массив п действительных чисел, который требуется упо-рядочить по возрастанию, используя сравнение двух соседних элементовя, и ам . Если я, < я,+1 , сдвигаются на один элемент вперед, если же я, > я,+1, сдвигаются на один элемент назад. Записать алгоритм такойсортировки.20. Пусть даны неубывающие последовательности действительныхчисел Я( < я2 < ... < я„ и Ь\ < Ь 2 < . . . < Ьт . Требуется указать меставставки элементов второй последовательности в первую таким образом,чтобы новая последовательность оставалась возрастающей.

21. Даны дроби (где ph qнатуральные числа).Я\ Qi Qn

Привести эти дроби к общему знаменателю и упорядочить их в порядкевозрастания.22. Упорядочить последовательность аи а 2 , . . . , ап по неубыванию спомощью алгоритма сортировки слияниями (алгоритма фон Неймана),заключающемся в следующем.

Сначала каждая пара соседних элементов сливается в группу из двухэлементов, причем последняя группа может состоять из одного элемента,а затем каждая пара соседних двухэлементных групп сливается в однучетырехэлементную группу и т.д. При каждом слиянии новаяукрупненная группа элементов упорядочивается.

301

Page 302: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

а) 1 2 3 . . п

п л-1 л-2 . 1

1 2 3 . п

п п - 1 п - 2 . 1

п я — 1 п - 2 . 1

302

Page 303: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

б) 0 0 0 - 0 0 1

0 0 0 ... 0 2 0

0 0 0 ... 3 0 0

0 п -1 0 ... 0 0 0

и 0 0 ... 0 0 0

в) п 0 0 0 0 0

0 п -1 0 0 0 0

0 0 п - 2 0 0 0

0 0 0 0 2 0

0 0 0 0 0 1

г) 1-2 0 0 0 0

0 2-3 0 0 0

о

о

3-4

О

О

О

О

0 0 о

0 (п-\)п 0

0 0 п(п

Д) 1 1

1

1 1

0 0 0 0

1 1 1 0

0 1 0 О 1

0

1

0

1

0

1

0

1

о

303

Page 304: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации
Page 305: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 2 3 . . л-2 л-1 л

2 3 4 . . л-1 л 0

3 4 5 . . л 0 0

-1 л 0 . . 0 0 0

л 0 0 . . 0 0 0

л) 1 0 0 0 0 л

0 2 0 0 л-1 0

0 0 3 л - 2 0 0

0 2 0 0 л-1 0

1 0 0 0 0 л

м) 1 2 3 . . . л - 2 л-1 л

2 1 2 ... л - 3 л-2 л-1

3 2 1 . . . л - 4 л -3 л - 2

л - 1 л - 2 л-3 ... 2 1 2

л л-1 л-2 ... 3 2 1

2. Построить квадратную матрицу порядка 2л:

п п

1 1 . . . 1 2 2 ... 2

1 1 . . . 1 2 2 ... 2

1 1 . . . 1 2 2 2 2

3 3 . . . 3 4 4 ... 4

3 3 . . . 3 4 4 ... 4

3 3 . . . 3 4 4 ... 4

305

п

Page 306: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 X х 2 ... хп~2 хп~ 1 хп

X 0 0 ... 0 0 хп~х

X 2 0 0 ... 0 0 хп~2

х"-' 0 0 ... 0 0 X

хп Xя"1 хп~ 2 ... X 2 X 1

4. Дана последовательность действительных чисел а, Получить квадратную матрицу порядка п:

а. «2 аъ ... ап-2 ап-1 ап

а 2°3 а 4 ... ап-\ ап-2 Щ

«3 а 4 а 5 ... С1п а 2

а„-\ щ ... ап-4 3 ап-2

ап а\ а 2 ... 3 ап-2 ^п-1

5. Получить следующую матрицу:

1 2 3.. 9 10

0 1 2 .. 8 9

0 0 1 .. 7 8

0 0 0.. 0 1

6. Получить следующую матрицу:

1 0 ... О

О 1

0

1

1

О

1

1

О

1

о

0

1

306

Page 307: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

8. Дана действительная квадратная матрица порядка 2п. Получитьновую матрицу, переставляя ее блоки размером п х п по часовой стрелке,начав с блока в левом верхнем углу.

9. Дана действительная квадратная матрица порядка 2п. Получитьновую матрицу, переставляя ее блоки размером пх п крест накрест.

10. Дан линейный массив х ь хъ ..., х„_ ь хп . Получить действи-тельную квадратную матрицу порядка и:

*1 х2 . . . Х„

v2 v2 у2 г2

X" V я

Х2

11. Дан линейный массив х ь х 2 , ..., х„_ ь хп . Получить действи-тельную квадратную матрицу порядка п:

1

*i

Xl

х;

п-1

1

Xl

v2

Х2

-у.Л-1

1

хп-\

г2

л„-1

V-W-1

1

„.п-1

12. Получить квадратную матрицу порядка п :

307

Page 308: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 2 л-1 лп +1 л + 2 2л-1 2л

2л+ 1 2л+ 2 3 л -1 Зл

(л — 1)я + 1 (л-1)л + 2 я 2 - 1 л 2

Получить квадратную матрицу порядка л:

0 0 0 . .. 0 0

0 1 0 . .. 0 0

0 0 2 ... 0 0

0 0 0 . .. 0 л-1

14. Магическим квадратом порядка я называется квадратная матрицаразмером л х л, составленная из чисел 1, 2, ..., я2таким образом, чтосуммы чисел в каждом ее столбце, каждой строке и каждой из двухбольших диагоналей равны между собой. Построить такой квадрат.Например магический квадрат третьего порядка имеет вид

1

5

9

8

3

4

15. Сформировать квадратную матрицу порядка N по формуле' / 2 - / М

и определить количество положительных эле-A[I,J] = sinN

ментов в ней.16. Дана квадратная матрица порядка М. Повернуть ее в поло-жительном направлении на 90, 180 и 270°.

1. Вычислить сумму и число положительных элементов, нахо-дящихся над главной диагональю матрицы A[N, N\.2. Дана вещественная матрица А размером л х т. Определитьколичество к ее «особых» элементов, т. е. элементов, которые большесуммы остальных элементов столбца.3. Дана квадратная матрица. Поменять местами строку с макси-мальным элементом на главной ее диагонали со строкой с заданнымномером т.

308

Page 309: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

4. Дана матрица B[N, М]. Найти в каждой строке этой матрицымаксимальный и минимальный элементы и поменять их местами спервым и последним элементами этой строки соответственно.5. Дана целая квадратная матрица п-го порядка. Определить,является ли она магическим квадратом, т.е. что суммы элементов во всехее строках и столбцах одинаковые.6. Элемент матрицы называется седловой точкой, если он являетсянаименьшим в своей строке и наибольшим в своем столбце илинаибольшим в своей строке и наименьшим в своем столбце. Длязаданной целой матрицы размером пхт напечатать индексы всех ееседловых точек.7. Дана вещественная матрица размером п х т . Переставляя еестроки и столбцы, добиться того, чтобы наибольший ее элемент (илиодин из них) оказался в верхнем левом углу.8. Определить, является ли заданная целая квадратная матрица я-гопорядка симметричной относительно главной диагонали.9. Дана целочисленная квадратная матрица. Найти в каждой ее строкенаибольший элемент и поменять его местами с элементом главнойдиагонали.10. Упорядочить по возрастанию элементы каждой строки матрицыразмером п х т .11. Дана матрица размером п х т . Найти максимальный по модулюэлемент этой матрицы и переставить ее строки и столбцы таким образом,чтобы он был расположен на пересечении к-й строки и к-го столбца.12. Дана квадратная матрица A[N, /V]. Записать на место отрица-тельных элементов этой матрицы нули, а на место положительныхэлементов — единицы. Вывести на печать нижнюю треугольнуюматрицу в общепринятом виде.13. Дана действительная матрица размером п х т , все элементыкоторой различны. В каждой строке этой матрицы выбрать элемент снаименьшим значением, а затем среди них выбрать элемент снаибольшим значением. Указать индексы этого элемента.14. Дана действительная квадратная матрица порядка N (гае N —нечетное число), все элементы которой различны. Найти наибольшийэлемент главной и побочной диагоналей этой матрицы и поменять егоместами с элементом, стоящим на пересечении этих диагоналей.15. Для заданной квадратной матрицы сформировать одномерныймассив из ее диагональных элементов. Найти след этой матрицы,суммируя элементы полученного одномерного массива. Преобразоватьисходную матрицу, разделив четные строки на полученные значения, анечетные строки оставить без изменения.16. Дана квадратная матрица. Получить из нее транспонированнуюматрицу.

309

Page 310: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

17. Квадратная матрица, симметричная относительно главнойдиагонали, задана верхним треугольником в виде одномерного массива.Восстановить исходную матрицу и напечатать ее по строкам.18. Даны матрица порядка п и число к. Разделить элементы к-йстроки матрицы на диагональный элемент, расположенный в этой строке.19. Для целочисленной квадратной матрицы найти число элементов,кратных к, и определить наибольший из них.20. Найти наибольший и наименьший элементы прямоугольнойматрицы и поменять их местами.21. Дана прямоугольная матрица. Найти ее строки с наибольшей инаименьшей суммой элементов. Вывести на печать эти строки и суммыих элементов.22. В заданной действительной квадратной матрице порядка п найтисумму элементов строки, в которой расположен элемент с наименьшимзначением. (Предполагается, что такой элемент единственный.)23. В заданной действительной квадратной матрице порядка п найтинаибольший по модулю элемент. Получить квадратную матрицу порядкап - 1, отбросив из исходной матрицы строку и столбец, на пересечениикоторых расположен найденный элемент.24. Дана действительная квадратная матрица порядка п. Преоб-разовать эту матрицу, сделав строку с номером п столбцом с номером п,а столбец с номером п — строкой с номером п.25. Дана действительная матрица размером п х т . Преобразовать этуматрицу, поэлементно вычитая значение последней строки из значенийвсех ее строк, кроме последней.26. Определить номера строк целочисленной матрицы A[N, К],совпадающие с массивом D[K\. Если таких строк нет, выдать соот-ветствующее сообщение.27. Определить наименьший элемент каждой четной строки матрицыА[М, TV].28. Расположить столбцы матрицы D[M, N] в порядке возрастанияэлементов к-й строки (1 < к < М).29. Определить номера строк матрицы R[M, N], в которых хотя быодин элемент равен с, и элементы этих строк умножить на d.30. Матрица A [N, М] (где М — кратно четырем) разделена повертикали на две половины. Определить сумму элементов каждогостолбца левой половины этой матрицы и сумму элементов каждогочетного столбца ее правой половины.31. Дана квадратная целочисленная матрица порядка п. Сфор-мировать результирующий одномерный массив, элементами которогоявляются суммы элементов тех строк, которые начинаются с А: идущихподряд положительных чисел.32. Целочисленная матрица размером пхт содержит информацию обп учениках некоторого класса. В первом столбце этой ма

310

Page 311: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

трицы указана масса [кг], во втором — рост [см], в третьем —успеваемость (средний балл) и т.д. (используйте свои дополнительныепоказатели). Ученик является среднестатистическим (уникальным) по к-му параметру, если для него характерен минимум (максимум) модуляразности среднего арифметического чисел из к-го столбца заданнойматрицы и значения его к-го параметра. Ученик является самымуникальным (самым средним), если он окажется уникальным(среднестатистическим) по самому большому количеству указанныхпараметров. Определить по данной матрице самых уникальных и самыхсредних учеников класса.33. Прямоугольное поле разбито на т х п квадратных клеток. Не-которые из этих клеток окрашены в черный цвет. При этом известно, чтовсе черные клетки можно разбить на несколько непересе- кающихся и неимеющих общих вершин черных прямоугольников. Считая, что цветаклеток заданы в виде массива следующего типа: Array [l..m, l..n] OfBoolean, определить число черных прямоугольников. Причем числоопераций должно быть порядка т х п .

(Число прямоугольников определяется числом их левых верхнихуглов. Является ли клетка верхним углом, узнается по ее цвету, а такжепо цвету верхней и левой соседних клеток. Однако соседей может и небыть, если клетка крайняя.)34. Даны квадратная таблица A[N, TV] и число М< N. Для каждогоквадрата размером М х М в этой таблице вычислить сумму стоящих внем чисел. При этом общее число действий должно быть порядка п2 .

(Сначала для каждого горизонтального прямоугольника размером М х1 следует вычислить сумму стоящих в нем чисел. При сдвиге такогопрямоугольника по горизонтали на 1 надо одно число добавить и одновычесть. Затем вычисляют полученные суммы в квадратах. При сдвигеквадрата по вертикали одна полоска добавляется, а другая полоскаубавляется.)35. Среди строк целочисленной матрицы, содержащих тольконечетные элементы, найти строку с максимальной суммой модулей ееэлементов.36. Дана целочисленная матрица размером Nx N. Определитьколичество строк этой матрицы, являющихся перестановкой чисел 1,2, ..., N, т.е. содержащих каждое из этих чисел только один раз.37. Среди столбцов целочисленной матрицы, содержащих толькоэлементы, модули которых не больше 10, найти столбец с минимальнымпроизведением элементов.38. Массивом chars [Л/] [N] кодируется поле, на котором расположенонесколько прямоугольников. Каждый прямоугольник состоит из целогочисла клеток, при этом разные прямоугольники не накладываются другна друга и не соприкасаются. Разные прямоугольники могут состоять изразных символов, а один и тот же

311

Page 312: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

прямоугольник не может обозначаться различными символами. Пустыеквадраты поля кодируются символом «.». Определить числопрямоугольников разных типов. Например, для поля вида

###.................+ .

....???....

■р? •?.....=

? ? ? . . . # # # # . . должен быть получен

следующий ответ:

# прямоугольников — 2 ?прямоугольников — 3 +прямоугольников — 1 =прямоугольников — 2

39. Характеристикой столбца целочисленной матрицы является суммамодулей его отрицательных нечетных элементов. Переставить столбцызаданной целочисленной матрицы, расположив их в соответствии сростом характеристик.40. Для заданной квадратной матрицы найти значения к, при которыхк-я ее строка совпадает с к-м столбцом.41. Найти максимальный элемент среди упорядоченных либо повозрастанию, либо по убыванию строк заданной матрицы.42. Расстояние между строками к и / квадратной матрицы А размеромNx N определяется формулой

' = Х ( Ы - Ы ) -

J=1

Указать номер строки, максимально удаленной от первой строкизаданной матрицы.43. Определить, является ли заданная матрица ортонормиро- ванной(т.е. что скалярное произведение каждой пары различных ее строк илистолбцов равно нулю).44. Определить среднее арифметическое элементов матрицы,находящихся на пересечении строк, номера которых кратны R, истолбцов, номера которых кратны S.45. Определить номера строк заданной матрицы, в которых знакиэлементов чередуются.46. Каждый элемент матрицы А(3, 3) разделить на значение ее

Page 313: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

48. Сформировать двухмерный массив и удалить из него все столбцы,в которых встречается заданное число.

49. В прямоугольной таблице определить номер строки, в которойнаходится самая длинная последовательность одинаковых эле-ментов.

50. Даны две квадратные матрицы Ли В. Найти матрицу С, равную АУ . В- ВхА.

51. Тема «Работа со строками»

52. Дана строка, заканчивающаяся точкой. Определить, сколько словв строке.

53. Дана строка, содержащая английский текст. Найти количествослов в этой строке, начинающихся с буквы Ь.

54. Дана строка. Подсчитать в ней количество вхождений букв г, k, t.55. Дана строка. Определить, сколько в ней символов (*), (;), (:).56. Дана строка, содержащая текст. Найти длины самого короткого и

самого длинного слов в этой строке.57. Дана строка символов, среди которых есть двоеточие (:). Оп-

ределить, сколько символов ему предшествует.58. Дана строка, содержащая текст, заканчивающийся точкой.

Вывести на экран слова из этого текста, содержащие три буквы.59. Дана строка. Преобразовать ее, удалив каждый символ (*) и

повторив каждый символ, отличный от (*).60. Дана строка. Определить, сколько раз входит в нее группа букв

abc.61. Дана строка. Определить количество букв к в последнем ее слове.62.Дана строка. Определить, сколько различных символов встре-

чается в ней. Вывести их на экран.63. Дана строка. Определить в ней самую длинную последова-

тельность подряд идущих букв «а».64. Дана строка символов, среди которых есть одна открывающаяся

скобка и одна закрывающаяся. Вывести на экран все символы,расположенные внутри этих скобок.

65.Дана строка, содержащая буквы латинского алфавита и цифры.Вывести на экран длину наибольшей последовательности цифр,идущих подряд.

66.Дан набор слов, разделенных точкой с запятой (;), которыйзаканчивается двоеточием (:). Определить, сколько в нем слов,заканчивающихся буквой «а».

67. Дана строка. Указать слова в этой строке, содержащие хотя быодну букву к.

313

Page 314: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1. Дана строка. Найти в этой строке слова, которые начинаются иоканчиваются на одну и ту же букву.2. В заданной строке заменить все двоеточия (:) точкой с запятой (;).Определить количество выполненных замен.3. В заданной строке удалить символ двоеточие (:) и определитьколичество удаленных символов.4. В заданной строке между словами вставить вместо пробелазапятую и пробел.5. Удалить часть символьной строки, заключенной в скобки, вместесо скобками.6. Определить, сколько раз в строке встречается заданное слово.7. В заданной строке имеется точка с запятой (;). Определитьколичество символов в этой строке до точки с запятой и после нее.8. Дана строка. Преобразовать ее, заменив точками все двоеточия (:),встречающиеся среди первых я/2 символов, и все восклицательныезнаки, встречающиеся среди символов, стоящих после я/2 символов.9. Строка содержит одно слово. Проверить, будет ли оно читатьсяодинаково справа налево и слева направо, т.е. является ли онопалиндромом.10. В записке слова зашифрованы: каждое из них записано наоборот.Расшифровать сообщение.11. Проверить, одинаковое ли число открывающихся и закры-вающихся скобок в заданной строке.12. Строка произвольного русского текста содержит не более 200букв. Определить, какие буквы и сколько раз встречаются в этом тексте.(Ответ привести в грамматически правильной форме, например: а — 25раз, к — 3 раза и т.д.)13. Упорядочить заданный массив английских слов по алфавиту.14. Даны две строки А и В. Проверить, можно ли из букв, входящихв строку А, составить строку В. (Буквы можно использовать не болееодного раза, а также можно переставлять.)

Например: из строки А — ИНТЕГРАЛ — можно составить строку В— АГЕНТ — и нельзя составить строку В — ГРАФ.15. Строка содержит произвольный русский текст. Определить, какихбукв в этом тексте больше: гласных или согласных.16. Двухмерный массив размером пхт содержит некоторые буквырусского алфавита, расположенные в произвольном порядке. Определить,можно ли из этих букв составить заданное слово S. (Каждую буквумассива использовать не более одного раза.)17. Результаты вступительных экзаменов представлены в виде спискаиз N строк, в каждой из которых записаны фамилия студента и егооценки по каждому из Мэкзаменов. Определить количествоабитуриентов, сдавших вступительные экзамены только на «отлично».

Page 315: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

18. Преобразовать заданные натуральные числа, записанныеримскими цифрами, в десятичную систему счисления.19. Из заданной символьной строки выбрать символы, встреча-ющиеся только один раз, в порядке их расположения.20. В символьном массиве хранятся фамилии и инициалы учениковкласса. Напечатать список класса с указанием количестваоднофамильцев каждого ученика.21. Дано число в двоичной системе счисления. Проверить пра-вильность ввода этого числа (в его записи должны быть только символы0 и 1). Если число введено неверно, ввод повторяют. При правильномвводе перевести заданное число в десятичную систему счисления.22. В заданной строке удалить все лишние пробелы.23. В заданном тексте определить длину содержащейся в неммаксимальной серии символов, отличных от букв.24. Расстояние между двумя словами равной длины — это ко-личество позиций, в которых заключаются эти слова. В заданномпредложении найти пару слов заданной длины с максимальнымрасстоянием.25. Отредактировать заданное предложение, удалив из него слова,встречающиеся заданное число раз.26. Напечатать слова, встречающиеся в каждом из двух заданныхпредложений.27. Отредактировать заданное предложение, удалив из него все словас нечетными номерами и перевернув слова с четными номерами.

44*. Один из методов кодирования, называемый наложением гаммы,заключается в следующем. Берется некоторое случайное число вдиапазоне от 127 до 255 — гамма, и код каждого символа заданнойстроки заменяется кодом, получающимся в результате выполненияоперации

новый код = старый код XOR гамма.

Реализовать указанный метод кодирования для заданной строки идекодирование полученной строки при заданной гамме. (Входныеданные — кодируемая строка, выходные — гамма и закодированнаястрока.)45. Перекодировать строку из кодировки KOI в строку в кодировкеWindows-1251 и обратно.46. Дан текст, в котором встречаются структуры <i> и </i>. Заменитькаждое вхождение <i> на <курсив>, а каждое вхождение </i> на <конецкурсивах (Следует учесть, что буква «i» может быть как строчной, так ипрописной.)

* Задачи 44...53 предоставлены К. В. Волковым.

315

Page 316: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

47. Дан текст, состоящий из предложений, разделяемых точками.Произвести следующее форматирование: после каждой точки в концепредложения должен быть хотя бы один пробел; первое слово впредложении должно начинаться с прописной буквы. (Текст может бытьна русском и английском языках.)48. Дан текст. Определить в нем процентное отношение строчных ипрописных букв к общему числу символов.49. Дан текст. Определить, каких букв в нем больше: строчных илипрописных. Если больше прописных букв, заменить все строчные буквыпрописными. Если больше строчных букв, заменить все прописныебуквы строчными. Если количество прописных и строчных букв равно,текст оставить без изменения.50. Дан текст на латинском языке, содержащий слова, разделенныепробелами. Определить, какие буквы в этих словах совпадают чаще:первые, последние или средние. Позиция средней буквы в словеопределяется по следующей формуле:

поз_средн_буквы = длина_слова div 2+1

51. Дана строка из слов, разделенных пробелами. Удалить лишниепробелы. (Пробел считается лишним, если он стоит в начале строки, вконце строки или следует за пробелом.)52. С клавиатуры введено целое число в десятичной системесчисления. Реализовать форматированный вывод этого числа, т.е.представить его с разделением на триады цифр. Например: введено число100000, а выведено 100 000; введено число 1000000, а выведено: 1 000000.53. Для увеличения (уменьшения) значения целочисленной пе-ременной на единицу в языках программирования можно использоватьоперацию сложения (вычитания) и операцию инкремент (декремент).Известно, что операция инкремент (декремент) выполняется гораздобыстрей, чем сложение (вычитание), поэтому ее использование частопредпочтительней. Дан массив строк, представляющий собой фрагменттекста программы на языке Паскаль, в котором используются толькоцелочисленные переменные. В каждой строке — одна команда.Преобразовать заданный текст, заменив каждую строку вида

переменная : = переменная + 1;

на строку вида

Inc(переменная); а316

Page 317: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

переменная := переменная — 1;

на строку вида

Dec(переменная);

Например, дан следующий текст:

Begin

ReadLn(а, Ь) ; а := а + 1; с := b + 1; b b — 1;

WriteLn('а = a); WriteLn('Ь = Ь) ;

End.

Преобразованный текст будет иметь вид

Begin

ReadLn(а, Ь) ;

Inc (а); с := b + 1;

317

Page 318: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

5.10. Тема «Длинная арифметика»

1. Сравнить два многозначных числа.2. Суммировать два натуральных л-значных числа при п > 20.3. Вычислить степени чисел вида а", если а > Maxlnt, при п > 10.4. Вычислить число 2м - 1, сохранив в результате все цифры.5. Вычислить 100!.6. Извлечь точно квадратный корень из л-разрядного числа (л >40).7. Выполнить умножение многозначных чисел.8. Вычислить точное значение л! при л > 12.9. Вычислить точное значение л" при л > 10.10. Выполнить деление числа а на число Ь, если а, Ь— много-значные числа.11. Вычислить 100! + 2100.12. Вычислить 100! - 2100.13. Вычислить 7123.14. Определить, есть ли среди цифр числа 211213- 1 две подряд идущиедевятки.15. Вычислить 2“20°.16. Найти частное и остаток от деления лг-значного числа на л-значное (при т, п> 20).17. Определить, какое из чисел ат или Ь" больше и на сколько (приа, b <40 000; т, я < 10).18. Найти л знаков в десятичной записи числа 4т (при л > 50).19. Найти количество делителей л-значного натурального числа (прил > 20).20. Вычислить точное значение (л!)! (при л > 4).21. Вычислить точное значение суммы 1! + 2! + 3! + ... + л! (при л >10).

22. Вычислить точное значение суммы дробей — + — + — + • • • + —1! 2! 3! л!

(при л > 10). Ответ представить в виде несократимой дроби — (гдер, д — натуральные числа). ^23. Вычислить точное значение (л")! при л > 3.24. Вычислить точное значение суммы первых л членов после-довательности 1, к, к 2 , к3, ..., к" (при л > Maxlnt).25. Вычислить точное значение суммы первых л членов после-довательности чисел, кратных заданному натуральному числу к (при л >Maxlnt).26. Вычислить точное значение суммы 12+ 22+ 32+ ... + л2 (при л >20000).27. Вычислить точное значение суммы 1" + 2" + 3” + ... + л 2 (при л >10).

318

Page 319: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

28. Найти первое простое число, которое больше 10й.29. Вычислить точное значение многочлена а„хп + д„_ 1х"~1 +... + +а {х + ао (где а„ х— целые числа больше 10й).30. Найти наибольший общий делитель и наименьшее общее кратноечисел тип (при т, п> 1011).31. Проверить, являются ли числа тип (при т, п > 1011) взаимнопростыми.32. Доказать, что число 219936 (219937- 1) является совершенным, т.е. чтооно равно сумме всех своих делителей без самого себя.33. Вычислить функцию Y - F ( X ) , разложенную в степенной ряд, сзаданной степенью точности е (при 10-1 <е< Ю-1000).34. Массив хранит длинные числа. Найти их сумму и произведение.35. Массив хранит длинные числа. Выполнить сортировку массива.Найти разность максимального и минимального значений его элементов.36. Найти сумму значений элементов массива, содержащего длинныечисла, в запись которых не входит заданная цифра.

5.11. Тема «Множества»

Уровень сложности А

1. Три цветовода выращивают розы. Определить, какие из известныхсортов роз «Анжелика», «Виктория», «Гагарин», «Ave Maria»,«Катарина», «Юбилейная» имеются у каждого цветовода, есть хотя бы уодного из цветоводов и каких нет ни у одного из цветоводов.2. Даны имена девочек. Определить, какие из этих имен встречаютсяво всех параллельных классах школы, какие есть только в некоторыхклассах и какие не встречаются ни в одном из классов.3. Дан некоторый набор товаров. Определить, какие товары имеются вкаждом из п магазинов, какие есть хотя бы в одном магазине и каких нетни в одном из магазинов.4. Имеется список учеников класса, в котором все имена различны.Определить, есть ли в классе человек, который побывал в гостях у всехучеников. (Для каждого ученика составить список из множествапобывавших у него в гостях друзей, причем хозяина в этот список невключать.)5. Имеется множество, содержащее натуральные числа из некоторогодиапазона. Сформировать из него два множества, первое из которыхсодержит все простые числа, а второе — все составные числа.

319

Page 320: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

6. На трех участках выращивают следующие сельскохозяйственныекультуры: картофель, укроп, морковь, горох, капуста, редис. Определить,какие из этих культур имеются на каждом участке, имеются хотя бы наодном из участков и не имеются ни на одном участке.7. Известны марки машин, выпускаемых в данной стране и экс-портируемых в N заданных стран. Определить, какие марки машин былидоставлены во все указанные страны, какие в некоторые из этих стран икакие не доставлены ни в одну из стран.8. В озере водится несколько видов рыб. Три рыбака поймали рыбнекоторых из имеющихся в озере видов. Определить, рыб каких видовпоймал каждый рыбак и рыб каких видов, имеющихся в озере, невыловил ни один из рыбаков.9. В N колхозах выращивают некоторые сельскохозяйственныекультуры из имеющегося перечня. Определить культуры, выращиваемыево всех колхозах, и культуры, выращиваемые только в некоторых из них.10. Дан список игрушек. Некоторые игрушки из этого спискаимеются в N детских садах. Определить, каких игрушек из этого списканет ни в одном из детских садов и какие есть в каждом из них.11. Вычислить сумму элементов двухмерного массива, номера строки столбцов которых принадлежат соответственно непустым множествами S 2 .12. Даны множества Ми Г одного типа. Определить, сколько членовиз этих множеств совпадают.13. Из диапазона целых чисел т... п выделить множество чисел,делящихся без остатка или на к, или на / (где к, I— простые числа), имножество чисел, делящихся на произведение kl без остатка.14. Создать два множества из символов, которые вводятсяпользователем с клавиатуры. Напечатать элементы, которые содержатся впервом и втором множествах одновременно.15. Множество содержит п целых случайных равномерно рас-пределенных чисел из интервала [а; Ь\. Требуется:

а) напечатать все элементы множества, являющиеся простымичислами;

б) определить, сколько в данном множестве четных чисел изинтервала [с; d\,

в) определить, сколько элементов содержится в этом множестве;г) определить, сколько чисел из интервала [а; b] не попало в данное

множество;д) разбить полученное множество на два: множество, содержащее

числа, в двоичной записи которых более к нулей, и мно- женство,содержащее все остальные числа.

320

Page 321: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

16. Даны п множеств, заполненных произвольным количествомцелых случайных равномерно распределенных чисел из интервала [а; Ь\.Требуется:

а) вывести все элементы, которые встречаются в каждом второммножестве (нумерация множеств выполняется с единицы);

б) вывести элементы, которые есть во всех множествах кромепоследнего;

в) вывести элементы множеств с нечетными номерами, которых нетв множествах с четными номерами (нумерация множеств выполняется сединицы);

г) определить, какие из элементов не встречаются ни в какихмножествах, кроме первого.

д) определить, какие из чисел интервала [а\ Ь] не встречаются ни водном из множеств;

е) вывести элементы, встречающиеся только в к-м множестве(нумерация множеств выполняется с единицы).

Уровень сложности В

1. Дан текст из цифр и строчных латинских букв, после которыхследует точка. Определить, каких букв, гласных (а, е, i, о, и) ИЛИ

согласных, больше в этом тексте.2. Определить количество различных цифр в десятичной записинатурального числа.3. Напечатать в возрастающем порядке все цифры, не входящие взапись заданного натурального числа.4. Дан текст из строчных латинских букв, после которых следуетточка. Напечатать все буквы, входящие в этот текст не менее двух раз.5. Дан текст из строчных латинских букв, после которых следуетточка. Напечатать все буквы, входящие в этот текст по одному разу.6. Дан текст из строчных русских букв, после которых следует точка.В алфавитном порядке напечатать все строчные гласные буквы (а, е, и, о,у, ы, э, ю, я), входящие в этот текст.7. Дан текст на русском языке. Напечатать в алфавитном порядке всегласные буквы, которые входят в каждое слово этого текста.8. Дан текст на русском языке. Напечатать в алфавитном порядке всесогласные буквы, которые не входят ни в одно слово этого текста.9. Дан текст на русском языке. Напечатать в алфавитном порядке всезвонкие согласные буквы, входящие в каждое нечетное слово и невходящие ни в одно четное слово этого текста.10. Дан текст на русском языке. Напечатать в алфавитном порядкевсе звонкие согласные буквы, которые входят хотя бы в одно слово этоготекста.

321

Page 322: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

11. Дан текст на русском языке. Напечатать в алфавитном порядкевсе глухие согласные буквы, которые не входят хотя бы в одно словоэтого текста.12. Дан текст на русском языке. Напечатать в алфавитном порядкевсе согласные буквы, которые входят только в одно слово этого текста.13. Дан текст на русском языке. Напечатать в алфавитном порядкевсе глухие согласные буквы, которые не входят только в одно слово этоготекста.14. Дан текст на русском языке. Напечатать в алфавитном порядкевсе звонкие согласные буквы, которые входят более чем в одно словоэтого текста.15. Дан текст на русском языке. Напечатать в алфавитном порядке всегласные буквы, которые не входят более чем в одно слово этого текста.16. Дан текст на русском языке. Напечатать в алфавитном порядкевсе глухие согласные буквы, которые входят в каждое нечетное слово ине входят хотя бы одно четное слово этого текста.17. Слова в тексте разделены пробелами. Напечатать буквы, которыхнет в первом слове, но которые присутствуют во всех других словахэтого текста.18. Слова в тексте разделены пробелами. Напечатать в алфавитномпорядке буквы, которые встречаются хотя бы один раз в четных словах.19. Слова в тексте разделены пробелами. Напечатать в алфавитномпорядке буквы, которые встречаются хотя бы один раз в нечетныхсловах.20. Слова в тексте разделены пробелами. Определить, сколько разныхбукв встречается в этом тексте.21. Слова в русском тексте разделены пробелами. Определить,сколько букв русского алфавита не встречается в этом тексте.22. Слова в тексте с датами разделены пробелами. Определить, какиецифры содержатся в этом тексте.23. Слова в тексте разделены пробелами. Определить, с каких буквначинаются слова этого текста.24. Слова в тексте разделены пробелами. Определить, какие буквыесть в каждом слове этого текста.25. Слова в тексте разделены пробелами. Определить, какие буквывстречаются только в одном слове этого текста.26. В строке содержится запись арифметического выражения.Определить, какие арифметические операции использованы в этомвыражении.27. В строке содержится запись арифметического выражения.Определить, какие цифры есть в этом выражении.28. В строке содержится запись арифметического выражения.Определить, каких цифр нет в этом выражении.

322

Page 323: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

29. В строке содержится запись арифметического выражения.Определить, есть ли в записи этого выражения скобки.30. Слова в тексте разделены пробелами. Определить, есть ли в этомтексте слова, начинающиеся с заданной буквы.

5.12. Тема «Записи»

1. Распечатать список учеников, фамилии которых начинаются набукву «В», и указать даты их рождения.2. Из имеющегося списка спортсменов распечатать данные о тех изних, кто занимается плаванием. Указать возраст и сколько лет онизанимаются спортом.3. Вычислить средний балл успеваемости учеников класса, еслиизвестны оценки каждого из них по математике, русскому языку ифизике. Распечатать список учеников, имеющих средний балл вышесреднего балла в классе.4. Распечатать фамилии рабочих бригады, начинающиеся с букв «А»и «С», с указанием их месячной зарплаты.5. Из ассортимента конфет, выпускаемых пермской кондитерскойфабрикой, выбрать наименования, стоимость 1 кг которых составляет от100 до 150 р. Указать срок годности этих конфет и номера магазинов, вкоторых они имеются в продаже.6. Распечатать список учеников музыкальной школы, которые учатсяиграть на скрипке. Указать, сколько лет они занимаются музыкой ипринимали ли участие в каких-либо конкурсах.7. Найти фамилии работников данного предприятия, чья заработнаяплата за месяц ниже средней по этому предприятию, а также распечататьсписок проработавших здесь более 10 лет с указанием их фамилий,зарплаты, стажа работы и должности.8. Распечатать фамилии учеников школы, не получивших ни одной«тройки» за последнюю четверть. Определить, в каких классах учатсяэти ученики и каков средний балл их успеваемости.9. Распечатать фамилии детей детского сада, которые родились взаданном месяце с указанием их возраста и группы.10. Распечатать список учителей школы, которые преподаютматематику и информатику с указанием стажа их работы и недельнойнагрузки.11. Распечатать анкетные данные учеников, участвовавших волимпиаде по информатике и получивших не менее 30 баллов.12. Распечатать фамилии учеников класса, которые являютсяхорошистами и отличниками по итогам года. Указать, на сколько ихсредний балл отличается от среднего балла класса.13. Имеются сведения об учениках класса. Определить среднююмассу мальчиков, средний рост девочек и кто из учеников класса самыйвысокий.

323

Page 324: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

14. Результаты переписи населения хранятся в памяти ЭВМ.Напечатать фамилии, имена и определить общее число жителей,родившихся после 1990 г.15. При поступлении в университет абитуриенты, получившиенеудовлетворительную оценку на первом экзамене, ко второму экзаменуне допускаются. Считая фамилии абитуриентов и их оценки послепервого экзамена исходными данными, составить список допущенных ковторому экзамену.16. Назначить стипендии студентам по результатам сессии, используяследующие правила:

а) если все оценки 5 баллов, назначается повышенная стипендия;б) если оценки 4 и 5 баллов, назначается обычная стипендия;в) если есть оценка 3 балла, стипендия не назначается.В результате должны быть напечатаны список группы с оценками и

средним баллом каждого студента и два списка студентов, которымназначены повышенная и обычная стипендии.17. В таблице хранятся следующие данные об учениках: фамилия,имя, отчество, рост, масса. Вычислить средний рост учеников, а такжерост самого высокого и самого низкого учеников. Определить, сколькоучеников могут заниматься в баскетбольной секции, если ростбаскетболиста должен быть больше 170 см.18. В аптечном складе хранятся лекарства. В специальной ведомостисодержатся сведения о лекарствах: наименование препарата, егоколичество, цена и допустимый срок хранения в месяцах. Определить,сколько стоят самый дорогой и самый дешевый препараты; скольконименований препаратов хранится на складе, какой препарат имеет срокхранения более трех месяцев и сколько стоят все препараты, хранящиесяна складе.19. В столовой предлагается N комплексных обедов, состоящих из Qблюд. Известны стоимость и калорийность каждого блюда. Определить,сколько стоят самый дешевый и самый дорогой обеды и сколько калорийсодержит самое калорийное блюдо.20. Торговый склад производит уценку хранящейся продукции: еслипродукция хранится на складе больше п месяцев, она уценивается в 2раза, а если срок ее хранения превысил т месяцев (где m < я), но недостиг п, в 1,5 раза. Ведомость уценки должна содержать следующуюинформацию: наименование товара, количество товара, цена товара доуценки, срок хранения товара, цена товара после уценки, общаястоимость товара до уценки, общая стоимость товара после уценки.Определить максимальный и минимальный сроки хранения товаров наскладе, а также максимальную и минимальную стоимость товаров доуценки и после уценки.21. В соревнованиях принимают участие jV спортсменов-много-борцев по М видам спорта. По каждому виду спорта спортсмен

324

Page 325: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

набирает определенное количество очков. Вычислить сколько очков всумме набрал каждый спортсмен после окончания соревнований, а такжеразницу в очках спортсменов, занявших первое и последнее места.22. Тестирование проходили Мучеников по Мтестам предмета.Определить, сколько очков набрал каждый ученик по всем темам, атакже средний балл, полученный учениками, и разницу между лучшимрезультатом и средним баллом.23. Описать переменную «служащий», включающую в себя имя,фамилию, отчество служащего, дату его рождения, сведения обобразовании, профессии и домашний адрес. Определить именаслужащих с высшим образованием и получить данные о служащих,имеющих указанную профессию.24. Описать переменную «круг», содержащую все данные дляпостроения круга в декартовой системе координат. Определитькоординаты центра, площадь и длину окружности круга с минимальнымрадиусом, содержащего внутри себя все заданные круги. Рассматриваяокружности попарно, определить координаты точек пересечения илиточки касания для каждой пары либо вывести сообщение об отсутствииобщих точек.25. Описать переменную «экзаменационная ведомость», содержащуюследующие сведения: наименование предмета, номер группы, номеразачетных книжек, фамилии и инициалы студентов, а также их оценки поитогам текущей сессии. Определить, сколько в группе отличников,хорошистов, троечников и двоечников.26. Создать записи, определяющие положение точки в декартовой иполярной системах координат. По заданному массиву координат точек вдекартовой системе получить соответствующий массив координатзаданных точек в полярной системе.27. Дан массив квадратных трехчленов, каждый из которых имееткомплексные коэффициенты. Сформировать массив корней этихтрехчленов и массив их значений в точке x=c + di.28. Дан массив записей, содержащих дату (число, месяц, год) и время(час, минута, секунда). Упорядочить этот массив данных в порядкевозрастания, т.е. от более ранних значений к более поздним.29. Описать переменную «расписание», содержащую следующиеданные: день недели, количество учебных пар в указанный день, времяначала и конца каждой пары, название предмета, фамилиюпреподавателя. Вывести всю информацию о занятиях, относящихся кпредметной области «Информатика».30. В библиотеке имеются книги, газеты, журналы. Для каждогопечатного издания указать: название; год выпуска (для книг) или датувыпуска (для газет и журналов); фамилии автора (для книги), редактора(для газеты) или членов редколлегии (для журнала); объем. Вывестиинформацию об изданиях, вышедших в заданном году.

325

Page 326: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

31. Задать запись, содержащую информацию о движении элек-тропоездов из указанного города: направление, время отправления,время нахождения в пути до конечного пункта, стоимость билетов позонам. Вывести перечень электропоездов, следующих в заданномнаправлении.

5.13. Тема «Файлы»

5.13.1. Типизированные числовые файлы

1. Заполнить файл последовательного доступа/целыми числами,полученными с помощью генератора случайных чисел. Получить вфайле g компоненты файла /, являющиеся четными.2. Записать в файл последовательного доступа N действительныхчисел. Вычислить произведение компонентов файла и вывести их напечать.3. Заполнить файл последовательного доступа/целыми числами,полученными с помощью генератора случайных чисел. Получить вфайле g все компоненты файла f которые делятся на т и не делятся на п.4. Записать в файл последовательного доступа N целых чисел,полученных с помощью генератора случайных чисел. Определитьколичество пар противоположных чисел среди компонентов этого файла.5. Заполнить файл последовательного доступа/целыми числами,полученными с помощью генератора случайных чисел. Из файла/получить файл g, исключив повторные вхождения чисел. Вывести файлg на печать.6. Записать в файл последовательного доступа N произвольныхнатуральных чисел. Переписать в другой файл последовательногодоступа числа, кратные К. Вывести полученный файл на печать.7. Заполнить файл последовательного доступа ^действительнымичислами, полученными с помощью датчика случайных чисел. Найтисумму минимального и максимального чисел этого файла.8. Записать в файл последовательного доступа N натуральных чисел:аи а 2 , а„, полученных с помощью датчика случайных чисел.Сформировать новый файл последовательного доступа с числами Д],а ха 2 , а\а 2а г , ..., а ха 2а^х ... х а„.9. Записать в файл/последовательного доступа N натуральных чисел.Получить в другом файле последовательного доступа все числа файла/,кроме чисел, кратных К. Вывести полученный файл на печать.10. Заполнить файл / целыми числами, полученными с помощьюгенератора случайных чисел. Найти количество удвоенных нечетныхчисел среди компонентов этого файла.

326

к

Page 327: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

11. Заполнить файл /натуральными числами, полученными спомощью генератора случайных чисел. Найти количество квадратовнечетных чисел среди компонентов этого файла.12. Записать в файл прямого доступа ./V действительных чисел.Найти наибольшее из модулей компонентов с нечетными номерами этогофайла.13. Заполнить файл /целыми числами, полученными с помощьюгенератора случайных чисел. Из файла / получить файл g, исключивповторные вхождения чисел. Порядок следования чисел сохранить.14. Записать в файл последовательного доступа ./Vдействительныхчисел. Найти разность первого и последнего чисел этого файла.15. В файл /записать N целых чисел, полученных с помощьюгенератора случайных чисел. Заполнить файл g числами, которыеявляются произведениями соседних чисел файла /16. Записать в файл последовательного доступа п элементов

последовательности bn = 1 - — + ----------— + ...+ (- 1)л_| —. Вывести на2! 3! 4! п\

печать компоненты этого файла, для которых выполняется условие |£„|>е (где е — заданное число).17. Записать в файл последовательного доступа действительныхчисел аи а 2 , ..., а„. Создать новый файл последовательного

доступа, элементы которого вычисляются по формуле Ь-—_—. Вывести

полученный файл на печать.

5.13.2. Файлы записей

1. Багаж пассажира характеризуется количеством и общей массойвещей. Дан файл Bagazh, содержащий сведения о багаже несколькихпассажиров. Сведения о багаже каждого пассажира представляют собойзапись с двумя полями: одно поле целого типа (количество вещей) и однополе действительное (масса вещей в килограммах). Определить:

а) багаж, средняя масса одной вещи в котором отличается не болеечем на т [кг] от общей средней массы одной вещи;

б) число пассажиров, имеющих более двух вещей, и число пас-сажиров, количество вещей которых превосходит среднее;

в) имеется ли пассажир, багаж которого состоит из одной вещимассой менее т [кг].2. Дан файл Bibl, содержащий сведения о книгах. Сведения о каждойиз книг включают в себя фамилию автора, название книги и год издания.Определить:

327

Page 328: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

а) названия книг указанного автора, изданных с 1960 г.;б) имеется ли книга с названием «Информатика». Если имеется,

вывести на печать фамилию ее автора и год издания. Если таких книгнесколько, вывести имеющиеся сведения обо всех этих книгах.3. Дан файл Т, содержащий номера телефонов сотрудниковучреждения с указанием их фамилий и инициалов. Найти номертелефона сотрудника по его фамилии и инициалам.4. Дан файл, содержащий различные даты, включающие в себя число,месяц и год. Найти:

а) год с наименьшим номером;б) все весенние даты;в) самую позднюю дату.

5. Дан файл Tovar, содержащий сведения об экспортируемых товарахс указанием наименований этих товаров, стран-импорте- ров и объемовпоставляемых партий в штуках.

Составить список стран, в которые экспортируется заданный товар, иобщий объем его экспорта.6. Дан файл Assort, содержащий сведения об игрушках: названиеигрушки, ее стоимость в рублях и возрастные границы (например,игрушка может предназначаться для детей от двух до пяти лет).Определить:

а) названия игрушек, цена которых не превышает 14 тыс. р. икоторые подходят детям пяти лет;

б) стоимость самого дорогого конструктора;в) названия наиболее дорогих игрушек (цена которых отличается от

цены самой дорогой игрушки не более чем на 5 тыс. р.);г) названия игрушек, которые подходят детям и четырех, и десяти

лет;д) можно ли подобрать игрушку (любую, кроме мяча), подходящую

ребенку трех лет;е) название самой дешевой игрушки;ж) название самой дорогой игрушки для детей до четырех лет;з) названия игрушек для детей от четырех до пяти лет;и) название самой дорогой игрушки, подходящей детям от двух до

трех лет;л) стоимость самой дорогой куклы;м) стоимость кукол для детей шести лет;н) для детей какого возраста предназначается конструктор;о) для детей какого возраста предназначены кубики и указать их

среднюю стоимость.7. Дан файл TV, содержащий сведения о программах телепередач нанеделю: день недели, время, канал, вид и название телепередачи.Определить:

а) названия телепередач, которые идут в указанный день вуказанный промежуток времени;

328

Page 329: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

б) названия телепередач, которые идут в указанный день науказанном канале;

в) информацию об указанном фильме. Если этот фильм не указан втелепрограмме, вывести на экран сообщение «Такой передачи на даннойнеделе нет»;

г) на каком канале и в какое время будет транслироваться раз-влекательная передача «Поле чудес»;

д) есть ли передача, транслирующаяся больше одного раза в одно ито же время, и если есть, то какая;

е) названия телепередач, транслирующихся в указанное время наразных каналах;

ж) название самой продолжительной передачи в понедельник;з) название передачи, завершающей эфир в каждый день недели.

8. Дан файл, содержащий сведения о безработных: специальность,опыт работы, образование, пол, возраст. Требуется:

а) подобрать кандидатов на должность врача с опытом работы неменее пяти лет;

б) найти работников с высшим экономическим образованием нестарше 35 лет;

в) найти работников, имеющих опыт работы в сфере торговли;г) получить полную информацию обо всех женщинах в возрасте от 20

до 40 лет;д) определить средний возраст всех мужчин, ищущих работу;е) выяснить, кого в базе данных больше с высшим образованием:

женщин или мужчин;ж) найти п самых молодых работников.

5.13.3. Текстовые

файлы Уровень

сложности А

Исходные текстовые файлы для следующих задач создаются спомощью какого-либо текстового редактора.1. Дан файл, содержащий текст, набранный строчными русскимибуквами. Получить в другом файле тот же текст, записанныйпрописными буквами.2. Дан файл, содержащий произвольный текст. Определить, чего в нембольше: русских букв или цифр.3. Дан файл, содержащий текст на русском языке. Определить, входитли заданное слово в указанный текст, и если входит, то сколько раз.4. Дан файл, содержащий текст на русском языке. В предложенияхнекоторые слова повторяются подряд несколько раз (предложениязаканчиваются точкой или знаком восклицания). Получить в новом файлеотредактированный текст, в котором удалены повторные вхождения слов

329

Page 330: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

5. Дан файл, содержащий текст, набранный прописными русскимибуквами. Провести частотный анализ текста, т. е. указать (в процентах)сколько раз встречается та или иная буква.6. Дан файл, содержащий текст на русском языке. Определить,сколько раз встречается в нем самое длинное слово.7. Дан файл, содержащий произвольный текст. Проверить, правильноли в нем расставлены круглые скобки (т.е. находится ли правее каждойоткрывающейся скобки закрывающаяся, и левее каждой закрывающейся— открывающаяся).8. Дан файл, содержащий текст на русском языке. Составить валфавитном порядке список всех слов, встречающихся в этом тексте.9. Дан файл, содержащий текст на русском языке. Определить,сколько раз встречается в нем самое короткое слово.10. Дан файл, содержащий текст на русском языке и два слова.Определить, сколько раз эти два слова входят в текст и сколько раз онирасполагаются непосредственно друг за другом.11. Дан файл, содержащий текст на русском языке. Выбрать из негобуквы, встречающиеся только один раз в порядке их расположения.12. Дан файл, содержащий текст и арифметические выражения вида а® Ь, где <8> — один из арифметических знаков (+, *, /). Выписать всеарифметические выражения и вычислить их значения.13. Дан файл, содержащий текст на русском языке и букву. Найтислово, в котором указанная буква содержится наибольшее число раз.14. Дан файл, содержащий текст на русском языке и букву.Определить, сколько слов начинается с этой буквы.15. Дан файл, содержащий текст на русском языке. Найти слово,встречающееся в каждом предложении этого текста, или сообщить, чтотакого слова нет.16. Дан файл, содержащий текст, включающий в себя русские ианглийские слова. Определить, каких букв в тексте больше: русских илилатинских.17. Дан файл, содержащий текст. Определить, сколько слов в этомтексте и сколько цифр.18. Дан файл, содержащий текст, включающий в себя русские ианглийские слова. Получить новый файл, заменив в исходном тексте всепрописные буквы строчными, и наоборот.19. Дан файл, содержащий зашифрованный русский текст, т.е. каждаябуква исходного текста заменена следующей за ней буквой, а буква «я»заменена буквой «а». Получить в новом файле расшифровку заданноготекста.20. Даны два текстовых файла f и /2. Файл f содержит произвольныйтекст, слова в котором разделены пробелами и знаками препинания.Файл / содержит не более 30 слов, которые попарно разделены запятыми,причем каждое второе слово в паре являет

330

Page 331: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ся синонимом первого. Получить новый файл, заменив слова в файле /|по возможности синонимами из файла /2.21. Дан текстовой файл. Удалить из него все лишние пробелы,оставив не более одного пробела между словами. Результат поместить вновый файл.22. Даны текстовой файл и слово. Напечатать строки файла,содержащие указанное слово.23. Дан текстовой файл. Напечатать в алфавитном порядке все словаиз этого файла, имеющие заданную длину п.24. Текстовой файл содержит запись многочлена некоторой степени содной переменной х. Коэффициентами этого многочлена являютсяцелые числа. (Например, 5ха4-ЗхлЗ + 15хЛ2-4.) Определить степеньзаданного многочлена и его коэффициенты. Дописать в данный файлтаблицу значений указанного многочлена в интервале [а; Ь].25. Дан файл, содержащий текст на русском языке. Определитьколичество слов в этом тексте, начинающихся и заканчивающихся наодну и ту же букву.

Уровень сложности В

Исходные текстовые файлы создаются для следующих задачзаполнением их с помощью датчика случайных чисел.1. Дан файл, содержащий вещественные числа. Найти минимальноечисло.2. Дан файл, содержащий натуральные числа. Найти число смаксимальной суммой цифр.3. Дан файл, содержащий целые числа. Определить число с мак-симальным произведением цифр.4. Дан файл, содержащий натуральные числа. Получить новый файл,записав цифры каждого из заданных чисел в обратном порядке.5. Дан файл, содержащий вещественные числа. Определиь интервал,которому принадлежат все числа этого файла.6. Дан файл, содержащий натуральные числа. Определить количествочисел этого файла, оканчивающихся заданной цифрой.7. В заданном файле определить максимальное количество подрядидущих положительных чисел.8. Найти сумму элементов файла, содержащего натуральные числа,которые оканчиваются на заданную цифру.9. Найти сумму четных элементов файла, содержащего целые числа.10. Определить количество нечетных отрицательных элементов вфайле, содержащем целые числа.11. Определить минимальное нечетное число в файле, содержащемцелые числа.

331

Page 332: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

12. Дан файл, содержащий натуральные числа. Получить новыйфайл, приписав к каждому из чисел исходного файла цифРУ к.13. Напечатать True, если заданный файл вещественных чиселупорядочен, и False — в противном случае.14. Имеется упорядоченный файл. Вставить в него заданное числотаким образом, чтобы упорядоченность сохранилась.15. Прочитать из файла двухмерный массив чисел размером п х т ,транспонировать его и записать полученную матрицу в новый файл. (Впервой строке файлов записывается размер массива.)16. Дан файл. Сравнить в нем количество положительных и от-рицательных чисел. Если положительных чисел больше, дописать вконце этого файла 1, если больше отрицательных чисел, дописать -1, аесли их равное количество, дописать 0.17. Дан файл, в котором имеется единственный элемент, нарушающийего упорядоченность. Удалить этот элемент.18. Дан упорядоченный файл. Дописать в начале и конце этого файлапо одному числу таким образом, чтобы упорядоченность сохранилась.19. Сформировать из элементов данного файла матрицы второгопорядка и указать среди них матрицу с наибольшим определителем.(Если для последней матрицы элементов файла недостает, дополнитьматрицу нулями.)20. Дан файл. Переписать его элементы в два новых файла: в один —элементы, которые меньше среднего арифметического всех компонентовзаданного файла, а в другой — которые больше.21. Используя вещественные величины из заданного файла какаргументы функции у = cos х , получить в новом файле эти аргументы исоответствующие им значения в виде двух столбцов.22. Используя вещественные величины из заданного файла какаргументы функции y = cos х , определить, какому аргументу со-ответствует наименьшее значение этой функции.23. Определить, какое количество элементов заданного файла входитв указанный интервал.24. Дан файл натуральных чисел. Просуммировать числа этого файла,начинающиеся с указанной цифры.25. Дан файл натуральных чисел. Найти среди чисел с указаннымколичеством цифр минимальное.26. Определить, какое число в заданном файле целочисленныхвеличин встречается чаще других.27. Из файла /получить файл g , исключив повторные вхождениячисел и сохранив порядок их следования.28. Дан файл вещественных величин. Заменить элементы в немзначениями, округленными до целых чисел.

332

Page 333: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

29. Заменить элементы заданного файла абсолютными значениями иуказать количество выполненных замен.30. Дан файл. Дописать в конце этого файла первую цифру каждогоиз составляющих его чисел в порядке их следования.

5.14. Тема «Модули»

1. Реализовать в виде модуля набор подпрограмм для выполненияследующих операций с комплексными числами:• сложение;• вычитание;• умножение;• деление;• модуль;

• возведение в степень п (где п — натуральное число). Комплексное число представить следующим образом:

Type Complex = Record R

: Real; M : Real

End;

Используя разработанный модуль, решить следующие задачи:а) дан массив А комплексных чисел. Получить массив С, элементами

которого будут модули сумм рядом стоящих комплексных чисел;б) дан массив А [ М \ комплексных чисел. Получить матрицу B[N,

М), каждая строка которой является результатом возведения в степень,равную номеру этой строки, заданного массива А.2. Реализовать в виде модуля набор подпрограмм для выполне-

Рния следующих операций с обыкновенными дробями вида — (где

Р — целое число, Q — натуральное число):• сложение;• вычитание;• умножение;• деление;• сокращение;• возведение в степень п (где п — натуральное);• отношения (равно, не равно, больше или равно, меньше или равно,больше, меньше) в форме функции.

Дробь представить следующим образом:

333

Page 334: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Используя разработанный модуль, решить следующие задачи:а) дан массив А обыкновенных дробей. Найти сумму всех дробей

массива, и представить ответ в виде несократимой дроби. Вычислитьсреднее арифметическое всех дробей массива, и представить ответ ввиде несократимой дроби;

б) дан массив А обыкновенных дробей. Отсортировать его в порядкевозрастания.3. Реализовать в виде модуля набор подпрограмм для выполненияследующих операций с квадратными матрицами:• сложение двух матриц;• умножение одной матрицы на другую;• нахождение транспонированной матрицы;• вычисление определителя матрицы.

Матрицу описать следующим образом:

Const NMax = 10;

Type Matrica = Array [l..NMax, l..Nmax] Of Real;

Используя разработанный модуль, решить следующие задачи:а) систему линейных уравнений N-го порядка (2 < N < 10) методом

Крамера;б) отсортировать заданный массив величин типа Matrica в порядке

возрастания значений определителей матриц;в) найти матрицу С, равную А х В - В х А, если заданы величины А

и В типа Matrica.4. Реализовать в виде модуля набор подпрограмм для выполненияследующих операций с векторами:• сложение;• вычитание;• скалярное умножение;• умножение на число;• определение длины вектора.

Вектор представить следующим образом:

Туре Vector = Record X, Y : Real End;

Используя разработанный модуль, решить следующие задачи:а) дан массив А векторов. Отсортировать его в порядке убывания

длин векторов;б) с помощью датчика случайных чисел создать 2N целых чисел,

334

Page 335: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• сложение;• вычитание;• умножение;• деление;• перевод из десятичной системы в Р-ичную;• перевод из Р-ичной системы в десятичную;• проверка правильности записи числа в Р-ичной системе в видефункции;• отношения (равно, не равно, больше или равно, меньше или равно,больше, меньше) в виде функции.

Р-ичное число представить следующим образом:

Type Chislo = Array [1..16] Of 0..9;

Используя разработанный модуль, решить следующие задачи:а) возвести число в степень, основание и показатель которой

записаны в Р-иной системе счисления. Ответ получить в Р-ичной идесятичной системах счисления;

б) дан массив А чисел, записанных в Р-ичной системе счисления.Отсортировать его в порядке убывания. Ответ получить в Р-ичной идесятичной системах счисления.6. Реализовать в виде модуля набор подпрограмм для выполненияследующих операций с натуральными числами в шестнадцатеричнойсистеме счисления:• сложение;• вычитание;• умножение;• деление;• перевод из двоичной системы в шестнадцатеричную;• перевод из шестнадцатеричной системы в десятичную;• проверка правильности записи числа в шестнадцатеричной системесчисления в виде функции;• отношения (равно, не равно, больше или равно, меньше или равно,больше, меньше) в виде функции.

Используя разработанный модуль, решить следующие задачи:а) возвести число в степень, основание и показатель которой

записаны в шестнадцатеричной системе счисления. Ответ получить вшестнадцатеричной и десятичной системах счисления;

б) дан массив А чисел, записанных в шестнадцатеричной системесчисления. Отсортировать его в порядке убывания. Ответ получить вшестнадцатеричной и десятичной системах счисления.7. Определим граф как набор точек, некоторые из которых соединенылиниями, а подграф как граф или подмножество данного графа.

Реализовать в виде модуля набор подпрограмм, определяющих:

335

Page 336: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• число точек в графе;• число отрезков в графе;• число изолированных подграфов в графе, т.е. подграфов, несоединенных линиями;• диаметр графа, т.е. длину максимальной незамкнутой линии в графе(длина каждого звена — 1);• граф — объединение двух графов;• подграф — пересечение двух графов;• подграф — дополнение заданного графа до полного (графа с тем жеколичеством вершин, что и в заданном, и с линиями между любымидвумя вершинами);• число отрезков, выходящих из каждой вершины графа;

При запуске должны инициализироваться следующие переменные:FullGraph — полный граф с числом вершин NumberOfVertix; Null Graph— граф без отрезков с числом вершин NumberOfVertix.

Граф представить как объект:

Const NumberOfVertix = 50;

Type Graph = Array[1..NumberOfVertix,

1.. NumberOfVertix] Of Boolean;

Используя разработанный модуль, найти все правильные графы из Nвершин. (Граф является правильным, если из всех вершин выходитравное количество отрезков.)8. Реализовать в виде модуля набор подпрограмм для выполненияследующих операций с длинными числами:• сложение;• вычитание;• умножение;• нахождение частного и остатка от деления одного числа на другое;• отношения (равно, не равно, больше или равно, меньше или равно,больше, меньше) в виде функции.

Длинное число представить следующим образом:

Type Tsifra = 0..9;

336

Page 337: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• сложение;• вычитание;• умножение;• деление с остатком;• отношения (равно, не равно);• возведение в натуральную степень к;• вычисление производной от многочлена;• вычисление значения в точке Ло.

Многочлен представить следующим образом:

Type Mnogochlen = Array [1..500] Of Integer;

Используя разработанный модуль, решить следующие задачи:а) найти наибольший общий делитель многочленов Р(х) и Q(x).б) вычислить выражение Ps(x) - Qr(x).

10. Разработать способ представления множеств, содержащих более255 элементов (до 2 000), и создать модуль, позволяющий выполнятьследующие операции с элементами таких множеств:• объединение;• пересечение;• вычитания;• проверка принадлежности элемента множеству;• проверка, является ли данное множество подмножеством (над-множеством) другого в виде функции.

Используя созданный модуль, решить следующие задачи:а) дан массив множеств. Упорядочить элементы этого массива в

порядке возрастания количества компонентов соответствующихмножеств;

б) ввести несколько множеств и выражение, операндами которогоявляются эти множества, с операциями объединения, пересечения ивычитания. Вычислить значение этого выражения и вывести результат.11. Реализовать модуль для работы с базой данных определеннойструктуры (задать самостоятельно), хранящейся в файле. Пре-дусмотреть следующие действия:• добавление записи в базу в конец файла;• удаление записи (записей) из базы по определенному критерию(заданному значению одного из полей);• сортировку записей в базе по одному из полей (т.е. разработкуобщего алгоритма сортировки с использованием нетипизиро- ванныхпараметров) и запись результата сортировки в новый файл;• выборку записей из базы по определенному критерию (заданномузначению одного из полей) и запись их в другой файл;• добавление записи в отсортированную базу с сохранениемупорядоченности по выбранному критерию.

Page 338: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Используя разработанный модуль, решить следующие задачи:а) имеется две базы данных заданной структуры, упорядоченные по

одному и тому же признаку. Добавить все компоненты второй базы впервую, сохранив ее упорядоченность;

б) выбрать и поместить в текстовый файл записи, отвечающие двум-трем критериям одновременно.12. Разработать модуль для работы с обыкновенными дробями,числителем и знаменателем которых являются длинные числа.

При описании использовать следующие типы:

Type Dl_Ch = Array[1..1024] Of 0..9;

Drob = Record Chisl, Znam : Dl_Ch End;

В модуле должны быть представлены следующие операции:• сложение;• вычитание;• умножение;• деление;• сокращение;• выделение целой части;• отношения в виде логических функций.

Используя разработанный модуль, найти разность минимального имаксимального элементов заданного массива обыкновенных дробей.13. Разработать в виде модуля набор подпрограмм для выполненияследующих операций с числами, записанными в римской системесчисления:• перевод натурального числа из десятичной системы счисления вримскую;• перевод числа из римской системы счисления в десятичную;• сложение;• вычитание;• умножение;• целочисленное деление и нахождение остатка от деления;• отношения (всех шести) в виде логических функций.

Используя разработанный модуль, решить следующие задачи:а) дан массив чисел, записанных в римской системе счисления.

Выполнить сортировку этого массива и вывести ответ в десятичной иримской системах счисления;

б) даны два массива натуральных чисел. В одном из них числазаписаны в десятичной системе счисления, в другом — в римской.Выписать числа, которые встречаются и в том, и в другом массиве, илисообщить об их отсутствии. В случае положительного ответа результат338

Page 339: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

14. Реализовать модуль, обеспечивающий работу стека — стру-ктуры данных, в которой доступным является единственный элемент,помещенный в эту структуру последним. (Здесь действует принцип«последний пришел, первый ушел». Указатель на доступный элементназывается вершиной стека.)

Стек описать следующим образом:

Type Stek = Record А : Array[1..1024] Of Integer;

Vershina : 0..1025 End;

Разрабатываемый модуль должен содержать следующие подпрог-раммы:• включение элемента в стек;• извлечение элемента из стека;• проверка стека на пустоту (вершина имеет значение 0);• проверка стека на переполнение (вершина имеет значение 1 025);• проверка, равно ли число, на которое указывает вершина стека,заданному числу к.

Используя разработанный модуль, решить следующие задачи:а) дан текстовый файл, в каждой строке которого содержится запись

одного арифметического выражения в обратной польской записи.Вычислить значения каждого из этих выражений и в том же порядкедописать в конец файла;

б) перевернуть заданную строку, т. е. поместить в стек последо-вательно коды всех символов строки, а затем последовательно извлекатьих и формировать новую строку.15. Реализовать модуль для работы с длинными строками.

Длинную строку определить следующим образом:

Type LongString = Array[1..4] Of String;

Разрабатываемый модуль должен содержать подпрограммы, по-зволяющие:• вводить длинную строку;• выводить длинную строку;• выполнять операции с длинными строками (склеивания, от-ношения);• дублировать процедуры и функции, принятые для строки обычноготипа String.

Используя разработанный модуль, решить следующие задачи:а) отсортировать заданный массив длинных строк;б) определить, сколько раз встречается заданная последовательность

339

Page 340: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

п а„ => л-1 => ... =S> 1 Я| => 0 а0 nil

Многочлен S(x) = 52х40 - Зх8 + х можно представить в виде

S => 40 52 => 8 -3 => 1 1 nil

Описать на языке Паскаль тип данных, соответствующий такомупредставлению многочленов, и определить следующие процедуры ифункции для работы с этими списками-многочленами:

а) логическую функцию Ravno(P, Q), проверяющую на равенствомногочлены Р и Q;

б) функцию Znach(P, х), вычисляющую значение многочлена Р вцелочисленной точке х;

340

Page 341: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

в) процедуру Diff(P, Q), строящую многочлен Q — производнуюмногочлена Р;

г) процедуру Slozh(P, Q, R), строящую многочлен R— суммумногочленов Q и Р;

д) процедуру Print (Р, v), печатающую многочлен Р как многочлен отпеременной, однобуквенное имя которой является значением литерногопараметра v. Например, для указанного ранее многочлена S процедураPrint (S, 'у') должна напечатать 52уТ40 - - ЗуТ8 + у;

е) процедуру Vvod (Р), считывающую из входного файла без-ошибочную запись многочлена (см. п. «д») (за ней пробел) и фор-мирующую соответствующий список-многочлен Р.

Для заданного многочлена Р(х) степени п получить многочлен Р\х).Для заданного многочлена Р(х ) степени п получить многочлен Р(х

+ 1 ) - Р(х) и определить степень полученного многочлена.1. Упорядочить в порядке возрастания элементы однонаправ-ленного списка.2. Заполнить список последовательностью случайных различныхцелых чисел и просуммировать элементы этого списка, расположенныемежду минимальным и максимальным элементами (если минимальныйэлемент предшествует максимальному).3. Дан список, содержащий целые числа. Сформировать из егоэлементов, абсолютные значения которых являются простыми числами,новый список.4. Дан список, содержащий натуральные числа. Удалить из негоэлементы, кратные заданному числу к.5. Дан список, элементами которого являются следующие векторы:

(Const NMax = 200; Type Vector = Array [l..NMax] OfReal;).

Сформировать список из длин этих векторов.6. Элементами списка являются имена существительные, за-писанные в именительном падеже (строки длиной не более 15 сим-волов). Добавить за каждым существительным все его падежи.7. Дан список, содержащий целые числа. Определить количестворазличных элементов этого списка.8. Даны упорядоченные списки L{ и Ь2. Вставить элементы спискаL 2 B список Ь Ь не нарушая его упорядоченности.9. Дан список, содержащий запись неотрицательных целых чисел вдвоичной системе счисления. Заменить каждый элемент списка егозаписью в шестнадцатеричной системе счисления.

341

Page 342: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

10. Дан список, содержащий обыкновенные дроби вида —,

(где Р — целое число, Q — натуральное число). Просуммироватьмодули этих дробей. Ответ представить в виде обыкновенной не-сократимой дроби.11. Найти среднее арифметическое элементов непустого одно-направленного списка вещественных чисел, заменить в нем все числа хна число у, поменять местами первый и последний элементы ипроверить, упорядочены ли числа в списке по возрастанию.12. Дан список вещественных чисел. Описать следующие функции:

а) проверки, есть ли в списке два одинаковых элемента;б) переноса в начало списка последнего элемента;в) переноса в конец списка первого элемента;г) вставки этого списка за первым входящим в него числом х.

13. Дан список строк. Написать следующие подпрограммы:а) изменить ссылки в списке таким образом, чтобы его элементы

оказались расположены в противоположном порядке (обращениесписка);

б) оставить в списке только один из каждой группы подряд идущихэлементов;

в) оставить в списке только первые вхождения одинаковыхэлементов.14. Даны два списка Lx и L2 пар вещественных чисел. Написатьподпрограммы возвращения нового списка L, включающего в себя:

а) пары списка Ьх, первая координата которых встречается как втораякоордината пар списка Ь2;

б) пары (х, у) списка Lx, встречающиеся в виде (у, х) в списке L2,в) пары (х, у) списка Lx, в которых х < у.

15. Даны два списка Lx и Ь2 вещественных чисел. Написать под-программы возвращения нового списка L, который включает в себя поодному разу следующие числа:

а) входящие одновременно в оба списка;б) входящие хотя бы в один из списков;в) входящие только в один из списков: Lx или Ь2,г) входящие в список L x , но не входящие в список L2.

16. Целое длинное число представляется строкой цифр. Упорядочитьпо неубыванию цифры этого числа.17. Дан список слов, среди которых есть пустые. Написать сле-дующие подпрограммы:

а) переставляющую местами первое и последнее непустые слова;б) печатающую текст из первых букв непустых слов;в) удаляющую из непустых слов первые буквы;

342

Page 343: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

г) определяющую количество слов в непустом списке, отличных отпоследнего слова.18. Описать следующие рекурсивные функции или процедуры:

а) определяющую, входит ли элемент Е в список L\б) подсчитывающую число вхождений элемента Е в список L\в) находящую максимальный элемент непустого списка;г) печатающую в обратном порядке элементы списка;д) заменяющую в списке L все вхождения элемента Ех на Е2,е) удаляющую из списка L первое вхождение элемента Е, если оно

имеется;ж) удаляющую из списка L все вхождения элемента Е;з) создающую список Ьх — копию списка L\и) удваивающую каждое вхождение элемента Е в список L\к) находящую среднее арифметическое значение всех элементов

непустого списка L\л) преобразующую однонаправленный простой список L в кольцевой

и возвращающую адрес минимального элемента этого списка;м) переставляющую отрицательные элементы списка L в его начало,

не меняя при этом их порядок;н) удаляющую из целочисленного списка все элементы, имеющие

цифру к.19. Описать процедуру, которая в списке L заменяет первоевхождение списка Ьх (если оно имеется) на список Ь2.20. Пусть L обозначает кольцевой (циклический) двунаправленныйсписок с заглавным звеном, а Е — элемент, входящий в список. Описатьследующую функцию или процедуру:

а) определяющую, является ли список L пустым;б) печатающую в обратном порядке элементы непустого списка L;в) подсчитывающую количество элементов списка L, у которых

имеются равные «соседи»;г) определяющую, есть ли в списке L хотя бы один элемент, равный

следующему за ним (по кругу) элементу;д) переставляющую в списке L в обратном порядке все элементы

между первым и последним вхождениями элемента Е, если Е входит в Lне менее двух раз;

е) удаляющую из списка L первый отрицательный элемент, еслитакой элемент есть;

ж) удаляющую из списка L, содержащего не менее двух элементов,все элементы, у которых имеются одинаковые «соседи» (первый ипоследний элементы также считать «соседями»);

з) добавляющую в конец списка L новый элемент Е,и) удваивающую в списке L каждое вхождение элемента Е;к) создающую список L по однонаправленному списку

343

Page 344: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

л) добавляющую в конец непустого списка L все его элементы,располагая их в обратном порядке. Например, получение по списку изэлементов 1, 2, 3 списка из элементов 1, 2, 3,3, 2, 1.

5.16. Тема «Графика»

5.16.1.Черчение

1. В треугольной пирамиде построить сечение, параллельноеоснованию.2. В треугольной пирамиде построить сечение, проходящее черезбоковое ребро и медиану основания.3. В треугольной пирамиде построить сечение, проходящее черезодну из сторон основания и середину противоположного ребра.4. В треугольной пирамиде построить сечение, проходящее черезсреднюю линию боковой грани и противоположную вершину основания.5. В треугольной пирамиде провести сечение, проходящее черезсторону основания и наклоненное к нему под углом 30°.6. В правильной четырехугольной пирамиде провести сечение,проходящее через диагональ основания и вершину пирамиды.7. В правильной четырехугольной пирамиде провести сечение,проходящее через диагональ основания и середину бокового ребра.8. В правильной четырехугольной пирамиде провести сечение,проходящее через диагональ основания и наклоненное к нему под углом30°.9. В правильной четырехугольной пирамиде провести сечение,параллельное основанию и проходящее через середину бокового ребра.10. В правильной четырехугольной пирамиде провести сечение,проходящее через вершину пирамиды и перпендикулярное плоскостиоснования.11. В правильной четырехугольной пирамиде провести сечение,проходящее через одну из сторон основания и середину ее высоты.12. Основание четырехугольной пирамиды — ромб. Вершинапирамиды проектируется в центр симметрии ромба. Провести сечениечерез высоту основания, опущенную из тупого угла ромба, и боковоеребро, проходящее через эту же вершину.13. Основание четырехугольной пирамиды — ромб. Вершина пи-рамиды проектируется в вершину острого угла ромба. Провестисечение, проходящее через вершину пирамиды и высоту ромба,опущенную из тупого угла.

344

Page 345: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

14. В прямоугольном параллелепипеде провести диагональноесечение.15. В прямоугольном параллелепипеде провести сечение, про-ходящее через сторону нижнего основания и противоположную сторонуверхнего основания.16. В прямой четырехугольной призме провести сечение, про-ходящее через диагональ нижнего основания и одну из вершин верхнегооснования.17. В прямой четырехугольной призме провести сечение, про-ходящее через сторону нижнего основания под углом 30° к нему.18. В правильной шестиугольной призме провести сечение,проходящее через одну из сторон нижнего основания и противо-положную сторону верхнего основания.19. В прямоугольном параллелепипеде построить сечение, про-ходящее через одну из сторон нижнего основания и одну из вершинверхнего основания.20. В прямоугольном параллелепипеде построить сечение, про-ходящее через одно из его ребер и точку пересечения диагоналейпротиволежащей этому ребру грани.21. В правильной шестиугольной пирамиде построить сечение,проходящее через ее вершину и большую диагональ основания.22. В прямом цилиндре построить осевое сечение.23. В правильной шестиугольной призме построить сечение,проходящее через большую диагональ ее нижнего основания и одну изсторон верхнего основания.

5.16.2. Рисование

Составить программу получения на экране рисунков, изображенныхв табл. 5.2.

Таблица 5 .2

Заданные рисунки

345

Page 346: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ш\ trl

5

frЩш-шу

А /\ шШи

1)

9 1о

11 1 2

- •••

I /

Продолжение табл. 5.2

Page 347: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

346

Продолжение табл. 5.2

347

Page 348: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Продолжение табл. 5.2

348

Page 349: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Окончание табл. 5.2

5.16.3. Построение графиков

Построить графики функций, приведенных в подразд. 5.2.2 и 5.4.4.

Page 350: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

5.17. Тема «Объектно-ориентированноепрограммирование»

1. Спроектировать простое меню в одной строке экрана, котороеобеспечивает перебор пунктов нажатием клавиши пробела, позволяетзафиксировать выбор нажатием клавиши <Enter> или отказаться отвыбора нажатием клавиши <Esc>. После выбора одного из пунктов впрограмму должно возвращаться какое-то значение, связанное с этимпунктом, например какой-то символ, а при отказе от выбора — символы#27.

Перед началом работы следует передать меню названия пунктов ивозвращаемые символы (которыми могут быть первые буквы пунктовили какие-то специальные символы), что можно сделать в форме строкивида

«Первое Второе Третье»

или

«Первое (а) Второе (Ь) Третье (с)»

Здесь за названием пункта следует в скобках возвращаемый символ.Состояние меню характеризуется его координатами на экране,

номером отмеченного пункта, общим числом пунктов, перечнемназваний пунктов и возвращаемых символов (во втором вариантепредставления).

Методами объекта являются:Init — заполняет поле названий пунктов, подсчитывает число

пунктов, делает выбранным первый пункт;Select — позволяет выбрать пункт меню и возвращает символ

выбранного пункта, а при отказе от выбора возвращает символы #27;Draw — рисует меню, выделяя выбранный пункт цветом;LeftBoard — возвращает начало названия данного пункта;Len — возвращает длину названия пункта;WhatSel — возвращает символ выбранного пункта.

2. Создать новый объект TNeatMenu — «наследника» TMenu, ко-торый в отличие от своего «предка» будет восстанавливать вид экрана.Для этого следует добавить новое поле Store, где будет хранитьсяпрежний экран во время действия нового меню, перекрыть метод Init идобавить метод Done, восстанавливающий состояние экрана.3. Создать меню, изображающее себя в форме столбца. Для этогорационально использовать виртуальные методы, т.е. достаточноизменить метод Draw объекта TNeatMenu и объявить одноименные350

Page 351: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

4. Разместить объекты в динамической памяти, описав указатели наних.5. Построить сложное иерархическое меню, в котором пробел будетоткрывать главное меню, а последовательным нажатием клавиш <Enter>и пробела будет разворачиваться подсвеченный пункт в подменю или,если пункт находится на нижнем уровне, клавиша <Enter> будетсворачивать подменю. Нажатием клавиши <Esc> работа программыдолжна заканчиваться.6. Построить иерархическое меню, в котором пробел будет от-крывать главное меню, а нажатием клавиши <Enter> будет разво-рачиваться подсвеченный пункт в меню или, если пункт находится насамом нижнем уровне, нажатием клавиши <Enter> будет сворачиватьсяподменю. Нажатием клавиши <Esc> работа программы должназаканчиваться. Нижний уровень меню должен быть вертикальным.7. Построить систему классов для описания плоских геометрическихфигур: круга, квадрата, прямоугольника. Предусмотреть при этомметоды для создания объектов, перемещения на плоскости, измененияразмеров и вращения на заданный угол.8. Построить описание класса, содержащего информацию опочтовом адресе организации. Предусмотреть при этом возможностьраздельного изменения составных частей адреса, создания иуничтожения объектов этого класса.9. Составить описание класса для представления комплексных чиселс возможностью задания вещественной и мнимой частей как числамитипа double, так и целыми числами. Обеспечить при этом выполнениеопераций сложения, вычитания и умножения комплексных чисел.10. Составить описание класса для работы с цепными спискамистрок (строками произвольной длины). Обеспечить при этом вы-полнение операций включения в список, удаления из списка элемента сзаданным значением, удаления всего списка или конца списка, начиная суказанного элемента.11. Составить описание класса для объектов-векторов, задаваемыхкоординатами их концов в трехмерном пространстве. Обеспечить приэтом выполнение операций сложения и вычитания векторов сполучением нового вектора (суммы или разности), вычислениескалярного произведения двух векторов, длины вектора и косинуса угламежду векторами.12. Составить описание класса прямоугольников со сторонами,параллельными осям координат. Предусмотреть при этом возможностьперемещения прямоугольников на плоскости, изменения их размеров,построения наименьшего прямоугольника, содержащего два заданныхпрямоугольника, и прямоугольника, являющегося общей частью(пересечением) двух прямоугольников.

351

Page 352: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

13. Составить описание класса для определения одномерныхмассивов целых чисел (векторов). Предусмотреть при этом возможностьобращения к отдельному элементу массива с контролем выхода запределы индексов, задания произвольных границ индексов при созданииобъекта, выполнения операций поэлементного сложения и вычитаниямассивов с одинаковыми границами индексов, умножения и делениявсех элементов массива на скаляр, печати (вывода на экран) по индексамэлементов массива и всего массива.14. Составить описание класса для определения одномерных мас-сивов строк фиксированной длины. Предусмотреть при этом воз-можность обращения к отдельным строкам массива по индексам,контроль выхода за пределы индексов, выполнения операцийпоэлементного сцепления двух массивов с образованием новогомассива, слияния двух массивов с исключением повторяющихсяэлементов, печати (вывода на экран) элементов массива и всего массива.15. Составить описание класса многочленов от одной переменной,задаваемых степенью многочлена и массивом коэффициентов.Предусмотреть при этом методы вычисления значения многочлена длязаданного аргумента, операции сложения, вычитания и умножениямногочленов с получением нового объекта-многочлена, печать (вывод наэкран) описания многочлена.16. Составить описание класса одномерных массивов строк, каждаястрока которого задается длиной и указателем на выделенную для неепамять. Предусмотреть при этом возможность обращения к отдельнымстрокам массива по индексам, контроля выхода за пределы индексов,выполнения операций поэлементного сцепления двух массивов собразованием нового массива, слияния двух массивов с исключениемповторяющихся элементов, печати (вывода на экран) элементов массиваи всего массива.17. Составить описание объектного типа TMatr, обеспечивающегоразмещение матрицы произвольного размера, предусмотрев при этомвозможность изменения числа строк и столбцов, а также вывода наэкран подматрицы любого размера и всей матрицы.18. Составить программу обработки двунаправленных связанныхсписков. (Связанный список данных состоит из указателей на его началои конец, а каждый элемент такого списка представляет собойреализацию отдельного объекта.) При этом обеспечить возможностьследующих операций:• создание связанного списка (выделение для него памяти);• уничтожение связанного списка (освобождение используемойпамяти);• инициализация связанного списка;• деинициализация связанного списка;

352

Page 353: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

• вставка элемента в середину связанного списка перед суще-ствующим элементом;• присоединение элемента к концу связанного списка;• удаление элемента из связанного списка;• возвращение первого элемента связанного списка;• возвращение последнего элемента связанного списка.19. Определить объект TFish — аквариумная рыбка, имеющийкоординаты, скорость, размер, цвет и направление движения. Методамиэтого объекта являются:• Init — устанавливает значения полей объекта и рисует рыбку наэкране методом Draw;• Draw — рисует рыбку в виде уголка с острием в точке Coord,направленным по ходу ее движения;• Look — проверяет несколько точек на линии движения рыбки, иесли хотя бы одна из них отличается по цвету от воды, возвращает ейцвет и указывает расстояние до рыбки;• Run — перемещает рыбку в текущем направлении на расстояние,зависящее от ее текущей скорости. Иногда случайным образом изменяетнаправление движения рыбки. Если же на пути рыбки возникаетпрепятствие, направление движения изменяется до тех пор, покапрепятствие не исчезнет из ее поля зрения.20. Определить объект TAquarium, который является местом оби-тания рыбок (см. задачу 19) и представляет собой область экрана,заполненную водой. Рыбки живут в аквариуме, поэтому экземплярыобъекта TFish должны быть полями объекта TAquarium.

Методами этого объекта являются:• Init — включает графический режим, заполняет аквариум водой,скалами и рыбками.• Run — организует бесконечность цикла, в котором выполняетсяданный метод, для всех обитателей аквариума;• Done — выключает графический режим.21. Определить объекты TPike и ТКагр, которые являются «на-следниками» объекта TFish (см. задачу 19) и отличаются от него толькотем, что по-разному изображают себя на экране: TPike — в виде зеленойстрелки, а ТКагр — в виде красного треугольника. Ипользоватьвиртуальные методы, т.е. вернувшись к определению объекта TFish,откорректировать его, сделав Draw пустым и виртуальным.22. Объединить два вида рыб (см. задачу 21) в две разные стаи, гдестая — это связанный список рыб в динамической памяти. Для связидобавить в объекты TPike и ТКагр поле Next — указатель на имеющихсяв стае рыб. Запустить в аквариум не отдельных рыб, а две стаи, ипозволить владельцу пополнять эти стаи, вводя рыб с клавиатуры.23. Позволить щукам (см. задачу 21) поедать карпов, как только ониих увидят, для чего следует установить, какого именно карпа

353

Page 354: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

видит щука. Проблема решается просмотром всей стаи карпов иопределения того из них, чьи координаты близки к координатам даннойщуки. Найденного карпа удалить из стаи.24. Составить программу для игры в шашки. Здесь шашки каждогоцвета выступают в качестве отдельного объекта. Характеристикамишашек являются цвет и позиция на доске, а методами — перемещение.(Не забудьте об объектах «дамки».)25. Составьть программу для игры в домино. Здесь объектамиявляются кости домино, а методами — способы выставления той илииной кости.26. Составить программу для игры в шахматы. Здесь каждая шах-матная фигура является отдельным объектом и характеризуется цветом,положением на доске, способом перемещения. Предусмотретьвозможность превращения пешки в ферзя.

27 — 30. Выполнить задачи 23 —26 в графическом режиме.31—45. Выполнить все задачи подразд. 5.14 в графическом режиме.46. Определить структурированный тип данных и набор под-

программ для работы с массивом структур. В структурированнойпеременной предусмотреть способ отметки ее как не содержащейданных (т. е. пустой). Подпрограммы должны работать с массивомструктур или с отдельной структурой через указатели, а также принеобходимости возвращать указатель на структуру. В переченьподпрограмм входят:• «очистка» структурированных переменных;• поиск свободной структурированной переменной;• ввод элементов (полей) структуры с клавиатуры;• вывод элементов (полей) структуры с клавиатуры;• поиск в массиве структуры с минимальным значением заданногополя;• сортировка массива структур в порядке возрастания заданногополя;• поиск в массиве структур элемента с заданным значением поля илис наиболее близким к нему значением;• удаление заданного элемента;• изменение (редактирование) заданного элемента;• выполнение вычисления с проверкой и использованием всехэлементов массива по заданному условию и формуле. *

Перечень полей структурированной переменной:а) фамилия, имя, отчество человека, дата его рождения, адрес;б) фамилия, имя, отчество вкладчика, номер его счета, сумма на

счете, дата последнего изменения счета;в) номер страницы, номер строки, текст изменения строки, дата

изменения;г) название экзамена, дата экзамена, фамилия преподавателя,

принимавшего экзамен, количество поставленных оценок, оценки;

354

Page 355: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

д) фамилия, имя, отчество студента, номер его зачетной книжки,факультет, группа;

е) фамилия, имя, отчество читателя, номер его читательского билетав библиотеке, название взятой книги, срок ее возврата в библиотеку;

ж) наименование товара, его цена, количество, процент торговойнадбавки;

з) номер рейса самолета, пункт его назначения, время вылета, датавылета, стоимость билета;

и) фамилия, имя, отчество ученика, количество его оценок, оценки,средний балл;

к) фамилия, имя, отчество студента, дата его поступления, датаотчисления;

л) регистрационный номер автомобиля, его марка и пробег;м) фамилия, имя, отчество телефонного абонента, количество

состоявшихся переговоров, их даты и продолжительность;н) номер телефона вызываемого абонента, дата разговора, его

продолжительность, код вызываемого города;о) номер поезда, пункт его назначения, дни следования, время

прибытия, время'стоянки;п) название кинофильма, время сеанса, стоимость билета, ко-

личество зрителей в зале.

5.18. Тема «Визуальное программирование оконного интерфейса»

1. Пересчитать скорость ветра, заданную в метрах в секунду,километрах в час. Рекомендуемый вид формы показан на рис. 5.3.Программа должна проектироваться таким образом, чтобы пользовательмог ввести в поле Скорость только целое положительное число*.2. Вычислить сопротивление электрической цепи, состоящей издвух резисторов, которые могут быть соединены последовательно илипараллельно. Рекомендуемый вид формы показан на рис. 5.4. Еслисопротивление цепи превышает 1 ООО Ом, результат должен бытьвыведен в килоомах.3. Вычислить стоимость поездки на автомобиле, например на дачу.Рекомендуемый вид формы показан на рис. 5.5.4. Сформировать список городов, вводимых в строку пользователем.Примерный вид формы показан на рис. 5.6.5. Составить анкету для студентов включающую в себя следующиевопросы:• Сколько вам лет?

* Некоторые задачи в данном подразделе заимствованы из [16].

355

Page 356: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Инструкциядля программы

Кнопка принажатии на

которуюпроисходит

пересчет

Рис. 5.3. Форма к задаче 1

Инструкция Дляпрограммы

Label 1

НазваниеполяLabel2

НазваниеполяLabel3

Рис. 5.4. Форма к задаче 2

Поле вводакомпонент

Editl

Поле вводакомпонент

Edit2

Кнопка дляподсчета

сопротивленияButton 1

Поле выводаLabeM

ЗависимыепереключателиRadio Button 1 иRadioButton2

FT ип соединения

последовательно’

параллельно *

Label4

Editl

Button 1

Label 1

Label2

Label 3

CheckBoxl

356

Рис. 5.5. Форма к задаче 3

Page 357: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Инструкция дляпрограммы Label

1

Поле вводаEditl

Названиесписка Label3

СписокListBoxl

Button 1

Button2

Button3

Счетчиквведенных

городов Label5

Рис. 5.6. Форма к задаче 4

• На каком факультете вы учитесь?• В какой группе вы учитесь?• Нравится ли вам учиться?

Результат содержащий всю информацию, полученную при ан-кетировании, должен быть представлен сразу.6. Получить в зависимости от введенного возраста соответствующуюнадпись [4]:• для возраста менее 17 лет — «Почему вы не в школе?»;• для возраста от 17 до 40 — «Молодым везде дорога!»;• для возраста от 40 до 60 — «Главное — побольше здоровья!»;• для возраста более 60 лет — «Почетный возраст».7. Пересчитать массу из фунтов в килограммы (1 фунт = 453,59 г).Рекомендуемый вид формы показан на рис. 5.7. Программу спро-ектировать таким образом, чтобы кнопка [Пересчет] была доступнатолько после ввода пользователем исходных данных [9].

> Фунты кинограммы W . ЛШЛКГ

Введите вес в Фунтах и щелкните ; на кнопке Пересчет. Для отделения ; ; дробной части от целой используйте запятую

Пересчет |

Рис. 5.7. Форма к задаче 7

357

Page 358: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

8. Вычислить доход по вкладу. Программа должна обеспечиватьрасчет простых и сложных процентов. (Простые проценты начисляютсяв конце срока вклада. Сложные проценты начисляются ежемесячно,прибавляются к первоначальной сумме вклада и в следующем месяцепроценты начисляются на новую сумму.)9. Перевести число из одной меры весов в другую. Рекомендуемыйвид формы показан на рис. 5.8.10. Смешать цвета в формате RGB с использованием полосыпрокрутки. Рекомендуемый вид формы показан на рис. 5.9.11. Определить скидку на стоимость указанного автомобиля исходяиз следующих данных:• если возраст машины больше 10 лет — скидка 10 %;

|®Усмеиенме цветов ’

3 . -d

j |f щ___I i: : : — : — 1

Рис. 5.9. Форма к задаче 10

358

Page 359: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ш ■и ■■■»! I ■ I 1 -11

Введите название машины иотметьте ее характеристики

цена нового автомобиля

Г” Старше 10 лет Г~

Аварийная Г

Таможня Г Пробег

по РФ

Подсчитать Добавить | Проверить | Удалить

Рис. 5.10. Форма к задаче 11

• если машина аварийная — 30 %;• если не уплачены таможенные пошлины — 10 %;• если есть пробег по России —5%.12. Составить программу «Стоимость машины»: есть список, вкоторый можно добавить автомобиль (с его характеристиками) илиудалить, а также проверить, какая скидка (см. задачу 11)предоставляется на него. Рекомендуемый вид формы показан на рис.5.10.13. Изменить тип, размер или цвет шрифта, а также расположениеего на форме (т. е. выровнять текст по левому, правому краю или поцентру). Длина текста может быть более 256 символов.14. Вычислить скорость [км/ч], с которой бегун пробежал ди-станцию. Минуты задают целым числом, а секунды — дробным.15. Вычислить силу тока в электрической цепи. Программу спро-ектировать таким образом, чтобы кнопка [Вычислить] была доступнатолько после ввода пользователем значения сопротивления.16. Вычислить силу тока в электрической цепи, состоящей из двухпараллельно соединенных резисторов.17. Вычислить стоимость покупки. Пользователь вводит код товара иколичество единиц, а программа формирует список товаров.18. Вычислить стоимость покупки с учетом скидки:• скидка 1 % предоставляется, если сумма покупки больше 300 р.;• 2 % — если больше 500 р.;• 3 % — если больше 1 000 р.

Информацию о предоставлении скидки (процент и значение)вывести в диалоговом окне.

359

Page 360: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

19. Вычислить силу тока в электрической цепи, состоящей из двухрезисторов, которые могут быть соединены последовательно илипараллельно.20. Используя закон Ома, вычислить силу тока, напряжение илисопротивление электрической цепи. (Во время работы программы врезультате выбора переключателя Ток, Напряжение или Сопротивлениетекст, поясняющий назначение полей ввода, должен меняться.)21. Вычислить площадь треугольника по длине его сторон. Рас-смотреть прямоугольный, равнобедренный, равносторонний ипроизвольный треугольники.22. Вычислить сумму покупки. Пользователь вводит название товараи его цену с учетом возможной скидки для сотрудника компании,постоянного клиента и покупателя, предоставившего дисконтную карту,а программа сформирует список товаров.23. Вычислить путь, пройденный свободно падающим телом через tсекунд. Программу составить таким образом, чтобы можно быловычислить пройденный телом путь при имеющемся начальномпройденном пути.24. Усовершенствовать программу «Поездка на дачу» (см. рис. 5.5):сформировать поле с выпадающим списком автомобилей (здесьпрограммно для каждого автомобиля известен расход топлива), привыборе в котором конкретного автомобиля автоматически под-считывается стоимость поездки.25. Усовершенствовать программу к задаче 23 за счет установкиначального пройденного пути полосой прокрутки.26. Вычислить объем правильной пространственной фигуры (те-траэдра, куба, четырехугольной пирамиды).27. Проверить, сколько раз заданный символ вошел в заданныйтекст. Длина текста может быть более 256 символов.28. Сформировать туристический маршрут, состоящий из пятипунктов назначения, названия которых выбираются из выпадающегосписка. Полный путь маршрута формируется в поле Memo.29. Вычислить время, которое требуется, чтобы проплыть на лодкеопределенное расстояние. Программа должна вычислять время полногопути, т.е. туда и обратно.30. Обеспечить отображение вводимого текста в окне и регулировкуего размера полосой прокрутки.31. Преобразовать введенный текст: все строчные буквы заменитьпрописными. Длина текста может быть более 256 символов.

5.19. Тема «Большие проекты»

1. Задача «Волчий остров» [2].Волчий остров размером 2 0 x 2 0 заселен дикими кроликами,

волками и волчицами. Имеется по несколько представителей каж

Page 361: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

дого вида. Кролики довольно глупы: в каждый момент времени они содинаковой вероятностью 1/9 передвигаются в один из восьми соседнихквадратов (за исключением участков, ограниченных береговой линией)или просто сидят неподвижно. Каждый кролик с вероятностью 1/5превращается в двух. Каждая волчица передвигается случайнымобразом, пока в одном из соседних восьми квадратов не окажетсякролик, за которым она охотится. Если волчица и кролик оказываются водном квадрате, волчица съедает кролика и получает одно очко. Впротивном случае она теряет 0,1 очка. Волки и волчицы с нулевымколичеством очков умирают.

В начальный момент игры все волки и волчицы имеют одно очко.Волк ведет себя подобно волчице до тех пор, пока в соседних квадратахне исчезнут все кролики; тогда если волчица оказывается в одном извосьми близлежащих квадратов, волк гонится за ней. Если волк иволчица окажутся в одном квадрате и там нет кролика, которого нужносъесть, они производят потомство случайного пола.

Создать соответствующую экологическую модель и проследитьизменение популяции волков и диких кроликов в течение некоторогопериода времени.2. Задача «Инфекция стригущего лишая» [2].

Смоделировать процесс распространения инфекции стригущеголишая по участку кожи размером пхп клеток (где п — нечетное число).Предполагается, что исходной зараженной клеткой кожи являетсяцентральная. В определенный интервал времени пораженная инфекциейклетка может с вероятностью 0,5 заразить любую из соседних здоровыхклеток. По прошествии шести единиц времени зараженная клеткастановится невосприимчивой к инфекции, в течение последующихчетырех единиц времени действует возникший иммунитет, а затемклетка оказывается здоровой. В ходе моделирования описанногопроцесса следует выдавать текущее состояние моделируемого участкакожи в определенном интервале времени, отмечая зараженные,невосприимчивые к инфекции и здоровые клетки.3. Задача «Построение фигур на плоскости с помощью циркуля илинейки».

Автоматизировать процесс построения фигур на плоскости спомощью циркуля и линейки. Программа должна уметь:• отмечать произвольную точку и обозначать ее;• строить прямую, проходящую через две точки;• строить произвольную прямую;• строить окружность с заданными центром и радиусом;• строить и обозначать точку пересечения двух линий.

Программа должна содержать 10... 15 стандартных задач напостроение из школьного курса геометрии, предлагать их для

361

Page 362: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

1 1 7 1 7 (80)

2 10 2 13 2 (40)

5 12 13 5 7 (10)

3 3 3 11 3 (160)

4 12 4 13 12 (20)

(50) (10) (Ю) (Ю) (160)

Рис. 5.11

решения, контролировать процесс построения и полученное решение.4. Игра «Морской бой».

Составить программу, позволяющую играть в морской бой игроку скомпьютером. Программа должна позволять расставлять корабли наполе 10 х 10 и контролировать правильность их расстановки, а такжеобеспечивать очередность ходов противников и выдаватьсоответствующие информационные сообщения. Так как в качествеодного из игроков выступает компьютер, программа должнаанализировать предыдущие ходы и следующий ход делать на основепроведенного анализа.5. Обучающе-контролирующая задача «Сложение и вычитаниеотрицательных чисел».

Составить программу, обучающую учеников 6-го класса сложению ивычитанию отрицательных чисел, предусмотрев серию заданийразличной сложности для закрепления навыков действий с такимичислами.6. Итальянская игра «Математико»*.

Имеется квадратное поле из 25 клеток и набор из 52 карточек, накоторых записаны числа от 1 до 13, причем карточки с каждым из этихчисел встречаются по четыре раза.

Разработать программу, которая позволит имитировать игру человекас компьютером: случайным образом извлекается какая- либо изимеющихся карточек и выдается записанное на ней число. Каждыйигрок заносит это число в одну из клеток квадрата, и так продолжаетсядо тех пор, пока не будут заполнены все клетки квадрата.

Пример заполнения заданного поля показан на рис. 5.11.

* Кордемский Б.А. Математическая смекалка / Б.А.Кордемский. — СПб. : Манускрипт, 1994.

362

Page 363: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Комбинация чисел Количество очков прирасположении одинаковых чисел

В ряду или столбце По диагонали

Два одинаковых числа 10 20

Две пары одинаковых чисел 20 30

Три одинаковых числа 40 50

Три одинаковых числа и два других одинаковых числа

80 90

Четыре одинаковых числа 160 170

Пять последовательных чисел, не обязательно расположенные по порядку

50 60

Три раза 1 и два раза 13 100 110

Числа 1, 13, 12, 11 и 10, не обязательно расположенные по порядку

150 160

Четыре 1 200 210

По окончании игры заполнение заполнение клеток поля оцениваетсяопределенным количеством очков. Цель игры — разместить числа вклетках таким образом, чтобы набрать наибольшее количество очков всоответствии с табл. 5.3.

Разработать для компьютера наиболее оптимальную стратегиюзаполнения квадрата.7. Задача «Заполнение готовых форм с помощью информации избазы данных».

Имеется база данных, содержащая сведения о некоторой группелюдей (каждая запись содержит до 10 полей). Составить программу,позволяющую заполнять некоторые документы (стандартные письма,приглашения, визитки, отчеты и т.д.) посредством нахождениянеобходимых сведений в базе данных и введения их в документ всоответствующей форме (падеже, лице, времени и т.д.).8. Карточная игра «В дурака».

Составить программу, которая раздает игральные карты заданномучислу игроков (одним из игроков является человек, а за остальныхиграет компьютер) и моделирует игру «В дурака». Причем программадолжна играть случайным образом, без анализа уже вышедших карт, ачисло игроков не должно превышать шести.9. Игра «Крестики-нулики».

Составить программу, позволяющую играть на бесконечном поле в«Крестики-нулики» игроку с компьютером, а также двум игрокам.

363

Page 364: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Если в качестве игрока выступает компьютер, программа делаетпервый ход. Делая очередной ход, программа анализирует ситуацию,просчитывая ее вперед на один-два хода противника.10. Игра «Быки и коровы».

Составить программу, позволяющую играть в «Быки и коровы»игроку с компьютером, а также двум игрокам.

В этой игре каждый из противников задумывает четырехзначноечисло, все цифры которого различны, причем первая цифра не нуль.Необходимо отгадать задуманные числа, при этом выигрывает тот, ктоотгадает первым. Противники по очереди называют друг другуразличные числа и сообщают о количестве «быков» и «коров» в них(«бык» — цифра, которая есть в записи названном числа и занимает внем ту же позицию, что и в названном числе; «корова» — цифра,которая есть в записи задуманного числа, но она не занимает в ней ту жепозицию, что и в названном числе).

Например, если задумано число 3 275 и названо число 1 234, имеетсяодин «бык» и одна «корова». Очевидно, что задуманное число будетотгадано в случае если в названном числе будет четыре «быка».11. Игра «Числовые головоломки».

Составить программу, которая предлагает игроку числовую го-ловоломку типа ОДИН + ОДИН = МНОГО из некоторого набора такихголоволомок (до 30), позволяет решить эту головоломку и контролируетправильность решения.12. Задача «Построение графиков».

Составить программу, которая предлагает пользователю некоторыйсписок функций для построения графиков, например, у = = ах 1 + Ьх +с; у = «sin х + b и т.д. (до 25 наименований). После выбора одной изфункций, задания коэффициентов и отрезка, на котором выполняетсяпостроение, строится соответствующий график. При этом возможноизменение значений коэффициентов и положения графика с помощьюклавиш управления курсором, после чего он перестроится и запишетсяобновленное уравнение кривой.13. Игра «Две лисы и 20 кур».

На поле, форма которого показана на рис. 5.12, находятся две лисы и20 кур. Куры могут перемещаться на одну клетку вверх, влево иливправо, но не назад и не по диагонали. Лисы могут перемещаться толькона одну клетку вверх, вниз, влево и вправо. Лиса может съесть курицу,как в игре в шашки, т. е. если в горизонтальном или вертикальномнаправлении сразу за курицей следует свободная клетка. При этом лисыобязаны всегда есть кур, и обязательно как можно больше. Привозможности съесть одинаковое число кур в разных направлениях,выбирается одно из них.

Составить программу, играющую за лис, а игрок будет перемещатькур, которые и начинают игру.

364

Page 365: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

л л

К к к к к к к

к к к к к к к

к к к

к к к

Рис. 5.12

Куры выигрывают партию, если девяти из них удается занять девятьклеток, образующих верхний квадрат поля.

Лисы выигрывают, если им удается съесть 12 кур, так как в этомслучае оставшихся кур недостаточно, чтобы занять девять верхнихполей.14. Головоломка «Игры со спичками».

Составить программу, которая предлагает игроку головоломку соспичками из некоторого набора таких головоломок (до 30 штук),позволяет решить эту головоломку, передвигая спички, и контролируетправильность решения.15. Задача «Графика в ТурбоПаскале».

Составить программу, демонстрирующую все графические воз-можности языка ТурбоПаскаль и обучающую работе с основнымиграфическими процедурами и функциями. Программа должна про-контролировать усвоение изученного материала (в виде теста или вкакой-либо другой форме).16. Игра «В слова».

Составить программу, позволяющую компьютеру и человеку игратьв слова. Программа должна предварительно объяснять правила игры, атакже позволять уточнить их в любой момент.

Тематику игры из предложенных компьютером не менее пятивариантов (города, животные, растения и т.д.) выбирает человек. Дляигры компьютер использует собственную базу данных (по каждойтематике свою), хранящуюся в виде текстового файла. Если названноечеловеком слово отсутствует в базе данных, уточняется, правильно лионо названо. В случае правильности названного слова оно заносится вбазу данных, а в противном случае — уто

365

Page 366: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

чняется. Правила игры: один игрок называет слово, а другой — долженпредложить слово, начинающееся с буквы, на которую слово, названноепервым игроком, оканчивается.17. Задача «Решение ребусов».

Для выбранного школьного предмета (информатика, математика ит.д.) подобрать ребусы и предложить их для решения. Программадолжна обеспечить выбор того или иного ребуса, проконтролировать егорешение и подвести итоги по завершении работы.

Page 367: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Имя константы

Номер режима Режим

BW40 0 Черно-белый, 40 символов, 25 строк

С040 1 Цветной, 40 х 25

BW80 2 Черно-белый, 80 х 25

СО 80 3 Цветной, 80 х 25

Mono 7 Монохромный, 80 х 25, для монохромных дисплеев

Имя константы Номер цвета Цвет

Black 0 Черный

Blue 1 Темно-синий

Green 2 Темно-зеленый

Cyan 3 Бирюзовый

Red 4 Красный

Magenta 5 Фиолетовый

Brown 6 Коричневый

LightGray 7 Светло-серый

DarkGray 8 Темно-серый

LightBlue 9 Синий

LightGreen 10 Светло-зеленый

LightCyan 11 Светло-бирюзовый

LightRed 12 Розовый

LightMagenta 13 Малиновый

Yellow 14 Желтый

White 15 Белый

Blink 128 Мерцание символа

Таблица П1.2

Константы цветов

Page 368: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Установка режимов и окон

Procedure AssignCrt (File : Text); Связывает окно дисплея с текстовымфайлом, что позволяет ускорить вывод наэкран

Procedure ClrScr; Очищает экран и помещает курсор

в верхнии левый угол

Procedure TextMode (Mode : Integer); Mode — номер текстового режима или соответствующая константа

Выбирает текстовый режим

Procedure Window (x l , y l , x2 , y2 : Byte); (x l , y l ) и (x2, y2) — координаты верхнего левого и нижнего правого углов окна

Определяет окно вывода в текстовомрежиме

Управление цветом текста и фона

Procedure HighVideo; Устанавливает высокую яркостьвыводимых символов

Procedure LowVideo; Устанавливает низкую яркостьвыводимых символов

Procedure NormVideo; Возвращает цвет символов и фона,свойственный данному графическомурежиму по умолчанию

Procedure TextBackground (Color : Byte);Color — код цвета или соответствующаяконстанта

Выбирает цвета символов

Управление выводом текста

Procedure ClrEol; Стирает все символы от текущей позициикурсора до конца строки

Procedure DelLine; Удаляет линию, в которой находитсякурсор

Procedure InsLine; Вставляет новую строку текста передстрокой, где находится курсор

Работа с клавиатурой

Function KeyPressed : Boolean; Значение True, если нажата любая клавиша, и False, если не нажата

Определяет, была ли нажата клавиша наклавиатуре

368

Page 369: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Function ReadKey: Char;Значение функции — код символа клавиши, нажатой на клавиатуре

Считывает символ из буфера клавиатуры

Управление курсором

Procedure GotoXY (X,Y: Integer); X, Y —координаты курсора

Перемещает курсор в указанныекоординаты окна вывода

Function WhereX: Integer;Значение функции — координата Xкурсора

Возвращает текущую координату Xкурсора

Function WhereY: Integer;Значение функции — координата Yкурсора

Возвращает текущую координату Yкурсора

Управление звуком

Procedure NoSound; Выключает динамик

Procedure Sound (Hz : Word); Hz — частота звука в герцах

Включает звук динамика с заданнойтональной частотой

Управление временем

Procedure Delay (Ms : Word);Ms — значение задержки в милли-секундах

Задерживает исполнение программы назаданное число миллисекунд

Page 370: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Имя Значение Назначение

Detect 0 Автоматический выбор драйвера

CGA 1

MCGA 2

EGA 3

EGA64 4

EGAMono 5

IBM8514 6

HercMono 7

ATT400 8

VGA 9

PC3270 10

CurrentDriver -128 Текущий драйвер

Имя Значение Размер поля Палитра Число страниц

АТТ40ОСО 0 320 х 200 СО 1

АТТ400С1 1 320 х 200 С1 1

АТТ400С2 2 320 х 200 С2 1

АТТ400СЗ 3 320 х 200 СЗ 1

ATT400Med 4 640 х 200 2 цвета 1

ATT400Hi 5 640 х 400 2 цвета 1

CGACO 0 320 х 200 СО 1

CGAC1 1 320 х 200 С1 1

CGAC2 2 320 х 200 С2 1

CGAC3 3 320 х 200 СЗ 1

CGACHi 4 640 х 200 2 цвета 1

Таблица 112.1

Константы графических режимов

Page 371: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Имя Значение Размер поля Палитра Число страниц

EGALo 0 640 x 200 16 цветов 4

EGAHi 1 640 x 350 16 цветов 2

EGA64LO 0 640 x 200 16 цветов 1

EGA64Hi 1 640 x 350 4 цвета 1

EGAMonoHi 0 640 x 350 2 цвета 1 или 2

HercMonoHi 0 720 x 348 2 цвета 2

IBM8514Lo 0 640 x 480 256 цветов 1

IBM8514Hi 0 1 024 x 768 256 цветов 1

MCGACO 0 320 x 200 СО 1

MCGAC1 1 320 x 200 С1 1

MCGAC2 2 320 x 200 С2 1

MCGAC3 3 320 x 200 СЗ 1

MCGAMed 4 640 x 200 2 цвета 1

MCGAHi 5 640 x 480 2 цвета 1

РС3270Ш 0 720 x 350 2 цвета 1

VGALo 0 640 x 200 16 цветов 4

VGAMed 1 640 x 350 16 цветов 2VGAHi 2 640 x 480 16 цветов 1

Имя константы Номер цвета Цвет

Black 0 Черный

Blue 1 Темно-синий

Green 2 Темно-зеленый

Cyan 3 Бирюзовый

Red 4 Красный

Magenta 5 Фиолетовый

Brown 6 Коричневый

LightGray 7 Светло-серый

П р и м е ч а н и е . Палитра СО включает в себя цвета светло-зеленый, розовый ижелтый, палитра С1 — светло-голубой, светло-фиолетовый и белый, палитра С2 — зеленый,красный и коричневый, палитра СЗ — голубой, фиолетовый и светло-серый.

Таблица П2.3

Константы цветов

371

Page 372: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Имя константы Номер цвета Цвет

DarkGray 8 Темно-серый

LightBlue 9 Синий

LightGreen 10 Светло-зеленый

LightCyan 11 Светло-бирюзовый

LightRed 12 Розовый

LightMagenta 13 Малиновый

Yellow 14 Желтый

White 15 Белый

Имя Значение Назначение

Коды типов линий (для процедуры SetLineStyle)

SolidLn 0 Сплошная

Dotted Ln 1 Пунктирная

CenterLn 2 Штрихпунктирная

DashedLn 3 Штриховая

UserBitLn 4 Заданная пользователем

Коды толщины линии

NormWidth 1 Нормальная

ThickWidth 3 Толстая

Имя константы Значение Назначение

EmptyFill 0 Заполнение цветом фона

SolidFill 1 Однородное заполнение цветом

LineFill 2 Заполнение вида

LtSlashFill 3 Заполнение вида ///

SlashFill 4 Заполнение вида ///толстыми линиями

BkSlashFill 5 Заполнение вида \ толстыми линиями

LtBkSlashFill 6 Заполнение вида \

HatchFill 7 Заполнение клеткой

Таблица П2.4

Коды линий

Таблица П2.5

Константы типа заполнения (для процедуры SetFillStyle)

372

Page 373: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Имя константы Значение Назначение

XHatchFill 8 Заполнение косой клеткой

InterleaveFill 9 Заполнение частой клеткой

WideDotFill 10 Заполнение редкими точками

Close DotFill 11 Заполнение частыми точками

UserFill 12 Определяется пользователем

Интерфейс Назначение

Управление графическим режимом

Procedure CloseGraph; Закрывает графический режим

Procedure DetectGraph (Var GrDriver, GrMode: Integer);GrDriver — код драйвера, GrMode — код графического режима

Определяет рекомендуемые кприменению для данного компьютераграфические драйвер и режим

Function GetDriverName : String; Значение функции — имя используемого драйвера

Определяет имя файла с используемымграфическим драйвером

Function GetGraphMode : Integer; Значениефункции — код графического режима

Определяет код используемого графического режима

Function GetMaxName : Integer; Значение функции — имя используемого графического режима

Определяет имя используемогографического режима

Function GetMaxMode : Integer; Значение функции — максимальное значение кода режима

Определяет максимальное значение кода графического режима для используемого драйвера

Procedure GetM ode Range (GrDriver : Integer; Var LoMode, HiMode : Integer);GrDriver — код графического режима;

Определяет минимальное и мак-симальное значения кода графическогорежима для указанного при обращениидрайвера

LoMode, HiMode — наименьшее инаибольшее значения кода графическогорежима для данного драйвера

Procedure GraphDefaults; Устанавливает графический указатель в начало координат и пере-устанавливает графическую систему

Окончание табл. П2.5

Таблица П2.6

Процедуры и функции

Page 374: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Function GraphErrorMsg (ErrorCode : Integer) : String;ErrorCode — код графической ошибки.Значение функции — текстовое сообщение о характере ошибки

Дает строку — сообщение об ошибке графического режима по коду ошибки

Function GraphResult: Integer; Значение функции — код ошибки

Определяет, произошла ли ошибка при исполнении процедур модуля

Procedure InitGraph (var GrDriver, GrMode :Integer; PathToDriver : String);

Устанавливает заданный графическийрежим

GrDriver — код драйвера, GrMode — код графического режима; PathToDriver — путьк файлу используемого драйвера

Function InstallUserDriver (Name: String;AutoDetectPtr : Pointer) : Integer; Name —имя файла графического драйвера,AutoDetectPtr — указатель на процедуру,определяющую успешность запускадрайвера.Значение функции — цифровой код установленного драйвера

Инсталлирует пользовательский драйвер графического режима

Procedure RegisterBGIDriver (Driver : Pointer) : Integer;Driver — указатель на драйвер

Регистрирует драйвер графической системы

Procedure RestoreCrtMode; Закрывает графический режим ивосстанавливает текстовый режим,установленный ранее

Procedure SetGraphMode(GrMode : Integer);GrMode — код графического режима

Устанавливает другой графический режим без изменения драйвера

Управление экраном и окнами

Procedure ClearDevice; Очищает экран, сбрасывает все графические установки к значениям по умолчанию, устанавливает графический указатель в положение (0, 0)

Procedure ClearViewPort; Очищает экран, устанавливая фон, заданный в SetBkColor

Page 375: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Function GetMaxX: Integer; Значение функции — максимальная координата X

Определяют максимальные коор-динаты экрана в данном графическомрежиме

Function GetMaxY: Integer; Значение функции — максимальная координата Y

Procedure GetAspectRatio (Var Xasp, Yasp: Word);Xasp, Yasp — коэффициенты no осям X и Y

Определяет коэффициенты, ха-рактеризующие неодинаковостьлинейного расстояния между пикселамипо осям X и Y

Function GetBkColor : Word; Значение функции — код цвета фона

Определяет установленный цвет фона

Экран и окна

Procedure GetViewSettings (Var ViewPort: ViewPortType); ViewPort — параметры текущего окна

Запрашивает текущие параметры окнаи отсечения

Procedure SetBkColor (Colorv: Word); Значение функции — код цвета фона

Устанавливает цвет фона

Procedure SetActivePage (Page : Word); Page— номер активной страницы

Устанавливает активную графическуюстраницу

Procedure SetAspectRatio (Var Xasp, Yasp : Word);Xasp, Yasp — коэффициенты no осям X и Y

Изменяет масштабный коэффициентотношения сторон экрана

Procedure SetVisualPage (Page : Word); Page — номер страницы

Устанавливает номер видимойграфической страницы

Procedure SetViewPort (x l , y l , x2, y2 : Integer; Cl ip : Boolean);(x l , y l ) и (x2, y2) — координаты противоположных углов окна;Clip — определяет, отсекать л и изоб

Устанавливает визуальный порт (окно)для вывода графического изображения

ражение за пределами окна или нет

Function GetColor : Word; Значение функции — код цвета

Возвращает текущий цвет (уста-новленный SetColor)

Procedure GetDefaultPalette (Var Palette : PaletteType);Palette — палитра (массив типа PaletteType)

Определяет, какая палитра действует врежиме по умолчанию

Page 376: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Function GetMaxColor : Word; Значение функции — максимальный код цвета

Определяет максимальный код цвета вустановленном режиме

Procedure GetPalette (Var Palette : PaletteType);

Palette — палитра (массив типа

Определяет, какая палитра установлена

PaletteType)

Function GetPaletteSize : Word; Значение функции — число цветов в палитре

Возвращает размер таблицы палитры

Procedure SetAll Palette (Var Palette : PaletteType);

Устанавливает все цвета палитры

Palette — палитра (массив типа PaletteType)

Procedure SetColor (Color : Word); Color — код цвета

Устанавливает цвет для линий

Procedure SetPalette(ColorNum, Устанавливает один новый цвет

Color : Word);ColorNum — код заменяемого цвета; Color — код нового цвета

в палитре

Procedure SetRGBPalette (ColorNum, RedValue, GreenValue, BlueValue :

Устанавливает в палитру цвет,заданный тремя компонентами:

Word);ColorNum — код устанавливаемого в палитре цвета;RedValue, GreenValue, BlueValue — интенсивность красного, зеленого и

красным, зеленым и синим

синего в этом цвете

Управление указателем

Function GetX: Integer;GetX — координата X указателя

Возвращает координату X текущегоуказателя

Function GetY: Integer;GetY — координата Y указателя

Возвращает координату Y текущегоуказателя

Procedure MoveTo (X : Integer; Y : Перемещает указатель в точку,Integer);(X, Y) — координаты точки экрана

заданную координатами X, Y

Procedure MoveRel (dx : Integer; dy : Integer);dx, dy — вектор приращений координат точки экрана

Перемещает указатель в точку,координаты которой отличаются оттекущих координат на значения dx, dy

Page 377: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Шаблоны; закраска областей

Procedure FloodFill (X, Y: Integer; ColorBorder: Word);(X, Y) — координаты точки, вокруг которой идет закраска;ColorBorder — цвет, обозначающий границы области закраски

Закрашивает произвольную областьпо заданным шаблону и цвету вокруг заданной точки до границ, обозначенных опреде-ленным цветом

Procedure GetFillPattem (Var FillPattem : FillPattemType);FillPattem — массив типа FillPattemType, содержащий информацию о шаблоне

Определяет установленный тип шаблона

Procedure GetFillSettings (Var Filllnfo : FillSettingsType);Filllnfo — запись типа FillSettingsType, содержащая информацию о шаблоне

То же

Procedure GetLineSettings (Var Linelnfo : LineSettingsType);Linelnfo — записьтипа LineSettingsType, содержащая информацию о типе линии

Определяет установленный тип линии

Procedure GetGraphBufSize ( Size: Word); Size — размер буфера

Изменяет размер буфера для функций заполнения

Procedure SetFillPattem (Pattern: FillPattemType; Color : Word);

Pattern — массив типа FillPattemType,содержащий информацию о шаблоне; Color —цвет раскраски

Устанавливает шаблон и цвет раскраски

Procedure SetFillStyle (Pattern, Color : Word);Pattern — код стандартного шаблона; Color — цвет раскраски

Устанавливает один из стандартныхшаблонов и цвет раскраски

Procedure SetLineStyle (LineStyle, Устанавливает стиль линии

Pattern, Thickness: Word);LineStyle — код стиля линии;Pattern — собственный шаблон линии; Thickness — толщина линии

как один из стандартных или по собственному шаблону

Изображение геометрических фигур

Procedure Arc (X, Y: Integer; StartAngle,EndAngle, R: Word);(X, Y) — координаты центра окружности;StartAngle, EndAngle — начальный

Изображает дугу окружности. Процедура учитывает неодина-ковость масштаба по осям

Page 378: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

и конечный углы дуги окружности в градусах (0,359); R — радиус окружности в пикселах в направлении X

Procedure Bar (x l , y l , х2, у2 : Integer); (x l , y l ) и (х2, у2) — координаты левого верхнего и правого нижнего углов прямоугольника

Изображает окрашенный пря-моугольник без контура

Procedure Bar3D (x l , y l , х2, у2 : Integer; Depth : Word; Top : boolean); (x l , y l ) и (x2, y2) — координаты левого верхнего и правогонижнего углов параллелепипеда, Depth — его глубина; Тор — определяет, изображать ли верхнюю грань фигуры (true — изображать)

Изображает трехмерный прямо-угольный параллелепипед с за-полнением передней грани. Верхняя грань может изображаться или не изображаться

Procedure Circle (х, у : Integer; R : Word);(х, у) — координаты центра окружности; R — радиус окружности в пикселах в направлении X

Изображает окружность. Процедураучитывает неодинаковость масштабапо осям

Procedure DrawPoly (NumPoints: Word; Var PolyPoints);NumPoints число точек, задающих ломаную линию; PolyPoints — массив точек (элементов типа Point), задающих ломаную линию

Изображает ломаную линию, проходящую через данный массив точек

Procedure Ellipse (X, Y: Integer; StartAngle,EndAngle, Rx, Ry : Word); (X, Y) —координаты центра эллипса; StartAngle,EndAngle — начальный и конечный углыдуги эллипса в градусах (0,359); Rx, Ry —полуоси эллипса в пикселах в направленияхX и Y

Изображает дугу эллипса, полуоси которого в направлениях X и Y заданны в пикселах

Procedure GetArcCoords (Var ArcCoords: ArcCoordsType);ArcCoordsType — запись, содержащая координаты дуги

Возвращает координаты дуги, изображенной процедурами Arc и Ellipse

Procedure FillEllipse (X, Y: Integer;Rx, Ry: Word);

(X, Y) — координаты центра эллипса; Rx, Ry— полуоси эллипса в пикселах внаправлениях X и Y

Чертит закрашенный эллипс, полуосикоторого в направлениях X, Y заданыв пикселах

Page 379: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Procedure FillPoly (NumPoints : Word; Var PolyPoints);NumPoints — число точек, задающих ломаную линию;PolyPoints — массив точек (элементов типа Point), задающих ломаную линию

Изображает закрашенный мно-гоугольник, заданный массивом вершин

Function GetPixel (х, у: Integer) : Word; (х, у)— координаты точки, результат — цветточки

Возвращает цвет заданной точки

Procedure Line (x l , y l , x2, y2 : Integer); (x l , y l ) , (x2, y2) — координаты конечных точек отрезка прямой

Чертит отрезок прямой по двум заданным конечным точкам

Procedure LineRel (dx, dy : Integer); (dx, dy) — смещение конечной точки относительно начального положения указателя

Чертит отрезок прямой от положенияуказателя до точки, смещеннойотносительно указателя на заданноезначение

Procedure LineTo (х, у : Integer);(х, у) — координаты точки, в которую проводится отрезок

Чертит отрезок прямой от точкиположения указателя до заданнойточки

Procedure Rectangle (x l , y l , x2, y2 : Integer);(x l , y l ) , (x2, y2) — координаты про-тивоположных углов прямоугольника

Чертит контур прямоугольника

Procedure Sector (X, Y: Integer; StartAngle,EndAngle, Rx, Ry : Word); (X, Y) —координаты центра эллипса; StartAngle,EndAngle — начальный и конечный углыдуги эллипса в градусах (0,359); Rx, Ry —полуоси эллипса в пикселах в направленияхX и Y

Изображает закрашенный секторэллипса, ограниченный углами отStartAngle до EndAngle. Заполняетсясектор от минимального значенияуглов до максимального независимоот их следования

Procedure PieSlice (X, Y: Integer; StartAngle, EndAngle, Rx : word);

(X, Y) — координаты центра эллипса;StartAngle, EndAngle — начальный иконечный углы дуги эллипса в градусах (0,359); Rx— радиус окружности в пикселах внаправлении X

Изображает закрашенный секторкруга, ограниченный углами отStartAngle до EndAngle, радиус круга,заданный в пикселах в направленииX, и учитывает масштаб изображенияпо осям. Заполняется сектор отминимального значения углов домаксимального независимо от ихследования

Page 380: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Procedure PutPixel (X,Y: Integer; Color :word);(X, Y) — координаты точки;Color — цвет точки

Окрашивает точку экрана в заданныйцвет

Вывод текстов

Procedure GetTextSettings (Var Определяет установки вывода

Textlnfo : TextSettingsType);Textlnfo — запись, содержащая действующиеустановки вывода текста

текста

Procedure OutText (Text: String); Text — выводимая строка текста

Выводит текст на графический экран,начиная с позиции графическогоуказателя, которая смещается наширину выводимого текста

Procedure OutTextXY (X, Y: Integer; Text :String);(X, Y) — координаты точки, к которойпривязывается выводимый текст; Text —выводимая строка текста

Выводит текст на графический экранотносительно заданной точки с учетомиспользуемого типа юстировки

Function InstallUserFont (FontFileName:String): Integer;FontFileName — имя файла, содержащегошрифт.Результат — номер (код) установлен

Инсталлирует новый шрифт

ного шрифта

Procedure RegisterBGIFont (Font: Pointer);Font — указательна шрифт

Регистрирует шрифты для графической системы

Procedure SetTextJustify (Horiz, Vert: Word);Horiz, Vert — коды привязки текста погоризонтали и вертикали

Устанавливает тип привязки текста кточке вывода по горизонтали ивертикали

Procedure SetTextStyle ( Font, Direction,CharSize: Word);Font — тип используемого шрифта; Direction— направление вывода надписи; CharSize —размер символов

Устанавливает стиль выводимоготекста

Procedure SetUserCharSize (MultX, DivX,MultY, DivY : Word);MultX, DivX, MultY, DivY — коэффи-

Выполняет масштабирование шрифтов с произвольным дробным масштабом

Page 381: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

циенты умножения (Mult) и деления (Div) поосям X и Y соответственно

Function TextHeight (Text: String) : Integer;Text — выводимая строка текста; Результат — высота текста в пикселах

Определяет высоту текстовой строки при заданных установках стиля

Function TextWidth (Text: String) : Integer;Text — выводимая строка текста;

Определяет длину текстовой строки при заданных установках стиля

Результат — длина текста в пикселах

Копирование части экрана

Procedure Getlmage (x l , у 1 , х2, у2 : Integer; Var BitMap: Pointer);(x l , y l ) и (x2, y2) — координаты противоположных углов прямоугольника, ограничивающего копируемую область экрана; BitMap — указатель области памяти, отведенной для

Копирует в ОЗУ прямоугольную область экрана

хранения данного изображения

Function ImageSize (x l , y l , x2, y2 : Integer) : Word;(x l , y l ) и (x2, y2) — координаты про-тивоположных углов прямоугольника, ограничивающего область экрана. Результат — объем информации в байтах

Определяет размер в байтах памяти, необходимой для хранения прямоугольной области экрана

Procedure Putlmage (х, у : Integer;Var BitMap : Pointer; Bi tBl t : Word); (x, у) — координаты левого верхнего угла для выводимого изображения; BitMap — указатель области памяти; BitBlt — код логической операции

Выводит изображение из области памяти ЭВМ в указанную область экрана с заданной логической операцией наложения нового изображения на старое

Page 382: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Function Date : TDateTime; Возвращает текущую дату

Function DateToStr (D : Преобразует дату в строку символов

TDateTime) : String;

Function DateTimeToStr (D :TDateTime) : String;

Преобразует дату и время в строку символов

Function FormatDateTime(Format: String; Value :TDateTime) : String;

Преобразует дату и время из параметра Value встроку символов в соответствии соспецификаторами параметра Format

Function Now : TDateTime; Возвращает текущие дату и время

Function Time : TDateTime; Возвращает текущее время

Function TimeToStr (T:TDateTime) : String;

Преобразует время в строку

Интерфейс Назначение

Function AnsiLowerCase (const S: String) : String;

Возвращает исходную строку S, в которой всепрописные буквы заменены строчными всоответствии с национальной кодировкой Windows(т. е. с учетом кириллицы)

Function AnsiUpperCase (const S: String) : String;

Возвращает исходную строку S, в которой всестрочные буквы заменены прописными всоответствии с национальной кодировкой Windows

Function Concat (S1 [, S2, . . . , SN] : String) : String;

Возвращает строку, представляющую собойсцепление строк-параметров S1, S2 , . . . , SN

Function Copy (S : String; N, К : Integer) : String;

Из строки S копирует К символов, начиная ссимвола с номером N

Procedure Delete (Var S : String; N, К : Integer);

Удаляет К символов из строки S, начиная ссимвола с номером N

Таблица ПЗ.2

Подпрограммы для работы со строками

Page 383: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Procedure Insert (SubSt : String;Var S : String; N : Integer);

Вставляет подстроку SubSt в строку S, начиная ссимвола с номером N

Function Length (St : String) : Integer;

Возвращает текущую длину строки St

Function LowerCase (const S : String) : String;

Возвращает исходную строку S, в которой вселатинские прописные буквы заменены строчными

Function Pos (SubSt, S : String) : Integer;

Отыскивает в строке S первое вхождение подстроки SubSt и возвращает номер позиции, с которой она начинается. Если подстрока не найдена, возвращается 0

Procedure SetLength (S : String; NewLength : Integer);

Устанавливает новую (меньшую) длину NewLength строки S-Если NewLength больше текущей длины строки, обращение к SetLength игнорируется

Function StringOfChar (Ch : Char; К : Integer) : String;

Создает строку, состоящую из К раз повторенногосимвола Ch

Function StringToOleStr (constSource : String) : PWideChar;

Копирует обычную строку в двухбайтную

Function StringToWideChar (const Source : String; Dest : PWideChar; DestSize : Integer) : PWideChar;

Преобразует обычную строку в строку с символами Unicode

Function Uppercase (const S :String) : String;

Возвращает исходную строку S, в которой все строчные латинские буквы заменены прописными

Подпрограммы преобразования строк к другим типам

Function StrToCurr (S : String) : Currency;

Преобразует символы строки S в целое число типа Currency. При этом строка не должна содержать ведущих или ведомых пробелов

Function StrToDate (S : String) : TDateTime;

Преобразует символы строки S в дату. При этом строка должна содержать два или три числа, разделенных правильным для Windows разделителем даты. Первое число — правильный день, второе — правильный месяц. Если указано третье число, оно должно задавать год в формате XX или ХХХХ.Если символы года отсутствуют, дата дополняется текущим годом

383

Page 384: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Function StrToDateTime (S : String) : TDateTime;

Преобразует символы строки S в дату и время. При этом строка должна содержать правильные дату и время, разделенныепробелом

Function StrToFloat (S : String) :Extended;

Преобразует символы строки S в вещественное число

Function StrToInt (S : String) : Integer;

Преобразует символы строки S в целое ЧИСЛО

Function StrToIntDef (S : String;D : Integer) : Integer;

Преобразует символы строки S в целое число. Если строка не содержит правильного представления целого числа, возвращается значение D

Function StrToIntRange (S :String; Min, Max: Longint) :Longint;

Преобразует символы строки S в целое число ивозбуждает исключение Е Range Error, если числовыходит из заданного диапазона Min.. Мах

Function StrToTime (S : String) :TDateTime;

Преобразует символы строки S во время. При этомстрока должна содержать два или три числа,разделенных правильным для Windowsразделителем времени. Числа задают часы, минутыи, возможно, секунды. За последним числом черезпробел могут следовать символы «ат» или «рт»,указывающие на 12-часовой формат времени

Procedure Val (S : String; Var X; С : Integer);

Преобразует строку символов S во внутреннее представление целой или вещественной переменной X, которое определяется типом этой переменной. Параметр С содержит нуль, если преобразование прошло успешно, и тогда в X помещается результат преобразования. В противном случае параметр содержит номер позиции в строке S, где обнаружен ошибочный символ, и в этом случае содержимое X не

изменяется. В строке S могут быть ведущие и (или)ведомые пробелы

Подпрограммы приведения к строковому типу

Function DateTimeToStr (Value : TDateTime) : String;

Преобразует дату и время из параметра Value в строку символов

Procedure DateTimeToString (Var S : String; Format: String; Value: TDataTime);

Преобразует дату и время из параметра Value в строку S в соответствии со спецификаторами параметра Format

Page 385: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Function DateToStr (Value: TDateTime) : String;

Преобразует дату из параметра Value в строку символов

Function FloatToStr (Value : Преобразует вещественное значение Value в строкусимволов

Function FloatToStrF (Value : Extended; Format: TFloatFormat; Precision, Digits : Integer) : String;

Преобразует вещественное значение Value в строкусимволов с учетом параметра Format и параметров Precision и Digits

Function Format (const Format: String; const Args: array of const) : String;

Преобразует произвольное число аргументовоткрытого массива Args в строку в соответствии соспецификаторами параметра Format

Function FormatDateTime(Format: String; Value :TDateTime) : String;

Преобразует дату и время из параметра Value в строку символов в соответствии со спецификаторами параметра Format

Function FormatFloat (Format: String; Value : Extended) : String;

Преобразует вещественное число Value в строкусимволов в соответствии со спецификаторамипараметра Format

Function IntToHex(Value :Integer; Digits : Integer) : String;

Преобразует целое число Value в строку символьного представления шестнадцатеричного формата: Digits — минимальное число символов в строке

Function IntToStr (Value : Integer) : String;

Преобразует целое число Value в строку символов

Procedure Str (X [:Width [:Decimals]]; Var S : String);

Преобразует число X любого вещественного или целого типа в строку символов S; параметры Width и Decimals, если они присутствуют, задают формат преобразования: Width определяет общую ширину поля, выделенного под соответствующее символьное представление числа X, а Decimals — число символов в дробной

части (этот параметр имеет смысл только в случае если X — вещественное число)

Function TimeToStr (Value: Преобразует время из параметра Value в

1 Date 1 ime) : string; строку символов

385

____ - ‘

Page 386: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Procedure AssignFile (Var F; FileName : String);

Связывает файловую переменную F с именем файла FileName

Procedure CloseFile (Var F); Закрывает файл, при этом связь файловой переменной F с именем файла, установленная ранее процедурой AssignFile, сохраняется

Function EOF (Var F) : Boolean; Тестирует конец файла и возвращает значение True, если файловый указатель стоит в конце файла. При записи это означает, что оче-редной компонент будет добавлен в конец файла, а при считывании — что файл исчерпан

Procedure Erase (Var F); Уничтожает файл F, причем перед выполнением процедуры его необходимо закрыть. В ряде случаев вместо процедуры Erase удобнее использовать функцию DeleteFile, которая не требует предварительного связывания имени файла с файловой переменной

Function FileExists (const FileName : String) : Boolean;

Возвращает значение True, если файл с именемFileName (и, возможно, с маршрутом доступа),существует

Function FindFirst (const Path : String; Attr : Integer; Var F : TSearchRec) : Integer;

Возвращает атрибуты первого из файлов, зарегистрированных в указанном каталоге: Path — маршрут поиска и маска выбора файлов; Attr — атрибуты выбираемых файлов; F — переменная типа TSesrchRec, в которой будет возвращено имя первого выбранного файла. При успешном поиске возвращает значение 0

Procedure FindClose (Var F: TSearchRec);

Освобождает память, выделенную для поискафайлов функциями FindFirst и FindNext

Function FindNext (Var F: TSearchRec) : Integer;

Возвращает в переменой F имя следующего файлав каталоге, причем переменная F должна предварительно инициализироваться обращениемк функции FindFirst. При успешном поиске возвращает значение 0

386

Page 387: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Интерфейс Назначение

Procedure Flush (Var F); Очищает внутренний буфер файла и таким образом гарантирует сохранность всех последних изменений файла на диске

Procedure GetDir (D : Byte; Var S: String);

Возвращает имя текущего каталога (каталога поумолчанию): D — номер устройства (0 —устройство по умолчанию, 1 — дискА, 2 — диск Ви т.д . ) ; S — переменная типа String, в которойвозвращается путь к текущему каталогу науказанном диске

Procedure MkDir (Dir : String); Создает новый каталог на указанном диске: Dir —маршрут поиска каталога. Последним именем в маршруте, т.е . именем вновь создаваемого каталога, не может быть имя уже существующего каталога

Procedure Rename (Var F; S : String);

Переименовывает файл F (S — строковое выражение, содержащее новое имя файла), причем перед выполнением процедуры необходимо закрыть файл

Procedure Reset (Var F: File; RecSize : Word]);

Открывает существующий файл (RecSize имеетсмысл только для нетипизирован- ных файлов) иопределяет размер блока данных

Procedure Rewrite (Var F: File [; Recsize: Word]);

Создает новый файл (RecSize имеет смысл только для нетипизированных файлов) и определяет размер блока данных

Procedure RmDir (Dir : String); Удаляет каталог Dir, причем удаляемый каталог должен быть пустым, т. е. не должен содержать файлов или имен каталогов нижнего уровня

Page 388: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

СПИСОК ЛИТЕРАТУРЫ

1. Абрамов В. Г. Введение в язык Паскаль / В. Г. Абрамов, Н. П. Трифонов, Г.Н.Трифонова. — М. : Наука, 1988.2. Ван Тассел Д. Стиль, разработка, эффективность, отладка и испытаниепрограмм / Д. Ван Тассел. — М. : Мир, 1981 .3. Вирт Н. Алгоритмы и структуры данных / Н. Вирт. — М.: Мир, 1989.4. Гладков В. П. Задачи по информатике на вступительном экзамене в ВУЗ иих решения / В.П.Гладков. — Пермь : изд-во Перм. техн. ун-та, 1994.5. Грогоно П. Программирование на языке Паскаль / П. Грогоно. — М.: Мир,1982.

6 .Дагене В.А. 100 задач по программированию/ В.А.Дагене, Г.К.Гри- гас,К.Ф.Аугутис. — М. : Просвещение, 1993.7. Delphi: книга рецептов. Практические примеры, трюки и секреты / пер. сче ш.; под ред. М. В. Финикова, О. И. Березкиной. — (Серия «Просто о сложном»),— СПб. : Наука и техника, 2006.8. Епашников А. М. Программирование в среде ТурбоПаскаль 7.0 / А.М.Епашников, В.А Епашников. — М. : МИФИ, 1994.9. Задачи по программированию / [С. А.Абрамов, Г. Г. Гнездилова, Е. Н.Капустина и др.]. — М. : Наука, 1988.10. Зубов В. С. Программирование на языке Turbo Pascal (версии 6.0 и 7.0) / В.С. Зубов. — М. : Информационно-издательский дом «Филинъ», 1997.11. Иванова Г. С. Объектно-ориентированное программирование : учеб. длявузов / Г. С. Иванова, Т. Н. Ничушкина, Е. К. Пугачев ; под ред. Г. С. Ивановой. —М.: Изд-во МГТУ им. Н.Э.Баумана, 2001.12. Информатика. Задачник-практикум : в 2 т. / под ред. И.Семакина,Е.Хеннера. — М. : Лаборатория Базовых Знаний, 1999.13. Истомин Е. П. Программирование на алгоритмических языках высокогоуровня / Е. П. Истомин, С. Ю. Неклюдов. — СПб. : Изд-во Михайлова В.А., 2003.14. Йенсен К. Паскаль — руководство для пользователей и описание языка / К.Йенсен, Н.Вирт. — М. : Мир, 1982.15. Касаткин В. Н. Информация. Алгоритмы. ЭВМ / В. Н. Касаткин. — М.:Просвещение, 1991.16. Культин Н. Б. Delphi в задачах и примерах / Н. Б. Культин. — СПб.: БХВ-Петербург, 2005.17. Ляхович В.Ф. Руководство к решению задач по основам информатики ивычислительной техники / В.Ф.Ляхович. — М.: Высш. шк., 1994.18. Марченко А. И. Программирование в среде Turbo Pascal 7.0 / А. И.Марченко, Л. А. Марченко ; под ред. В. П.Тарасенко. — Киев : ВЕК+, М.: БиномУниверсал, 1998.

388

Page 389: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

19. Миков А. И. Информатика. Введение в компьютерные науки / А. И.М иков. — Пермь : изд-во ПГУ, 1998.20. Пилыциков В. Н. Сборник упражнений по языку Паскаль / В. Н. Пильщиков. — М.: Наука, 1989.21. Попов Б. В. TURBO PASCAL для школьников. Версия 7.0 / Б. В. Попов. — М. : Финансы и статистика, 1996.22. Фаронов В. В. Delphi. Программирование на языке высокого уровня : учебник для вузов / В. В. Фаронов. — СПб. : Питер, 2003.23. Хонсбергер Р. Математические изюминки / Р. Хонсбергер. — М. : Наука, 1992.24. Шень А. Программирование: теоремы и задачи / А.Шень. — М.: МЦНМ О, 1995.25. Шупруга В. В. Delphi 2006 на примерах / В. В. Шупруга. — СПб. : БХВ-Петербург, 2006.

Page 390: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

ОГЛАВЛЕНИЕ

Предисловие......................................................................................................................3

Глава 1Основные принципы алгоритмизации и программирования

1.1...............................................................................Алгоритмы и величины.....................................................................................................................................61.2.....................................................Линейные вычислительные алгоритмы...................................................................................................................................101.3..................................Ветвления и циклы в вычислительных алгоритмах ................................................................................................................................... 131.4..........................................................Логические основы алгоритмизации ................................................................................................................................... 221.5................................................Вспомогательные алгоритмы и процедуры ................................................................................................................................... 261.6..................................................Основы структурного программирования ................................................................................................................................... 281.7...................................Развитие языков и технологий программирования ................................................................................................................................... 341.8.. . .Структура и способы описания языков программирования высокого уровня ...................................................................................................................... 39

Глава 2 Программирование на языке Паскаль

2.1........................................................Первое знакомство с языком Паскаль 43 2.2............................................Некоторые сведения о системе ТурбоПаскаль 48 2.3..................................................................Элементы языка ТурбоПаскаль 50 2.4............................................................................Концепция типов данных 51

2.5.Арифметические операции, функции, выражения. Оператор присваивания562.6.............................................Ввод данных с клавиатуры и вывод на экран 62 2.7..............................................Управление символьным выводом на экран672.8............................................Логические величины, операции, выражения712.9....................................Функции, связывающие различные типы данных742.10............................................Программирование ветвящихся алгоритмов

390

Page 391: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Гла в а 3 Методы построения алгоритмов

3.1. Метод последовательной детализации ..................................................................... 1743.2. Рекурсивные методы ................................................................................................... 1823.3. Методы перебора в задачах поиска .......................................................................... 1853.4. Методы сортировки данных и сложность алгоритмов ......................................... 191

Глава 4Объектно-ориентированное программирование

4.1. Что такое объектно-ориентированное программирование ................................. 1994.2. Объекты в ТурбоПаскале ........................................................................................... 2024.3. Интегрированная среда программирования Delphi..............................................2104.4. Компоненты Delphi. Свойства компонентов..........................................................214

4.5. Событийно-управляемое программирование........................................................2284.6. Технология создания приложений в Delphi............................................................2324.7. Примеры разработки приложений Delphi..............................................................2364.8. Иерархия классов ........................................................................................................ 247

Глава 5 Задачи по программированию

5.1. Тема «Линейные программы»...................................................................................2525.1.1. Формулы ............................................................................................................ 2525.1.2. Математические задачи .................................................................................. 2535.1.3. Логические выражения ................................................................................... 2565.1.4. Области, описываемые логическими выражениями ................................ 259

5.2. Тема «Ветвление».........................................................................................................266

5.2.1......................................Текстовые задачи266

5.2.2.....................................Значения функций271

5.3. Тема «Оператор выбора» ............................................................................................ 2735.4. Тема «Циклы» ............................................................................................................... 275

5.4.1. Циклы с заданным числом повторений ....................................................... 2755.4.2. Суммы и произведения числовых последовательностей .......................... 278

5.4.3. Итерационные циклы......................................................................................2805.4.4. Табулирование функций ................................................................................. 2815.4.5. Ввод и обработка последовательностей ........................................................ 282

5.5. Тема «Целочисленная арифметика» ........................................................................ 2845.6. Тема «Подпрограммы» ............................................................................................... 289

5.6.1. Нерекурсивные процедуры и функции ........................................................ 289

5.6.2. Рекурсивные процедуры и функции............................................................2935.7. Тема «Одномерные массивы» .................................................................................... 2945.8. Тема «Двухмерные массивы» .................................................................................... 302

5.8.1. Формирование массивов.................................................................................302

5.8.2. Операции с элементами массивов.................................................................3085.9. Тема «Работа со строками» ........................................................................................ 313

391

Page 392: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

5.11. Тема «Множества».....................................................................................................3195.12. Тема «Записи» ............................................................................................................. 3235.13. Тема «Файлы» ............................................................................................................ 326

5.13.1. Типизированные числовые файлы.............................................................3265.13.2. Файлы записей................................................................................................327

5.13.3. Текстовые файлы...........................................................................................3295.14. Тема «Модули»...........................................................................................................333

5.15. Тема «Динамические структуры данных»............................................................3405.16. Тема «Графика» .......................................................................................................... 344

5.16.1. Черчение...........................................................................................................3445.16.2. Рисование ......................................................................................................... 3455.16.3. Построение графиков....................................................................................349

5.17. Тема «Объектно-ориентрованное программирование»......................................3505.18. Тема «Визуальное программирование оконного интерфейса».........................3555.19. Тема «Большие проекты»........................................................................................360

Приложение 1. ТурбоПаскаль. Модуль CRT...................................................................367

Приложение 2. ТурбоПаскаль. Модуль GRAPH.............................................................370

Приложение 3. Delphi. Некоторые подпрограммы.........................................................382

Список литературы.............................................................................................................388

Page 393: bolohovomt.rubolohovomt.ru/doc/algoritm_programmirovanie.pdfУДК 681.3.06(075.32) ББК22.18я723 С30 Рецензенты: Семакин И. Г. С 30 Основы алгоритмизации

Учебное издание

Семакин Игорь Геннадьевич,

Шестаков Александр Петрович

Основы алгоритмизации и программирования

Учебник3-е издание, стереотипное

Редактор В.Н.Махова Технический редактор Е. Ф. Коржуева Компьютернаяверстка: Т. А. Клименко Корректоры А.И.Авдошкина, И. В. Могилевец

Изд. № 103108308. Подписано в печать 19.12.2011. Формат 60 х90/16.Бумага офсетная № 1. Печать офсетная. Гарнитура «Таймс». Уел. печ. л. 25,0.Тираж 1 500 экз. Заказ № 4110.

ООО «Издательский центр «Академия», www.academia-moscow.ru 125252, Москва, ул.