Информатика Никитин
.pdf31
1. как изменятся программы последней задачи, если кроме функции
y = y(x) требуется одновременно с ней при тех же значениях x
просчитать и z = z( x; y ) ;
2. как изменятся программы последней задачи, если требуется
протабулировать функцию от x = b до x = a с шагом -h, то есть в порядке убывания x .
ЧАСТЬ 2
Во второй части нашего курса рассмотрим простейшие приемы работы на VBA с подпрограммами и массивами, связанные с инженерно-
математическими расчетами.
При составлении сложных программ очень часто в их различных частях приходится использовать одинаковую последовательность действий,
например, вычислять При составлении программ по
такому алгоритму приходится записывать одну и ту же группу операторов,
соответствующих каждому из повторяющихся фрагментов. Для более эффективного программирования подобных повторений в алгоритмических языках предназначены подпрограммы. Повторяемая группа операторов оформляется в виде отдельной программной единицы, которая записывается однократно, а в соответствующих местах основной программы (или подпрограмм) организуются обращения к ней.
Использование подпрограмм позволяет сложную задачу разбить на фрагменты, которые выполняют различные исполнители. Кроме того,
подпрограмма может рассмотриваться как самостоятельный модуль, который выполнен квалифицированными разработчиками и используется пользователями более низкой квалификации.
В VBA подпрограммы разделяются на процедуры – Sub и
подпрограммы-функции – Function . Кроме того, от первоначальных
32
версий BASIC сохранилась конструкция подпрограмм GoSub – Return ,
которая в настоящее время редко используется и в нашем курсе не рассматривается.
Любая процедура может содержать несколько входных параметров,
произвольное число операторов и несколько результатов ее выполнения.
Синтаксис процедуры в упрощенной форме имеет вид:
[ Private | Public ] Sub <имя процедуры> ( список ) < операторы >
End Sub
Здесь квадратные скобки указывают на необязательный параметр,
вертикальная черта – на варианты параметров, выбираемых пользователем.
Так, элемент описания Private указывает, что рассматриваемая процедура доступна только из программы и процедур только того модуля, в
котором она описана. Элемент описания Public указывает на то, что рассматриваемая процедура доступна для всех программ и процедур во всех модулях. В предлагаемых образцах программ мы будем использовать процедуры только с описанием Public .
Список формальных аргументов процедуры мы условно на начальном этапе изучения разделим на входные параметры – исходные данные и выходные – результаты счета. Входные параметры в списке мы будем описывать с ключевым словом ByVal и обязательным указанием типа.
Выходные же параметры в списке будем описывать с ключевым словом
ByRef и обязательным указанием типа. При таком способе описания входные параметры передаются в процедуру по значению: вначале в вызывающей программе вычисляются значения фактических аргументов и эти значения подставляются в процедуре вместо формальных. Входные параметры могут быть либо постоянными, либо именными постоянными,
либо переменными, либо выражениями. Выходные параметры, описанные с ключевым словом ByRef , передаются по адресам в электронной памяти
33
компьютера и должны быть только переменными. После их вычисления в процедуре их значения передаются в вызывающую программу. Отметим, что каждая переменная, которая используется в качестве выходного параметра процедуры с ключевым словом ByRef в вызывающей программе, должна быть описана в ней только в отдельном операторе описания. Вызов процедуры из вызывающей программы осуществляется с помощью оператора
Call < имя процедуры > ( фактические переменные )
Так вычисление логарифма по произвольному основанию и образец
обращения к процедуре его вычисления можно представить в следующей
программе
Private Sub Workbook_Open() Const a = 2, b = 4
Dim x As Single
Dim y As Single
Dim z As Single
Call Логарифм(a, b, x)
Call Логарифм(a + b, (a + b) ^ 5, y) Call Логарифм(10, 10000, z) Range("A1").Value = x Range("A3").Value = y Range("A5").Value = z
x = 2.38 ^ b y = 3.1415926
Call Логарифм(y, x, z) Range("A7").Value = z End Sub
Public Sub Логарифм(ByVal основание, аргумент _ As Single, ByRef результат _ As Single)
результат = Log(аргумент) / Log(основание) End Sub
34
Отметим, что одновременное использование латинского алфавита и кириллицы при написании программ на начальном этапе затруднительно. В
приведенном примере это сделано для большей наглядности.
Кроме того, что в процедуре может быть несколько выходных параметров, описанных с ключевым словом ByRef, возможны побочные результаты действия процедур на изменение входных параметров с ключевым словом ByVal – в предлагаемом курсе не рассматриваются.
Подпрограмма-функция – это подпрограмма, результат которой есть единственное значение, присваиваемое имени этой функции. Подпрограмма-
функция оформляется в следующем виде
[Public | Private] Function < имя функции >(список) _
As < тип >
< операторы > End Function
В местах выхода из подпрограммы-функции должен стоять оператор присваивания
< имя функции > = < выражение >
Обращения к подпрограммам-функциям аналогичны обращению к стандартным математическим функциям VBA.
Рассмотрим оформление предыдущего примера в виде подпрограммы-
функции и обращения к ней
Private Sub Workbook_Open() Const a = 2, b = 4
Dim x As Single
Dim y As Single
Dim z As Single
x = Логарифм(a, b)
y = Логарифм(a + b, (a + b) ^ 5) z = Логарифм(10, 10000) Range("A1").Value = x Range("A3").Value = y Range("A5").Value = z
35
x = 2.38 ^ b y = 3.1415926
z = Логарифм(y, x) Range("A7").Value = z End Sub
Public Function Логарифм(ByVal основание, аргумент _ As Single) As Single
Логарифм = Log(аргумент) / Log(основание) End Function
Результат счета по приведенным программам одинаковый и имеет вид:
Отметим, что в ячейку |
A1 |
выведено значение log 2 |
4 = 2 , в ячейку |
A3 – значение log a +b (a + b)5 |
= 5 , |
в ячейку A5 – значение |
lg 10 10000 = 4 , а |
в ячейку A7 выведено значение |
log π 2,384 . |
|
Перейдем к изучению массивов. В предыдущей части программирования на VBA рассматривались переменные, являющимися только скалярными величинами. Однако при решении научно-технических и экономических задач приходится сталкиваться с совокупностью переменных,
объединенных одним именем, но с различными индексами. Простейшими примерами таких переменных являются элементы векторов и матриц.
Аналогом таких переменных в алгоритмических языках являются массивы. В
36
общем случае массив – это упорядоченное конечное множество элементов одинакового типа.
Если в математике, как правило, индекс указывается несколько ниже
имени переменной, например x 1 , x 2 , ..., x n или xi – для элементов векторов и a i j – для элементов матриц, то в VBA индексы заключаются в круглые
скобки через запятую. Например: x(1) |
x(2) ... x(n), или |
x(i) |
– для элементов векторов и a(i,j) – |
для элементов матриц. На |
VBA в |
качестве индексов можно использовать переменные перечисляемого типа.
Например, названия дней недели, названия цветов радуги и так далее. Мы же будем рассматривать простейший случай, когда в качестве индексов используются аргументы целого типа с указанием пределов их изменения.
Число индексов в массиве определяет его размерность.
Для работы с массивами необходимо их предварительно описать. В
нашем курсе мы их будем описывать в операторах Dim с указанием границ изменения его индексов в виде граничных пар. При этом объявление
массивов может иметь вид: |
|
|
|
|
|
|||
. |
. |
. |
. |
. |
. |
. |
. |
. |
Dim a(1 To 5) As Single |
|
|
|
|||||
Dim b(-1 To 3) As Integer |
|
|
|
|||||
Dim c(1 To 2, 1 To 4) As Single |
|
|||||||
. |
. |
. |
. |
. |
. |
. |
. |
. |
Здесь описаны три массива. Вектор a вещественного типа, состоящий
из пяти элементов: a(1) |
a(2) |
a(3) |
a(4) |
и |
a(5); |
вектор |
b |
|
целого типа, состоящий из пяти элементов: |
b(-1) |
b(0) |
b(1) |
b(2) |
и |
|||
b(3); матрица C вещественного типа, состоящая из восьми элементов: |
|
|||||||
c(1,1) |
c(1,2) |
c(1,3) |
c(1,4) |
|
|
|
|
c(2,1) c(2,2) c(2,3) c(2,4)
Границы изменения индексов массивов можно описать либо в виде граничных пар чисел, как указано выше, либо в виде граничных пар именных констант. Например:
37
. |
. |
. |
. |
. |
. |
. |
. |
. |
Const m = 1, n = 10 |
|
|
|
|
||||
Dim a(m To n) As Single |
|
|
|
|||||
. |
. |
. |
. |
. |
. |
. |
. |
. |
Следует отметить, что должно соблюдаться условие: m ≤ n . Если же m = n , то соответствующий индекс может принимать только одно значение.
Довольно часто массивы описываются с запасным количеством элементов, например вектор, состоящий из 100 элементов, а в программе используются только часть этого массива. Например, только 30 элементов массива.
В качестве индексов массивов в наших задачах могут быть использованы либо целые числа, либо целые именные постоянные, либо целые переменные, либо арифметические выражения целого типа. В VBA не определены операции над массивами. Поэтому всевозможные арифметические и математические действия с массивами проводятся с элементом массива, для которого указаны индексы (индекс). Обычно это производится с помощью операторов цикла, используя целочисленные параметры этих операторов.
Для использования массивов в подпрограммах часто используется их описание в виде динамических, для которых размерность и диапазон изменения параметров определяется вызывающей программой. Например, x(). Использование динамических массивов в качестве входных и выходных параметров подпрограмм допускается только с ключевым словом
ByRef и они обязательно должны быть описаны в конце списка
параметров подпрограммы . Если в подпрограмме используется несколько
массивов, то каждый из ник должен содержать в описании ключевое
слово ByRef и описание типа.
Студенту необходимо разобраться в приведенных образцах решения
задач контрольной работы № 2 и модифицировать программы согласно
условиям своего варианта.
38
Варианты контрольной работы № 2
Задача № 1
Составить программу табулирования функций y = y(x) и z = z( x; y )
для x , меняющимся от |
a |
до |
b с шагом |
h . |
В нечетных вариантах задачи |
||||
использовать цикл Do |
While |
– |
Loop |
с параметром |
х, счет |
y = y(x) |
|||
оформить в виде процедуры, а счет |
z = z( x; y ) |
оформить |
в |
виде |
|||||
подпрограммы-функции. |
Для |
четных |
вариантов использовать |
цикл |
|||||
Do Until – Loop с параметром х , |
счет |
y = y(x) |
оформить в виде |
||||||
подпрограммы-функции, а счет |
z = z( x; y ) |
– в виде процедуры. |
|
|
|
|
x |
2 |
|
cos 2x , |
x £ -0,35 |
|
||||||||
1. |
y = |
|
|
; |
|||||||||||
|
3ln (2 + x), |
x > -0,35 |
|
||||||||||||
|
|
a = −2; b = 6; |
h = 0,2. |
|
|||||||||||
|
|
|
|
|
|
|
|
2 |
5x - 6,3, |
x < 0,63 |
|
||||
2. |
y = cos |
|
; |
||||||||||||
|
arctg 3x , |
x ³ 0,63 |
|
||||||||||||
|
|
a = −1; b = 2; |
h = 0,1. |
|
|||||||||||
|
|
|
x - 6,77 |
|
, |
x £ 0,23 |
|
||||||||
|
|
|
|
||||||||||||
3. |
y = |
|
|
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
ln (3x - 0,27), |
x > 0,23 |
|
||||||||||||
|
|
a = 0; b = 1; |
h = 0,05 . |
|
|||||||||||
|
ln |
|
x - 5 |
|
, |
x < -0,44 |
|
||||||||
|
|
|
|
||||||||||||
4. |
y = |
|
|
|
|
|
|
|
|
|
|
|
|
x ³ -0,44 |
; |
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
cos5x , |
|
a = −2; b = 3; h = 0,2 .
z = 3xy - 4x3 y2 + 6 ;
z = 3x − 4 y + 9xy ;
z = sin(x − y) ;
z = 2x − e− y − 7,88 ;
5. |
|
3x − 4sin 5x , |
x ≤ 1,12 |
z = y2 − x2 ; |
|
y = |
|
|
; |
||
|
ln 2,56 x , |
|
x > 1,12 |
|
|
|
|
a = −1,5; |
b = 1,5; h = 0,15 . |
|
6. |
|
cos(sin x), |
x < 0,77 |
||||||
y = |
|
|
|
|
|
|
|
; |
|
|
|
arctg 4x , |
x ³ 0,77 |
||||||
|
|
a = −1; |
|
b = 2; |
h = 0,2 . |
||||
7. |
arctg (3x - 0,76), x £ 1,11 |
||||||||
y = |
|
|
|
|
|
|
|
; |
|
|
cos3,2x , |
|
|
|
x > 1,11 |
||||
|
|
a = −2; |
|
b = 2; |
h = 0,125 . |
||||
8. |
sin (3 - 2,45x), |
x < 0,76 |
|||||||
y = |
|
|
|
|
|
|
|
; |
|
|
ln 5,7x , |
|
|
|
|
x ³ 0,76 |
|||
|
|
a = −1; |
|
b = 1,5; |
h = 0,1 . |
||||
9. |
arctg (3,47 - x), |
x £ -0,93 |
|||||||
y = |
|
|
|
|
|
|
|
; |
|
|
cos(4x -1,55), |
x > -0,93 |
|||||||
|
|
a = −2 ; |
|
|
|
b = 1; |
h = 0,1 . |
||
|
|
ln |
|
2x - 3 |
|
, |
x < 1,3 |
||
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
10. |
y = |
|
|
|
2 |
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
(4x - 5) , |
x ³ 1,3 |
|||||||
|
|
||||||||
|
|
a = −1; |
|
b = 3; |
h = 0,2 . |
39
z = ln (1 + x + y ) ;
z = sin(x − y) ;
z = 2x - 4 y + 5,43 ;
z = x - y ;
z = cos xy ;
Используя приведенные в образцах процедуры ввода и вывода векторов и матриц, сортировки векторов в порядке возрастания (убывания) как «стандартные», составить программы нижеследующих задач.
Для каждой задачи подготовить числовой материал, состоящий из чисел, которые имеют одну цифру, отличную от нуля, до десятичной запятой и одну цифру, отличную от нуля, после десятичной запятой (например: -7,4; 3,8). Примерно треть чисел взять так, чтобы они были отрицательными.
Если по условию задачи нужны нулевые элементы, то их необходимо включить в исходные данные. Исходные данные подбирать так, чтобы условию задачи удовлетворяло 3 - 6 элемента массива или ряда матрицы.
40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Задача 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. |
|
|
|
|
|
|
|
R12 и |
|
|
|
|
|
|
|
R14 . |
|
||||||
Даны векторы |
|
|
|
b |
Для каждого из них найти сумму |
||||||||||||||||||
a |
|||||||||||||||||||||||
|
абсолютных величин элементов с нечетным индексом. |
||||||||||||||||||||||
2. |
|
|
|
|
|
|
|
|
R13 |
|
|
|
|
|
|
|
|
|
|
|
R10 . |
|
|
Даны векторы |
|
|
|
|
|
|
|
и |
|
|
|
|
|
b |
Для каждого из них найти |
||||||||
|
|
|
a |
|
|
|
|
|
|||||||||||||||
|
произведение квадратных корней из положительных элементов. |
||||||||||||||||||||||
3. |
|
|
|
|
|
R17 |
|
|
|
|
|
|
|
|
R 6 . |
|
|
||||||
Даны векторы |
|
|
|
|
|
и |
|
b |
Для |
каждого из них найти число |
|||||||||||||
a |
|
||||||||||||||||||||||
|
отрицательных элементов. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
4. |
|
|
|
|
|
R 9 и |
|
|
|
|
R12 . |
|
|||||||||||
Даны векторы |
|
|
|
|
|
b |
Для каждого из них найти число |
||||||||||||||||
a |
|||||||||||||||||||||||
|
элементов, которые меньше или равны -1,4 . |
||||||||||||||||||||||
5. |
|
|
|
R12 |
|
|
|
|
|
R10 . |
|
||||||||||||
Даны векторы |
|
|
|
|
и |
|
|
b |
Для каждого из них найти число |
||||||||||||||
a |
|
|
|||||||||||||||||||||
|
элементов, которые больше или равны 2,66. |
6.Даны векторы a R16 и b R12 . Для каждого из них найти произведение абсолютных величин ненулевых элементов.
7. |
|
|
|
|
|
|
|
|
R11 и |
|
|
|
|
|
|
|
|
R15 . Для каждого из них найти число |
Даны векторы |
|
|
|
|
|
|
b |
|||||||||||
a |
||||||||||||||||||
|
элементов, абсолютная величина которых меньше 3,7. |
|||||||||||||||||
8. |
|
|
|
|
|
|
R 9 и |
|
|
|
|
|
R14 . Для каждого из них найти сумму |
|||||
Даны векторы |
|
|
|
|
|
b |
||||||||||||
a |
||||||||||||||||||
|
элементов, принадлежащих [-1,3; 2,6), |
|||||||||||||||||
9. |
|
|
|
|
|
R12 и |
|
|
|
|
|
|
R 8 . Для каждого из них найти число |
|||||
Даны векторы |
|
|
|
|
|
|
|
|
|
|
b |
|||||||
|
a |
|
|
|
|
|||||||||||||
|
элементов, принадлежащих (-2,7; 3,3]. |
|||||||||||||||||
10.Даны векторы |
|
R 8 и |
|
|
R17 . Для каждого из них найти среднее |
|||||||||||||
|
|
|
|
b |
||||||||||||||
a |
||||||||||||||||||
|
арифметическое положительных элементов. |
Задача 3
1.Из двух массивов a(9) и b(12) получить новый массив c , состоящий из неотрицательных элементов исходных массивов. Полученный массив расположить в порядке возрастания.