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