Порядок выполнения работы




1. Откройте созданную вами рабочую книгу Excel. Скопируйте свою таблицу на новый лист. Удалите в ней все формулы. Запустите интегрированную среду разработки VBA.

2. Выберите фрагменты кодов вашей программы, которые будут реализованы в виде процедуры или функции.

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

4. Замените выбранные фрагменты кодов программы на вызовы процедуры. Объявите и задайте фактические параметры процедуры.

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

6. Замените выбранные фрагменты кодов программы на вызовы функции. Объявите и задайте фактические параметры функции.

7. Проверьте работоспособность всей программы в режиме отладчика с использованием команды Step Into.

8. Ознакомьтесь с принципом отладки программы командой Step Over, автоматически выполняющим вызываемую процедуру или функцию и командой Step Out автоматически завершающей выполнение текущей процедуры или функции.

9. Введите в процедуру или функцию проверку значений аргументов с помощью оператора If Then Else EndIf.

10. Воспользуйтесь оператором Select Case End Select в процедуре или функции для демонстрации возможностей его работы.

11. Отметьте в таблице Excel факт выхода значения данных за пределы диапазона. Для этого, например, измените цвет шрифта в ячейке.

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

13. Создайте функцию, определенную пользователем.

14. Перейдите на лист Excel. Выполните команду Вставка, Функция… Выберите из категории Определенные пользователем запрограммированную вами функцию. Задайте данные и убедитесь в правильности ее выполнения.

15. Проверьте работоспособность функции в режиме отладчика с использованием команды Step Into.

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

Контрольные вопросы

1. Чем отличается объявление функции от ее определения?

2. В чем заключается практический смысл использования функций или процедур?

3. Что такое список формальных параметров и чем формальные параметры отличаются от фактических?

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

5. Как вызвать библиотечную функцию VBA?

6. Какой смысл имеет задание типа функции в ее определении?

7. Чем отличается вызов функции от вызова процедуры?

8. Как создать определенную пользователем функцию Excel?

9. Каковы особенности отладки программы, использующей функции или процедуры?

10. Как результаты работы функции или процедуры могут быть получены в вызывающей программе?

Отчет о работе

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

Лабораторная работа №6

Классы и объекты

Методические указания

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Затем определяется процедура инициализации класса Sub Class_Initialize(). Эта процедура выполняется каждый раз, когда создается новый объект и может быть использована, например, для задания начальных значений переменным класса, динамического переобъявления размеров массивов в соответствии с требованиями конкретной задачи, чтения файлов и т.п. Далее может быть создана процедура Sub Class_Terminate(). Она описывает действия, которые надо выполнить перед удалением объекта (например, печать результата). Если начальных или завершающих действий с объектом не требуется, то эти процедуры можно не создавать. Синтаксис определения процедур Sub Class_Initialize() и Sub Class_Terminate() имеет вид:

Private Sub Class_Initialize()

[Операторы]

End Sub

 

Private Sub Class_Terminate()

[Операторы]

End Sub

После этого создаются функции вида Property Get, Property Let и Property Set[2], позволяющие читать и задавать значения свойств переменных класса. Их формальное описание имеет вид:

[Public или Private] [Static] Property Get Имя [(СписокАргументов)] [As Тип]

[Операторы]

[Имя=Выражение]

[Exit Function]

[Операторы]

[Имя=Выражение]

End Property

 

[Public или Private] [Static] Property Let Имя [(СписокАргументов)]

[Операторы]

[Имя=Выражение]

[Exit Function]

[Операторы]

End Property

 

[Public или Private] [Static] Property Set Имя [(СписокАргументов)]

[Операторы]

[Имя=Выражение]

[Exit Function]

[Операторы]

End Property

Наконец, создаются методы класса, которые оформляются в виде обычных процедур Sub.

[Public или Private] [Static] Sub Имя [(СписокАргументов)]

[Операторы]

End Sub

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

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

Dim Фамилия() As String, Начислено() As Currency, Налог() As Currency, _

К_Выдаче() As Currency

'Переменные класса представляют собой набор динамически объявляемых массивов.

'Необходимость динамического объявления связана с неопределенностью числа строк

'таблицы конкретного объекта

Dim Размер_таблицы As Integer, Ставка_налога As Single

 

Private Sub Class_Initialize()

Размер_таблицы = 4

Ставка_налога = 0.12

ReDim Фамилия(1 To Размер_таблицы)

ReDim Начислено(1 To Размер_таблицы)

ReDim Налог(1 To Размер_таблицы)

ReDim К_Выдаче(1 To Размер_таблицы)

End Sub

 

Private Sub Class_Terminate()

'Действия не предусматриваются

End Sub

 

Sub Расчет_заработной_платы()

For i = 1 To Размер_таблицы

Начислено(i) = Cells(i + 1, 2) 'В первую ячейкe массива Начислено записывается

'содержимое второй строки и второй колонки исходной таблицы Excel

If Начислено(i) > 1000000 Then

Начислено(i) = 1000000

Call Изменение_цвета_шрифта_в_ячейке(i + 1, 2, "Желтый") 'Вызов процедуры с

' ключевым словом Call. Параметры процедуры заключены в круглые скобки

Else

End If

If Начислено(i) < 0 Then

Начислено(i) = 0

Изменение_цвета_шрифта_в_ячейке i + 1, 2, "Красный" 'Вызов процедуры без

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

Else

Call Изменение_цвета_шрифта_в_ячейке(i + 1, 2, "Сброс")

End If

Налог(i) = Начислено(i) * Ставка_налога 'Рассчитывается значение налога и запоминается

'в соответствующей ячейке

Cells(i + 1, 3) = Налог(i) 'Значение налога возвращается в таблицу Excel

К_Выдаче(i) = Начислено(i) - Налог(i) 'Рассчитывается значение к выдаче

'и запоминается в соответствующей ячейке

Cells(i + 1, 4) = К_Выдаче(i) 'Значение к выдаче возвращается в таблицу Excel

Next i

End Sub

 

Sub Изменение_цвета_шрифта_в_ячейке(Строка As Integer, Столбец As Integer, Цвет As String)

Dim C As Integer

Select Case Цвет

Case "Красный": C = 3

Case "Желтый": C = 6

Case "Зеленый": C = 10

Case Else: C = 0 'Автоматический выбор (Авто)

End Select

Cells(Строка, Столбец).Font.ColorIndex = C

End Sub

 

Property Let Число_строк_таблицы(Размер As Integer)

Размер_таблицы = Размер

ReDim Фамилия(1 To Размер_таблицы)

ReDim Начислено(1 To Размер_таблицы)

ReDim Налог(1 To Размер_таблицы)

ReDim К_Выдаче(1 To Размер_таблицы)

End Property

 

Property Get Число_строк_таблицы() As Integer

Число_строк_таблицы = Размер_таблицы

End Property

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

Объект.Свойство = Значение_свойства

Объект.Свойство1(параметр 1, параметр2, …, параметрN) = Значение_свойства

Значение_свойства = Объект.Свойство

Значение_свойства = Объект.Свойство1(параметр 1, параметр2, …, параметрN)

Объект.Метод

Объект.Метод1 параметр 1, параметр2, …, параметрN

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

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

· объявить переменную оператором Dim и указать ее тип как имя используемого класса;

· создать объект оператором Set с именем ранее объявленной переменной, используя ключевое слово New и указание имени класса (синтаксис оператора Set смотри стр. 39).

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

Если работа с объектом завершена, то он может быть удален из памяти оператором Set с ключевым словом Nothing (смотри стр. 39). После его выполнения занимаемая объектом память освобождается. Кроме этого, все созданные объекты автоматически удаляются из памяти в момент завершения работы программы.

Пример 20. Программа использования класса, реализующая задачу рис. 1.

Sub Расчет_заработной_платы7()

'Объявление переменной с типом созданного класса

Dim Первый_объект As Ведомость_заработной_платы, i As Integer

'Создание объекта

Set Первый_объект = New Ведомость_заработной_платы

'Использование метода объекта

Первый_объект.Расчет_заработной_платы

'Использование свойства объекта. Задание нового числа строк таблицы

Первый_объект.Число_строк_таблицы = 3

'Чтение текущего числа строк таблицы

i = Первый_объект.Число_строк_таблицы()

'Удаление объекта

Set Первый_объект = Nothing

End Sub

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

Задание

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: