Файл: Е. А. Рябухина, О. А. Гущина, Д. А. Губанов, Д. В. Емельянов.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 01.12.2023

Просмотров: 125

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Рис. 11. Блок-схема, соответствующая полной форме условного оператора с группировкой операторов, выполняемых при истинности и ложности условия
Для конструкции, представленной на рис. 11 условный оператор в полной форме имеет общий вид:

If Условие Then

Оператор1

Оператор2



ОператорN

Else

ОператорN+1

ОператорN+2



ОператорN+K

EndIf
Пример: вычисление двух средних арифметических при отсутствии нулевых значений функции

If F>0 Then

S1=S1+F

K1=K1+1

Else

S2=S2+F

K2=K2+1

EndIf


Рис. 12. Блок-схема, соответствующая полной форме условного оператора, в которой при ложности условия рассматриваются n-1 вложенный условный оператор
Для конструкции, представленной на рис. 12, используются два способа:

1. Вложенный условный оператор:

If Условие1

Then Оператор1

Else

If Условие2

Then Оператор2

Else



EndIf



EndIf
2. If Условие1 THEN Оператор1

If Условие2 THEN Оператор2



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

Пример:

If X<0

Then Y=-2*X

Else

If X<2

Then Y=X^2

Else Y=4

EndIf

EndIf
Более удобной является следующая форма:

If X<0 Then Y=-2*X

If X>=0 and X<=2 Then Y=X^2

IfX>2 ThenY=4
Для более сложных ветвлений можно использовать оператор Case, имеющий вид:

Select Case Выражение-

Case 1 Выражение1

(блок_операторов)

Case 2 Выражение2

(блок_операторов)



Case Else

(блок_операторов)

End Select
Пример:

Select Case X-

Case 1

MsgBox(“золотая медаль”)

Case 2

MsgBox(“серебряная медаль”)

Case 3

MsgBox(“бронзовая
медаль”)

Case Else

MsgBox(“без медали”)

End Select
15. Оператор безусловного перехода
Оператор безусловного перехода имеет вид:

GoTo M

и изменяет порядок выполнения операторов в процедуре или функции, осуществляя переход к строке с меткой M.

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

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

Следует отметить, что неоправданное применение оператора GoTo может значительно усложнить понимание программы.
16. Организация циклов в VBA
Для организации циклов в VBA используются несколько видов операторов цикла.



Рис. 13. Пример блок-схемы цикла с заранее определенным числом повторений
Для цикла с заранее определенным числом повторений, соответствующего алгоритмической конструкции на рис. 13. Удобнее всего использовать оператор For-Next, имеющий вид:

For V=A To B [Step H]

Тело цикла

NextV

здесь V– имя циклически изменяющейся переменной, A – начальное значение, B – конечное, H – шаг. Знак [ ] означает необязательный параметр, т.е. при отсутствии значения H этот параметр предполагается равным 1.

Пример: вывести на печать значения функции , при x изменяющемся от 2 до 8 с шагом 0,5.

K=1

For x=2 To 8 Step 0.5

F=x^2+x+1

CELLS(K,1)=FORMAT(F,”0.00”)

K=K+1

Nextx

Здесь переменная K означает номер строки в столбце Microsoft Excel и обеспечивает вывод значений функции в виде столбца.

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

  1. Do While-Loop (вариант Do Loop While);

  2. Do Until Loop (вариант Do Loop Until);

  3. While-Wend.



Оператор цикла DoWhile-Loop имеет следующую конструкцию:

DoWhile Условие

Тело цикла

{ExitDo}

Loop

Здесь знак { } означает необязательный параметр. При наличии оператора Exit Do происходит досрочный выход из цикла. Оператор действует следующим образом: сначала проверяется указанное условие, и в случае его выполнения выполняется тело цикла. Очевидно, что тело цикла должно включать оператор, задающий изменение параметра цикла. Как только условие перестает выполняться, происходит выход из цикла и переход к оператору, последующему за служебным словом Loop. Таким образом, возможна ситуация, что цикл не будет выполнен ни разу.

Пример (см. задачу о концентрации раствора):

T=0: M=1

Do While C>=CK

C=C0*EXP(-K*T)

CELLS(M,1)=C

M=M+1

T=T+1

Loop

Данный вариант программы является неправильным, потому что переменная С, не определенная перед циклом, по умолчанию примет значение 0. Таким образом, условие сразу же будет нарушено, и цикл не будет выполнен ни разу. Для исправления ситуации присвоим переменной С до оператора цикла произвольное значение, заведомо большее чем СK, которое все равно будет изменено сразу же в цикле, но даст возможность выполнить цикл должным образом.

Оператор цикла Do Until Loop имеет следующую конструкцию:

DoUntil Условие

Тело цикла

{ExitDo}

Loop

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

Если же использовать варианты операторов цикла DoLoopWhile и Do Loop Until, то цикл будет выполнен по крайней мере один раз, так как сначала выполняется тело цикла, а лишь затем проверяется условие. Таким образом, для нашей задачи более целесообразным будет использование конструкций

T=0: M=1

Do

C=C0*Exp(-K*T)

CELLS(M,1)=C

M=M+1

T=T+1

Loop While C>=CK

Или

Do

C=C0*EXP(-K*T)

CELLS(M,1)=C

M=M+1

T=T+1

LoopUntilC<CK
Для работы с массивами можно использовать оператор цикла
For Each...Next

Цикл For Each…Next не использует счетчик цикла. Цикл For Each…Next выполняется столько раз, сколько имеется элементов в определенной группе, например, в массиве.

Оператор имеет вид:

For Each Element As Type In Group

Тело цикла

NextElement

Здесь Element – переменная, используемая для итерации по всем элементам в определенной группе, Group – это объект коллекции или массив. Цикл For Each...Next всегда выполняется столько раз, сколько имеется элементов в определенной группе.

Пример:

Dim numbers() As Integer = {1, 4, 7}

Dim letters() As String = {"a", "b", "c"}

For Each number As Integer In numbers

For Each letter As String In letters

MsgBox(STR(number)& letter )

Next

Next

В результате получим набор текстовых констант “1a”,”1b”,…”7c”.
17. Массивы в VBA
Массивом называется набор данных одного типа, имеющий общее для всех его элементов имя. Каждый элемент в массиве имеет уникальный порядковый номер, или индекс. По умолчанию индекс имеет начальное значение 0, однако это значение можно изменить на 1.

Чаще всего используются одномерные и двумерные массивы(матрицы), однако. VBA позволяет создавать массивы, имеющие до 60 измерений.

Элемент одномерного массива обозначается V(k), двумерного – V(n,m). Здесь k– индекс элемента одномерного массива, n– номер строки, m– номер столбца, на пересечении которых находится элемент матрицы.

Внимание! В двумерных массивах всегда первое число обозначает строку, а второе – столбец!

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

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

Описание одномерного статического массива можно выполнить различными способами:

1. Dim V(n) As Type

Здесь V – имя массива, Type – тип элементов, n– максимальное значение индекса, причем индексация начинается с 0, таким образом, массив содержит
n+1 элемент.

2. Dim V(1 To n) As Type

В данном случае индексация массива начинается с 1, т.е. массив содержит nэлементов.

3. С помощью функции Array, определяющей сразу же значения элементов массива.

V=Array(v0, v1,…vk)

Здесь в скобках перечисляются значения элементов массива V. Следует отметить, что в этом случае индексация массива начинается с нуля, а сам массив имеет тип Variant.

Пример:

Dim A(7) As Byte, N(4,6) As single

В данном примере описан одномерный массив А, размерность которого начинается с нуля, содержащий 8 чисел типа Byte, и вещественная матрица N, состоящая из пяти строк и семи столбцов, индексация элементов которой начинается с нуля.

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

Dim V1(1 to N) As Type1, V2(1 to K, 1 to M) As type2,…

Здесь V1 – имя одномерного массива,V2 – имя матрицы, Type1 – тип элементов массива, Type2 – тип элементов матрицы, N – количество элементов в массиве, K – количество строк матрицы, M – количество столбцов матрицы.

Пример:

Dim X(1 to 50) As Integer, D(1 to 10, 1 to 15) As single

В приведенных выше примерах описаны статические массивы.

Пример:

A=Array(“A”,”B”,”C”)

P=A(1)

В результате получим P=”B.

В VBA существует полезная функция Array, позволяющая формировать массив с заданными элементами; при этом индексация начинается с нуля.

Пример:

А=Array(1, 2, 3)

В результате получим массив А, состоящий из трех элементов.

Следует отметить, что при применении к переменной А в данном примере функцию Vartype, то получим значение 8204, являющееся суммой двух чисел – 8192, означающего тип данных массив, и 12, представляющее собой тип Variant.

Для одномерных массивов используются функции Unound(V) и Lbound(V). Первая определяет максимальное значение индекса одномерного массива V, вторая – минимальное значение. Эти функции удобно использовать в подпрограммах, где в качестве параметров используются массивы различной длины.

Двумерные статические массивы описываются аналогично первому и второму способам:

  1. DimV(3,5) As Integer – описывается матрица, состоящая из 4 строк и 6 столбцов, все элементы которой являются целочисленными, индексация начинается с 0.

  2. DimV(1 to 4, 1 to 6) As Integer – описывается матрица той же размерности, но индексация начинается с 1.