Лекции.ИНФО


Использование именованных аргументов



 

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

Myfunc Age:= 25, Name:= «Alex», Newdate:= DateOfArrival

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

Sub ProcEx(Name As String, Optional Age As Integer, Optional City = «Москва»)

Список ее аргументов включает один обязательный аргумент Name и два необязательных: Age и City, – причем для последнего задано значение по умолчанию «Москва». Если при вызове этой процедуры второй аргумент не требуется, то при вызове, не использующем именованных параметров, сам параметр опускается, но, выделяющая его запятая, должна оставаться:

ProcEx «Оля»,,»Тверь»

Вместо этого можно использовать вызов с именами аргументов:

ProcEx City:=«Тверь», Name:=«Оля»

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

ProcEx Name:=«Оля»

в качестве значения аргумента Age в процедуру передастся 0, а в качестве аргумента City – явно заданное по умолчанию значение «Москва».

Чтобы процедура «узнала», что ей при вызове передан необязательный аргумент, можно воспользоваться функцией IsMissing. Она по имени аргумента возвращает логическое значение True, когда значение аргумента не передано в процедуру, и False, если аргумент задан. Это применимо только в том случае, если параметр имеет тип Variant. Для всех остальных типов данных полагается, что в процедуру всегда передано значение параметра, явно или неявно заданное по умолчанию. Поэтому, если такая проверка необходима, то параметр должен иметь тип Variant. Для массива аргументов ParamArray функция IsMissing всегда возвращает False, и для установления его пустоты нужно проверять, что верхняя граница индекса меньше нижней.

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

Function TwoArgs(I As Integer, Optional X As Variant) As VariantIf IsMissing(X) Then' если 2-ой аргумент отсутствует, то вернуть 1-ый.TwoArgs = IElse' если 2-ой аргумент есть, то вернуть их произведениеTwoArgs = I*XEnd IfEnd Function

Вот результаты нескольких вызовов этой функции в окне отладки:

? TwoArgs(5,7)35 ? TwoArgs(5.5)6 ? TwoArgs(5, 5.5)27,5 ? TwoArgs(5, «6»)30

 

Аргументы, являющиеся массивами

 

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

Public Function ScalarProduct(X() As Integer, Y() As Integer) As Integer'Вычисляет скалярное произведение двух векторов.'Предполагается, что границы массивов совпадают.Dim i As Integer, Sum As IntegerSum = 0For i = LBound(X) To UBound(X)Sum = Sum+X(i)*Y(i)Next iScalarProduct = SumEnd Function

Оба параметра процедуры, передаваемые по ссылке, являются массивами, работа с которыми в теле процедуры не представляет затруднений, благодаря тому, что функции LBound и UBound позволяют установить границы массива по любому измерению. Приведем программу, в которой вызывается функция ScalarProduct:

Public Sub TestScalarProduct()Dim A(1 To 5) As IntegerDim B(1 To 5) As IntegerDim C As VariantDim Res As IntegerDim i As IntegerC = Array(1, 2, 3, 4, 5)For i = 1 To 5A(i) = C(i-1)Next iC = Array(5, 4, 3, 2, 1)For i = 1 To 5B(i) = C(i-1)Next iRes = ScalarProduct(A, B)Debug.Print ResEnd Sub

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

 

Чем отличается процедура типа «Sub» от процедуры типа «Function»?

Что обозначают ключевые слова ByVal и ByRef при описании процедур?

Что обозначает ключевое слово Optional при описании процедур?

Функции с побочным эффектом.

Создание новой процедуры.

Вызов процедуры типа «Sub».

Вызов процедуры типа «Function».

Использование именованных аргументов.

Как использовать аргументы, являющиеся массивами?

 

 

ВАРИАНТЫ ЗАДАНИЙ

 

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

1. Известен список фамилий и рост учеников класса. Напечатать в порядке возрастания роста список детей, используя метод шейкер – сортировки.

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

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

4. Известен список студентов группы и количество пропущенных часов каждым из студентов. Напечатать список студентов в порядке возрастания количества пропущенных часов (если пропуски имеют место), используя сортировку прямыми включениями.

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

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

7. Задан числовой массив, состоящий из J элементов. Напечатать отрицательные числа в порядке возрастания по модулю, используя шейкер – сортировку.

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

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

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

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

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

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

14. Известен список фамилий и рост учеников класса. Напечатать в порядке возрастания тех, чей рост больше 160 см, используя сортировку прямого обмена.

 

 

СПИСОК ЛИТЕРАТУРЫ

1. Информатика: Базовый курс : учеб. пособие для студентов втузов / под ред. С. В. Симоновича. – Санкт-Петербург.: Питер, 2010. – 640 с.

2. Таганов, Л. С. Информатика [Электронный ресурс] : учеб. пособие для студентов техн. специальностей и направлений / Л. С. Таганов, А. Г. Пимонов; ГОУ ВПО «Кузбас. гос. техн. ун-т». – Кемерово, 2010. – 330 с.

3. Попов, А. М. Информатика и математика: учеб. пособие для студентов вузов, обучающихся по специальности "Юриспруденция" (030501) / А. М. Попов, В. Н. Сотников, Е. И. Ногаева; под ред. А. М. Попова – М.: ЮНИТИ-ДАНА, 2008. – 303 с. http:// www.iqlib.ru

 

Лабораторная работа № 7
Работа со строковыми данными

 

ЦЕЛЬ РАБОТЫ

 

Изучение синтаксиса стандартных строковых процедур и функций, встроенных в язык программирования высокого уровня Visual Basic for Applications (VBA), получение навыков применения строковых процедур и функций в программах пользователя при работе с данными строкового типа.

 

ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

 

Общие положения

 

VBA – великолепное сочетание одного из самых простых языков программирования BASIC со специальным механизмом, позволяющим программам, написанным на этом языке, обращаться к объектам всех основных приложений Microsoft Office — Excel, Word, Power Point, Access и прочих.

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

VBA поддерживает важнейшие современные концепции разработки программных систем — объектно-ориентированное и событийно-управляемое программирование, а также важнейшие технологии – поддержку элементов управления на базе ActiveX, интеграцию с базами данных, системами электронной почты и Интернетом.

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

Данные в VBA характеризуются своими типами, которые определяют:

- формат представления данных в памяти компьютера;

- область возможных значений;

- множество допустимых операций, применимых к данным.

В свою очередь типы данных делятся на простые (встроенные и определяемые) и на структурные.

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

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

При объявлении переменной определяется ее тип и область видимости – область, где имя переменной видимо и, значит, возможен доступ к её значению. Переменные можно объявлять на двух уровнях – уровне процедуры и уровне модуля. Для объявления переменных используются операторы Dim, Public, Private и Static. Первый можно использовать на обоих уровнях, Public и Private – на уровне модуля, Static – только на уровне процедуры.

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

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

· на все процедуры одного модуля, в котором они объявлены; такие глобальные переменные, называемые закрытыми (Private), должны быть объявлены на уровне модуля либо оператором Private либо оператором Dim;

· на все приложение – все процедуры всех модулей данного приложения, такие глобальные переменные, называемые открытыми, должны быть объявлены оператором Public.

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

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

· 0 – для числовых значений;

· пустая строка (««) – для строк переменной длины;

· строка, содержащая нули, – для строк фиксированной длины;

· Empty (значение, указывающее на отсутствие инициализации) ‑ для статических переменных типа Variant;

· для массивов каждый элемент инициализируется в соответствии с указанными правилами.

Объявление простых переменных имеет следующий синтаксис: {Dim | Private | Public | Static }<имя переменной> [ As <имя типа>] [, <имя переменной> [ As <имя типа>]];

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

 

Строковый тип данных String

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

Строка как переменная может иметь переменную или постоянную длину.

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

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

Пример:

Dim A As String

Dim B As String*15

A = «Информатика»

В = «Информатика»

В примере переменная А – строка переменной длины, переменная В – строка постоянной длины. После выполнения оператора А = «Информатика» строка А занимает 21 байт, так как размер строки переменной длины равен 10 байт плюс 1 байт на символ. После выполнения оператора В = «Информатика» строка В будет занимать 15 байт, так как объём оперативной памяти, занимаемый строкой постоянной длины не зависит от количества содержащихся в ней символов.

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

Работа с переменными строкового типа.
Операции над строками

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

Для объединения двух и более строк используется символ «&» (амперсанд) или «+» (сложение). Результатом объединения строк является строка.

 

Пример 1:

Sub строки1()

Dim A As String

Dim B As String

Dim C As String

A=«Строковая»

В=«переменная»

С=A & B 'Результат: С = «Строковая переменная»

С=А + «переменная» 'Результат: С = «Строковая переменная»

End Sub

Первый комментарий соответствует случаю, когда при пошаговом выполнении программы жёлтым выделен оператор С=A & B. Этот комментарий означает следующее: если указатель мышки подвести к С, то высветится С = «Строковая переменная» – результат выполнения оператора, находящегося в одной строке с комментарием.

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

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

Благодаря операции объединения строк, строку можно рассматривать как выражение, аналогичное арифметическим и логическим выражениям

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

В языке VBA имеется набор стандартных (встроенных) функций для работы со строковыми данными.

 









Читайте также:

Последнее изменение этой страницы: 2016-03-22; Просмотров: 123;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная