Информатика VBA. Учебное пособие по дисциплинам Информатика иИнформационные технологии
Скачать 1.05 Mb.
|
частичной суммой) хранится в некоторой переменной SUM, а переменной A присвоено значение очередного слагаемого a n+1 , то для получения суммы S n+1 необходимо вычислить значение выражения SUM + A. Это значение для суммирования при следующем повторении тела цикла должно снова оказаться в пере- менной SUM. И так как находящееся в SUM значение S n уже больше не потребуется, то переменной SUM можно присваивать только что вычисленное значение S n+1 . Таким образом, в цикле необходимо мно- гократно выполнять оператор SUM = SUM + A , а перед каждым его выполнением присваивать переменной A значе- ние очередного слагаемого. Начать можно, положив SUM=0, а затем S n S n+1 54 в цикле последовательно присваивать A значения a 1 , a 2 , a 3 ,...,a m . Од- нако, если первый член a 1 ряда слагаемых выпадает из общей законо- мерности их вычислений (например: S = 2 + n + n 2 + n 3 + .. .), то его следует сразу присвоить переменной SUM(SUM=2), а затем в цикле последовательно придавать A значения a 2 , a 3 ,..., a m Представим сказанное как схемы накапливания суммы где A= a 1 , a 2 , a 3 ,..., a m Рисунок 4.1 – Схемы накапливания суммы элементов группы При накапливании произведения группы чисел в первой схеме вместо начального значения «0» задается единица («1»), а символ операции сложения заменяется на символ операции умножения («звездочка»). При определении количества элементов группы данных исполь- зуется первая схема накапливания суммы чисел, только к переменной обозначающей количество элементов прибавляется не значение эле- мента, а единица. Циклы могут быть организованы с использованием оператора сравнения If с командой GoTo (см. примеры 3.3 и 3.4). Однако во всех языках программирования для организации циклов существуют специальные операторы. В языке VBA такими операторами являются операторы For и Do. Переменная, которая определяет количество по- вторений цикла, называется параметром цикла. 4.1 Оператор цикла For Оператор цикла For служит для организации циклов с преду- словием, параметр которого меняется по закону арифметической про- где A= a 2 , a 3 ,..., a m 55 грессии либо выбирается из группы элементов. Оператор For имеет две разновидности - оператор For для организации циклов, в которых параметр цикла изменяется по закону арифметической прогрессии, и оператор For Each. Синтаксис оператора For для организации циклов, в которых параметр цикла изменяется по закону арифметической прогрессии: For α = α нач. To α кон. [Step Δ α ] тело цикла Next [ α ] где α - переменная числового типа, являющаяся параметром цик- ла, определяет количество выполненных итераций; α нач. - начальное значение параметра цикла – любое арифметиче- ское выражение (в частном случае – константа или пере- менная); α кон . - конечное значение параметра цикла – любое арифметиче- ское выражение; Δ α - шаг изменения параметра цикла – любое арифметическое выражение. Оператор Next последний оператор цикла. Он ограничивает действие оператора For. Имя переменной, являющейся параметром цикла, в операторе Next можно не указывать. Но если имя перемен- ной цикла указано (это повышает наглядность и читаемость програм- мы), оно должно совпадать с именем параметра предыдущего опера- тора For – ошибка при написании имени переменной приведет к син- таксической ошибке при выполнении программы. Цикл, заданный оператором For, является циклом с предуслови- ем и работает следующим образом. Генерируется арифметическая прогрессия последовательности значений параметра цикла в диапазо- 56 не от α нач до α кон с шагом Δ α. Операторы, образующие тело цикла, выполняются для каждого значения α из этой последовательности, при этом изменять параметры α , α нач , α кон , Δ α внутри цикла недопус- тимо. Если шаг арифметической прогрессии равен единице, то слу- жебное слово Step с числом 1 можно не задавать. После завершения цикла переменная, являвшаяся параметром цикла, будет равна по- следнему значению арифметической прогрессии плюс шаг (Δ α). Для цикла с предусловием проверка на выполнение очередной итерации осуществляется перед ее началом. Цикл может не выпол- ниться ни разу, если при положительном значении шага (Δ α) значе- ние α нач , будет больше значения α кон , либо, если при отрицательном значении шага (Δ α) значение α нач , будет меньше значения α кон. . Од- нако переменная, обозначающая параметр цикла, при этом получит значение, равное α нач Для досрочного завершения цикла For следует использовать команду Exit For, которую, как правило, располагают в управляющей конструкции If, например: If условие Then Exit For При досрочном завершении цикла переменная, являющаяся парамет- ром цикла, сохраняет свое текущее значение. При задании конечного значения параметра цикла следует учи- тывать то обстоятельство, что любое арифметическое действие над вещественными числами в компьютере выполняется с некоторой по- грешностью. Это связано с тем, что не каждое десятичное число можно точно перевести в двоичную систему счисления, а также с тем, что мантисса вещественного числа содержит либо 7 (тип Single), либо 15 (тип Double) цифр. Поэтому, при записи оператора For с вещест- венным параметром цикла конечное значение параметра следует не- много увеличивать для положительного значения шага Δ α, либо 57 уменьшать для отрицательного значения шага. Как правило, к тре- буемому конечному значению добавляют или отнимают половину шага изменения параметра цикла. В общем случае лучше организо- вывать циклы по параметру имеющему целый тип. Оператор цикла For Each Параметром цикла, образованного конструкцией такого вида оператора For, является элемент из некоторой группы данных, на- пример, такой как коллекция объектов или массив. Синтаксис оператора: For Each имя_элемента In группа тела цикла Next [ имя_элемента] где имя_элемента - переменная, используемая для обозначения очередного элемента из группы; группа - это объект коллекции или массив; тело цикла – операторы, осуществляющие обработку значения очередного элемента из группы. Пример 4.1. На активном листе таблицы Excel (см. рисунок4.2) выделена группа ячеек. Определить количество и сумму чисел выде- ленной области. Рисунок 4.2 - Изображение данных в таблице и выделенная группа объектов 58 Sub Пример_4_1() s = 0: k=0 For Each Elem In Selection 'Цикл для элемента Elem в группе Selection s = s + Elem : k=k+1 Next MsgBox "Ответ: Количество элементов в группе " & k & " их сумма"& s End Sub Процедура обрабатывает элементы выделенной области (объект Selection ) построчно, т. е. элемент «Elem» последовательно принима- ет значения 1; 3; -1; 2; 5 и т.д. (см. рисунок 4.2). В результате работы процедуры на экран активного листа будет выведено диалоговое ок- но, представленное на рисунке 4.3. Рисунок 4.3 - Диалоговое окно, выведенное процедурой «Пример_4_1» После завершения цикла значение элемента «Elem» становится неоп- ределенным. 4.2 Оператор цикла Do C использованием оператора цикла Do (делай) можно програм- мировать и циклы с предусловием и циклы с постусловием, а также бесконечные циклы. Количество итераций в цикле конструкции Do зависит от заданного условия окончания цикла. Существует пять раз- новидностей данной циклической конструкции. Первые две разновидности используются для создания цикла с предусловием: Do While условие Do Until условие тело цикла тело цикла Loop Loop 59 В цикле Do While операторы тела цикла выполняются пока «усло- вие», заданное в заголовке, принимает значение «истина» (True), если оно ложно (False), то осуществляется выход из цикла и управление передается оператору, расположенному после служебного слова Loop (цикл). Во второй разновидности конструкции DO (Do Until), тело цикла выполняется до тех пор, пока «условие», заданное в заголовке, имеет значение «ложь» (False), а если оно истинно (True), осуществ- ляется переход к оператору, расположенному после служебного слова Loop . Цикл с предусловием может не выполняться ни разу, если при начальных значениях параметра цикла «условие», заданное в заголов- ке цикла, принимает соответствующее значение. Неправильная за- пись логического выражения в заголовке цикла может привести к бесконечному циклу, и, если не предпринять дополнительных дейст- вий, к «зацикливанию» программы. При использовании следующих двух разновидностей цикличе- ской конструкции DO: Do Do тело цикла тело цикла Loop While условие Loop Until условие создается цикл с постусловием, в котором операторы тела цикла вы- полняются хотя бы один раз, вне зависимости от условия. Условие проверяется после первого выполнения тела цикла. Операторы тела цикла Do разновидности Loop While выполняются до тех пор, пока « условие», заданное в последней строке цикла, принимает значение «истина» (True), а в разновидности Loop Until – тело цикла выполня- ется до тех пор, пока условие не выполняется (имеет значение False). Неправильная запись условия в этих разновидностях цикла DO также может привести к «зацикливанию» программы. Пятая разновидность циклической конструкции DO имеет сле- дующий синтаксис: 60 Do тело цикла Loop и используется для создания «бесконечных» циклов. Такой цикл об- речен на бесконечное повторение. Однако он не лишен смысла вме- сте с условием завершения, помещенным в тело такого цикла. Выход из цикла разновидности Do_Loop осуществляется командой Exit Do, записываемого, как правило, в условном операторе If: If условие Then Exit Do Эту же команду следует применять для программирования досрочно- го выхода из цикла, организованного с использованием других разно- видностей оператора DO. После команды Exit Do управление переда- ётся оператору, следующему за оператором Loop. Применение оператора DO с бесконечным циклом позволяет от- казаться от использования в программе оператора GoTo. Так пример 3.4 может быть реализован с бесконечным циклом. Пример 4.2. Sub Пример_4_2() Dim x As Single, y As Single, n As Integer, k As Integer ' считываем из диалогового окна координаты x и y Do 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 ' выводим полученный результат в диалоговое окно с заголовком ' "Ответ" и двумя световыми кнопками - "Повтор" и "Отмена" 61 k = MsgBox ("Номер области" & Str(n), vbRetryCancel, "Ответ") ' анализируем код нажатой кнопки If k = vbCancel Then Exit Do ' если нажата кнопка "Отмена" – ' завершаем работу ' если нажата клавиша "Повтор" продолжить цикл DO Loop Do End Sub 4.3 Вложенные циклы Для расчета графика функции двух переменных y=F(a,x) ис- пользуются циклы, вложенные один в другой. Один из таких циклов называют внешним, а другой внутренним. Телом внешнего цикла яв- ляется весь внутренний цикл. При записи рассчитанных значений функции следует учитывать тип диаграммы, с помощью которой бу- дут отображаться кривые. Для диаграммы типа «График» представ- ляется целесообразным разместить данные в виде таблицы: один столбец которой содержит значения аргумента x i , а соседние столбцы содержат координаты y i для заданных значений второго параметра. Если же предполагается выводить графики в виде диаграммы типа «Точечная», а для неоднозначных функций это единственный способ корректного их представления в Excel, то значения аргумента и функции должны располагаться в соседних столбцах. Причем, если на одну диаграмму выводятся точки нескольких кривых, то точки од- ной кривой от точек другой должны отделяться пустой строчкой. Пример 4.3. Рассчитать значения функции 2 1 x a x a Y ⋅ + ⋅ = на интерва- ле [-4, 4], с шагом 0,2. Параметр «а» последовательно принимает зна- чения 1; 1,5; 2; 2,5. По рассчитанным значениям точек функции по- строить в Excel диаграммы типа «График». 62 Option Explicit ' запрет на использование в программе ' необъявленных переменных Sub Пример_4_3() Dim x As Single, a As Single Dim i As Integer, k As Integer Cells(1, 1) = "x\ а" ' Записываем в первую строку заголовок таблицы a = 1 For k = 2 To 5 ' Цикл по параметру a (k-номер столбца для записи Yi) Cells(1, k) = a ' Запись в первую строку таблицы значения параметра a i = 2 ' Номер строки для выводимых координат For x = -4 To 4.1 Step 0.2 ' Цикл по параметру x If k = 2 Then Cells(i, 1) = x ' Запись в ячейку координаты x Cells(i, k) = a*x / Sqr(1 + a*x^2) ' Запись в ячейку координаты y i = i + 1 ' Номер следующей строки для вывода координат Next x a = a + 0.5 ' изменяем значение a для следующего цикла Next k ' заканчиваем цикл по параметру a End Sub На рисунке 4.4 приведен вид полученной таблицы значений функции и диаграмма с графиками для разных значений параметра а. Следует отметить следующее. В первом столбце таблицы выведены значения переменной х, которые вычисляются по закону арифметической про- грессии в операторе «For x=-4 …». Нетрудно заметить, что ожидае- мого нулевого значения переменной х нет, а есть значение 6,258∙10 -7 Как было указано выше, это связано с ошибками округления резуль- татов арифметических действий в ЭВМ (если переменной х присво- ить тип Double, ошибка округления будет значительно меньше, но она все равно останется). Ошибка начинает проявляется с числа «– 1,8», а для положительных значений ошибка вычисления переменной 63 х проявляется в шестом знаке после запятой. Поэтому, если бы в опе- раторе For по параметру х, конечное значение было задано ровно 4, как в условии задания, то последняя точка кривой не была бы рассчи- тана. Для исключения такой ошибки, конечное значение в этом опе- раторе увеличено на половину шага. Цикл по параметру «a» оформ- лен через переменную «k» целого типа, поэтому изменять конечное значение не требуется. Рисунок 4.4 - Таблица значений и графики функции 2 1 x a x a Y ⋅ + ⋅ = Пример 4.4. Изобразить на точечной диаграмме Excel полярные кривые r=|20+a|cos 2 φ - sin 2 φ||, 0≤ φ ≤2π, Δφ =π/36, при каждом из значений параметра а= 60, 40, 20, 0. В первый столбец таблицы выведем значения координаты x=r (φ)∙cos(φ), в соседний столбец выведем значения координаты y=r (φ)∙sin(φ). Значение параметра «a», будем выводить в третий стол- 64 бец рядом с координатами первой точки очередной кривой. Учтем особенность построения точечных кривых – координаты каждой по- следующей кривой, строящейся независимо от предыдущей, должны отделяться друг от друга пустой строкой в таблице. Option Explicit ' запрет на использование в программе ' необъявленных переменных Sub Пример_4_4() Dim r As Single,a As Single, fi As Single Dim H As Single Dim i As Integer Const pi As Single = 3.1415927 ' Заносим заголовки в первую строку таблицы Cells(1, 1) = "x": Cells(1, 2) = "y": Cells(1, 3) = "a" H = pi / 36 ' вычисляем шаг изменения угла i = 2 ' Номер строки для выводимых координат. For a = 60 To 0 Step -20 ' Цикл по параметру a Cells(i, 3) = a ' Запись в ячейку Excel значения параметра For fi = 0 To 2 * pi + 0.01 Step H ' Цикл по углу fi ' число 0.01 учитывает ошибку при вычислении конечного значения fi r = Abs(20 + a * Abs(Cos(fi) ^ 2 - Sin(fi) ^ 2)) Cells(i, 1) = r * Cos(fi) ' Запись в ячейку координаты x Cells(i, 2) = r * Sin(fi) ' Запись в ячейку координаты y i = i + 1 ' Номер следующей строки для вывода координат. Next ' конец внутреннего цикла по параметру fi i = i + 1 ' Для пропуска строки после вывода координат кривой |