Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция 4
ПРЕДОПРЕДЕЛЕННЫЕ ТИПЫ ПЕРЕМЕННЫХ
Инструкции управления процессом выполнения программы
Очень часто в процессе выполнения программы необходимо анализировать состояние тех или иных объектов или переменных и передавать управление отдельным фрагментам программы. Для этих целей служат инструкции управления. В предыдущей лекции рассмотрен пример кода, который позволяет выводить массив в строку или столбец на основе анализа состояния переключателей. Прежде всего, рассмотрим инструкции (операторы), позволяющие изменять ход выполнения программы.
1. Инструкции условного перехода
Условные инструкции проверяют является ли значение условия истинным (True) или ложным (False) и в зависимости от результата передают управление на выполнение одной из ветвей программы. Обычно условие представляет собой логическое выражение, которое содержит оператор сравнения для сопоставления одной части выражения с другой. Могут применяться несколько видов инструкций управления:
If... Then... Else
Select Case
Go to.
1.1. Инструкция If... Then... Else
Условный оператор If...Then...Else выполняет определённые инструкции или наборы инструкций в зависимости от значения заданных условий. Может применяться несколько форм этой инструкции. Различают простой и блочный операторы IF. Строчный оператор используется в том случае, когда при разветвлении программы необходимо на каждой ветке выполнить по одной инструкции, а блочный необходим тогда, когда инструкций несколько.
В простейшем виде инструкция If имеет следующий синтаксис (строчный опертор If), т.е. правилj записи:
If условие Then [инструкция1] [Else [инструкция.2] ].
Обязательный параметр условие представляет собой логическое выражение, которое возвращает значение (истина) True или (ложь) False. Если условие равно True, то выполняется инструкция1, если условие равно False, то инструкция2. Далее выполняется, если иное не предусмотрено программой в инструкциях 1 или 2, инструкция, следующая по порядку за строкой с инструкцией IF...Then...Else.
Часть оператора IF, а именно ключевое слово ELSE и следующие за ним инструкции можно опустить, тогда при условии равном False выполняется оператор, следующий за строкой с инструкцией IF. В этом случае инструкция IF выглядит так:
IF условие THEN [инструкция]
Примечание. В квадратных скобках обозначены те элементы инструкции, которые не являются обязательными для записи.
Пример:
IF Weather = "дождь" Then MsgBox "Взять зонт" Else MsgBox "He брать зонт"
MsgBox "Идти на работу"
В этом примере при условии, когда переменная Weather принимает значение «дождь», возвращается значение True и выполняется инструкция после ключевого слова THEN, т.е. на экран выводится сообщение о том, что надо взять зонт. Затем выполняется инструкция, следующая за инструкцией IF — на экран выводится указание «идти на работу». В случае отсутствия дождя на экран выводятся одно за другим сообщения «Не брать зонт» и «Идти на работу».
Инструкция If...Then...Else выполняет определенные инструкции или наборы инструкций в зависимости от значения условия. Допускаются многократно вложенные инструкции If...Then...Else, имеющие столько уровней вложения, сколько потребуется. Однако для облегчения чтения программы вместо многократно вложенных инструкций If...Then...Else иногда предпочтительнее использовать инструкцию Select Case.
В реальных случаях часто требуется обработка нескольких инструкций при выполнении условия. В этих случаях предпочтительнее блочный вид инструкции IF, синтаксис которой выглядит следующим образом:
IF условие Then
[Блок инструкций]
[ Else
[ Блок инструкций ]
End IF
Блочная структура If удобнее, так как каждый блок инструкций может включать в себя произвольное число утверждений. Кроме того, допускается вложение структур If.
Пример программы с блочной структурой If, здесь один оператор If вложен в другой (важно соблюдать, чтобы не было взаимного пересечения):
If D=0 Then
MsgBox "Дискриминант равен 0, один корень уравнения" X=В/2*А
Else
If D<0 Then 'вложенный оператор
MsgBox "Дискриминант меньше '0, действительных корней уравнения нет"
Else
MsgBox "Дискриминант больше 0, корней уравнения два" X(1)=(-B+SQRT(D))/2*A
X(2) = (-B-SQRT(D) )/2*A
End if 'конечная строка вложенного оператора End if
Эту же задачу можно решить с помощью инструкции Elself, синтаксис которой записывается следующим образом:
IF условие Then
[Блок инструкций]
[Elself условие-1 Then
[Блок инструкций Elself для условия 1]]
[Elself условие~n Then
[Блок инструкций Elself для условия n]] [Else
[Блок инструкций Else для главного условия] End IF
Предыдущий пример в этом случае может бать записан так:
If D=0 Then
MsgBox "Дискриминант равен 0, один корень уравнения"
Х=-В/2*А
Elself D<0 Then
MsgBox "Дискриминант меньше 0, действительных корней уравнения нет"
Else
MsgBox "Дискриминант больше 0, корней уравнения два"
X(1)=(-B+SQRT(D))/2*A
X(2)=(-B-SQRT(D))/2*А
End if
При этом каждая последующая проверка Elself выполняется в том случае, когда предыдущая закончена с результатом False (ложь).
Примечание. 1. В блочной структуре инструкции в строке после ключевого слова Then не пишется ничего, иначе интерпретатор распознает структуру If как строчную и воспримет остальные строки как ошибочные. 2. В блочной структуре каждой инструкции If должна соответствовать своя инструкция End If.
Инструкция If...Then...Else используется также для задания двух блоков исполняемых инструкций: один блок выполняется, если условие имеет значение True, а другой - если оно имеет значение False.
Sub AlertUser(value as Long)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
Else
AlertLabel.Forecolor = vbBlack
AlertLabel.Font.Bold = False
AlertLabel.Font.Italic = False
End If
End Sub
2. Логические выражения и операторы
В условных операторах критерием передачи управления служит условие. Для конструирования условий могут применяться логические операторы и операции сравнения. Логическое выражение имеет тип Boolean и может принимать одно из двух значений: True (Истина) или False (Ложь). Логические выражения можно присваивать логическим переменным, имеющим такой же тип. В VBA используются следующие логические операции:
OR
Логическое сложение (ИЛИ).
AND
Логическое сложение (И).
NOT
Логическое отрицание (НЕ).
XOR
Исключающее ИЛИ
EQV
Логическая эквивалентность
IMP
Логическая импликация
2.1. Оператор Or
Выполняет операцию логического ИЛИ (сложения) для двух выражений.
Синтаксис
результат = выражение1 Or выражение2
Оператор Or использует следующие операнды:
Элемент
Описание
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.
Если одно или оба выражения истинны (имеют значение True), результат также имеет значение True. Возвращаемые оператором значения представлены в следующей таблице:
выражение1
выражение2
результат
True
True
True
True
False
True
True
Null
True
False
True
True
False
False
False
False
Null
Null
Null
True
True
Null
False
Null
Null
Null
Null
Пустое значение (Null) — значение, указывающее, что переменная не содержит допустимого значения. Значение Null может являться результатом операции присваивания переменной значения Null в явном виде или результатом любой операции с участием выражения, содержащего значение Null.
Оператор Or выполняет также поразрядное сравнение двух числовых выражений и присваивает соответствующему разряду в переменной результат следующее значение:
Разряд в выражение1
Разряд в выражение2
Результат
1
1
1
1
1
1
1
Пример.
Dim A, B, C, D, MyCheck as
A = 10: B = 8: C = 6: D = Null ' присвоение значений
MyCheck = A > B Or B > C ' Returns True
MyCheck = B > A Or B > C ' Returns True
MyCheck = A > B Or B > D ' Returns True
MyCheck = B > D Or B > A ' Returns Null.
MyCheck = A Or B ' Returns 10 (bitwise comparison).
2.2. Оператор And
Возвращает результат конъюнкции (логического И) для двух выражений.
Синтаксис
результат = выражение1 And выражение2
Оператор And использует следующие операнды:
Элемент
Описание
результат
Обязательный; любая числовая переменная.
выражение1
Обязательный; любое выражение.
выражение2
Обязательный; любое выражение.
Если оба выражения имеют значение True, результат имеет значение True. Если хотя бы одно из выражений имеет значение False, результат имеет значение False. Возвращаемые оператором значения представлены в следующей таблице:
выражение1
выражение2
результат
True
True
True
True
False
False
True
Null
Null
False
True
False
False
False
False
False
Null
False
Null
True
Null
Null
False
False
Null
Null
Null
Оператор And выполняет также поразрядное сравнение двух числовых выражений и присваивает соответствующему разряду в переменной результат следующее значение:
Разряд в выражение1
Разряд в выражение2
Результат
1
1
1
1
1
Пример демонстрирует использование оператора And для выполнения операции конъюнкции (логического умножения) двух выражений.
Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null ' Инициализирует переменные.
MyCheck = A > B And B > C ' Возвращает True.
MyCheck = B > A And B > C ' Возвращает False.
MyCheck = A > B And B > D ' Возвращает Null.
MyCheck = A And B ' Возвращает 8 (поразрядное
сравнение).
2.3. Оператор Not
Выполняет над выражением операцию логического отрицания.
Синтаксис
результат = Not выражение
Оператор Not использует следующие операнды:
Элемент
Описание
результат
Обязательный; любая числовая переменная.
выражение
Обязательный; любое выражение.
Возвращаемые оператором значения представлены в следующей таблице:
выражение
результат
True
False
False
True
Null
Null
Оператор Not выполняет также поразрядное изменение значений каждого разряда переменной и присваивает соответствующему разряду в переменной результат следующее значение:
Разряд в выражение
результат
1
1
Пример демонстрирует использование оператора Not для выполнения операции логического отрицания для одного выражения.
Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null ' Инициализирует переменные.
MyCheck = Not(A > B) ' Возвращает False.
MyCheck = Not(B > A) ' Возвращает True.
MyCheck = Not(C > D) ' Возвращает Null.
MyCheck = Not A ' Возвращает -11 (поразрядное сравнение).
2.4. Операторы сравнения
Используются для сравнения двух выражений.
Синтаксис
результат = выражение1 операторСравнения выражение2
результат = объект1 Is объект2
результат = строка Like образец
Операторы сравнения используют следующие операнды:
Элемент
Описание
результат
Обязательный; любая числовая переменная.
выражение
Обязательный; любое выражение.
операторСравнения
Обязательный; любой оператор сравнения.
объект
Обязательный; любое имя объекта.
строка
Обязательный; любое строковое выражение.
образец
Обязательный; любое строковое выражение или диапазон символов.
В языке Visual Basic применяются следующие операции отношения
Символ
Название
Результат
=
Равно
Результат TRUE, если значения операндов равны
<>
Не равно
Результат TRUE, если значения операндов не равны
<
Меньше
Результат TRUE, если левый операнд меньше правого
>
Больше
Результат TRUE, если левый операнд больше правого
<=
Меньше или равно
Результат TRUE, если левый операнд меньше или равен, правому
>=
Больше или равно
Результат TRUE, если левый операнд больше или равен правому
Примечание. Операторы Is и Like функционально отличаются от операторов сравнения, перечисленных в таблице.
Ниже приведены примеры сравнения.
Dim MyResult, Var1, Var2
MyResult = (45 < 35) ' Возвращает False.
MyResult = (45 = 45) ' Возвращает True.
MyResult = (4 <> 3) ' Возвращает True.
MyResult = ("5" > "4") ' Возвращает True.
Var1 = "5": Var2 = 4 ' Инициализирует переменные.
MyResult = (Var1 > Var2) ' Возвращает True.
Var1 = 5: Var2 = Empty
MyResult = (Var1 > Var2) ' Возвращает True.
Var1 = 0: Var2 = Empty
MyResult = (Var1 = Var2) ' Возвращает True.
3. Применение управляющих операторов
Рассмотрим следующую задачу.
Задача 1. Сформировать ведомость начисления зарплаты. Для этого необходимо:
а) составить шапку ведомости;
б) в столбец ФИО ввести фамилию и инициалы;
в) в столбец Оклад ввести оклады;
г) в столбец Под_налог вывести подоходный налог согласно следующей формуле:
(1)
д) в столбец К выдаче ввести окончательную сумму, получаемую сотрудником как разность значений столбцов Оклад и Под_налог;
е) вывести итоговую сумму по столбцу К выдаче.
Для решения задачи необходимо выполнить следующие шаги:
1) сформировать ведомость (таблицу) с указанием адресов ее размещения в электронной таблице;
2) вывести шапку таблицы;
3) заполнить столбцы № пп и ФИО;
4) разработать модуль ввода данных в столбец Оклад;
5) опираясь на значения столбца Оклад, согласно (1) заполнить ячейки столбца Под_налог;
6) рассчитать значения столбца К выдаче;
7) определить итоговую сумму по столбцу К выдаче;
8) связать разработанный модуль с кнопкой.
Пример реализации шага 1 показан на рис. 1.
Рис. 1. Исходная таблица для вычисления налогов
Текст модуля имеет вид:
Sub зарплата()
'лист IF_задача1
Dim i As Integer, СуммаВыдыче As Single
'заполнение ячеек столбца Оклад
For i = 1 To 5
фио = Cells(3 + i - 1, 2) ' фио переменная типа Variat - текстовая
as1$ = "Оклад"
as2$ = "Введите оклад для " + фио
Cells(3 + i - 1, 3) = InputBox(as2$, as1$)
Next i
'определение подох. налога
For i = 1 To 5
If (Cells(3 + i - 1, 3) >= 5000) And (Cells(3 + i - 1, 3) <= 50000) Then
Cells(3 + i - 1, 4) = Cells(3 + i - 1, 3) * 0.13
ElseIf Cells(3 + i - 1, 3) <= 100000 Then
Cells(3 + i - 1, 4) = Cells(3 + i - 1, 3) * 0.15
Else
Cells(3 + i - 1, 4) = Cells(3 + i - 1, 3) * 0.2
End If
Next i
'определение К выдаче
For i = 1 To 5
Cells(3 + i - 1, 5) = Cells(3 + i - 1, 3) - Cells(3 + i - 1, 4)
Next i
'Итоговая сумма к выдаче
СуммаВыдыче = 0
For i = 1 To 5
СуммаВыдыче = СуммаВыдыче + Cells(3 + i - 1, 5)
Next i
Cells(8, 5) = СуммаВыдыче
Cells(9, 5) = [SUM(e3:e7)]
End Sub
Результат применения модуля показан на рис. 2.
Рис. 2. Итоговая таблица после применения макроса Зарплата
Комментарии к макросу.
1. Переменная ФИО (тип Variant) служит для вывода в окне InputBox текущего значения ячейки столбца ФИО. Как это сделать можно изучить на примере пременной as2$.
2. Вводимые значения сразу присваиваются текущей ячейке столбца Оклад. Все это реализовано первым циклом FOR..NEXT.
Примечание. Для ввода данных можно было использовать массив, но это бы намного усложнило код макроса.
3. Второй и третий циклы FOR..NEXT реализует вычисление налогов и определение суммы к выдаче.
4. Последний цикл служит для вычисления итоговой суммы к выдаче.
5. Последняя строка кода показывает, как используя внутренние функции Excel можно получить итоговую сумму к выдаче.
Примечание. Последнюю строку можно было записать в более привычном виде Cells(9, 5) = “=SUM(e3:e7)”.
Макрос Зарплата можно было модифицировать следующим образом:
◦ осуществить ввод данных в столбец ФИО. Эта часть реализуется аналогичного тому, как это делается с помощью первого цикла FOR..NEXT;
◦ вычислять другие итоговые значения с учетом других видов налогов.
4. Табулирование сложных функций
Рассмотрим следующую задачу.
Задача 2. Задан интервал изменения x[a; b]. Необходимо вычислить значения функции y=f(x), причем функция f(x) на различных интервалах изменения х может иметь различную структуру.
Пусть y = f(x) имеет вид
Известны числа с=3.2, а=0, b=5, a1=1, a2=1.75, a3=3.5. x изменяется с шагом 0.25. Необходимо:
задать адрес начальной ячейки для вывода значений у в столбец;
на основе адрес начальной ячейки у определить адрес начальной ячейки для вывода х;
найти значения функции у в узлах x;
результаты x, y вывести в электронную таблицу;
подсчитать количество шагов по x и построить график искомой зависимости;
для запуска макроса использовать кнопку.
Для решения этой задачи воспользуемся циклом While..Wend, так как количество шагов неизвестно. Листинг макроса Табуляция имеет вид
Sub Табуляция()
'лист Задача2
' описание переменных с=3.2, а=0, b=5, a1=1, a2=1.75, a3=3.5
Dim a, a1, a2, a3, b, c, y, x, pi, h As Single
Dim i% 'кол-во шагов
Dim Nry%, Ncy%, Ncx% ' начальные адреса ячеек для х, у
pi = 3.14
a = 0: a1 = 1: a2 = 1.75: a3 = 3.5: b = 5: c = 3.2: h = 0.25
x = a: i = 1
'начальная ячейка для вывода значений у в столбец
заг$ = "Вывод функции: начальная ячейка"
сообщение$ = "Введите номер строки"
Nry = InputBox(сообщение$, заг$)
сообщение$ = "Введите номер столбца"
Ncy = InputBox(сообщение$, заг$)
'начальная ячейка для вывода значений x в столбец
If Ncy = 1 Then
Ncx = Ncy + 1
Else
Ncx = Ncy - 1
End If
'табуляция у
While x <= b
If (a <= x And x <= a1) Or (a3 <= x And x <= b) Then
Cells(Nry + i - 1, Ncy) = Abs(x - a)
ElseIf a1 < x And x <= a2 Then
Cells(Nry + i - 1, Ncy) = Sqr(Abs(Sin(0.2 * pi * x)))
ElseIf a2 < x And x < a3 Then
Cells(Nry + i - 1, Ncy) = 1 / (x ^ 2 + c)
End If
Cells(Nry + i - 1, Ncx) = x
x = x + h
i = i + 1
Wend
Cells(Nry + i, Ncx) = "кол-во шагов = " + Str(i - 1)
End Sub
Рис. 3. Результат работы макроса Табуляция
Комментарии к коду.
1. Начальный адрес для у определяется путем применения функции InputBox.
2. Начальный адрес для х определяется по следующему алгоритму: если индекс столбца для у больше 1, то Ncx = Ncy 1 (столбец х располагается слева от столбца у). В противном случае, столбец х располагается справа от столбца у.
3. Используется цикл While..Wend для табуляции функции у. Сначала реализуется логика вычисления у и занесение полученного значения в текущую ячейку для данного значения х. Затем в соответствующую ячейку заносится значение х. Далее изменяется значение х и вычисляется новый относительный индекс столбца i. Цикл работает, пока является истинным условие x <= b.
4. Определяется адрес ячейки для вывода сообщения о количестве шагов. Для этого использована строковая функция Str для формирования сообщения из пояснительного текста "кол-во шагов = " и числового значения i, которое надо преобразовать в стринговую величину.
График функции формируется с помощью Мастера диаграмм. Пример работы модуля показан на рис. 3.