Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



Пример 1:

Вычислить значения Y=sin(x)+ex для всех значений хÎ [a, b]

 

· Программный код с использованием оператора Do While

 

Public Sub Операторы_повтора1()

 

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

 

a = Worksheets(1).Range(" b1" )

b = Worksheets(1).Range(" b2" )

hx = Worksheets(1).Range(" b3" )

 

Worksheets(1).Range(" a4" ) = " Результат"

x = a: i = 5

Do While x < = b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = " x[" & i & " ]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = " y[" & i & " ]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

 

End Sub

 

· Программный код с использованием оператора While

 

Public Sub Операторы_повтора2()

 

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

 

a = Worksheets(1).Range(" b1" )

b = Worksheets(1).Range(" b2" )

hx = Worksheets(1).Range(" b3" )

 

Worksheets(1).Range(" a4" ) = " Результат"

x = a: i = 5

While x < = b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = " x[" & i & " ]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = " y[" & i & " ]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Wend

 

End Sub

 

 

· Программный код с использованием оператора Do Until

 

Public Sub Операторы_повтора3()

 

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

 

a = Worksheets(1).Range(" b1" )

b = Worksheets(1).Range(" b2" )

hx = Worksheets(1).Range(" b3" )

 

Worksheets(1).Range(" a4" ) = " Результат"

x = a: i = 5

Do Until x > = b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = " x[" & i & " ]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = " y[" & i & " ]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

 

End Sub

 

· Программный код с использованием оператора Do … Loop While

 

Public Sub Операторы_повтора4()

 

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

 

a = Worksheets(1).Range(" b1" )

b = Worksheets(1).Range(" b2" )

hx = Worksheets(1).Range(" b3" )

 

Worksheets(1).Range(" a4" ) = " Результат"

x = a: i = 5

Do

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = " x[" & i & " ]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = " y[" & i & " ]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop While x < = b

 

End Sub

 

Пример 2

Рассортировать по убыванию одномерный массив, содержащий 10 вещественных элементов.

Текст программы приведен ниже

 

Public Sub Сортировка()

Dim a(1 To 10) As Double

Dim i As Integer, i1 As Integer

Dim n As Integer, imax As Integer

Dim j As Integer

Dim max As Double

Worksheets(1).Range(" a1" ) = " Исходный массив"

n = 10

j = 2

For i = 1 To n

a(i) = Worksheets(1).Cells(j, 1)

j = j + 1

Next i

i1 = 1

Do While i1 < = n - 1

max = a(i1)

imax = i1

For i = i1 To n

If a(i) > max Then

imax = i: max = a(i)

End If

Next i

a(imax) = a(i1)

a(i1) = max

i1 = i1 + 1

Loop

Worksheets(1).Range(" c1" ) = " Рассортированный массив"

j = 2

For i = 1 To n

Worksheets(1).Cells(j, 3) = a(i)

j = j + 1

Next i

End Sub

 

Пример 3

Вычислить . Вычисление суммы прекратить, когда при каком-то значении i, общий член ряда станет < =e

 

Текст программного кода будет выглядеть следующим оьразом

 

Public Sub Summa_ряда()

Const eps = 0.001

Dim sum As Double, ai As Double

Dim n As Integer, i As Integer

Dim j As Integer

Dim f1 As Integer, f2 As Integer

 

sum = 0

i = 1

ai = 1 / 2

Do Until ai < = eps

sum = sum + ai

i = i + 1

f1 = 1

For j = 1 To i

f1 = f1 * j

Next j

f2 = 1

For j = 1 To 2 * i

f2 = f2 * j

Next j

ai = f1 / f2

Loop

MsgBox " Значение i=" & i & Chr(10) & _

" Значение ai=" & ai & Chr(13) & _

" Значение Sum=" & sum

End Sub

 

Пользовательские подпрограммы

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

В VBA существуют два типа подпрограмм:

· Подпрограммы-процедуры (процедуры).

· Подпрограммы-функции (функции)

 

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

Синтаксис описания:

[Private ½ Public] Sub < имя процедуры> ([< список параметров> ])

< операторы>

[Exit Sub]

< операторы >

End Sub

Здесь:

· Private – ключевое слово, указывающее на то, что процедура доступна для всех процедур в данном модуле и недоступна процедурам, находящимся в других модулях.

· Public - ключевое слово, указывающее на то, что процедура доступна во всех модулях проекта. Эта область действия процедуры принята по умолчанию, поэтому использовать ключевое слово Publicпри объявлении процедуры не обязательно

· < имя процедуры> - Имя процедуры, которое удовлетворяет всем правилам создания идентификатора в VBA

· ([< список параметров> ]) – это список параметров, значения которых передаются в процедуру или возвращаются из процедуры. Разделителем в списке формальных параметров является запятая.

· < операторы> - группа инструкций, выполняемых в процедуре

· [Exit Sub] – оператор, приводящий к немедленному выходу из процедуры.

 

Вызов подпрограммы – процедуры пользователя из другой процедуры можно произвести несколькими способами:

· < имя процедуры> < список аргументов>

· Call < имя процедуры> < список аргументов>

Примечание:

< Список параметров> отличается от < списка аргументов> тем, что первый указывается при описании подпрограммы, второй – при ее вызове в основной программе.

 

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

Синтаксис описания:

[Private ½ Public] Function < имя функции> ([< список параметров> ]) [As< тип функции> ]

< операторы>

[Exit Function]

< операторы >

< имя функции> = < выражение>

End Function

Здесь:

· < имя функции> - Имя функции, которое удовлетворяет всем правилам создания идентификатора в VBA

· ([< список параметров> ])- список параметров, который описывает передаваемые функции данные

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

Примечание:

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

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

 

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

< Список параметров> отличается от < списка аргументов> тем, что первый указывается при описании подпрограммы, второй – при ее вызове в основной программе.

 

< Список параметров> позволяет передать в подпрограмму требуемые значения из вызывающей программы и имеет следующий синтаксис:

Синтаксис:

[ByRef | ByVal] < имя параметра1> [As < Тип> ], [ByRef | ByVal] < имя параметра2> [As < Тип> ], [ByRef | ByVal] < имя параметра3> [As< Тип> ], …

Здесь:

< Тип> позволяет явно задать тип передаваемых значений. Если тип опущен, то по умолчанию принимает значение Variant.

 

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

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

 

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

В < Списке аргументов> аргументы перечисляется через запятую.

 

Соответствие между списком параметров и списком аргументов:

· Количество и типы в списке параметров и в списке аргументов должны соответствовать друг другу.

· Аргументы, соответствующие параметрам с ключевым словом ByValмогут быть константами, переменными и выражениями.

· Аргументы, сответсвующие параметрам с ключевывым словом ByRef (или по умолчанию), должны быть переменными.

 

Для выхода из подпрограммы и возврата в основную программу, опуская оставшиеся операторы, используется Exit Sub(в процедурах) и Exit Function (в функциях).

 

Примеры:

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

С помощью процедуры:

Sub Sgure(ByVal a As Long, ByVal b As Long, ByRef ss As Long)

ss = a * b

End Sub

 

Public Sub Test_sub()

Dim a As Long

Dim b As Long

Dim s As Long

b = 2

'Sgure 5, b, s

Call Sgure(5, b, s)

MsgBox " s=" & s

End Sub

 

С помощью функции:

Function SgureF(ByVal a As Long, ByVal b As Long) As Long

SgureF = a * b

End Function

 

Public Sub Test_Function()

Dim a As Long

Dim b As Long

Dim s As Long

b = 2

s = SgureF(5, b)

MsgBox " s=" & s

End Sub

 

Пример 2. Показывает отличие передачи параметра по ссылке от передачи параметра по значению.

Sub DemoByValByRef(ByVal a, b, ByRef c)

'a - передается по значению

'b - передается по умолчанию

' по ссылке (ByRef)

' c - передается по ссылке

a = a + 1

b = b + a

c = c + a

End Sub

 

 

Public Sub Test()

a = 1

b = 10

c = 100

DemoByValByRef a, b, c

MsgBox " a=" & a ‘ a=1

MsgBox " b=" & b ‘ b=12

MsgBox " c=" & c ‘ c=102

End Sub

 

Пример 3

Вычислить . Вычисление суммы прекратить, когда при каком-то значении i, общий член ряда станет < =e

 

Текст программного кода будет выглядеть следующим образом

 

Public Sub Summa_ряда()

Const eps = 0.001

Dim sum As Double, ai As Double

Dim n As Integer, i As Integer

sum = 0

i = 1

ai = 1 / 2

Do Until ai < = eps

sum = sum + ai

i = i + 1

ai = Factor(i) / Factor(2 * i)

Loop

MsgBox " Значение i=" & i & Chr(10) & _

" Значение ai=" & ai & Chr(13) & _

" Значение Sum=" & sum

End Sub

 

 

Function Factor(n As Integer) As Long

Factor = 1

For i = 1 To n

Factor = Factor * i

Next i

End Function


 

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-11; Просмотров: 611; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.064 с.)
Главная | Случайная страница | Обратная связь