Назначить конкретные значения H и R


Вычислить объѐм по формуле


V = H × 2 p R 2


Отобразить результаты (значение V) Конец алгоритма

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

Этот алгоритм можно записать в виде макроса Excel на VBA, а зна- чения H и R поместить, например, в ячейки A1 и B1 или просто за- дать в теле макроса.

Для создания макроса выбирают на вкладке Вид группу Макросы, за- дают имя, например Vk, и выбирают Создать. Появляется окно ре- дактора VBA (V isual B asic for A pplication – визуального Бейсика для приложений), показанное на рис. 6.1. В окне обозревателя проектов виден включенный в проект модуль Module1 – в нѐм создаѐтся мак- рос. В окне кода уже записаны строки начала Sub Vk() и конца End Sub процедуры макроса (алгоритма), которые надо дополнить ос- тальными строками алгоритма так, чтобы получился текст макроса:

Sub Vk()

H = 4.5: R = 3.0 ¢ Назначить конкретные значения H и R. Строка 2. V = H/3*3.14 * R^2 ¢ Вычислить объѐм конуса. Строка 3. Debug.Print V ¢ Отобразить результаты (значение V ). Строка 4.

End Sub


В строке 2 текста макроса переменным H и R н а з н а ч а ю т с я (присваи- ваются) в двух о п е р а т о ра х конкретные числовые значения. Еѐ можно записать, указав явно имена операторов присваивания Let (пусть):

Let H = 4.5: Let R = 3.0 ¢ Назначить конкретные значения H и R. Строка 2,

которые обычно в Бейсике по аналогии с другими языками програм- мирования не указываются. По правилам Бейсика операторы, запи- санные в одной строке (как здесь во 2-ой строке), отделяются друг от друга двоеточием. Справа после апострофа «ʹ» можно дать примеча- ния, которые выводятся на экран зелѐным цветом, а в нашем тексте они будут выделяться курсивом. Ключевые слова (названия операто- ров) изображаются на экране синим цветом, а в наших текстах они выделяются полужирным шрифтом.

 
В строке 3 в операторе присваивания сначала вычисляется значение, стоящее справа от равенства, а затем это значение приписывается (присваивается) переменной V, стоящей слева от равенства. В строке 4 осуществляется вывод вычисленного значения V объѐма методом Print (печать) объекта Debug (отладчика) в окно Immediate Window (окно отладки или ближе к оригиналу - окно «срочно»). Оно вызывается из пункта меню View (или по Ctrl+G). Непосредственные вычисления можно выполнять в окне отладки, например, вычислить предполагаемый результат работы макроса. Для

 
 


чего в этом окне следует набить:? (4.5/3)*3.14 *(3.0^2) и дать «Enter». Знак «?» вопроса перед выражением означает печать (Print), и по это- му указанию на следующей строке будет выведен результат 84,78. Такой же результат можно получить, набив построчно операторы 2- ой и 3-ей строк макроса и выполнив затем печать вычисленного объ- ѐма по? V «Enter». Полезно отметить, что тот же результат получа- ется и по записи? 4.5/3*3.14 *3.0^2 без простановки скобок, т. е. в Бейсике возведение в степень «^» имеет приоритет. После возведения в степень выполняются слева направо деление и умножения как опе- рации одного ранга при отсутствии скобок.

Выполнение макроса в автоматическом режиме можно иницииро- вать через пункт меню Run, нажатием кнопки запуска или клави- ши F5. При первом знакомстве больше подходит выполнение в режиме отладки операторов макроса: через пункт ме- ню Debug и/или нажатием клавиши F8. Причѐм курсор должен нахо- диться внутри макроса. Тогда подсвечивается (обычно жѐлтым цве- том) оператор, который предстоит выполнить. Наведя указатель мышки на переменную H в первом операторе присваивания, можно увидеть еѐ значение и отметить, что до выполнения оператора пере- менная имела значение «Empty» (пусто), а после выполнения (по оче- редному нажатию F8) значение изменилось на 4,5. После выполнения оператора 4-ой строки в окно отладки выводится результат 84,78.

И с х о д н ы е з н а ч е н и я H и R удобно задать в я ч е й к а х л и с т а Excel, на- пример, соответственно в ячейках A1 и B1. Для ссылки в тексте мак- роса на ячейки используется нотация (r, c) – строка (row), столбец (column). Например, ячейку B1 можно в такой нотации задать как (1, 2). В макросе на эту ячейку рабочего листа ссылаются, записывая Cells(1, 2). В таком варианте текст макроса получает следующий вид:

Sub Vk()

H = Cells(1,1): R = Cells(1,2) ¢ Выбрать значения H и R из ячеек A1, B1 V = H/3*3.14 * R^2 ¢ Вычислить объѐм конуса

Debug.Print V: Cells(1,3) = V ¢ Отобразить результаты (значения V )

End Sub

Результат выводится и в окно отладки и в ячейку C1 рабочего листа.


С именем макроса можно связать сочетание клавиш или световую кнопку, по которым он будет запускаться. Выбрав при входе в макрос Параметры и задав, например, сочетание клавиш Ctrl+Shift+V, полу- чаем возможность удобно запускать макрос по этому сочетанию.

Задание для самоконтроля. Поместить в ячейку B1 значение R, рав- ное 3,0. Задавая в ячейке A1 значения H и вызывая по сочетанию кла- виш выполнение макроса, получить в ячейке C1 объѐм 100,0.

 

Ветвящиеся вычислительные процессы

Пример 2. По заданным значениям коэффициентов p, q квадратного


уравнения


x 2 +


px + q = 0


вычислить значения вещественных корней


или вывести сообщение «нет корней» об их отсутствии.

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

После ввода коэффициентов и вычисления дискриминанта D следует проверка условия (заключено в ромб), в зависимости от выполнения или не выполнения которого выбирается направление дальнейших действий. Блок-схема примера 2 в этом месте разветвляется – отсюда и название «ветвящиеся вычислительные процессы». При не отрица- тельном D вычисляются и выводятся значения корней, а при отрица- тельном выводится сообщение «нет корней».

Алгоритм реализован в виде макроса Korni на VBA. Значения коэффициентов p, q берутся со- ответственно из ячеек A1, B1, значения корней - выводятся в ячейки C1, D1, а символьная константа "Нет корней" помеща- ется в ячейку C1.

Sub Korni() ¢ Текст макроса

p = Cells(1, 1): q = Cells(1, 2) D = (p / 2) ^ 2 – q


If D < 0 Then

Cells(1, 3) = "Нет корней" ¢ Ветвь «да»

Else

x1 = –p / 2 –Sqr(D) ¢ Ветвь «нет»

x2 = –p / 2 + Sqr(D)

Cells(1, 3) = x1: Cells(1, 4) = x2

End If End Sub


В приведѐнном макросе условие


D< 0


записано в блочном условном


операторе If (если). Ветвь «да» блок-схемы размещается между ключевыми словами Then (тогда) и Else (иначе) этого оператора, а ветвь «нет» - между Else и завершающим блок End If (конец если). После выполнения каждого из блоков «да» и «нет» происходит выход за End If, здесь на завершающий макрос оператор End Sub.

Для вычисления арифметического корня из D использована встроен- ная функция с именем Sqr. После имени функции всегда открывается скобка, затем записывается аргумент и скобка закрывается.

Первое выполнение макроса полезно выполнить в режиме отладки. Конкретные коэффициенты p, q при этом лучше назначить непосред- ственно в тексте макроса, записав, например, во второй строке:

p = –5: q = 6 ¢ p = Cells(1, 1): q = Cells(1, 2)

Выполняя макрос по шагам (по F8), полезно проследить за изменени- ем значений переменных и последовательностью выполнения опера- торов при разных исходных данных p, q. Уместно также дополнить ветви «да» и «нет» соответственно операторами

Debug.Print p, q, "Нет корней" и Debug.Print p, q, x1, x2

вывода в окно отладки.

При выполнении отлаженного макроса в ячейки A1, B1 помещаются значения коэффициентов, запускается макрос, и результаты просмат- риваются в ячейках C1, D1.

Замечания. 1. В блочном условном операторе блок ветви «нет» вме- сте с ключевым словом Else может быть опущен. Например, для оп-


ределения количества Kol вычисляемых вещественных корней урав- нения из примера 2 подойдѐт следующий фрагмент программы

Kol = 0

If D>= 0 Then

Kol = 2

End If

2. Когда блок состоит как здесь из одного оператора, уместно исполь- зовать не блочный условный оператор, а «строчный» If:

Kol = 0: If D>= 0 Then Kol = 2

В случае справедливости условия выполнится присваивание Kol = 2, при невыполнении условия - следующий по порядку оператор.

Циклические вычислительные процессы

Пример 3. Вывести таблицу квадратов и кубов натуральных чисел от 2 до 20. Как результат в ячейках листа (и в окне отладки) должны появиться строки с числами:

 

 

     
... ... .
     

 

..

 

 

Алгоритм решения примера 3 представлен в виде блок-схемы примера 3 и макроса:

Sub NKvKub () K = 2: N = 20

Start: L = K ^ 2

M = K ^ 3

Cells(K,1) = K: Cells(K,2) = L: Cells(K,3) = M Debug.Print K, L, M ¢ вывод K, L, M

K = K + 1

If K <= N Then GoTo Start

End Sub

В данном алгоритме переменной K, предна- значенной для хранения натуральных чисел от 2 до 20, сначала при- сваивается начальное значение 2. После вычисления и вывода квад-


рата и куба числа 2 в операторе присваивания K=K+1 к исходному значению K прибавляется 1 и сумма (3) присваивается этой же пере- менной, то есть записывается в ту же ячейку памяти, затирая преды- дущее значение (2). После этого можно снова выполнять операторы вычисления и вывода - ведь они оперируют с содержимым всѐ той же ячейки, которое теперь уже увеличилось на единицу. Поэтому в

«строчном» операторе If после Then записан оператор безусловного перехода GoTo « метка », передающий управление на оператор L=K^2, отмеченный меткой Start. Но повторять вычисления и вывод нужно пока значение K не превысит предельной величины N=20, поэтому и использован условный переход по ветви «да».

Приведѐнный выше алгоритм реализует циклический вычислитель- ный процесс (цикл). Для цикла характерны повторения обведѐнных на блок-схеме пунктиром операторов, составляющих тело цикла. Для этого цикла характерно изменение как в арифметической про- грессии значения переменной K - счетчика цикла, определяющей число выполненных повторений, от начального значения (здесь от 2) до своего конечного значения (здесь до 20) с шагом (здесь 1).

Поскольку циклы широко используются при программировании, в Бейсике есть специальные операторы для организации циклов.

Для организации цикла примера 3 подойдут операторы For и Next, и с ними макрос NKvKub примет следующий вид:

Sub NKvKub () N=20

For K = 2 To N Step 1 ¢ Для K от 2 до N с шагом 1: L = K ^ 2 ¢ Тело цикла (начало)

M = K ^ 3

Cells(K,1) = K: Cells(K,2) = L: Cells(K,3) = M

Debug.Print K, L, M ¢ Тело цикла (конец)

Next K ¢ Следующее K

End Sub

В приведѐнном макросе оператор For начала цикла организует по- вторное выполнение тела цикла при значениях счѐтчика цикла K рав-


ного 2, 3, …, N, т, е. изменяющегося от 2 до N с шагом 1. Оператор Next отмечает конец тела цикла. В этом операторе не обязательно ука- зывать имя переменной-счѐтчика цикла. Если шаг равен (как здесь) единице, то в операторе For его вместе со словом Step можно опус- тить. После выхода из цикла счѐтчик цикла равен очередному значе- нию, при котором тело перестанет выполняться. При шаге, не позво- ляющем счѐтчику цикла достичь предельного значения, тело цикла обходится – не выполняется ни разу.

Использование циклов при накапливании сумм

Пример 4. Для заданного значения N вычислить сумму квадратов натуральных чисел от 1 до N и проверить справедливость формулы: 12 +22 +32 +... + N 2 = N ×(N +1) ×(2 N +1) / 6.

= å k
N 2
Для указанной проверки вычислить сумму, стоящих слева от знака


равенства слагаемых, то есть


S =12


+ 22


+ 32


+... + N 2


k =1, а


также значение (обозначенного как C) выражения, стоящего справа от знака равенства, и сравнить их.

Вычисление суммы чисел, указанных слева от знака равенства, можно организовать в цикле со счѐтчиком цикла K, принимающим значения от 1 до N с шагом 1. При каждом значении K можно вычис- лять одно слагаемое A= K2 и добавлять его к сумме S, которая снача-

ла должна равняться нулю. Алгоритм вычисления суммы S представ- лен в виде блок-схемы и текста макроса.

Sub Sum()

N = 3 ¢ Назначить какое-либо значение. S = 0 ¢ Подготовка к накапливанию суммы. For K = 1 To N Step 1

A = K ^ 2

S = S + A ¢ Пополнение суммы.

Next K

C = N * (N + 1) * (2 * N+ 1) / 6

Debug.Print N, S, C

End Sub


При выполнении макроса в режиме отладки полезно проследить (на- водя курсор на переменную S) то, как пополняется сумма при каждом выполнении оператора S = S + A. Для принятого выше значения N=3 верно вычисленная сумма должна составить 14. Такое же значение C даѐт вычисление по формуле. Совпадут ли результаты при иных зна- чениях N?

Пример 5. З н а ч е н и я в ы с о т ы H и р а д и у с а R из примера 1 заданы на- чиная с ячеек A2 и B2 в н е с к о л ь к и х п о с л е д о в а т е л ь н ы х с т р о к а х соот- ветственно столбцов A и B. Требуется: 1) заполнить столбец C, на- чиная с ячейки C2, значениями объѐмов конусов, 2) записать в ячейки D2, E2 и F2 соответственно общий объѐм всех конусов, количество конусов и средний объѐм конуса.

Для перебора строк (начиная со второй) и записи вычисляемых значений объѐмов уместно применить цикл, однако в общем случае не известно в какой строке оканчиваются данные. Поэтому обработка данных должна вестись до тех пор, пока есть данные в строках. Цик- лы, которые организуют повторное выполнение тела цикла пока справедливо (или наоборот не справедливо) некоторое условие, назы- вают итерационными циклами. В VBA такие циклы начинает опе- ратор Do (выполнять), за которым могут следовать опции: служебные слова While (пока справедливо) или Until (пока не справедливо) и ус- ловие. Конец тела цикла отмечает оператор Loop (петля, цикл), кото- рый также может иметь названные опции (только если они не указа- ны вместе с оператором Do).

Решение 1-ой части примера 5 даѐт следующий макрос.

Sub Primer5_1() i = 2

Do While Cells(i, 1) < > Empty ¢ Цикл «Выполнять пока справедливо»

H = Cells(i, 1): R = Cells(i, 2) ¢ Назначить конкретные значения H и R V= H/3*3.14 * R^2: Cells(i, 3)=V ¢ Вычислить объѐм конуса

i = i + 1

Loop End Sub


В условии оператора цикла Do While проверяется: не равно ли со- держимое очередной i-ой ячейки 1-го столбца (столбца A) значению Empty («пусто»)? И пока оно не «пусто» вычисляется объѐм и увели- чивается каждый раз на единицу номер i, указывающий на очередную строку. Цикл Do Until представлен во 2-ой части задачи.

Для решения 2-ой части задачи надо дополнить приведѐнный мак- рос накапливанием суммы S и количества k обработанных строк:

Sub Primer5_2() S=0: k = 0

Do Until Cells(k+2, 1) = Empty ¢ Цикл «Выполнять пока не справедливо»

H = Cells(k+2, 1): R = Cells(k+2, 2) ¢ Назначить конкретные значения H и R V= H/3*3.14 * R^2: Cells(k+2, 3)=V ¢ Вычислить объѐм конуса S = S +V: k = k + 1 ¢ Накапливание суммы и количества

Loop

Cells(2, 4) = S: Cells(2, 5) = k: Cells(2, 6) = S / k ¢ Результаты- в D2, E2, F2

End Sub

Можно отметить, что количество k накапливается как сумма S, но в качестве слагаемых к накапливаемому количеству добавляют едини- цы. В макросе номер обрабатываемой строки получается увеличени- ем количества k на 2.

Пример 6. По списку повторяющихся фамилий абонентов и сумм (счетов см. рис. 6.2) за каждый телефонный разговор абонента (запи- санных соответственно в столбцах B и C, начиная с ячеек B3 и C3) вычислить для указанной фамилии абонента: общую сумму к оплате, количество его звонков, среднюю стоимость его звонка.

' Макрос - Решение примера 6

Sub Primer6() ¢ == Образец задания 1 ==

Fam$ ="Котов": i = 3: S=0: Kol = 0:

Do While Cells(i, 2) < > Empty

If Cells(i, 2) = Fam$ Then ¢ Вычислния для Fam$ S=S + Cells(i, 3): Kol = Kol +1


End If


Рис. 6.2.


i = i + 1 ¢ i – номер обрабатываемой строки

Loop

¢ Запись результатов в B1, D1 и F1:

Cells(1, 2) = S: Cells(1, 4) = Kol: Cells(1, 6) = S / Kol

End Sub

Следует отметить, что в условном блочном операторе, изменение счѐтчика Kol и суммирование производится лишь тогда, когда содер- жимое ячейки совпадает с содержимым текстовой переменной Fam$. Здесь текстовая (или строковая – типа String) переменная Fam$ по старым правилам Бейсика отмечена знаком $ на конце. Перед циклом ей присваивается значение текстовой константы с фамилией (здесь "Котов"). Можно настроить макрос на считывание по оператору Fam$ = ActiveCell.Value фамилии, как значения активной ячейки. В этом случае макрос удобно запускать по сочетанию клавиш, выделив предварительно ячейку с фамилией. В разделе «3.Дополнительные сведения» этот вопрос решѐн в общем виде – ячейки с фамилиями в процессе анализа просто указываются (выделяются) мышкой.

2.Задание 1

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

Предъявить работающий макрос преподавателю. Текст макроса и схематичный вид результатов его выполнения записать в отчѐт.

Варианты заданий

1. В списке (с колонками: наименование товара, число упаковок, вес упаковки) товаров поступивших на склад за месяц по наименова- нию указанного товара определить: общее число упаковок и общий вес данного товара на складе.

2. В таблице заказов для продукта, заданного своим наименованием, определить: общую потребность (объѐм требуемого продукта) и число заказов (заявок) на данный продукт.


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

4. В библиотечном списке методической литературы по названию учебной дисциплины определить: число методичек и средний объ- ем (в страницах) одной методички по указанной дисциплине.

5. В таблице с аттестационными оценками школьников по пройден- ным предметам определить: среднюю оценку выбранного школь- ника и число предметов с аттестацией на «5».

6. В таблице с аттестационными оценками школьников по пройден- ным предметам определить: среднюю оценку по выбранному предмету и число отличником по данному предмету.

7. В списке поставок (за неделю) товаров со склада в магазины опре- делить: число магазинов, в которые поставляется указанный товар, а также общий объем поставляемого товара.

8. По списку повторяющихся фамилий сотрудников и часов сверх- урочной работы (в указанные дни) определить количество дней и общую сумму часов сверхурочной работы сотрудника с фамилией, указанной в этом списке.

9. Для указанной фамилии в месячной распечатке (по дням) сотруд- ников, опоздавших на работу, определить число дней с опоздания- ми и общее время опозданий.

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

11. В списке (с колонками: наименование товара, вес, сорт) товаров, поступивших на склад за месяц по наименованию указанного това- ра данного сорта определить: общий вес указанного товара данно- го сорта (1-го или 2-го).

12. Для указанной фамилии в списке (по дням месяца) водителей автопредприятия, оштрафованных ГИБДД, определить: общее число нарушений правил и общую сумму штрафов.


13. Для указанной фамилии в списке спонсорских пожертвований (за год) определить: число пожертвований и среднюю сумму одно- го пожертвования.

14. Для указанной фамилии в распечатке (по дням) вложений (вкла- дов) на общий банковский счѐт определить: общую сумму вкладов и среднюю сумму одного вклада.

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

 

3.Дополнительные сведения


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: