7.4 Программирование
циклов
Цикл – это оператор или группа
операторов, которые программа многократно выполняет до тех пор, пока не получит
команду начать выполнение чего – либо другого. В Visual Basic существуют два
основных типа циклов – циклы со счетчиком (с известным числом повторений) и
циклы с условием. Циклы со счетчиком используют в тех случаях, когда необходимо
выполнить некоторые действия определенное число раз. Циклы с условием
применяются тогда, когда некоторые действия в программе должны повторяться до
тех пор, пока выполняется определенное условие или до тех пор, пока не будет
выполнено определенное условие.
7.4.1 Циклы со счетчиком
Циклы со счетчиком (с известным числом
повторений) в Visual Basic еще называют циклами For, или циклами For ... Next.
Так они называются потому, что
начало и конец этих циклов определяются операторами For и Next. Синтаксис цикла
For. . .Next таков:
For СчетчикЦикла= НачальноеЗначение ToКонечноеЗначение [Step Шаг]
операторы
[Exit
For]
Next [СчетчикЦикла]
где
For - ключевое слово Visual Basic,
обозначающее начало цикла;
СчетчикЦикла- переменная,
определенная в качестве счетчика цикла;
НачальноеЗначение - число, задающее начальное значение
счетчика;
То - ключевое слово Visual
Basic, разделяющее НачальноеЗначение и КонечноеЗначение - число, задающее значение счетчика, при
котором цикл завершается;
Step - ключевое слово Visual
Basic, используемое для задания шага цикла, необязательный
аргумент;
Шаг - число, задающее шаг цикла,
т.е. значение на которое увеличивается (или уменьшается) значение счетчика на
каждом шаге, это число может быть отрицательным;
Exit For – оператор досрочного
выхода из цикла (необязательный);
Next - ключевое слово Visual Basic,
обозначающее конец цикла.
В начале цикла For ...Next
определяется переменная-счетчик, а так же начальное и конечное значения этой
переменной. В самом начале выполнения цикла переменная - счетчик устанавливается в начальное
значение. Каждый раз, когда программа пройдя через цикл, возвращается к его
началу, значение счетчика увеличивается. Если используется ключевое слово
Step, то переменная- счетчик
изменяется в соответствии с числом, указанным после ключевого слова Step.
Например:
For I = 0 То 10 Step 2 ' Значение
I будет увеличиваться на 2
Если ключевое слово Step
отсутствует, то значение шага равно единице.
Каждый раз, когда значение
переменной-счетчика изменяется, оно сравнивается с заданным конечным значением
счетчика. Если значение счетчика превышает конечное значение, программа сразу
выходит из цикла и переходит к той строке кода, которая следует за
циклом.
Пример:
Option
Explicit
Dim I As
Integer
For I = 1 To
4
Sum =Sum +
2
Next
I
Этот цикл эквивалентен написанию
четырех операторов Sum =Sum + 2 в тексте программы.
Цикл For . . . Next Может быть прерван досрочно,
например, при достижении какого - либо условия. Для этого в нужном месте цикла
нужно поместить оператор Exit For. Например:
Option
Explicit
Dim Sum As
Integer
Dim j As
Integer
Sum =
2
For j = 1 To
10
Sum = Sum +
j
If
Sum > 6 Then
Exit
For ‘ Выход из цикла, если значение Sum больше 6
End
If
Next
j
TextBox1.Text =
Sum
В этом примере цикл прерывается
досрочно, когда значение переменной Sum
будет больше 6. В результате выполнения этого кода в текстовом поле будет
выведено вычисленное значение переменной Sum равное 8.
7.4.2 Циклы с условием
Главной особенностью циклов с условием является
условие, которое может быть любым выражением, принимающим значение True (Истина)
или False (Ложно). В Visual Basic
есть два основных цикла с условием - цикл Do While … Loop и цикл Do Until … Loop. Оба они могут быть с предусловием или с
постусловием.
Циклы Do While | Until имеет следующий
синтаксис:
Цикл с
предусловием
|
Цикл с
постусловием
|
Do While | Until
Выражение
Операторы
[Exit
Do]
Loop
|
Do
Операторы
[Exit
Do]
Loop While |
Until Выражение
|
где
Do - ключевое
слово;
While | Until - ключевые слова,
указывающие тип цикла;
Выражение - выражение условия,
принимающее значение True или False;
Loop - ключевое слово,
указывающее на окончание цикла.
Цикл Do While выполняется до тех
пор, пока выражение условия имеет значение True.
Пример цикла Do While,
реализующего алгоритм программы, аналогичный приведенной в примере для цикла For
с досрочным прерыванием:
Option
Explicit
Dim Sum As
Integer
Dim j As
Integer
Sum =
2
Do While Sum <
7
Sum = Sum +
j
j = j +
1
Loop
TextBox1.Text =
Sum
В результате выполнения этого
кода в текстовом поле будет выведено вычисленное значение переменной Sum равное
8.
В отличие от цикла Do While цикл Do Until выполняется до тех пор,
пока выражение условия имеет значение False.
Пример цикла Do Until,
реализующего алгоритм программы аналогичный приведенному
выше:
Option
Explicit
Dim Sum As
Integer
Dim j As
Integer
Sum =
2
Do Until Sum >7
Sum = Sum +
j
j = j +
1
Loop
TextBox1.Text =
Sum
В результате выполнения этого
примера в текстовом поле будет выведено
вычисленное значение переменной Sum равное 8.
Иногда бывает необходимо
прервать цикл Do … Loop, если выполняется какое-либо дополнительное условие. Это
может быть сделано с помощью оператора Exit Do. Например:
Option
Explicit
Dim Sum As
Integer
Dim j As
Integer
Sum =
2
Do Until Sum >
7
Sum = Sum +
j
j = j +
1
If j > 3 Then
Exit Do ‘ Досрочный выход из цикла Do …
Loop
End
If
Loop
TextBox1.Text =
Sum
В этом примере цикл с условием
досрочно прерывается, если выполняется дополнительное условие j > 3. В
результате выполнения программного кода переменная Sum будет иметь значение,
равное 8.
Используя цикл с условием можно
организовать бесконечный цикл. Иногда это бывает необходимо, а иногда это
происходит из-за ошибки пользователя. Для создания бесконечного цикла условное
выражение должно быть таким, которое никогда не выполняется или выполняется
всегда. Например:
Do Until 1
Операторы
Loop
Выйти из такого бесконечного
цикла и прервать работу программы можно нажав комбинацию клавиш
<Ctrl+Break>.
Расчет накопленной стоимости при неравномерных непериодических платежах рассчитывается по формуле:
где P – сумма на счете;
I – номинальная годовая ставка;
dt- продолжительность периода, за который расчитываются проценты;
k – количество платежей.
Требуется: разработать функцию пользователя для расчета накопленной стоимости по методу простых процентов по приведенной выше формуле.
Задаваемыми исходными данными для решения задачи являются величины
суммы платежей, даты их выплаты и
номинальная процентная ставка. Вычисляемыми данными являются количество платежей
и продолжительность периода.
Переменная
|
Идентификатор
|
Тип
данных
|
Примечание
|
Величина платежа |
Платеж |
Variant
|
Параметр функции, передающий значения диапазона ячеек |
Дата платежа |
Дата |
Variant |
Параметр функции, передающий значения диапазона ячеек |
Номинальная cтавка |
Ставка |
Single
|
Параметр функции |
K
|
K
|
Integer
|
Вычисляемое значение |
|
i
|
Integer
|
Счетчик цикла |
Dt
|
Дельта |
Integer
|
Вычисляемое значение как разность между двумя смежными датами |
Текущая сумма |
Summa
|
Double
|
Вспомогательная переменная |
Функция |
НАКСУММА
|
Double
|
Имя функции (возвращаемое значение) |
Замечание. Если параметр функции передает значения массива ячеек, то он должен иметь тип Variant.
Для создания функции выполните действия:
1.
Создайте модуль.
2. Вставьте в созданный модуль подпрограмму – функцию.
3. Введите в нее следующий код:
Public Function НАКСУММА(Ставка As Single,
_
Платеж As Variant, _
Дата As Variant) As Double
Dim
K As Integer
Dim
i As Integer
Dim
Summa As Double 'Текущая сумма вклада
Dim Дельта As Integer 'Разность в днях между
‘двумя платежами
Summa = Платеж(1)
K = Платеж.Count 'общее количество платежей
For i = 2 To
K
Дельта = Дата(i) - Дата(i - 1)
Summa = Summa + Summa * Ставка * Дельта / 365 + Платеж(i)
Next
НАКСУММА = Summa
End Function
Для проверки работоспособности функции решите следующую задачу:
Клиент сделал вклад на текущий счет в банке в сумме 1000р под 60 процентов годовых. Через 3, 6 и 9 месяцев он вложил еще по 1000р. В конце учетного года клиент закрыл счет. Какую сумму он получил при закрытии счета?
На рабочем листе Excel подготовьте таблицу с исходными данными и выполните расчет, применив созданную функцию.
Платежи
|
Даты
платежей
|
|
|
1000р
|
01.01.01
|
|
|
1000р
|
01.04.01
|
|
|
1000р
|
01.07.01
|
|
|
1000р
|
01.10.01
|
|
Правильный результат
|
0
|
31.12.01
|
Накопленная сумма
|
5740,95р
|