Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
166
Добавлен:
12.04.2015
Размер:
982.42 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА 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

n1

 

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