ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ

Для программирования циклических алгоритмов используются операторы циклов. В VBA таких операторов несколько. Наиболее распространенными являются операторы While…Wend и For…Next. С их помощью можно запрограммировать циклические алгоритмы с предусловием (рис.5.1.). Принцип их работы:

1. Переменной цикла присваивается начальное значение.

2. Проверяется условие входа в цикл. Условие – это любое логическое выражение, операндом которого является переменная цикла. Если условие истинно, то выполняются Повторяющиеся действия (тело цикла). В противном случае цикл завершается, управление передается оператору, следующему за оператором цикла.

3. Значение переменной цикла изменяется.

4. Повторяются действия с шага 2.

5.1. Оператор цикла While…Wend

 

Синтаксис:

 

While <условие>

<Повторяющиеся действия>

Wend

Например, фрагмент алгоритма может быть запрограммирован так:

 

 

k=1

While k<=N+1

y=k+N

MsgBox “При k=” & k & “ и N=”, & N _

& “ значение y=”& y

k=k+0.5

Wend

В качестве условия входа в цикл возможно использование любого логического выражения, в том числе и сложного. Например:

 

k=1

While k<=N+1 and N>0

y=k+N

MsgBox “При k=” & k & “ и N=”, & N _

& “ значение y=”& y

k=k+0.5

Wend

 

Синтаксисом оператора не предусмотрено

- присваивание начального значения переменной цикла;

- изменение значения переменной цикла после выполнения повторяющихся действий.

Поэтому эти действия программист должен предусмотреть сам. Если не присвоить переменной цикла начального значения, возможно невыполнение цикла или выполнение повторяющихся действий случайное число раз. При отсутствии модификации значения переменной цикла возникает ситуация бесконечного цикла. Для выхода из этой ситуации необходимо нажать клавишу Esc или одновременно две клавиши Ctrl + Break.

Избежать подобного рода ошибок позволяет оператор цикла For…Next, т.к. установка начального значения переменной цикла и ее модификация предусматриваются его синтаксисом.

5.2. Оператор цикла For…Next

Переменную цикла в операторе For…Next принято называть счетчиком.

Синтаксис:

 

For Счетчик=НачЗначение То КонЗначение [Step Приращение]

<Повторяющиеся действия>

Next [Счетчик]

Элементы синтаксиса:

Счетчик –

Обязательный. Переменная числового типа. Указывается программистом.

НачЗначение

Обязательный. Определяет состояние переменной Счетчик, с которого начинается отсчет ее значения.

КонЗначение –

Обязательный. Определяет состояние переменной Счетчик, на котором отсчет ее значения прекращается.

Step Приращение –

Необязательный. Переменная числового типа. Позволяет изменять приращение счетчика (по умолчанию оно равно 1).

Не допускается изменение значения переменной цикла внутри тела цикла, т.к. это приведет к ошибочным результатам.

После ключевого слова Next можно не указывать имя переменной-счетчика. Более того, в этом случае программа будет выполняться быстрее. Однако для быстрого нахождения соответствия между For и Next, особенно при программировании вложенных циклов, имя переменной цикла все же лучше указывать.

 

Например, фрагмент алгоритма будет запрограммирован с помощью оператора цикла For…Next так:

 

For i=1 To p

y=x+1

Cells (1+i ,1)=i: Cells (1+i,2)=x;

Cells (1+i,3)=y

x=x+DX

Next

 

В данном случае переменная цикла i изменяет свое значение от 1 до значения переменной p включительно с шагом 1. Шаг модификации значения переменной цикла i в данном случае в операторе цикла не указан, так как он равен 1 (по умолчанию). Т.е. будет получено p значений вычисляемой функции.

Если бы шаг модификации значения переменной цикла был отличен от единицы, например, равен 2, заголовок оператора цикла For выглядел бы так:

For i=1 To p Step 2

Значение Счетчика может изменяться в обратном направлении. Для этого следует задать начальное значение больше конечного и выбрать отрицательное приращение значения счетчика.

Например:

 

For i = N To 1 Step -1

<Повторяющиеся действия>

Next

 

В качестве значений элементов синтаксиса оператора For…Next могут быть использованы любые числовые выражения. Во всех предыдущих примерах это были целые числа, но возможно использование и вещественных чисел.

Например:

Ø For i = 1 To N Step 0.2

y = x + 1

MsgBox "i=" & i & " y=" & y

Next

шаг изменения значения переменной цикла равен 0,2. Результат второго вычисления для переменной x, равной 4, представлен на рисунке.

Ø For i = 1.5 To 3

y = x + 1

MsgBox "i=" & i & " y=" & y

Next

будет получено два результата: для i=1.5 и i=2.5

Ø For i = 1.5 To 3.7 Step 0.5

y = x + 1

MsgBox "i=" & i & " y=" & y

Next

будет получено пять результатов: для i=1.5, i=2, i=2.5, i=3 и i=3.5.

Преимущество оператора цикла For…Next очевидно. Поэтому его использование предпочтительнее. Однако его применение возможно только в том случае, когда в качестве условия входа в цикл используется простое логическое выражение.

 

Табулирование функции

Табулирование функции – это вычисление значений функции для некоторого набора значений аргумента.

Пример 5.1. Выполнить табулирование функции y=2x(x+b) для переменной x, значение которой изменяется от начального до конечного значения с постоянным положительным шагом.

Результаты вычисления вывести на рабочий лист Excel.

Таблица соответствия переменных

Обозначение в задании Имя переменной Тип переменной Комментарий
y y вещественный Результат. Значение функции
x x вещественный Текущее значение аргумента функции
b b вещественный Исходное данное. Числовая константа
Начальное значение x XN вещественный Исходное данное
Конечное значение x XK вещественный Исходное данное
Шаг изменения значения x DX вещественный Исходное данное(>0)
N целый Номер итерации вычисления

Анализ исходных данных:

Имя переменной Недопустимое значение Ситуация
XN, XK XN>XK Ввод данных
DX £0 Ввод данных

Вводимые значения переменных XN, XK и DX удобно проверять с помощью следующего логического выражения

(XK<=XN) Or (DX<=0)

Очевидно, что если это выражение истинно, то введенные данные некорректны.

Графическая схема алгоритма представлена на рис.5.2, результаты тестирования программы – на рис.5.3.

 

Sub Pr5_1()

Dim y As Single, x As Single, b As Single

Dim XN As Single, XK As Single, DX As Single

Dim N As Byte

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

b = InputBox("Введи значение b")

XN = InputBox("Введи начальное значение х")

XK = InputBox("Введи конечное значение х")

DX = InputBox("Введи шаг изменения х")

'Проверка исходных данных

If (XK<=XN) Or (DX<=0) Then

Cells(1, 1) = "Введены некорректные данные:"

Cells(2, 1) = "XN=" & XN: Cells(3, 1) = "XK" & XK

Cells(4, 1) = "DX=" & DX

Else

'Выполнение расчетов и вывод результатов

Cells(1, 1) = "№": Cells(1, 2) = "x": Cells(1, 3) = "y"

N = 1

x = XN

While x <= XK

y = 2 * x * (x + b)

Cells(1 + N, 1) = N: Cells(1 + N, 2) = x

Cells(1 + N, 3) = y

N = N + 1

x = x + DX

Wend

Cells(1 + N + 1, 1) = "При b=" & b

End If

End Sub

 

 

Пример 5.2. Выполнить табулирование функции

для переменной x, значение которой изменяется от начального до конечного значения с постоянным положительным шагом.

Результаты вычисления оформить в виде таблицы. Вывести номер формулы вычисления.

 

Таблица соответствия переменных

Обозначение в задании Имя переменной Тип переменной Комментарий
y y вещественный Результат. Значение функции
x x вещественный Текущее значение аргумента функции
Начальное значение x XN вещественный Исходное данное
Конечное значение x XK вещественный Исходное данное
Шаг изменения значения x DX вещественный Исходное данное
N целый Номер итерации вычисления
f целый Номер формулы вычисления

Анализ исходных данных: начальное, конечное значение переменной x и шаг ее модификации, - этого примера аналогичен анализу исходных данных примера 5.1. Однако требуется дополнительный анализ текущего значения аргумента функции, т.к. от его значения зависит выбор функциональной зависимости: по формуле 1, 2 или 3.

Графическая схема алгоритма представлена на рис.5.4, а результаты тестирования программы – на рис.5.5.

 

Sub Pr5_2()

Dim y As Single, x As Single

Dim XN As Single, XK As Single, DX As Single

Dim N As Byte, f As Byte

'Ввод и проверка исходных данных

XN = InputBox("Введи начальное значение х")

XK = InputBox("Введи конечное значение х")

DX = InputBox("Введи шаг изменения х")

If (XK<=XN) Or (DX<=0) Then

Cells(1, 1) = "Введены некорректные данные:"

Cells(2, 1) = "XN=" & XN: Cells(3, 1) = "XK=" & XK

Cells(4, 1) = "DX=" & DX

Else

'Выполнение расчетов и вывод результатов

Cells(1, 1) = "№": Cells(1, 2) = "x" ' Вывод шапки таблицы

Cells(1, 3) = "y": Cells(1, 4) = "Формула"

N = 1 ' Номер вычислений

For x = XN To XK Step DX ' Вычисления

If x >3 Then

y = x - 1: f = 1 ' По формуле 1

ElseIf x < -3 Then

y = x + 1: f = 2 ' По формуле 2

Else

y = x^2 : f = 3 ' По формуле 3

End If

Cells(1 + N, 1) = N: Cells(1 + N, 2) = x ' Номер вычислений и значение х

Cells(1 + N, 3) = y: Cells(1 + N, 4) = f ' Вывод y и номера формулы

N = N + 1 ' Модификация значения номера вычислений

Next

End If

End Sub

 

Для программирования циклических действий в приведенных выше примерах используются разные операторы цикла: в примере 5.1 – это оператор While … Wend, а в примере 5.2 – оператор For … Next.

ЛИТЕРАТУРА

1. Васильев А., Андреев А. VBA в Jffice 2000: учебный курс.-СПб.: Питер, 2001. -432с.

2. Гарнаев А.Ю. Excel, VBA, Internet в экономике и финансах. – СПб.: БХВ-Петербург,2002. – 816 с.; ил.

3. Кузьменко В.Г. Программирование на VBA 2002. – М.: ООО «Бином-Пресс», 2003 г. – 880 с.; ил.

4. Санна Пол и др. Visual Basic для приложений (версия5) в подлиннике: пер. с англ. – СПб.: BHV – Санкт-Петербург, 1998. – 704 с.

5. Браун С. Visual Basic 6: учебный курс. – СПб.: Питер, 2002. – 576 с.: ил.

6. Карпов Б. Visual Basic 6: специальный справочник. – СПб.: Питер, 2002. – 416 с.: ил.

7. Райтингер М., Муч Г. Visual Basic 6.0: пер. С нем. – К.: Издательская группа BHV, 2000. – 288 с. (Серия «Библиотека студента»)