Пособие_по_алгоритмизации_и_программированию
..pdf11
Вситуациях, когда количество повторений цикла заранее неизвестно, можно воспользоваться циклическими структурами с условиями.
Вструктуре с предусловием условие, контролирующее необходимость про-
должения циклических действий, проверяется перед телом цикла (рисунок 4).
Если «Условие» выполняется, тело цикла повторяется, если нет – управление передаётся на следующий за циклом блок алгоритма (рисунок 4):
Вход |
Нет |
Условие |
Да |
Тело цикла |
Выход |
Рисунок 4 – Блок-схема циклического алгоритма с предусловием
В структуре с постусловием условие, проверяющее, будут ли повторяться циклические действия, размещается после тела цикла (рисунок 5).
Вход
Тело цикла
Да |
Нет |
|
Условие
Выход
Рисунок 5 – Блок-схема циклического алгоритма с постусловием
Различие между циклическими структурами с условием заключается в том, что в алгоритме с предусловием тело цикла может не выполняться ни разу
(это зависит от результата проверки «Условия»), а в алгоритме с постусловием тело цикла обязательно будет исполнено по крайней мере один раз.
12
Программирование вычислительных задач на языке VBA
Линейная структура
Создадим процедуру для расчёта показателей платежеспособности и финан-
совой устойчивости предприятия.
Денежные средства, расчеты и прочие активы предприятия:
D = R + S , |
( 1 ) |
где R – расчёты с дебиторами,
S – денежные средства.
Коэффициент срочной ликвидности:
|
|
|
|
S + ( R − |
R F |
) |
|
|
||
|
|
|
|
|
|
|
||||
|
|
K S |
= |
100 |
|
|
, |
( 2 ) |
||
|
|
|
T − DK − FP |
|||||||
|
|
|
|
|
|
|
||||
где F – |
резерв по сомнительным долгам, |
|
|
|||||||
T – |
общая сумма расчётов и прочих пассивов, |
|
||||||||
DK – |
долгосрочные кредиты, |
|
|
|
|
|
|
|
|
|
FP – |
фонды потребления. |
|
|
|
|
|
|
|
|
|
Коэффициент текущей ликвидности: |
|
|
||||||||
|
|
KT |
= |
|
Z + D |
, |
( 3 ) |
|||
|
|
|
|
|
|
|
||||
|
|
|
T − DK − FP |
|||||||
|
|
|
|
|
|
|
||||
где Z – |
запасы и затраты. |
|
|
|
|
|
|
|
|
Математическая постановка задачи предполагает реализацию алгоритма ли-
нейной структуры – все действия выполняются однократно и последовательно друг за другом.
Используем для построения блок-схемы и в качестве имён переменных в программном коде создаваемой процедуры обозначения экономических харак-
теристик, указанные в формулах (1 ) – ( 3 ).
13
Блок-схему решаемой задачи представим в виде:
Начало
Ввод R, S
D = R + S
Вывод D
Ввод F, T, DK, FP
|
|
|
|
|
S + (R − |
R F |
) |
|||
|
|
|
|
|
||||||
|
KS |
= |
|
|
100 |
|
|
|
||
|
T − DK |
− FP |
||||||||
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
Вывод K S |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||
|
|
|
Ввод Z |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
KT |
= |
|
|
Z + D |
|||||
|
|
|
|
|
|
|
|
|||
|
T − DK − FP |
|||||||||
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вывод KT
Конец
Рисунок 6 – Блок-схема задачи линейной структуры
Создадим процедуру для выполнения расчётов. Ввод исходных данных и вывод полученных результатов организуем с помощью диалоговых окон [ 3 ].
Программный код процедуры будет иметь следующий вид (комментарии,
указанные после символов апострофа, не являются обязательными и использу-
ются только для пояснения выполняемых действий):
Public Sub Показатели_предприятия() 'Объявление типов переменных
Dim R As Single, S As Single, D As Single
Dim F As Single, T As Single, DK As Single
Dim FP As Single, KS As Single, Z As Single, KT As Single
14
'Ввод исходных данных
R = InputBox("Введите расчёты с дебиторами")
S = InputBox("Введите денежные средства")
'Вычисление денежных средств, расчётов и прочих активов
D = R + S
'Вывод полученного результата
MsgBox ("Денежные средства, расчёты и прочие активы " & _ "для предприятия равны " & D)
'Ввод исходных данных
F = InputBox("Введите резерв по сомнительным долгам")
T = InputBox("Введите общую сумму расчётов и прочих пассивов") DK = InputBox("Введите долгосрочные кредиты")
FP = InputBox("Введите фонды потребления") 'Вычисление коэффициента срочной ликвидности
KS = (S + (R - R * F / 100)) / (T - DK - FP) 'Вывод полученного результата
MsgBox ("Коэффициент срочной ликвидности равен " & KS) 'Ввод исходных данных
Z = InputBox("Введите запасы и затраты") 'Вычисление коэффициента текущей ликвидности
KT = (Z + D) / (T - DK - FP) 'Вывод полученного результата
MsgBox ("Коэффициент текущей ликвидности равен " & KT) End Sub
Выполним расчёт при следующих значениях |
исходных данных: |
R = |
2 350 тыс. руб., S = 5 100 тыс. руб., F = 10 %, T |
= 7 200 тыс. руб., |
DK = |
750 тыс. руб., FP = 375 тыс. руб., Z = 14 200 тыс. руб. |
|
В ходе выполнения программного кода на экране монитора последовательно будут появляться диалоговые окна, в поля которых следует вводить исходные данные для вычислений, или в которых будут отображаться полученные резуль-
таты (некоторые из этих окон изображены на рисунке 7).
15
Рисунок 7 – Диалоговые окна для ввода исходных данных и вывода полученных результатов
С помощью VBA можно создать новую (пользовательскую) функцию MS Excel, которая будет использоваться аналогично стандартным встроенным функ-
циям, таким как СУММ, СРЗНАЧ и др.
Программный код при создании пользовательской функции обязательно должен быть введён в модуле VBA Module1, Module2 и др. Если создать поль-
зовательскую функцию в модулях Лист или ЭтаКнига, она не будет видна при
вводе формул в ячейки рабочего листа.
Создадим пользовательскую функцию MS Excel для расчёта коэффициента
текущей ликвидности.
Предварительно нужно создать модуль (Insert → Module), если он не был
создан заранее, и активизировать его. Затем выполняются действия
Insert → Procedure. В появившемся диалоговом окне вводится имя процедуры,
указывается её тип – Function (процедура-функция), определяется область дей-
ствия функции – Public (рисунок 8):
16
Рисунок 8 – Диалоговое окно для создания процедуры
Ключевое слово Public указывает, что процедура-функция будет доступна для всех других процедур во всех модулях открытых проектов. Если использо-
вать ключевое слово Private, созданная пользовательская функция не будет вид-
на в диалоговом окне Мастер функций при попытках ввести её в формулу.
После нажатия кнопки OK вводим программный код процедуры:
Public Function Текущая_ликвидность(R As Single, S As Single, _
T As Single, DK As Single, FP As Single, Z As Single) As Single Dim D As Single
D = R + S
Текущая_ликвидность = (Z + D) / (T - DK - FP)
End Function
Обратите внимание, что в программном коде процедуры-функции имя про-
цедуры используется в качестве имени переменной, которой будет присваивать-
ся вычисленное в процедуре итоговое значение. После завершения выполнения процедуры-функции она всегда возвращает текущее значение переменной, имя которой совпадает с названием функции.
В круглых скобках после имени процедуры через запятую перечисляются имена переменных (и объявляются их типы), значения которых будут вводиться в диалоговом окне, появляющемся при вызове данной пользовательской функ-
ции, и использоваться при выполнении процедуры в качестве исходных данных для расчёта.
17
Воспользоваться созданной пользовательской функцией можно обычным
способом:
1)выполнить команды Вставка → Функция или нажать кнопку fx в строке формул;
2)в появившемся диалоговом окне Мастер функций выбрать категорию
Определённые пользователем, затем имя нужной функции (рисунок 9);
Рисунок 9 – Диалоговое окно для выбора пользовательской функции
3) в диалоговом окне второго шага Мастера функций ввести значения ар-
гументов функции с клавиатуры или с помощью ссылок на нужные ячейки рабо-
чего листа (рисунок 10).
Рисунок 10 – Диалоговое окно для ввода значений исходных данных
18
Разветвляющаяся структура
Создадим процедуру для расчёта стоимости жилищно-коммунальных услуг в
г. Хабаровске, исходя из численности семьи и типа дома, в котором она
проживает:
|
Стоимость (руб. в месяц) |
||
|
|
|
|
Тип дома |
на одиноко |
на одного члена |
на одного члена |
|
проживающего |
семьи из двух |
семьи из трёх и |
|
гражданина |
человек |
более человек |
Многоквартирный |
1172 |
972 |
955 |
|
|
|
|
Жилой |
351 |
259 |
251 |
|
|
|
|
Поставленная задача предполагает выполнение вычислений по нескольким ветвям в зависимости от типа дома и количественного состава семьи.
Для построения блок-схемы используем следующие обозначения (в про-
граммном коде они будут являться именами переменных):
−S – стоимость жилищно-коммунальных услуг;
−TD – тип дома;
−R – количество членов семьи.
Блок схема будет иметь вид:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Начало |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ввод |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TD, R |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
да |
|
|
|
|
|
|
|
|
|
|
|
|
нет |
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TD = «Жилой» |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нет |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
да |
|
|
|
|
|
нет |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
R = 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R = 1 |
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нет |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нет |
|
|||||
|
|
|
|
|
|
да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да |
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
R = 2 |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R = 2 |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S = 351 |
|
S = R × 259 |
|
|
|
S = R × 251 |
|
|
S = 1172 |
|
|
S = R × 972 |
|
|
|
|
S = R × 955 |
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вывод S
Конец
Рисунок 11 – Блок-схема задачи разветвляющейся структуры
19
Создадим пользовательскую форму для расчёта стоимости жилищно-
коммунальных услуг (рисунок 12). Технологии вывода формы на экран, добав-
ления в форму элементов управления, создания процедур обработки событий достаточно подробно рассмотрены в работе [ 7 ].
Рисунок 12 – Проект создаваемой пользовательской формы
Дадим форме имя «Услуги», в заголовке окна формы предусмотрим вывод текста «ЖКХ» (рисунок 12).
Разместим на рабочем листе MS Excel командную кнопку и создадим проце-
дуру, которая будет выполняться при нажатии этой кнопки и загружать форму в оперативную память, а также выводить её на экран [ 7 ]:
Private Sub CommandButton1_Click()
Услуги.Show End Sub
В форме размещены следующие элементы управления.
Надписи: РАСЧЁТ стоимости жилищно-коммунальных услуг – Label1,
Тип дома – Label2, Количество проживающих – Label3.
Поле со списком Тип дома – ComboBox1.
Текстовые поля: Количество проживающих – TextBox1, Стоимость
услуг – TextBox2.
Кнопки: Стоимость услуг – CommandButton1, Сброс – CommandButton2,
Закрыть – CommandButton3.
20
Поле со списком Тип дома и текстовое поле Количество проживающих
будут использоваться для ввода исходных данных для решения задачи, тексто-
вое поле Стоимость услуг – для отображения полученного результата.
Для формирования значений данных в поле со списком Тип дома («Много-
квартирный» и «Жилой») создадим процедуру Initialize (инициализация), кото-
рая будет выполняться автоматически перед выводом пользовательской формы на экран [ 7 ]:
Private Sub UserForm_Initialize()
ComboBox1.AddItem "Многоквартирный"
ComboBox1.AddItem "Жилой"
End Sub
Удаление из полей формы введённых в них ранее значений данных органи-
зуем с помощью нажатия кнопки Сброс. Для этого создадим процедуру, которая будет выполняться в результате этого действия [ 7 ]:
Private Sub CommandButton2_Click()
ComboBox1.Value = ""
TextBox1.Value = ""
TextBox2.Value = ""
End Sub
Закрытие формы и её удаление из оперативной памяти будут осуществляться при нажатии кнопки Закрыть. Выполняемая при этом процедура имеет сле-
дующий вид [ 7 ]:
Private Sub CommandButton3_Click()
Unload Услуги
End Sub
Рассмотренные действия и созданные с их помощью процедуры предназна-
чены лишь для организации работы с формой и ввода через неё исходных дан-
ных для дальнейших вычислений. Расчёт стоимости жилищно-коммунальных услуг будет производиться при нажатии кнопки Стоимость услуг.