Файл: Основные правила работы с функциями: примеры и ограничения использования функций в различных языках программирования (ПОНЯТИЯ О ПРОГРАММИРОВАНИИ).pdf
Добавлен: 31.03.2023
Просмотров: 71
Скачиваний: 2
СОДЕРЖАНИЕ
1.1. Определение программирования
1.2. Этапы развития программирования
2.1. Основы модульного программирования в C++
2.2.Использование подпрограмм в ЯП VBA
3. РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ В С++ И VBA
3.1. Применение функций С++ для реализации модульной программы
– программа должна разделяться только на независимые части, что именуются модулями;
– модуль – независимый составной блок, код (программный текст) которого логически отделен от программного кода иных модулей;
– модуль выполняет лишь одну логическую функцию, другими словами, должен решать одну самостоятельную задачу для своего уровня по такому принципу: один модуль – одна функция;
– работа программного модуля зависеть не должна от следующих параметров:
– начальных данных;
– того, какому именно программному модулю предназначены исходные данные;
– предыстории использования программного модуля;
– непосредственно размер программного модуля надо ограничивать одной или двумя страницами листинга;
– каждый модуль должен применять только одну точку для входа и для выхода;
– взаимосвязи между разными модулями устанавливаются только по иерархической схеме;
– каждый модуль начинается комментариями, объясняющего его назначение, а также предназначение переменных, что передаются в модуль и с него, модулей, что его вызывают, а также модулей, которые могут из него вызываться;[13]
– стоит отметить, что оператор безусловного перехода, может вообще не применяться в модуле, или же применяется только в исключительных случаях и лишь для перехода на начальную точку модуля;
– для текста модуля необходимо применять комментарии, в особенности непосредственно в сложных местах выполнения алгоритма;
– идентификаторы модулей, локальных переменных должны быть смысловыми;
– в одной строке необходимо записывать не более, чем один оператор. Если для записи операторов требуется больше, нежели одна строка, то последующие операторы будут записаны с отступами;
– необходимо не допускать вложенности разных блоков операторов более 3-х уровней;
– также следует избегать применения языковых конструкций с плохой семантикой.[11]
Простейшим видом модульной структуры является подпрограмма.
Подпрограмма – именованная законченная группа операторов ЯП, которую можно вызвать непосредственно для выполнения любого количества раз с различных мест ПО.
На рисунке 6 показана классификация подпрограмм:
Рис.6. Классификация подпрограмм
Использование подпрограмм дает возможность решить следующие основные задачи:[11]
– избавить от необходимости повторять многократно в тексте программы фрагменты кода;
– значительно улучшает читабельность кода программы, позволяя выявить легче ее логическую структуру, а также скрывая подробности вычислений;[7]
– повышает устойчивость к программным ошибкам и непредвидимым последствиям в случае модификации программы;
– уменьшает в общем случае объем применяемой памяти ЭВМ;
– выполняет сокращение время отладки ПО;
Выделим 2 основных критерия для создания подпрограммы.
– в случае, когда некоторая последовательность действий будет встречаться в программе более, чем 1 раз, следует выделить ее в отдельную подпрограмму.
– если же последовательность действий встречается только один раз, но также может быть объединена функционально в одно целое, то надо выделять ее в отдельную подпрограмму.
Такой критерий менее четкий, нежели предыдущий. Хотя, его полезно применять в таких случаях:
– программа длинная – полностью очевидно, что объем увеличится, но сама программа будет более читабельной;
– если в программе применяются сложные алгоритмы: легко их можно отладить в подпрограмме отдельно в небольших так называемых тестирующих программах;
– реализация алгоритма для задачи в виде некоторой подпрограммы позволит легко перенести при необходимости ее в иную программу или же отдельный модуль.
Все имеющиеся подпрограммы используют следующие свойства:
– Обмен информации между подпрограммами осуществляется через механизм так называемой передачи параметров (или аргументов).
Операторы, которые находят внутри подпрограммы выполняются (начиная с первого) лишь в случае, когда это подпрограмма будет вызываться с другой программы.
Данные подпрограммы вызываются путем простой записи имени с указанием фактических параметров, хотя в разных языках программирования существуют также специальные операторы для непосредственного вызова подпрограмм. [1]
Подпрограмму, которая вызвала данную называют внешней в отношении к данной. Программа, что выполняется в данный момент, является активной.
Под главной программой (подпрограммой) понимается такая программа, которая вызывается непосредственно операционной системой (ОС).
После выполнения операторов все подпрограммы управление передаются на оператор программы, которая вызвала данную подпрограмму, за вызовом следующий.
В общем случае все подпрограммы могут являться вложенными – допускается вызов подпрограммы не лишь из главной программы, а и из других подпрограмм.[5]
Подпрограммы бывают основных двух видов – функции и процедуры. Процедура просто реализует группу операторов (к примеру, процедура вывода для матрицы), а функция, кроме этого, вычисляет некоторое значение, а также передает его в главную программу.
2.2.Использование подпрограмм в ЯП VBA
Процедура — это последовательность операторов VBA, расположенная в модуле VBA, доступ к которому можно получить с помощью VBE. Модуль может включать любое количество процедур.[1] Некоторые процедуры получают аргументы. Аргумент — это информация, используемая процедурой в процессе выполнения. Аргументы процедуры во многом подобны аргументам, используемым функциями Excel.
При объявлении процедуры с использованием ключевого слова Sub применяется следующий синтаксис.
[Private | Public][Static] Sub имя([список_аргументов])
[инструкции]
[Exit Sub]
[инструкции]
End Sub
Рис. 7. Запуск процедуры из Visual Basic Editor
Private (необязательное ключевое слово) – указывает на то, что процедура доступна только для других процедур в том же модуле.
Public (необязательное ключевое слово) – указывает на то, что процедура доступна для всех остальных процедур во всех модулях рабочей книги. При использовании в модуле, содержащем оператор Option Private Module, процедура будет недоступна за пределами проекта.[3]
Static (необязательное ключевое слово) – указывает на то, что переменные процедуры сохраняются после окончания процедуры.
Sub (обязательное ключевое слово) – обозначает начало процедуры.
Имя – любое корректное название процедуры.
Список_аргументов – представляет заключенный в скобки список переменных, содержащих аргументы, которые передаются в процедуру. Для разделения аргументов используется запятая. Если процедура не использует аргументы, то необходимо включить в объявление процедуры пустые скобки.
Инструкции (необязательные) – корректные инструкции VBA.
Exit Sub (необязательный оператор) – вызывает немедленный выход из процедуры до ее формального завершения.
End Sub (обязательный оператор) – указывает на завершение процедуры.
Функция — это процедура VBA, которая выполняет вычисления и возвращает значение. Функции можно использовать в коде VBA или в формулах Excel. Процедуру можно рассматривать как команду, которая выполняется пользователем или другой процедурой. С другой стороны, функция обычно возвращает отдельное значение (или массив) подобно функциям рабочих листов Excel и встроенным функциям VBA.
Excel содержит более 400 встроенных функций. Если этого количества недостаточно, можно создавать пользовательские функции с помощью VBA. Однако следует отметить, что функции VBA, используемые в формулах, обычно выполняются медленнее, чем встроенные функции Excel. Пользовательские функции отображаются в диалоговом окне Мастер функций наряду со встроенными функциями Excel.[7]
Рассмотрим пример пользовательской функции RemoveVowels (УдалитьГласные), которая принимает текстовый аргумент, удаляет все гласные буквы и возвращает текст, состоящий только из согласных.
Function RemoveVowels(txt) As String
' Удаляет все гласные звуки из аргумента txt
Dim i As Long
RemoveVowels = ""
For i = 1 To Len(txt)
If Not ucase(Mid(txt, i, 1)) Like "[AEIOUАЕИОУЮЭЯ]" Then
RemoveVowels = RemoveVowels & Mid(txt, i, 1)
End If
Next i
End Function
Функцию RemoveVowels можно использовать, например, в формуле в ячейке В1 =RemoveVowels (А1).
Пользовательские функции можно применять не только в формулах рабочего листа, но и в процедурах VBA. Например, процедура ZapTheVowels() сначала отображает окно для ввода текста пользователем, затем обрабатывает этот текст функцией RemoveVowels, и наконец использует встроенную функцию VBA MsgBox для отображения результатов. Первоначальные данные отображаются в заголовке окна сообщения.[18]
Sub ZapTheVowels()
Dim UserInput As String
UserInput = InputBox("Введите текст:")
MsgBox RemoveVowels(UserInput), vbInformation, UserInput
End Sub
Функция возвращает значение, но не может выполнять операции над объектами.
Из этого правила имеется одно ограничение. Можно изменить текст комментария ячейки с помощью пользовательской функции VBA:
Function ModifyComment(Cell As Range, Cmt As String)
Cell.Comment.Text Cmt
End Function
Например, можно ввести в ячейку В1 формулу =ModifyComment(А1,»Комментарий был изменен»). Функция не работает, если в ячейке А1 отсутствует комментарий.
Рассмотрим код функции RemoveVowels подробнее.
Функция начинается с ключевого слова Function, а не Sub, после которого указывается название функции (RemoveVowels). Эта специальная функция использует только один аргумент (Txt), заключенный в скобки. Ключевое слово As String определяет тип данных значения, которое возвращает функция. (Excel по умолчанию использует тип данных Variant, если тип данных не определен.)
Вторая строка — простой комментарий (необязательный), который описывает выполняемые функцией действия. После комментария приведен оператор Dim, который объявляет переменную (i), применяемую в функции. Тип этой переменной — Long. Далее в качестве переменной используется имя функции. Как только функция завершает свое выполнение, возвращается текущее значение переменной, которое соответствует названию функции.
Следующие пять инструкций образуют цикл For-Next. Процедура циклически просматривает каждый символ введенного текста, создавая на их основе строку. Первая инструкция в цикле использует функцию VBA Mid, которая возвращает единственный символ строки ввода, а также преобразует этот символ в символ верхнего регистра. Затем этот символ сравнивается со списком символов с помощью оператора VBA Like (подробнее см. Оператор Like). Другими словами, значение выражения If будет True, если символ отличен от символов А, Е, I, O, U, А, Е, И, О, У, Ы, Э, Ю и Я. В подобных случаях символ добавляется к переменной RemoveVowels.
По завершении цикла из строки ввода удаляются все гласные буквы. Эта строка и является значением, возвращаемым функцией RemoveVowels. Процедура завершается оператором End Function.
Для объявления функции применяется следующий синтаксис (элементы аналогичны обычной процедуре.
[Public | Private][Static] Function имя ([список_аргументов])[As тип]
[инструкции]
[имя = выражение]
[Exit Function]
[инструкции]
[имя = выражение]
End Function
Значение всегда присваивается названию функции минимум один раз и, как правило, тогда, когда функция завершила выполнение. Создание пользовательской функции начинается с создания модуля VBA (можно также использовать существующий модуль). [14]
Имена функций подчиняются тем же правилам, что и имена переменных. Если надо использовать функцию в формуле рабочего листа, убедитесь, что название не имеет форму адреса ячейки. Также не присваивайте функциям имена, которые соответствуют названиям встроенных функций Excel. Если область действия функции не задана, то по умолчанию подразумевается Public. Функции, объявленные как Private, не отображаются в диалоговом окне Мастер функций.
Функцию можно вызвать одним из следующих способов:
– вызвать ее из другой процедуры;
– включить ее в формулу рабочего листа;
– включить в формулу условного форматирования;
– вызвать ее в окне отладки VBE (Immediate). Этот метод обычно применяется на этапе тестирования (рис. 8).
Рис. 8. Вызов функции в окне отладки
В отличие от процедур, функции не отображаются в диалоговом окне Макрос (меню Разработчик –> Код –> Макросы; или Alt+F8).[17]
Аргументы могут представляться переменными (в том числе массивами), константами, символьными данными или выражениями. Некоторые функции не имеют аргументов. Функции имеют как обязательные, так и необязательные аргументы.
В Excel есть несколько встроенных функций, не имеющих аргументов, например, СЛЧИС, СЕГОДНЯ, ТДАТА. Несложно создать аналогичные пользовательские функции. Например:
Function User()
' Возвращает имя пользователя
User = Application.UserName
End Function
При вводе формулы =User() ячейка возвращает имя текущего пользователя.
Пользовательские функции ведут себя подобно встроенным функциям Excel. Обычно пользовательская функция пересчитывается тогда, когда это нужно, т.е. в случае изменения одного из аргументов функции. Однако можно выполнять пересчет функций чаще. Функция пересчитывается при изменении любой ячейки, если в процедуру добавлен оператор Application.Volatile True.