Практикум по Visual Basic for Applications. 3 Глава Алгоритмы и программы Понятие алгоритма
Скачать 1.74 Mb.
|
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) 'если в неотсо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) 'вытеснить элемент справа, тогда п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) 3> |