Задача 3. Найти минимальное из двухчисел, вводимых с клавиатуры.
Лабораторный практикум
Для того чтобы открыть редактор VBA, выберите команду, Сервис, Макрос Редактор Visual Basic или нажмите комбинацию клавиш < Alt >+< F 11>. Далее можно воспользоваться меню редактора: выбрать команды Insert , Module, еще раз войти в меню Insert и выбрать Procedure. Затем заполнить поле Name диалогового окна (ввести имя своей процедуры), и если программируется функция, то выбрать переключатель Function (рис. 2), нажать Ok.
Рис. 2. Вид окна Добавление процедуры
На листе созданного модуля появятся стандартные строки начала и конца процедуры:
Public Sub ИмяПроцедуры()
End Sub
Между ними можно набрать код (инструкции) программы. Для запуска программы можно выбрать в меню Run команду Run Sub / UserForm или нажать кнопку на панели инструментов. Если в программе обнаружены ошибки, то компилятор выдает сообщение и отладчик отмечает строку с ошибкой желтым цветом. Чтобы снять это выделение, можно нажать кнопку
на панели инструментов. После этого необходимо исправить ошибку и снова запустить программу на выполнение.
Лабораторная работа № 1. Линейные алгоритмы
Задача 1. Найти значения переменной y, заданные формулой y = x 2 + Öx - sin(x) для трех различных значений x.
Решение. Вход алгоритма: значение переменной x, выход: значение переменной y. Алгоритм состоит из трех шагов: 1) ввод значения x, 2) вычисление y для этого значения, 3) вывод полученного результата. Эти три шага следует также выполнить трижды – для каждого нового значения x. Блок-схема алгоритма для одного значения x:
Для иллюстрации возможных методов ввода будем задавать x разными способами: присваиванием, вводом с клавиатуры, вводом из ячейки листа Excel . Определяем переменные, участвующие в программе: их имена и типы. Пусть это будут x и y вещественного типа Single (целый тип Integer для y брать нельзя, т.к. операция извлечения корня и функция sin ( x) могут дать в качестве результата вещественные числа). В начале программы следует поста- вить описания этих переменных. Вывод реализуем оператором MsgBox. Его используем в двух режимах – просто вывод числа и вывод числа с текстом. Текст в этом случае нужно взять в двойные кавычки и соединить его с числом операцией & склейки строк. Аргумент оператора MsgBox имеет строковый тип ( String), при выводе числового значения происходит автоматическое преобразование типов (здесь – из Single в String).
В программе участвуют встроенные функции – извлечение корня и вычисление синуса. В 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) ‘используем возведение в дробную степень
y = x ^ 2 + x ^ (1 / 2) - Sin(x) ‘выводим значение у с текстом “y=”
MsgBox "y=" & y ‘вводим х из ячейки А1 листа Excel
x = Cells(1, 1)
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. Таким образом, у приобретет свое прежнее значение. Необходимо помнить, что в любых операциях обмена значений переменных требуется посредник – дополнительная переменная для хранения промежуточного результата (старого значения одной из исходных переменных). Пусть такой переменной-посредником будет 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, вводимых с клавиатуры:
a) ; b)
;
2. Задать длину ребра куба. Найти объем куба и площадь его поверхности.
3. Задать три действительных положительных числа. Найти среднее арифметическое и среднее геометрическое этих чисел.
4. Определить высоту треугольника, если его площадь равна S, а основание больше высоты на величину А.
Лабораторная работа № 2. Разветвляющиеся алгоритмы
Задача 3. Найти минимальное из двухчисел, вводимых с клавиатуры.
Решение. Вход алгоритма: два неравных числа, назовем их a и b. Выход – число, меньшее другого числа. Алгоритм: сравнить значения a и b: если a>b, то вывести в качестве результата значение a, иначе - значение b. Блок-схема алгоритма:
Определим тип переменных a и b. Для простоты используем целые числа, т.е. тип – Integer. По условию задачи значения этих переменных вводятся с клавиатуры, поэтому используем функцию 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. Блок-схема алгоритма:
В программе тип всех переменных для простоты выбран 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 чисел, вводимых с клавиатуры. Решение. Среднее арифметическое – это значение суммы чисел, деленной на их количество. Поэтому для решения задачи потребуются переменные для накопления суммы и количества четных чисел. Пусть это будут 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
k = k + 1
End If
Next
Тогда чистка происходит на каждом шаге исполнения цикла, поэтому после завершения цикла в S окажется лишь последнее введенное четное a, и k будет равен 1.