Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_ЗФ / 2013_Информатика УМО_легпром.doc
Скачиваний:
359
Добавлен:
22.03.2016
Размер:
50.51 Mб
Скачать
    1. Рекурсивные алгоритмы *

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

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

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

Рекуррентность– это рекурсивное определение функции. Классический пример такого рода функций – факториал. Напомним, факториал нуля равен 1, а факториал натурального числа N определяется как произведение натуральных чисел от единицы до N, что выражается рекуррентной формулой: N!=N (N-1)!, для N>=1 и 0! = 1. То есть для определения факториала одного числа требуется знать или вычислить факториал другого, уменьшенного на единицу. А это, в свою очередь, может потребовать определения факториала ещё меньшего числа. И так далее, до единицы. Этому напрямую соответствует нижеследующая рекурсивная функция:

Function factorial(N As Integer) As Long

If N=0 Then factorial=1 Else factorial=N*factorial(N-1)

End Function

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

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

Function factorial(N As Integer) As Long

factorial=1

For Счётчик=1 To N

factorial=factorial*Счётчик

Next

End Function

    1. Объектно-ориентированное программирование

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

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

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

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

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

В объектно-ориентированном программировании (ООП) используются следующие базовые понятия:

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

Свойство– характеристика объекта, его параметр. Все объекты наделены определенными свойствами, которые в совокупности выделяют объект из множества других объектов. Набор свойств стандартных элементов графического интерфейса включает в себя размеры объекта, его положение на экране, эффекты отображения и др.

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

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

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

Формат записи для работы с объектами следующий: Имя_Объекта.Имя_Метода; илиИмя_Объекта.Имя_Свойства. При этом вызов метода по сути аналогичен вызову процедуры, а работа со свойствами объектов практически не отличается от работы с переменными, однако отдельные свойства (например, имя объекта) могут быть доступны только для чтения.

Отметим, что мы уже познакомились с некоторыми возможностями ООП в среде VBA. Так, в рассмотренных ранее Примерах 2 и 3 с помощью свойства.Valueтекстового поля осуществлялся и ввод, и вывод данных. А в Примерах 4 и 5 использовался метод.AddItemдля вывода текстовых строк в поле списка.

Один объект может выступать объединением вложенных в него по иерархии других объектов. И это может отражаться в тексте программы перечислением вложенных объектов через точку. Например, следующий фрагмент программы задаёт цвет формы «белый», а расположенной на ней кнопке – «чёрный»:

Форма.Цвет = "белый"

Форма.Кнопка.Цвет = "чёрный"

Существуют различные объектно-ориентированные технологии и методики проектирования программных продуктов, которые основываются на следующих принципах ООП – «китах»:

  • инкапсуляция(встраивание, сокрытие);

  • наследование(иерархия, агрегация);

  • полиморфизм(изменчивость).

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

Наследованиепозволяет создавать на основе существующих классов новые –подклассы. При построении подклассов осуществляетсянаследованиеданных и методов обработки объектов исходного родительского класса. Механизм наследования позволяет переопределить или добавить новые данные и методы их обработки, создать иерархию классов.

Полиморфизм(от греч. «многоликость») – способность объекта реагировать на запрос (вызов метода) сообразно своему типу, при этом одно и то же имя метода может использоваться для различных классов объектов.

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

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

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

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