Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика Никитин

.pdf
Скачиваний:
11
Добавлен:
29.03.2016
Размер:
398.65 Кб
Скачать
log a x = ln x / ln a .

31

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 ey − 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 , состоящий из неотрицательных элементов исходных массивов. Полученный массив расположить в порядке возрастания.