Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4928.pdf
Скачиваний:
11
Добавлен:
13.11.2022
Размер:
831 Кб
Скачать

25

Циклическая структура

Создадим процедуру для расчёта годовой амортизации имущества по формуле

GA

2 (N OS) (PA PR 1)

,

( 4 )

PA (PA 1)

 

 

 

где N – начальная стоимость имущества,

OS – стоимость имущества в конце периода амортизации, PA – время эксплуатации имущества (период амортизации),

PR – период, для которого рассчитывается годовая амортизация

(1, 2, …РА лет).

Расчёт годовой амортизации имущества выполняется несколько раз при различных значениях PR , но по одной и той же формуле. Поэтому поставленная задача решается с помощью алгоритма циклической структуры.

Рассмотрим различные способы реализации такого алгоритма. Для построения блок-схем и в качестве имён переменных в программном коде создаваемых процедур используем обозначения, указанные в формуле ( 4 ).

Способ 1. Решим задачу с помощью условных операторов. Условие выхода из цикла будем проверять до начала тела цикла (цикл с предусловием). Блоксхема вычислительного процесса будет выглядеть следующим образом:

Начало

Ввод N, OS, PA

PR = 1

да

PR > PA

 

 

 

нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GA

2 (N OS) (PA PR 1)

 

 

 

 

 

PA (PA 1)

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывод PR, GA

PR = PR + 1

Конец

Рисунок 13 – Блок-схема задачи циклической структуры (цикл организован с помощью условия)

26

Ввод исходных данных для расчётов и вывод полученных результатов организуем с помощью диалоговых окон.

Процедура для решения задачи будет иметь вид:

Public Sub Амортизация1()

Dim N As Single, OS As Single 'Объявление типов переменных

Dim PA As Integer, PR As Integer, GA As Single

'Ввод начальных данных

N = InputBox("Введите начальную стоимость имущества")

OS = InputBox("Введите стоимость имущества в конце периода амортизации") PA = InputBox("Введите время эксплуатации имущества")

PR = 1

M2: If PR > PA Then GoTo M1

GA = (2 * (N - OS) * (PA - PR + 1)) / (PA * (PA + 1))

MsgBox ("Амортизация имущества в " & PR & " году равна " & GA) PR = PR + 1

GoTo M2

M1: MsgBox ("Конец расчёта") End Sub

Выполним расчёты при следующих значениях исходных данных: начальная стоимость имущества – 30 000 рублей, стоимость имущества в конце периода амортизации – 7 500 рублей, время эксплуатации имущества – 10 лет.

Каждое из рассчитанных годовых значений амортизации имущества выводится в отдельном диалоговом окне вида (рисунок 14):

Рисунок 14 – Диалоговое окно с результатами расчётов

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

27

Способ 2. Для решения задачи используем специальную конструкцию для организации циклов, синтаксис которой имеет вид:

For I = M1 To M2 [ Step M3 ]

операторы тела цикла

Next I

Простая числовая переменная I , значение которой изменяется после каждого выполнения операторов тела цикла, называется переменной цикла. M1, M2, M3 – числовые константы, переменные или выражения, определяющие, соответственно, начальное и конечное значения, шаг изменения переменной цикла. Их значения могут быть как положительными, так и отрицательными. Если M3 = 1, ключевое слово Step и параметр M3 могут быть опущены.

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

вычисляются (если необходимо) значения M1, M2 и M3;

переменной цикла I присваивается значение M1;

выполняются операторы, составляющие тело цикла;

значение переменной цикла I изменяется на величину шага M3;

если значение переменной цикла I находится в интервале между M1 и M2, вновь выполняются операторы тела цикла, в противном случае управление передаётся оператору, следующему за Next I.

Построим блок-схему для поставленной задачи. Для организации в ней цикла используем блок модификации:

Начало

Ввод N, OS, PA

PR = 1, PA

GA

2 (N OS) (PA PR 1)

PA (PA 1)

 

Вывод PR, GA

Конец

Рисунок 15 – Блок-схема задачи циклической структуры (цикл организован с помощью блока модификации)

28

Используем рассмотренную конструкцию при создании процедуры Амортизация2. Вывод полученных результатов организуем в ячейки рабочего листа

MS Excel.

Public Sub Амортизация2()

Dim N As Single, OS As Single 'Объявление типов переменных

Dim PA As Integer, PR As Integer, GA As Single

'Ввод начальных данных

N = InputBox("Введите начальную стоимость имущества")

OS = InputBox("Введите стоимость имущества в конце периода амортизации") PA = InputBox("Введите время эксплуатации имущества")

'Создание заголовков столбцов результатов расчётов

Range("A1") = "Год"

Range("B1") = "Амортизация имущества"

'Выполнение расчётов и вывод результатов с помощью цикла

For PR = 1 To PA

GA = (2 * (N - OS) * (PA - PR + 1)) / (PA * (PA + 1)) Cells(PR + 1, 1) = PR

Cells(PR + 1, 2) = GA Next PR

End Sub

Очевидно, что программный код процедуры Амортизация2 проще и читается существенно легче, чем процедуры Амортизация1.

Фрагмент рабочего листа MS Excel с полученными результатами расчётов имеет вид:

Рисунок16 – Результаты расчётов, выведенные на рабочий лист MS Excel

29

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

VBA включает различные конструкции для решения данной проблемы: While Wend, несколько вариантов типа Do Loop [ 7, 8 ].

Например, упрощённый синтаксис одного из них (с проверкой условия до выполнения операторов тела цикла) выглядит следующим образом:

Do While условие операторы тела цикла

Loop

Когда в выполняемом программном коде встречаются ключевые слова Do While, проверяется «условие». Если оно выполняется, исполняются операторы тела цикла, если нет – происходит переход к оператору, следующему за ключевым словом Loop.

Если операторы тела цикла выполнялись, ключевое слово Loop обеспечивает возврат к Do While для новой проверки «условия». Эти действия повторяются до тех пор, пока «условие» не перестанет выполняться (полученный результат равен логическому значению ЛОЖЬ).

Упрощённый синтаксис конструкции с проверкой условия после выполнения тела цикла:

Do

операторы тела цикла

Loop While условие

В этой конструкции операторы тела цикла выполняются как минимум один раз. Они повторяются многократно, пока «условие» не перестанет выполняться.

Предположим, расчёт годовой амортизации имущества следует завершить, когда её значения будут меньше, чем 2 500 рублей. Создадим процедуру, использующую конструкцию Do Loop While:

30

Public Sub Амортизация3()

Dim N As Single, OS As Single 'Объявление типов переменных

Dim PA As Integer, PR As Integer, GA As Single

'Ввод начальных данных

N = InputBox("Введите начальную стоимость имущества")

OS = InputBox("Введите стоимость имущества в конце периода амортизации") PA = InputBox("Введите время эксплуатации имущества")

'Создание заголовков столбцов результатов расчётов

Range("A1") = "Год"

Range("B1") = "Амортизация имущества"

'Выполнение расчётов и вывод результатов с помощью цикла

PR = 1

Do

GA = (2 * (N - OS) * (PA - PR + 1)) / (PA * (PA + 1)) Cells(PR + 1, 1) = PR

Cells(PR + 1, 2) = GA PR = PR + 1

Loop While GA > 2500 End Sub

Обратите внимание, что перед циклом переменной PR присваивается значение, равное 1. Если этого не сделать, при первом выполнении операторов тела цикла по умолчанию будет использоваться значение данной переменной, равное нулю. В итоге ошибочно будет рассчитана амортизация имущества для нулевого года его эксплуатации.

Результаты вычислений приводятся на рисунке 17:

Рисунок17 – Результаты расчётов, выведенные на рабочий лист MS Excel

31

Public Sub Амортизация3()

Dim N As Single, OS As Single 'Объявление типов переменных

Dim PA As Integer, PR As Integer, GA As Single

'Ввод начальных данных

N = InputBox("Введите начальную стоимость имущества")

OS = InputBox("Введите стоимость имущества в конце периода амортизации")

PA = InputBox("Введите время эксплуатации имущества") 'Создание заголовков столбцов результатов расчётов

Range("A1") = "Год"

Range("B1") = "Амортизация имущества"

'Выполнение расчётов и вывод результатов с помощью цикла

PR = 1

GA = (2 * (N - OS) * PA) / (PA * (PA + 1)) Do While GA > 2500

GA = (2 * (N - OS) * (PA - PR + 1)) / (PA * (PA + 1)) Cells(PR + 1, 1) = PR

Cells(PR + 1, 2) = GA PR = PR + 1

Loop End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]