Лабораторная работа № 3. Реализация линейных алгоритмов

Теоретические сведения

Программы с линейной структурой составляются из операторов присваивания, ввода, вывода, обращения к процедурам.

Ранее был рассмотрен синтаксис оператора присваивания, организация ввода и вывода, основные операции VBA и приоритет операций, описана структура программного кода. Для организации математических вычислений потребуется знание встроенных математических функций VBA.

Математические функции

В VBA имеется большой набор встроенных математических функций, использование которых существенно упрощает программирование.

Функция

Возвращаемое значение

Abs (<число>)

Модуль (абсолютная величина) числа

Atn (<число>)

Арктангенс

Cos (<число>)

Косинус

Exp (<число>)

Экспонента, т. е. результат возведения основания натурального логарифма в указанную степень

Log(<число>)

Натуральный логарифм

Rnd (<число>)

Случайное число из интервала [0,1).

Если число меньше нуля, то Rnd возвращает каждый раз одно и то же число, используя аргумент в качестве опорного числа. Если число больше нуля или аргумент опущен, то — следующее случайное число в последовательности; если число равняется нулю то — случайное число, возвращенное при предыдущем вызове этой функции.

Перед вызовом функции Rnd используйте инструкцию Randomize без аргумента

Sgn (<число>)

Знак числа

Sin (<число>)

Синус

Sqr (<число>)

Квадратный корень из числа

Tan (<число>)

Тангенс

Fix (<число>)

Int (<число>)

Обе функции, Int и Fix, отбрасывают дробную часть числа и возвращают целое значение.

Различие между функциями int и Fix состоит в том, что для отрицательного значения аргумента функция Int возвращает ближайшее отрицательное целое число, меньшее либо рaвное указанному, a Fix — ближайшее отрицательное целое число, большее либо равное указанному

Перенос строки

Расположение символов <Пробел> + <Знак подчеркивания> в конце обеспечивает то, что последующая строка является продолжением предыдущей. При этом надо помнить, что:

В следующем примере первая из конструкций является разбиением второй на две строки:

у = Sin(Pi()*x) + (1 + x)^(l/2)/ _

(1 + х^2)

у = Sin(Pi()*x) + (1 + x)^(l/2)/(1 + х^2)

Комментарии

Работая с программой, удобно использовать комментарии, т. е. фрагменты текста программы, не являющиеся программными кодами и игнорируемые компилятором. Комментарии выполняют две важные функции:

В языке VBA существуют два способа ввода комментариев:

    1. Применение апострофа (‘). Его можно ставить в любом месте строки. При этом все символы, начиная от апострофа до конца строки, будут восприниматься компилятором как комментарий.
    2. Применение зарезервированного слова Rem вместо апострофа.

Ниже приведен пример использования комментариев в тексте программы:

Dim a As Integer

‘а — целая переменная

Dim b As String

‘b – строковая переменная

Расположение нескольких операторов на одной строке

Использование знака двоеточия позволяет разместить несколько операторов на одной строке. Таким образом, следующие две конструкции эквивалентны:

x = x+1

y = x+2

x = x+1 : y = x+2

Функции преобразования форматов

При обработке выражений, введенных с помощью функции InputBox, и последующем выводе результата на экран, иногда приходится прибегать к функциям преобразования форматов (типов).

Преобразование строки в число и обратно осуществляются следующими функциями.

Val(<строка>)

Возвращает число, содержащееся в строке, как значение числового типа

Str(<число>)

Возвращает значение типа Variant (String), являющееся строковым представлением числа

Замечание. В качестве допустимого десятичного разделителя функция Str воспринимает точку.

Часто возникает потребность в выводе нескольких результатов в одном окне сообщений. Помимо операции конкатенации (сложения строк &) используют функцию Chr.

Chr(<число>)

Возвращает строку, ASCII-код которой равен аргументу. Например, Chr (13) – возвращает символ “возврат каретки”, т.е. осуществляет переход на новую строку.

Например, такая следующая строка кода:

MsgBox "Первая строка" & Chr(13) & "Вторая строка" & Chr(13) & "Третья строка", , _

"Многострочное сообщение"

приводит к выводу следующего окна сообщения:

Демонстрационные примеры:

1. Рассмотрим очень полезный алгоритм, с которым при программировании часто приходится встречаться. Даны две переменные X и Y. Требуется произвести между ними обмен значениями. Например, если первоначально было X=1, Y=2, то после обмена должно стать: X=2, Y=1.

Попытка обойтись без дополнительной переменной, написав

X = Y

Y = X

не приводит к цели (безвозвратно утрачивается начальное значение переменной X).

Хорошим аналогом для решения такой задачи является следующая: даны два стакана, в первом – молоко, во втором – вода; требуется произвести обмен их содержимым. Ясно, что в этом случае нужен дополнительный третий пустой стакан. Последовательность действий будет следующей:

  1. перелить из первого в третий;
  2. перелить из второго в первый;
  3. перелить из третьего во второй.

По аналогии для обмена значениями двух переменных нужна дополнительная третья переменная. Назовем ее Z. Тогда задача решается последовательным выполнением трех операторов присваивания.

Z = X

X = Y

Y = Z

Построим трассировочную таблицу при следующих начальных значениях переменных: X=1, Y=2.

Команда

X

Y

Z

Z = X

1

2

1

X = Y

2

2

1

Y = Z

2

1

1

Действительно, в итоге значения переменных X и Y поменялись местами.

Аналогия со стаканами не совсем верна в том смысле, что при переливании из одного стакана в другой первый становится пустым. В результате же присваивания (X =Y) переменная, стоящая справа (Y) сохраняет свое значение.

Программа на VBA для решения этой задачи может быть записана следующим образом:

Option Explicit

Sub Обмен_двух()

Dim X As Integer, Y As Integer, Z As Integer

'Осуществим ввод значений;

' функция Val используется для преобразования строки в число

X = Val(InputBox("Введите первое число", "Ввод числа"))

Y = Val(InputBox("Введите второе число", "Ввод числа"))

'Осуществим обмен значений переменных

Z = X

X = Y

Y = Z

'Выведем результат в окне сообщений;

'функция Str применяется для преобразования строки в число

'функция Chr (в данном случае) - для организации перевода строки

MsgBox "Первое число " & Str(X) & Chr(13) & "Второе число " & Str(Y), , "Вывод результата"

End Sub

2. Решим предыдущую задачу, не используя дополнительных переменных.

Приведем последовательность команд присваивания, приводящих к требуемому результату (начальные значения X и Y обозначим X0, Y0).

X = X + Y ‘X = X0 + Y0, Y = Y0

Y = X – Y ‘X = X0 + Y0, Y = X0

X = X – Y ‘X = Y0, Y = X0

Соотвествующую программу на VBA попытаетесь написать самостоятельно.

3. Составим алгоритм решения такой задачи: даны две простые дроби; получить дробь, являющуюся результатом их деления.

В школьном учебнике математики правило деления обыкновенных дробей описано следующим образом:

    1. числитель первой дроби умножить на знаменатель второй;
    2. знаменатель первой дроби умножить на числитель второй;
    3. записать дробь, числителем которой является результат выполнения пункта (1), а знаменателем – результат выполнения пункта (2).

В алгебраической форме это выглядит следующим образом:

Теперь построим алгоритм деления дробей для компьютера. В этом алгоритме сохраним те же обозначения для переменных, которые использованы в записанной формуле. Исходными данными являются целочисленные переменные a, b, c, d. Результатом – так же целые величины m и n.

Представим алгоритм вначале в виде блок-схемы. В блок-схемах приняты такие обозначения:

 

Начало или конец алгоритма

 

Простая команда

 

Ввод и вывод данных

 

Проверка условия

 

 

 

Начало цикла

 

Обращение к вспомогательному алгоритму

Option Explicit

Sub Деление_дробей ()

Dim a As Integer, b As Integer, c As Integer, d As Integer

Dim m As Integer, n As Integer

a = Val(InputBox("Введите числитель", "Первая дробь"))

b = Val(InputBox("Введите знаменатель", "Первая дробь"))

c = Val(InputBox("Введите числитель", "Вторая дробь"))

d = Val(InputBox("Введите знаменатель", "Вторая дробь"))

m = a*d

n = b*c

MsgBox "Числитель: " & Str(m) & Chr(13) & "Знаменатель: " & Str(n), , "Результат деления"

End Sub

4. Составим программу, в результате выполнения которой будет выведено значение TRUE, если точка с заданными координатами (x,y) лежит внутри заштрихованной области и FALSE в противном случае.

Рассматриваемая область состоит из двух частей, каждая из которых описывается системой неравенств.

1-я часть: х £ 0; х2 + у2 £ 9; у ³ -х - 3.

2-я часть: х ³ 0; х2 + у2 £ 25.

Точка с координатами (х, у) лежит в заштрихованной области, если она принадлежит 1-й или 2-й части. Программа осуществляет ввод координат точки, вычисление значения логического выражения, которое определяет принадлежность точки области и выводит полученную логическую величину на экран.

Option Explicit

Sub Принадлежность_точки ()

Dim x As Single, x As Single, L As Boolean

x = Val(InputBox("Введите абсциссу", "Ввод координат"))

y = Val(InputBox("Введите ординату", " Ввод координат"))

L = (x <=0) And (x*x+ y*y<=9) And (y >= -x-3) Or (x >=0) And (x*x+ y*y<=25)

MsgBox "Лежит ли точка в заданной области?" & L, , "Результат"

End Sub

Задачи для самостоятельного решения

Каждый студент должен решить две задачи из каждого блока А, Б, В и Г. Предполагается, что в задачах из блоков А и Г результат вычислений обоих заданий будет выдаваться в одном окне сообщений.

А

Вычислить значения выражений по формулам (предполагается, что значениями переменных могут быть любые действительные числа):

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

Б

  1. Вычислить периметр и площадь прямоугольного треугольника по заданным длинам двух катетов а и b.
  2. Заданы координаты трех вершин треугольника (x1,y1), (x2,y2), (x3,y3). Найти его периметр и площадь.
  3. Вычислить длину окружности и площадь круга одного и того же заданного радиуса R.
  4. Найти произведение цифр заданного четырехзначного числа.
  5. Даны два числа. Найти среднее арифметическое кубов этих чисел и среднее геометрическое модулей этих чисел.
  6. Вычислить расстояние между двумя точками с данными координатами (x1,y1) и (x2,y2).
  7. Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.
  8. Дана сторона равностороннего треугольника. Найти площадь этого треугольника, его высоты, радиусы вписанной и описанной окружностей.
  9. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.
  10. Найти площадь кольца, внутренний радиус которого равен r, а внешний — заданному числу R (R > r).
  11. Треугольник задан величинами своих углов и радиусом описанной окружности. Найти стороны треугольника.
  12. Найти площадь равнобедренной трапеции с основаниями a и b и углом a при большем основании а.
  13. Вычислить корни квадратного уравнения ax2 + bx + с = 0, заданного коэффициентами a, b и с (предполагается, что а ¹ 0 и что дискриминант уравнения неотрицателен).
  14. Дано действительное число х. Не пользуясь никакими другими арифметическими операциями, кроме умножения, сложения и вычитания, вычислить за минимальное число операций 2х4 - Зх3 + 4.х2 - 5х + 6.
  15. Дано х. Получить значения -2х + Зх2 - 4х3 и 1 + 2х + Зх2 + 4х3. Позаботиться об экономии операций.
  16. Найти площадь треугольника, две стороны которого равны а и b, а угол между этими сторонами равен a .
  17. Дано а. Не используя никаких функций и никаких операций, кроме умножения, получить а8 за три операции; a10 и a16 за четыре операции.
  18. Найти сумму членов арифметической прогрессии, если известны ее первый член, знаменатель и число членов прогрессии.
  19. Найти все углы треугольника со сторонами а, b, с. Предусмотреть в программе перевод радианной меры угла в градусы, минуты и секунды.
  20. Три сопротивления –R1, R2, R3 соединены параллельно. Найдите сопротивление соединения.
  21. Составить программу для вычисления пути, пройденного лодкой, если ее скорость в стоячей воде v1 км/ч, скорость течения реки v2 км/ч, время движения по озеру t1 ч, а против течения реки — t2 ч.
  22. Текущее показание электронных часов: т часов (0 £ т £ 23), n мин (0 £ n £ 59), k сек (0 £ . k £ 59). Какое время будут показывать часы через р ч q мин r с?
  23. Полторы кошки за полтора часа съедают полторы мышки. Сколько мышек съедят Х кошек за Y часов?
  24. Составить программу вычисления объема цилиндра и конуса, которые имеют одинаковую высоту Н и одинаковый радиус основания R.
  25. Дана величина А, выражающая объем информации в байтах. Перевести А в более крупные единицы измерения информации.

В

Составить программу, печатающую значение true, если указанное высказывание является истинным, и false в противном случае:

  1. сумма двух первых цифр заданного четырехзначного числа равна сумме двух его последних цифр;
  2. сумма цифр данного трехзначного числа N является четным числом;
  3. точка с координатами (x, y) принадлежит части плоскости, лежащей между прямыми х = m, х = n (m < n);
  4. квадрат заданного трехзначного числа равен кубу суммы цифр этого числа;
  5. целое число N является четным двузначным числом;
  6. среди чисел а, b, с есть хотя бы одна пара взаимно противоположных чисел;
  7. числа a и b выражают длины катетов одного прямоугольного треугольника, с и d другого. Эти треугольники являются подобными;
  8. даны три стороны одного и три стороны другого треугольника. Эти треугольники равновеликие, т.е. имеют равные площади;
  9. данная тройка натуральных чисел а, b, с является тройкой Пифагора, т.е. с2 = а2 + b2;
  10. все цифры данного четырехзначного числа N различны;
  11. данные числа х, y являются координатами точки, лежащей в первой координатной четверти;
  12. 1, у1) и (х2, у2) — координаты левой верхней и правой нижней вершин прямоугольника; точка A(х, у) лежит внутри этого прямоугольника или на одной из его сторон;
  13. число с является средним арифметическим чисел а и b;
  14. натуральное число N является точным квадратом;
  15. цифры данного четырехзначного числа N образуют строго возрастающую последовательность;
  16. цифры данного трехзначного числа N являются членами арифметической прогрессии;
  17. цифры данного трехзначного числа N являются членами геометрической прогрессии;
  18. данные числа c и d являются соответственно квадратом и кубом числа a;
  19. цифра М входит в десятичную запись четырехзначного числа N;
  20. данное четырехзначное число читается одинаково слева направо и справа налево;
  21. сумма двух натуральных чисел кратна 2;
  22. произведение натуральных чисел a и b кратно числу c;
  23. сумма двух действительных чисел а и b является целым числом, т.е. дробная часть суммы равна нулю;
  24. данное натуральное число а кратно числу b, но не кратно числу c.

Г

Составить программу, которая печатает true, если точка с координатами (х, у) принадлежит заштрихованной области, и false в противном случае: