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

Пособие_по_алгоритмизации_и_программированию

..pdf
Скачиваний:
60
Добавлен:
11.04.2015
Размер:
492.32 Кб
Скачать

21

Составим программный код, который будет выполняться при обработке дан-

ного события.

Так как в рамках поставленной задачи вычислительный процесс может реа-

лизовываться по различным ветвям в зависимости от выполнения некоторых ус-

ловий, программный код должен включать условные операторы.

Наиболее часто используется конструкция, имеющая следующий синтаксис

(здесь и далее в квадратных скобках указаны необязательные элементы):

If условие 1 Then

операторы 1

[ ElseIf условие 2 Then

операторы 2

× × × × × × × ×

ElseIf условие n Then

операторы n

Else

операторы k ]

End If

Данная конструкция может применяться для решения любых сложных задач,

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

Вначале проверяется «условие 1». Если оно выполняется (результат равен логическому значению ИСТИНА), выполняется первый блок операторов («опе-

раторы 1»), затем управление передаётся оператору программного кода, сле-

дующему за End If. Если «условие 1» не выполняется (результат равен логиче-

скому значению ЛОЖЬ), последовательно проверяются условия после ключевых слов ElseIf. Если некоторое из них выполняется, реализуется соответствующий блок операторов после ключевого слова Then, и управление передаётся операто-

ру, следующему за End If. В ситуациях, когда ни одно из условий от 1 до n не выполняется, исполняется блок операторов после ключевого слова Else

(«операторы k»).

Блоки, следующие после ключевых слов ElseIf и Else, не являются обяза-

тельными. Любые блоки могут содержать вложенные условные операторы.

22

Условный оператор можно представить и в виде одной строки:

If условие Then операторы 1 [ Else операторы 2 ]

Если «условие» выполняется, реализуются «операторы 1», если нет –

«операторы 2».

Процедура для решения поставленной задачи может иметь следующий вид:

Private Sub CommandButton1_Click()

 

 

Dim S As Long, TD As String, R As Integer

'Объявление типов переменных

TD = ComboBox1.Text

 

'Ввод сведений о типе дома

R = TextBox1.Text

'Ввод данных о количестве проживающих

If TD = "Жилой" Then

 

 

If R = 1 Then

 

 

S = 351

 

 

ElseIf R = 2 Then

 

 

S = R * 259

 

 

Else

 

 

S = R * 251

 

 

End If

 

 

Else

 

 

If R = 1 Then

 

 

S = 1172

 

 

ElseIf R = 2 Then

 

 

S = R * 972

 

 

Else

 

 

S = R * 955

 

 

End If

 

 

End If

 

 

TextBox2.Text = S

'Вывод полученного результата

End Sub

 

 

23

Альтернативой рассмотренной конструкции является конструкция Select Case, имеющая следующий синтаксис:

Select Case проверяемая характеристика

Case условие 1

операторы 1 [ Case условие 2

операторы 2

× × × × × × × ×

Case условие n

операторы n

Case Else

операторы k ]

End Select

Эту конструкцию удобно применять в ситуациях, когда для организации ветвления вычислительного процесса в разных условиях проверки используется одна и та же характеристика.

Проверяемая характеристика может быть числовым или строковым выраже-

нием, переменной, константой. Её значение последовательно сравнивается с ус-

ловиями 1, 2, n. Если некоторое условие выполняется, исполняются операторы блока, расположенного за этим условием, затем управление передаётся на опера-

тор программного кода, следующий за End Select. Если ни одно из условий не выполняется, реализуются операторы после ключевых слов Case Else

(операторы k).

Условия могут быть заданы различными способами:

-в виде константы или выражения (условие выполняется, если значение проверяемой характеристики равно используемой константе или результа-

ту вычислений по заданному выражению);

-с помощью операции сравнения, перед которой указывается ключевое слово Is (например, Is < 100);

-в виде диапазона значений (указываются границы диапазона, разделённые ключевым словом To, например, 50 To 100).

24

Изменим программный код созданной ранее процедуры. Ветвление вычис-

лительного процесса, учитывающее количественный состав семьи, оформим с помощью конструкции Select Case:

Private Sub CommandButton1_Click()

 

 

Dim S As Long, TD As String, R As Integer

'Объявление типов переменных

TD = ComboBox1.Text

 

'Ввод сведений о типе дома

R = TextBox1.Text

'Ввод данных о количестве проживающих

If TD = "Жилой" Then

 

 

Select Case R

 

 

Case 1

 

 

S = 351

 

 

Case 2

 

 

S = R * 259

 

 

Case Else

 

 

S = R * 251

 

 

End Select

 

 

Else

 

 

Select Case R

 

 

Case 1

 

 

S = 1172

 

 

Case 2

 

 

S = R * 972

 

 

Case Else

 

 

S = R * 955

 

 

End Select

 

 

End If

 

 

TextBox2.Text = S

 

'Вывод полученного результата

End Sub

 

 

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

нет

= 2 × ( N - OS ) ( PA - PR + 1)

GA

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

= 2 × ( N - OS ) ( PA - PR + 1)

GA

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