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

Практикум по 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
страница5 из 8
1   2   3   4   5   6   7   8
Sub Корень ( )
Dim Y As Single
Y=0
For i = 1 To 10
Y = (2^i + Y)^(1/2)
Next
MsgBox Y
End Sub
Здесь символ ^ означает операцию возведения в степень:
a
b
в языке VBA можно представить как a^b , тогда и a ( a в степени 1/2) есть a^ (1/ 2) .
Y
i

2

52
Задача 9. Вычислить значение Y, определяемое формулой:
10
x
2
Y


(
1)
n
n
0 2(n
1)!
Решение. Вычисление, очевидно, реализуется циклическим алгоритмом, состоящим из 11 шагов. На каждом шаге к сумме
Y
прибавляется очередной, Y
i
, элемент ряда:
Y
Y Y
i
. Сложность этой задачи можно понизить, если выявить зависимость каждого последующего Y
i
от предыдущего Y
i-1 значения. Величи- на x от шага к шагу не изменяется, в такой постановке задачи ее просто нужно один раз ввести, например, с клавиатуры.
2
Итак, для всякого i от 0 до 10, Y
i
 (1)
i
x
. Соответственно,
2(i
1)!
2
Y
i
1
 (1)
i
1
x
. Разделим Y
i
на Y
i-1
, учитывая, что, по определению факториа-
2i! ла, (i + 1)! = i !(i +1). После сокращений получим:
Y
i

1
, отсюда следует,
Y
i
1
i
1
1
что Y
i

Y
i
1
. В суммируемой последовательности последний Y
i +1
– это
Y
10
,
i
1 а первый
Y
i
- это
Y
0
. Вычислим это начальное значение, подставив в формулу
2 для
Y
i
вместо i – ноль: Y
0

x
. Окончательно, программа:
2
Sub MyY ( )
Dim Y As Single, yi As Single, x As Single
x = InputBox(“Введите значение х”) yi = (x^2)/2
‘значение начального –Y
0
элемента ряда
Y = yi
‘начальное значение суммы
For i = 1 To 10 yi = (-1/(i+1))*yi ‘считаем очередной Y
i
-й элемент
Y = Y + yi
‘считаем сумму
Next
MsgBox Y
End Sub
Отметим, что (частая ошибка!) замена двух операторов тела цикла на один: Y = Y +(-1/(i+1))*yi приведет к тому, что на каждом шаге цикла к сумме Y будет прибавляться одно и то же значение yi, равное Y
0
, ведь yi тогда никак не изменяется. В программах, использующих зависимость i-го эле- мента в итерации от i-1-го, необходимо запоминать это предыдущее, вычис- ленное на (i-1)-м шаге значение, чтобы потом использовать именно его.
Задача 10. Для каждого числа b из 20-ти чисел, вводимых с клавиату-
ры определить наименьшее неотрицательное целое k такое, что b < 2
k
.
Решение. Алгоритм составляет цикл из 20-ти шагов, на каждом из кото- рых: вводится очередное число; проверяется, какую (наименьшую) степень

53
двойки оно не превышает; выводится показатель этой степени. Как получить нужную степень двойки? Пусть число b введено. Начинаем процесс проверки с
2 0
, т.е. b < 2 0
? Если да, процесс окончен, ответ k = 0. Если нет, проверяем 2 1
, т.е. b < 2 1
? Если да, процесс окончен, ответ k = 1. Если нет, проверяем 2 2
, b < 2 2
? И так до тех пор, пока не найдем нужное k. Таким образом, на каждом шаге
внешнего цикла (ввод очередного числа) работает внутренний цикл, перечис- ляющий степени k двойки. Условие выхода из этого внутреннего цикла – число b больше или равно 2
k
. Программа:
Sub MinK ( )
Dim b As Integer, k As Integer
For i = 1 To 20
‘внешний цикл вводит очередное b и
печатает результат
b = InputBox("Введите целое число")
k = 0
‘для каждого b начинаем поиск k с нуля!
While b >= 2 ^ k
внутренний цикл; условие цикла на каждом
его шаге пересчитывается
k = k + 1
‘увеличиваем показатель степени
Wend
MsgBox "Для b =" & CStr(b) & " k=" & CStr(k)
Next
End Sub
Здесь операция & склейки строк при выводе текста потребовала преобра- зования типов CStr из целого в строковый, т.к. она определена для аргументов­
строк.
Задачи для самостоятельной работы:
1. Вычислить выражение: y
 99  96  9  ...  6  3 2. Найти сумму бесконечного ряда с точностью до
>0: 

1 n
1 n(n
1)(n  2) k
5
n x
n
1 3. Найти сумму k первых членов ряда:

n
1
(2
 n)!
4. Для каждого числа a из 20-ти чисел, вводимых с клавиатуры определить наибольшее целое k такое, что a >3
k
.
Лабораторная работа № 5. Задачи с данными – одномерными
(линейными) массивами
Задача 11. Ввод и вывод линейного массива.
Ввод массива фиксированной длины можно осуществить с клавиатуры или, в VBA, также с листа Excel. Для ввода проще всего использовать цикл For

54
с числом шагов, равным длине (количеству элементов) массива. Пусть, напри- мер, требуется ввести массив М из 10 целых чисел.
Ввод массива с клавиатуры:
For i = 1 To 10
М(i) = InputBox("Введите элемент массива")
Next
Ввод массива с листа Excel (массив расположен на листе в диапазоне, например, A1:A10):
For i = 1 To 10
М(i)=Cells(i,1)
номер строки меняется в цикле, столбец первый (А)
Next
Вывод массива в VBA нагляднее всего реализовать непосредственно на лист Excel, например, в диапазон B1:B10:
For i = 1 To 10
Cells(i,2)= М(i)
номер строки меняется в цикле, столбец второй (В)
Next
Вывод массива с помощью оператора MsgBox:
For i = 1 To 10
MsgBox М(i)
Next
Задача 12. В массиве из 10 чисел найти максимальное значение.
Решение. Задача отличается от разобранной в Задаче 7 только тем, что вначале последовательность вводится в массив (одномерный), а затем анализи- руется: каждый элемент A(i) массива сравнивается с уже полученным на пре- дыдущих шагах максимумом. В качестве начального значения можно взять лю- бой из A(i), но удобнее A(1) – циклическую проверку можно тогда начать со второго элемента, сократив число шагов:
Sub maxmas()
Dim i, max, A(10) As Integer
For i = 1 To 10
A(i) = InputBox("Введите число – элемент массива")
Next
max = A(1)
For i = 2 To 10
If A(i) > max Then
max = A(i)
End If
Next
MsgBox (max)
End Sub

55
Здесь первый цикл выполняет ввод элементов массива, а второй – поиск максимума. В данной задаче оба этих действия можно совместить, воспользо- вавшись одним циклом, например:
Sub maxm()
Dim i, max, A(10) As Integer
max = InputBox("Введите число – первый элемент массива")
For i = 2 To 10
A(i) = InputBox ("Введите число – элемент массива")
If A(i) > max Then
max = A(i)
End If
Next
MsgBox (max)
End Sub
Задача 13. Поменять местами первый положительный и первый от-
рицательный элементы массива А из 10 целых чисел.
Решение. Алгоритм состоит из четырех частей: 1) ввод массива, 2) поиск в нем первого положительного элемента, 3) поиск первого отрицательного эле- мента, 4) обмен их значений. Для демонстрации результата необходима еще одна часть – 5) вывод полученного массива. Для наглядности будем вводить массив с листа Excel (например, из диапазона А1:А10) и выводить результат на тот же лист (например, в диапазон В1:В10).
Поиск первого положительного элемента проведем, перебирая в цикле значения A. Как только встретится A(k)>0, нужно запомнить его индекс (номер k) и сразу выйти из этого цикла. Обратите внимание, что если продолжить цикл, то мы в результате получим номер не первого, а последнего положитель- ного элемента массива.
Аналогично проводим поиск первого отрицательного элемента массива.
Пусть это будет A(j). Индекс j запоминаем.
Теперь осталось обменять значения A(k) и A(j), используя переменную­
посредника. Вся программа выглядит так:
Sub obmen()
Dim i, j, k, rab, A(10) As Integer
For i = 1 To 10
‘вводим массив из листа Excel:
A(i) = Cells(i, 1)
Next
For i = 1 To 10
‘находим первый положительный элемент:
If A(i) > 0 Then
k = i
Exit For
End If
Next
For i = 1 To 10
‘находим первый отрицательный элемент:

56
If A(i) < 0 Then
j = i
Exit For
End If
Next
rab = A(k)
‘меняем значения
A(k) = A(j)
A(j) = rab
For i = 1 To 10
‘выводим массив на лист Excel:
Cells(i, 2) = A(i)
Next
End Sub
Задача 14. Отсортировать массив чисел по возрастанию.
Решение. Сортировка распределение элементов множества по группам в соответствии с определенными правилами. Например, сортировка «по невозpастанию» – это сортировка элементов массива, в результате которой по- лучается массив, каждый элемент которого, начиная со второго, не больше стоящего от него слева. Существует достаточно большое число методов сорти- ровки. Приведем лишь простейшие из них.
Линейная сортировка (отбором).
Пусть необходимо упорядочить массив по возрастанию (убыванию) элементов.
Алгоритм:
1. Просматриваем элементы, начиная с 1-го. Ищем минимальный (максималь- ный). Меняем его местами с 1-м элементом.
2. Просматриваем элементы, начиная со 2-го. Ищем минимальный (максималь- ный). Меняем его местами со 2-м элементом.
3. И т. д. до предпоследнего элемента.
Программа такой сортировки:
Sub сортировка_отбором()
Dim c(1 To 100) As Single
Dim k As Integer, i As Integer, j As Integer
Dim vr As Single
k = InputBox(''Введите количество элементов <= 100'')
If k > 100 Then Exit Sub
Cells(1, 1) = k
For i = 1 To k c(i) = InputBox(''введите'' & i & '' элемент'')
Cells(i, 2) = c(i)
'Вывод исходного массива на лист
Next
For i=1 To k–1
'Двигаемся по массиву, сокращая неотсортированную часть
For j=i+1 To k
'Сpавниваем по очеpеди i-й элемент неотсоpтированной

57
части массива со всеми, от i+1-го до конца
If c(j)Then
'если в неотсоpтиpованной части массива нашли
элемент, больший i-го, то меняем их местами:
vr = c(i)
c(i) = c(j)
c(j) = vr
End If
Next
Next
For i = 1 To k
Cells(i, 3) = c(i)
'Вывод результата на лист Excel
Next
End Sub
Соpтиpовка методом «пyзыpька».
Данный метод получил такое название по аналогии с пузырьками воздуха в стакане воды. Более «легкие» (максимальные или минимальные) элементы по- степенно «всплывают». В отличие от линейной сортировки, сравниваются только пары соседних элементов, а не каждый элемент со всеми (поэтому такая сортировка выполняется за меньшее число шагов и, следовательно, быстрее).
Алгоритм:
1. Последовательно просматриваем пары соседних элементов массива (с).
2. Если для соседних элементов выполняется условие с[i-1]<с[i], то значе- ния меняются местами.
Фрагмент программы сортировки методом «пузырька»:
For i = 2 To k
For j = k To i Step -1
If c(j-1)Then
'вытеснить элемент справа, тогда пyзыpек
всплывает влево
vr = c(j - 1)
c(j - 1) = c(j)
c(j) = vr
End If
Next
Next
Задача 15. Дан массив целых чисел A(10). Посчитать количество раз-
ных элементов в нем.
Решение. Ниже приведена программа, разберите по ней алгоритм решения этой задачи самостоятельно:
Sub РазныеЭлементы()
Dim A(10) As Integer, k As Integer, k0 As Integer
For i = 1 To 10

58
A(i) = InputBox("Введите значение " & i & "-го элемента массива")
Next
k = 1
For i = 2 To 10
k0 = 1
For j = 1 To i - 1
If A(j) = A(i) Then
k0 = 0
Exit For
End If
Next
k = k + k0
Next
MsgBox "Разных элементов в массиве " & k
End Sub
Задачи для самостоятельной работы:
1. Дано целое число N и набор из N целых чисел. Найти номера первого и последнего минимального элемента из данного набора и вывести их в указан- ном порядке.
2. Найти минимальный из элементов массива А(10), принадлежащий ин- тервалу (2;14).
3. Составить массив В из неположительных элементов массива А(15).
4. Дано положительное число В и набор из десяти чисел. Вывести макси- мальный из тех элементов набора, которые больше В, а также его номер. Если чисел, больших В, в наборе нет, то дважды вывести 0.
Лабораторная работа № 6. Вычисление значений формулы, завися-
щей от нескольких переменных, каждая из которых изменяется на своем
интервале и со своим шагом
Речь идет о задачах типа: вычислить v = f(x,y,z), где x
 [a,b], x =h
1
; y
 [c,d], y = h
2
; z
 [e,k], z = h
3
. Если переменные, как здесь, не зависят друг от друга, то нужно использовать столько вложенных циклов, сколько перемен- ных участвует в формуле, здесь - три. Вложенные циклы позволяют связать ка- ждое значение с каждым, т.е. перебрать все возможные варианты значений x, y, z. Каким типом цикла пользоваться? Если границы интервала включены, то проще всего – циклом For, например:
For x = a To b Step h
1
For y = c To d Step h
2
For z = e To k Step h
3
v = f (x,y,z)
Next
Next
Next

59
При этом безразлично, в каком порядке идут эти циклы (можно начинать с y
или z) – все равно будут перечислены все наборы значений x, y, z. Если же гра- ницы интервалов не включаются, например, y
 [c,d), то для y можно использо- вать цикл While с условием y < d:
For x = a To b Step h
1
y = c
While y < d
For z = e To k Step h
3
v = f (x,y,z)
Next
y = y + h
2
Wend
Next
Если в исходной задаче переменные зависят друг от друга, например, y =
2x + 4, то количество циклов уменьшается на число зависимых переменных, здесь – на 1. Тогда первый вариант задачи (с поправкой на новый y) будет иметь вид:
For x = a To b Step h
1
y = 2*x + 4
For z = e To k Step h
3
v = f (x,y,z)
Next
Next
Таким образом, для каждого x будет вычислен соответствующий y. Здесь порядок вычисления уже играет роль: значение y не может быть посчитано, ес- ли значение x не известно, поэтому операции с переменной y должны идти по-
сле операций, устанавливающих значение переменной x.
Задача 16. Вычислить значения v, определяемые формулой:

2
v
 
;
x
[2;4], x 1;
x
2
xw - z при x  3
xy z w при x  3

0,5 при y  3
y
[2;6], y  
; z =1,2; 1,5; 3;
w
i
1
 0,5w
i
, w
1
 2; 1  i  4
1 при y  3
Решение. Проанализируем условие. Переменные-аргументы в формуле v=f(x,y,z,w) не зависят друг от друга, поэтому для перебора их значений доста- точно четырех циклов. Границы интервалов включены, значит, конечные зна- чения переменных-аргументов известны. Однако переменная y изменяется с переменным шагом, поэтому цикл типа For для перечисления ее значений не подойдет, лучше воспользоваться циклом While. Переменная w вычисляется 4 раза, первое значение известно, значит, для вычисления остальных можно ис- пользовать цикл For с начальным значением 2 и конечным значением 4. Пере- менная z изменяется, не подчиняясь какой-либо закономерности, поэтому ее

60
значения лучше записать в массив и затем перебирать элементы z(j) этого мас- сива в цикле For со счетчиком j. Значения v и
y, кроме того, меняются в зави- симости от условия, поэтому для их вычисления нужно использовать условный оператор If. Получаем в итоге программу:
Sub KrutoyV( )
Dim x As Single, y As Single, z(3) As Single, w As
Single, v As Single
z(1) = 1.2
z(2) = 1.5
z(3) = 3
For x = 2 To 4
‘цикл для x
For j = 1 To 3
‘цикл для z
y = 2
While y <=6
‘цикл для y
w =2
For i =2 To 4 ‘цикл для w
If x <3 Then
v = x*y + z(j)^2 +w
Else
v = x^2 + x*w – z(j)
1   2   3   4   5   6   7   8


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