- •ОБЩИЕ СВЕДЕНИЯ
- •ЛАБОРАТОРНАЯ РАБОТА 5
- •ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
- •Основные сведения
- •Задания к лабораторной работе 5
- •ЛАБОРАТОРНАЯ РАБОТА 6
- •ОДНОМЕРНЫЕ МАССИВЫ
- •Основные сведения
- •Задание к лабораторной работе 6
- •ЛАБОРАТОРНАЯ РАБОТА 7
- •ДВУМЕРНЫЕ МАССИВЫ
- •Основные сведения
- •Задания к лабораторной работе 7
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •ОГЛАВЛЕНИЕ
ЛАБОРАТОРНАЯ РАБОТА 5
ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
Основные сведения
Процесс, в котором один оператор или группа операторов выполняются многократно при различных значениях аргумента, называется циклическим процессом. В VBA для выполнения повторяющихся действий используются операторы цикла, которые бывают следующих типов:
•оператор цикла с параметром For – Next, конструкция которого используется, если заранее известно, сколько раз должно повториться тело цикла:
For счетчик = начальное_значение То конечное_значение Step шаг блок_операторов
Next счетчик
•операторы цикла с предусловием или постусловием, которые используются для организации цикла с неизвестным заранее числом повторений тела цикла:
Конструкция цикла |
Конструкция цикла |
с предусловием имеет вид: |
с постусловием имеет вид: |
Do While условие |
Do |
блок_операторов |
блок_операторов |
Loop |
Loop While условие |
или |
или |
Do Until условие |
Do |
блок_операторов |
блок_операторов |
Loop |
Loop Until условие |
или |
|
While условие |
|
блок_операторов |
|
Wend |
|
Пример 1
Разработаем пользовательскую форму и составим программу для определения индекса рентабельности предлагаемого инвестиционного проекта обновления оборудования, если сумма первоначальных вложений (ПВ) составляет 10 000 тыс. р., ставкадисконтированияr = 10 %, апредполагаемые денежныепотокиследующие:
Год |
0 |
1 |
2 |
3 |
4 |
5 |
Денежный поток (ДПkB ),B тыс. р. |
-10 000 |
+5000 |
+4000 |
+3000 |
+2500 |
+1000 |
|
4 |
|
|
|
|
|
Пусть пользовательская форма будет иметь вид (рис. 1), а значения величин денежных потоков в 1-м – 5- х годах считываются из ячеек рабочего листа «Пример 1» (рис. 2).
Свойства объектов формы представлены в таблице 1.
Рис. 1. Форма «Индекс рентабельности |
Индекс |
рентабельности |
|||||
инвестиционного проекта» |
рассчитывается по формуле |
|
|
|
|||
|
|
|
∑n |
ДПk |
|
|
|
|
|
|
k |
|
|
||
|
|
ИР = |
k =1 (1+ r) |
|
, |
||
|
|
|
|
||||
|
|
|
|
ПВ |
|
|
|
где n – количество лет, в течение которых будут приходить денежные поступления.
Рис. 2. Таблица распределения денежных потоков
|
|
|
|
|
Таблица 1 |
|
|
|
|
|
|
|
|
|
Объект |
Свойство |
|
Объект |
Свойство |
|
|
|
Caption = Индекс рента- |
|
|
Caption = Размер первоначаль- |
|
|
UserForm1 |
бельности инвестиционно- |
Label1 |
ных вложений |
|
|
|
|
го проекта |
|
|
AutoSize = True |
|
|
|
Name = calc |
|
|
Caption = Ставка дисконтирова- |
|
|
CommandButton1 |
|
Label2 |
ния, % |
|
|
|
Caption = Рассчитать |
|
|
|||
|
|
|
|
|
AutoSize = True |
|
|
CommandButton2 |
Name = clean |
|
Label3 |
Caption = Индекс рентабельности |
|
|
Caption = Очистить |
|
AutoSize = True |
|
||
|
CommandButton3 |
Name = exitForm |
|
TextBox3 |
Name = txtIR |
|
|
Caption = Выход |
|
Locked = True |
|
||
|
TextBox1 |
Name = txtPV |
|
TextBox2 |
Name = txtSD |
|
|
Для обработки события нажатия кнопки «Рассчитать» введем следующий |
|||||
код: |
|
|
|
|
|
|
Private Sub calc_Click() |
‘задание типа переменных |
|||||
Dim pv, dp, i, n As Integer |
||||||
Dim r, s As Single |
‘считывание значений переменных |
|||||
|
pv = Val(txtPV.Text) |
|||||
|
r = Val(txtSD.Text) / 100 |
|
|
|
|
|
n = Val(InputBox("Введите количество лет, в течение которых будут
приходить |
денежные |
поступления ", "Ввод данных")) |
||
s = |
0 |
= 1 To n |
|
|
For |
i |
|
‘считывание значений денежных потоков |
|
|
dp = Cells(2, i + 2) |
|||
|
s |
= s + dp |
/ (1 + r) ^ i |
‘суммирование |
Next i |
|
|
5 |
|
|
|
|
|
|
txtIR.Text = Round(s / pv, 2) ‘округление и вывод результата
End Sub
Функция Round(N, k) округляет число N до k знаков после запятой.
Далее с помощью элемента Кнопка панели инструментов Элементы управления разместим ниже таблицы кнопку «Открыть форму» для запуска процедуры «ФормаИндексРентабельности» (рис. 3). Код данной процедуры имеет вид:
Private Sub ФормаИндексРентабельности_Click ()
UserForm1.Show
End Sub
Рис. 3. Определение индекса рентабельности инвестиционного проекта
С помощью созданной кнопки «Открыть форму» запустим форму и рассчитаем индекс рентабельности инвестиционного проекта (рис. 3).
Пример 2
Разработаем пользовательскую форму и составим программу для поиска всех двузначных чисел, сумма квадратов цифр которых делится на 13.
Для создания данной пользовательской формы перейдем в редактор VB (останемся в той же рабочей книге MS Excel, что и в примере 1) и добавим еще одну форму (рис. 4).
Свойства объектов формы представлены в таблице 2.
Для обработки событий нажатия кнопок |
|||
«Рассчитать», «Очистить» и «Выход» введем |
|||
следующий код: |
|
||
Private Sub calc_Click() |
Рис. 4. Форма для примера 2 |
||
|
|||
Label2.Caption = "" |
|
||
For i = 11 |
To 99 |
‘определение первой цифры двузначного числа |
|
i1 |
= i \ |
10 |
|
i2 |
= i Mod 10 |
‘определение второй цифры двузначного числа |
|
If (i1^2+i2^2) Mod 13=0 Then Label2.Caption = Label2.Caption+Str(i)+" "
Next i
End Sub
6
Private Sub clean_Click()
Label2.Caption = ""
End Sub
Private Sub exitForm_Click()
End
End Sub
Таблица 2
Объект |
Свойство |
|
UserForm2 |
Caption = Пример 2 |
|
|
|
|
|
Caption = Двузначные числа, сумма |
|
Label1 |
квадратов цифр которых делится на 13 |
|
AutoSize = True |
||
|
||
|
TextAlign = 2-fmTextAlignCenter |
|
Label2 |
Caption = “ ” |
|
AutoSize = False |
||
|
Объект |
Свойство |
CommandButton1 |
Name = calc |
|
Caption = Рассчитать |
CommandButton2 |
Name = clean |
Caption = Очистить |
|
|
|
CommandButton3 |
Name = exitForm |
Caption = Выход |
На рабочем листе «Пример 2» разместим |
|
||||||
кнопку «Открыть форму» для вызова формы |
|
||||||
«Пример 2» и запустим данную форму (рис. |
|
||||||
5). |
|
|
|
|
|
|
|
Пример 3 |
|
|
|
|
|
||
Разработаем |
|
пользовательский |
|
||||
интерфейс |
и составим |
программу для вы- |
|
||||
|
|
|
-4 |
|
суммы ряда: |
|
|
числения с точностью ε = 10P |
|
P |
|
||||
∞ |
k +2 |
|
|
|
|
|
|
S =∑ |
(−1) |
. |
|
|
|
|
|
k |
|
|
|
|
|
||
k =1 |
k!2 |
|
|
|
|
|
|
Останемся в той же рабочей книге Excel, |
|
||||||
что и в примерах 1 и 2. С помощью инстру- |
Рис. 5. Двузначные числа, сумма квад- |
||||||
ментов «Надпись», «Поле» и «Кнопка» па- |
ратов цифр которых делится на 13 |
||||||
нели инструментов |
Элементы |
управления |
|
|
||
разместим на рабочем листе «Пример 3» соответствующие объекты (рис. 6). |
||||||
Свойства объектов листа «Пример 3» представлены в таблице 3. |
||||||
|
|
|
|
|
Таблица 3 |
|
|
|
|
|
|
|
|
Объект |
|
Свойство |
|
Объект |
Свойство |
|
Label1 |
Caption = Сумма ряда |
|
CommandButton1 |
Name = calc |
|
|
AutoSize = True |
|
Caption = Рассчитать |
|
|||
|
|
|
|
|||
TextBox1 |
Name = txtS |
|
CommandButton2 |
Name = clean |
|
|
Locked = True |
|
Caption = Очистить |
|
|||
|
|
|
|
|||
Для обработки событий нажатия кнопок «Рассчитать» и «Очистить» введем в модуле «Лист3(Пример 3)» следующий программный код:
7
Private Sub |
calc_Click() |
||
Dim |
eps, |
a, |
s As Single |
Dim |
k, f |
As |
Integer |
eps = Val(InputBox("Задайте точность", "Ввод данных"))
k = 1 |
‘задание начальных данных |
f = k |
‘f соответствует факториалу числа k |
a = (-1)^(k + 2)/(f * 2^k) |
‘a соответствует отдельному слагаемому ряда |
s = a |
‘s соответствует сумме ряда |
Do While Abs(a) > eps |
|
k = k + 1 |
|
f = f * k |
|
a = (-1) ^ (k + 2) / (f * 2 ^ k) s = s + a
Loop txtS.Text = s
End Sub
Private Sub clean_Click() txtS.Text = ""
End Sub
Здесь тело цикла Do While – Loop будет |
|
||||||||||||
выполняться, |
пока |
слагаемое |
ряда |
по |
абсолютной |
|
|||||||
|
|
n |
k +2 |
n−1 |
|
k +2 |
|
|
n+2 |
|
|
|
|
|
|
|
|
|
|
|
|||||||
величине (т. |
к. |
∑ |
(−1) |
−∑ |
(−1) |
= |
(−1) |
|
|
) будет |
Рис. 6. Вычисление суммы |
||
k |
k |
n |
|||||||||||
|
|
k =1 |
k!2 |
k =1 |
k!2 |
|
|
n!2 |
|
|
ряда |
||
|
|
|
|
|
-4 |
. |
|
|
|
|
|
|
|
превышать заданную точность 10P |
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
P |
|
|
|
|
|
|
|
Проверим работу программы (рис. 7). |
|
||||||||||||
Пример 4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Разработаем |
пользовательскую |
форму и |
|
||||||||||
составим программу для решения следующей задачи. |
|
||||||||||||
При анализе хозяйственной деятельности пред- |
|
||||||||||||
приятия |
была |
|
установлена |
|
|
следующая |
|
||||||
закономерность: в январе 2004 г. прибыль данного |
|
||||||||||||
предприятия составила 573 тыс. р. и в течение |
|
||||||||||||
следующих 5 лет ежемесячно увеличивалась на i %, |
|
||||||||||||
где i – номер месяца (т. е. в феврале – на 2 %, в марте |
|
||||||||||||
– на 3 % и т. д.), по сравнению с суммой прибыли в |
Рис. 7. Результат вычисления |
||||||||||||
предыдущем месяце. |
Определить полученные пред- |
суммы ряда |
|||||||||||
приятием суммы прибыли за 2004 г., 2005 г., …, 2008 г., а также общую сумму прибыли за эти 5 лет.
Для создания данной пользовательской формы перейдем в редактор VB (останемся в той же рабочей книге MS Excel, что и в примерах 1–3) и добавим еще одну форму (рис. 8). Вывод вычисленных значений прибыли предприятия будет осуществляться как в поле объекта список (ListBox), размещенного на форме, так и в ячейки рабочего листа «Пример 4» (рис. 9).
8
Рис. 8. Форма «Прибыль предприятия» Рис. 9. Таблица к примеру 4
Свойства объектов формы представлены в таблице 4.
|
|
|
Таблица 4 |
|
|
|
|
|
|
Объект |
Свойство |
Объект |
Свойство |
|
CommandButton1 |
Name = calc |
|
|
|
Caption = Рассчитать |
UserForm3 |
Caption = Прибыль предприятия |
|
|
|
|
|||
CommandButton2 |
Name = clean |
|
|
|
Caption = Очистить |
ListBox1 |
Name = ListPr |
|
|
|
|
|||
|
Name = exitForm |
|
||
CommandButton3 |
ColumnCount = 2 |
|
||
Caption = Выход |
|
|
||
|
|
|
|
|
Примечание. Свойство ColumnCount задает количество колонок объекта ListBox. |
||||
Для обработки событий нажатия кнопок «Рассчитать», «Очистить» и «Вы- |
||||
ход» введем следующий код: |
|
|
|
|
Private Sub calc_Click() Dim i, j As Integer
Dim PrM, prG, sPr As Single
PrM = Val(InputBox("Введите прибыль, полученную в январе 2004 г.", "Ввод данных"))
ListPr.AddItem "Год", 0 |
‘задание начальных подписей и данных |
||
ListPr.List(0, 1) = "Прибыль, тыс. р." |
|||
sPr = 0 |
4 To 8 |
‘цикл по годам |
|
For i = |
|||
prG |
= 0 |
1 To 12 |
‘цикл по месяцам каждого года |
For |
j = |
||
|
If (i = 4) And (j = 1) Then |
|
|
|
Else |
PrM = PrM |
|
|
PrM = PrM * (1 + j / 100) |
||
|
End |
||
|
If |
|
|
|
prG |
= prG + PrM |
|
Next j |
|
‘вывод года и прибыли в объект ListBox |
|
ListPr.AddItem "200" + Str(i), i - 3 |
|||
ListPr.List(i - 3, 1) = Str(Round(prG, 3)) |
|||
Cells(i |
- 2, 2) = Round(prG, 3) |
‘вывод прибыли в ячейки рабочего листа |
|
9
sPr = sPr + prG Next i
ListPr.AddItem " Общая прибыль ", 6 ListPr.List(6,1) = Str(Round(sPr,3)) Cells(i - 2, 2) = Round(sPr, 3)
End Sub
Private Sub clean_Click()
ListPr.Clear
End Sub
Private Sub exitForm_Click() End
End Sub
‘вывод общей прибыли в объект ListBox ‘вывод общей прибыли в ячейки листа
Вданном программном коде для расчета прибыли за каждый год и за 5 лет
вцелом используются вложенные циклы с параметром. Кроме того, для вывода результатов вычислений в поле объекта ListBox используется метод AddItem, предназначенный для добавления элементов в список
ИмяСписка.AddItem Выражение, Индекс
где Выражение – элемент списка, который надо добавить; Индекс – порядковый номер элемента в списке (нумерация элементов списка начинается с 0).
А свойство List(НомерСтроки, НомерСтолбца) объекта ListBox возвращает (присваивает) элемент списка, стоящий на пересечении указанных строки и столбца.
На рабочем листе «Пример 4» разместим кнопку «Открыть форму» для вызова формы «Прибыль предприятия» и запустим данную форму (рис. 10).
Теперь можно добавить в рабочую книгу MS Excel еще один лист с именем «Оглавление», на котором, например, с помощью инструмента Кнопка панели инструментов Формы создадим четыре кнопки: «Индекс рентабельности», «Двузначные числа», «Сумма ряда», «Прибыль предприятия».
В редакторе VB добавим новый модуль (Insert → Module), в котором введем следующий код:
Public Sub ЛистПример1()
Worksheets("Пример 1").Activate
End Sub |
|
|
Public Sub ЛистПример2() |
Рис. 10. Результат вычисления |
|
Worksheets("Пример 2").Activate |
||
прибыли предприятия |
||
End Sub |
||
10 |
||
|
