
- •Содержание
- •Введение
- •1 Алгоритм и его свойства
- •2 Основные понятия VBA. Линейные алгоритмы
- •2.1 Элементы языка VBA
- •2.2 Типы данных VBA
- •2.3 Константы VBA
- •2.4 Переменные VBA
- •2.5 Выражения в VBA
- •2.6 Встроенные функции VBA
- •2.7 Оператор присваивания
- •3 Разветвляющиеся алгоритмы
- •3.1 Оператор IF и его формы записи
- •3.2 Типовые задачи разветвляющихся алгоритмов
- •4 Циклические алгоритмы
- •4.1 Оператор цикла For
- •Оператор цикла For Each
- •4.2 Оператор цикла Do
- •4.3 Вложенные циклы
- •5 Обработка массивов данных
- •5.1 Ввод-вывод массивов
- •Расположение данных в файле "dat.txt"
- •Расположение данных в файле "res.txt"
- •5.2 Программирование обработки одномерных массивов
- •5.3 Программирование обработки двумерных массивов
- •6.1 Лабораторная работа №1
- •6.2 Задание к расчетно-графической работе №1
- •6.3 Лабораторная работа №2
- •Обработка массивов данных на VBA
- •6.4 Задание к расчетно-графической работе №2
- •ЛИТЕРАТУРА
- •Окно проекта
- •Главное меню
- •Интеллектуальные возможности редактора кода
- •Операции сравнения
- •Конкатенация строк
- •Логические операторы VBA
- •Приоритеты выполнения операций при вычислении сложных выражений
- •Операторы пересчета
Приведенные примеры показали большое многообразие форм записи программ, имеющих блоки сравнения. На первых порах это может вызвать затруднения, поэтому авторы рекомендуют выбрать форма записи структурного оператора If в общем виде и использовать только ее при написании программ. По мере накопления навыков в программировании появится желание использовать более компактные формы записи.
3.2 Типовые задачи разветвляющихся алгоритмов
При рассмотрении задач на разветвления, как правило, рассматривают три типа задач:
1)вычисляемая функция задана формулой с указанием условий;
2)вычисляемая функция задана формулой, где присутствуют функции max и min;
3)функция задана графически – необходимо уметь рассчитывать ее числовые значения для заданного аргумента.
Очевидно, что в практике программирования могут встретиться задачи и смешанного типа.
Задачи первого типа, как правило, решаются с применением структурного оператора If общего вида. Если условий больше трех, то используют вложенные структурные операторы If, либо оператор вида
If-ElseIf. |
|
|
Вариант 1 |
|
Вариант 2 |
If условие_1 Then |
|
If условие_1 Then |
операторы условия_1 |
|
операторы условия_1 |
Else |
|
ElseIf условие_ 2 Then |
If условие_2 Then |
или |
операторы условия_2 |
операторы условия_2 |
|
Else |
Else |
|
операторы условия_3 |
операторы условия_3 |
|
End If |
End If |
|
|
End If |
|
|
43

Если условие_1 справедливо, то выполняются действия для этого условия. После того как эти действия выполнятся, управление будет передано: в первом варианте - оператору, стоящему за вторым оператором End If, а во втором варианте - оператору, стоящем за оператором End If, который в этой конструкции записывается один раз. Если же условие_1 ложно, то происходит проверка условия_2, находящегося во вложенном условном операторе If после служебного слова Else, для первого варианта, или после служебного слова ElseIf для второго варианта. Если условие_2 истинно, то выполняются действия для этого условия, если же результат условия_2 «ложь», то выполняются действия последнего условия 3. После этого, и в том и в другом случае, выполняется оператор, следующий за оператором End If. В о ператоре вида If-ElseIf конструкции ElseIf могут повторяться необходимое количество раз, при этом оператор End If записывается только один раз. При использовании вложенных структурных операторов If каждый из них закрывается своим оператором End If.
Пример 3.2. Составить фрагмент программы для вычисления
|
3 |
|
при x > 0 |
|
Log2 x, |
||||
функции Y = |
|
|
|
|
(1+ x2 ) , |
при x ≤ 0 |
|||
|
||||
|
|
|
|
Программа для вычисления такой функции может быть следую-
щей:
. . .
If x>0 Then
y= ( Log(x)/Log(2) )^3
Else
y= sqr (1+x^2)
EndIf
. . .
В связи с тем, что значение (1+ x2 ) может быть вычислено при любом значении аргумента x, для записи этого фрагмента программы
44

можно использовать обычный оператор If. Программу с таким оператором можно записать так:
. . .
y= sqr (1+x^2)
If x>0 Then y= ( Log(x)/Log(2) )^3
. . .
Пример 3.3. Составить фрагмент программы для вычисления
|
|
|
|
|
|
|
x, |
|
|
если |
x >1 |
||
|
|
|
||||
функции Y = ln(2 − x), если −1 < x ≤1 |
||||||
|
e |
x |
, |
если |
x ≤ −1 |
|
|
|
Для этой функции может быть предложено 3 варианта программ: со структурными операторами If, с оператором If-ElseIf и с упрощенной формой оператора If.
Вариант про- |
Вариант |
програм- |
Вариант программы с упрощен- |
граммы с вло- |
мы с оператором |
ными операторами If |
|
женными |
If |
вида |
|
структурными |
If-Else |
|
|
операторами If |
|
|
|
If x>1 Then |
If x>1 Then |
y= exp(x) |
|
y= sqr (x) |
y= sqr (x) |
If x>1 Then y= sqr (x) |
|
Else |
ElseIf x<=-1 Then |
If x>-1 And x<=1 Then y=Log(2-x) |
|
If x<=-1 Then |
y=exp(x) |
|
|
y=exp(x) |
Else |
|
|
Else |
y=Log(2-x) |
|
|
y=Log(2-x) |
End If |
|
|
End If |
|
|
|
End If |
|
|
|
При программировании задачи с разветвлениями второго типа для вычисления функций max и min следует записать формулу с условиями, например
45
a, еслиa >b z= max(a,b)=
b, еслиa ≤b
Фрагменты задач программирования таких функции рассмотрены выше. Для вычисления максимального или минимального значения функций, содержащих три и более параметров, можно использовать эти же фрагменты программ, с учетом следующих преобразований:
z= max(a,b,c)= max( max(a,b) , с )
Таким образом, для вычисления функции max(a,b,c) можно реализовать два варианта программ: с структурным оператором If и с оператором If упрощенной формы:
Вариант 1 |
Вариант 2 |
|
|
If a>b Then |
z=a |
z=a |
If z<b Then z=b |
Else |
If z<c Then z=c |
z=b |
|
End If |
|
If z<c Then |
|
z=c |
|
End If |
|
C использованием функции IIf фрагмент вычисления минимального значения трех переменных можно записать так
z= IIf( a<b, a, b) z= IIf( z>c, z, c)
VBA предоставляет программисту возможность использования функций вычисления максимальных и минимальных значений из набора функций Excel
application.min ( a ,b [,c [,d . . .]] ) и application.max ( a,b,[,c [,d . . .]] )
Задача предыдущего примера может быть решена одним оператором
46

z= application.min ( a ,b , c )
В задачах на разветвления третьего типа, когда условие задано в виде графической функции, необходимо выполнить следующие действия:
-записать на изображении функции математические зависимости для отдельных элементов;
-записать математическую формулу для решения поставленной задачи.
Пример 3.4. Для заданных координат точки x,y определить номер области, изображенной на рисунке 3.2, в которую она попала.
Рисунок 3.2 - Обозначение областей рисунка
Предварительные действия. Запишем на рисунке с заданием математические формулы граничных линий: окружность и две прямые (см. рисунок3.3).
Рисунок 3.3 - Формулы для граничных линий
47
Создадим формулу для определения номера области по заданным координатам x,y. При создании формулы для области следует записать уравнения всех её граничных линий, но знак равенства заменить знаками «больше» или «меньше». Область с наиболее сложными границами можно не описывать уравнениями, а оставлять последним действием в блоке сравнения. В нашем примере, очевидно, это область с номером 2.
0,
n = 1,
еслиx2 + y2 > 4
еслиx2 + y2 < 4 и y > −x и y > x 2, в остальныхслучаях
После записи формулы для «грубого» определения попадания точки в ту или иную область, следует решить вопрос: какое значение надо присвоить переменной n, если точка попала на границу области. В данном примере принимается решение: граница относится к области с большим номером. Поэтому в приведенную выше формулу надо добавить знак равенства лишь в уравнение окружности, определяющую границу области 1, т.к. именно по этой линии разделяются области 1 и 0. Границы, образованные прямыми линиями, должны быть отнесены к области с номером 2, поэтому в описании области 1 должно быть строгое «больше».
|
еслиx |
2 |
+ y |
2 |
> 4 |
||
0, |
|
|
|||||
n = |
еслиx |
2 |
+ y |
2 |
≤ 4 и y > −x и y > x |
||
1, |
|
|
|||||
|
2, |
|
в остальныхслучаях |
||||
|
|
Немаловажным вопросом при составлении программы является задача ее тестирования и описания входных и выходных данных. Подготовка тестовых данных на этапе постановки задачи позволяет программисту глубже понять особенности программируемой задачи. Для проведения полного цикла тестирования рассматриваемой задачи необходимо задать координаты точек во всех областях, а затем про-
48

верить попадание точки на границы областей. Примерное положение точек для тестирования данной задачи приведено на рисунке 3.4.
Рисунок 3.4 - Положение точек для тестирования программы
Наиболее удобным способом ввода данных для отладки программы можно считать ввод данных из текстового файла или ввод данных с активного листа рабочей книги Excel. Это связано с тем, что при обнаружении и исправлении любой, даже незначительной, ошибки в программе, последующее тестирование следует провести в полном объеме. В последующем операции ввода-вывода можно заменить на ввод и вывод данных в диалоговое окно Excel.
При составлении программы тестовые данные будем считывать из таблицы Excel и помещать результат в соседнюю колонку этой же таблицы. Координаты точек зададим в первых двух столбцах листа Excel, в третий столбец поместим значение ожидаемого результата, а
вчетвертый – полученный результат. Очевидно, что если в значения
встолбцах «С» и «D» будут различны, то в программе имеется ошибка, которую следует найти, либо при создании тестовых данных программист сам неправильно решил задачу. Тестовые данные для отладки рассматриваемой задачи могут иметь значения представленные
втаблице 3.4.
49
Таблице 3.4 – таблица с числовыми данными для отладки программы
№ строки |
Столбец «А» |
Столбец «В» |
Столбец «C» |
Столбец «D» |
|
|
|
|
|
1. |
Координата |
Координата |
Ожидаемый |
Полученный |
|
|
|
|
|
2. |
X |
Y |
результат |
результат |
|
|
|
|
|
3. |
1,5 |
0,7 |
2 |
|
|
|
|
|
|
4. |
0,7 |
0,4 |
2 |
|
|
|
|
|
|
5. |
-0,3 |
-1,3 |
2 |
|
|
|
|
|
|
6. |
-1,8 |
0,2 |
2 |
|
|
|
|
|
|
7. |
-0,8 |
1,3 |
1 |
|
|
|
|
|
|
8. |
0,9 |
1,6 |
1 |
|
|
|
|
|
|
9. |
1,9 |
1,7 |
0 |
|
|
|
|
|
|
10. |
2,0 |
-1,8 |
0 |
|
|
|
|
|
|
11. |
-2 |
-1,5 |
0 |
|
|
|
|
|
|
12. |
-1,1 |
2,0 |
0 |
|
|
|
|
|
|
13. |
2,0 |
0 |
2 |
|
|
|
|
|
|
14. |
0 |
-2 |
2 |
|
|
|
|
|
|
15. |
0 |
0 |
2 |
|
|
|
|
|
|
16. |
-1 |
1 |
2 |
|
|
|
|
|
|
17. |
0,5 |
0,5 |
2 |
|
|
|
|
|
|
18. |
0 |
2 |
1 |
|
|
|
|
|
|
В приведенном ниже варианте программы используется опера- |
||||
тор сравнения вида If-ElseIf. |
|
|
||
Option Explicit ' запрет на использование в |
|
|||
|
' программе необъявленных переменных |
|
Sub Пример_3_4()
Dim x As Single, y As Single, n As Integer, i As Integer
i = 3 ' переменная i определяет номер строки в таблице Excel 10 x = Cells(i, 1) ' считываем из i-ой строки
y = Cells(i, 2) ' координаты x и y
' вычисление по формуле значения n
If x ^ 2 + y ^ 2 > 4 Then
50
n = 0
ElseIf y > -x And y > x Then n = 1
Else n = 2
End If
Cells(i, 4) = n ' выводим полученный результат в таблицу
i = i + 1 ' переходим на следующую строку таблицы
If Cells(i, 1) <> Empty Then GoTo 10 ' если в новой строке есть
' данные, то выполнить обработку новой строки
End Sub
Можно предложить вариант этой же программы с вводом и выводом данных из диалогового окна. В ней вычисление формулы реализовано с упрощенным вариантом оператора If исключительно в учебных целях.
Option Explicit ' запрет на использование в
' программе н объявленных переменных
Sub Пример_3_4()
Dim x As Single, y As Single, n As Integer, k As Integer
'считываем из диалогово окна координаты x и y
10 x = CSng(InputBox("Задайте координату X")) y = CSng(InputBox("Задайте координату Y"))
'функция Csng переводит строку текста в числ, и требует,
'в качестве разделителя дробной и целой части числа,
'символа "запятая"
' вычисление значения n по формуле с упрощенным оператором If n = 2
If y > -x And y > x Then n = 1
If x ^ 2 + y ^ 2 > 4 Then n = 0
51
'выводим полученный результат в диалоговое окно с заголовком
'"Ответ" и двумя световыми кнопками - "Повтор" и "Отмена" k = MsgBox("Номер области" & Str(n), vbRetryCancel, "Ответ")
'анализируем код нажатой кнопки
If k = vbRetry Then GoTo 10
'если нажата кнопка "Повтор" - ' продолжить работу.
'если нажата кнопка "Отмена" - завершаем работу программы
End Sub
52