Семакин информатика 11 кл 1.pdf

  • pdf
  • 29.04.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Семакин информатика 11 кл 1.pdf

ФГОС



ФГОС

И. Г. Семакин, Е. К. Хеннер,

Л. В. Шестакова

ИНФОРМАТИКА

УГЛУБЛЕННЫЙ УРОВЕНЬ

Учебник для 1 1 класса

в 2-х частях

Часть 1

Рекомендовано

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

Москва

БИНОМ. Лаборатория знаний

2014

удк 004.9

ББК 32.97 сзо

Семакин И. Г.

СЗО Информатика. Углубленный уровень учебник для 11 класса : в 2 ч. Ч. 1 / И. Г. Семакин, Е. К. Хеннер, Л. В. Шестакова. — М. : БИНОМ. Лаборатория знаний, 2014. 176 с. : ил.

ISBN 978-5-9963-1687-8 (Ч. 1)

ISBN 978-5-9963-1689-2

Учебник предназначен для изучения курса информатики на углубленном уровне в 11 классах общеобразовательных учреждений. Содержание учебника опирается на изученный в 7—9 классах курс информатики для основной школы и разработано в соответствии с Федеральным государственным образовательным стандартом для среднего (полного) образования 2012 г. Рассматриваются теоретические основы информатики, аппаратное и программное обеспечение компьютера, современные информационные и коммуникационные технологии.

Учебник входит в учебно-методический комплект, включающий также учебник для 10 класса, практикум и методическое пособие для учителя.

удк 004.9

ББК 32.97

Учебное изДание

Семакин Игорь Геннадьевич Хеннер Евгений Карлович

Шестакова Лидия Валентиновна

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

УГЛУБЛЕННЫЙ УРОВЕНЬ

Учебник для 11 класса

В двух частях

Часть первая

Ведущий редактор О. А. Полежаева

Ведущие методисты: И. Л. Сретенская, И. Ю. Хлобыстова

Художники: Н. А. Новак, Я. В. Соловцова, Ю. С. Белаш

Технический редактор Е. В. Денюкова Корректор Е. Н. Клитина

Компьютерная верстка: В. А. Носенко

Подписано в печать 20.03.14. Формат 70х 100/16.

Усел. печ. л. 14,30. Тираж 15 ООО экз. Заказ 35585.

Издательство «БИНОМ. Лаборатория знаний»

125167, Москва, проезд Аэропорта, д. З

Телефон: (499) 157-5272 e-mail: binom@Lbz.ru http://www.Lbz.ru, http://e-umk.Lbz.ru, http://metodist.Lbz.ru

При участии ООО Агентство печати « Столица» www.apstolica.ru; e-mail: apstolica@bk.ru

Отпечатано в соответствии с качеством предоставленных издательством электронных носителей в ОАО «Саратовский полиграфкомбинат».

410004, г. Саратов, ул. Чернышевского, 59. www.sarpk.ru

rsBN 978-5-9963-1687-8 (Ч. 1)

            ISBN 978-5-9963-1689-2                   О БИНОМ. Лаборатория знаний, 2014

ОТ АВТОРОВ

Уважаемые старшеклассники!


Этот учебник предназначен для изучения курса «Информатика» в 11 классе на углубленном уровне. Вы уже не новички в информатике. В 7—9 классах вы изучали курс информатики для основной школы. В результате вы получили необходимые базовые знания и умения в этом предмете. В курсе для 7—9 классов вы познакомились с элементами всех основных разделов современной информатики: теоретической информатики, информационных и коммуникационных технологий, социальной информатики.

Освоив курс для основной школы, вы прошли через самый первый уровень погружения в информатику. Углубленный курс для старших классов, к изучению которого вы приступили в 10 классе и продолжаете изучать в 11 классе, это второй уровень погружения. Тем из вас, кто после окончания школы поступит в вузы на профильные по отношению к информатике специальности, предстоит третий уровень погружения в этот предмет. Это уже будет профессиональный уровень, в результате освоения которого вы станете специалистами в какой-то определенной области информатики и информационно-коммуникационных технологий (ИКТ).

Авторы курса желают вам успеха в освоении непростого, но очень интересного и актуального учебного предмета!

Навигационные значки

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

О • важное утверждение или определение;

вопросы и задания;

О материал для подготовки к итоговой аттестации;

О дополнительный материал;

практические работы на компьютере; интернет-ресурсы;

проектные или исследовательские задания;

1)


практикум

1) Семакин И. Г., Хеннер Е. К., Шеина Т. Ю., Шестакова Л. В. Информатика. Углубленный уровень: практикум для 10—11 классов. М.: БИНОМ. Лаборатория знаний, 2013.

Глава 1

ИНФОРМАЦИОННЫЕ СИСТЕМЫ

1 .1 . Основы системного подхода

1 .1 .1 . Что такое система


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

Обобщая все приведенные выше примеры, дадим следующее предварительное определение.

Система — это совокупность элементов (материальных или идеальных), обладающая определенной целостностью.

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

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

В свою очередь, АЛУ процессора тоже является системой. В его состав входят сумматоры, полусумматоры и другие элементы. Следовательно, АЛУ — это подсистема процессора. Таким путем

Рис. 1.1. Система — иерархия подсистем

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

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

Информационные системы


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

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

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

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

В науке о системах системологии сформулирован закон, который называется принципом эмерджентности или законом о системного эффекта. Звучит он так: целое больше суммы своих частей. Говоря другими словами: свойства системы не сводятся к совокупности свойств ее частей и не выводятся из них. Слово «эмерджентность» происходит от английского emergence внезапное появление. Например, сложная система организма животного или человека создает системный эффект, который называется жизнью. Выход из строя какой-либо подсистемы организма (кровообращения, пищеварения и др.) приводит к утрате жизни.

Основы системного подхода


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

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

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

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

о Структурой системы называется совокупность связей, существующих между частями (элементами) системы. Наглядным примером отображения структуры системы являются схемы электрических цепей. Элементы электрического устройства соединяются между собой двумя способами: последовательно и параллельно. От способа соединения зависит свойство всей цепи. Например, если три проводника, имеющие сопротивления R1, R2, R3, соединить последовательно, то общее сопротивление цепи будет равно R1 + R2 + R3, а если параллельно

(R1•R2 + R1•R3 + R2•R3). Первое сопротивление больше второго. Поэтому, например, при пропускании электрического тока в первой цепи будет выделяться больше тепла, чем во второй.

Информационные системы


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

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

Обобщая все сказанное о системах, сформулируем следующее определение.

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

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

Система основных понятий

Что такое система

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

 

Свойства системы

Целесообраз- ность

Целостность

Структуриро- ванность

Иерархическая совокупность подсистем

Связь со средой

Системный эффект:

всякая система приобретает новые свойства, не присущие ее составным частям. Целое больше суммы своих частей

Системный подход — основа научной методологии:

Основы системного подхода


рассмотрение всякого объекта изучения в качестве системы, а также учет его существенных связей с внешней средой

Вопросы и задания

1.   Что такое система? Приведите примеры.

2.   Что такое структура системы? Приведите примеры.

З. Приведите примеры систем, имеющих одинаковый состав (одинаковые элементы), но разную структуру.

4.    В чем суть системного эффекта? Приведите примеры.

5.    Что такое подсистема?

6.    Выделите подсистемы в следующих объектах, рассматриваемых в качестве систем: • костюм;

    автомобиль;

    компьютер;

    городская телефонная сеть; школа; армия;

    государство.

7.    Удаление каких элементов из систем, названных в задании 6, приведет к потере системного эффекта, т. е. к невозможности выполнения основного назначения систем? Попробуйте выделить существенные и несущественные с позиции системного эффекта элементы этих систем.


1 .1.2. Модели систем

Системный анализ

Исследование некоторой реальной системы состоит из двух этапов: анализа и синтеза.

Анализ системы это выделение ее частей с целью прояснения состава системы. В предыдущем разделе мы говорили, что каждая часть системы это подсистема, и у этой подсистемы есть свои части. Однако невозможно раскладывать систему бесконечно. На чем-то придется остановиться. Какие-то части принять за простые, далее неделимые элементы. Вопрос о том, на чем следует остановить «дробление» системы, зависит от цели исследования. Целью исследования системы является получение ее модели приближенного представления об устройстве и функционировании системы. Полученная модель будет использоваться для прогнозирования поведения системы в некоторых условиях, для управления системой, для диагностики сбоев в функционировании системы и пр.

формационные системы


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

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

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

Модель «черного ящика»

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

СРЕДА

Входы

СИСТЕМА

 

 

 

 

 

Выходы

РИС. 1.2. Модель «черного ящика»

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

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

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

Модель состава

Основы системного подхода

 

11

Как отмечалось выше, результатом анализа системы является определение ее состава. Если описание системы ограничить перечислением ее частей, то мы получим модель состава. Например, модель состава системы «Университет» представлена на рис. 1.3.

УНИВЕРСИТЕТ

АДМИНИСТРАЦИЯ

 

ПРЕПОДАВАТЕЛИ

 

НАУЧНЫЕ

ЛАБОРАТОРИИ

 

СТУДЕНТЫ

 

УЧЕБНЫЕ

КОРПУСА И АУДИТОРИИ

 

Рис. 1-3. Модель состава университета

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

Структурная модель системы

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

Информационные системы


Граф состоит из вершин, обозначающих элементы системы, и ребер — линий, обозначающих связи (отношения) между элементами системы. Знакомая многим схема метрополитена Москвы (рис. 1.4) является примером графа. Вершинами здесь являются станции метро, а ребрами перегоны для поездов между стан-

Рис. 1 А. Схема Московского метрополитена


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

Еще один пример графа показан на рис. 1.5. Это структурная модель молекулы углеводорода. Вершинами являются атомы водорода и углерода, ребра отображают валентные связи.

н

Основы системного подхода


н

Рис. 1.5. Граф структуры молекулы углеводорода

Связь между двумя станциями метро, соединенными линией движения, является двунаправленной, поскольку поезда могут двигаться в обе стороны. Валентная связь между атомами молекулы также не имеет выделенного направления. Такие графы называются неориентированными. Если же связь между двумя элементами системы действует только в одну сторону, то на графе она отображается направленной стрелкой. Такой граф называется ориентированным. Направленные линии связи на графе называются дугами.

На рисунке 1.6 приведен пример ориентированного графа из области медицины. Известно, что у людей кровь может различаться по группе. Существуют четыре группы крови. При переливании крови от одного человека к другому не все группы совместимы. Граф на рис. 1.6 показывает возможные варианты переливания крови. Группы крови изображаются вершинами графа с соответствующими номерами, а стрелки указывают на возможность переливания крови одной группы человеку с другой группой. Например, из этого графа видно, что кровь группы можно переливать любому человеку, а человек с I группой крови воспринимает только кровь своей группы. Видно также, что человеку с IV группой крови можно переливать любую кровь,

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

О На практике часто встречаются системы с иерархической структурой, граф которых называется деревом (рис. 1.7).

Информационные системы


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

Рис. 1.7. Дерево

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

Система основных понятий

                         Модели систем

Модель

«черного ящика»:

представляет систему на уровне описаний ее входов и выходов

Модель состава:

перечень составляющих систему частей (подсистем, элементов)

Структурная модель:

отражает состав и внутренние связи системы

Граф:

графическое отображение структурной модели; состоит из вершин и линий (ребер, дуг)

Дерево:

ориентированный граф системы с иерархической структурой; связь — «один-ко-многим»; не содержит петель

Вопросы и задания

1.   Какие существуют типы моделей систем? Чем они различаются?

2.   Что такое граф? Из чего он состоит?

Основы системного подхода


З. Какой граф называется неориентированным? Приведите примеры.

4.    Какой граф называется ориентированным? Приведите примеры.

5.    Нарисуйте в виде графа систему, состоящую из четырех одноклассников, между которыми существуют следующие связи (взаимоотношения): Дружат — Саша и Маша, Саша и Даша, Маша и Гриша, Гриша и Саша. Анализируя полученный граф, ответьте на вопрос: с кем Саша может поделиться секретом, не рискуя, что он станет известен кому-то другому?

6.    Нарисуйте два варианта графа системы «Компьютер», содержащего следующие вершины: процессор, оперативная память, долговременная память, клавиатура, монитор, принтер. В первом варианте линия связи обозначает отношение «передает информацию», во втором отношение «управляет».

Практикум. Раздел «Системология»

1 .1 „З. Что такое информационная система

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

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

Информационные системы


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

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

Наиболее крупные информационные системы работают на базе глобальных компьютерных сетей. Примером является «Полет-Сирена» — информационная система воздушного транспорта, главная страница которой показана на рисунке 1.8. Терминалом доступа к этой системе может служить любой компьютер, подключенный к Интернету. Однако существует множество «глобальных» ИС не общего, а ограниченного доступа и масштаба это корпоративные системы. Они могут объединять локальные сети предприятий одного ведомства и способствовать их общему эффективному управлению в рамках региона, министерства и пр.

СВЕЛ. СИРЕН                                 www.potets.ru

цепр

Гпаяиая Расписание                                                                                                                                                    Fnglish Г-ДО Книга отзывов

Город отправления

Город прибытия

С деты

На период

                        Показывать: обратные'

Сорт»овать по

Г1осно ть

По телефону

Времени вылете

Рис. 1.8. Информационная система «Полет-Сирена»

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


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

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

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

Области применения информационных систем

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

Информационные системы


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

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


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

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

Основы системного подхода

 


Широкое распространение в последнее время получили геоинформационные системы (ГИС). ГИС базируются на картах территорий. Большое количество нужной людям информации оказывается привязанным к географическим картам. Это сведения о расположении в городе различных организаций, магазинов, культурных учреждений, больниц и пр. Информация, необходимая для работы геологов, строителей, работников транспорта, для туристов связана с картами. Например, существует электронный государственный земельный кадастр Российской Федерации информационная система, содержащая реестр сведений о земле, находящейся в хозяйственном обороте (сельскохозяйственном, промышленном и т. д.). Очевидно, что без привязки к карте такой кадастр создать было невозможно. Другой, знакомый многим из вас пример ГИС — информационная система ГИСметео, позволяющая получать справки о погоде по всему миру (рис. 1.9).

Экспертные системы системы, основанные на моделях знаний в предметных областях. Информационной основой экспертной системы является база знаний. База знаний это формализованная система знаний высококвалифицированного специалиста в определенной предметной области. Экспертная система используется для консультаций пользователя, помощи в принятии сложных решений, решения плохо формализуемых задач. Примерами проблем, которые решаются с помощью экспертных систем, являются: установление диагноза больного; определение причин неисправности сложной техники (например, самолетов); рекомендации по ликвидации неисправности; определение вероятных последствий принятого управляющего решения и т. д. Экспертные системы часто включают в состав АСУ в качестве подсистем.

Карта погоды

2010-0146

2010-01-07

2010-01-08

201041-09

 

 

 

Рис. 1.9. Информационная система ГИСметео. Карта погоды

О профессиях: профессии, связанные с созданием информационных систем

В реестре специальностей высшего профессионального образования имеется специальность «специалист по информационным системам». Это одна из наиболее востребованных сегодня инженерных профессий. В круг служебных обязанностей специалиста по ИС входит:

Информационные системы

   


разработка концепции информационной системы;

    проектирование архитектуры ИС;

    проектирование модели данных, на основе которой будет создаваться БД;

    построение логической схемы базы данных;

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

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

Основы системного подхода


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

Система основных понятий                                                         О

Информационные системы

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

Техническая база

Состав ИС

На одном компьютере

На базе компьютерной сети (локальной или глобальной)

База данных

Клиентские приложения

Пользовательский

интерфейс

Области применения ИС

Информацион-

но-справочная (информационно-поисковая) система (ИПС)

АСУ (принятие

управленческих решений)

Геоинфор- мационные

системы

(ГИС)

Обучение,

дистанционное образование

Эксперт-

ные системы

Профессии, связанные с ИС

Специалист по информацион-

ным системам

Администратор баз данных

Системный аналитик

Системный архитектор


О Вопросы и задания

О 1. Какие основные признаки современной информационной системы можно выделить?

2. К каким типам ИС относятся следующие системы:

    система прогноза погоды для различных регионов страны;

    система автоматического тестирования для подготовки к сдаче ЕГЭ;

    система диспетчерской службы крупного аэропорта;

    система диагностики в кардиологической клинике?

З. Придумайте возможные области использования информационных систем в деятельности школы. К какому типу ИС относится каждая из придуманных вами систем?

1 . 1 .4. Инфологическая модель предметной области

Информационные системы


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

Учебный процесс — многокомпонентная и достаточно сложная система. Чтобы описать ее в полном объеме, нам потребовалось бы много времени и места в учебнике. Упростим себе задачу. Для этого сформулируем ограниченный круг целей, на достижение которых будет направлена разработка информационной системы. Зададимся вопросом: кто будет пользователем ИС и какие возможности система должна предоставлять пользователям?

Назовем нашу информационную систему «Классный журнал». Только это будет не бумажный, а электронный журнал. Его пользователями будут: учителя, преподающие в классе, ученики этого класса и их родители. Учителю система должна предоставлять возможность выставлять оценки ученикам. Кроме того, в ИС должны храниться адреса и домашние телефоны учеников. Родители должны иметь возможность получать информацию об успеваемости своих детей по каждому предмету, по датам получения оценок, а также узнавать фамилии, имена и отчества учителей-предметников. Информацию о своих оценках могут получать и сами ученики. Такая система может быть подсистемой ИПС школы, содержащей информацию об успеваемости всех ее учащихся во всех классах.

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

1)       ученики одного класса;

2)       изучаемые предметы;

З) оценки, полученные учениками по предметам.

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

Ученик: фамилия; имя; пол; адрес; телефон.

Изучаемый предмет: название предмета; фамилия, имя и отчество учителя.

Основы системного подхода


Оценка: фамилия и имя ученика; предмет; дата получения оценки; выставленный балл.

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

Рис. 1 .10. Структурная схема системы

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


«сущность—связь» Для того чтобы придать нашей схеме на рис. 1.10 вид к ней надо добавить ромбы с указанием имени связи и овалы-выноски с указанием атрибутов объектов. Инфологическая модель учебного процесса представлена на рис. 1.11.

Информационные системы


            1     1

Рис. 1 .11. Инфологическая модель

Имя, данное связи (в ромбе), определяет ее смысл. Есть еще одна характеристика связи тип связи (в теории баз данных она называется показателем кардинальности). Типы связей бывают: «один-к-одному» (1:1), «один-ко-многим» (1:М) и «многие-комногим» (М:М). Например, связь между вершинами УЧЕНИКИ и ОЦЕНКИ — «один-ко-многим», потому что один ученик может получить множество оценок, но одна конкретная оценка, записанная в журнале, относится к одному ученику. Такой же тип имеет связь между предметами и оценками: по одному предмету в журнале выставлено множество оценок, но одна оценка относится к одному предмету.

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

Система основных понятий

Инфологическая модель

Предметная область — область деятельности людей, для которой создается модель

Инфологическая модель — результат системного анализа предметной области

(диаграмма типа «сущность—связь»): отражение инфологической модели в виде графа

сущности

связи

Части (подсистемы) системы вершины графа. Имеют имена и атрибуты

Отражают отношения между вершинами. Имеют имена и типы: 1:1, 1:м, м:м

Вопросы и задания

1.   Что такое инфологическая модель предметной области?

2.   Из каких элементов составляется инфологическая модель?

З. Какие типы связей используются в инфологической модели?

 

25

Реляционные базы данных

4.   В модели учебного процесса для всей школы какой тип связи будет установлен между подсистемами ПРЕДМЕТЫ и УЧИТЕЛЯ?

5.   В модели учебного процесса для всей школы какой тип связи будет установлен между подсистемами КЛАССЫ и КЛАССНЫЕ РУКОВОДИТЕЛИ?

6.   Какие изменения следует внести в модель на рис. 1.11, если предметной областью для нее становится успеваемость учеников во всей школе? Какие новые подсистемы войдут в модель, какие связи будут установлены?

Практикум. Раздел «Системология»

1 .2. Реляционные базы данных

1 .2.1 . Реляционные базы данных и СУБД

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

Классификация баз данных. По содержанию хранимой информации базы данных можно разделить на фактографические и документальные. Фактографические БД содержат данные, представленные в краткой форме, в строго фиксированных форматах. Такие БД являются аналогами бумажных картотек, например библиотечного каталога или каталога видеотеки. Для документальных БД аналогом являются архивы документов, например, архив судебных дел, архив исторических документов и пр. Проектируемая нами база данных со сведениями об успеваемости учеников будет фактографической.

Базы данных классифицируются также по структуре модели данных. Известны три разновидности структур данных: иерархическая, сетевая и табличная. Соответственно по признаку структуры базы данных делятся на иерархические, сетевые и реляционные (табличные). Наиболее распространенным типом являются реляционные БД. В теории баз данных доказано, что любую структуру данных можно свести к табличной форме. Базу данных по успеваемости учеников класса будем делать реляционной.

Информационные системы


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

Структурными составляющими таблицы являются записи и поля.

 

поле 1

поле 2

поле З

 

запись 1

 

 

 

 

запись 2

 

 

 

 

запись З

 

 

 

 

 

 

 

 

 

Каждая запись содержит информацию об отдельном экземпляре объектов, составляющих систему (предметную область): одной книге в библиотеке, одном сотруднике предприятия и т. п. А каждое поле это определенная характеристика (свойство, атрибут) объекта: название книги, автор книги; фамилия сотрудника, год рождения и т. п. Поля таблицы должны иметь имена, отличные друг от друга. В таблице не должно быть совпадаюДля каждой таблицы реляционной БД должен быть определен первичный ключ поле или совокупность полей, однозначно О определяющих запись. Иначе говоря, значение первичного ключа не должно повторяться в разных записях. Например, в библиотечной базе данных таким ключом может быть выбран инвентарный номер книги, который не может совпадать у разных книг.

Для строчного представления структуры таблицы применяется следующая форма:

ИМЯ ТАБЛИЦЫ (ИМЯ_ПОЛЯ 1, ИМЯ_ПОЛЯ_2

Подчеркиваются поля, составляющие первичный ключ.

Название «реляционная база данных» связано с английским словом relation, что в переводе означает «отношение». Отношение в БД — это взаимосвязь полей элементов данных. Наглядным способом отображения отношения является таблица. Поэтому ИМЯ ТАБЛИЦЫ — это имя отношения. Примеры отношений:

БИБЛИОТЕКА (ИНВ НОМЕР, АВТОР, НАЗВАНИЕ, ГОД_ИЗД, ИЗДАТЕЛЬСТВО).

Реляционные базы данных

L


БОЛЬНИЦА (НОМЕР ПАЛАТЫ, НОМЕР МЕСТА, ПАЦИЕНТ, ДАТА_ПОСТУПЛЕНИЯ, ДИАГНОЗ, ПЕРВИЧНЫЙ)

Каждое поле таблицы имеет определенный тип. С типом связаны два свойства поля: множество значений, которые оно может принимать, и множество операций, которые над ним можно выполнять. Существуют четыре основных типа для полей БД: символьный, числовой, логический и дата. Для полей таблиц «Библиотека» и «Больница» могут быть установлены следующие типы: символьный тип: АВТОР, НАЗВАНИЕ, ИЗДАТЕЛЬСТВО, ПАЦИЕНТ, ДИАГНОЗ; числовой тип: ИНВ_НОМЕР, ГОД_ИЗД, НОМЕР ПАЛАТЫ, НОМЕР МЕСТА дата: ДАТА_ПОСТУПЛЕНИЯ; логический: ПЕРВИЧНЫЙ.

В последнем случае поле ПЕРВИЧНЫЙ обозначает следующий факт: больной поступил в больницу с данным диагнозом впервые или повторно. Те записи, где значение этого поля равно TRUE (ИСТИНА), относятся к первичным больным, значение FALSE (ЛОЖЬ) отмечает повторного больного. Таким образом, поле логического типа может принимать только два значения.

В таблице БОЛЬНИЦА используется составной ключ он состоит из двух полей: НОМЕР_ПАЛАТЫ и НОМЕР МЕСТА. Только их сочетание не повторяется в разных записях (ведь фамилии пациентов могут совпадать).

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

Информационные системы

                    


создание структуры БД;  заполнение БД информацией;

                     изменение (редактирование) структуры и содержания БД;

                     поиск информации в БД;

                     сортировка данных;  защита БД;  проверка целостности БД.

О Система основных понятий

                                      Реляционные БД и СУБД              

Классификация баз данных

Фактографические

Содержат данные, представленные в краткой форме, в строго фиксированных форматах

Документальные

Содержат документы в различных форматах

Иерархические

Имеют иерархическую организацию данных (граф — дерево)

Сетевые

Имеют сетевую организацию данных (граф — сеть)

Реляционные

Имеют табличную организацию данных

Основные понятия реляционных БД

Таблица

(отношение)

Основная информационная единица хранения данных. Содержит множество неповторяющихся строк (записей), отражающих свойства (атрибуты) различных объектов

Запись

Отдельная строка в таблице; описывает отдельный объект

Поле

Столбец таблицы, свойство (характеристика, атрибут) объекта

Первичный ключ

Поле или совокупность полей, однозначно идентифицирующая каждую запись в таблице

Тип поля

Определяет допустимые значения и действия над полем (числовой, символьный, логический, дата, время)

Система управления базами данных (СУБД) — программное обеспечение для работы с базами данных

Вопросы и задания

1.   Что такое база данных?

2.   Как классифицируются базы данных по их содержанию?

О

З. Как классифицируются базы данных по способу организации дан-

О

ных?

4. Перечислите и определите основные понятия реляционных БД: таблица, запись, поле, первичный ключ, тип поля.

О

5. что такое СУБД?

О

1.2.2. Проектирование реляционной модели данных

Многотабличная модель данных. Перейдем к следующему этапу разработки информационной системы «Классный журнал». Теперь от инфологической модели системы нам нужно перейти к реляционной модели данных. Для этого требуется:

                     описать отношения, определяющие структуры таблиц базы данных;

                     определить основные ключи;

                     реализовать связи между таблицами.

 

29

Реляционные базы данных

Если в качестве имен отношений (таблиц) принять имена сущностей  на рис. 1.11, а в качестве полей — атрибуты сущностей, то получим:

УЧЕНИКИ (ФАМИЛИЯ, ИМЯ, ПОЛ, АДРЕС, ТЕЛЕФОН)

ПРЕДМЕТЫ (НАЗВАНИЕ_ПРЕДМЕТА, УЧИТЕЛЬ)

ОЦЕНКИ (УЧЕНИК, ПРЕДМЕТ, ДАТА, ОЦЕНКА)

Определим первичные ключи таблиц. В таблице УЧЕНИКИ придется выбрать составной ключ ФАМИЛИЯ + ИМЯ, поскольку только их сочетание не повторяется в каждой записи. Но представьте себе, что в классе есть два полных тезки, например два Королёвых Андрея. Как их различать? Вводить поле ОТЧЕСТВО? Но, во-первых, в школьных журналах это делать не принято, во-вторых, нет гарантии, что и отчество не совпадет. Решение этой проблемы ввести специальные, уникальные идентификаторы учеников (коды учеников). Удобнее всего сделать их целыми числами. Такой номер присваивается ученику один раз при занесении записи в базу — и больше никогда не изменяется.

В таблице ПРЕДМЕТЫ выбор ключа не вызывает проблем. Очевидно, что это название предмета.

В таблице ОЦЕНКИ атрибут УЧЕНИК должен идентифицировать конкретного ученика. В качестве такого идентификатора в таблице УЧЕНИКИ теперь есть поле НОМЕР_УЧЕНИКА. Его


и будем использовать вместо атрибута УЧЕНИК. А вместо атрибута ПРЕДМЕТ будем использовать поле НАЗВАНИЕ ПРЕДМЕТА. В таблице ОЦЕНКИ основной ключ будет составным: НОМЕР

УЧЕНИКА + НАЗВАНИЕ ПРЕДМЕТА + ДАТА. Делается допущение, что по одному предмету в один день в журнал ученику может быть выставлено не более одной оценки.

В итоге получены следующие три отношения, составляющие модель данных:

УЧЕНИКИ (НОМЕР УЧЕНИКА, ФАМИЛИЯ, ИМЯ, ПОЛ,

АДРЕС, ТЕЛЕФОН)

ПРЕДМЕТЫ (НАЗВАНИЕ ПРЕДМЕТА, УЧИТЕЛЬ)

ОЦЕНКИ (НОМЕР_УЧЕНИКА, НАЗВАНИЕ ПРЕДМЕТА,

ДАТА, ОЦЕНКА)

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

1.    Если две таблицы имеют одинаковые первичные ключи, то между ними действует связь «один-к-одному».

Информационные системы

2.   


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

« один-ко-многим» .

В реляционных базах данных связь «многие-ко-многим» непосредственно между двумя таблицами не реализуется. Для ее реализации приходится вводить дополнительную связывающую таблицу. Для нашего проекта такой проблемы нет.

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

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

    все поля таблицы   атомарные, т. е. далее не делимые;

    каждое неключевое поле полностью функционально зависит от первичного ключа;

Чтобы объяснить смысл этих условий, покажем на примере нашей задачи, каким образом можно было осуществлять нормализацию данных. Пусть первоначально мы решили сделать базу данных однотабличной, т. е. собрать все поля в одной таблице. Назовем ее УСПЕВАЕМОСТЬ:

УСПЕВАЕМОСТЬ (НОМЕР_УЧЕНИКА, НАЗВАНИЕ ПРЕДМЕТА,

ДАТА, ОЦЕНКА, УЧИТЕЛЬ, ФАМИЛИЯ, ИМЯ, ПОЛ, АДРЕС, ТЕЛЕФОН)

Каждая запись такой таблицы относится к одной оценке, полученной конкретным учеником по данному предмету в конкретный день учебного года. В базе данных будет столько записей, сколько оценок стоит в журнале. Эта модель удовлетворяет требованиям первой нормальной формы, согласно которой все поля должны быть атомарными. Атомарное поле далее не делится. Например, объединение в одно поле ФИО фамилии, имени и отчества человека нарушает принцип атомарности. Понятие атомарности относительно. Например, если в приложениях не потребуется отдельной обработки названия улицы, номера дома и квартиры, то адрес можно не разбивать на составляющие и считать его атомарным.

Реляционные базы данных


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

На рисунке 1.12 стрелками показаны все функциональные зависимости полей в таблице УСПЕВАЕМОСТЬ. Полностью от составного первичного ключа зависит только поле ОЦЕНКА. Поле УЧИТЕЛЬ функционально зависит только от поля НАЗВАНИЕ

ПРЕДМЕТА. поля ФАМИЛИЯ, ИМЯ, ПОЛ, АДРЕС, ТЕЛЕФОЙ функционально зависят от поля НОМЕР УЧЕНИКА. Разбив таблицу УСПЕВАЕМОСТЬ на три таблицы: УЧЕНИКИ, ПРЕДМЕТЫ, ОЦЕНКИ, получим в каждой из них полную функциональную зависимость от основных ключей, что показано на рис. 1.13.

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

Основным недостатком ненормализованной модели Данных является избыточность информации в БД. Если бы все данные хранились в таблице УСПЕВАЕМОСТЬ, то при занесении разных оценок для одного и того же ученика повторялись бы поля ФАМИЛИЯ, ИМЯ, ПОЛ, АДРЕС, ТЕЛЕФОН. во всех записях, относящихся к одному предмету, повторялась бы фамилия учителя, преподающего этот предмет. В нормализованной базе эти данные будут храниться всего по одному разу, каждое


в своей таблице.

УСПЕВАЕМОСТЬ

НОМЕР УЧЕНИКА

ДАТА

ОЦЕНКА

УЧИТЕЛЬ

ФАМИЛИЯ

имя

пол

АДРЕС

ТЕЛЕФОН

Информационные системы


Рис. 1.12. Функциональные зависимости в таблице УСПЕВАЕмость

Реляционная модель данных

Этапы построения реляционной модели

1) описание структу- ры таблиц

2) определение первич- ных ключей таблиц

З) реализация связей между таблицами

Типы связей в реляционной модели

1:1 — две таблицы имеют одинаковые первичные ключи

1:М — первичный ключ первой таблицы является частью составного ключа второй таблицы или неключевым полем второй таблицы

УЧЕНИКА

ПРЕДМЕТА

 

Система основных понятий УЧЕНИКИ

НОМЕР УЧЕНИКА ФАМИЛИЯ имя пол

АДРЕС

ТЕЛЕФОН

ОЦЕНКИ

НОМЕР

НАЗВАНИЕ ДАТА

ОЦЕНКА

ПРЕДМЕТЫ

НАЗВАНИЕ_ПРЕДМЕТА

УЧИТЕЛЬ

Рис. 1.13. Функциональные зависимости в трех нормализованных таблицах


Нормализация данных

Первая нормальная форма: все поля таблицы — атомарные

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

Третья нормальная форма: между полями таблицы нет транзитивных зависимостей

Модель данных в третьей нормальной форме исключает избыточность

Вопросы и задания

1.   Что такое первичный ключ таблицы?

2.   Каким образом между таблицами устанавливаются связи типа 1:1 и

З. При проектировании БД были определены следующие отношения: МАГАЗИН (НОМЕР_МАГ, ТИП, АДРЕС, ДИРЕКТОР, ТЕЛЕФОН)

ОТДЕЛ (НАЗВАНИЕ_ОТД, ЗАВЕДУЮЩИЙ, ТЕЛЕФОН) ПРОДАВЕЦ (ТАБЕЛЬНЫЙ_НОМ, ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО,

КАТЕГОРИЯ)

Являются ли эти отношения связанными? Добавьте все, что необходимо для их связи; нарисуйте граф соответствующей инфологической модели.

4.    С какой целью производится нормализация модели данных?

5.    В чем заключаются требования первой, второй и третьей нормальных форм?

Реляционные базы данных

6.   


Нормализуйте следующие отношения путем декомпозиции (приведите к третьей нормальной форме):

ПОЛИКЛИНИКА (ФАМИЛИЯ_ПАЦИЕНТА, ДАТА_ПОСЕЩЕНИЯ,

ДАТА_РОЖДЕНИЯ, УЧАСТОК, ВРАЧ, ДИАГНОЗ)

РЕЙС_САМОЛГГА (НОМЕР_РЕЙСА, ДАТА ВЫЛЕТА, ВРЕМЯ ВЫЛЕТА,

ПУНКТ НАЗНАЧЕНИЯ, ТИП САМОЛЕТА, ЧИСЛО МЕСТ,

ВРЕМЯ ПОЛЕТА, КОМАНДИР_КОРАБЛЯ, КЛАСС_ПИЛОТА)

1 .2.3. Создание базы данных

Ог теоретического проектирования структуры базы данных нам предстоит перейти к ее практическому созданию на компьютере. База данных создается средствами СУБД. Создание происходит в три этапа.

1.   Открытие файла, в котором будет храниться БД.

2.   Построение структуры таблиц и установка связей.

З. Ввод данных в таблицы.

Обычно открытие файла происходит в среде СУБД через последовательность команд вида Файл Создать БД Новая БД.

На втором этапе средствами СУБД создаются таблицы, в каждой из которых определяются имена полей, их типы и форматы. Ниже представлены структуры таблиц УЧЕНИКИ, ПРЕДМЕТЫ и ОЦЕНКИ (табл. 1.1-1.3).

Таблица 1.1

УЧЕНИКИ

Имя поля

Тип поля

Длина (формат)

НОМЕР УЧ

числовой

целый

ФАМИЛИЯ

текстовый

зо

имя

текстовый

15

пол

текстовый

1

АДРЕС

текстовый

 

ТЕЛЕФОН

текстовый

15

Таблица 1.2

Информационные системы


ПРЕДМЕТЫ

Имя поля

Тип поля

Длина (формат)

НАЗВ_ПРЕДМЕТА

текстовый

зо

УЧИТЕЛЬ

текстовый

40

Таблица 1.3

ОЦЕНКИ

Имя поля

Тип поля

Длина (формат)

НОМЕР УЧ

числовой

целый

НАЗВ_ПРЕДМЕТА

текстовый

зо

ДАТА

дата

 

ОЦЕНКА

числовой

целый

Затем средствами СУБД устанавливаются связи. Между таблицами УЧЕНИКИ и ОЦЕНКИ связь устанавливается через общее поле НОМЕР УЧ. А связь между таблицами ПРЕДМЕТЫ и ОЦЕНКИ устанавливается через поле НАЗВ_ПРЕДМЕТА. И та, и другая связь будет иметь тип «один-ко-многим». На рисунке 1.14 показана окончательно построенная модель данных в форме схемы [1] ). Здесь в обозначении связи «один-ко-многим» вместо буквы М использован символ ос « бесконечность».

Рис. 1.14. Схема данных

Реляционные базы данных


После этого таблицы можно заполнять данными. Современные СУБД предоставляют пользователю удобные средства ввода. Данные можно вводить непосредственно в строки таблиц, отражаемых на экране, или через диалоговые окна — формы (рис. 1.15). В процессе ввода данных СУБД осуществляет автоматический контроль соответствия вводимых данных объявленным типам и форматам полей. На рисунке 1.15 показана форма для ввода данных в таблицу УЧЕНИКИ.

Рис. 1.15. Форма для ввода и просмотра данных в таблице

После того как таблица будет заполнена, через эту же форму можно просматривать записи таблицы или вносить в них изменения. На рисунке 1.16 показана таблица УЧЕНИКИ, заполненная для 10 человек.

Аналогичным способом заполняется таблица ПРЕДМЕТЫ, ко-

 

 

 

 

 

 

НОМЕР УЧ ФАМИЛИЯ

имя

пол

АДРЕС

ТЕЛЕФОН

 

 

Антонов

Вурнлл

 

Садовая 5, кв.56

233-12-11

 

 

2 Веткина

Ирина

ж

Островского З, кв.41 Садовая З, кв. 14

214-3344

 

 

З Вяткин

 

м

245-2334

 

 

4 Волочкова

Настасья            ж

Ладыгина 43, ква

233-76-88

 

 

5 Волегов

 

м

Садовая З кв.4

233-21-21

 

 

6 Гилев

Валерий

м

Лебедева 43, кв.4 Малкова 76, кв.81 Малкова 76. кв? кая 8, кв.б5

260-30-30

214-98-90

233-3445

 

 

7 Ежова

Марина

ж

 

 

В Зимина

 

ж

 

 

9. Игошина

Наталья

 

212-11-11

 

 

 

10 Ильиных

Михаил

м

Лебедева 14, кв.З

24443-50

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 1.16. Таблица УЧЕНИКИ после заполнения

 

Sll<l8

 

 

НМВ_ПРЕДМЕТА

Аттг

Рудланова Анна Васильевна

 

+

анова Анна Васильевна

 

 

Ки хин           ей Ильич

Попова Нина Семеновна

 

+

Химия

Светлана

Павел Павлович

 

+

Английский

Грудберц&дрдуриг Онянов Ю

 

 

 

 

 

 

 

 

Ммъ:

14 4

 

Информационные системы


Рис. 1.17. Таблица ПРЕДМЕТЫ после заполнения

Самый большой объем данных будет иметь таблица ОЦЕНКИ. Она будет пополняться учителями каждый день. И только для одного класса в течение учебного года в нее будут занесены сотни, а то и тысячи записей. На рисунке 1.18 показан фрагмент таблицы ОЦЕНКИ, содержащий всего 20 записей.

База данных создана! Теперь можно приступать к разработке клиентских приложений.

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


Рис. 1 .18. Фрагмент таблицы ОЦЕНКИ после заполнения

Реляционные базы данных


Система основных понятий

Создание базы данных

Создание БД осуществляется средствами СУБД

Создание структуры БД

Ввод данных

1. Создание таблиц:

2. Установка связей (создание схемы):

Ввод в строки таблицы

Ввод через фор-

описание полей, типов, форматов, ключей

объединение через общие поля:

1—1 или 1—00

Автоматический контроль соответствия данных типам и форматам полей

Вопросы и задания

1.   Что нужно иметь для того, чтобы начать процесс создания базы дан- о ных?

2.   Какую информацию нужно указать СУБД для создания таблиц БД?

З. Какую информацию нужно указать БД для создания схемы БД?

4.    Каким способом можно вводить данные в таблицы?

5.    Каким образом СУБД помогает пользователю производить безошибочный ввод данных?

Практикум. Раздел «Базы данных»

1.2.4. Простые запросы к базе данных

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

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

О Запрос — это описание действий СУБД с целью выполнения определенного вида манипулирования данными.

Информационные системы


Есть универсальный язык, на котором формулируются запросы во многих СУБД. Он называется SQL (Structured Query Language) — структурированный язык запросов. Здесь существует выбор, с которым часто приходится сталкиваться в информатике: обучаться ли составлению запросов на языке SQL или воспользоваться каким-то более высокоуровневым вспомогательным средством. В большинстве современных СУБД такие средства имеются.

В учебных целях мы будем использовать строчное описание команд запросов на придуманном (учебном) языке. Он близок к SQL, однако имеет не такой строгий синтаксис и, кроме того, использует русские служебные слова. С учебным языком запросов вы знакомились в курсе информатики 9 класса. Учебный язык запросов соотносится с SQL примерно так же, как учебный Алгоритмический язык соотносится с языками программирования.

Команда запроса на выборку данных из БД на учебном языке запросов имеет следующий формат:

.выбрать <список выводимых полей> где <условие выбора> сортировать <ключ сортировки> по <порядок сортировки>

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

Опишем серию запросов на учебном языке, которую позже в практикуме реализуем средствами СУБД. В 8 классе вы учились составлять запросы к однотабличной БД. Теперь рассмотрим примеры запросов, для выполнения которых потребуется извлекать данные из нескольких таблиц. В таком случае имена полей идентифицируются комбинированными именами следующего формата: ИМЯ ТАБЛИЦЫ.ИМЯ ПОЛЯ

Запрос 1. Получить список учеников класса, содержащий номер в журнале, фамилию и имя каждого ученика.

.выбрать УЧЕНИКИ.НОМЕР_УЧ, УЧЕНИКИ.ФАМИЛИЯ, УЧЕНИКИ.ИМЯ сортировать УЧЕНИКИ.НОМЕР_УЧ по возрастанию

В этом запросе все данные берутся из одной таблицы УЧЕНИКИ. Условие выбора отсутствует, поскольку нужно выбрать все записи таблицы. Сортировка осуществляется по возрастанию номеров. Результат запроса представлен в табл. 1.4. Таблица 1.4

Реляционные базы данных


Список учеников класса

 

НОМЕР УЧ ФАМИЛИЯ

имя

 

 

Антонов

Ки лл

 

2, Веткина

И на

 

3' Вяткин

Иван

 

4 Волочкова

Настасья

 

5 Волегов

Ки лл

 

6' Гилев

Вал й

 

7' Ежова

Ма на

 

8 Зимина

Елена

 

9 Игошина

Наталья

 

10 Ильиных

Михаил

Запрос 2. Вывести список всех оценок, полученных Волеговым Кириллом по всем предметам. Указать даты получения оценок.

.выбрать ОЦЕНКИ.НАЗВ_ПРЕДМЕТА, ОЦЕНКИ.ДАТА,

ОЦЕНКИ.ОЦЕНКА где  сортировать

ОЦЕНКИ.НАЗВ ПРЕДМЕТА по возрастанию,

ОЦЕНКИ.ОЦЕНКА по убыванию

В этом запросе, как и в предыдущем, все данные извлекаются из одной таблицы ОЦЕНКИ. Результат запроса представлен в табл. 1.5. Обратите внимание на то, что оценки по алгебре занесены в последовательные строки и упорядочены по убыванию.


Таблица 1.5

Оценки ученика Волегова Кирилла

 

НАЗВ ПРЕДМЕТА

ДАТА

ОЦЕНКА

 

Алгеб а

23.09.2009

4

 

Алгеб а

15.09.2009

2

 

Ин орматика

10.09.2009

з

 

История

30.09.2009

4

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

.выбрать УЧЕНИКИ.ФАМИЛИЯ, ОЦЕНКИ.ДАТА, ОЦЕНКИ.ОЦЕНКА где сортировать УЧЕНИКИ.ФАМИЛИЯ по возрастанию, ОЦЕНКИ.ДАТА по возрастанию

В этом запросе используются данные из двух связанных таблиц УЧЕНИКИ и ОЦЕНКИ. Результат запроса представлен в табл. 1.6.

Таблица 1.6

Информационные системы

Оценки по алгебре

 

ФАМИЛИЯ

ДАТА

ОЦЕНКА

 

Антонов

04.09.2009

 

 

Веткина

23.09.2009

 

 

Волегов

16.09.2009

 

 

Волегов

23.092009

 

 

Волочкова

23.09.2009

 

 

Вяткин

11.092009

 

 

Вяткин

23.09.2009

 

Запрос 4. Вывести список всех двоек, полученных учениками класса, с указанием фамилии ученика, даты получения двойки, предмета и учителя. Отсортировать по фамилиям учеников.

.выбрать УЧЕНИКИ.ФАМИЛИЯ, ОЦЕНКИ.ДАТА, ОЦЕНКИ.НАЗВ_ПРЕДМЕТА, ПРЕДМЕТЫ.УЧИТЕЛЬ где ОЦЕНКИ.ОЦЕНКА=2 сортировать УЧЕНИКИ.ФАМИЛИЯ по возрастанию

Для реализации этого запроса были использованы все три связанные таблицы. Результат представлен в табл. 1.7.

40

Таблица 1.7

Список двоечников

 

ФАМИЛИЯ

ДАТА

НАЗВ_ПРЕДМЕТА

УЧИТЕЛЬ

 

Вежина

11.09.20091 Информатика                 Кирюхин Сердй_Идьич

 

Волегов

15.09Q009 Ал

 

анода Анна Васильевна

Реляционные базы данных


Система основных понятий

Запросы к базе данных

Запрос — описание действий СУБД с целью выполнения определенного вида манипулирования данными

Средства формирования запросов

SQL (Structured Query Language) — структурированный язык запросов

Конструктор запросов (Microsoft Access)

Структура запроса на выборку

Список полей

Условие выбора записей

Ключи и порядок сортировки

Имена полей (простые или составные), выводимых по запросу

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

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

Вопросы и задания

1. Что входит в понятие манипулирования данными в БД?

2. Какова цель запроса на выборку?

З. Запишите на учебном языке запросов команды выборки для получе- О ния следующей информации:

*     получить таблицу с фамилиями, адресами и номерами телефонов всех мальчиков класса;

*     вывести сведения об оценках, полученных учениками 15 сентября 2009 года; указать фамилию ученика, предмет и оценку; отсортировать по убыванию значения оценки.

Практикум. Раздел «Базы данных»

1 .2.5. Сложные запросы к базе данных

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

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

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

Логические операции в условии выбора

Информационные системы


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

.выбрать УЧЕНИКИ.ФАМИЛИЯ, УЧЕНИКИ.ИМЯ, ОЦЕНКИ.НАЗВ_ПРЕДМЕТА, ОЦЕНКИ.ДАТА где (ОЦЕНКИ.НАЗВ         или ОЦЕНКИ.НАЗВ ОЦЕНКИ.ОЦЕНКА=5 сортировать УЧЕНИКИ.ФАМИЛИЯ по возрастанию ОЦЕНКИ. ДАТА по убыванию

Результаты этого запроса представлены в табл. 1.8. Условие выборки в запросе является сложным логическим выражением, содержащим операцию дизъюнкции (или) и операцию конъюнкции (и). Круглые скобки в логическом выражении необходимы, поскольку операция дизъюнкции младше конъюнкции, но выполняться она должна в первую очередь.

Таблица 1.8

Пятерки по истории и алгебре

 

ФАМИЛИЯ

имя

НАЗВ_ПРЕДМЕТА ДАТА

 

Антонов

Кирщтл

История

04.09.200

30.09200

15.09.200

07.09.200

23.09.200

15.09.200

21.09.20

11.09.200

Веткина

Ирина

История

 

Вежина

Веткина

Ирина

История

И на

 

 

Волочкова

Волочкова

Настасья

Алгдбра

Настасья

История

Вяткин

Иван

История

 

Вяткин

Иван

Алг


Группировка и статистическая обработка

В следующем запросе будет использоваться группировка выбираемых по запросу записей. Сгруппировать, т. е. собрать вместе, можно несколько записей, у которых совпадают значения одного или нескольких выбираемых в запросе полей. Для выделенной группы записей можно выполнить обработку значений некоторого числового поля. Функции, выполняющие такую обработку, называются статистическими функциями. Например, можно просуммировать значения числового поля для всей группы (применить функцию Sum), вычислить среднее значение (функция Avg), подсчитать количество элементов записей в группе (функция Count), найти максимум или минимум (функции Мах, Min) и пр. Полученное значение можно вывести в итоговой таблице.

 

43


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

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

.выбрать УЧЕНИКИ.ФАМИЛИЯ, ОЦЕНКИ.НАЗВ_ПРЕДМЕТА,

“д(ОЦЕНКИ.ОЦЕНКА), ПРЕДМЕТЫ.УЧИТЕЛЬ группировать

УЧЕНИКИ.ФАМИЛИЯ, ОЦЕНКИ.НАЗВ_ПРЕДМЕТА, ПРЕДМЕТЫ.УЧИТЕЛЬ сортировать УЧЕНИКИ.ФАМИЛИЯ по возрастанию, ОЦЕНКИ.НАЗВ ПРЕДМЕТА по возрастанию

Таблица 1.9

Средние оценки

 

ФАМИЛИЯ

НАЗВ ПРЕДМЕТА

УЧИТЕЛЬ

 

Антонов

Алгебра

4 Рудланова Анна Васильевна

 

Антонов

Ин         атика

5! Кирщщфргей Ильич

 

Антонов

Ист я

4 Онянов Юрий Пе

 

Веткина

Алгебра

З Рудланова Анна Васильевна

Веткина

Информатика

2 КнррццСдргей Ильич

 

Веткина

Исторня

5' Онянов Юрий Петрович

Волегов

 

                        З         аНОВа Анна Васильевна

 

Волегов

Ифрматика

З“рюуфргей Ильич

 

Волегов

и

                         4 ОняновЮ й Пе            ч

 

Волочкова

Волочкова

Волочкова

Ал и

атика

Анна Васильевна S Кнрюцщ_Срргей Ильич

 

5 оняновю й Петрович

Вяткин

Алг

                     4,5          анова Анна Васильевна

 

Вяткин

Вяткин

Ин и

4  Кирюцн_Сдргей Ильич

5  Онянов Ю й Пе

 

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

Запрос 7. Получить список учеников, имеющих среднюю оценку по алгебре выше 4. Вывести фамилию ученика и среднюю оценку по алгебре. Отсортировать список по фамилиям.

Команда для этого запроса будет построена путем модификации команды из предыдущего запроса: добавления условий выбора.

.выбрать УЧЕНИКИ.ФАМИЛИЯ, ОЦЕНКИ.НАЗВ_ПРЕДМЕТА,

АЧ(ОЦЕНКИ.ОЦЕНКА) группировать УЧЕНИКИ.ФАМИЛИЯ,

ОЦЕНКИ.НАЗВ_ПРЕДМЕТА где ОЦЕНКИ.НАЗВ ПРЕДМЕТА =

Информационные системы


”Алге6ра” и  сортировать

УЧЕНИКИ.ФАМИЛИЯ по возрастанию

В результате выполнения этого запроса получится таблица, состоящая из двух строк (табл. 1.10).

Таблица 1.10

Лучшие по алгебре

ФАМИЛИЯ НАЗ _ПРЕДМЕТА Ачд_ОЦЕНКА

                                                     Волочкова       Алгебра

                                                     Вяткин             Ал                                                4,

Расширение базы данных

Добавим в нашу базу данных еще одну полезную информацию: сведения о четвертных оценках по предметам. Назовем новую таблицу ИТОГИ и опишем ее структуру (табл. 1.11).

Таблица 1.11 итоги

Имя поля

Тип поля

Длина (формат)

НОМЕР УЧ

Числовой

Целое

НАЗВ_ПРЕДМЕТА

Текстовый

зо

1 ЧЕТВ

Числовой

Целое

2 ЧЕТВ

Числовой

Целое

з ЧЕТВ

Числовой

Целое

4 ЧЕТВ

Числовой

Целое

Составной ключ этой таблицы:

НОМЕР_УЧ + НАЗВ_ПРЕДМЕТА.

 

45

Реляционные базы данных

Добавим эту таблицу; в схему БД и установим связи. Связь между таблицами УЧЕНИКИ и ИТОГИ будет иметь тип «одинко-многим». Такой же тип связи установится между таблицами ПРЕДМЕТЫ и ИТОГИ. Схема данных теперь выглядит, как показано на рис. 1.19.

Рис. 1 .19. Расширенная схема данных

Теперь заполним таблицу ИТОГИ данными. Ограничимся тремя предметами, как и в таблице ОЦЕНКИ. Введенные данные представлены в таблице на рис. 1.20.

Рис. 1.20. Содержание таблицы ИТОГИ

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

Запрос 8. Получить список отличников по отдельным предметам. Указать фамилию, имя ученика и предмет, по которому он имеет все четвертные пятерки.

.выбрать УЧЕНИКИ.ФАМИЛИЯ, УЧЕНИКИ.ИМЯ,

ПРЕДМЕТЫ.НАЗВ_ПРЕДМЕТА где ИТОГИ.1_ЧЕТВ=5 и ИТОГИ.2 ЧЕТВ-5 и ИТОГИ.З ЧЕТВ=5 и ИТОГИ.4 ЧЕТВ-5 сортировать УЧЕНИКИ.ФАМИЛИЯ по возрастанию

В результате выполнения запроса получим табл. 1.12.

Таблица 1.12

46

Информационные системы

Отличники по предметам за год

 

ФАМИЛИЯ

имя

НАЗВ_ПРЕДМЕТА

 

Волегов

Ки л

История

Волочкова

Настасья

История

Волочкова

Настасья

Информатика

Волочкова

Настасья

Алг

 

 

 

 

Вычисляемые поля

Запрос 9. Вычислить суммы оценок по информатике у всех учеников и вывести список в порядке убывания сумм.

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

.выбрать УЧЕНИКИ.ФАМИЛИЯ, суммА: [ИТОГИ].[1_ЧЕТВ]+

    [ИТОГЩ.[      где

СУММА по убыванию

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

Таблица 1.15

Сумма четвертных оценок по информатике

 

ФАМИЛИЯ

СУММА

 

Волочкова

2

 

Антонов

1

 

Волегов

1

 

Вяткин

1

 

Веткина

1

 

 

 

Запрос 10. Вычислить суммы всех оценок, полученных всеми учениками по каэкдому предмету в отдельности в каждой четверти. Вывести название предмета и суммы оценок для каждой четверти. Отсортировать по названиям предметов.

Для этого запроса нужны данные только из таблицы ИТОГИ. Нужно сгруппировать все записи по предметам и внутри каждой группы просуммировать оценки за каждую четверть.

 

47

Реляционные базы данных


.выбрать ИТОГИ.НАЗВ_ПРЕДМЕТА, sumUT0M.4_IWIB) группировать ИТОГИ.НАЗВ ПРЕДМЕТА сортировать ИТОГИ.НАЗВ_ПРЕДМЕТА по возрастанию

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

Таблица 1.16

Сумма оценок класса по четвертям

 

НАЗВ_ПРЕДМЕТА

sum-1 ЧЕТВ

sum-2 ЧЕТВ

sum-4 ЧЕТВ

 

Алг

 

20

19

21

 

 

 

атика

20

20

20

1

 

Ист

 

22

23

23

21

Запрос 11. Получить годовой рейтинг успеваемости по предметам. Для этого просуммировать по каэкдому предмету суммы оценок за четыре четверти. Вывести названия предметов и итоговые суммы оценок.


В результате запроса получим табл. 1.17.

Таблица 1.17

Годовой рейтинг предметов

Sum-4 ЧЕТВ СУММА

 

НАЗВ_ПРЕДМЕТА Апгрбра

                    20                     19

21

                    20               80

 

Информатика

Ист я

20

20

19

79

 

                    22                     23

23

21

89

Отсюда видно, что и по итогам года самая высокая успеваемость по истории, на втором месте алгебра, на третьем информатика.

Информационные системы


О Система основных понятий

              Запросы к базе данных (продолжение)

Сложное условие запроса

Условие, содержащее логические операции

Поля группировки

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

Статистическая обработка

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

Вычисляемое поле

Поле, формируемое в запросе; задается имя и формула для вычисления по значениям других полей

О Вопросы и задания

1.    Какие логические операции можно использовать в сложном условии запроса на выборку?

2.    Что такое поля группировки?

О 3. Какие виды вычислительной обработки данных можно выполнять в следующих запросах на выборку?

   Получить список учеников, у которых нет троек по информатике.

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

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

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

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

Практикум. Раздел «Базы данных»

www

ЭОР к главе 1 на сайте ФЦИОР (http://fcior.edu.ru)

1.1.

 

49

Реляционные базы данных

*     Назначение и виды информационных моделей  Построение информационных моделей ИС

1.2.

*     Ввод данных в БД  Высказывание. Простые и сложные высказывания. Основные логические операции

*     Запросы на выборку данных

*     Понятие СУБД. Классификация СУБД

*     Проектирование баз данных

*     Проектирование объектов данных

*     Проектирование отчетов

 Проектирование экранных форм

*     Создание отчетов в БД

*     Этапы разработки ИС

Глава 2

МЕТОДЫ ПРОГРАММИРОВАНИЯ

Вы уже не новички в программировании. В 10 классе каждый из вас составил не менее десятка программ на Паскале. Что же нового о программировании вы узнаете, изучив данную главу? Почему она называется «Методы программирования» ?


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

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

2.1. Эволюция программирования

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

Машинно-ориентированное программирование

С изобретением программно управляемых вычислительных машин появилась новая профессия программист. Мы уже рассказывали, что первым в истории программистом была Ада Лавлейс, работавшая вместе с Чарльзом Бэббиджем, она разрабатывала программы управления его Аналитической машиной. Но массовой профессия программиста стала только с изобретением электронных вычислительных машин — эвм.

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

 

Адрес команды

Код операции

1-й адрес

2-й адрес

3-й адрес

Шестнадцатеричный код

28

02

со

 

D8

Двоичный код

0010 1000

00000 0010

1100 0000

1100 0100

1101 1000

Эволюция программирования


Такая команда называется трехадресной. Код 0216 обозначает команду сложения. 1-й и 2-й адреса — это адреса ячеек ОЗУ, в которых хранятся слагаемые, 3-й адрес адрес ячейки, куда заносится сумма, Сама команда хранится в ячейке ОЗУ с адресом 2816•

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

Первыми языками программирования были машинно-ориентированные автокоды. Позднее за языками такого уровня закрепилось название ассемблеры. Первоначально ассемблером называли программу-переводчик с языка ассемблера в матпинные команды. Позднее и сам язык ассемблера стали называть именем «ассемблер». Программирование на ассемблере снимает с программиста заботу о распределении памяти под данные и команды программы. Программист также не должен помнить внутренние коды всех команд процессора. Вот пример той же команды сложения на ассемблере (автокоде):

ADD а, Ь, с

Слово ADD обозначает команду «сложить», а и Ь — имена переменных-слагаемых, с переменная, куда помещается результат.

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

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

Методы программирования


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

Языки программирования высокого уровня

Следующим этапом развития программирования стало создание языков программирования высокого уровня (ЯПВУ). Примеры ЯПВУ: Паскаль, Бейсик, Фортран. Для каждого языка существует машинно-независимый стандарт. Возможность программирования на данном ЯПВУ зависит от наличия на вашем компьютере транслятора с этого языка. Трансляторы для каждого типа компьютеров составляют системные программисты.

Текст программы на ЯПВУ по своей форме ближе к естественным языкам (чаще всего к английскому), к языку математики. Та же команда сложения двух величин на ЯПВУ похожа на привычную форму математического равенства:

с : =a+b (на Паскале); c=a+b (на Фортране, Бейсике, Си).

Гораздо проще освоить программирование на языке высокого уровня, чем на ассемблере. Поэтому с появлением ЯПВУ значительно возросло число прикладных программистов, расширилось применение ЭВМ во многих областях.


С середины ХХ века и до нашего времени были созданы сотни языков программирования высокого уровня. Но распространенными и популярными из них стали не все. Одним из долгожителей в семействе ЯПВУ является язык Фортран (FORTRAN). FORTRAN — сокращение словосочетания formula translator транслятор формул. Первая версия Фортрана была создана в 1954 году. Во времена ЭВМ второго и третьего поколений была популярна версия  Фортран создавался как специализированный язык для математических расчетов, используемых в науке и технике. И в наше время этот язык, в стандарте Фортран-90 (и в последующих его модификациях Фортран-95, Фортран-2003), остается основным языком программирования для расчетов в области физико-технических проблем.

Эволюция программирования

 


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

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

Значительным событием в истории языков программирования стало создание в 1969 году языка Паскаль. Его автор — швейцарский профессор Никлаус Вирт разрабатывал Паскаль как учебный язык структурного программирования.

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

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

Язык программирования Си (английское название — С) появился практически одновременно с Паскалем. Он создавался как инструментальный язык для разработки операционных систем, трансляторов, баз данных и других системных и прикладных программ. Хотя Си и является языком высокого уровня, в нем заложены возможности непосредственного обращения к некоторым машинным командам, к определенным участкам памяти компьютера, что ранее было возможно только в ассемблере. С появлением Си многие системные программисты перешли с ассемблера на Си. Дальнейшее развитие Си привело к созданию языка объектно-ориентированного программирования Си++.

Парадигмы программирования

 

Методы программирования


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

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

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

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

Эволюция программирования

 


Логическая парадигма программирования реализована в языке Пролог. Пролог был разработан во Франции в 1972 году. Его, как и ЛИСП, относят к языкам искусственного интеллекта. Пролог основан на аппарате математической логики, отсюда название парадигмы. На Прологе строится база знаний в определенной предметной области, состоящая из совокупности фактов и правил. Для решения некоторой задачи формулируется запрос к базе знаний, который называется целью. Реализация цели (ответ на запрос) происходит через заложенный в интерпретатор Пролога алгоритм, который называется механизмом вывода. Используя Пролог, можно решать логические задачи, аналогичные тем, которые были рассмотрены в S 1.6.4 учебника для 10 класса. Следует отметить, что с помощью Пролога можно решать лишь ограниченный круг задач искусственного интеллекта. К языкам логического программирования также относятся Planner, Mercury, Fril и др.

Объектно-ориентированная парадигма программирования основана на концепции объектов и классов. Всякий объект характеризуется набором свойств и действий, которые с ним могут быть выполнены и которые он может выполнять. Объект относится к определенному классу. Объектно-ориентированное программирование (ООП) сводится к выстраиванию иерархий классов, описаний объектов и их взаимодействий, программной реализации различных действий над объектами. Первым языком ООП был Симула, разработанный в 1967 году. Позже элементы ООП стали внедряться в процедурные языки, в том числе в Турбо Паскаль. Наиболее популярными средствами объектно-ориентированного программирования являются языки Си++, Java. В нашем учебнике подробнее об ООП рассказывается в разделе 2.4.

Методологии и технологии программирования

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


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

Уже в 1960-х годах программирование стало достаточно массовой профессиональной деятельностью. Возникают компании (фирмы) по разработке программ. Актуальной становится задача разработки общепринятой методологии программирования, повышающей производительность работы программистов и, что самое главное, качество программных продуктов. Основной качественный показатель программы ее работоспособность, отсутствие ошибок.

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

ние».

 

Методы программирования


Появление структурного программирования связано с именами Эдсгера Дейкстры и Чарльза Хоара. Начиная с 1960-х годов стали появляться языки структурного программирования. Первым из них был Алгол-60, разработанный Дейкстрой, затем был создан Паскаль. Другие, первоначально «неструктурные» языки стали также приобретать «структурные свойства» (Турбо Бейсик, Фортран- 77 и пр.). Структурное программирование до настоящего времени остается важнейшей методологией программирования. Соблюдение его принципов позволяет программисту составлять ясные, безошибочные, надежные программы.

Технология это воспроизводимый способ производства какого-то продукта, гарантирующий номинальное качество и оптимальные затраты. Технология предполагает наличие определенных средств, инструментов производства. В 1990-х годах с развитием объектно-ориентированной парадигмы программирования, а также средств графического интерфейса на персональных компьютерах возникает новая технология программирования визуальное программирование. Визуальная технология программирования позволяет программисту легко и быстро строить наглядный графический интерфейс для своих программ на основе стандартного набора шаблонов, графически отображаемых на экране объектов. О технологии визуального программирования в системе Delphi рассказывается в разделе 2.4 нашего учебника.

Эволюция программирования

О профессиях: профессии, связанные с программированием о


В перечне современных профессий имеется профессия «программист». Велико разнообразие профессиональной деятельности программистов. Всё это разнообразие принято делить на две группы: системное программирование и прикладное программирование. Исторически профессия системного программиста берет свое начало с разработки трансляторов с языков программирования. Возникает разделение программистов на системных и прикладных. Прикладные программисты используют компьютер для решения прикладных задач из различных предметных областей: математики, физики, экономики и др. А работа системных программистов состоит в том, чтобы облегчить, упростить работу прикладным программистам, повысить эффективность использования компьютера для решения прикладных задач, Системные программисты разрабатывают не только трансляторы, но и операционные системы, утилиты, программное обеспечение для функционирования компьютерных сетей, информационных систем и пр.

Система основных понятий

Что такое программирование

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

Машинно-ориентированное программирование

Программирование в машинных командах: требует от программис- та распределения памяти под дан- ные и команды программы, знания кодов операций и форматов команд

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

Машинно-независимое программирование — на языках программирования высокого уровня (ЯПВУ)

Парадигмы и языки программирования

Процедурное

Функциональное

Логическое

Объектно-ориентированное

Фортран, Алгол, Паскаль, Бейсик, Си и др.

ЛИСП, Haskell, Scheme и др.

Пролог, Planner, Mercury, Fril и др.

Симула, Си++, Java и др.

Методологии и технологии программирования

Структурная методология проце- дурного программирования

Визуальная технология объектноориентированного программирования

о Вопросы и задания

         1. Что такое программирование?

2. В какой форме составлялись программы для первых ЭВМ?

З. Почему языки автокоды (ассемблеры) называются машинно-ориентированными языками программирования?

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

5.    Что такое парадигма программирования?

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

О 7. Что такое структурное программирование? О 8. Что такое визуальное программирование?

2.2. Структурное программирование

2.2.1. Паскаль — язык структурного программирования

 

Методы программирования


История Паскаля

Язык программирования Паскаль был создан швейцарским профессором Никлаусом Виртом в 1969 году как язык для обучения студентов структурной методике программирования. Язык получил свое название в честь Блеза Паскаля изобретателя первого вычислительного механического устройства. Позднее фирма Borland International, Inc. (США) разработала систему программирования Турбо Паскаль для персональных компьютеров, которая вышла за рамки учебного применения и стала использоваться для научных и производственных целей. В Турбо Паскаль были внесены некоторые дополнения к базовому стандарту Паскаля, описанного Виртом. Со временем язык развивался. Начиная с версии 5.5, в Турбо Паскаль вводятся средства поддержки объектно-ориентированного программирования. В дальнейшем это привело к созданию 0bject Pascal языка с возможностями объектно-ориентированного программирования (ООП). В начале 1990-х годов объединение элементов ООП в Паскале с визуальной технологией программирования привело к созданию системы программирования Delphi.

У вас уже есть опыт программирования на Паскале, который вы получили, изучая информатику в 9 и 10 классах. Обучение там проводилось на примерах программ. Правила языка излагались по мере их использования в рассматриваемых программах. Целью данной главы является систематизация и расширение ваших знаний о языке Паскаль. Как это было и раньше, язык описывается в рамках расширенного стандарта Паскаля, соответствующего диалекту Турбо Паскаль.

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

Структура процедурных языков программирования высокого уровня

Структурное программирование


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

Рис. 2.1. Структура процедурного ЯПВУ

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

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

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

Структура программы на Паскале

Методы программирования


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

О Program <имя программы> ;

Labe1 <раздел меток>;

Const <раздел констант>; Туре <раздел типов> ;

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

Procedure (Function) <раздел подпрограмм> ; begin

<раздел операторов> end.

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

В Турбо Паскале, в отличие от базового стандарта Паскаля, возможно:

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

2.2.2. Элементы языка и типы данных

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

Латинские буквы: от А до Z (заглавные) и от а до г (строчные).

Цифры: О, 1, 2, З, 4, 5, 6, 7, 8, 9. Специальные символы: +

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

>= больше или равно;

( * *) ограничители комментариев (наряду с { });

<> не равно;

. ) эквивалент [

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


Служебные слова. К спецсимволам относятся и служебные слова, смысл которых определен однозначно. Служебные слова не могут быть использованы для других целей. С точки зрения языка, они являются едиными элементами алфавита. Вот некоторые служебные слова: Program, Var, array, if, do, while и др.

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

Комментарии. Следующие конструкции представляют собой комментарии и поэтому пропускаются компилятором:

{любоп текст, не содержащий символ “фигурная скобка” }

(* любой текст, не содержащий символы ” звездочка”, ” круглая скобка” *)

//последующий текст до конца строки

Буквы русского алфавита употребляются только в комментариях, символьных и текстовых константах.


Концепция типов данных в Паскале

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

 

Методы программирования


Паскаль характеризуется большим разнообразием типов данных (рис. 2.2).

Рис. 2.2. Система типов данных Паскаля

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

В стандартном Паскале Вирта отсутствовал строковый тип. Он был внесен в Турбо Паскаль. Кроме того, в Турбо Паскале целые и вещественные — это группы типов. В старших версиях Турбо Паскаля появился процедурный тип и тип «объект».

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

Таблица 2.1

Структурное программирование


Типы данных

Имя типа

Длина в байтах

Диапазон (множество) значений

Кол-во десятичных цифр в мантиссе

 

Целочисленные типы

 

integer

2

-32768..32767

 

byte

1

0..255

 

word

2

0..65535

 

shortint

1

-128..127

 

10ngint

4

-2147483648..2147483647

 

 

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

 

real

6

2,9-10-39 - 1,7-1038

(11-12)

sing1e

4

1,5-10-45 - 3,4-1038

(7-8)

doub1e

8

5-10-324 - 1, 7-10 308

(15-16)

extended

10

3,4-10-4932 - 1,1-104932

(19-20)

Логический тип

 

 

 

Ьоо1еап

1

true, fa1se

 

 

Символьный тип

 

char

1

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

 

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

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

Туре <имя типа> = (<список значений>)

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

Туре Gaz

                      Meta1          (Ее, со, Na, си, zn) ;

Var G1, G2, G3: Gaz,•

Met1, Met2: Meta11;

Day: (Sun, Моп, Тие, Wed, Thu, Fri, Sat) ;

Здесь Gaz и Metal имена перечислимых типов, которые ставятся в соответствие переменным G1, G2, G3 и Met1, Met2. Переменной Day назначается перечислимый тип, которому не присвоено имени.

Значения, входящие в перечислимый тип, являются константами. Действия над ними подчиняются правилам, применимым к константам. Каждое значение в перечислимом типе занимает в памяти 2 байта, поэтому число значений этого типа не должно превышать 65 535.

Перечислимый тип — упорядоченное множество. Его элементы пронумерованы, начиная с О в порядке следования в описании.

В программе, в которой присутствует данное выше описание переменной Day, возможен такой фрагмент:

 

Методы программирования


if Day = Sun then Write ( ' Ура! Сегодня выходной! ' ) •

Ограниченный тип задается как упорядоченное ограниченное подмножество некоторого порядкового типа:

            <константа          .<константа 2>

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

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

Пример

Туре Numbers = 1 . . 31; A1f —

Var Data: Numbers;

Bukva: A1f;

О Структурные типы. Особенностью Паскаля является то, что в

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

Структурное программирование


Система основных понятий

Базовые понятия Паскаля

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

Этапы развития: стандартный Паскаль (Н. Вирт), Турбо Паскаль, 0bject Pascal, Delphi

Состав программы на Паскале

Элементы языка

Разделы программы

Комментарии

Алфавит, служебные слова, идентификаторы

Заголовок программы

Разделы описаний

Раздел операторов

Поясняющие тексты, которые пропускаются компилятором

Типы данных

Стандартные (целочисленные, вещественные, логический, символьный)

Определяемые в программе: перечислимые, ограниченные

Простые типы

Структурные типы

Одна величина — одно значение

Одна величина — множество значений (массивы, строки, записи, множества, файлы)

Вопросы и задания

1.   В какой парадигме программирования реализован язык Паскаль?

2.   Входят ли в алфавит Паскаля русские буквы? Для чего их можно использовать?

 

З. Что такое идентификатор? Каковы правила задания идентификаторов?

О

4. Чем различаются разные типы данных из группы целочисленных типов?

о

5. Чем различаются разные типы данных из группы вещественных типов?

О

6. В чем разница меэкду простыми и структурными типами?

о

7. Что такое перечислимый и ограниченный типы данных?

О


2.2.3. Операции, функции, выражения

Арифметические операции

К числовым типам данных относятся группы вещественных и целочисленных типов. К ним применимы арифметические операции и операции отношений.

Методы программирования


Операции над данными бывают унарные (применимые к одному операнду) и бинарные (применимые к двум операндам). Унарная арифметическая операция в Паскале одна. Это операция изменения знака. Ее формат:

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

Бинарные арифметические операции стандартного Паскаля описаны в табл. 2.2. В ней символ обозначает целые типы, символ R — вещественные типы.

Таблица 2.2

Бинарные операции Паскаля

Знак

Выражение

Типы операндов

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

Операция

 

А+В

 

 

Сложение

 

 

 

 

 

 

 

 

 

 

А—В

 

 

Вычитание

 

 

 

 

 

 

 

 

 

 

 

 

 

Умножение

 

 

 

 

 

 

 

 

 

 

А/в

 

 

Вещественное деление

 

 

 

 

 

 

 

 

 

div

А div В

 

 

Целочисленное деление

mod

А mod В

 

 

Остаток от целочисленного деления

Стандартные функции и процедуры

В Паскале существует большое количество стандартных функций и процедур, к которым программист может обращаться в своих программах. Наиболее часто используются математические функции, например: sqrt (х) — корень квадратный, abs (х) — абсолютная величина, sin (х) и др. Часто используемые стандартные процедуры: Read ( . . . ) — процедура ввода, Write ( . . . ) процедура вывода данных.

Структурное программирование


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

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

Таблица 2.3

Стандартные математические функции Паскаля

Обращение

Тип аргумента

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

Функция

 

 

 

число л 3,1415926536Е+ОО

abs (х)

 

 

Модуль аргумента

arctan (х)

 

 

Арктангенс (в радианах)

cos (х)

 

 

Косинус (в радианах)

ехр (х)

 

 

ех — экспонента

frac (х)

 

 

Дробная часть х

int (х)

 

 

Целая часть х

1n (х)

 

 

Натуральный логарифм

random

 

 

Псевдослучайное число в полуинтервале [О, 1)

random (х)

 

 

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

round (х)

 

 

Округление до ближайшего целого

Окончание таблицы 2.3

Обращение

Тип аргумента

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

Функция

sin (х)

 

 

Синус (в радианах)

sqr (х)

 

 

Квадрат х

sqrt (х)

 

 

Корень квадратный

trunc (х)

 

 

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

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

Uses <имя модуля>

Для управления символьным выводом на экран используется стандартный модуль CRT. К программе он подключается командой:

IJses CRT

Методы программирования


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

Арифметические выражения

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

2а+ 0,5sin(x+ ) . 0,2с — ln(x — у)

На Паскале оно выглядит так:

             (2*A+Sqrt (0 .                   (Х+У) ) ) /  (Х-У) )

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

1.    Все символы пишутся в строчку на одном уровне. Проставляются все знаки операций (нельзя пропускать знак

2.    Не допускаются два следующих подряд знака операций. (Нель-


З. Операции с более высоким приоритетом выполняются раньше операций с меньшим приоритетом. Порядок убывания приоритетов:

вычисление функции; унарная операция смены знака (—); * , / , div, mod;

4.    Несколько записанных подряд операций одинакового приоритета выполняются последовательно слева направо.

5.    Часть выражения, заключенная в скобки, вычисляется в первую очередь. (Например, в выражении (А+В) * (C—D) умножение производится после сложения и вычитания.)

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

Пример, Цифрами сверху указан порядок выполнения операций:

          1 7 4 5 3                   6 2 12 11 10 8             9

(1+у) * (2*x+sqrt (у) — (х+у) ) / (Y+1/ (sqr (х) —4 ) )

 

69

Структурное программирование

Данное арифметическое выражение (на Паскале) соответствует следующему математическому выражению:

(1+У)

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

а) если у — целое положительное значение, то его степень вычисляется через умножение; например, х3 —» х • х • х; большие степени следует вычислять умножением в цикле;

б) если у — целое отрицательное число, то степень вычисляется так: ху = — , а при у = О хо = 1;

в) если у — вещественное, не равное нулю значение, то используется следующая математическая формула: ху = ey lnx . На Паскале получим арифметическое выражение:

Ехр (y*Ln (х) )

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

Пример

1

На Паскале это выражение выглядит так:

Ехр(1/З * Ln(a + 1) )

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

Логические выражения

С логическими величинами и выражениями вам уже приходилось иметь дело при работе с базами данных, с электронными таблицами, в разделе «Логические основы обработки информации» учебника для 10 класса. Кратко сформулируем основные правила записи логических выражений на Паскале.

Методы программирования


Логическое выражение есть логическая формула, записанная на языке программирования. Логическое выражение состоит из логических операндов, связанных логическими операциями и круглыми скобками. Результатом вычисления логического выражения является булевская величина (false или true). Логическими операндами могут быть логические константы, переменные, функции, операции отношения. Один отдельный логический операнд является простейшей формой логического выражения. Логические константы: true, false.

Логические переменные: описываются с типом boolean.

Операции отношения: осуществляют сравнение двух операндов и определяют, истинно или ложно соответствующее отношение между ними.

Знаки операций отношения: — (равно), <> (не равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно).

Логические операции: пое отрицание; and логическое умножение (конъюнкция); or логическое сложение (дизъюнкция), xor «исключающее ИЛИ». Таблица истинности для этих операций выглядит так:

 

в

пое А

А and В

А or В

А xor В

fa1se

false

t rue

fa1se

fa1se

 

fa1se

true

true

fa1se

true

true

true

fa1se

fa1se

false

true

true

true

true

fa1se

true

true

fa1se

Логические операции располагаются в следующем порядке по убыванию старшинства (приоритета): 1) not, 2) and, З) or, xor. Операции отношения имеют самый низкий приоритет. Поэтому если операндами логической операции являются отношения, то их следует заключать в круглые скобки. Например,. математическому неравенству 1 х 50 соответствует следующее логическое выраэкение:

(1<=х) and (х<=50)

Логическая функция odd (х) принимает значение true, если значение целого аргумента х является нечетным, иначе — false.

Структурное программирование


Система основных понятий

Операции, функции, выражения

Арифметические операции — применяются к числовым величинам; нет операции возведения в степень

Тип результата операции зависит от типа операндов (см. табл. 2.2)

Возведение в степень (ХУ): при целом у реализуется через умножение, при вещественном у реализуется так: Ехр (y*Ln (х) )

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

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

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

Вопросы и задания

О

1.   Для следующих математических выраэкений запишите соответствующие арифметические выраэкения на Паскале.

а) а + Ьх

г)


2.   Запишите математические выражения, соответствующие следующим выражениям на Паскале.

а) (Р+Ч) / (r+s) —p*q/ (r*s)

б) 1E3+beta/ (x—gamma*de1ta)

в) a/b* (c+d) — (а—Ь) /b/c+1E—8

З. Для следующих математических выражений запишите соответствующие арифметические выражения на Паскале. а) (1 + х)2 ; б) 1+х2 ; в) cos 2x 2 , г) log2— х ; д) arcsin х; е)

                                                                                      5                                  2

                                                                               107 +ln4!          cos2+lctg И •

4.    Вычислите значения выражений.

а) trunc (б. 9)

е) round (6.2)

 

б) trunc (6.2)

ж) 20 mod 6

 

в) 20 div б

з) 2 mod 5

 

г) 2 div 5

и) 3 4 7 div 2 mod 7/3

trunc (sin (1) )

д) round (б. 9)

5.    Определите тип выражения.

                    а) 1+0. О в) sqr (4)           д) sin (О)

Методы программирования


                      б) 20/4 г) sqrt (16)          е) trunc (—3.14)

6.    Вычислите значения логических выражений.

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

б) odd (trunc (10 * Р) ) при Р = 0,182;

в) пое odd (п) при п О;

                  г) t and (Р mod З       0) при t = true, Р —— 10101;

д) and (У>Х) при х = 2, у = 1;

е) а or пое Ь при а False, Ь True.

2.2.4. Оператор присваивания, ввод и вывод данных

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

1)    оператор присваивания;

2)    оператор ввода;

З) передача значения через параметры подпрограммы. Оператор присваивания имеет следующий формат:

<переменная> : =<выражение>

Сначала вычисляется выражение, затем полученное значение присваивается переменной. В первом примере приведен арифметический оператор присваивания. Здесь х переменная вещественного типа. Во втором примере логический оператор присваивания. Здесь Ь переменная типа Ьоо1еап.

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

Ввод и вывод данных

Структурное программирование


Под вводом понимается передача данных с внешнего устройства компьютера в оперативную память. При выводе данные передаются из оперативной памяти на внешнее устройство (рис. 2,3).

ОЗУ

 

Внешние устройства

Вывод (Wr te)

 

Ввод (Read)

Рис. 2.3. Структура процедурного ЯПВУ

Операцию ввода называют чтением и выполняют с помощью оператора Read. Вывод называют записью, и для его выполнения используется оператор t,7ri Ее.

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

Для внешних запоминающих устройств (ВЗУ) файл это поименованная область памяти этого устройства. В файлы на ВЗУ можно записывать данные по команде Write и можно читать данные из файлов по команде Read. На одном устройстве ВЗУ может храниться множество файлов одновременно. Правила именования файлов на ВЗУ определяются операционной системой. Имена для файлов, создаваемых пользователем, задает сам пользователь.

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

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

Далее мы будем использовать только текстовые файлы.

Методы программирования


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

Содержимое текстового файла представляет собой символьную последовательность, разделенную на строки. Каждая строка заканчивается специальным признаком EOLN (end of line — конец строки). Весь файл заканчивается признаком EOF (end of file — конец файла). Схематически это выглядит так:

 

 

 

 

EOLN

 

S2

 

 

EOLN

 

EOF

Здесь Si обозначает символ в строке. Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Признак EOLN состоит из двух однобайтовых управляющих кодов: CR (код ASCII 13) — возврат к началу строки и LF (код ASCII 10) — перевод строки. При выводе содержимого текстового файла на экран или на печать признак EOLN обеспечивает визуальное разделение строк: переход к продолжению вывода с начала новой строки.

Текстовый файл можно создать или преобразовать с помощью текстового редактора. Файл можно просмотреть на экране монитора или распечатать на принтере.

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

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

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

Пример

Read(a, Ь, с, d)

При выполнении этого оператора происходит прерывание исполнения программы, после чего пользователь должен набрать на клавиатуре значения переменных а, Ь, с, d, отделяя их друг от друга пробелами или нажатием клавиши Enter. При этом вводимые значения высвечиваются на экране. Значения следует вводить в строгом соответствии с синтаксисом Паскаля.

П име

Var Т: Rea1; б: integer; К: char; begin

Read(T, О, К) ;

Набираем на клавиатуре:

253.98 100 G [Enter]

 

75

Структурное программирование

 

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

П име

Var А, В: Integer; С, D: Rea1;

begin

Read(A, В) ; Read(C, D) ;

Набираем на клавиатуре и видим на экране:

18758 34 2.62Е-О2 1.54Е+О1 [Enter].

Другой вариант оператора ввода с клавиатуры имеет вид: Read1n (<список ввода>)

Здесь слово Read1n означает read line читать строку. Нажатие клавиши Enter в процессе ввода вырабатывает признак EOLN — конец строки, и данные при выполнении следующего оператора ввода будут отображаться на экране с начала новой строки. Если в предыдущем примере заменить операторы Read на Read1n:

ReadLn (А, В) ; ReadLn (С, D) ;


то ввод значений будет происходить из двух строк, отображенных на экране:

18758 34 [Enter]

2. 62Е-О2 1.54Е+О1 [Enter]

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

Ввод из файла на диске

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

Для организации ввода данных из текстового файла следует:

1)    объявить в программе переменную с типом text (она называется файловой переменной);

2)    связать файловую переменную с файлом на ВЗУ, содержащим исходные данные, с помощью оператора Ass ign;

З) открыть файл для чтения с помощью процедуры Reset;

Методы программирования

4)   


осуществлять чтение из файла с помощью операторов Read или Read1n;

5)    закрыть файл с помощью оператора C10se.

в Пример. В текстовом файле с именем abc.txt хранятся пять чисел, разделенных на две строки:

2 .5 3.1 4.0

0.7 1. 5

В следующей программе организован ввод этих данных в вещественные переменные а, Ь, с, d, е:

Var а, Ь, с, d, е: rea1;

FD: text; {Описание файловой переменной begin

Assign (FD, ' abc. txt') ; К переменная FD связывается с файлом abc . txt}

Reset (FD) ; (файл открывается для чтения с его начала)

Read1n (FD, а, Ь, с) ; {чтение первой строки файла)

Read1n (FD, d, е) ; (чтение второй строки файла)

C10se (FD) ; (разрывается связь переменной FD с файлом}

Здесь FD  файловая переменная. Assign, Reset, Read1n, C10se — операторы обращения к стандартным процедурам, имеющим следующие форматы:

Assign (<файловая переменная>, <имя файла>) ;

Reset (<файловая переменная>) ;

Read1n (<файловая переменная>, <список ввода>) ;

C10se (<файловая переменная>) ;

Если файл хранится не в текущем каталоге, то в операторе Assign кроме имени файла надо указывать полный путь к нему.

Имя файла можно задавать в строковой константе или переменной.

Вывод на экран производится по оператору обращения к стандартной процедуре:

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

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

П име

Write ( ' Сумма

Если, например, А7, то на экране получим:

Сумма 5+7=12

Структурное программирование

2.2


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

Второй вариант процедуры вывода на экран: Write1n (<список вывода>)

Write1n означает write line — писать строку. Действие оператора Write1n отличается от действия оператора Write тем, что после вывода последнего в списке значения происходит перевод курсора к началу следующей строки. Оператор Write1n, записанный без параметров, вызывает перевод строки.

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

Вывод в текстовый файл

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

Для организации вывода данных в текстовый файл следует:

1)    объявить в программе файловую переменную с типом text ;

2)    связать файловую переменную с файлом на ВЗУ с помощью оператора As s i дп ;

З) открыть файл для записи с помощью процедуры Rewrite;

4)    осуществлять запись в файл с помощью операторов Write или Write1n;

5)    закрыть файл с помощью оператора C10se. в Пример

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

var А: integer;

ТМ: text; {0писание файловой переменной} begin

Assign (ТМ, ' Е: \TabMu1. txt Связывание переменной ТМ} {с файлом)

Rewrite (ТМ) ; {Открытие файла для записи)

Методы программирования


{ Циклический вывод в файл таблицы умножения на 2 } for А :=2 to 9 do Write1n (ТМ, 2, ' А

C10se (ТМ) [Закрытие файла } end.

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

Rewrite (<файловая переменная>) ;

Write (<файловая переменная>, <список вывода>) ;

Writeln (<файловая переменная>, <список вывода>) ;

Если файла с именем, указанным в операторе Assign, на диске не было, то программа его создаст. Если такой файл уже был, то его прежнее содержание будет утеряно и запишутся новые данные. В конце выполнения оператора Write1n выставляется признак EOLN. Оператор Write этого не делает. Закрытие файла приводит к выставлению признака EOF.

В результате выполнения программы в корневом каталоге диска Е: появится файл с именем TabMul.txt. Открыв его в текстовом редакторе, увидим:

 

79

Структурное программирование

Система основных понятий

Присваивание, ввод, вывод

Оператор присваивания: <переменная> : =<выражение>

Типы переменной и выражения должны совпадать. Исключение: вещественной переменной можно присваивать значение целого выражения

Ввод — передача данных с внешнего устройства в ОЗУ

Ввод с клавиатуры:

Read (<список ввода>) или

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

Ввод из файла:

Read (<ФП>, <список ввода>) или

Read1n (<ФП>, <список ввода>) .

ФП — файловая переменная

Вывод — передача данных из ОЗУ на внешнее устройство

Вывод на экран:

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

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

ВывоД в файл:

Write (<ФП>, <список вывода>) или

Write1n (<ФП>, <список вывода>) .

ФП — файловая переменная

Операторы (стандартные процедуры) работы с файлами

Assign — назначение связи между файловой переменной и файлом на внешнем устройстве;

Reset — открытие файла для чтения;

Rewri te — открытие файла для записи;

C10se — закрытие файла (разрыв связи с файловой переменной)

Вопросы и задания

1.   Назовите последовательность действий при выполнении оператора О присваивания.

2.   Сформулируйте правило соответствия типов для оператора присваивания. Какое существует исключение из этого правила?

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

            а) у:=п+1;                       б) п:=у—1;

               д) у:=п div 2;                    е) у:=у div 2;

           ж) п:=п/2;                       з) n:=sqr (sqrt (п) ) ;

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

5.    Напишите оператор присваивания, в результате выполнения которого целой переменной h присвоится значение цифры, стоящей в разряде сотен в записи положительного целого числа К (например, если К 28796, то h 7).

6.    Напишите оператор присваивания, в результате выполнения которого целой переменной S присвоится значение суммы цифр трехзначного целого числа К.

в 7. Напишите программу, по которой из текстового файла с именем kvur.txt будут прочитаны три числа: а, Ь, с — коэффициенты квадратного уравнения, затем будут вычислены корни этого уравнения и выведены на экран и в текстовый файл korni.txt.

Практикум. Раздел «Программирование»

2.2.5. Структуры алгоритмов и программ

Базовые алгоритмические структуры

Методы программирования


В основе структурного программирования лежит теорема, доказанная Эдсгером Дейкстрой в 1969 году. Суть ее в том, что алгоритм для решения любой логической задачи можно составить только из структур СЛЕДОВАНИЕ, ВЕТВЛЕНИЕ, ЦИКЛ. их называют базовыми алгоритмическими структурами.

В параграфе 1.7.1 учебника для 10 класса уэке рассказывалось о базовых структурах. По сути дела, мы и раньше во всех рассматриваемых примерах программ придержива-

лись принципов структурного программиро-

Эдсгер В. Дейкстра

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

(1930-2002)

Следование — это линейная последовательность действий:

В программе на Паскале серия это либо один отдельный оператор, либо составной оператор: последовательность операторов, заключенная в операторные скобки. Операторными скобками называются служебные слова begin и end.

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

if <логическое выражение> then <серия 1> e1se <серия 2>;

Неполная форма ветвления имеет место, когда на ветви «нет» пусто:

Х Е <логическое выражение> then <серия> ;

 

81

Структурное программирование

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

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

while <логическое выражение> do <серия> ;

Пока условие истинно, выполняется серия, образующая тело цикла.

Второй тип циклической структуры цикл с постусловием (цикл-до):

repeat

<серия> unti1 <јтогическое выражение> Здесь тело цикла предшествует условию цикла. Тело цикла повторяет свое выполнение, если условие ложно. Повторение закончится, когда условие станет истинным. На Паскале для тела цикла с постусловием операторных скобок не требуется.

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

Методы программирования


Иногда в литературе структурное программирование называют «программированием без goto» оператора безусловного перехода. Действительно, при таком подходе нет места безусловному переходу. Неоправданное использование в программах оператора goto лишает ее структурности, а значит, всех связанных с этим положительных свойств: «прозрачности» и надежности алгоритма. Хотя во всех процедурных языках программирования этот оператор присутствует, однако, с точки зрения структурного подхода, его употребления следует избегать.

Комбинации базовых структур

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

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

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

 

83

Структурное программирование

Рис. 2.4. Структурные схемы алгоритмов

Приведенные на рис. 2.4 блок-схемы можно охарактеризовать следующим образом (в порядке номеров):

1.    Вложенные ветвления. Глубина вложенности равна единице.

2.    Цикл с вложенным ветвлением.

З. Вложенные циклы-пока. Глубина вложенности — 1.

4.    Ветвление с вложенной последовательностью ветвлений на положительной ветви и с вложенным циклом-пока на отрицательной ветви.

5.    Следование ветвления и цикла-до.

6.    Вложенные циклы. Внешний — цикл-пока, внутренний цикл-до.

Методы программирования


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

    конструкции одного уровня вложенности записываются на одном вертикальном уровне (начинаются с одной позиции в строке);

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

Для приведенных на рис. 2.4 блок-схем структура текстов программ на Паскале должна быть следующей.

 

1.

if <У1> then begin if <У2> then <С1> end e1se if <УЗ> then <С2> e1se <СЗ>;

2.

whi1e <У1> do

<У2> then <С1> e1se <С2>;

з.

whi1e <У1> do whi1e <У2> do

4.

then begin if <У2> then <С1>

if <УЗ> then <СЗ>

end e1se whi1e <У4> do <С5>;


5.

then <С1> e1se <С2>; repeat

 ;

6.

whi1e <У1> do repeat

<C1> unti1 <У2>;

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

Структурное программирование

 


Система основных понятий

Структуры алгоритмов и программ

Базовые алгоритмические структуры

Следование

Ветвление

Цикл

Линейная последо- вательность дейст- вий

Выбор одной из двух серий действий с вы- ходом на общее про- должение

Повторение серии действиЙ по условию. Цикл с предусловием, цикл с постусловием

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

Структурный алгоритм (программа): построенный из базовых алгоритмических структур, не содержащий команды безусловного перехода (goto)

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

Вопросы и задания

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

2.   Какой алгоритм называется структурным?

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

чение. Первый вариант — с полным ветвлением, второй вариант — с неполным ветвлением.

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

5.    Для данного натурального числа N требуется вычислить сумму: 1 + 1/2 + + 1/3 + ... + 1/N. Постройте алгоритм и напишите два варианта программы на Паскале: с циклом-до и с циклом-пока.

б. Какую структуру будет иметь алгоритм решения следующей задачи? Дано целое положительное число N. Если N — четное, то вычислить N! =  Если N — нечетное, то вычислить сумму: 1 + 2 + + + N. Составьте программу на Паскале.

в 7. В следующем фрагменте программы К и S         переменные целого типа:

Read1n (К) ;

Методы программирования


while        do begin mod 10; div 10 end;

Write1n (S) ;

Какая решается задача? Запрограммируйте решение этой же задачи с использованием цикла с постусловием.

2.2.6. Программирование ветвлений

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

Пример 1

Требуется перевести пятибалльную оценку в ее наименование: 5 «отлично», 4 «хорошо», З «удовлетворительно», 2 « неудовлетворительно ».

Блок-схема алгоритма приведена на рис. 2.5.

Рис. 2.5. Алгоритм перевода числовой оценки в словесную

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

Program Marks 1 ;

Var N: integer;

Begin

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

Структурное программирование


ReadLn (N) ;

then WriteLn ( Отлично ) e1se

 (N=4) then WriteLn ( ХОРОШО ) e1se

then WriteLn ( ' Удовлетворительно )

then WriteLn ( Неудовлетворительно ) e1se WriteLn ( Неверная оценка )


Пример 2

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

Program Marks 2;

Var N: integer;

Begin

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

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

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

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

2: WriteLn ( неудовлетворительно! ) ; e1se WriteLn ( ' Нет такой оценки ' ) end ;

Оператор выбора имеет следующий формат:

case <селектор> ОЕ

 

Методы программирования


<список констант> :

<список констант> : <опера тор> ; e1se <оператор> end

Здесь <селектор> — это выражение любого порядкового типа; <константа> постоянная величина того же типа, что и селектор; <список констант> последовательность констант, разделенная запятыми; <оператор> — любой простой или составной

оператор.

Выполнение оператора выбора происходит так: вычисляется выражение — селектор; затем в списках констант ищется такое значение, которое совпадает с полученным значением селектора; далее исполняется оператор, помеченный данной константой. Если такой константы не найдено, то происходит переход к выполнению оператора, следующего после слова e1se.

Пример З

В этом примере демонстрируется использование списка констант в операторе выбора. Программа сообщает, сдал студент экзамен или не сдал. Если оценка одна из следующих: З, 4, 5, то экзамен сдан; если оценка 2, то не сдан.

case    

З, 4, 5: WriteLn ( Экзамен сдан ;

2: WriteLn ( Экзамен не сдан ' ) ; e1se WriteLn ( ' Нет такой оценки ' ) ;

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

Если применить условный оператор, то эта программа запишется так:

Структурное программирование


if (N=3) or (N=4) or (N=5) then WriteLn ( Экзамен сдан ) e1se

then WriteLn ( Экзамен не сдан ' ) e1se WriteLn ( ' Нет такой оценки ' ) ;

В условии ветвления использовано сложное логическое выражение, содержащее операции логического сложения or (или).

Пример 4

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

Запишем систему неравенств, которой удовлетворяют точки, принадлежащие данной области:

Рассмотрим два варианта применения ветвления для решения этой задачи.

Program Variant 1 ; Var х, у: real; begin

Write ( ' Введите х, У : Read1n (х, у) ; if у<=1 then if y>=sin (х) then if х>=0 then if  then Write ( Да e1se Write ( ' Нет e1se Write ( ' Нет!) e1se Write ( ' Нет e1se Write Нет end.

Program Variant 2; Var х, у: rea1; begin

Write( ' Введите х, у: Read1n (х, у) ; if (у<=1) and (х) ) (х>О) and then Write ( Да else Write ( Нет!) епа .

and

Методы программирования


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

Program Variant З;

Var х, у: rea1; Flag: Воо1еап; begin

Write ( Т Введите х, у:    Read1n (х, у) ; and   (х) ) and (х>0) and  ;

Write ( Точка принадлежит области? ' , F1ag : 6) end.

Здесь используется логическая переменная Flag, которая принимает значение true или false в зависимости от положения точки. Например, если ввести значения х = 1, у 1, то на экран выведется:

Точка принадлежит области? True .

А если х = 1, у = 2, то получим:

Точка принадлежит области? Fa1se .

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


Структурное программирование


Система основных понятий

Программирование ветвлений

Условный оператор

Оператор выбора

if (<логическое выражение>) then <оператор 1> e1se <оператор 2>

Если <логическое выражение> истинно, то выполняется <опе— ратор 1>, иначе выполняется <оператор 2>. <Оператор 1> и <оператор 2> — простые или составные операторы. В неполном ветвлении отсутствует ветвь e1se

case <селектор> of

<список констант 1 >:

<оператор 1>;

<список констант :

<оператор N> e1se <оператор> end

<селектор>     выражение порядкового типа; константы имеют тот же тип. Выполняется только одна из ветвей выбора, которая содержит константу, совпадающую со значением селектора. Ветвь e1se может отсутствовать

Вопросы и задания

о

1.   Какие операторы используются для программирования ветвящихся алгоритмов?

2.   Является ли оператор выбора необходимым для программирования ветвящихся алгоритмов?

З. В каких случаях удобно использование оператора выбора?

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

5.   Используя оператор выбора, составьте программу, которая по введенному номеру месяца в году будет выводить соответствующее время года (зима, весна, лето, осень).

Практикум. Раздел «Программирование»

2.2.7. Программирование циклов

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

в пределе стремится к значению константы е = 2,71828182... . Функция ех называется экспонентой, а логарифм по основанию е называется натуральным логарифмом и обозначается lnx.

Требуется составить программу, вычисляющую эту константу

по сумме числового ряда.

Если слагаемые в этом выражении обозначить следующим образом:

1

то обобщенная формула для г-го элемента будет такой:

1

Нетрудно увидеть, что между элементами данной последовательности имеется зависимость:

 

Методы программирования


ао = 1, аш =— 1

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

при i = О; при i > О.

Циклы с заданным числом повторений

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

1 п!

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

Program Summa_1 Var Е, а: rea1; N, 1: begin Write (

whi1e begin

end;

Write1n( end.

;

integer;

Read1n (N) ; do

Е)

Program Summa 2;

Var Е, а: rea1;

N, i : integer; begin

Write ( 'N=') ; Read1n (N) ;

repeat

unti1 i>N;

VVrite1n ( 'Е=' Е) end.

Обратите внимание на то, как цикл с предусловием преобразуется в цикл с постусловием: условие цикла помещается после тела цикла и заменяется на противоположное:

Not (

И тот, и другой цикл повторит свое выполнение N раз. Переменная i выполняет роль не только знаменателя в дроби 1/i!, но и является счетчиком числа повторений цикла. Такие переменные называются параметрами цикла. О

Выполнение этих программ на компьютере для значения N = 7 приводит к следующему результату: Е = 2, 7182539.

Структурное программирование


Для программирования циклов с заданным числом повторений при постоянном шаге изменения параметра цикла в Паскале существует цикл с параметром. Вот как выглядит программа решения той же задачи с использованием цикла с параметром:

Program Summa З ;

Var Е, а: real; N, 1: integer; begin

Readln (N) ;

for to N do begin

end ;

Write1n ( 'Е=' Е) end.


В программе используется оператор цикла for, для которого существуют два варианта:

1) Eor <параметр цикла> : =<выражение 1> to <выражение 2> do <оператор>

2) for <параметр цикла> : 1> downto <выражение 2> do <оператор>

Здесь <параметр цикла> — имя простой переменной порядкового типа. Выполнение оператора for в первом варианте (to) происходит по следующей схеме.

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

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

З. Значение параметра цикла сравнивается со значением <выра— жения 2>. Если параметр цикла меньше или равен этому значению, то выполняется тело цикла, в противном случае выполнение цикла заканчивается.

4. Значение параметра цикла изменяется на следующее значение в его типе (для целых чисел — увеличивается на единицу); происходит возврат к пункту З.

Методы программирования

Оператор цикла for объединяет в себе действия, которые при использовании цикла whi1e выполняют несколько операторов: присваивание параметру начального значения, сравнение с конечным значением, замена значения на следующее.

Во втором варианте оператора for слово downto буквально можно перевести как «вниз до». В таком случае параметр цикла изменяется по убыванию, т. е. при каждом повторении цикла параметр изменяет свое значение на предыдущее (равносильно (i) ). Работая с оператором for, учитывайте следующие правила:

                  параметр цикла не может иметь вещественный тип;

                  в теле цикла нельзя изменять переменную — параметр цикла;  при выходе из цикла значение переменной-параметра является неопределенным.

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

for С

Здесь переменная с имеет тип char.

А теперь подумайте, как вывести кодировку латинского алфав обратном порядке

Итерационные циклы

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

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

Структурное программирование


С увеличением значения i величина 1/i! уменьшается, следовательно, в сумму надо включать все слагаемые, предшествующие первому значению, меньшему Е. Приведем две программы решения этой задачи: с циклом с предусловием и циклом с постусловием.

Program Summa 4;

Var Е, а, eps: rea1; i: integer; begin

Write ( 'Eps=' ) ; Readln (eps) ;

whi1e a>eps do begin

end;

      Write1n ( '          Е,

Слагаемых: , i ) end.

Program Summa 5;

Var Е, а, eps: rea1; i : integer; begin

Write('Eps= ) ; Readln (eps) ;

repeat

 Е,

Слагаемых: end.

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

В качестве результата выводится значение суммы и число вошедших в нее слагаемых. Выполнение этих программ для значения е = 10-8 дает в результате:

Е=2, 71828182 Слагаемых: 12

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

Методы программирования


О Система основных понятий

Программирование циклов

Разновидности циклических алгоритмов

Циклы с заданным числом повторений

Итерационные циклы

Имеется управляющий параметр, изменяющийся с постоянным шагом в определенном диапазоне значений.

Реализуется всеми типами операторов цикла

Число повторений цикла заранее неизвестно.

Реализуется операторами циклапока и цикла-до

Операторы цикла

Цикл-пока

Цикл с параметром

Цикл-До

whi1e <логическое выражение> do <оператор>;

<оператор>    тело цикла. Цикл повторяет выполнение, пока истинно <логическое выражение>

Параметр       перемен-

ная порядкового типа 1) for <параметр цикла >

<выражение 1> to

<выражение 2> do

<оператор>  по возрастанию раметра

2) for <параметр цикла>           

<выражение 1> downto <выражение do <оператор> по убыванию параметра

repeat

<оператор> until

<логическое выражение>

Повторяется выполнение тела цикла до того, как <логическое выражение> станет истинным

О Вопросы и задания


О 1. Чем отличается итерационный цикл от цикла с заданным числом повторений?

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

2 3. Значение функции ех (экспонента от х) равно сумме сходящегося бесконечного ряда:


Получите рекуррентную формулу для слагаемых. Используя операторы цикла while, repeat и for, составьте три варианта программы вычисления суммы с заданным числом слагаемых.

4.    Запрограммируйте итерационный цикл вычисления функции ех с заданной точностью е. Составьте два варианта программы: с циклами whi1e и repeat. Сопоставьте полученный результат со значением стандартной функции ехр(х).

5.    Вычислите сумму квадратов всех целых чисел, попадающих в интер- 2 вал (lnx, еХ), для заданного х > 1.

6.    Вычислите количество точек с целочисленными координатами, попадающих в круг радиуса R (R > О) с центром в начале координат.

7.    Получите таблицу значений функций sin х и cos х на отрезке [О, 1] с шагом 0,1 в следующем виде:

cos х

о. 0000

о.оооо

1. 0000

0.1000

0.0998

0.9950

1. 0000

0.8415

0.5403

 

97

Структурное программирование

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

9.    Дано целое п > 2. Получите все простые числа из отрезка [2, п].

Практикум. Раздел «Программирование»

2.2.8. Вспомогательные алгоритмы и подпрограммы

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

В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале различаются две разновидности подпрограмм: процедуры и функции. Рассмотрим этот вопрос на примере следующей задачи: даны два натуральных числа а и Ь. Требуется определить наибольший общий делитель трех величин: а + Ь, а 2 + b 2 , а • Ь. Запишем это так: НОД(а + Ь,

Идея решения состоит в следующем математическом факте: если х, у, г — три натуральных числа, то НОД(х, у, г)

г). Иначе говоря, нужно найти НОД двух ве-

личин, а затем НОД полученного значения и третьего числа (попробуйте это доказать).

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

при М>ЛТ•, при ЛТ >М.

Приведем алгоритм решения поставленной задачи на учебном Алгоритмическом языке (АЯ). Алгоритм состоит из процедуры «Евклид» и основного алгоритма «Задача», в котором присутствуют два обращения к процедуре:

О Процедура Евклид (цел М, N, К) ;

Методы программирования


нач пока нц если M>N то иначе кв кц

кон

алг задача; цел а, Ь, с;

нач ввод (а, Ь) ;

Евклид (a+b, a*a+b*b, Евклид (с, a*b, с) ; вывод (с) кон

Здесь М, N и К являются формальными параметрами процедуры. М и N — параметры-аргументы, К — параметр-результат.

Процедуры в Паскале. Основное отличие процедур в Паскале от процедур в Алгоритмическом языке состоит в том, что процедуры в Паскале описываются в разделе описания подпрограмм, а в АЯ процедура является внешней по отношению к вызывающей программе. Теперь посмотрим, как решение поставленной задачи программируется на Паскале.

Program NOD1 ;                                                                                                       о

Var А, В, С: integer;

Procedure Evk1id (М, N: integer ; var К: integer) ; begin whi1e M<>N do if M>N

end; begin

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

Write ( 'b =ReadLn (В) ;

     Evk1id(A+B,            +

Evk1id(C, А*В, С) ;

 С)

Структурное программирование


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

Procedure <имя процедуры> [ (список формальных параметров) ] ; <блок>

Квадратные скобки указывают на то, что список формальных параметров может отсутствовать, т. е. возможна процедура без параметров.

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

Var <список переменных>: <тип>

Параметры-значения указываются так:

<список переменных> : <тип>

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

<имя процедуры> [ (список фактических параметров) ]


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

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

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

Методы программирования


В рассмотренном нами примере формальные параметры М и N являются параметрами-значениями. Это аргументы процедуры. При обращении к ней первый раз им соответствуют значения выраэкений А+В и А •А+В • В) ; второй раз — С и А • В. Параметр К является параметром-переменной. В ней получается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная С. Через эту переменную основная программа получает результат.

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

Program NOD2 ;

Var А, В, К, М, N: Integer; Procedure Evk1id; begin while M<>N do

к:=м end; begin

) ; ReadLn (А) ;

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

М: =А+В;

Evk1id;

Evklid;

WriteLn ( НОД равен       К) end.

Чтобы разобраться в этом примере, требуется объяснить новое для нас понятие: область действия описания.

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

В программе NOD1 переменные М, N, К являются локальными внутри процедуры; переменные А, В, С глобальные. Однако внутри процедуры переменные А, В, С не используются. Связь между внешним блоком и процедурой осуществляется через параметры.

Структурное программирование


В программе NOD2 все переменные являются глобальными. В процедуре Evk1id нет ни одной локальной переменной (нет и параметров). Переменные М и N, используемые в процедуре, получают свои значения через оператор присваивания в основном блоке программы и изменяют значения в подпрограмме. Результат получается в глобальной переменной К, значение которой выводится на экран. Здесь обмен значениями между основной программой и процедурой производится через глобальные переменные.

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

Функции. Теперь выясним, что такое подпрограмма-функция. Обычно функция используется в том случае, когда результатом работы подпрограммы должна быть скалярная (простая) величина. Тип результата называется типом функции. В Турбо Паскале допускаются функции строкового типа. Формат описания функции следующий:

Function <имя функции> [ (<список формальных параметров>) ] :

<тип функции>; <блок>

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

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

О Program NOD3;

Var А, В, Rez: integer;

Function Evk1id (М, N: integer) : integer; begin whi1e M<>N do

then e1se N:=N—M;

Evk1id : =М end; begin

епа .

Из примера видно, что тело функции отличается от тела процедуры только тем, что в функции результат присваивается иДентификатору функции: Evk1id: =М.

 

Методы программирования


Обращение к функции является операндом в выражении. Оно записывается в следующей форме:

<имя функции> (<список фактических параметров>)

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

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

О Function Мах (Х, У: rea1) : rea1; begin Мах : =Х; if Х>У then Exit e1se Мах :=У

Модифицированный алгоритм Евклида. Подпрограмму алгоритма Евклида можно составить иначе, если воспользоваться операцией mod — получением остатка от деления, имеющейся в Паскале. Идея алгоритма исходит из справедливости следующих равенств:

М, при N=O;

НОД (N,MmodN), при N#O.

В таком случае функцию Evk1id можно переписать так:

Function Evk1id (М, N: integer) : integer;                                     о

Структурное программирование

 

103

Var R : integer; begin

whi1e do begin mod N;N:=R end;

Evk1id : =М end;

Система основных понятий

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

Процедуры

Функции

Результат — любое число величин Описание:

Procedure <имя процедуры> [ ( список формальных параметров) ] ; <блок>

Результат — одна величина Описание:

Function <имя функции> [ (<список формальных параметров>) ] : <тип функции>; <блок>

Обращение — оператор процеДу-

<имя процедуры> [ ( список фактических параметров) ]

Обращение — операнд выражения:

<имя функции>

(<список фактических параметров> )

Параметры подпрограмм

Параметры-переменные

Параметры-значения

Описание:

Var <список переменных> :

Описание:

<список переменных>: <тип>

Фактические параметры: переменные

Фактические параметры: выражения


о Вопросы и задания

О 1. Для чего используются подпрограммы?

2, В чем различие между процедурами и функциями?

3.    Какие существуют способы передачи данных между подпрограммой и вызывающей ее программой?

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

в 5. Составьте программу сложения двух простых дробей. Результат должен быть несократимой дробью. Используйте подпрограмму вычисления НОД по алгоритму Евклида. Простая дробь задается двумя целыми числами: числителем и знаменателем.

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

Даны три целых числа. Определите, у которого из них больше сумма цифр. Подсчет суммы цифр организуйте через подпрограмму.

Практикум. Раздел «Программирование»

Методы программирования

2.2.9. Массивы

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

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

Описание массивов. Переменная регулярного типа описывается в разделе описания переменных в следующей форме:

Var <идентификатор>: array [<тип индекса>] ОЕ <тип компонентов>

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

              Var Т: array           12]         real;

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

Элемент массива идентифицируется в виде переменной с индексами:

<идентификатор массива> [<индексы элемента>]

104

Для одномерного массива записывается один индекс одно значение. Для многомерных массивов индексы множество значений. В качестве индекса моэкет употребляться любое выражение соответствующего типа. Например, для элементов массива температур возможны обозначения: Т Т [К], Т [i+j], т [т div 2] .

Последовательные элементы массива располагаются в последовательных ячейках памяти (т [1] , т [2] и т. д.), причем значения индекса не должны выходить за диапазон 1 . . 12.

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

Var Cod: array[char] of 1. .100;

L: array [Ьоо1еап] 0f char;

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

Cod[ 'x' ] ; L[true] ; Cod[chr (65) ] ;        .

Структурное программирование

 


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

Туре Index

Var C1ass 10 : array [Index] of byte;

И если, например, элемент C1ass 10 [А] равен 35, то это означает, что в 10А классе 35 человек. Такое индексирование улучшает наглядность программы.

Часто структурному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.

Туре Mas1 = array [1. . 100] 0f integer; Mas2 = array [—10. .10] of char;

Var Num: Mas1; Sim: Mas2;

До сих пор речь шла об одномерных массивах, в которых типы элементов скалярные.

Многомерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов).

В качестве примера рассмотрим таблицу с информацией о среднемесячных температурах за 10 лет, например с 2001 по 2010 год. Очевидно, что для этого удобна прямоугольная (двумерная) таблица, в которой столбцы соответствуют годам, а стро-

Год

 

Месяц

 

 

 

 

 

 

 

 

 

 

 

 

12

2001

-23

17

-8,4

6,5

14

18,6

25

19

12.3

 

 

- 19

2002

- 16

- 8,5

-3,2

 

8,4

13,8

28,5

21

6,5

2

- 13

- 20

2003

 

14

—9,2

4,6

15,6

21

17,8

20

11,2

8,1

- 16

-21

 

 

 

 

 

 

 

 

 

 

 

 

 

2010

-25

9 7

-3,8

8,5

13,9

17,8

23,5

17,5

10

5,7

- 14

- 20

Для обработки такой таблицы в программе следует описать массив:

Var ТаЬ1: array[2001. .2010] ОЕ array[1 . .12] ОЕ rea1;

Вот примеры обозначения некоторых элементов этого массива: Тат [2001] [1] ; Тат [2005] [10) ; ТаЬ1[2О1О] [12] .

Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:

Тат [2005,10] ; Тат [2010,12].

Переменная ТаЬ1 [2001] обозначает всю первую строку таблицы, т. е. весь массив температур за 2001 год. Другим эквивалентным вариантом приведенному выше описанию является следующее:

Туре Month = array [1. .12] of rea1;

Методы программирования


Year = array [2001. .2010] 0f Month;

Var ТаЬ1: Year;

Наиболее краткий вариант описания данного массива такой:

Var ТаЬ1: array[2001. .2010, 1. .12] ОЕ rea1;

Продолжая по аналогии, можно определить трехмерный массив как одномерный массив, у которого элементами являются двумерные массивы. Вот пример описания трехмерного массива: Var А: array[1. . 10, 1. .20, 1. .30] 0f integer;

Это массив, состоящий из 10 • 20 • 30 — 6000 целых чисел и занимающий в памяти 6000 • 2 12 ООО байтов. В Паскале нет ограничения сверху на размер массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы. В Турбо Паскале это ограничение равПо аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные — матрицами.

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

Const Imax = 10; Јтах =

Var Mas: array[1. .Imax, 1. . Јтах] ОЕ integer;

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

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

Структурное программирование


        Пример 1                                                                                                         О
Var Р, Q: array[1. .5, 1. .10] ОЕ rea1;

При выполнении операции присваивания

все элементы массива Р станут равными соответствующим элементам массива Q.

        Пример 2                                                                                                         О

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

Туре Mas array [1 . .12] 0f rea1;

Var ТаЬ1: array[2001. .2010] 0f mas;

и в нем требуется данные за 2009 год сделать такими же, как за 2001 год (девятой строке присвоить значение первой строки), то это можно сделать одним присваиванием: ТаЬ1 [2009] ТаЬ1 [2001] .

А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:

где переменная Р описана так:

Var Р: Mas;

О Ввод и вывод массивов производится покомпонентно. Вот примеры ввода с клавиатуры значений одномерного и двумерного массивов :

for I:=1 to 12 do

ReadLn (Т ) ; for to Imax do

For Ј:=1 €0 Јтах do

ReadLn (Маз [1, Л ) ;

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

Аналогично в цикле по индексной переменной организуется вывод значений массива на экран. Например:

            For Т         то 12 Do  : 8:4) ;

Напомним, что модификатор формата 8:4 означает вывод числа в формате с фиксированной точкой в 8 позиций, из которых в 4 последних позициях размещается дробная часть.

 

Методы программирования

О Следующий фрагмент программы организует построчный вывод матрицы на экран: for I Ео Imax do begin for Ј:=1 to Јтах do

Write (Маз [I,J] : 6) ;

WriteLn епа ;

После вывода очередной строки матрицы оператор Write1n без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если Јтах не превышает 12 (подумайте почему).

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

5 7 10 з З 2 1 23 7 12 6 10

                9        2           6 14

108

В следующей программе производится ввод этой матрицы в двумерный массив М:

Var М: array [1. . 4, 1 . .4] of integer; i, ј : byte;

F1: text; {Файловая переменная) begin

Assign (F1, 'matr. txt ' ) ; { Связывание F1 с файлом matr . txt Reset (F1) ; {Открытие файла для чтения} for i:=1 to 4 do begin for ј €0 4 do

Read(F1,  { Последовательное чтение }

{из одной строки}

Read1n (F1 )            [Переход к следующей строке end;

      C10se (F1) ;            [Закрытие файла }

Структурное программирование


Система основных понятий

Массивы

Массив — переменная величина регулярного типа

Регулярный тип — структурный тип данных, представляющих собой совокупность пронумерованных однотипных величин

Описание массива

Идентификация элементов массива

Var <идентификатор> :

array [ <тип индекса>]            <тип компонентов>

<тип индекса> — любой порядковый тип, кроме integer; тип компонентов любой простой или структурный тип

<идентификатор ма ссива>

[ <индексы элемента>)

Для одномерного массива — один индекс (одно значение), для многомерного массива индексы — множество значений

Действия над массивом как единым целым

Присваивание однотипных массивов

Отношения «равно» , «не равно» для однотипных массивов

Ввод/вывод массивов производится покомпонентно с клавиатуры или из файла

Вопросы и задания

1.   Что такое регулярный тип данных? Что такое массив?   О

2.   Какие типы допустимы для индексов массива?


3.   Как в Паскале трактуется многомерный массив?

4.   Какие действия можно выполнять над массивом как единым целым?

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

Даны значения массива {ај}, i = О, . 10, и переменной х. Составьте программу вычисления алгебраического многочлена 10-й степени по формуле Горнера:

                +                + + а1Х + = ((...(ашх + а9)х + а8)х + + а1)х + ао.

7.    Значения вектора {Xi}, i = 20 вводятся из текстового файла. Требуется подсчитать количество его элементов, значения которых лежат на отрезке [0, 1].

8.    Введите из текстового файла целочисленную матрицу размером 6 х 8. Переверните матрицу, поменяв 1-ю строку с 6-й, 2-ю — с 5-й, 3-ю — с 4-й, и запишите полученную матрицу в другой файл.

в 9. Введите с клавиатуры одномерный числовой массив из 9 элементов. Сверните его в матрицу размером З х З, разместив первую тройку элементов в 1-й строке матрицы, 2-ю тройку — во второй строке, 3-ю тройку — в третьей строке.

Методы программирования


в 10. Введите с клавиатуры построчно в двумерный массив числовую матрицу размером 4 х 4. Разверните ее по столбцам в одномерный массив. Запишите массив в текстовый файл.

2.2.10. Типовые задачи обработки массивов

Заполнение массива

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

О Пример 1

Заполнить массив равномерно распределенными целыми случайными числами в диапазоне от О до 100. Var Х: array[1. .20] integer; i : integer; begin

Randomize; for      to 20 do Х [1] :=Random (100) ;

For             to 20 do Write (Х Д] : 4) end.

Стандартная функция Random (х) возвращает псевдослучайное целое число на отрезке [О, х — 1], где х целое число. Такие функции называют датчиками случайных чисел. Стандартная процедура Randomize случайным образом устанавливает начальное состояние датчика. Благодаря этому при повторном запуске программы последовательности чисел, вырабатываемые датчиком, повторяться не будут.

Если требуется изменить диапазон случайных чисел, то это всегда можно сделать путем сдвига. Например, если нужно получить числа на отрезке [—50, 50], то в программе перепишется оператор присваивания: х д ] (100) -50;

Для получения вещественных случайных чисел используется функция Random без аргументов. Она возвращает случайные дробные значения в полуинтервале [О, 1). С помощью сдвига и множителя эти значения можно привести к любому диапазону. Например, следующее выражение будет вычислять случайное вещественное число в полуинтервале [—5, 5): 10*Random - 5.

         Пример 2                                                                                                         О

Заполнить верхнетреугольную матрицу указанного вида и вывести ее на экран. Матрица:

Структурное программирование


1 2 3 4 0 2 3 4 ю 0 3 4 0 0 0 4

Программа решения задачи:

Var М: array[1. .4, 1 . .4] integer; i, ј : integer; begin

Eor i     to 4 do for ј :=1 to 4 Do if        then  e1se М    : for i:=1 to 4 do begin for ј :=1 to 4 do

Write  : З) ;

Write1n end; end.

Поиск в массиве

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

Еще одной часто решаемой задачей является поиск в массиве наибольшего или наименьшего значения.

О Пример $

Оформить в виде процедуры подпрограмму поиска максимальв ного элемента в одномерном массиве. Заполнить одномерный массив случайными числами (как в примере 1). С помощью процедуры найти в нем максимальное значение и индекс первого вхождения этого значения в массив.

Const п = 20

       Туре: mas array[1 . . п] of integer;

Var Х: array [1 . . п] 0f integer; i, Хтах, imax: integer;

Начало описания процедуры} procedure MaxArray (Var А: mas; Var МахА, К: integer) ;

Var ј : integer; begin

Методы программирования


МахА:         К: =1; for ј      to п do if А [ ј ] >МахА then begin МахА : К:=ј end end; { Конец описания процедуры}

begin

Randomi ze ;

                Eor                to п do X[i]  ; Заполнение массива }

                  MaxArray (Х, Хтах, irnax) ;                          { Обращение к процедуре }

Write ( Хтах=' , Хтах , imax= , imax ) {Вывод результатов } end.

Процедура MaxArray имеет три параметра: А — исходный массив, МахА — переменная для найденного максимального значения, К переменная для индекса максимального значения. При обращении к процедуре им соответствуют фактические параметры: Х, Хтах, imax. Размер массива определяется глобальной константой п, значение которой используется как в основной программе, так и в процедуре.

Сортировка массива

В параграфе 1.7.7 учебника для 10 класса рассматривались два алгоритма сортировки: сортировка методом выбора максимального элемента и сортировка методом пузырька. Используем алгоритм метода пузырька для построчной сортировки матрицы.

         Пример 4                                                                                                         О

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


элементов.

Const п       4;

Туре: vector = array[1. . п]          integer; matrix = array[1. . п] ОЕ vector;

Var Matr: matrix; К, 1: integer;

{Начало процедуры сортировки} procedure SortVector (Var А: vector) ; var i, ј, Х: integer; F1ag: Ьоо1еап; begin F1ag : =true; while  and F1ag do begin F1ag : =fa1se; for ј to do iE А[ј]>А[ј+1] then begin Х:=А[ј]; А[ј] :=А[Ј+1] ; А[ј+1] .

Структурное программирование


end end; { Конец процедуры сортировки

Начало процедуры вывода матрицы) Procedure PrintMatr (Var М: matrix) ;

Var i, ј : integer; begin

Eor to п do begin for ј :=1 to п do Write (М [1] [ ј ] : З) ;

Write1n end end; { Конец процедуры вывода матрицы}

{Основная программа begin

Randomi ze ; { Заполнение матрицы} for К:=1 to п do for 1 to п do

Matr[k] [1] :=Random (10) ; { Вывод исходной матрицы)


F1ag •=true . end;


{ Вывод отсортированной матрицы}

Write1n ( ' Отсортированная матрица: ' ) ; PrintMatr (Matr) end.

Методы программирования


В этой программе имеются две процедуры: SortVector сортировка одномерного массива и PrintMatr вывод матрицы. Matr — сортируемая квадратная матрица размера п х п. Каждая строка матрицы — это одномерный массив (вектор). Сортировка строк производится поочередным обращением к процедуре SortVector с указанием в переменной К номера сортируемой строки. После заполнения матрицы случайными числами она выводится на экран. После сортировки ее вывод повторяется. Чтобы не программировать дважды вывод матрицы, создана процедура PrintMatr. В основной программе к ней дважды происходит обращение. Исполнение этой программы на компьютере дало следующие результаты:

Исходная матрица :

4 1 3 9

4 2 9 0

8 4 3 7

3 6 2 9

Отсортированная матрица :

1 3 4 9

0 2 4 9

3 4 7 8

2 3 6 9

Система основных понятий

Задачи обработки массива

Типовые задачи:

   заполнение массива путем ввода, вычисления, случайными числами;

   поиск в массиве: заданного значения, максимального или минимального значения;

   сортировка массива

Датчик случайных равномерно распределенных чисел

Целые числа: случайное число на отрезке [О, х — 1] :

Функция Random (х) , где х — целое число

Вещественные числа: случайное число в полуинтервале (О, 1]: Функция Random (без аргумента)

Вопросы и задания

1.   Какими способами можно заполнить массив значениями?

2.   Что такое датчик случайных чисел?

З. Как можно получать целые случайные числа на отрезке [—50, —1]?

4.    Как можно получать вещественные случайные числа в полуинтервале [2,5, 10)?

5.    Даны два вектора {Xi}, {Yi}, i 1 10, упорядоченные по возрастанию. Соедините их в один вектор {Zi}, i — 1— 20 так, чтобы сохранилась упорядоченность.

6.    Дан массив, состоящий из 100 целых чисел:

а) выведите все числа, которые встречаются в этом массиве по не- 2 скольку раз;

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

7.    В целочисленной матрице размером 10 х 10 найдите максимальное значение и индексы всех элементов, равных ему.

8.    Матрицу размером 5 х 10 заполните случайными двоичными цифрами (О и 1). Определите номер строки с наибольшим количеством нулей.

9.    В двоичной матрице размером 10 х 10 найдите совпадающие строки.

Структурное программирование


Практикум. Раздел «Программирование»

2.2.11. Метод последовательной детализации

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

1)    анализируется исходная задача, в ней выделяются подзадачи, строится иерархия таких подзадач (рис. 2.7);

Рис. 2.7. Иерархия подзадач

2)    составляются алгоритмы (программы), начиная с основного алгоритма (основной программы), далее — вспомогательные алгоритмы (подпрограммы) с последовательным углублением

уровня.

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

Пример 1

Вычислить площадь выпуклого заданного координатами своих вершин (рис. 2.8).

У4

хы У5

Методы программирования

Рис. 2.8. Выпуклый многоугольник

Метод решения задачи заключается в следующем: выпуклый разбивается диагональными линиями, выходящими из одной вершины, на N — 2 треугольника. Площадь многоугольника вычисляется как сумма площадей треугольников. Площади треугольников вычисляются по формуле Герона:

где р полупериметр треугольника, а, Ь, с длины сторон треугольника. Длины сторон вычисляются по формуле, следующей из теоремы Пифагора. Например, длина отрезка между точками с координатами (х1, И), (х2, У2) равна:

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

Организация данных: исходные данные — координаты вершин храниться в двух массивах: X[1..N], Y[1..N].

Рис. 2.9. Связи: структура задачи — структура программы

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

В программе об М-угольнике подпрограмму Treug01nik сделаем процедурой.

Program N ugolnik;

Const N=6;¯

Var Х, У: array[1. .N] ОЕ rea1; S , SNug01: rea1; 1 : integer;

Структурное программирование


Procedure Treug01nik (Var х 1, у 1, х2, у2, х З, УЗ, R : rea1) ; { блок процедуры не записывается } begin

{ Ввод координат вершин многоугольника

Eor to N do begin

= ) ; Read1n (X[ij ) ; Read1n (У [1] ) end;

SNug01 : ; {Переменная для вычисления площади фигуры} { Суммирование площадей треугольников } for to N—1 do begin х УД] , х [±+1], У 6+1] ,

SNug01 : =SNug01+S end;

Write1n ( Площадь фигуры — — , Snug01) end.


На втором шаге детализации запрограммируем процедуру Treug01nik. В разделе подпрограмм этой процедуры запишем лишь интерфейс подпрограммы Line, которую сделаем функцией.

procedure Treug01nik (Var х 1, у 1, х2, у2, хЗ, уз, R : rea1) ; Var L1, L2, L3, р: rea1;

Function Line (Var Ха, Уа, ХЬ, УЬ: rea1) :

(Блок функции не записывается begin

L1:= Line (х 1, у 1, х2, у2) ; {Длина 1—й стороны)

L2:— Line  ; (Длина 2—й стороны}

Line (х 1, у1, хЗ, УЗ); { Длина 3—й стороны)

                (L1+L2+L3) /2;                  { Полупериметр

R:=sqrt (р* (p—L1) * (p—L2) * (p—L3) ) (Площадь треугольника} end;

На третьем шаге детализации запрограммируем функцию Line.

Формальные координаты концов отрезка заданы параметрами: (Ха, Уа) — первая точка, (ХЬ, УЬ) — вторая точка.

Function Line (Var Ха, Уа, ХЬ, УЬ: rea1) : rea1; begin

Методы программирования


Line (sqr (Ха—ХЬ) +sqr (Уа—УЬ) ) end; в Из составленных фрагментов собираем окончательный вариант программы.

Program N_ug01nik;

Const N=6;

Var Х, У: axray[1. .N] ОЕ rea1; S , SNug01: rea1; i : integer;

Procedure Treug01nik (Var х 1, у 1, х2, у2, хЗ, УЗ, R : rea1) ; Var L1, L2, L3, р: rea1;

Function Line (Var Ха, Уа, ХЬ, УЬ: rea1) : rea1; begin

Line :=sqrt (sqr (Ха—ХЬ) +sqr (Уа—УЬ) ) end; begin

L1:= Line (х1,у1, х2,у2) ; L2:— Line (х2, у2,хЗ, УЗ) ;

L3:= Line  УЗ) ;

Р:— (L1+L2+L3) / 2;

(р* (p—L1) * (p—L2) * (p—L3) ) end;

begin for  N do begin

Write( 'X[     1• , ' ]¯' ) ; Read1n (Х 1 епа ; SNug01 :

Eor  N—1 do begin

           У             х а ] , УД] , X[i+1],

SNug01 : =SNug01+S end;

Write1n ( Площадь фигуры =       SNug01) end.

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

 

119

Структурное программирование

2.2

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

Работу полученной программы можно проверить на простом примере. Пусть N = 4. Вычислим площадь квадрата с длинами сторон, равными 2 и следующими координатами вершин:

х [31=2, х

У [11=0, У [21=2, У [31=2, У [41=0

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

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

О Система основных понятий

Метод последовательной детализации

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

Программирование «сверху вниз»: первой составляется основная программа, затем подпрограмма 1-го уровня детализации, затем — 2-го уровня и т. д. Подпрограммы последнего уровня содержат только простые команды, не вызывающие других подпрограмм

Интерфейс подпрограммы: это ее заголовок, позволяющий организовать обращение к подпрограмме (имя, тип, формальные параметры)

О Вопросы и задания

1.   В чем заключается основная идея метода последовательной детализации?

2.   Каким образом применение метода последовательной детализации позволяет организовать работу коллектива программистов над большим проектом?

 

Методы программирования


З. Что такое интерфейс подпрограммы?

Практикум. Раздел «Программирование»

2.2.12. Символьный тип данных

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

Символьная константа записывается между апострофами. Например: ' R ' ,

Символьный тип называется char. Пример описания символьных переменных: var с1, с2: char;

Символьный тип относится к порядковым типам данных. Из этого следует:

*     символы — упорядоченное множество;

*     у каждого символа в этом множестве есть свой порядковый номер;

*     между символами работает соотношение «следующий — предыдущий».

Порядковый номер символа это его десятичный код, который лежит в диапазоне от О до 255. Например, в кодовой таблице ASCII десятичный код латинской буквы «А» равен 65, а цифры «5» 53. О стандартах кодирования символов подробно рассказывалось в параграфе 1.4.2 учебника для 10 класса.

Функция 0rd (х)

0rd (х) функция от аргумента порядкового типа, которая возвращает порядковый номер значения х в этом типе данных. Если х символьная величина, то результатом функции будет десятичный код х в кодовой таблице. Например: ord('

Функция Chr (х)

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

Структурное программирование


Поскольку коды символов лежат в диапазоне от () до 255, желательно тип х определять либо как byte, либо как ограниченный тип 0. .255. В параграфе 1.4.2 учебника для 10 класса содержится программа получения таблицы кодировки символов с номерами от 20 до 255. В этой программе последовательность кодов и соответствующих им символов получается в следующем цикле:

for kod:=2() to 255 do Write (Chr (kod) : З, kod:4) ;

Напомним, что коды, меньшие 20, являются управляющими и на экране не отражаются.

Функция Chr является обратной к функции 0rd. Отсюда следует:  Например:

Принцип последовательного кодирования алфавитов

В любой кодовой таблице выполняется принцип последова- О тельного кодирования латинского (английского) алфавита и алфавита Десятичной системы счисления. Это важное обстоятельство, которое часто учитывается в программах обработки символьной информации.

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

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


Значение символьной переменной С является цифрой, если истинно логическое выражение: and  .

В латинском алфавите 26 букв. Поэтому разница между кодами букв «Z» и «А», а также «z» и «а» равна 25.

О Задача 1

С помощью датчика случайных чисел заполнить массив Sim[O..10] строчными английскими буквами. Затем массив отсортировать в алфавитном порядке.

Uses CRT;

Var Sim: array[O. . 10] 0f char; С: char; 1, К: integer; begin

C1rScr;

Randomi ze; { Заполнение массива случайными буквами} Write1n ( ' Исходный массив: ) ; for О to 10 do begin

Sim [1] :=Chr (Random (26) +0rd ( ' а' ) ) ;

Методы программирования


Write (Sim[i] ) end;

Write1n;

Сортировка методом пузырька } for i to 9 do for К to do if Sim [К] >Sim [К+1] then begin

 Sim[k] :=Sim[k+1] ; Sim[k+1] :=С end;

Write1n ( Отсортированный массив: ) ; for to 10 do Write (Sim[i] ) ; end.

При тестировании программы было получено:

исходный массив :

КЬе qgmsin Отсортированный массив : beggikmnnqs

о Задача 2

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

Идея алгоритма. Формируется массив символов английского алфавита от «а» до «z». Дадим массиву имя Alf, а элементы пронумеруем от О до 25. В другом массиве Schet[O..25] будем вести счетчики повторений каждой буквы в последовательности вводимых символов. В Schet[O] — счетчик «а», в Schet[1] счетчик «Ь» и т. д. В начале счетчики обнуляются.

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

Program Bukvy ;

Uses CRT,•

Структурное программирование

2.2

 

123

Var A1f: array [0 25 ] ОЕ char ; Schet : array [0 25 ] 0f byte; х, i, К: byte; с: char ; F1ag : Ьоо1еап; begin

C1rScr;

{ Заполнение массива A1f буквами алфавита } и массива Schet нулями} for : to 25 do begin A1f[i] :=Chr  Schet [i] : —0 end; Read1n (С) ; (Ввод первого символа } { Циклический ввод символов до точки) whi1e . do begin k:=Ord (С) —0rd ( ' а { Номер символа С}

Schet [К] :=Schet [К] +1; {+1 в счетчик данного символа }

Read1n (С) ;     (Ввод очередного символа} end;

Сортировка массива Schet методом пузырька } F1ag:=true; i:=0; whi1e (i<=24) and F1ag do begin

F1ag:=fa1se;

1 ) Задача взята из демоверсии ЕГЭ по информатике.

for К :=0 to 24—1 if Schet [К] <Schet [К+1] then

[К] ; Schet [К] :=Schet [К+1] ; Schet [К+1] :=Х;

A1f[k]

A1f [k+1]

F1ag : =true end;

end; for then Write1n (A1f[i] : 2, Schet [1] : З) end.

При тестировании программы была введена последовательность символов: asadsdghka .

В результате получено: а-З d-2 3-2

Д-1

h-1

Методы программирования


К-1

Система основных понятий

Символьный тип данных

Величины символьного типа (char): константы и переменные, принимающие значения символов компьютерного алфавита

1 символ занимает 1 байт памяти (в 8-битовых кодировках)

0rd (х) — функция от аргумента порядкового типа, которая возвращает порядковый номер значения х в этом типе данных. Если х — символьная величина, то функция возвращает код символа

Chr (х) — функция от целочисленного аргумента, результатом которой является символ с кодом, равным х

В любой кодовой таблице выполняется принцип последовательного кодирования латинского (английского) алфавита и алфавита десятичной системы счисления

О Вопросы и задания

1.   Как в программе на Паскале обозначаются символьные константы и переменные?

2.   С помощью какой стандартной функции определяется код символа?

З. С помощью какой стандартной функции можно определить символ по его коду?

4.    Что такое принцип последовательного кодирования алфавитов? Приведите примеры алгоритмов, где он может быть использован.

5.    Определите результаты вычисления выражений (типы и значения): О 1) Chr (0rd( 'B' ) ) ;

 0rd( 'Z ' ) —0rd('z');

5) Chr (0rd( 'a' ) +0rd( ' R ' ) —0rd( 'r t ) ) .

2.2.13. Строки символов

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

Строка это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от О до 255. Строковые величины могут быть константами и переменными.

Структурное программирование


Строковая константа записывается как последовательность символов, заключенная в апострофы. Например:

Язык программирования ПАСКАЛЬ

' гВМ РС - computer

' 33-45-12 '

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

Var <идентификатор>: string [ <максимальная длина строки>] Например:

Var Name: string[20j

Параметр длины может и не указываться в описании. В таком случае подразумевается, что он равен максимальной величи— 255. Например:

Var s10vo: string

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


Символы внутри строки индексируются (нумеруются), начиная с единицы. Каждый отдельный символ идентифицируется именем строки с индексом, заключенным в квадратные скобки. Например:

                 Name [5] , Name                 s10vo [К+1] .

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

Тип string и стандартный тип char совместимы: строки и символы могут употребляться в одних и тех же выражениях.

Строковые выражения строятся из строковых констант, переменных, функций и знаков операций. Над строковыми данными допустимы операции сцепления и операции отношения.

Операция сцепления (+) применяется для соединения нескольких строк в одну результирующую строку. Сцеплять можно как строковые константы, так и переменные. Например:

 

Методы программирования


          ' эвм'+'        РС '

В результате получится строка:

' ЭВМ тВМ РС '

Длина результирующей строки не должна превышать 255.

Операции отношения .  < > производят сравнение двух строк, в результате чего получается логическая величина (true или false) . Операция отношения имеет более низкий приоритет, чем операция сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки.

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

Пример

             Выражение:                Результат:

cosm1 cosm2

True

' pasca1 ' > ' PASCAL '

True

Ключ > Ключ

Т rue

'MS DOS                     DOS'

True

Функции и процедуры

Функция сору (S, Poz,N) выделяет из строки S подстроку длиной N символов, начиная с позиции Рог. N и Рог — целочисленные выражения.

Пример

Значение S:

Оператор:

Результат:

' ABCDEFG '

сору (S, 2, 3)

' BCD'

' ABCDEFG '

сору (S, 4, 4)

' DEFG '

Функция Concat (S1, S2. , SN) выполняет сцепление (конкатенацию) строк S1SN в одну строку.

Црцмеп

Выражение:                              Результат:

Concat АА ' ХХ ' У' ААХХУ '

Функция Length (S) определяет текущую длину строки S. Результат — значение целочисленного типа.

Структурное программирование

2.2

 

127

П име

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

   'test—5'      Length ( S )

       Length ( S )                 7

Функция Pos (S1, S2) обнаруживает первое появление в строке S2 подстроки S1. Результат — целое число, равное номеру позиции, где находится первый символ подстроки S1. Если в S2 не обнаружена подстрока S1, то результат равен О.

Пример

abcdef                Pos ( 'cd' ,S2)

з

abcdcdef            Pos ( 'cd' ,S2)

з

abcdef               

0

Процедура De1ete (S, Poz, N) ки S, начиная с позиции Рог.

— удаление N символов из стро-

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

Пример

Исходное значение:            Оператор:      Конечное значение:

abcdefg De1ete (S, З, 2) abefg abcdefg De1ete (Б, 2, 6)

В результате выполнения процедуры уменьшается текущая длина строки в переменной S.

Процедура Insert ($1, S2, Poz) — вставка строки S1 в строку S2, начиная с позиции Рог. Пример

Начальное S2:

Оператор:

Конечное S2:

' ЭВМ РС '

Insert ( ' твм-' , s2, 5)

' эвм гвм-рс '

Рис . 2 '

Insert ( 'N' ,S2, 6)

' Рис .N2 '

О Примеры программ обработки строк

Пример 1

Составить программу, формирующую символьную строку, состоящую из N звездочек (N — целое число, 1 N 255).

Program Stars;

Var А: string;

Методы программирования


N, 1 : byte; begin

Write ( Введите число звездочек! ) ;

ReadLn (N) ;

 do

WriteLn (А) епа .

Здесь строковой переменной А вначале присваивается значение пустой строки, обозначаемой двумя апострофами ( ' '). Затем к ней присоединяются звездочки,

О Пример 2

В символьной строке подсчитать количество цифр, предшеств вующих первому символу « ! ».

Program с;

Var S : string;

К, i : byte; begin


then К: —К+1

end;

WriteLn ( ' Количество цифр до символа ” ! ” равно К) end.

В этой программе переменная К играет роль счетчика цифр, а переменная • — роль параметра цикла. Цикл закончит выполнение при первом же выходе на символ ' ! ' или если в строке такого символа нет, то при выходе на конец строки. Символ S[I] является цифрой, если истинно отношение: 'O'<S[I]<'9'

Пример З

О

В этом примере запрограммируем одну из функций текстово-

 

го редактора: выравнивание строки по ширине. Например, дан текст, состоящий из четырех строк:

2

Буря мглою небо кроет, Вихри снежные крутя .

То как зверь она завоет, То заплачет, как дитя .

Структурное программирование


Строки выровнены по левому краю. Пусть длина строки должна быть равна L. Нужно путем равномерной вставки пробелов между словами растянуть строки таким образом, чтобы последний символ каждой строки оказался в позиции номер L. Например, если L = 3(), то текст должен приобрести такой вид:

Буря           мглою небо    кроет , Вихри           крутя . то   как      зверь она завоет , то заплачет ,       как дитя .

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

Program Editor;

Const N=4; L=30;

Var Tekst: array[1. .N] 0f string; 1: byte; procedure RovStr (Var Str: strinq) ;

Блок процедуры RovStr } begin

{ Выравнивание строк} for i:=1 to N do RovStr (Tekst [1] ) ; { Вывод после выравнивания } for to N do Write1n (Tekst епа .

Здесь константа N указывает на число строк в тексте, константа L — на длину строки. Процедура имеет один параметр строку Str. Она представляет одновременно и входные, и выходные данные. На входе — невыровненная строка, на выходе — эта же строка после выравнивания.

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

Procedure RovStr (Var Str: string) ;

Var Ј : byte;

Begin ј :=1; (Номер первого символа в строке

Методы программирования


{ Цикл, пока длина строки не станет равной L} whi1e 1ength (Str) do begin mod 1ength (Str) ;

[Обнаружение конца слова }

{и вставка дополнительного пробела}

) then begin Insert (    end; ј :=ј+1 {Номер следующего спивола } end end;

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

ј mod 1ength (Str) ; в Объединив основную программу с процедурой, получаем окончательный текст программы:

Program Editor;

Const N=4,• L=30;

Var Tekst: array[1. .N] 0f string; i: byte;

Procedure RovStr (Var Str: string) ; Var Ј : byte; beg

begin mod 1ength (Str) ; апа       then begin Insert(' • )      end;

{ Номер следующего символа } end end; begin

Write1n ( ' Введите текст ' ) ; for to N do Read1n (Tekst[i] ) ; for i to N do RovStr (Tekst [1) ) ; for i:=1 to N do Write1n (Tekst[i) ) end.

Структурное программирование


Система основных понятий

Строки символов

Строка — последовательность символов

Описание строковой переменной:

Var <идентификатор>: string [ <длина строки>ј

Максимальная длина строки — 255

Обозначение символа в строке: <идентификатор строки> [

Операции над строками: сцепление (+), отношение < , > , , , < >)

Стандартные функции:

сору ( S , Рог , N) — выделение подстроки;

Concat (S1, S2          SN) — сцепление (конкатенация) строк;

Length ( S ) — определение текущей длины строки;

Pos (S1, S2) — определение первого вхождения подстроки в строку

Стандартные процедуры:

De1ete (S, Poz , N) — удаление подстроки;

Insert (S1, S2 , Poz) — вставка подстроки

Вопросы и задания

О

1. Как в программе обозначается строковая константа; как определяется строковая переменная?


5.      В данном слове замените первый и последний символы на

6.      В заданном слове произведите обмен первого и последнего символов.

7.      К заданному слову присоедините столько символов '!', сколько в нем имеется букв (например, из строки ' УРА' надо получить ' УРА!!! ').

8.      В заданной строке вставьте пробел после каждого символа.

9.      Переверните введенную строку (например, из ' ДИСК ' должно получиться •ксид').

10.  В заданной строке удалите все пробелы.

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

Практикум. Раздел «Программирование»

2.2.14. Комбинированный тип данных

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

Комбинированный тип объявляется в программе в разделе типов:

Туре  record

Методы программирования

<имя поля 1>: <тип>;

<имя поля N>: <тип> end

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

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

Туре resu1ts = record

Fam±Ly: string [15] ; Фамилия ученика

                     Rus: 2 . . 5;                      { Оценка по русскому яэыку}

                      А1д: 2 . . 5;                        { Оценка по алгебре

Phiz: 2 . . 5          { Оценка по физике) end;

После этого в разделе переменных следует описание: Var ехат: resu1ts;

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

<переменная комбинированного типа> . <имя поля>

132

     Например: ехат. fami1y, ехат. rus

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

О

Пример 1

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

В программе используется описание комбинированного типа result1, приведенное выше. Исходные данные организуются в массив следующей структуры.

Var 1ist: array[1. .30] of resu1ts;

После ввода в этот массив исходных данных следует фрагмент программы:

for to 30 do if (1ist Д] .rus=5) and (1ist [1] .а1д=5) and (1ist[ij .phiz=5) then Write1n (1ist [i] .fami1y) ;

Структурное программирование

 

133

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

А теперь обсудим проблему: как наиболее удобным способом организовать ввод данных в этой программе? Вводить с клавиатуры неудобно из-за большого объема данных. При каждом повторном запуске программы нужно начинать ввод сначала. А при отладке это наверняка придется делать многократно. Гораздо удобнее подготовить файл с исходными данными с помощью текстового редактора. После этого без проблем можно повторять ввод многократно. Так и поступим. Подготовим текстовый файл следующего вида:

Таблица успеваемости 1 ОА класса Фамилия   Русский язьж Алгебра       Физика

Антонов

4                                                     5        5

5                                                     З        4

Боброва

                                   5                          5                  5

Таблица содержит данные с фамилиями и оценками 30 учеников класса. Обратите внимание на то, что фамилии записываются в отдельных строках. Необходимость этого связана с реализацией алгоритма (см. далее): при вводе символьной строки прочитывается полностью очередная строка текстового файла до признака EOLN. При этом фамилии должны содержать не более 15 символов, а первые оценки (по русскому языку) располагаться не раньше 16-й позиции в своей строке.

Сохраним этот файл в корневом каталоге логического диска Е: под именем 10_a.txt. Составим программу с вводом таблицы успеваемости и выводом списка отличников. Фамилии отличников выведем на экран и сохраним в файле с именем Best.txt.

Program Ехатеп ;

          Туре resu1ts     record

Fam: string [15] ; Rus: 2 . . 5;

Phiz: 2 . . 5 end;

Var 1ist : array[1. .30] of resu1ts; [Массив записей} i: integer; F1, F2: text; begin

                 Assign (F1, ' Е:               а. txt' ) ; К Связывание F1 с файлом 10 а. txt}

Assign (F2, txt' ) ; {Связывание F2 с файлом Best. txt} {Открытие файла F1 для чтения

                Rewrite (F2) ;                             {Открытие файла F2 для записи }

Методы программирования

Read1n (F1) ; Read1n (F1) ; [Пропуск 2—х строк в файле F1 [Цикл ввода из файла F1} for to 30 do

Readln (F1, 1ist [1] .Fam, 1ist [i] .Rus, 1ist [i] .А1д, 1ist Д] .Phiz) ;

(Цикл отбора отличников и вывода их фамилий } for i:=1 to 30 if (1ist [i] .rus=5) and (1ist [1] .a1g=5) and

(1ist [i] .phiz=5) then begin

                           Write1n (1ist [i] .fam) ;                { Вывод фамилии на экран

Write1n (F2, 1ist [i] .fam) {Запись фамилии в файл F2 } end ;

C10se (F1) ; Close (F2)      { Закрытие файлов) end.

О Пример. 2

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

134

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

Program Ехатеп 2 ;

Туре resu1ts = record

Fam: string [15] ; Rus : 2 . .5; А1д : 2 . . 5;

Phiz : 2 . . 5 end;

Var 1ist: resu1ts;    { Одна переменная комбинированного типа integer;

F1, F2: text; begin

Е :\1() a. txt t ) ;

Assign (F2, ' Е: \Best. txt' ) ; Reset (F1) ; Rewrite (F2) ;

Read1n (F1) ; Read1n (F1) ;

{ Инициализация счетчиков }

Структурное программирование

 

135

{ Цикл до конца чтения файла) whi1e пое EOF (F1) do begin

Read1n (F1, 1ist.Fam, 1ist.Rus, 1ist.A1g, list . Phiz) ; { Подсчет числа учеников } if (1ist. rus=5) and (1ist.alg=5) and (1ist.phiz=5) then begin

Write1n (1ist . fam) ;

Write1n (F2, 1ist. fam) ;

{ Подсчет числа отличников end end;

Write1n ( ' Из , учеников в классе отличников, что составляет

Close(F1) ; C10se (F2) { Закрытие файлов } end.

В этой программе переменная I используется как счетчик числа учеников, а переменная К — как счетчик числа отличников.

Стандартная логическая функция EOF (end of file) примет значение true, когда процесс чтения из файла дойдет до его конца.

В результате выполнения программы кроме списка отличников на экран выведется строка:

Из 30 учеников в классе 1() отличников, что составляет 33, .

О Система основных понятий

Комбинированный тип данных

Комбинированный тип данных структурный тип, объединяющий разнотипные компоненты (поля) данных

Тип поля: любой простой или структурированный тип (кроме файлового)

Запись — величина комбинированного типа

Идентификация поля записи — составное имя: <имя записи> . <имя поля>

О Вопросы и задания


1.   Чем комбинированный тип данных отличается от регулярного типа данных (массива)?

2.   Что такое запись?

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

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

Методы программирования

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

определение среднего роста и среднего веса всех учеников;

• вывод на экран и в файл rost.txt списка (фамилии, имена, возраст) учеников, рост которых выше среднего; вывод на экран и в файл ves.txt списка учеников, вес которых ниже среднего.

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

Практикум. Раздел «Программирование»

136

2.3. Рекурсивные методы

программирования

2.3.1.Рекурсивные подпрограммы

Частично рекурсивная функция

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

1           11        1 ао=1, —       а2 ¯

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

при i = О; при i>O.

 

137

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

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

Будем рассматривать ап в качестве значений функции F(n) от целого аргумента п. Определение этой функции будет выглядеть так:

                                                    1,             при п = О;

F(n—1)/n, при п

Определение функции через саму себя (здесь F(n) определяется через F(n — 1)) называется в математике рекурсивным определением. Для того чтобы рекурсивно-определенная функция была вычислимой, она должна иметь некоторое известное начальное (частное) значение. В нашем примере это F(O) 1. Вычисление на компьютере таких функций можно производить с помощью рекурсивных алгоритмов, которые на языках программирования реализуются через рекурсивные подпрограммы.

Рекурсивные подпрограммы-функции и процедуры

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

Пример 1

Вот два варианта подпрограммы-функции вычисления F(n)

Нерекурсивная функция

Рекурсивная функция

Function FN (п: integer) : rea1; Var 1: integer; F: rea1; begin

 to п do F:=F/i;

end;

Function FN (п: integer) : rea1; begin if         then FN:=1 e1se FN:=FN (п— 1) / п end;

Первый, нерекурсивный вариант подпрограммы имеет циклическую структуру. Во втором, рекурсивном варианте используется ветвление. На положительной ветви (then) значение функции вычисляется явно (FN : =1), на отрицательной ветви (e1se) происходит обращение функции к себе самой с уменьшенным на единицу значением аргумента.

138

Методы программирования

Пусть в основной программе для вычисления 1/3! имеется следующий оператор присваивания: P:=FN (3) . При его выполнении произойдет цепочка обращений к рекурсивной функции FN с последующим возвратом:

            Вход в рекурсию —5 FN FN (2)        FN (1)      FN (0)

               Результат 0,1666.. е FN е FN(2) =1/2 4— ЕЛ                    е возврат

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

Вычисление частично-рекурсивной функции может быть реализовано также и в форме рекурсивно определенной процедуры. Ниже показан пример программы, в которой описана рекурсивная процедура вычисления 1/n!. С помощью этой процедуры вычисляется значение 1/5!.


Var Х: rea1;

Procedure FN (п: integer; var Е: rea1) ; begin п=0 then F:=1 e1se begin FN (n—1,F); F:=F/n end end; begin

FN (5, Х); Write (Х) end.

В результате выполнения программы получено число:

0. 008333333333.

Пример 2

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

нод(М,

при N#O.

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


Но это частично-рекурсивное определение функции НОД от двух аргументов! Рекурсивная подпрограмма-функция получается путем непосредственной реализации этого определения в форме оператора ветвления. В следующей программе описана рекурсивная функция и обращение к ней.

Function NOD (М, N: integer) : integer; begin if N=O then NOD:

e1se (N, М mod N) end; begin

Write1n (NOD (12, 32) ) end.

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

Пример 3

С XIII века в математике известна замечательная числовая последовательность, названная именем своего автора: числа Фибоначчи. У этой последовательности имеется множество приложений, с одним из которых вы познакомились в 10 классе: это основание Фибоначчиевой системы счисления. Первые два значения числового ряда Фибоначчи равны единице. Каждое следующее значение равно сумме двух предыдущих. Если функцию вычисления п-го элемента ряда обозначить как Fib(n), то ее математическое определение запишется так:

                                                     1, при          и п=2;

Fib(n—1)+Fib(n—2), при п > 2.

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

Program Fibonachi; в Var i: integer;

Методы программирования


Function Fib (п: integer) : integer; begin if (п=1) or (п=2) then Fib e1se (п—1) +Fib (п—2 ) end ; begin forto 10 do

end.

В результате выполнения программы получим числовую последовательность первых десяти чисел Фибоначчи:

1 1 2 з 5 8 13 21 34 55

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

Пример 4

Снова вернемся к задаче из параграфа 2.2.7 вычислению суммы числового ряда вида:

В примере 1 мы получили частично-рекурсивную функцию для вычисления слагаемых этой суммы. Оказывается, что и саму сумму можно вычислить как частично-рекурсивную функцию. Если для слагаемых использовать обозначения: ао 1, ап=1/п! для а сумму обозначить как функцию S(n), то будет справедливым следующее определение этой функции:

при п

Ниже приведены два варианта решения этой задачи. Первый циклическая программа из параграфа 2.2.7. Во втором варианте используется рекурсивная подпрограмма-функция SUM для вычисления S(n). В ней, в свою очередь, использована рекурсивная функция FN для вычисления ап, составленная в примере 1.

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

2.3

Нерекурсивная программа

Программа с рекурсивными функциями

Program Summa

Var Е, а: rea1; N, i: begin

Write ( 'N——

whi1e i<=N begin

i:=i+1; a:=a/i end;

Write1n Е end.

1; integer;

Read1n (N) ; а:-1; do

Е)

Program Summa 4;

Var М: integer;

Function SUM (К: integer) : Function FN (п: integer) : begin if then FN e1se      (п-1) [п end; begin if К=() then SUM:

else (К-1) +FN (К) ; end;

{ Основная программа} begin

Write ( 'М=') ; Read1n (М) ;

Write1n( 'Е=' , end .


2

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

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

О Система основных понятий

Рекурсивные подпрограммы

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

Рекуррентная формула: формула для вычисления элементов рекуррентной последовательности

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

О Вопросы и задания

Методы программирования


О 1. Можно ли арифметическую и геометрическую прогрессии назвать рекуррентными последовательностями? Есла да, то напишите для них рекуррентные формулы.

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

З. Напишите два варианта подпрограммы-функции вычисления п-го элемента арифметической прогрессии: нерекурсивный и рекурсивный.

4. Опишите рекурсивную подпрограмму-функцию pow (х, п) от вещественного х (х О) и целого п, которая вычисляет величину .хп согласно формуле:

при п

при п < О;

п 1

при п

2.3.2. Задача о Ханойской башне

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

Рис. 2.10. Исходное состояние задачи

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

   перекладывать можно только по одному диску, взятому сверху пирамиды;

   класть диск можно только либо на основание площадки, либо на диск большего размера;

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

2.3

  


в качестве дополнительной можно использовать площадку С.

Название «Ханойская башня» связано с легендой, согласно которой в давние времена монахи одного ханойского храма взялись переместить по этим правилам башню, состоящую из 64 дисков. С завершением их работы должен был наступить конец света.

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

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

Уже 7 ходов.

Подсчитать количество ходов (N) для К дисков можно по следующей рекуррентной формуле:

Например, N(10) = 1023, N(20) = 104 857. А вот сколько перемещений нужно сделать ханойским монахам: N(64) 18 446 744 073 709 551 615.

Попробуйте оценить, сколько лет на это потребуется.

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

1. Если п == О, то ничего не делать.

2. Если п > 0, то:

 переместить п — 1 дисков на С через В;  переместить диск с А на В (А В);  переместить п — 1 дисков с С на В через А.

При выполнении пункта 2 последовательно будем иметь три состояния (рис. 2.11).

1 -е состояние:

2-е состояние:

3-е состояние:

Методы программирования


Рис. 2.11. Процесс перемещения башни

Описание алгоритма имеет явно рекурсивный характер. Перемещение п дисков описывается через перемещение п — 1 дисков. А где же выход из этой последовательности рекурсивных ссылок? Он в пункте 1, как бы ни показалось странным его тривиальное содержание.

А теперь составим программу на Паскале. В ней имеется рекурсивная процедура Напоу, выполнение которой заканчивается только при п 0. При обращении к процедуре используются фактические имена площадок, заданные их номерами: 1, 2, 3. Поэтому на выходе цепочка перемещений будет описываться в таком виде:

Program Monahi ;

Var N: byte;

Procedure Hanoi (Н: byte; С: char) ; begin if N>O then begin Напо± (N—1, А, С, В) ;

Writ-eLn (А, напо± (N-1, С, В, А) end


begin

WriteLn ( Укажите число дисков .

ReadLn (N) ;

Hanoi (N, end.

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

2.3.3. Алгоритм быстрой сортировки

Об алгоритмах сортировки рассказывалось в параграфе 1.7.7 учебника для 10 класса. Там описаны два алгоритма сортировки: методом поиска максимального элемента и методом пузырька. Сейчас мы рассмотрим оптимальный по времени работы алгоритм, который называется алгоритмом быстрой сортировки. Этот алгоритм был разработан Энтони Хоаром в 1960 году. Покажем, как он реализуется через рекурсивную процедуру.

В алгоритме быстрой сортировки используются три идеи:

 

145

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

1)   


разделение сортируемого массива на две части: левую и правую;

2)    взаимное упорядочение двух частей (подмассивов) так, чтобы все значения элементов левой части не превосходили значений элементов правой части;

З) рекурсия, при которой подмассив упорядочивается точно таким же способом, как и весь массив.

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

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

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

Program Sortirovka;

Const N = 20;

Var А: array[1. .N] of rea1; i: integer;

Procedure Qsort (Ь, R : integer) ; Var i, ј : integer; bar, w: rea1; begin bar:=A[ (L+R) div 2] ; {Установка барьера} repeat

 

Методы программирования

{Поиск элемента слева для обмена) whi1e A[i] <bar do {Поиск элемента справа для обмена) whi1e ] >bar do

{ Обмен элементов и смещение по массиву} if i<=j then begin

 А[ј] :=w;

end ; unti1 i>j;

{ сформированы взаимно упорядоченные подмассивы} сортировка левого подмассива} if L<j then Qsort (L,j) ; { Сортировка правого подмассива} if i<R then Qsort (I,R) ; end; {Qsort}

{Основная программа} begin

Randomi ze ; for to N do А [1] :  (Заполнение массива) случайными числами) Qsort (1,N) ; Обращение к процедуре сортировки for to N do Write (A[i] : 5:1) [Вывод отсортированного)

end.

Константа N и массив А описаны в программе глобально. Процедура Qsort (L, R) сортирует по возрастанию значений элементы массива А. Параметр L процедуры обозначает нижнее значение индекса сортируемого массива (крайний левый индекс), параметр R — верхнее значение индекса (крайний правый индекс). Барьерное значение bar вычисляется как значение элемента, имеющего индекс, равный целой части среднего арифметического между L

Система основных понятий

Примеры рекурсивного программирования

Задача о Ханойской башне

Быстрая сортировка (Э. Хоар)

Вопросы и задания

1.   Сформулируйте идею рекурсивного алгоритма решения задачи о Ханойской башне.

Объектно-ориентированное программирование

2.  


Реализуйте на компьютере программу решения задачи о Ханойской башне.

З. Сформулируйте идею алгоритма быстрой сортировки.

4. Реализуйте на компьютере программу сортировки массива с использованием процедуры быстрой сортировки.

Практикум. Раздел «Программирование»

2.4. Объектно-ориентированное программирование

2.4.1 . Базовые понятия объектно-ориентированного программирования

В этом разделе вы познакомитесь с основами объектно-ориентированной парадигмы программирования (ООП). Как уже рассказывалось в параграфе 2.2.1, язык Паскаль первоначально предназначался только для процедурного программирования с опорой на структурную методику. Затем в поздних версиях языка Турбо Паскаль появились элементы объектно-ориентированного программирования. Этот процесс привел к созданию объектно-ориентированной версии Паскаля, которая получила название 0bject Pascal. Результатом объединения языка программирования 0bject Pascal с визуальной технологией программирования и библиотекой визуальных компонентов стала система программирования Delphi. Далее будет рассмотрена объектная модель, положенная в основу Delphi.

Классы, объекты, инкапсуляция

Центральными понятиями объектно-ориентированного программирования являются «класс» и «объект». Класс это тип данных, описываемый программистом; это категория объектов, обладающих одинаковым набором свойств и методов воздействия на объекты. Объект это экземпляр определенного класса с конкретными значениями свойств.

Класс в 0bject Pascal является структурированным типом данных, элементы которого поля и методы. Формат описания типа «класс» следующий:

Туре <имя класса> = class [ (<имя класса родителя>) ] <описания полей>

Методы программирования


<0бъявление методов и описания свойств> end ;

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

Рассмотрим пример программы вычисления длины отрезка прямой на языке 0bject Pascal, в которой используется тип данных «класс».

Program Geometry;

Описание класса TLine————— Туре Т Ипе = c1ass

 FY1, FX2, FY2: rea1; / / поля — координаты концов линии Function Length: rea1 ; / / Метод — функция вычисления длины Procedure Input ; / / Метод — процедура ввода координат end;

———————Описание объекта типа TLine——————

Function Line . Length: rea1; begin

Line . Length : =sqrt (sqr (FX1-FX2) +sqr (FY1-FY2) ) end;

Procedure Line . Input; begin

Read1n (FX1) ;

Read1n (FY1) ;

Read1n (FX2) ;

Read1n (FY2 ) end ;

{——————Основная программа-1 begin

Line : =TLine . Create; / / Создание объекта

/ / в динамической памяти

        Line . Input;                     / / Ввод данных

/ / Вычисление и вывод длины отрезка

Write1n ( Длина отрезка=' , Line . Length)

Line . Destroy / / удаление объекта из динамической памяти епа .

Объектно-ориентированное программирование


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

Конструктор (Create) — это стандартная функция, предназначенная для выделения в динамической памяти компьютера места под данные объекта. Деструктор (Destroy) — стандартная процедура, освобождающая динамическую память от объекта.

Обращение к полям и методам объекта данного класса производится с помощью составного имени, как это делается в записях:

<имя объекта> . <имя поля>, <имя объекта> . <имя метода>

Наследование и полиморфизм

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


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

Класс Tkvadrat будет объявлен как потомок класса TFourAng1. Имя родительского класса указывается в объявлении класса-потомка в круглых скобках после слова c1ass. Класс-потомок наследует у класса-родителя все его элементы, т. е. поля и методы, поэтому в объявлении класса-потомка их повторять не следует. Хотя в классе TFourAng1 существует метод вычисления площади произвольного выпуклого четырехугольника — функция Square, однако в классе Tkvadrat объявлена функция с тем же именем Square с той целью, чтобы для квадрата можно было применять более простой способ вычисления площади (как квадрат длины стороны), что повысит точность вычислений и сократит машинное время.

Рассмотрим полный текст программы.

Program Geometry;

Туре Tkoord = record

Х, У: rea1 end; / / Тип координат вершин

— Объявление базового класса (родителя)

Туре TFourAng1 = c1ass

Методы программирования

Р: array [0 . . З] ОЕ Tkoord; / / Координаты 4 вершин array[0. .5] 0f rea1; / / Длины сторон и диагоналей Procedure Init; / / Метод: ввод координат

                 Procedure                        / / Метод: вычисление длин отрезков

Function Square: rea1; / [Метод: вычисление площади end;

— Объявление порожденного класса (потомка)

Туре Tkvadrat = c1ass (TFourAng1)

Function Square: rea1; / [Метод: вычисление площади квадрата End;

{ ————Описание объектов Четырехугольник и Квадрат

Var FourAng1: TFourAng1; kvadrat: Tkvadrat;

Описание процедур реализации методов

Procedure TFourAngl . Init; Var i: integer; begin for to З do begin

Write ( А ВводRead1n (P[i] . Х) ;

Write ( А ВВОДRead1n (P[i] . У) end end;

150

Procedure TFourAng1. Line ; Var 1 : integer; begin for to З do

          L[ij                                          (1+1) mod 4] . Х) +

(i+1) mod 4] .У) ) ;

     L[4]                (sqr (Р [0] .Х—Р[2] . Х) + sqr(P[0] .У—Р[2] . У) ) ;

L[5] (sqr (Р[1] .Х-Р[З] . Х) + sqr (Р[1] .У-Р[З] . У) ) end;

Function TFourAng1. Square: rea1;

Var рр1, рр2: rea1; begin

Line;

Square :=sqrt (рр1* (pp1—L [0] ) * (pp1—L [1] ) * (pp1—L [4] ) ) + sqrt (рр2* (pp2—L [2] ) * (pp2—L [З] ) * (pp2—L [4] ) ) end;

Function Tkvadrat . Square: rea1; begin

Line;

Square :=sqr (FourAng1 .L [0] ) end ;

Объектно-ориентированное программирование


{—————————Основная программа———————— begin

FourAng1 : =TFourAng1. Create; / [создание объекта FourAng1 kvadrat : =Tkvadrat . Create ; / [Создание объекта kvadrat FourAnq1. Init ; / / Ввод координат вершин

FourAng1. Line; / / Вычисление длин сторон и диагоналей with FourAng1 do begin

{ ————Распознавание квадрата и вычисление площади—— if  and (L[1]=L[2] ) and [5] ) then Write1n ( ' Это квадрат, площадь kvadrat . Square) e1se Write1n ( Это не квадрат, площадь = Square) end end.

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

Класс-потомок наследует от своего родительского класса все поля и методы. При этом если родительский класс также унаследовал от своих предков некоторые элементы, то они передаются по наследству его потомку. Технология ООП позволяет выстраивать ветвящиеся иерархии наследования, т. е. один потомок может иметь несколько родителей. В нашем примере используется простое наследование: один родитель один потомок, что соответствует ограничению, действующему в 0bject Pascal.

о Третий базовый принцип ООП называется полиморфизмом (многообразие). Элементы классов с одинаковым интерфейсом могут иметь разную реализацию. В рассмотренной программе полиморфизм проявляется в том, что функция с одним и тем же именем Square определена дважды, по-разному: сначала в родительском классе TFourAng1, а затем она переопределена в классе-потомке Tkvadrat. В результате площадь произвольного четырехугольника и площадь квадрата будут вычисляться по разным алгоритмам.

Методы программирования


О Система основных понятий

Базовые понятия ООП

Класс

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

Объект

Экземпляр определенного класса с конкретными значениями свойств (величина типа «класс»)

Инкапсуляция

Первый базовый принцип ООП: объединение в единую структуру (класс) данных — полей и действий над этими данными — методов

Наследование

Второй базовый принцип ООП: класс-потомок получает от своего родительского класса все поля и методы

Полиморфизм

Третий базовый принцип ООП: возможность переопределения метода с одним интерфейсом в разных классах

О Вопросы и задания

1.   Что такое класс и что такое объект в 0bject Pascal?

2.   Дайте определения понятий: инкапсуляция, наследование, полиморфизм.

З. Реализуйте на компьютере (в системе программирования на 0bject Pascal) программу Geometry.

в 4. Добавьте в описание класса TFourAng1 поля для значений углов четырехугольника и метод для вычисления угла. В основной части программы реализуйте вычисление всех углов.

Практикум. Раздел «Программирование»


2.4.2. Система программирования Delphi

Delphi — система программирования, предназначенная для создания объектно-ориентированных приложений Windows путем использования визуальной технологии программирования. Визуальная среда Delphi относится к средам категории RAD (Rapid Application Development среда быстрой разработки приложений). Договоримся также термином Delphi называть и язык программирования, являющийся современным диалектом Паскаля, который также называют Delphi Pascal.

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

Объектно-ориентированное программирование


Процесс разработки программы в Delphi может быть предельно упрощен. В первую очередь это относится к созданию интерфейса, на который обычно уходит порядка 8()% времени разработки программы. Программисту необходимо просто поместить нужные компоненты на поверхность окна (в Delphi оно называется формой) и настроить их свойства, используя специальный инструмент (0bject Inspector). С его помощью можно связать события компонентов (нажатие кнопки, выбор мышью элемента в списке и т. д.) с процедурами их обработки, которые должен составить сам программист, — и простое приложение готово. При этом программист имеет в своем распоряжении необходимые средства отладки, удобную контекстную справочную систему, средства коллективной работы над проектом и пр.

Среда системы программирования Delphi

Среда системы программирования Delphi показана на рис. 2.12. Она состоит из следующих элементов.

Строка заголовка (вверху окна).

Строка главного меню и командные кнопки (под строкой заголовка).

Окно конструктора форм. Располагается в центре экрана на вкладке Design (см. рис. 2.12). Форма используется для конструирования интерфейса проектируемого приложения путем размещения на ней элементов управления (элементов интерфейса).

Окно программного кода. Располагается в центре экрана на вкладке Code. В начале создания программы в окне программного кода помещается стандартный шаблон (рис. 2.13). Далее в процессе программирования он будет заполняться текстом про-


Окно элементов управления (элементов интерфейса). Располагается справа, озаглавлено Tool Palette. Содержит пиктограммы элементов управления, которые разделены на группы. Стандартная группа пиктограмм озаглавлена Standard, дополнительная группа — Additional, и т. д. Элементы управления с помощью мыши перемещаются на форму проектируемого приложения.

Окно инспектора объектов. Располагается в левой нижней части экрана под заголовком 0bject Inspector. Вверху окна находится выпадающий список с названиями объектов (на рис. 2.12 имеется единственный объект с названием Form 6). Под ним на вкладке Properties (Свойства) содержится список полей — свойств объекта с их названиями и значениями, принятыми по умолчанию, которые могут быть изменены вручную или программным путем. На вкладке Events (События) содержится список событий, относящихся к выбранному объекту. Каждое событие имеет имя и указание на метод программу обработки события, выполняемую при наступлении этого события.

Методы программирования


Окно менеджера проектов. Располагается в верхнем правом углу экрана под заголовком Project Manager. Отображает файловое дерево компонентов, составляющих текущий проект (см. далее). Позволяет щелчком мышью переходить от одного компонента к другому.

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

Проект. Форма

Проектом (Project) на Delphi называется весь комплекс модулей и ресурсов, из которого создается исполняемая программа. Проект включает программные модули, описания экранных форм, графических ресурсов, общих параметров создания программы

форма базовый графический объект Delphi для создания рабочих окон. Форма имеет все признаки окна традиционных приложений: значок, заголовок, кнопки «Свернуть», «Развернуть», «Закрыть», размерную рамку и управляется мышью (см. рис. 2.12). В программе, предусматривающей интерактивное взаимодействие с пользователем, назначается главная форма, описывающая основное окно программы.

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

    добавить компоненты на форму;

    модифицировать форму и ее компоненты;

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

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

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

Элементы управления. Свойства

Объектно-ориентированное программирование


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

Примеры элементов управления и их свойств:

TLabel метка. Служит для отображения текста на экране. В числе свойств: надпись (Caption), имя (Name), параметры шрифта (Font), цвет (Color), размер на экране, координаты размещения на экране и др.

TEdit экранное поле редактирования. Служит для ввода данных пользователем в процессе выполнения программы. Основные свойства: имя (Name), текст в поле ввода/редактирования (Text), шрифт (Font), размеры и др.

ок

 

TButton  командная кнопка. Позволяет выполнять какие-либо действия при нажатии кнопки во время выполнения программы. Основные свойства: надпись (Caption), имя (Name), размеры и положение на экране.

Элементы управления. События

Событие — изменение некоторого состояния объекта в результате действия пользователя или программного воздействия на объект. Для каждого класса объектов имеется свой набор событий, отображенный на вкладке Events окна 0bject Inspector.

Примерами событий, вызываемых действиями пользователя, являются:

0nClick — щелчок указателем мыши на объекте;

OnDblClick двойной щелчок указателем мыши на объекте; 0nMouseMove — движение указателя мыши над объектом; 0nChange — изменение содержания (например, текста в окне редактирования).

Методы — процедуры обработки событий

Реакцией Delphi на событие является вызов процедуры — обработчика события. Такую процедуру составляет сам программист. Выбрав событие на вкладке Events, следует произвести двойной щелчок на поле, напротив имени события. В окне программного кода появится заготовка процедуры, в которую нужно вписать программный код реакции на это событие.

Программы, создаваемые в системе Delphi, называются событийно-управляемыми. Это значит, что выполнение различных задач, решаемых программой, инициируется определенными событиями.

Методы программирования


Система основных понятий

Система программирования Delphi

Delphi

Система программирования для создания объектно-ориентированных приложений Windows. Используется визуальная технология разработки интерфейса

Форма

Базовый графический объект Delphi, на основе которого создается программный проект (Project)

Элементы управления

Классы объектов графического интерфейса проекта, вкладываемых в форму (метки, кнопки, окна редактирования и пр.). Обладают набором свойств (Prope.rties) и событий (Euents)

Методы

Процедуры обработки событий (составляются программистом)

Событийноуправляемое программирование

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

О Вопросы и задания

1.   Для чего предназначена система Delphi?

2.   Назовите основные компоненты среды программирования Delphi.


З. Что такое форма?

4.    Что такое элементы управления? Чем они характеризуются?

5.    Что такое методы?

6.    Почему программирование на Delphi называется событийно-управляемым программированием?

2.4.3. Этапы программирования на Delphi

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

Создание консольного приложения

Объектно-ориентированное программирование


Приведем в качестве первого примера для программирования задачу перевода целого недесятичного числа в десятичную систему счисления. В параграфе 1.3.3 учебника для 10 класса приведена такая программа на Паскале. Практически в том же виде ее можно перенести в среду Delphi в режим создания консольного приложения. Делается это следующим образом: после запуска системы Delphi через главное меню отдать команду на создание нового проекта: File New. Затем в открывшемся окне выбрать тип приложения Console Application. В открывшемся окне редактора программного кода с готовым шаблоном ввести текст программы. Программа будет выглядеть следующим образом:

Program Proj ect1;

{ $АРРТУРЕ CONSOLE } / / директива компилятору о типе приложения

Uses SysUti1s; / / подключение системной библиотеки Var N10, Np, К: 10ngint;

begin

Write ( ' ) ; Readln (р) ; / / Ввод основания системы счисления Write( 'N' , р

     Read1n (Np) ;             / / Ввод исходного р—ичного числа

К:=1; whi1e (Np<>0) do / / Цикл выполняется, пока Np не равно нулю Begin

N10 (Np mod 10) * К; / / Суммирование развернутой формы К:=К*р; / / Вычисление базиса: р, р в степени 2,

/ / р в степени З,

Np : div 10 / / Отбрасывание младшей цифры end;

N10) ; / / Вывод десятичного числа

Read1n / / задержка окна результата на экране end.

Выполнение программы инициируется через главное меню по команде Run Run.

Создание оконного приложения

Теперь решение задачи о переводе чисел реализуем с помощью оконного проекта с графическим интерфейсом. Для этого после команды File New выберем тип приложения VCL Forms Application.

1. Проектирование и конструирование интерфейса. С самого

2

 

Методы программирования


начала работы надо представить себе конечный результат: в какой форме мы хотим увидеть на экране результат выполнения программы. Такое представление для задачи о числах показано на рис. 2.14.

Системы счисления

Рис. 2.14. Интерфейс задачи о числах

Используя конструктор формы и панель элементов управления, наносим на шаблон формы нужные элементы интерфейса, как это показано на рис. 2.15. Здесь присутствуют пять элементов типа метка (Label), два окна редактирования (Edit) и одна командная кнопка (Button). В окна редактирования будут вводиться исходные данные: основание системы счисления и число в этой системе. Результат будет выводиться в поле Label5.

Затем для объекта формы изменяется надпись (свойство Caption) на «Системы счисления». Для меток с 1-й по 4-ю назначаются требуемые надписи. На метке Label5 надпись убирается. Для командной кнопки назначается надпись «Выполнить перевод». Окончательный вид макета интерфейса показан на рис. 2.16.

Х

 

 

 

, , Form6

 

 

 

Объектно-ориентированное программирование

 


рис. 2.15. Структура интерфейса

2 до 9) •

Рис. 2.16. Макет интерфейса программы

2. Реализация обработки событий. Выполнение перевода числа в десятичную систему счисления должно происходить по щелчку на кнопке «Выполнить перевод». Инициируем вызов процедуры обработки события 0nClick для объекта Button1. В окне редактора программного кода появляется шаблон для процедуры с заголовком:

Procedure TForm6.Button1C1ick (Sender: TObject) ;

Здесь в скобках указывается класс тоьј ect базовый класс Delphi, потомками которого являются все другие классы. В тело


3T0ii npoueaypbl B11HCb1BaeM nporpaMMY nepeB0Aa HeaecHTWIHoro tiHCJ1a B  cncrreMY CHHCJ1eHHfl. B wrore BeCb nporpaMMHblü MOAYJ1b (Unit), CBH3aHHb1Ü C C03AaHHOÜ (bopwroii, 6ynerr qrvrerrb

c.neAY}01.11Hiå BHA:

Unit Unit 6; Interface

Uses Windows, Messages, SysUtiIs, Variants, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrIs;

                     TForm6  class (TForm)

Labell : TLabe1; Label 2 : TLabe1; Edit I : TEdit;

Label 3 : TLabe1 ; Edit 2 : TEdit;

Labe14 : T Label ;

Label 5 : TLabe1;

Button 1: TButton;

Procedure Button I Click (Sender: TObject) ; private

{Private declarations} public

MeTOAbl nporpaMML,1poBaHL49


{Public declarations} end;

Var Form6 : TForm6 ; implementation {$R * .dfm}

—Tlpouemypa 06paö0TRV1 COÖb1TMA————— Procedure T Form6. Button1CIick (Sender: TObject) ;

Var NIO, Np, k: longint; p: 2. .9; begin p:=StrToInt (Edit I. Text) ; / / BBOÄ 0KHa Edit 1 Np:=StrToInt (Edit 2 . Text) ; / /BBOÄ 143 OKHa Edit 2

while (Np<>O) do begin mod 10) k:=k*p•

NP :    div 10 end;

Label 5 . Caption  (N 10) // BblEOÄ B none MeTK1.•1 Label 5 end / / KOHeL.-t npouemypbl 06pa60TK1,1 C06b1TMA end.

Bblr10JIHeHne nporpaMMb1 MHMAMHpyerrcfl qepe3 rnaBHoe Memo no

I-COMEU•uxe Run + Run. Ha 3KpaHe 110HBJ1fleTCH OKHO nwrepcbeüca

программы. В окна редактирования вводятся исходные данные: основание системы счисления и переводимое число. Затем производится щелчок на командной кнопке, и в поле метки Label5 получаем результат (см. рис. 2.14).

Ввод и вывод данных. Ввод исходных данных производится с помощью поля Text элемента интерфейса Edit. При вводе с клавиатуры числа в окно редактирования оно воспринимается как символьная строка. Если вводится целое число, то строка затем преобразуется в величину целого типа с помощью функции StrToInt (строка). Если нужно ввести вещественное число, то используется функция StrToF10at (строка) .

Вывод результата выполнен путем присваивания свойству Caption метки Label5 строки со значением итогового числа. Перевод целого числа в строку символов происходит с помощью функции IntToStr (целое число). Если требуется вывести вещественное число, то используется функция F10atToStr (вещественное число) .

Объектно-ориентированное программирование


Если требуется вводить одно из конечного множества значений, то удобно использовать другие элементы интерфейса: списки (ListBox), поля со списком (СотЬоВох), счетчики (UpDown), ползунки (TracBar), переключатели (RadioButton). На рисунке 2.17 продемонстрировано использование поля со списком в программе «Системы счисления» для ввода основания системы. При нажатии кнопки справа выпадает список значений для выбора одного из них. Значение выбирается щелчком мышью.

 

С Сю: счисления

перевод •юдм»тюпюго •«па в десятичную «ж-гему ОК.ле•—

выбрать

Роупьтат пе—ода в                146

Рис. 2.17. Использование для ввода поля со списком

Значения, включаемые в список, вводятся во время программирования с использованием свойства СотЬоВох1. Items. Элементы поля со списком проиндексированы — получают порядковые номера, начиная с нуля. Каждый элемент идентифицируется индексированным именем элемента: СотЬовох1. Items [индекс] .

После выбора элемента из списка его индекс присваивается полю сопЬоВох1. ItemIndex. В программе перевода чисел ввод значения переменной р реализуется следующим оператором:

р (СотЬоВох1 . Items [СотЬоВох1. ItemIndex] ) ;

Поле со списком является способом организации интерфейса для представления одномерного массива.

Методы программирования


о Система основных понятий

Этапы программирования на Delphi

Консольное приложение:

приложение Delphi без графического интерфейса

Оконное приложение:

приложение Delphi с графическим интерфейсом

Проектирование интерфейса:

разработка эскиза графического интерфейса

Конструирование интерфейса:

создание формы и наполнение ее элементами управления

Реализация обработки событий:

программирование процедур методов обработки событий

О Вопросы и задания

1.   В чем различие консольного приложения и оконного приложения?

2.   В какой последовательности создается оконное приложение на Delphi?

З. Какие функции используются для ввода и вывода данных в оконном приложении ?

в 4. Реализуйте на компьютере приведенную в параграфе программу перевода недесятичного числа в десятичную систему счисления.

Практикум. Раздел «Программирование»

2.4.4. Программирование метода статистических испытаний

Метод статистических испытаний (метод Монте-Карло) — численный метод, использующий моделирование случайных величин и получение статистических оценок искомых величин. Одно из применений этого метода — вычисление площадей фигур и объемов


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

Объектно-ориентированное программирование

 

165

Идея метода состоит в следующем. Около единичной окружности описывается квадрат, длина стороны которого равна 2 (рис. 2.18). С помощью датчика случайных чисел с равномерным законом распределения вероятности производится «стрельба» по квадрату, т. е. случайный выбор точек внутри квадрата. Каэкдый такой выбор будем называть испытанием. Испытание заключается в том, что вычисляются координаты точки (х, у) с помощью функции Random в пределах значений от —1 до 1. Затем определяется, лежит ли эта точка внутри круга. Условие выполняется, если х2 + у2 1. Если точка попадает в круг, то в счетчик попаданий добавляется единица.

Рис. 2.18. Погружение в квадрат

Пусть Р общее число испытаний. Из них произошло М попаданий в круг. Площадь квадрата равна 4. При условии равномерного покрытия испытательными точками площади квадрата, для площади круга справедлива формула:

SkP 4 • lim —

Смысл формулы состоит в том, что с увеличением количества испытаний отношение М[Р все больше приближается к отношению площадей круга и квадрата и в пределе при Р, стремящемся к бесконечности, становится ему равно. Поскольку площадь круга радиуса 1 равна л, при достаточно большом значении Р будет выполняться приближенное равенство:

1tz4•—.

Чем больше Р, тем это равенство точнее.

Интерфейс программы на Delphi решения этой задачи показан на рис. 2.19. Чтобы можно было проследить за установлением значения числа л, испытания разбиваются на серии. В одной серии производится N испытаний, а число таких серий равно К. После завершения каждой серии на экран выводится результат. Окно с формой включает в себя следующие элементы интерфейса:  Мето1 — поле для ввода/редактирования многострочных текстов (до 32 Кб);

*                      Edit1 и Edit2 — поля для ввода значений К и N;

 Label1 и Label2 — метки к полям ввода;

*                      Button1 — командная кнопка для запуска вычислений;  ListBox1 — поле для вывода прокручиваемого списка.

Обработка события Button1C1ick производится следующей процедурой:

Procedure TForm6.Button1C1ick (Sender: ТОЬј ect) ;

Var i, ј : integer; К, N, М: Int64;

Х, У, Pi : double; begin

К: =StrToInt (Edit1. Text) ; / / ввод числа серий

 Методы программирования


N:=StrToInt (Edit2 . Text) ; / / ввод длины серии испытаний Randomi ze ;

/ / Инициализация счетчика попаданий в круг Eor to К do / / Цикл по номеру серии испытаний begin for Ј to N do / / Повторение испытаний begin

/ / Вычисление Х—координаты точки

/ / Вычисление У—координаты точки

=1 Then М: =М+1 / / Подсчет числа попаданий / / в круг end;

. / / Вычисление ”пи” после окончания серум

/ / Вывод числа испытаний и ” пи”

                    ListBox1. Items .Add (IntToStr (i          +      испытаний:

+ F10atToStr (Pi) ) end end;

Вывод в поле ListBox производится вызовом метода ListBox1. Items . Add (строка) . Каждое обращение к этому методу добавляет строку к списку ListBox. Для просмотра всего списка выведенных строк используется линейка прокрутки.

С, Метод Монте-Карло               

 

 

 

Вычисте.ме чмла Магора методом статистических »слыта•м

Одна              включает Н ж:пыта•— Кот•ество се— рато К

1000

 

10000

к-

 

Начать иомтания

 

98000 исгыттић: вез, 14188699186992 9850000 ионтаний: +3,14186517766497 9860000 испытаний:

9870000 испыттмй: А -3,14186828774063

9880000 испытаний: +3,14188299595142 9890000 испытаю,й: Pi 14187583417594 9900000 испытаний:    

9910000 испытаний: Рез, 14183208879919 9920000 испытаний:

9930000 истнта-в-Й: 14185095669688

А=З, 14184104627767 9950000 исгытаний: рез, 14183075376884

9960000 испытаний:

9970000 испытаю“.

9980000 исгнтаний:

9990000 испытаю“: А-3,14178178178178

10000000 иснтаний: В-3,1417664

Рис. 2.19. Интерфейс программы «Метод Монте-Карло»

Обсудим результаты, представленные на рис. 2.19. Выполнены расчеты для 1000 серий, каждая из которых состоит из 10000 испытаний. Последний результат соответствует десяти миллионам испытаний. В результате получились только четыре верные цифры в значении числа л: 3,141. Более точное значение: л = 3,14159265.

Объектно-ориентированное программирование

 

167

Возникает вопрос: почему такой дорогой ценой (десять миллионов испытаний!) дались всего 4 цифры числа л? И отсюда следующий вопрос: а если продолжать увеличивать число испытаний, то можно ли таким же способом получить сколько угодно верных цифр числа л? Ответ: теоретически да, практически нет! В чем же дело?

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


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

С помощью метода Монте-Карло можно вычислять площади фигур сложной формы на плоскости или объемы трехмерных тел. Идея все та же: фигура помещается в другую фигуру простой формы, для которой известна площадь или объем. Например, для плоской фигуры прямоугольник или круг, для объемного тела прямоугольный параллелепипед или шар. Затем с помощью датчика случайных чисел с равномерным законом распределения производится «стрельба» по цели. Каким-либо образом диагностируются попадания в исследуемую фигуру. Далее вычисляется искомая площадь или объем по отношению числа попаданий к общему числу испытаний («выстрелов»).

Методы программирования


Система основных понятий

Метод статистических испытаний

Метод статистических испытаний (метод Монте-Карло) — численный метод, использующий моделирование случайных величин и получение статистических оценок искомых величин

Вычисление числа л: круг единичного радиуса, площадь которого равна л, вписывается в квадрат со стороной 2. Производятся испытания — случайный выбор точек внутри квадрата с подсчетом числа точек, попавших в круг. Точная формула:

л = 4 • lim —, р_.ое Р где Р — число испытаний, М — число попаданий в круг

м

Статистическая оценка: л 4 — для больших значений Р

Причины погрешности результата: конечное значение числа испытаний Р и погрешность машинных вычислений

Вопросы и задания

1.   Что такое метод статистических испытаний (метод Монте-Карло)?

2.   В чем состоит идея применения метода Монте-Карло для вычисления площадей и объемов?

2 З. Реализуйте на компьютере приведенную в параграфе программу вычисления числа л. Проследите за изменением результата с ростом числа испытаний.

2.4.5. Построение графика функции

Составим программу получения в окне вывода графика функции у = f(x). Для получения графических изображений в Delphi используется объект Canvas холст. Объект Canvas применяется не как самостоятельный компонент, а как свойство формы (Form. Canvas). Вывод рисунка на холст происходит с возникновением события Paint формы. Это событие появляется каждый раз, когда возникает необходимость вывода окна приложения (при запуске приложения или при обновлении вида окна). Обработка этого события осуществляется процедурой FormPaint.

Рисование на холсте происходит путем закрашивания точек на графической поверхности окна. Совокупность таких точек (пикселей) образует графическую сетку. Положение каждой точки сетки характеризуется двумя координатами: горизонтальной (х) и вертикальной (у). Следует учитывать, что координаты отсчитываются от левого верхнего угла. Один шаг графической сетки равен расстоянию между соседними пикселями (рис. 2.20).

Объектно-ориентированное программирование

 


                                                                ось х                                Width

Height

Рис. 2.20. Структура и параметры графической сетки

Максимальное число шагов по оси Х хранит свойство формы C1ientWidth, а по оси У — свойство C1ientHeight.

Для создания любых рисунков используются основные графические примитивы — точки, линии, окружности, прямоугольники и др. Чтобы нарисовать такие примитивы, используются соответствующие методы объекта Canvas.

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

MoveTo (х, у: integer)

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

LineTo (х, у: integer)

Вычерчивает линию из текущей точки в точку с указанными координатами. Вид линии определяет свойство Реп (перо)

TextOut (х, у: integer; S : string)

Выводит на экран строку s от точки с координатами (х, у). Шрифт определяет свойство Font поверхности (Canvas), на которую выводится текст. Цвет закраски области вывода текста определяет свойство Brush (Кисть) этой же поверхности

Сведения о других методах см. в описаниях Delphi.

График функции строится по точкам с помощью установки значения свойства Pixe1s [х, у] :=z, где х, у — координаты пикселя, г цвет пикселя.

Следующая программа выполняет построение графика функции вида: f(x) = 2sinx • ех/ 5 на отрезке х Е [—10, 10]. Для вычисления значений функции составлена подпрограмма-функция f. Построение графика выполняет процедура с именем GrOfFunc. Текст программы снабжен подробными комментариями. Постарайтесь внимательно его изучить и понять смысл программы!

2 / / ФУНКЦИЯ ДЛЯ ГРАФИЧЕСКОГО ПРЕДСТАВЛЕНИЯ

Методы программирования


Function f (х: rea1) : rea1; begin f:=2*sin (х) *ехр (х /5) end;

/ [ПРОЦЕДУРА ПОСТРОЕНИЯ ГРАФИКА

Procedure GrOfFunc ;

Var х 1, х2, / / границы измерения аргумента функции у 1, у2, / / границы изменения значения функции х, / / аргумент функции

У, / / значение функции в точке х ах: rea1; / / приращение аргумента

1, Ь: integer; / / левый нижний угол области вывода графика w, h: integer; / / ширина и высота области вывода графика тх, ту: rea1; / / масштаб по осям Х и У хо, у0: integer; / / точка — начало координат п, sh, s : integer; / / число единичных меток на осях begin

/ / Расчет области вывода графика

1:-20;

C1ientHeight—20; / / у—координата левого нижнего / / угла h : =Form6. C1ientHeight—40 ; / / высота w : =Form6. ; / / ширина

/ / нижняя граница диапазона аргумента

/ / верхняя граница диапазона аргумента

/ / шаг аргумента

Вычисление максимального и минимального значения функции на отрезке [х 1 , х2] у 1 :=f (х 1) ; / / переменная для минимума у2 :=f (х2) ; / / переменная для максимума х : =х1 repeat

у<у1 then у 1 :=у, if у>у2 then у2 : х : =x+dx ; unti1 (х>=х2) ;

Объектно-ориентированное программирование


/ / Вычисление масштаба my:=h/abs (у2—у1) ; ( / масштаб по оси У тх (х2—х1) ; / / масштаб по оси Х хо :=1+abs (Round (х1 *тх) ) ; / / положение начала УО : =b—abs (Round (у 1 *ту) ) ; / / координат / / РИСОВАНИЕ И РАЗМЕТКА ОСЕЙ КООРДИНАТ with Form6. Canvas begin

MoveTo (xO,b) ; LineTo (хо, b—h) ; / / рисуем ось У

          MoveTo (1, у0) ; LineTo (1+w, у0) ;    / / рисуем ось Х

/ [Разметка оси ОУ

TextOut (хО+5, b—h, F10atToStrF (у2, ffGenera1, б, З) ) ; / / нанесем / / на ось У тах

TextOut (xO+5,b, F10atToStrF (у 1, ffGenera1, 6, З) ) ; / / и min / / значения функции п: =Round (Form6 . C1ientHeight/40) ; / / количество меток if (у2—у1) then / / подбираем шаг расстановки меток / / в зависимости от диапазона begin / /изменения значений функции sh:=round( (у2—у1) / п) ; s : =Round (у 1 ) end


repeat

MoveTo (Round (xo—2) , Round (y0+s*my) ) ;

LineTo (Round (xO+2) , Round (y0+S*my) ) ;

/ / pmcyeM

/ / Memor

/ / % npoc rraBJIAeM


/ / gmcna

TextOut (xo—30 , Round (yO—5+s*my) ,

FloatToStrF (—1 *S, ffGenera1, 6, 3) )

S : =S+Sh; until (s>y2) ; / / Pa3MeTKa ocm OX n (w/ 40) ; if (x2—xI)<IOO then / / aHanorw-1HO, ocm OX begin sh: =Round ( (x2—xI) / n) ; s : —Round (x 1) end else begin

    MeTOAbl


(Round( (x2—xI) / n) div 10) *10; s:=(Round (x 1) div 10) *10 end ; repeat

MoveTo (Round (xO+s*mx) , y0—2) ; LineTo (Round (xO+S*mx) , y0+2) ;

TextOut (Round (xO—5+s*mx) , yO+15,

FloatToStrF (S, ffGeneraI, 6, 3) ) ;

S : =S+sh; until (s>x2) ;

// IIOCTPOEH%E PPA$VIKA OYHKUI,M x:=xl; repeat

/ / 3aKpauz,1BaHme TOMKYI rpaOmqecxoh ceTK% RpaCHb1M UBeTOM Pixels [x0+Round (x*mx) y0—Round (y *my) ] :=c1Red; x: =x+dx; until (x>=x2) ; end ; end ;

/ / 3anycx nocnpoeH1,1A rpa$mxa c OTRPEITVEM $0PMb1 Procedure TForm6. FormPaint (Sender: TObject) ; begin

GrOfFunc;

/ / Перерисовывание графика с изменением размера формы Procedure TForm6. FormResize ( Sender: ТОЬј ect) ; begin

/ / очистить форму

Form6. Canvas . Fi11Rect (Rect (0, 0, C1ientWidth, C1ientHeight) ) ;

/ / построить график

GrOfFunc end;

Объектно-ориентированное программирование


График строится в пределах прямоугольника, имеющего в окне вывода левое, правое, верхнее и нижнее поля, равные 20 шагам графической сетки. Шаг изменения математического значения координаты х равен 0,01. Масштабы по оси Х и оси У (переменные тх и ту) равны числу шагов графической сетки, приходящихся на единицу изменения математических значений аргумента х и функции у. Принято использовать следующую терминологию: математические значения аргумента х и функции у определяют положение графика функции в мировой системе координат. А структура, представленная на рис. 2.20, называется экранной системой коор-

Рис. 2.21. Графики функции для разных размеров окна вывода, полученные с помощью процедуры GrOfFunc

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

Если вручную изменять размеры окна вывода, то происходит событие формы, которое называется Resize. Это событие обрабатывается процедурой FormResize, которая производит очистку формы от старого рисунка и обеспечивает перерисовывание графика для нового размера окна. На рисунке 2.21 показаны три варианта изображения графика для разных размеров холста (окна вывода).

Методы программирования


О Система основных понятий

Построение графика функции

Canvas (холст) — свойство формы, реализованное как объект, позволяющее наносить на форму графические изображения

Свойства холста: параметры графической сетки C1ientWidth и C1ientHeight, определяющие горизонтальный и вертикальный размеры

Рисование на холсте: производится с помощью команд изображения графических примитивов или закрашиванием точек графической сетки посредством установки значения свойства Pixe1s [х, у] :=z, где х, у — координаты пикселя, г — цвет пикселя

Для рисования графика функции:

1) строятся оси мировой системы координат;

2) осуществляется разметка осей;

З) изменяется с некоторым шагом значение аргумента и вычисляется соответствующее значение функции;

4)  пересчитываются значения х и у из мировой системы координат в экранную систему;

5)  рисуется точка на экране в соответствующей позиции

О Вопросы и задания

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

2.   Какие параметры характеризуют размер холста?

З. Как расположены оси экранной системы координат?

4.       С помощью каких методов можно наносить на холст рисунки и надписи?

5.       Что такое мировая система координат?

6.       Для чего в процедуре GrOfFunc используются величины тх и ту?

7.       При наступлении какого события выполняется программа рисования графика?

8.       За счет чего происходит перерисовывание графика с изменением размеров окна вывода (формы)?

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

10.   Какие операторы надо добавить в программу для того, чтобы на концах осей координат нарисовать стрелочки и написать обозначения осей Х и У?

11.   Каким образом можно изменить цвет линии графика?

12.   Почему при изменении размера окна вывода изменяется разметка осей? Проанализируйте, как это делается в программе.

Практикум. Раздел «Программирование»

ЭОР к главе 2 на сайте ФЦИОР (http://fcior.edu.ru)

2.2.

*    Начальные сведения о программах на языке Pascal

*    Простейшие операции языка Pascal.

*    Этапы разработки программы, ее структура. Создание шаблона программы на языке Pascal

Объектно-ориентированное программирование

*   


Объявление переменных в программе (на примере языка Pascal). Использование. Присваивание. Практическая работа

*    Основные типы данных: Integer, Real, Boolean, Character и String. Работа с переменными и константами (на примере языка Pascal) (И)  Объявление переменных в программе. Перечислимые и интервальные типы (На примере языка Pascal). Практическая работа  Реализация основных алгоритмических конструкций

Операторы ветвления if и case (на примере языка Pascal). Практическая работа

*    Основные элементы языка программирования (на примере языка Pascal). Циклы. Работа с циклами. Использование циклов в программе. Вложенные циклы.

*    Работа с массивами. Одномерные массивы. Алгоритмы работы с массивами. Обработка массива в цикле. Подсчет суммы элементов, максимум и минимум, поиск и сортировка элементов в массиве (на примере языка Pascal). (И)

*    Основные понятия и принципы ООП

*    Этапы объектно-ориентированного программирования

*    Основные принципы объектно-ориентированного программирования: понятие классов и объектов, их свойств и методов. Практика.


ОГЛАВЛЕНИЕ

От авторов

1.1.2. Модели систем

1.1.3. Что такое информационная система О профессиях: профессии, связанные с созданием информационных систем20 1.1.4. Инфологическая модель предметной 22

        1 .2. Реляционные базы данных                                                      . ... 25

1.2.1. Реляционные базы данных и СУБД .......... ..................... 25

1.2.2. Проектирование реляционной модели данных ............. .. 29

1.2.3. Создание базы 33 1.2.4. Простые запросы к базе данных .


               1.2.5. Сложные запросы к базе данных                                         42

Глава 2. Методы программирования . ... . . . . . .. . . . .. .. . .. . . . .. . . . . ... . . . . 50

2.1 . Эволюция программирования50

О профессиях: профессии, связанные с программированием 57

2.2.   Структурное программирование       58

2.2.1.    Паскаль — язык структурного программирования   58

2.2.2.    Элементы языка и типы данных. ... . ....... 61

2.2.3.    Операции, функции, выражения       . 66

2.2.4.    Оператор присваивания, ввод и вывод данных         ... 72

2.2.5.    Структуры алгоритмов и программ  . ...... 80

            2.2.6. Программирование ветвлений...............                          . 86

2.2.7.        Программирование циклов        . 91

2.2.8.        Вспомогательные алгоритмы и подпрограммы  97

2.2.9.        Массивы       .           . 104

2.2.10.    Типовые задачи обработки массивов . .......................... 110

2.2.11.    Метод последовательной детализации.......................... 115

2.2.13.    Строки символов ............................................. . .

2.2.14.    Комбинированный тип данных



[1] ) Эта и все последующие иллюстрации получены в процессе работы с СУБД Microsoft Access.