Главная страница

Практикум по Visual Basic for Applications. 3 Глава Алгоритмы и программы Понятие алгоритма


Скачать 1.74 Mb.
НазваниеПрактикум по Visual Basic for Applications. 3 Глава Алгоритмы и программы Понятие алгоритма
АнкорVBA.pdf
Дата23.09.2017
Размер1.74 Mb.
Формат файлаpdf
Имя файлаVBA.pdf
ТипПрактикум
#8936
страница4 из 8
1   2   3   4   5   6   7   8
Глава 3. Лабораторный практикум
Для того чтобы открыть редактор VBA, выберите команду Сервис, Мак-
рос, Редактор Visual Basic или нажмите комбинацию клавиш +.
Далее можно воспользоваться меню редактора: выбрать команды Insert, Mod­
ule, еще раз войти в меню Insert и выбрать Procedure. Затем заполнить поле
Name диалогового окна (ввести имя своей процедуры), и если программируется функция, то выбрать переключатель Function (рис. 2), нажать Ok.
Рис. 2. Вид окна Добавление процедуры
На листе созданного модуля появятся стандартные строки начала и конца процедуры:
Public Sub ИмяПроцедуры()
End Sub

43
можно
Между ними можно набрать код (инструкции) программы.
Для запуска программы выбрать в меню Run команду
Run Sub/UserForm или нажать кнопку на панели инструментов.
Если в программе обнаружены ошибки, то компилятор выдает сообщение и отладчик отмечает строку с ошибкой желтым цветом. Чтобы снять это выде- ление, можно нажать кнопку на панели инструментов. После этого необ- ходимо исправить ошибку и снова запустить программу на выполнение.
Более подробное изложение возможности отладчика программ Debug
можно найти в справочнике VBA, приведенного в конце методического посо- бия.
Лабораторная работа № 1. Линейные алгоритмы
Задача 1. Найти значения переменной y, заданные формулой
y = x
2
+
x
- sin(x) для трех различных значений x.
Решение. Вход алгоритма: значение переменной x, выход: значение пе- ременной y. Алгоритм состоит из трех шагов: 1) ввод значения x, 2) вычисле- ние y для этого значения, 3) вывод полученного результата. Эти три шага сле- дует также выполнить трижды – для каждого нового значения x. Блок-схема алгоритма для одного значения x:
Ввод x
y = x
2
+
x
- sin(x)
Вывод y
Для иллюстрации возможных методов ввода будем задавать x разными способами: присваиванием, вводом с клавиатуры, вводом из ячейки листа
Excel.
Определяем переменные, участвующие в программе: их имена и типы.
Пусть это будут x и y вещественного типа Single (целый тип Integer для y брать нельзя, т.к. операция извлечения корня и функция sin(x) могут дать в качестве результата вещественные числа). В начале программы следует поста- вить описания этих переменных.
Вывод реализуем оператором MsgBox. Его используем в двух режимах – просто вывод числа и вывод числа с текстом. Текст в этом случае нужно взять в двойные кавычки и соединить его с числом операцией & склейки строк. Аргу- мент оператора MsgBox имеет строковый тип (String), при выводе числово- го значения происходит автоматическое преобразование типов (здесь – из
Single в String).

44
В программе участвуют встроенные функции – извлечение корня и вы- числение синуса. В VBA это Sqr(x) и Sin(x). Отметим, что извлечение кор- ня из числа эквивалентно операции возведения этого числа в дробную степень
(здесь – в степень 1/2).
Public Sub Task1()
Dim x As Single, y As Single
‘описываем переменные
x = 2.4
‘вводим
х
присваиванием значения
y = x^2 + Sqr(x) - Sin(x)
‘вычисляем
у
, используя функцию sqr
MsgBox y
‘выводим значение
у
без текста
x = InputBox("Vvedi x")
‘вводим
х
c клавиатуры
y = x^2 + x^(1/2)-Sin(x)
‘используем возведение в дробную степень
MsgBox "y=" & y
‘выводим значение
у
с текстом “y=”
x = Cells(1, 1)
‘вводим
х
из ячейки А1 листа Excel
y = x ^ 2 + Sqr(x) - Sin(x)
MsgBox "y=" & y
End Sub
Перед тем, как запустить эту программу на счет, необходимо ввести ка- кое-нибудь значение в ячейку А1 активного листа, иначе оператор x=Cells(1,1) присвоит х значение 0.
В этой программе есть недостаток: она не проверяет, что введенное зна- чение положительно (х>0). Если пользователь программы введет отрицатель- ное значение, то операции x^(1/2) и Sqr(x) приведут к ошибке, система выдаст сообщение о неверном аргументе этих операций. Программа будет го- раздо технологичней, если после каждого ввода поставить защиту, например: проверку значения, выдачу сообщения и выход из процедуры:
if x < 0 Then
MsgBox ”введено отрицательное значение переменной х”
Exit Sub
End if
Задача 2. Обменять значения двух переменных.
Решение. Пусть имена переменных х и у. Задача состоит в том, чтобы переменная х получила значение переменной у и наоборот: у получил значение переменной х. Типичное неправильное решение задач с обменом значений: x = y ‘неверно!
y = x
В этом случае переменная х получит значение у, но переменная у в при- сваивании y=x получит уже новое значение х, приобретенное в результате первого оператора x=y. Таким образом, у приобретет свое прежнее значение.
Необходимо помнить, что в любых операциях обмена значений переменных

45
требуется посредник – дополнительная переменная для хранения промежуточ- ного результата (старого значения одной из исходных переменных). Пусть та- кой переменной-посредником будет rab. Тогда правильное решение задачи: rab = x x = y y = rab
Программа целиком:
Sub Обмен()
Dim x As Integer, y As Integer, rab As Integer
x = 10
y = 7
rab = x x = y y = rab
MsgBox (x)
MsgBox (y)
End Sub
Задачи для самостоятельной работы:
1. Найти значение переменной y при различных значениях А, B, С, вводи- мых с листа Excel, и значениях x, z, вводимых с клавиатуры: а) y

A
 3B
(A
 C)cos
2 x
 z ; b) y

xA x
C
 1 1
;
x
A
 B
B
A
 1 2. Задать длину ребра куба. Найти объем куба и площадь его поверхно- сти.
3. Задать три действительных положительных числа. Найти среднее арифметическое и среднее геометрическое этих чисел.
4. Определить высоту треугольника, если его площадь равна S, а основа- ние больше высоты на величину А.
Лабораторная работа № 2. Разветвляющиеся алгоритмы
Задача 3. Найти минимальное из двух чисел, вводимых с клавиатуры.
Решение. Вход алгоритма: два неравных числа, назовем их a и b. Выход
– число, меньшее другого числа. Алгоритм: сравнить значения a и b: если a>b , то вывести в качестве результата значение a, иначе - значение b. Блок-схема алгоритма:

46
Определим тип переменных a и b. Для простоты используем целые числа, т.е. тип – Integer. По усло- вию задачи значения этих перемен-
Ввод a,b
a > b
Вывод a
Вывод b
-
+
ных вводятся с клавиатуры, поэтому используем функцию InputBox с текстовым аргументом. Для вывода используем функцию MsgBox.
Public Sub min2()
Dim a As Integer, b As Integer
a = InputBox("Vvedi a")
b = InputBox("Vvedi b")
If a > b Then
MsgBox "min = " & b
Else
MsgBox "min = " & a
End If
End Sub
Задача 4. Найти максимальное из трех чисел, вводимых с клавиатуры.
Решение. Вход алгоритма: три произвольных числа, назовем их a, b, c.
Выход: наибольшее из них. Алгоритм состоит в попарном сравнении этих чи- сел и выборе максимального в паре. Программа иллюстрирует применение вложенных операторов If… Then… Else… , причем новые If… появляются как в части Then, так и в части Else. Блок-схема алгоритма:
Ввод a,b,c a > b
+
-
a > c
+
-
Max = a
Max = c b > c
+
-
Max = b
Max = c
Вывод Max

47
В программе тип всех переменных для простоты выбран Integer. Для сокращения двустрочной записи:
Else
Max = c использована однострочная Else: Max = c, допустимая в VBA.
Public Sub max3()
Dim a As Integer, b As Integer, c As Integer, Max As Integer
a = InputBox ("Vvedi a")
b = InputBox ("Vvedi b") c = InputBox ("Vvedi c")
If a > b Then
If a > c Then
вложенный условный оператор If…
Max = a
Else: Max = c
End If
конец вложенного If…
Else
If b > c Then
вложенный условный оператор If…
Max = b
Else: Max = c
End If
конец вложенного If…
End If
MsgBox Max
End Sub
Задачи для самостоятельной работы:
1. Вывести на печать переменные А, В, С в порядке их возрастания. Зна- чения переменных: а) ввести с клавиатуры; б) взять из диапазона В2:В4 листа
Excel; с) задать оператором присваивания.
2. Даны значения x, y, z. Определить, могут ли они быть сторонами: а) обычного треугольника; б) равнобедренного треугольника.
3. Список доходов клиентов расположен в диапазоне А2:А11 листа Excel.
Определить налог конкретного клиента (его номер в списке ввести с клавиату- ры), если налоговое начисление составляет 13% от дохода при доходе меньшем
5000 руб., 20% от дохода, если он находится в промежутке от 5000 до 40000 руб. и 30%, если доход превышает 40000 руб.
4. Даны действительные числа x, y, z. Получить минимальное из них по модулю.
Лабораторная работа № 3. Циклические алгоритмы
Задача 5. Найти среднее арифметическое четных чисел из N чисел,
вводимых с клавиатуры.
Решение. Среднее арифметическое – это значение суммы чисел, делен- ной на их количество. Поэтому для решения задачи потребуются переменные

48
для накопления суммы и количества четных чисел. Пусть это будут S и k, для простоты – целого типа. Кроме того, в программе нужно ввести N или задать его с помощью присваивания. Для проверки на четность можно использовать функцию Mod, дающую целочисленный остаток от деления ее левого операнда на правый: результат операции x Mod y равен целому числу - остатку от деле- ния x на y; так он будет 0, если x делится на y. Если x или y не целые числа, то они предварительно будут округлены до целого. Основу алгоритма составит циклическая процедура: ввести число, проверить: если оно четное, то добавить его к сумме S и увеличить счетчик четных чисел k на 1. Эти операторы нужно повторить N раз. На выходе из цикла сумма четных чисел и их количество бу- дут посчитаны, останется только разделить S на k и запомнить результат. Для хранения результата возьмем переменную r, ее тип – Single – действительное число, т.к. искомое среднее – результат деления – не всегда будет целым чис- лом:
Sub Среднее()
Dim S As Integer, r As Single, k As Integer, a As Integer
N = InputBox("Введите N – количество чисел")
S = 0
k = 0
For i = 1 To N
a = InputBox("Введите число")
If a Mod 2 = 0 Then
S = S + a k = k + 1
End If
Next
r = S / k
MsgBox (r)
End Sub
Обратите внимание, что переменные S и k предварительно обнуляются
(«чистятся»), причем до начала цикла. Чистку необходимо делать, т.к. при пе- реводе программы на машинный язык под переменные отводится память, в ко- торой может что-нибудь уже находиться, какая-либо старая информация. Если убрать оператор S = 0, то в последующем присваивании S = S + a при вычисле- нии правой части к значению a будет добавлено неизвестное значение S и ре- зультат будет неверный. Типичная ошибка, когда операции обнуления поме- щают в тело цикла, после заголовка:
For i = 1 To N
S = 0
‘неверно!
k = 0
‘неверно!
a = InputBox("Введите число")
If a Mod 2 = 0 Then
S = S + a

49
k = k + 1
End If
Next
Тогда чистка происходит на каждом шаге исполнения цикла, поэтому по- сле завершения цикла в S окажется лишь последнее введенное четное a, и k бу- дет равен 1.
Задача 6. Посчитать произведение чисел, вводимых с клавиатуры до
тех пор, пока не встретится 0.
Решение. Здесь заранее не известно, сколько чисел будет введено, поэто- му лучше воспользоваться циклом While:
Sub Произведение()
Dim a As Integer, P As Integer
a = InputBox("Введите ненулевое число")
P = 1
While a <> 0
P = P * a a = InputBox("Введите число")
Wend
MsgBox (P)
End Sub
Обратите внимание, что «чистка» переменной Р заключается в присвое- нии ей значения 1, т.к. Р участвует в произведении P = P *a и обнуление Р при- вело бы к нулевому результату всей программы. Исполнение цикла продолжа- ется до тех пор, пока не введен 0 в переменную а. В первой строке мы потребо- вали, чтобы вначале было введено ненулевое число. А что, если все-таки поль- зователь программы ввел 0? Тогда цикл не проработает ни разу и результат бу- дет Р=1. Такой же результат будет, если ввели 1, а затем 0. Как различить эти случаи? «Защититься» от первого нуля можно, поставив, например, «обере- гающий» оператор Until c проверкой на ноль:
Sub Произведение ()
Dim a As Integer, P As Integer
Do
a = InputBox("Введите ненулевое число")
Loop Until a <>0
P = 1
While a <> 0
P = P * a a = InputBox("Введите число")
Wend
MsgBox (P)
End Sub

50
Здесь первый оператор цикла не позволит продолжить программу, если вводятся нули: условие выхода из цикла a <>0.
Задача 7. Найти максимальное из 10-ти чисел, вводимых с клавиату-
ры.
Решение. При нахождении максимума в последовательности значений, нужно определить начальное значение переменной (max), в которой будет хра- ниться этот максимум. Затем каждое число в последовательности (здесь - каж- дое введенное число) сравнивается со значением max и, если это число превы- шает max, то оно теперь считается максимальным и поэтому заносится (при- сваивается) в max, стирая предыдущее значение. Таким образом, основной опе- ратор алгоритма решения – это цикл, в котором тело составляют два действия: ввод нового значения и проверка, не является ли это значение максимальным
(из тех, что уже были введены). По окончании цикла (когда все числа уже вве- дены и проверены) в max будет находиться наибольшее из них.
Что взять в качестве начального значения max? Верное решение – взять любое из анализируемой последовательности, например, первое. Неверное ре- шение – взять «с потолка», например, 0. Ноль сгодится, если вводятся только положительные числа (тогда любое из них «закроет» первоначальный макси- мум). Но, если могут быть введены только отрицательные числа, то этот 0 и окажется максимальным, хотя и не был введен. Ответ будет неверным.
Итак, возьмем в качестве начального значения первое из вводимых чисел и откроем цикл с проверкой оставшихся 9-ти чисел на максимум. Поскольку число шагов известно, проще воспользоваться циклом For:
Sub МаксЧисло()
Dim max As Single, a As Single
тип переменных – Single
max = InputBox("Введите число")
For i = 1 To 9
a = InputBox("Введите число")
If a > max Then
max = a
End If
Next
MsgBox (max)
End Sub
Аналогично решаются задачи на поиск минимума, нужно только заме- нить знак неравенства на < и переобозначить переменную (для ясности): вместо
max взять, например, min.
Задачи для самостоятельной работы:
1. Найти максимальный из отрицательных элементов среди произвольных
20 чисел, вводимых с клавиатуры.
2. Найти первый отрицательный член последовательности sin(tg(n)) для n, изменяющегося так: n=1, 2, 3,…

51 3. Вычислить положительные значения функции y=sin(x)+4cos(x-2) для x, изменяющемся на отрезке [-15,10] с шагом 1.
4. Найти количество чисел, кратных трем, из последовательности, вводи- мой с клавиатуры до тех пор, пока не встретится ноль.
Лабораторная работа № 4. Итерации (рекуррентные соотношения) и
вложенные циклы
Задачи такого типа можно представить как определение некоторой вели- чины Y, которая является результатом последовательности вычислений
Y
i
F(Y
i
1
)
, т.е. каждое последующее значение Y вычисляется на основе его предыдущих значений. Процесс заканчивается при достижении какого-либо ус- ловия или конкретного значения.
Для решения подобных задач нужно понять закономерность образования каждого последующего значения, т.е. задать функцию (или выражение) F. Оче- видно, что процесс вычисления является циклом и для начала проще всего оп- ределить его тело: какие действия повторяются, какие величины и на сколько изменяются на каждом шаге. После этого будет яснее условие продолжения
(окончания) цикла.
Задача 8. Вычислить значение Y, определяемое формулой:
Y
 1024  512  ...  4  2 .
Решение. Алгоритм будет понятнее, если представить числа в этом вы- ражении как степени двойки:
1 2
9 10 2
2 2
2





Y
Вычисление Y можно организовать тогда, используя цикл из десяти ша- гов. На каждом шаге i выполняется операция: к 2
i прибавляется значение, вы- численное на предыдущем шаге, и из результата извлекается квадратный ко- рень. Таким образом, результат i-го шага:
Y

. Осталось только задать начальное значение Y=0. Программа тогда:
1   2   3   4   5   6   7   8


написать администратору сайта