- •Ю. В. Любицкий
- •Предисловие
- •Введение
- •Этапы решения вычислительных задач на ЭВМ
- •Алгоритмизация вычислительных процессов
- •Понятие алгоритма
- •Основные свойства алгоритма
- •Формы представления алгоритмов
- •Представление алгоритмов в графическом виде
- •Типы алгоритмических структур
- •Программирование вычислительных задач на языке VBA
- •Линейная структура
- •Разветвляющаяся структура
- •Циклическая структура
- •Заключение
- •Библиографический список
- •Приложение А – Индивидуальные задания для алгоритмов линейной структуры
- •Приложение Б – Индивидуальные задания для алгоритмов разветвляющейся структуры
- •Приложение В – Индивидуальные задания для алгоритмов циклической структуры
- •Вариант 6
- •Составьте программу для расчёта количества изделий, выпускаемого некоторым предприятием в течение каждого месяца года. Программа должна предусматривать вычисление среднего годового значения количества изделий.
- •Вариант 7
- •Вариант 8
- •Рассчитайте суммарные субсидии на производство 1, 3, 5, 7 млн яиц, а также 600, 900, 1 200, 1 500 тонн молока. Определите, размер субсидий для производства какого вида животноводческой продукции больше.
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Составьте программу для расчёта платы за перевозку экспортных и импортных грузов по железной дороге на расстояние 1 000 км в зависимости от массы груза
- •Составьте программу для расчёта платы за перевозку экспортных и импортных грузов по железной дороге массой 50 тонн в зависимости от расстояния
- •Вариант 19
- •Составьте программу для расчёта платы за перевозку наливных грузов в цистернах общего парка в зависимости от расстояния
- •Вариант 20
- •Вариант 21
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
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