Информатика VBA. Учебное пособие по дисциплинам Информатика иИнформационные технологии
Скачать 1.05 Mb.
|
BIG . Таким образом, в данном примере переменной BIG присваивается наибольшее значение из переменных А и В. Для улучшения читаемости программы рекомендуется записы- вать структурные операторы так, чтобы выделялась его структура. Для оператора If правила оформления формулируются следующим образом: первые символы ключевых слов оператора (If, Else, End If) записываются в одной и той же позиции строки (строго по вертика- ли), а первые символы операторов ветви «ДА» и «НЕТ» записывают- ся со смещением на три позиции вправо относительной этой позиции строки. Данное требование не является обязательным для выполне- ния, но придерживаясь его программист получает более читабельную программу, и оно позволяет избежать ошибок при записи вложенных операторов If. Синтаксис языка программирования позволяет записывать в одной строке несколько операторов, разделенных символом двоеточие (:). Используя эту возможность, можно оформить программу предыдущего примера следующим образом: … If A > B Then BIG = A Else : BIG = B End If Debug.print BIG … Однако, по мнению авторов, читаемость программы в этой форме за- писи хуже приведенного выше фрагмента. Операторы ветви «НЕТ» в блоке сравнения могут отсутствовать (см. рисунок 3.1). 41 В этом случае при записи структурного оператора If ключевое слово Else можно не задавать и если результатом логического выра- жения будет значение "ложь", после строки If выполняться будет оператор, следующий за оператором End If. Синтаксис такого опера- тора следующий: If Логическое_выражение ТНЕN ' (то / тогда) операторы блока ветви «ДА» End If ' (конец оператора IF) . Используя эту форму записи программу предыдущего примера можно оформить следующим образом: … BIG = B If A > B Then BIG = A End If Debug.print BIG … В случае, когда блок сравнения не содержит ветви «НЕТ», мож- но использовать упрощенную запись оператора If, которая не содер- жит оператора End If. Синтаксис такого оператора следующий: Рисунок 3.1 – Блок сравнения с одной ветвью Операторы ветви «ДА» Условие ДА НЕТ 42 If Логическое_выражение ТНЕN [ ] [ ] : : 2 2 1 1 β α β α = = , где i i β α = - оператор присваивания, в котором переменная i α полу- чает значение выражения i β . Если записывается один оператор при- сваивания, то символ «двоеточие» не ставится. В такой форме записи программу рассматриваемого примера можно оформить таким образом: … BIG = B If A > B Then BIG = A Debug.print BIG … Это наиболее компактная форма записи определения максимального значения двух переменных, записанная с помощью оператора If. Помимо оператора If, VBA имеет в своем арсенале функцию IIF , которая позволяет реализовывать в программе блоки сравнения в одной строке. Синтаксис этой функции IIf ( условие, значение_1, значение_2 ) Если условие, записанное в первом аргументе функции выпол- няется (имеет значение True),то результатом функции будет значение выражения, записанное во втором аргументе функции (значение_1). Если же условие, заданное в первом аргументе, не выполняется (при- нимает значение False), то возвращаемый результат –значение выра- жения, записанное в третьем аргументе функции (значение_2). Все ар- гументы функции IIF являются обязательными. Нахождение макси- мального значения двух переменных с использованием функции IIF будет выглядеть: BIG = IIf (A>B, A, B) Если A>B, то переменной BIG будет присвоено значение A, а иначе - значение переменной B. 43 Приведенные примеры показали большое многообразие форм записи программ, имеющих блоки сравнения. На первых порах это может вызвать затруднения, поэтому авторы рекомендуют выбрать форма записи структурного оператора 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 44 Если условие_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. Составить фрагмент программы для вычисления функции ≤ + > = 0 , ) 1 ( 0 , 2 3 2 x при x x при x Log Y Программа для вычисления такой функции может быть следую- щей: . . . If x>0 Then y= ( Log(x)/Log(2) )^3 Else y= sqr (1+x^2) EndIf . . . В связи с тем, что значение ) 1 ( 2 x + может быть вычислено при любом значении аргумента x, для записи этого фрагмента программы 45 можно использовать обычный оператор If. Программу с таким опера- тором можно записать так: . . . y= sqr (1+x^2) If x>0 Then y= ( Log(x)/Log(2) )^3 . . . Пример 3.3. Составить фрагмент программы для вычисления функции − ≤ ≤ < − − > = 1 , 1 1 ), 2 ln( 1 , x если e x если x x если x Y x Для этой функции может быть предложено 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 следует записать формулу с усло- виями, например 46 z= max(a,b)= ≤ > b a если b b a если a , , Фрагменты задач программирования таких функции рассмотре- ны выше. Для вычисления максимального или минимального значе- ния функций, содержащих три и более параметров, можно использо- вать эти же фрагменты программ, с учетом следующих преобразова- ний: 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 z=b End If If z z=c End If C использованием функции IIf фрагмент вычисления мини- мального значения трех переменных можно записать так z= IIf( aIIf( z>c, z, c) VBA предоставляет программисту возможность использования функций вычисления максимальных и минимальных значений из на- бора функций Excel application.min ( a ,b [,c [,d . . .]] ) и application.max ( a,b,[,c [,d . . .]] ) Задача предыдущего примера может быть решена одним оператором 47 z= application.min ( a ,b , c ) В задачах на разветвления третьего типа, когда условие задано в виде графической функции, необходимо выполнить следующие дей- ствия: - записать на изображении функции математические зависимости для отдельных элементов; - записать математическую формулу для решения поставленной за- дачи. Пример 3.4. Для заданных координат точки x,y определить но- мер области, изображенной на рисунке 3.2, в которую она попала. Рисунок 3.2 - Обозначение областей рисунка Предварительные действия. Запишем на рисунке с заданием ма- тематические формулы граничных линий: окружность и две прямые (см. рисунок3.3). Рисунок 3.3 - Формулы для граничных линий 48 Создадим формулу для определения номера области по задан- ным координатам x,y. При создании формулы для области следует за- писать уравнения всех её граничных линий, но знак равенства заме- нить знаками «больше» или «меньше». Область с наиболее сложными границами можно не описывать уравнениями, а оставлять последним действием в блоке сравнения. В нашем примере, очевидно, это об- ласть с номером 2. > − > < + > + = случаях остальных в x y и x y и y x если y x если n , 2 4 , 1 4 , 0 2 2 2 2 После записи формулы для «грубого» определения попадания точки в ту или иную область, следует решить вопрос: какое значение надо присвоить переменной n, если точка попала на границу области. В данном примере принимается решение: граница относится к облас- ти с большим номером. Поэтому в приведенную выше формулу надо добавить знак равенства лишь в уравнение окружности, определяю- щую границу области 1, т.к. именно по этой линии разделяются об- ласти 1 и 0. Границы, образованные прямыми линиями, должны быть отнесены к области с номером 2, поэтому в описании области 1 должно быть строгое «больше». > − > ≤ + > + = случаях остальных в x y и x y и y x если y x если n , 2 4 , 1 4 , 0 2 2 2 2 Немаловажным вопросом при составлении программы является задача ее тестирования и описания входных и выходных данных. Подготовка тестовых данных на этапе постановки задачи позволяет программисту глубже понять особенности программируемой задачи. Для проведения полного цикла тестирования рассматриваемой задачи необходимо задать координаты точек во всех областях, а затем про- 49 верить попадание точки на границы областей. Примерное положение точек для тестирования данной задачи приведено на рисунке 3.4. Рисунок 3.4 - Положение точек для тестирования программы Наиболее удобным способом ввода данных для отладки про- граммы можно считать ввод данных из текстового файла или ввод данных с активного листа рабочей книги Excel. Это связано с тем, что при обнаружении и исправлении любой, даже незначительной, ошиб- ки в программе, последующее тестирование следует провести в пол- ном объеме. В последующем операции ввода-вывода можно заменить на ввод и вывод данных в диалоговое окно Excel. При составлении программы тестовые данные будем считывать из таблицы Excel и помещать результат в соседнюю колонку этой же таблицы. Координаты точек зададим в первых двух столбцах листа Excel , в третий столбец поместим значение ожидаемого результата, а в четвертый – полученный результат. Очевидно, что если в значения в столбцах «С» и «D» будут различны, то в программе имеется ошиб- ка, которую следует найти, либо при создании тестовых данных про- граммист сам неправильно решил задачу. Тестовые данные для от- ладки рассматриваемой задачи могут иметь значения представленные в таблице 3.4. 50 Таблице 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 51 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 52 ' выводим полученный результат в диалоговое окно с заголовком ' "Ответ" и двумя световыми кнопками - "Повтор" и "Отмена" k = MsgBox(" Номер области" & Str(n), vbRetryCancel, "Ответ") ' анализируем код нажатой кнопки If k = vbRetry Then GoTo 10 ' если нажата кнопка "Повтор" - ' продолжить работу. ' если нажата кнопка "Отмена" - завершаем работу программы End Sub 53 4 Циклические алгоритмы Циклом называется часть программы, которая в процессе вы- полнения повторяется последовательно несколько раз. Повторяю- щиеся операторы принято называть телом цикла. Одной из часто встречающихся циклических задач является за- дача вычисления суммы или произведения группы чисел. Накаплива- ние суммы m n n m n n a a a a a a a S + + + + + + + = = + = ∑ 1 3 2 1 1 можно организовать в цикле таким образом, чтобы при каждом новом выполнении тела цикла к сумме добавлялось очередное слагае- мое, то есть производить вычисления по рекуррентной формуле (по формуле, в которой последующее значение получается на основе пре- дыдущего): S n+1 = S n + a n+1 Если предположить, что уже вычисленная сумма S n первых n слагаемых (называемая |