Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика VBA.pdf
Скачиваний:
891
Добавлен:
27.03.2016
Размер:
1.1 Mб
Скачать

Приведенные примеры показали большое многообразие форм записи программ, имеющих блоки сравнения. На первых порах это может вызвать затруднения, поэтому авторы рекомендуют выбрать форма записи структурного оператора If в общем виде и использовать только ее при написании программ. По мере накопления навыков в программировании появится желание использовать более компактные формы записи.

3.2 Типовые задачи разветвляющихся алгоритмов

При рассмотрении задач на разветвления, как правило, рассматривают три типа задач:

1)вычисляемая функция задана формулой с указанием условий;

2)вычисляемая функция задана формулой, где присутствуют функции max и min;

3)функция задана графически – необходимо уметь рассчитывать ее числовые значения для заданного аргумента.

Очевидно, что в практике программирования могут встретиться задачи и смешанного типа.

Задачи первого типа, как правило, решаются с применением структурного оператора If общего вида. Если условий больше трех, то используют вложенные структурные операторы If, либо оператор вида

If-ElseIf.

 

 

Вариант 1

 

Вариант 2

If условие_1 Then

 

If условие_1 Then

операторы условия_1

 

операторы условия_1

Else

 

ElseIf условие_ 2 Then

If условие_2 Then

или

операторы условия_2

операторы условия_2

 

Else

Else

 

операторы условия_3

операторы условия_3

 

End If

End If

 

 

End If

 

 

43

Если условие_1 справедливо, то выполняются действия для этого условия. После того как эти действия выполнятся, управление будет передано: в первом варианте - оператору, стоящему за вторым оператором End If, а во втором варианте - оператору, стоящем за оператором End If, который в этой конструкции записывается один раз. Если же условие_1 ложно, то происходит проверка условия_2, находящегося во вложенном условном операторе If после служебного слова Else, для первого варианта, или после служебного слова ElseIf для второго варианта. Если условие_2 истинно, то выполняются действия для этого условия, если же результат условия_2 «ложь», то выполняются действия последнего условия 3. После этого, и в том и в другом случае, выполняется оператор, следующий за оператором End If. В о ператоре вида If-ElseIf конструкции ElseIf могут повторяться необходимое количество раз, при этом оператор End If записывается только один раз. При использовании вложенных структурных операторов If каждый из них закрывается своим оператором End If.

Пример 3.2. Составить фрагмент программы для вычисления

 

3

 

при x > 0

Log2 x,

функции Y =

 

 

 

(1+ x2 ) ,

при x 0

 

 

 

 

 

Программа для вычисления такой функции может быть следую-

щей:

. . .

If x>0 Then

y= ( Log(x)/Log(2) )^3

Else

y= sqr (1+x^2)

EndIf

. . .

В связи с тем, что значение (1+ x2 ) может быть вычислено при любом значении аргумента x, для записи этого фрагмента программы

44

можно использовать обычный оператор If. Программу с таким оператором можно записать так:

. . .

y= sqr (1+x^2)

If x>0 Then y= ( Log(x)/Log(2) )^3

. . .

Пример 3.3. Составить фрагмент программы для вычисления

 

 

 

 

 

 

 

x,

 

 

если

x >1

 

 

 

функции Y = ln(2 x), если 1 < x 1

 

e

x

,

если

x ≤ −1

 

 

Для этой функции может быть предложено 3 варианта программ: со структурными операторами If, с оператором If-ElseIf и с упрощенной формой оператора If.

Вариант про-

Вариант

програм-

Вариант программы с упрощен-

граммы с вло-

мы с оператором

ными операторами If

женными

If

вида

 

структурными

If-Else

 

 

операторами If

 

 

 

If x>1 Then

If x>1 Then

y= exp(x)

y= sqr (x)

y= sqr (x)

If x>1 Then y= sqr (x)

Else

ElseIf x<=-1 Then

If x>-1 And x<=1 Then y=Log(2-x)

If x<=-1 Then

y=exp(x)

 

y=exp(x)

Else

 

 

Else

y=Log(2-x)

 

y=Log(2-x)

End If

 

 

End If

 

 

 

End If

 

 

 

При программировании задачи с разветвлениями второго типа для вычисления функций max и min следует записать формулу с условиями, например

45

a, еслиa >b z= max(a,b)=

b, еслиa b

Фрагменты задач программирования таких функции рассмотрены выше. Для вычисления максимального или минимального значения функций, содержащих три и более параметров, можно использовать эти же фрагменты программ, с учетом следующих преобразований:

z= max(a,b,c)= max( max(a,b) , с )

Таким образом, для вычисления функции max(a,b,c) можно реализовать два варианта программ: с структурным оператором If и с оператором If упрощенной формы:

Вариант 1

Вариант 2

 

 

If a>b Then

z=a

z=a

If z<b Then z=b

Else

If z<c Then z=c

z=b

 

End If

 

If z<c Then

 

z=c

 

End If

 

C использованием функции IIf фрагмент вычисления минимального значения трех переменных можно записать так

z= IIf( a<b, a, b) z= IIf( z>c, z, c)

VBA предоставляет программисту возможность использования функций вычисления максимальных и минимальных значений из набора функций Excel

application.min ( a ,b [,c [,d . . .]] ) и application.max ( a,b,[,c [,d . . .]] )

Задача предыдущего примера может быть решена одним оператором

46

z= application.min ( a ,b , c )

В задачах на разветвления третьего типа, когда условие задано в виде графической функции, необходимо выполнить следующие действия:

-записать на изображении функции математические зависимости для отдельных элементов;

-записать математическую формулу для решения поставленной задачи.

Пример 3.4. Для заданных координат точки x,y определить номер области, изображенной на рисунке 3.2, в которую она попала.

Рисунок 3.2 - Обозначение областей рисунка

Предварительные действия. Запишем на рисунке с заданием математические формулы граничных линий: окружность и две прямые (см. рисунок3.3).

Рисунок 3.3 - Формулы для граничных линий

47

Создадим формулу для определения номера области по заданным координатам x,y. При создании формулы для области следует записать уравнения всех её граничных линий, но знак равенства заменить знаками «больше» или «меньше». Область с наиболее сложными границами можно не описывать уравнениями, а оставлять последним действием в блоке сравнения. В нашем примере, очевидно, это область с номером 2.

0,

n = 1,

еслиx2 + y2 > 4

еслиx2 + y2 < 4 и y > −x и y > x 2, в остальныхслучаях

После записи формулы для «грубого» определения попадания точки в ту или иную область, следует решить вопрос: какое значение надо присвоить переменной n, если точка попала на границу области. В данном примере принимается решение: граница относится к области с большим номером. Поэтому в приведенную выше формулу надо добавить знак равенства лишь в уравнение окружности, определяющую границу области 1, т.к. именно по этой линии разделяются области 1 и 0. Границы, образованные прямыми линиями, должны быть отнесены к области с номером 2, поэтому в описании области 1 должно быть строгое «больше».

 

еслиx

2

+ y

2

> 4

0,

 

 

n =

еслиx

2

+ y

2

4 и y > −x и y > x

1,

 

 

 

2,

 

в остальныхслучаях

 

 

Немаловажным вопросом при составлении программы является задача ее тестирования и описания входных и выходных данных. Подготовка тестовых данных на этапе постановки задачи позволяет программисту глубже понять особенности программируемой задачи. Для проведения полного цикла тестирования рассматриваемой задачи необходимо задать координаты точек во всех областях, а затем про-

48

верить попадание точки на границы областей. Примерное положение точек для тестирования данной задачи приведено на рисунке 3.4.

Рисунок 3.4 - Положение точек для тестирования программы

Наиболее удобным способом ввода данных для отладки программы можно считать ввод данных из текстового файла или ввод данных с активного листа рабочей книги Excel. Это связано с тем, что при обнаружении и исправлении любой, даже незначительной, ошибки в программе, последующее тестирование следует провести в полном объеме. В последующем операции ввода-вывода можно заменить на ввод и вывод данных в диалоговое окно Excel.

При составлении программы тестовые данные будем считывать из таблицы Excel и помещать результат в соседнюю колонку этой же таблицы. Координаты точек зададим в первых двух столбцах листа Excel, в третий столбец поместим значение ожидаемого результата, а

вчетвертый – полученный результат. Очевидно, что если в значения

встолбцах «С» и «D» будут различны, то в программе имеется ошибка, которую следует найти, либо при создании тестовых данных программист сам неправильно решил задачу. Тестовые данные для отладки рассматриваемой задачи могут иметь значения представленные

втаблице 3.4.

49

Таблице 3.4 – таблица с числовыми данными для отладки программы

№ строки

Столбец «А»

Столбец «В»

Столбец «C»

Столбец «D»

 

 

 

 

 

1.

Координата

Координата

Ожидаемый

Полученный

 

 

 

 

 

2.

X

Y

результат

результат

 

 

 

 

 

3.

1,5

0,7

2

 

 

 

 

 

 

4.

0,7

0,4

2

 

 

 

 

 

 

5.

-0,3

-1,3

2

 

 

 

 

 

 

6.

-1,8

0,2

2

 

 

 

 

 

 

7.

-0,8

1,3

1

 

 

 

 

 

 

8.

0,9

1,6

1

 

 

 

 

 

 

9.

1,9

1,7

0

 

 

 

 

 

 

10.

2,0

-1,8

0

 

 

 

 

 

 

11.

-2

-1,5

0

 

 

 

 

 

 

12.

-1,1

2,0

0

 

 

 

 

 

 

13.

2,0

0

2

 

 

 

 

 

 

14.

0

-2

2

 

 

 

 

 

 

15.

0

0

2

 

 

 

 

 

 

16.

-1

1

2

 

 

 

 

 

 

17.

0,5

0,5

2

 

 

 

 

 

 

18.

0

2

1

 

 

 

 

 

 

В приведенном ниже варианте программы используется опера-

тор сравнения вида If-ElseIf.

 

 

Option Explicit ' запрет на использование в

 

 

' программе необъявленных переменных

 

Sub Пример_3_4()

Dim x As Single, y As Single, n As Integer, i As Integer

i = 3 ' переменная i определяет номер строки в таблице Excel 10 x = Cells(i, 1) ' считываем из i-ой строки

y = Cells(i, 2) ' координаты x и y

' вычисление по формуле значения n

If x ^ 2 + y ^ 2 > 4 Then

50

n = 0

ElseIf y > -x And y > x Then n = 1

Else n = 2

End If

Cells(i, 4) = n ' выводим полученный результат в таблицу

i = i + 1 ' переходим на следующую строку таблицы

If Cells(i, 1) <> Empty Then GoTo 10 ' если в новой строке есть

' данные, то выполнить обработку новой строки

End Sub

Можно предложить вариант этой же программы с вводом и выводом данных из диалогового окна. В ней вычисление формулы реализовано с упрощенным вариантом оператора If исключительно в учебных целях.

Option Explicit ' запрет на использование в

' программе н объявленных переменных

Sub Пример_3_4()

Dim x As Single, y As Single, n As Integer, k As Integer

'считываем из диалогово окна координаты x и y

10 x = CSng(InputBox("Задайте координату X")) y = CSng(InputBox("Задайте координату Y"))

'функция Csng переводит строку текста в числ, и требует,

'в качестве разделителя дробной и целой части числа,

'символа "запятая"

' вычисление значения n по формуле с упрощенным оператором If n = 2

If y > -x And y > x Then n = 1

If x ^ 2 + y ^ 2 > 4 Then n = 0

51

'выводим полученный результат в диалоговое окно с заголовком

'"Ответ" и двумя световыми кнопками - "Повтор" и "Отмена" k = MsgBox("Номер области" & Str(n), vbRetryCancel, "Ответ")

'анализируем код нажатой кнопки

If k = vbRetry Then GoTo 10

'если нажата кнопка "Повтор" - ' продолжить работу.

'если нажата кнопка "Отмена" - завершаем работу программы

End Sub

52