Вы находитесь на странице: 1из 56

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

Государственное образовательное учреждение


высшего профессионального образования
«КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ
ЭНЕРГЕТИЧЕСКИЙ УНИВЕРСИТЕТ»

Н.К. ПЕТРОВА, М.М. ВОЛЧЕНКО

ПРОГРАММИРОВАНИЕ НА VBA
В ПРИМЕРАХ И ЗАДАЧАХ
ЧАСТЬ I. БАЗОВЫЕ АЛГОРИТМИЧЕСКИЕ
СТРУКТУРЫ
Практикум к лабораторным работам, практическим занятиям,
расчетному заданию и самостоятельной работе студентов
по дисциплинам
«Информатика», «Компьютерные технологии в науке и образовании», «Про-
граммные средства информатики»,
«Новые информационные технологии»

Казань 2010
УДК 681.3
ББК 32.973
П78
Рецензенты:
кандидат физико-математических наук, доцент
Татарского государственного педагогического университета И.Н. Голицына;
кандидат физико-математических наук, доцент Казанского государственного
энергетического университета Р.А. Ишмуратов

П78 Петрова Н.К., Волченко М.М.


Программирование на VBA. Часть I. Базовые алгоритмические
структуры. Практикум / Н.К. Петрова, М.М. Волченко. – Казань:
Казан. гос. энерг. ун-т, 2010. – 55 с.
Предлагается своего рода «Задачник» по программированию,
ориентированный на обучение студентов основам алгоритмизации математических и
инженерных задач средствами языка VBA в приложении к Excel.
Содержание I части охватывает разделы программы, посвященные базовым
алгоритмическим структурам: линейные программы, «ветвление», «цикл» -
арифметический и итерационный. Изложение материала оформлено в виде
отдельных разделов, в которых кратко представлены основные теоретические
сведения.
Типовые задачи даются с подробными решениями. Имеется большое
количество задач для самостоятельной работы. Задания делятся на три типа:
1 – умение «читать» готовые программы, 2 – разрабатывать программы по
шаблонному алгоритму и 3 – разрабатывать программы с неявным алгоритмом.
Практикум предназначен для студентов всех специальностей КГЭУ,
изучающих «Информатику».

УДК 681.3
ББК 32.973

© Казанский государственный энергетический университет, 2010


3

Предисловие

В учебной литературе имеется не так много пособий по практической


работе на VBA, ориентированных на решение математических, инженерных
задач. Данный практикум разработан с целью восполнить существующий
пробел. Он предназначен для обучения – самостоятельно или под
руководством преподавателя – основам алгоритмизации с использованием
языка VBA (Visual Basic for Application) в приложении к одному из самых
популярных приложений MS Office – MS Excel.
В практикум включены типовые задачи и даются методы и примеры их
решения. Каждому разделу предшествует краткое введение, состоящее из
определений и описания операторов языка. Многочисленные примеры
демонстрируют разные возможности работы с ячейками рабочего листа
Excel, с диалоговыми окнами ввода и вывода. Основной акцент сделан на
умение работать с математическими формулами, с числами в формате с
плавающей и фиксированной точкой, грамотно сопоставлять фактические и
формальные параметры при вызове программ как с листа Excel, так и из
программ пользователя.
В тексте практикума приняты такие соглашения:
1. Элементы языка VBA в текстовой части практикума выделены
таким стилем.
2. Курсивом выделены новые термины, имена переменных в текстовой
части практикума, в комментариях к операторам программ.
3. Примеры разбираемых программ даются, как правило, с
комментариями, при этом текст программы пишется курсивом. Тексты
программ для самостоятельного разбора приводятся, как правило, в рамке.
4. При описании структуры операторов[необязательные операнды]
взяты в квадратные скобки, альтернативные параметры – Yes | No –
написаны через вертикальную черту.
5. В тексте используются следующие сокращения:
ОП – оперативная память; ПК – компьютер; п/п – программа-процедура;
п/ф – программа-функция
При подготовке данного практикума авторы использовали
многолетний опыт работы по преподаванию курса информатики в Казанском
государственном энергетическом университете и Казанском
государственном университете.
4

Общие теоретические сведения по программированию


на VBA

I. Структура программ на VBA.


Процедуры и функции пользователя

Программа VBA представляет собой совокупность процедур и


функций, размещенных в зависимости от особенностей решаемой задачи, в
одном или нескольких модулях. Каждый модуль имеет две области: общую
область и область подпрограмм. В общей области помещаются операторы
описания переменных, которые являются общими для всех процедур и
функций этого модуля. В области подпрограмм помещается только код
подпрограммы.
В VBA программный код, реализующий какие-либо действия,
оформляется в виде процедур и функций. Благодаря этому создаваемые
программы имеют хорошую структурированность и наглядность.
Разработанные отдельные функции или процедуры можно накапливать в
библиотеках и в дальнейшем использовать их по мере необходимости.
Программа-процедура (п/п) на VBA имеет следующую структуру:
[Private|Public] Sub ИмяПроцедуры (СпискиПараметров)
<<Тело п/п>>
End Sub
где [Private|Public] – необязательные ключевые слова, определяющие
область видимости программы; Sub – ключевое слово, определяющее тип
п/п. ИмяПроцедуры – имя п/п (дает сам пользователь). СписокПараметров
служит для передачи процедуре исходных данных для вычислений (может
отсутствовать). Он состоит из элементов списка, разделенных запятыми.
Этот элемент списка параметров имеет синтаксис:
ИмяЭлемента [As ТипДанных]
где ИмяЭлемента – идентификатор; As – ключевое слово; ТипДанных –
тип данных элемента списка (Табл. 1.1).
Процедура пользователя может быть вызвана из другой п/п оператором
Call или указанием ее имени.
5

Например:
Private Sub Prog1( ) Начало процедуры с именем Prog( )
Dim t As Integer Описание типа переменной t
t=2 Присвоение переменной t значения 2
Call Prog2 (t) Вызов процедуры Prog2 (t) с фактическим
[Другие операторы] параметром t
Prog2 (t) другой способ вызова п/п Prog2
[Другие операторы]
End Sub Конец процедуры Prog1
Public Sub Prog2(x As Начало п/п Prog2 с формальным параметром х
Integer)
MsgBox x Выдача значения x в специальном окне
End Sub Конец процедуры Prog2

Программа–функция (п/ф) – это программа, которая выполняет


действия в пределах своего блока и возвращает единственное значение.
Функция пользователя имеет следующий вид:
[Private|Public]Function ИмяФункции([СпискиПараметров])[As ТипДанных]
<<Тело п/ф>>
ИмяФункции = ВозвращаемоеЗначение
End Sub
Function – ключевое слово, указывающее на то, что это функция;
остальные параметры те же, что и в Sub. ВозвращаемоеЗначение – значение,
возвращаемой функцией.
Обращение к п/ф может производиться из процедуры другой функции.
Если в функции предусмотрено рекурсивное обращение, то ее можно вызвать
из нее самой. Если функция записана в модуле, то ее можно вызвать из Excel
с помощью Мастера функций, так как функция пользователя заносится в
библиотеку функций.
6

Пример:
Private Sub Prog3( ) Начало вызывающей п/п
Dim u,t As Integer Задание типа переменным u,t
t=2 Присвоение переменной t значения 2
y = Func ( t ) Вызов п/ф Func с фактическим аргументом t
[Другие операторы]
End Sub Конец п/п
Начало п/ф Func, имеющей целочисленный тип.
Public Function Func(x As
Формальный аргумент t имеет целочисленный
Integer) As Integer
тип
Вычисление полинома по t и присвоение
f%=x^2+x+5
результата целочисленной переменной f %
func = f % Присвоение возвращаемого значения
End Function Конец п/ф
При работе с обоими типами программ следует аккуратно соблюдать
соответствие между фактическими и формальными параметрами, как по
количеству их, так и по типу.

II. Типы констант. Представление числовых констант в


формате с фиксированной и плавающей
десятичной точкой

Константой называется некоторая величина, не изменяющая своего


числового или символьного значения в течение выполнения всей программы.
Имеются два типа констант- числовые и символьные.
Числовые константы: представляют собой положительные или
отрицательные числа двух видов:
а) целочисленные, представляющие собой положительные и
отрицательные числа и ноль, при их записи не должна использоваться
десятичная запятая: -100 2 0 +458 ;
б) вещественные константы – все действительные числа, включая и
целые. Записываются в двух форматах:
с фиксированной точкой, например, 100. –0.001 +2.563
(вместо десятичной запятой используется при записи точка)
-2
с плавающей точкой, например, 2.5·10 , записываемое как
2.5Е-02 или 2.5D-02. Здесь 2.5 – мантисса, Е, D – десятичная
экспонента одинарной (Е) или двойной (D) точности.
-3
Например: 1,5⋅10 ⇒ 1.5Е-3=0.15Е-02=15Е-04=0.0015,
150000 ⇒ 1.5Е+05,
0,0000254 ⇒ 2.54Е-05.
7

III. Объявление переменных на VBA

Переменные – это объекты, предназначенные для хранения данных.


В различные моменты времени переменные могут хранить разные
значения. Имена переменных позволяют различать их в программе,
осуществлять доступ к различным участкам памяти для записи данных и
их извлечения.
Перед использованием переменных в программе их нужно объявить
(декларировать). При объявлении переменной необходимо указать, что
объявляется переменная, задать имя переменной и указать ее тип. Тип
определяет способ представления/хранения переменной в оперативной
памяти.
Для эффективного использования памяти и времени ПК необходимо
правильно выбрать тип переменной. Объявить переменную – значит
заранее сообщить программе о ее существовании. Объявление переменной
производится специальным оператором: Dim переменная [As тип]
Одновременно с объявлением переменной после ее имени можно
записать ключевое слово As, после которого задается тип переменной
(Табл. 1.1).
Например: оператор Dim power As single приписывает
переменной power вещественный тип одинарной точности.
Задать тип переменной также можно, используя специальный символ
в конце имени – постфикс (см. табл. 2) – или, используя инструкцию
DefТип.
Например, если на уровне модуля дана инструкция DefInt I-N, это
означает, что всем переменным, имена которых начинаются с букв,
лежащих в диапазоне от I до N (и прописных, и строчных), в программах
данного модуля будет присвоен тип Integer. Другие значения
инструкции DefТип представлены в Табл. 1.2.
8

Таблица 1.1 Некоторые типы переменных VBA


Хранимая Занимаемая
Тип Диапазон значений
информация память
Целочисленные типы
Byte Целые числа 1 байт От 0 до 255
Логические
Boolean 2 байт True или False
значения
Integer Целые числа 2 байт От -32 768 до 32 767
От -2 147 483 648 до 2 147 483
Long Длинное целое 4 байт
647
Типы с плавающей точкой
От -3,402823E38 до
Вещественные -1,401298E-45
числа с плавающей 4 байт для отрицательных значений;
Single
точкой одинарной (7 цифр) от 1,401298E-45 до
точности 3,402823E38
для положительных значений
От -1,79769313486232E308
до -4,94065645841247E-324
Вещественные с
8 байт для отрицательных значений;
Double плавающей точкой
(15 цифр) от 4,94065645841247E-324
двойной точности
до 1,79769313486232E308 для
положительных значений
Строковые типы
Текстовая
информация 10 байт + 1 байт От 0 до приблизительно
String
(строка) переменной на каждый символ 2 миллиардов символов
длины
Строка постоянной От 1 до приблизительно
String*n Длина строки
длины в n символов 65 400
Типы Variant
16 байт для чисел; Любое числовое или
Значения любого из
Variant 22 байт + 1 байт строковое значение вплоть до
перечисленных
на каждый символ границ диапазона для типа
типов данных
строки Double.
9

Таблица 1.2. Значения инструкции DefТип и соответствующих постфиксов


Инструкция Тип данных Постфикс Инструкция Тип данных Постфикс
DefBool Boolean нет DefSng Single !
DefByte Byte нет DefDbl Double #
DefInt Integer % DefStr String $
DefLng Long & DefVar Variant нет

IV. Значения и типы переменных по умолчанию

Если в программах модуля операторы описания типа или постфиксы


в именах переменных отсутствуют, то работает принцип умолчания
(табл. 1.3), согласно которому все переменные принимают тип Variant и
соответствующие значения. Применение данного типа позволяет выполнять
операции, не обращая внимания на тип данных, которые они содержат.
Удобен для объявления переменных, тип которых заранее неизвестен.
Переменные этого типа могут содержать специальные значения: Empty
(пусто), Null (Нуль), Error (ошибка).

Таблица 1.3. Значения и типы переменных разных типов по умолчанию


Тип Значение Тип Значение Тип Значение
Boolean Ложь/False Single 0,0 String ““
Byte 0 Double 0,0 String*n “¬ . . . ¬“

Integer 0 Long 0
n пробелов
Variant Empty, Null, Error

Из таблицы следует, что если переменная описана как числовая


(любого типа – Byte, Integer, Long, Single, Double) то ее
значение по умолчанию равно 0 (ноль). Для символьных переменных типа
String значение по умолчанию "" – отсутствие символов, если String*n, то ее
значение будет равно n пробелам. Для логических (Boolean) переменных
значение по умолчанию будет «ложь»
Несколько правил для корректного использования разных типов
данных в одной программе или в одном выражении:
1. Переменные, описанные с помощью DIM на уровне модуля,
доступны для всех процедур в данном модуле. Переменные, описанные на
уровне п/п, доступны только в данной п/п.
10

2. В операторах присваивания следует иметь в виду, что значение


выражения может быть присвоено переменной, только если оно имеет
совместимый с этой переменной тип данных. Невозможно присвоить
строковое выражение числовой переменной или числовое выражение
строковой переменной. Такая попытка приведет к ошибке во время
компиляции.
3. Переменным типа Variant могут присваиваться как строковые, так и
числовые выражения. Однако обратное не всегда верно.
4. Присвоение выражения с одним из числовых типов переменной с
другим числовым типом данных преобразует значение выражения в тип
данных результирующей переменной. Например: если a % = 2.33, то а %
будет иметь целое значение 2 (округление с недостатком) или b % = 2.65,
то b % = 3 (округление с избытком), таким образом, присвоение вещест-
венного числа целочисленной переменной приводит к округлению его до
ближайшего целого (аналогично функции INT).
5. Если присваивается численное выражение типизированной
переменной с меньшей точностью (например, Double → Long), VBA
округляет значение выражения для совпадения с точностью переменной,
принимающей новое значение.
6. Если переменной типа String присваивается переменная типа
Variant, содержащая число, VBA автоматически преобразует это число в
строку.

V. Встроенные математические функции

Таблица 1.4. Некоторые стандартные функции VBA

Функция Выполняемое действие


Atn(аргумент) Возвращение арктангенса угла в радианах
Sin (аргумент) Возвращение синуса угла, заданного в радианах
Cos(аргумент) Возвращение косинуса угла, заданного в радианах
Tan(аргумент) Возвращение тангенса угла, заданного в радианах
x
Возвращение значения e , где x - значение переменной
Exp(аргумент)
или введенное число
Log(аргумент) Возвращение натурального ln(x) логарифма числа x
Sqr(аргумент) Возвращение квадратного куреня числа
Randomize Запуск генератора случайных чисел
11

Окончание табл. 1.4


Возвращение случайного числа в интервале от [0 ; 1). Если
Число < 0, то Rnd возвращает всякий раз одно и то же число,
используя аргумент в качестве опорного числа. Если
Rnd(Число)
Число > 0 или отсутствует, то – следующее случайное число
в последовательности. Если Число = 0, то – случайное
число, возвращенное при предыдущем вызове функции.
Abs(аргумент) Возвращение абсолютного значения числа (по модулю)
Sgn(аргумент) Возвращение знака числа (+ или -)
Отбрасывание дробной части числа А и возвращение целого
значения ≤ А. Различие между функциями состоит лишь в
Fix(аргумент) том, что при отрицательном аргументе INT возвращает
Int(аргумент) ближайшее меньшее отрицательное значение, а FIX –
ближайшее отрицательное целое число, большее либо
равное указанному (см. пример)
Преобразование числового значения (переменной) в строку
Str(Число)
символов. Слева и справа приписываются пробелы

Val(Строка) Переводит строковое выражение в возможное число

Аргумент функции всегда помещается в скобки. В качестве аргумента


могут быть либо числовая константана (постоянная величина), либо
переменная, либо другая функция со своим аргументом:
аргумент → {константа ⏐ переменная ⏐ функция}
Примеры
Пусть a = –12.1; b = –12.56; c = 12.1; d = 12.56
Тогда:
Int(a) ⇒ –13; Int(b) ⇒ –13; Int(c) ⇒ 12; Int(d) ⇒ 12
Fix(a) ⇒ –12; Fix(b) ⇒ –12; Fix(c) ⇒ 12; Fix(d) ⇒ 12
(функция FIX равносильна отбрасыванию десятичных знаков числа)
Sgn(a) ⇒ –1; Sgn(c) ⇒ 1
Abs(a) ⇒ 12.1; Abs(c) ⇒ 12.1
12

VI. Приоритет (порядок выполнения) математических


операций в арифметических выражениях VBA

1. Стандартные функции: Имя_функции(Аргумент): sin x ⇒ sin(x).


2
2. Возведение в степень ( ^ ): x ⇒ x^2
3. Изменение знака числа: (+3 и –3)
3x 3
4. Умножение ( * ) и деление ( / ): ⇒ 3 * x ^ 3 / ( 7 * a ) или 3 * x ^ 3 / 7 / a
7a
5. Целочисленное деление ( \ ) и деление по модулю ( MOD):
6. Сложение ( + ) и вычитание ( – )
При необходимости порядок действий можно изменить скобками,
тогда сначала выполняются вычисления в скобках, конечно, с соблюдением
приоритета.
Целочисленное деление отличается от деления с плавающей точкой тем,
что его результат всегда есть целое число без дробной части. Оба операнда в
выражении целочисленного деления должны быть численными выражениями.
Перед выполнением операции целочисленного деления VBA округляет каждый
операнд до числа типа Integer или Long (такой же тип имеет и результат
целочисленного деления). VBA отбрасывает (но не округляет!) любой дробный
остаток результата выражения целочисленного деления.
Например, выражения 27 \ 6 и 27.3 \ 5.9 , а также 22 \ 5 и 24 \ 5 будут
иметь один и тот же результат = 4, в то время как обычное деление даст
разные результаты: 27 / 6 = 4,5; 27.3 / 5.9 ≈ 4,6; 22 / 5 = 4,4; 24 / 5 = 4,8.
Деление по модулю дополняет целочисленное деление. В делении по
модулю выражение возвращает только остаток операции деления как целое:
Например: 22 Mod 5 = 2 и 24 Mod 5 = 4 и 25 Mod 5 = 0.
Остальные свойства деления по модулю идентичны целочисленному
делению.

VII. Адресация к ячейкам листа Excel на VBA.


Простейшие средства ввода-вывода

В иерархии объектов VBA существует объект Range – диапазон.


Объект Range используется для работы с ячейками, строками, столбцами,
а также их группами. С помощью этих объектов имеется возможность
реализовать ввод/вывод данных из программы (в программу) на лист
(c листа) Excel. При работе с объектом Range ссылка на ячейки рабочего
листа осуществляется разными способами (Табл. 1.5).
13

Таблица 1.5. Значения и некоторые свойства объектов Range


Range(“A:C”) диапазон из столбцов А, В, С.
Range(“2:2”) строка 2
Range(“A1:C2”) блок ячеек двух строк и трех столбцов
Range("B1:B10").Value = 1 – Оператор присваивает
ячейкам c первой по десятую столбца В значение 1.
Rows(2) вторая строка
Columns(1) первый столбец
Cells(3,4) ячейка на пересечении 3-й строки и 4-го столбца, т.е. D3

Объект Range, как элемент объектно-ориентированного программи-


рования, обладает рядом свойств и методов. Наиболее распространенные из
них показаны в таблице 1.6.

Таблица 1.6. Некоторые свойства и методы объекта Range


Value Возвращает значение из ячейки или в ячейки диапазона:
x = Range(“C1”).Value – присваивается х значение из
ячейки С1
Range(“A1:B2”).Value = f – всему диапазону
присваивается значение переменной f.
Font Возвращает свойство Font (шрифт)
Cells(3, 2).Font.Color = vbGreen – красит ячейку
B3 в зеленый цвет
Cells(3,1).FontStyle = Bold – делает шрифт в
ячейке А3 жирным.
Set diap = Range("A4:J4") – назначение переменной
diap диапазона листа с 4-й строки столбцов от А до J.
diap.Font.Color = vbRed - диапазон окрашен в
красный цвет
diap.FontStyle = Bold Italic – диапазон ячеек
будет написан полужирным курсивом.

VIII. Применение встроенных диалоговых окон VBA


для ввода и вывода данных в программе

Окно сообщений создается функцией MsgBox, которая имеет


следующий синтаксис:
MsgBox(prompt[, button][,title][,helpfile,context])
14

Функция выводит в окне сообщение, записанное в параметре prompt, а


также возвращает значение, соответствующее выбранной пользователем
кнопке button в окне сообщения в соответствии с табл. 1.7.

Таблица 1.7. Значения параметра button в функции MsgBox


Константа Значение Нажатая кнопка
vbOK 1 ОК (по умолчанию)
vbCancel 2 Отмена (Cancel)
vbAbort 3 Прервать(Abort)
vbYes 6 Да (Yes)
vbNo 7 Нет (No)

Параметр prompt обязательный. Эта строка, которая выдается в окне


сообщения. Параметр buttons (кнопка) – необязательный. Значение
параметра – целое число, по умолчанию равное 0. Список возможных
значений – Табл. 1.7. Параметр title задает строку, которая является
заголовком окна сообщения. Если параметр отсутствует, то в качестве
заголовка используется имя приложения (в данном случае – MS Excel).
helpfile, context – необязательные параметры, касающиеся справочной
информации, относящейся к данному сообщению.
Например, в результате выполнения п/п
Sub t( )
Ans = MsgBox("Закончить?", vbYesNo, “Пример окна MsgBox”)
If Ans = vbYes Then Cells(1, 1) = “Да” Else Cells(1, 1) = “Нет”
End Sub
появится окно сообщения:
Чтобы определить, какая кнопка была
нажата, значение переменной Ans анализируется
с помощью оператора IF. Результаты выбора
будут напечатаны в ячейке А1 активного листа
Excel.
Если не указать кнопки, то появится кнопка ОК.
Окно ввода создается функцией InputBox(), имеющей следующий
синтаксис: InputBox(prompt[, title][,default][,xpos] [,ypos])
Окно содержит сообщение, указывающее, какие данные должен ввести
пользователь, поле текста для ввода данных и две кнопки ОК и Cancel
(Отмена), которые используются для подтверждения или отмены ввода
данных. Закончив ввод данных, пользователь должен щелкнуть на одной
15

из кнопок. Если ОК – то значением функции является текст, находящийся в


поле ввода. Если Отмена – значением функции является пустая строка,
независимо от того, что напечатал пользователь. Остальные операнды
команды означают: prompt – строка сообщения; title – заголовок окна,
аналогично функции MsgBox; default – строка, помещаемая в поле: если
она отсутствует, то поле текста будет пустым; xpos – расстояние в твипах от
левой границы экрана до левой границы окна (если не указан, центрируется
посредине); ypos – то же, но для верхних границ.
Например:
Sub t( )
a = InputBox("Введите значение:", "Пример окна InputBox")
Cells(2, 1) = a
End Sub
Данные, введенные в поле окна,
будут присвоены переменной a,
которая имеет текстовый тип. Ее
значение будет выведено в ячейку A2.

Примеры решения типовых задач и задачи для


самостоятельного решения

I. Линейные алгоритмы

Линейным называется алгоритм, в котором все этапы решения задачи


выполняются строго последовательно.

1.1. Примеры чтения программ с линейным алгоритмом

Пример 1.1. Прочесть программу, написанную в модуле,


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

A B C Function z(x, y)
1 10000,0E–01 0,81E+02 =z(A1;B1) z = x ^ (1 / 3) Mod Sqr(y)
End Function
16

Решение:
1. Сопоставляем формальные параметры x, y при вызове программы с
фактическими значениями, записанными в ячейках Excel в формате с
плавающей точкой:
-1
x = [число в ячейке А1] = 10000,0E–01 = 10000⋅10 = 1000 (формат с
фиксированной точкой).
2
y = [число в ячейке B1] = 0,81E+02 = 0,81⋅10 = 81

2. Переходим к вычислению z, записывая операторы VBA


математическими формулами:

z = 3 1000 Mod 81 = 10 Mod 9

3. Для деления по модулю (функция Mod) производим


деление «столбиком»:

4. В ячейке С1 будет число 1.


A B C
1 10000,0E–01 0,81E+02 1

Пример 1.2. Прочесть программу, написанную в модуле, сопровож-


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

Function test2(a%, b%)


Pi = Range("A1").Value
c = Sin(Pi / a%) + Cos(Pi / b%)
test2 = c
End Function

Решение:
1. Сопоставляем формальные параметры a%, b% при вызове программы с
фактическими значениями, записанными в ячейках Excel B1 и C1:
a% = [число в ячейке B1] = 2,1 ⇒ 2 – число присваивается
целочисленной переменной, поэтому происходит округление до ближайшего
целого.
b% = [число в ячейке С1] = 3,3 ⇒ 3
2. Переменная Pi получает значение из ячейки А1, где записана
стандартная функция Excel ПИ( ) = π, в результате, Pi = π = 3,1415….
17

π π 1
3. с = sin + cos = 1 + = 1,5
2 3 2
4. В результате на листе Excel в ячейке B3 будет 1,5:

Пример 1.3. Прочесть программу, написанную в модуле,


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

Function examp(x)
b = 37 \ x
c% = Sqr(b)
examp = c%
End Function
Решение:
1. Сопоставляем формальный параметр x при вызове программы с
фактическим значением 4.8, указанным при вызове функции: x = 4.8
2. Выполняем целочисленное деление в два этапа
a) Округляем x до целого значения 5
б) Выполняем деление до тех пор, пока остаток не станет меньше
делителя:

3. с% = 7 ≈ 2,6 ⇒3 (округляем до целого числа)


4. examp = 3

1.2. Задания для самостоятельного чтения линейных программ

На рисунке представлен фрагмент листа Excel и текст сопровождаю-


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

Задание 1 Function z(x, y)


A B C z = Sqr(x) Mod Sqr(y)
1 2250,0E–01 1,21E+02 =z(A1;B1) End Function

Задание 2.
Function z(x, y)
A B C z = Sqr(x) \ Sqr(y)
1 1000,0E–01 0,81E+02 =z(A1;B1) End Function

Задание 3.
A B C Function z(x, y)
z = x Mod y
1 145,0E–01 0,035E+02 =z(A1;B1)
End Function

Задание 4.
A B C Function z(x, y)
z = Sqr(x) \ Sqr(y)
1 1440,0E–1 0,49E2 =z(A1;B1)
End Function

Function test5(i, k)
1
Задание 5. Pi = Cells(1, 1)
Range("A2:D3").Value = Pi / i
Cells(2, k) = Cells(2, k) / k
x = Cells(2, k): test5 = x
End Function
Задание 6.1 Function test6(i, k)
Pi = Cells(1, 1): x = Cos(Pi / i)
Range("A2:D3").Value = x: y = x * k
test6 = y
End Function
Function test7(i, k)
Задание 7. 1 a = Cells(1, 1)
Range("B2:C3").Value = a \ i
Cells(2, k) = Cells(2, k) Mod k
x = Cells(2, k): test7 = x
End Function
Задание 8. 1 Function testa(i, k)
x = Cells(1, 1): y = i / Cos(x)
z = Range("A2").Value
a = z ^ 2 \ y / k: testa = a
End Function

1
Функции пользователя, имеющие ссылки к объектам листа, не могут быть запущены с листа, только из
процедуры. Приведенные примеры предназначены только для обучения чтению программ.
19

Задание 9. 2
Function test9(i, k)
a = Cells(1, 1)
Range("B2:C3").Value = Sqr(a) \ i
Cells(2, k) = Cells(2, k) / k
x% = Cells(2, k): test7 = x%
End Function

Задание 10.2
Function test10(i, k)
x = Cells(1, 1): y = Tan(x) * i
z = Range("B1").Value
a = y * k Mod Sqr(z): test9 = a
End Function

1.3. Примеры разработки линейных программ


для задач с неявным алгоритмом

Пример 1.3. Составить программу для вычисления пути равноуско-


at 2
ренного движения, определяемого по формуле S = ν 0 t + , для заданного
2
набора параметров, например, ν 0 = 10 м / c, a = 5 м / c 2 и любого времени t.

Решение:
Заносим параметры в ячейки листа Excel: в первом столбце делаем
подписи к ячейкам, во втором – вносим числовые значения для переменных,
в третьем – их размерности. Первый и третий столбцы являются
необязательными, они служат лишь для оформления задачи.
В третьей строке вызываем программу-функцию, реализующую расчет
по заданной формуле. Текст программы:
Function S(t) Имя функции S с формальным параметром t
v = Cells(1, 2) Перенос данных с ячеек листа
a = Cells(2, 2) в переменные v и а
Запись заданной формулы и присвоение
s=v*t+a*t^2/2
результата возвращаемому значению S
End Function Конец функции

2
Функции пользователя, имеющие ссылки к объектам листа, не могут быть запущены с листа, только из
процедуры. Приведенные примеры предназначены только для обучения чтению программ.
20

Рассмотрим еще один вариант решения задачи. Недостатком


написанной выше программы является тот факт, что пользователь должен
знать, КУДА помещать данные на листе, т.е. видеть и понимать текст
программы. Для того, чтобы сделать программу более универсальной,
параметры v и a вносим в формальные параметры заголовка программы:
Function s(t, v, a)
s=v*t+a*t^2/2
End Function
При вызове такой программы вместо формальных параметров v и a в
полях палитры пользовательской функции указываются адреса ячеек, где
находятся значения переменных: (Рис. 1).

Рис. 1.1 Палитра пользовательской функции S(t,v,a)

Пример 1.4. Составить программу, определяющую количество


секторов, занятых файлом на дискете, если известен его размер в байтах?
Решение:
Известно, что один сектор имеет размер 512 байт. Программа,
рассчитывающая целое число занятых секторов, может быть записана или
через операцию целочисленного деления, или через функцию Fix.

Function N_sector1(V) Function N_sector2(V)


N_sector = V \ 512 + 1 N_sector = Fix( V \ 512) + 1
End Function End Function

Здесь формальный параметр V – передаваемый объем файла в байтах.


Недостатком обеих программ является их непригодность в случае кратности
числа V числу 512: единицу в формуле для этого случая не следует
21

прибавлять. Обойти этот недостаток можно, используя условные операторы,


которые будут рассмотрены в следующем параграфе.

1.4. Задания для программирования задач с неявно заданным


линейным алгоритмом

1. Вычислить общее сопротивление трех резисторов, соединенных


последовательно и параллельно.
2. Дана длина ребра куба. Найти объем куба и площадь его боковой
поверхности.
3. Даны два действительных положительных числа. Найти среднее
арифметическое и среднее геометрическое этих чисел.
4. Даны катеты прямоугольного треугольника. Найти его гипотенузу и
площадь
5. Даны катеты прямоугольного треугольника. Найти радиус вписанной
окружности.
6. Дана сторона равностороннего треугольника. Найти площадь этого
треугольника.
7. Даны гипотенуза и катет прямоугольного треугольника. Найти
второй катет и радиус вписанной окружности.
8. Известна длина окружности. Найти площадь круга, ограниченного
этой окружностью.
9. Найти площадь кольца, внутренний радиус которого равен 20, а
внешний – заданному числу r (r > 20 ).
10. Треугольник задан величинами своих углов и радиусом описанной
окружности. Найти стороны треугольника (по теореме синусов).
11. Найти площадь равнобочной трапеции с основанием а и b и
углом α при большем основании а.
12. Вычислить расстояние d между двумя точками с координатами x1,
y1 и х2, y2 ( d = (x2 − x1 )2 + ( y2 − y1 )2 ).
13. Определить периметр правильного n-угольника, описанного около
окружности радиуса r.
14. Смешано v1, литров воды температуры t1 с v2 литрами воды
температуры t2. Найти объем и температуру образовавшейся смеси.
15. Определить время падения камня на поверхность земли с высоты h.
16. Вычислить период колебания маятника длины l.
17. Определить силу притяжения F между телами массы m1 и m2
находящимися на расстоянии r друг от друга.
22

18. Определить время, через которое встретятся два тела,


равноускоренно движущиеся навстречу друг другу, если известны их
начальные скорости, ускорения и начальное расстояние между ними.
19. В группе N студентов. Сколько компьютеров нужно поставить в
классе, чтобы за одним ПК работало не более трёх человек.
20. Кластер диска содержит 2048 байт. Составить программу,
определяющую число кластеров, обеспечивающих адресацию к файлу
объемом V.
21*. Кластер диска содержит 2048 байт. Составить программу,
определяющую число свободных секторов последнего незанятого кластера
для файла объемом 2 Мбайта.

1.5. Примеры программирования сложных


арифметических выражений

Пример 1.5. Составить программу, вычисляющую функцию


y=
(
a ⋅ lg 2 x + b x )
для любого заданного x. Параметры: а = 1,4 ⋅ 10 2 ,
2 4x
c d ⋅ ln 5 − e
b = 2,5 ⋅ 10 − 3 , c = 0,31⋅ 10 4 , d = 4,6⋅10 .
–2

Решение:
Программируем заданное выражение, пользуясь таблицей стандартных
функций (Табл. 4) и помня о приоритете выполнения арифметических
операций.
Function y(x)
a = 1.4E+02: b = 2.5E-03: c = 0.31E+04: D = 4.6E-02
y = (a * Log(2 * x) / Log(10) + b * Sqr(x)) / (с ^ 2 * b * с * Log(5) – Exp(4 * x))
End Function

1.6 Задания для самостоятельного программирования


арифметических выражений

Составить подпрограмму-функцию для вычисления следующих функций.


1. z = x 2 ⋅ ctg(x + 1) − 0,35 ⋅ 10 −15
3

2. y = 3 ctg 2 x + lg x + 0,47 ⋅ 10 −11


3. y = 5 tge x − 0,35 ⋅ 10 −17 + sin x
4. z = sin tgx − 0,71 ⋅ 10 −13 + arctgx 2 5.
23

7
5. y = a + b 3 + ln x 3 + 0,11 ⋅ 105 ⋅ ctgb

6. Q = sin 2 y − cos3 x + 5 ⋅ ln y − 0,3 ⋅ 10 −12

7. y = arctgx 2 − 0,53 ⋅ 1033 + arcsin x


a
8. y = 3 ln cos x + + 0,71 ⋅ 10 −15 + ctg x
x+c
9. y = arctg 3 x − 0,75 ⋅ 10 −15 + e 2 x − e − x + ctg x 3
10. y = arcsin 3 x + ctg 2 x + lg x + 5,87 ⋅ 10 − 21
a
11. S = 3 ln cos3 x + + 0,71 ⋅ 10 −15 + lg x
x+c
12. y = arctgx 2 − 0,75 ⋅ 10 −15 + e x − e − x + ctgx
13. y = ctg 2 x + cos x + lg x 2 + 3.5 ⋅ 10 −11
14. y = arcsin x + ctgx + lg x + 8.57 ⋅ 10 −11
e x + cos x
15. y = + ctgx + 0,35 ⋅ 10 −12 + lg x
e x − cos x
a−b
16. y = ctg 2 x + lg x + 0,78 ⋅ 10 −13 +
d ⋅c
a+b
17. y = arctgx + 0,17 ⋅ 10 −11 + ctgx + lg x +
c+d
18. y = arcsin x + 0,37 ⋅ 10 −12 + lg x + ctgx
19. y = arctgx − 0,45 ⋅ 10 −15 + e x − 12 + ctgx

20. y = 5 x 7 + 0,35 ⋅ 10 −17 + ctgx + ln 2 x

21. y = x 7 + 0,78 ⋅ 10 −18 + ctgx + lgx


a+b
22. y = 3 arctgx + + ctgx + lg x + 0,35 ⋅ 10 −11
c+d
23. y = 3 sinx + arctgx + 0,3 ⋅ 10 −5 + lg x / 2
24. y = 5 cosx + ctgx 2 + 0,7 ⋅ 10 −11 + arctgx
e x − e −x
+ ctgx + 0,35 ⋅ 10 −11 + lg x
3 2
25. y = cos x +
2
x 7 + cos 3 x + ctgx + lg x + 0,7 ⋅ 10 −13
5
26. y =
24

II. Алгоритмическая структура «ветвление»

2.1. Операции отношения и логические операции

Операции отношения могут иметь результатом только два значения –


True (Истина) и False (Ложь), которые могут быть присвоены переменным
типа Boolean (Табл. 1.7).

Таблица 1.7. Операции отношения

Операция Описание Операция Описание


сравнения сравнения
A=B Равно. True, если A = B A>B True, если А больше В
A<>B True, если A не равно B A <= B А меньше или равно В
A<B True, если A меньше B A >= B А больше или равно В

Например: выражения 25 < > 30 → True; 25 < 30 → True;


25 > 30 → False; Number = 2E+02, тогда Number > 100 → True.
Логические операции используются в логических выражениях и их
результатом являются логические значения. Некоторые, наиболее часто
используемые, логические операции представлены в табл. 1.8

Таблица 1.8 Логические операции


Логическая операция Действие
A And B Если связываемые значения имеют значение
True, то и результат тоже True
A Or B Если хотя бы одно из значений A или B будет
True, то результат тоже True
Not A Если A True, то результат False

Операции отношения имеют бóльший приоритет, чем логические


операции. Например: если а = 2: b = 2: c = 3, то

a = b And a < > c → True; a < b And a <> c → False;


a = b Or a > c → True a < b Or a > c → False;
Not (a = b) → False.
25

2.2. Условный оператор IF … THEN

Линейная форма

Истина

Если условие ТО операторы1 [Иначе операторы2]


Ложь
Например:
a = 0: b = 1
IF a < b THEN t = 15: v = 16 ELSE t = 17: v = 17
Результат: t =15, v = 16
Блочная форма
IF условие1 THEN
Блок операторов 1
ELSEIF условие2 THEN
Блок операторов 2
ELSE
Блок операторов 3
END IF
Например:
a = 0: b = 1
IF a < b THEN
t = 15: v = 16
ELSE t = 17: v = 17
END IF
В результате работы этого фрагмента программы получится t = 15, v = 16

2.3. Примеры чтения программ с алгоритмом «ветвление»

Пример 2.1. Прочесть программу, написанную в модуле, сопровожда-


ющем лист Excel, записать результат, который появится после выполнения
программы в ячейке листа A1.
Function z(a, b)
A IF b * a < 3 THEN
1 = z(1; 4) z = Sqr(a) Mod Sqr(b)
ELSE
z = Sqr(a) \ Sqr(b)
End If
End Function
26

Решение:
1. Сопоставляем формальные параметры a, b при вызове программы с
фактическими значениями, передаваемыми в программу при ее вызове:
a = 1; b = 4.
2. Переходим к выполнению логического оператора
а) b * a ⇒ 4 ⋅ 1 = 4.
б) Полученное значение 4 меньше трех ?
в) Если ответ «да», то выполняем действия после слова Then(Тогда),
в противном случае – после слова Else (Иначе). В данном случае ответ «да»,
следовательно:
г) z = a Mod b = 1 Mod 2 = 1
д) в ячейке A1 появится число 1

Пример 2.2. Программа-процедура сопровождает лист Excel. Оценить


какой результат появится после завершения работы программы.

Sub main( ): Call prog (6, 2, 1):End Sub


Sub prog (k, i, j)
Pi = Cells(1, 1)
a = Pi / k
If a > Pi / 2 Then t = k * Cos(a) Else t = k * Sin(a)
Cells(i, j) = t
End Sub

Решение:
1. Процедура main( ) предназначена для вызова программы-процедуры
prog() для передачи в п/п фактических параметров. В результате, сопоставляя
фактические и формальные параметры, получаем: k = 6; i = 2; j = 1
2. Управление передано п/ф Prog(6, 2, 1)
3. Из ячейки А1 считывается значение переменной Pi = ПИ() = 3,1415…
4. Рассчитывается переменная a = Pi / 6
5. Переходим к проверке условия в If: a > Pi / 2? Ответ: Нет!.
Следовательно, выполняем действия после слова Else (Иначе), а именно:

π 1
t = 6 ⋅ sin 6 = 6 ⋅ 2 = 3.

6. Результат записывается в ячейку Cells(2,1). В ней появляется число


3.
7. Управление возвращается в процедуру main( ), где работа программы
заканчивается.
27

Пример 2.3. Составить программу для вычисления неэлементарной


функции, заданной выражением:

⎧ x , если x < 0


y = ⎨ x 3 , если 0 ≤ x ≤ 5

⎪4 x , если x > 5

Решение:
Программируем заданное выражение, пользуясь таблицей стандартных
функций (Табл. 4):
Function y(x)
If x < 0 Then
y = Sqr(Abs(x))
ElseIf x >= 0 And x <= 5 Then
y=x^3
Else: y = x ^ (1 / 4)
End Function

2.4. Задания для самостоятельного чтения программ


со структурой «ветвление»

На рисунке представлен фрагмент листа Excel. Справа представлен


текст подпрограммы функции z(а, b). Чему будет равен результат в ячейке С1?

Задание 1. Function z(a, b)


A B C x = Cells(1, 1): y = Cells(1, 2)
If a * b < 3.5E+01 Then
1 2250,0E–01 1,21E+02 = z(7;5) z = Sqr(x) Mod Sqr(y)
Else
z = Sqr(x) \ Sqr(y)
End If
End Function
Задание 2. Function z(t, u)
A B C x = Cells(1, 1): y = Cells(1, 2)
1 103,0E–01 0,03E+02 =z(3;2E-02) If t/u>2E+01 Then
z=x*y
Else z=x \ y
End If
End Function
28

Задание 3.
Function z(a, b)
A B C x = Cells(1, 1): y = Cells(1, 2)
1 1000,0E–01 0,49E+02 =z(4E0;20E-01) If b / a < 3 Then
z = Sqr(x) Mod Sqr(y)
Else
z = Sqr(x) \ Sqr(y)
End If
End Function
Задание 4.
A B C Function z(t, u)
x = Cells(1, 1): y = Cells(1, 2)
1 203,0E–01 0,051E+02 =z(6E+11;3E-02)
If t/u < 2E+03 Then
z=x*y
else z=x \ y
End If
End Function

Задание 5. Прочесть программу и определить, где на листе Excel и какой


результат появится после ее выполнения.
Sub main(): Cells(1, 2) = prog4( - 6.6E+02;2): End Sub
Function prog4(c; k)
If c < 0 Then t = k * Abs(c) Else t = k *Sqr(c)
prog4 = t
End Function

Задание 6. Прочесть программу и определить, где на листе Excel и какой


результат появится после ее выполнения.
Sub a(): t = prog1(-1, 0.2, 1, 1): End Sub
Function prog1(a, b, i, j)
If a * b <= 0 Then t = a * Exp(b) Else t = a * Sqr(Abs(b))
Cells(i, j) = a * b
prog1 = t
End Function
В следующих заданиях на рисунках представлен фрагмент листа Excel.
Справа представлен текст программ. Где на листе Excel и какой результат
появится после их выполнения?

Задание 7. Sub main(): Call prog2(2, 1, 3):End Sub


sub prog2(k, i, j)
PiK = Cells(1, 1):a = PiK / k
If a < Pi Then t = k * Tan(a) Else t = k * Tan(a) ^ 2
Cells(i, j) = t
End Sub
29

Задание 8.
Sub main(): Cells(1, 2) = prog3(3.4E+02): End Sub
Function prog3(c)
a = Cells(1, 1)
If a < > 0 Then t = c / a Else t = c / Exp(a)
prog3 = t
End Function

Задание 9. Function Чет_нечет (m) As String


If m Mod 2 = 0 Then
t$ = "Четное число"
Else: t$ = "Нечетное число"
End If
Чет_нечет = t$
End Function

Function Кратность(m%, n%) As String


Задание 10. If m% Mod n% = 0 Then
t$ = "Числа кратные"
Else: t$ = " Числа не кратные "
End If
Кратность = t$
End Function

2.5. Задания для самостоятельного программирования


неэлементарных математических функций

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

⎧x3 , x ≤1 ⎧ x, x≤2
⎪ ⎪⎪
⎪ y = ⎨ x3 , 3 ≥ x > 2
1. y = ⎨ x 4 , 1 < x < 10 2.
⎪ ⎪
⎪x5 , x ≥ 10 ⎪⎩ x 2 , x>3

⎧5 x, x<0 ⎧ x, 5 < x < 10
⎪⎪ ⎪⎪
3. y = ⎨6 x, 5 ≥ x ≥ 0 4. y = ⎨x2 , x ≥ 10
⎪ ⎪
⎪⎩ x 5 , x>5 ⎪⎩ x 3 , x≤5
30

⎧ x − 1, x≥0 ⎧cos x, x≤0


⎪ ⎪
5. y = ⎨ x + 5, − 1 < x < 0 6. y = ⎨sin x, x ≥ π/2
⎪ ⎪
⎩ x − 7, x ≤ −1 ⎩сtgx, π/2 > x > 0
⎧1, x<0 ⎧e x , x >1
⎪ ⎪
7. y = ⎨2, 0 ≤ x ≤ 3 ⎪
8. y = ⎨e − x , x < −1

⎩3, x>3 ⎪
⎪1, −1 ≤ x ≤ 1

⎧sin x, x<0 ⎧cos x, x≤0
⎪ ⎪
9. y = ⎨cos x, 30 ≥ x ≥ 0 10. y = ⎨sin x, x≥π
⎪ ⎪
⎩tgx, x > 30 ⎩ctgx, 0< x<π
⎧ x, x ≤1 ⎧ x, 0 < x <1
⎪⎪ ⎪⎪
11. y = ⎨x 2 , 1 < x < 2 12. y = ⎨ x − 1, x ≥1
⎪ ⎪
⎪⎩ x 3 , x≥2 ⎪⎩ x 2 , x≤0
⎧ x, x<5 ⎧ x, x ≤ 10
⎪⎪ ⎪⎪
13. y = ⎨ x 2 , 10 ≥ x ≥ 5 14. y = ⎨x2 , 10 < x < 15
⎪ ⎪
⎪⎩ x 3 , x > 10 ⎪⎩ x 3 , x ≥ 15
⎧ x − 1, x≤0 ⎧ x − 1, −1 < x < 0
⎪ ⎪
15. y = ⎨ x − 2, 1 ≥ x > 0 16. y = ⎨ x − 2, x>0
⎪ ⎪
⎩ x − 3, x >1 ⎩ x − 3, x ≤ −1
⎧ x − 1, x≤2 ⎧− x , x<0
⎪⎪ ⎪⎪
17. y = ⎨ x 2 + 2, 3 ≥ x > 2 18. y = ⎨x2 , 0 ≤ x ≤ 20
⎪ ⎪
⎪⎩ x 3 + 3, x>3 ⎪⎩ x, x > 20
⎧sin x, x≤0 ⎧x2 , 0 ≤ x ≤ 15
⎪ ⎪
19. y = ⎨cos x, 45 ≥ x > 0 ⎪
20. y = ⎨ x3 , x > 15

⎩ctgx, x > 45 ⎪
⎪x4 , x<0

31

⎧ x, x ≤1 ⎧ x + 5, x≤9
⎪ ⎪
21. y = ⎨2 x , 2 ≥ x > 1 22. y = ⎨ x − 7, 9 < x < 10
⎪ ⎪
⎩3x, x>2 ⎩ x + 8, x ≥ 10
⎧ x, x≤e ⎧etgx , x ≤π
⎪⎪ ⎪
y = ⎨x2 , x ≥ e/2 ⎪
23. 24. y = ⎨x −7 , π < x < 2π
⎪ ⎪
⎪⎩3 x , e/2 > x > 0 ⎪ctg ( x + 8), x ≥ 2π

⎧5 x , x ≤ −3 ⋅ 10 2 ⎧cos 2 x, x≤0
⎪ ⎪
⎪ ⎪
25. y = ⎨log 2 x, x ≥ 3 ⋅ 10 2 26. y = ⎨sin x 2 , x ≥ π/2
⎪ ⎪
⎪ln x, 3 ⋅ 10 2 > x > −3 ⋅ 10 2 ⎪сtg 2 x , π/2 > x > 0
⎩ ⎩

2.6. Примеры разработки программ с алгоритмом «ветвление»


для задач с неявным алгоритмом

Пример 2.4 Составить программу для вычисления корней квадратного


уравнения a ⋅ x 2 + b ⋅ x + c = 0 . Результаты вывести в ячейки листа Excel.
Решение:
Будем разрабатывать программу-процедуру, задавая в качестве
формальных параметров коэффициенты квадратного уравнения и номера
ячеек для вывода корней уравнения.

Sub sqr_equ(a, b, c, i, j) Название программы с формальными параметрами


D=b^2-4*a*c Вычисление дискриминанта D
If D > 0 Then Если D > 0, то
x1 = (-b - Sqr(D)) / 2 / a вычисляем первый корень
x2 = (-b + Sqr(D)) / 2 / a вычисляем второй корень
ElseIf D = 0 Then Если D = 0, то
x1 = -b / 2 / a вычисляем 1-й корень, а 2-й корень приравнивается
x2 = x1 1-му корню
Else Остался единственный случай : D < 0, то
Cells(i, j) = "Корней нет" выводится сообщение об отсутствии корней и
Exit Sub осуществляется выход из программы
End If Конец блочного оператора If
Cells(i, j) = x1: Вывод 1-го корня в запланированную ячейку
Cells(i + 1, j) = x2 Вывод 2го корня в следующую ячейку того же
столбца
End Sub Завершение программы
32

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


Exit Sub, чтобы не «забить» сообщение "Корней нет" последними
операторами вывода в ячейки листа, которые работают при неотрицательном
корней. Чтобы по этой программе получить решение, например, уравнения
5 ⋅ x 2 + 8 ⋅ x − 31 = 0 , достаточно в вызывающей программе записать оператор
Call sub_equ(5,8,-30,1,1).Результаты будут выведены в ячейки А1, А2.

Пример 2.4. Дана плоская фигура c выре- y


занным изнутри квадратом со стороной а = 3 r
см, а снаружи окружностью радиуса R = 5 см.
Центры квадрата и окружности находятся в
начале координат (Рис. 2.1). Определить, a
0 x
попадает ли точка с координатами x, y внутрь rp
данной фигуры. •(x,y)
Решение:
Нанесем заданные параметры фигуры и Рис. 2.1
координаты точки на лист Excel:
A B С D
1 R= 5 x= 1
2 A= 3 y= 3

Текст соответствующей программы:


Sub Figure () Начало программы
Ввод радиуса
r = cells(1,2)
окружности
a = cells(2,2) Ввод стороны квадрата
x = cells(1,4) : y = cells(2,4) Ввод координат точки
Вычисление радиуса век
rp = SQR(x ^ 2 + y ^ 2)
тора точки.
Вычисление половины
ah = a / 2
стороны квадрата.
Определение, удовлетво
ряют ли координаты точ
IF rp <= r AND ABS(x) >= ah AND ABS(y) >= ah THEN
ки условиям попадания в
фигуру.
text$= "точка внутри фигуры" Формирование текстовой
переменной с результата
ELSE: text$= "точка вне фигуры"
ми сравнения
END IF Конец блока IF
cells(5,1)=text$ Вывод результата в А5
END Sub Конец программы
33

2.6. Задания для программирования задач с неявно заданным


алгоритмом «ветвление»

1. Написать программу для выбора наибольшего из трех заданных чисел.


2. Написать программу для выбора наибольшего из четырех заданных чисел.
3. Написать программу полного исследования совокупности корней биквад-
ратного уравнения a ⋅ x4 + b ⋅ x2 + c = 0. Если корней нет, то должно быть выведено
сообщение об этом, иначе должны быть выведены два или четыре корня.
4. Даны три числа: X, Y, Z. Составить программу для нахождения
минимального из них.
5. Даны три числа: X, Y, Z. Удвоить эти числа, если X < Y < Z,
и заменить их абсолютными значениями, если это не так.
6. На плоскости даны две точки: P(x1,y1) и Q(x2,y2). Составьте
программу, определяющую, находится ли каждая из этих точек на прямой,
заданной уравнением: y = a ⋅ x + b. Значения координат точек P и Q, а также
коэффициенты уравнения прямой задайте самостоятельно – через
формальные параметры или с ячеек листа.
7. На плоскости заданы три точки A(x1,y1), B(x2,y2) и C(x3,y3). Составьте
программу, определяющую с некоторой погрешностью, является ли
треугольник ΔABC прямоугольным. Если заданный треугольник является
прямоугольным, укажите вершину треугольника, при которой угол равен 90о.
Координаты точек задайте через формальные параметры.
8. Составьте программу, определяющую название дня недели по его
номеру: 1 – Понедельник, 2 – Вторник и т.д. При вводе числа вне диапазона
[1–7] программа должна выдать сообщение об ошибке.
9. Составьте программу, определяющую стадию жизни человека
по его возрасту: 0–11 – Детство, 12–30 – Юность, 31–65 – Зрелость, 66–100 –
Старость.
Шкала возрастов может быть произвольной. При вводе числа вне
диапазона [0–100] программа должна выдать сообщение «Так долго не живут!».
10. Составьте программу, определяющую цвет по длине волны.
Используйте приведенные ниже приближенные интервалы длин волн и
соответствующие им цвета видимой части спектра.

Цвет спектра Длина волны, нм Цвет спектра Длина волны, нм


Красный 760–620 Голубой 500–480
Оранжевый 620–590 Синий 480–450
Желтый 590–560 Фиолетовый 450–380
Зеленый 560–500
34

При вводе значения длины волны вне оптического диапазона спектра


[380–760] нм программа должна выдать сообщение об ошибке.
11. Составить программу, определяющую, могут ли три числа a, b и c быть
сторонами треугольника, и если да, то определить его тип: равносторонний,
равнобедренный, разносторонний. При составлении программы используйте
условия существования треугольника: a ≤ b + c; b ≤ a + c; c ≤ a + b . При
решении задачи следует учитывать экстремальные ситуации, когда одна или
несколько сторон равны нулю либо когда одно из неравенств переходит в
равенство (треугольник нулевой площади).
12. Составить программу, опреде-
ляющую, попадает ли точка P(x,y) в y
2
прямоугольник со сторонами a и b и
центром в точке с координатами (x0, y0). 1
13. Составьте программу, опреде-
ляющую, принадлежит ли точка P(x,y)
закрашенной области (Рис. 2.2) -2 -1 1 2 х
-
14. Определить, что при делении
двух положительных целых чисел A и B, -2
получается остаток, равный одному из
заданных чисел L или R.
15. Решить задачу примера 1.4 Рис. 2.2.
(стр. 18) с условием возможной кратности
числа V числу 512.

III. Алгоритм циклической структуры

Цикл – это оператор или группа операторов, которые программа


многократно выполняет до тех пор, пока не получит команду начать
выполнение чего-либо другого. Такая последовательность команд называется
телом цикла. Циклические алгоритмические структуры бывают двух типов:
ƒ Циклы со счетчиком (арифметические циклы), в которых тело
цикла выполняется определенное количество раз;
ƒ Циклы с условием (итерационные циклы), в которых тело цикла
выполняется, пока условие истинно.

3.1. Оператор арифметического цикла For…Next

Формат записи оператора:


FOR_перем._ц.=нач.знач.ц._TO_кон.зн._[STEP_ знач_шага_ц.]
35

Операторы тела цикла


NEXT [перем._ц.]
Здесь:
перем.ц. – переменная цикла - числовая переменная,
нач.зн.ц. и кон.зн.ц. – начальное и конечное значение цикла:
может быть числовой константой, именем переменной или арифметическим
выражением.
знач._шага_ц.– шаг изменения переменной на очередном цикле:
может быть числовой константой, именем переменной или арифметическим
выражением. Если операнд STEP опущен, то значение шага = 1.
При обращении к оператору For…Next сначала вычисляется шаг,
начальное и конечное значение. Если при положительном значении шага
полученное значение переменной цикла меньше или равно конечному
значению, то выполняется последовательность операторов, следующая за
оператором For-To – операторы тела цикла. Если полученное значение
переменной цикла больше конечного значения, то происходит выход из
цикла и управление передается оператору, следующему за Next. При
отрицательном значении шага значение переменной цикла уменьшается с
каждым циклом. Цикл выполняется до тех пор, пока значение переменной
цикла не станет меньше конечного значения. Если при входе в блок
For…Next заданное условие не выполняется, то управление сразу
передается оператору, следующему за оператором Next.

3.2. Примеры чтения программ с алгоритмом «арифметический цикл»

Пример 3.1. Прочесть команды п/п Summation и определить, какой


результат и в какой форме будет выдан после ее выполнения.
Sub summation() Начало программы
Засылка число
S=0
0 на S
Начало оператора
For i = 5 To 10 Step 2
цикла
S=S+i Тело цикла
Конец оператора
Next i
цикла
Результат посылает
MsgBox Str$(S), vbExclamation, "Пример накопления Суммы"
ся в окно сообщения
End Sub Конец программы
36

Решение:
1. S = 0
2. Первое действие оператора For…Next: i = 5. Проверяется i ≤ 10 ? Если
«да!», то компьютер приступает к выполнению операторов тела цикла, а
именно:
1-й цикл

3. S = 0 + 5 = 5 – в ячейке ОП с именем S число 0 заменяется на число 5.


4. ПК приступает к выполнению оператора Next: i = 5 + 2 = 7 – значение
переменной цикла изменяется на величину шага Step = 2.
5. Возврат к оператору For…To…: снова проверяется i = 7 ≤ 10 ? Да!
Происходит возврат к пункту 3:
2-й цикл

3. S = 5 + 7 = 12
4. i = 7 + 2 = 9 – здесь знак « = » - это оператор присваивания
5. i = 9 ≤ 10 ? Да! здесь знак « = » - это знак равенства

3. S = 5 + 7 = 12 здесь первый знак « = » - это оператор присваивания,


3-й цикл

второй – знак равенства.


4. i = 9 + 2 = 11
5. i = 11 ≤ 10 ? Нет! ⇒ происходит выход из цикла на выполнение функ-
ции MsgBox
6. Функция MsgBox формирует окно
сообщения, где vbExclamation – аргумент
опции button для отображения значка «!»,
аргумент title = "Пример накопления Суммы"
отображен в строке заголовка окна сообщения. MsgBox использует функцию
Str(S), преобразующую числовую переменную S в символьную типа String –
это необходимое условие для вывода числового значения в окне сообщений.
В ходе работы цикла происходит накопление суммы на переменной S
за счет оператора присваивания. Результат – накопленная сумма представлен
в поле окна сообщения. Это – 21. Ответ: 21 Function D(i1%, i2%, i3%)
Пример 3.2. На рисунке представлен Dim y As Integer
фрагмент листа Excel. Справа представлен текст Dim i As Integer
подпрограммы функции. Чему будет равен Dim s As Single
результат в ячейке D1? s = -2
For i = i1% To i2% Step i3%
y = (i ^ 2 - 10) / (i + 1)
A B C D
s=s+y
1 1,26E+01 0,1E - 03 -5,23E 0 =D(A1;B1;C1) Next i
D=s
End Function
37

Решение: Опуская подробные объяснения, данные в предыдущем


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

i1% = 1,26E + 01 = 1,26 ⋅ 101 = 12,6 ≈ 13;


i2% = 0,13E – 03 = 0,13 ⋅ 10-3 = 0,00013 ≈ 0;
i3% = – 5,23E 0 = – 5,23 ⋅ 100 = – 5,23 ≈ – 5.

2. Переменные y, i объявлены как целочисленные, поэтому при


операциях с ними также будем делать округление до целого числа.
Переменная s – вещественная, расчеты для нее ведутся без округления.
3. s = – 2.
4. i = 13 ≥ 0 ? Да!
132 − 10 159
5. y = = = 11,3... ≈ 11
1-й цикл 13 + 1 14
6. s = -2 + 11 = 9
7. i = 13 – 5 = 8 ≥ 0 ? Да!
8 2 − 10 54
5. y = = =6
8 +1 9
2-й цикл
6. s = 9 + 6 = 15
7. i = 8 – 5 = 3 ≥ 0 ? Да!
32 − 10 − 1
5. y = = = −0,25... ≈ 0
3-й цикл
3 +1 4
6. s = 15 + 0 = 15
7. i = 3 – 5 = – 2 ≥ 0 ? Нет! ⇒ выход из цикла.
8. D = s = 15 – возвращаемое значение. ⇒ Ответ: в ячейке D1 будет 15
38

3.3. Задания для самостоятельного чтения программ с алгоритмом


«арифметический цикл»

Прочесть программу, написанную в модуле, сопровождающем лист


Excel, записать результат, который появится после выполнения программы в
ячейке листа С1.
Function D(j1%, j2%, j3%)
Задание 1. Dim y As Integer
Dim i As Integer
A B C D Dim s As Single
1 1,99E+01 2,5E-03 -10,3E0 =D(A1;B1;C1) s=7
For i = j1% To j2% Step j3%
y = (i - 9) / (i - 7)
s=s+y
Next i
D=s
End Function

Function P(i1%, i2%, i3%)


Dim t As Integer
Задание 2. Dim i As Integer
A B C D Dim s As Single
1 20E–01 0,12E+02 4,15E0 = P(A1;B1;C1) s=1
For i = i1% To i2% Step i3%
t = (i + 10) / i ^ 2
s=s+t
Next i
P=s
End Function

Function z(i1%, i2%, i3%)


Dim x As Integer
Dim i As Integer
Задание 3. Dim q As Single
A B C D q=0
For i = i1% To i2% Step i3%
1 1,0E–02 0,18E+02 7,24E0 = z(A1;B1;C1) x = (i + 10) / (i + 1)
q=q+x
Next i
z=q
End Function
39

Задание 4. Sub sqrt()


For i = 1 To 3
x = Cells(i, 1): xx = Sqr(x): Cells(i, 2) = xx
Next i
End Sub

Function G(i1%, i2%, i3%)


Задание 5. Dim z As Integer
A B C D Dim i As Integer
1 1,6E+01 0,21E-03 -7,3E0 = G(A1;B1;C1) Dim s, z As Single
s = – 10
For i = i1% To i2% Step i3%
z = (i – 10) ^ 2 / (i + 1)
s=s+z
Next i
G=s
End Function

Задание 6.
Sub trig_fun()
Pi = Cells(1, 1)
For i = 2 To 4
Cells(i – 1, 2) = Sin(Pi / i): Cells(i – 1, 3) = Cos(Pi / i)
Next i
End Sub

Задание 7. Sub prog2()


A B C sm = 1.E2
1 1,6E+02 4 For i = 1 To 3
x = Cells(i, 1): c = Cells(i, 2)
2 2,5E+01 5 y = x / c: Cells(i, 3) = y
3 2,4E+02 3 sm = sm + y
Next i
Cells(i, 3) = sm
End Sub
40

Задание 8.
A B C Sub prog3()
pp = 1
1 3,6E+02 90 For i = 1 To 3
2 2,0E+01 4 x = Cells(i, 1): c = Cells(i, 2)
3 5,4E+02 27 y = x / c: Cells(i, 3) = y
pp = pp* y
Next i
Cells(i, 3) = pp
End Sub

Задание 9.
В какой форме и какой результат появится после выполнения следующей
программы?
Sub main()
sm = Sum_gp(3, 3, 3)
MsgBox Str(sm), , "Sum of geometrical progression"
End Sub
Function Sum_gp(b0, q, n)
b = b0
s=0
For i = 2 To n
b = b * q: s = s + b
Next i
Sum_gp = s
End Function

Задание 10.
Оценить результат работы программы, если при ответе на запрос
диалогового окна ввести число 2.
Sub prog1()
x$ = InputBox("Ввести x")
xr = Val(x)
For i = 5 To 2 Step –2
xr = xr * i
Next i
x$ = xr
MsgBox x$, , "Накопление произведения"
End Sub
41

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


и произведения, табулирования математических функций

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


(k +1) N
1 N ⎛ kx ⎞
S ( x) = ∑ x k и произведения P = ∏ ⎜ x − ⎟ для произвольно
N k =1 k = 0⎝ 2⎠
заданных x и N.

1. Решение: Для вычисления суммы воспользуемся программой


процедурой.

Sub summa() Начало программы


Переменной цикла приписываем тип
Dim k As Byte
Byte, так как k ∈ N и k< 255
x = Val(InputBox("Ввести x")) Ввод значений x, N через функцию окна
ввода. Функция Val преобразует
N = Val(InputBox("Ввести N")) символьное значение из поля ввода в
числовую переменную
Запасаем переменную Sum для
Sum = 0
накопления суммы.
For k = 1 To N Начало цикла
U = x ^ ((k + 1) / k) Вычисление очередного члена ряда,
Sum = Sum + U зависящего от x и k, и очередной суммы
Next k Следующее k
Вычисление итоговой суммы по
Sum = Sum / N
формуле
Окно сообщения, выводящее результат
MsgBox "Сумма = " & Str(Sum)
расчета
End Sub Завершение программы

Комментарии к программе.
Запрос ввода переменных x и N, реализованный через функции
диалоговых окон, выдаст величины в текстовом формате, поэтому перед
присвоением введенных значений на переменные x и N, выполняем функцию
Val, конвертирующую введенные значения в числовой формат.
42

В операторе MsgBox производится слияние (&) строковой (текстовой)


константы «Сумма =» с преобразованным в текстовый формат (через
функцию Str) результат, накопленного на числовой переменной Sum.
N
2. Решение: Для вычисления произведения P = ∏ ⎛⎜ x − kx ⎞⎟ воспользуемся
k = 0⎝ 2⎠
программой-функцией, передавая значение переменной x и N, через
формальные параметры.

Function proizv Начало программы-функции


(x,N)
Dim k As Byte Описание переменной цикла
P=1 Запасаем переменную P = 1 для накопления произведения.
For k = 0 To N Начало цикла
U= x–k*x/2 Вычисление очередного члена ряда, зависящего от x и k, и
P=P*U очередного произведения P
Next k Следующее k = k + 1
proizv=P Передача результата на возвращаемое значение proizv.
End Function Завершение программы

Вызвать данную программу можно либо с листа Excel, либо из


процедуры, например, следующим образом:

Sub main
x = Val(InputBox("Ввести x")): N = Val(InputBox("Ввести N"))
PR=proizv(x,N): MsgBox "Произведение = " & Str(PR)
End Sub

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


y = lg x / x + 2 x , заданной на множестве x ∈ {–3; 4;11;18;25}.
Решение: Прежде чем приступать к написанию программы, обратим
внимание, что набор точек, в которых задана функция y, представляет собой
арифметическую прогрессию с разностью h = 7, следовательно, мы имеем
возможность использовать арифметический оператор цикла с шагом 7.
Запишем программу-процедуру, в которой в качестве формальных
параметров зададим начальное (x0), конечное значение (x1) аргумента x, и его
шаг (h).
43

Sub y(x0, x1, h) Начало программы-функции


Выбор счетчика k для адресации к
ячейкам листа Excel и
k = 1: cells(k,1)=”x”: Cells(k,2) = ”y”
формирование подписи к столбцам
для аргумента x и значения y.
For x = x0 To x1 Step h Начало цикла
y=log(x) / log(10) / x +exp (x * log( 2 )) Вычисление y для очередного x
Переход к следующей строке листа
k=k+1
Excel
Cells(k, 1) = x: Cells (k, 2) = y Вывод данных на лист
Next x Следующее x = x + h
End Sub Завершение программы

Комментарии к программе.
Обратим внимание на программирование математического выражения
х x xln2
y: для вычисления 2 мы использовали функцию Exp( ): 2 = e , а не степенную
функцию 2 ^ x. Это более корректное и универсальное решение задачи. Многие
языки программирования, такие, как, например, Фортран, не выполняют
операцию возведения в степень с вещественным показателем, с отрицательным
основанием, такие же проблемы могут возникать и на VBA.
Вызвать данную процедуру на выполнение можно, например, с
помощью оператора call y(–3, 25, 7).

3.4. Задачи для самостоятельного программирования алгоритмов


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

Составить программы для вычисления заданных сумм (А), произведений


(Б) и табулирования функций на заданном множестве точек (В).


А Б В
вар.
N N
y = lg x 3 , x ∈ [10,25] с шагом h = 3
1. S = ∑ 3i P = ∏ cos i
i =1 i =1
N N
y = sin 2 ( x + 1) ,
2. S= ∑ (i + 1)2 P = ∏ (i − 3)
i =1 i =1 х(30°, 45°, 60°, 75°, 90°)
44

N N
y = 3 x 2 − 7 , на x ∈ [− 3,15]
3. S= ∑ i3 P = ∏ ai 2
i =1 i =1 с шагом h = 2
N
2
N
y = sin 2 x , x ∈ [10,50] с шагом h = 5
4. S= ∑ sin i P = ∏ cos i + 2
i =1 i =1
N N
y = 3x 2 − 7 ,
5. S = ∑ i2 P = ∏ ei
i =1 i =1 x ∈ [− 3,15] с шагом h = 2
N
2
N 1 y = x3 + x − 1, x(3, 5, 7, 9, 11)
6. S= ∑ (i + 1) P=∏
2
i =1 i =11 + i
N 1 N m y = 3x 2 + 2 x + 1 ,
7. S=∑ P=∏
x ∈ [− 3,10] с шагом h = 2
2 2
i =1 i i =1 ( m − i )
N N y = ctg x , x ∈ [10,170]
8. S = ∑ xi P = ∏i
i =1 i =1 с шагом h = 10
N N
y = lg x3 , x ∈ [30,45] с шагом h = 2
9. S = ∑ tgi P = ∏ sin i 2
i =1 i =1
N
2
N
2 y = cos 2 x + 1 , x ∈ [10,40]
10. S = ∑ (i + 1) P = ∏ cos i
i =1 i =1 с шагом h = 5
N
2
N 2
i y = sin 2 ( x + 1) ,
11. S = ∑ cos i P = ∏e
i =1 i =1 x ∈ (30, 45, 60, 75, 90)
y = lg x3 , x ∈ [10,25] с шагом h = 3
N N
12. S = ∑ cos2 i3 P = ∏ sin i3
i =1 i =1
N
3
N
y = log5 x 2 , x ∈ [3,20] с шагом h =
13. S = 3 ∑ i P = ∏ xi , x ∈ R
i =1 i =1 2
N
i P = (2n + 1)!, y = e 2 x + cos x − 1 ,
14. S = ∑ ( x + 1)
i =1 n = 1,2,3,…….M x ∈ [− 10,10] с шагом h = 3
N
2 n2 y = sin x 2 + ctgx + 3 ,
S= ∑ sin i P= ,
15. i =1 (2n)! x ∈ [10,80] с шагом h = 5
n = 1,2,3,…….M
N
3
N
2 y = x3 − ctgx − e x , x = −3,1,5,9,13,17
16. S = ∑i P = ∏ sin i
i =1 i =1
45

N N
y = x − (1 − x) 2 , x = 0,3,6,9,12,15
17. S = ∑ i3 P = ∏ cos i
i =1 i =1
N y = sin x + cos x − ctgx , x ∈ [10,70]
N
P = ∏ e ai , α ∈ R
18. S = ∑ log3 i i =1
i =1 с шагом h = 10
N N y = ctgx − sin x ,
19. S = ∑ (i + 1)3 P = ∏ cos i
i =1 i =1 x ∈ [10,85] с шагом h = 5
N N
y = Ax 2 + Bx + cos x ,
20. S = ∑ e −i P = ∏ lg i
i =1 i =1 x ∈ [A, B ] с шагом H
N N 2 x
i y = x − e + cos x ,
21. S = ∑ (ax) P = ∏ i2
i =1 i =1 x = (3,1,−1,−3)
N 1 N
2 y = x3 − cos e a + x , x ∈ [− 7,18]
22. S = ∑ 2 P = ∏ ln i
i =1i i =1 с шагом h = 3
N x N
y = 5 x − cos 3 e a + x , x ∈ [0,2π ]
23. S = ∑ 2,x∈R P = ∏ e2 i
i =1 i i =0 с шагом h = π/10
N N 3
3
S = ∑ cos i 3
P = ∏a ,a∈ R 2i y = x mod (1 − x) 2 ,
24.
i =1 i =1 x ∈ [− 10,−6;−2,2,6,10]
y = e 2 x + lg x 3 , x ∈ [− 10,25]
N N
5 4
S = ∑ cos i P = ∏ sin i 3
25.
i =1 i =1
с шагом h = 3

3.5 Примеры задач с неявно заданным арифметическим циклом

6
Пример 3.5. Вычислить S = ∑ 2 i без использования операции возведения
i =1
в степень.
Решение: Стандартный алгоритм решения задачи был рассмотрен
в п. 3.3. Использовать его не всегда рационально, так как операция
возведения числа 2 в степень i выполняется умножением 2 на себя i раз, при
очень большом значении i эта процедура будет требовать больших затрат
процессорного времени, поэтому рассмотрим более эффективный способ
решения такой задачи.
46

Начало программы. формальные параметры i0


– начало, i1 - конец суммирования,
Sub sum(i0, i1, k1, k2)
k1, k2 – номер строки и столбца ячейки листа
Excel для вывода результата
s = 0: u=1 Начальные значения переменных
For i = i0 To i1 Начало цикла
Вычисление очередного члена суммы через
u=u*2
предыдущий член
s=s+u Накопление суммы
Next i Следующее i = i + 1
Cells(k1, k2) = s Вывод результата
End Sub Завершение программы

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


чисел, кратных числу m и лежащих в интервале от N1 до N2.
Решение: Для определения кратности используем оператор вычисления
остатка от деления Mod. Для того, чтобы не заботиться о выводе данных,
составим программу-функцию, с формальными параметрами N1, N,2 m

Function S_nat (N1, N2, m) Начало программы-функции


Dim k As Integer Описание переменной цикла
Запасаем переменную s=0 для накопления
s=0
суммы
Перебираем все целые числа в заданном
For k = N1 To N2
интервале
Если очередное число кратно m, то его
остаток при делении на m будет равен нулю,
If k mod m = 0 then s = s + k
в этом случае присоединяем это число к
сумме
Next k Следующее k = k + 1
Передача результата на возвращаемое
S_nat = s
значение S_nat.
End Function Завершение программы
47

3.6 Задания для самостоятельной разработки программ с неявно


заданным циклическим алгоритмом.
10
1. Вычислить S = ∑ (−1) i i 2 , не используя операцию возведения в
i =1
степень числа (–1).
2. Плотность воздуха убывает с высотой по закону ρ = ρ 0 e − hz . Считая
кг
что ρ 0 = 1,29
3
, z = 1,25 ⋅ 10 − 4 , напечатать таблицу зависимости
м
плотности от высоты с шагом 100 м от 0 до 1000 м.
3. Осваивая производство нового изделия, предприятие выпустило их в
первый день 10 000 шт. Каждый следующий день оно выпускало на 10 %
больше от нормы предыдущего дня. Сколько изделий предприятие выпустит
на 7 день? Сколько изделий предприятие выпустит за 7 дней?
4. Одноклеточная амеба каждые 3 часа делится на 2 клетки.
Определить, сколько клеток будет через 3, 6, 9, 12, 15,…, 24 часа.
5. Вычислить сумму натуральных чисел, кратных 7, начиная с 11 до 29.
6. В столбце таблицы записаны баллы студентов по одному экзамену.
В группе N студентов. Определить средний балл группы.
7. В списке студентов группы из N человек дан возраст студентов в
годах на текущий момент. Выбрать студентов, старших 20 лет, и записать их
в отдельный столбец листа Excel.
8. Найти скалярное произведение двух n-мерных векторов
(не использовать массивы).
9. Дано целое четырехзначное число в системе счисления с основанием
q ≤ 10. Перевести это число в десятичную систему счисления.
10. Задан набор из m точек c координатами (x, y). Найти сумму
радиусов векторов этих точек (не использовать массивы).
11. В предыдущей задаче (№ 10) отобрать те точки, которые попадают
в круг радиусом R0. Отобрать точки – значит вписать в строке листа, где
хранятся значения (x, y), фразу «лежит в заданном круге».
y
12. Дана рекуррентная формула для функции y n +1 = 2 xy n − n −1 .
x
Вычислить y15 , если известно, что y0 = 3; y1 = −2 .
13. Составить программу для нахождения всех пифагоровых чисел, не
превышающих 20. Пифагоровы числа – это натуральные числа n и m,
удовлетворяющие условию n 2 + m2 = k 2 , т.е. такие два числа, сумма
квадратов которых равна квадрату другого числа.
48

14. N-угольник задан своими вершинами, т.е. для каждой вершины


заданы координаты (x, y). Составить программу для нахождения периметра
этого многоугольника.
15. Группа студентов из n человек проходит тестирование по 100-
балльной системе. Результаты каждого третьего суммируются, и по ним
вычисляется средний балл. Сколько студентов было отобрано и какой
средний балл получен?

IV. Итерационные алгоритмы

4.1. Оператор цикла с условием Do…Loop

Главной особенностью циклов с условием является условие, которое


может быть любым выражением, принимающим значение True (Истина) или
False (Ложь). В VBA есть два основных цикла с условием.
Цикл с предусловием
Do While | Until <Условие>
Операторы тела цикла
Loop
Если While, то тело цикла выполняется, когда <Условие> = True,
если Until, то тело цикла выполняется, когда <Условие> = False.
Пример 4.1. Переменная а = y(2, 15). Текст пользовательской
программы – функции y (i, N) приведен справа. Чему равно значение а?
Решение:
1. Сопоставляем формальные параметры с
Function y (x, Q)
фактическими: x = 2; Q = 15 Dim k As Byte
2. P = 1; k = 1 P = 1: k = 1
3. Так как условие выполнено, т.е. P < Q (1 < Do While P <= Q
15), то выполняем операторы тела цикла: U= x+k*x/2
4. U = 2 + 1⋅2 / 2 = 3 P=P*U
5. P = 1⋅ 3 = 3 k=k+1
6. k = 1 + 1 = 2 Loop
7. Loop (Возврат к Do) y=P
End Function
8. Возвращаемся к шагу 3.
4. U = 2 + 2⋅2 / 2 = 4 4. U = 2 + 3⋅2 / 2 = 5
5. P = 3⋅ 4 = 12 5. P = 12⋅ 5 = 60
6. k = 2 + 1 = 3 6. k = 3 + 1 = 4
7. Loop (Возврат к Do) 7. Loop (Возврат к Do)
49

8. Условие не выполняется : P = 60 > 15, следовательно происходит


выход из цикла к предпоследнему оператору программы: y = 60.
Ответ: а = 60
Цикл с постусловием
Do
Операторы тела цикла
Loop While | Until <Условие>
В этом варианте операторы цикла будут выполнены один раз обязательно,
а будет ли их повторение, - зависит от выполне- Function z (k, N)
ния/невыполнения условия. Dim i As Byte
Пример 4.2. Переменная b = z (9, 20). Текст S = - 6: i = 4
пользовательской программы – функции z (k, N) Do
приведен справа. Чему равно значение а? T = i * Sqr( k )
Решение: S=S+T
i=i+1
1. Сопоставляем формальные параметры с
Loop Until S > N
фактическими: k = 9; N = 20 z=S
2. S = - 6; i = 4 End Function
3. Приступаем к выполнению операторов
цикла Do
4. T = 4 ⋅ 9 = 12
5. S = - 6 + 12 = 6
6. i = 4 + 1 = 5
7. Проверяем условие S >20 ? Нет! ⇒
8. Возвращаемся к Do, т.е.
4. T = 5 ⋅ 9 = 15
5. S = 6 + 15 = 21
6. i = 5 + 1 = 6
7. Проверяем условие S >20 ? Да! ⇒ Выходим из цикла
8. z = 21.
Ответ: b = 21
Многие математические функции рассчитываются через разложение в
ряд. Точность представления функции зависит от количества членов,
которые сохраняются при вычислении. В программе можно задать
необходимую точность.
Пример 4.3 Разложение функции sin x в ряд Маклорена дается
∞ x 2i +1 x3 x5
формулой: sin x = ∑ (− 1)i (2 ⋅ i + 1)!
= x− +
1⋅ 2 ⋅ 3 1⋅ 2 ⋅ 3 ⋅ 4 ⋅ 5
+ L. Составить
i =0
программу, вычисляющую sin x c точностью ε.
50

Решение: При накоплении суммы ограничимся теми членами, которые


по модулю не меньше, чем заданное число ε. Используем программу-
функцию. Для эффективности работы программы, будем использовать
рекуррентную формулу для каждого последующего члена через
предыдущий:
x2
U i +1 = −U i⋅
(i + 1)(i + 2)
Начало программы-функции: x – аргумент,
Function sinx (x, eps)
eps – точность ε
i = 1: r = x^2: sg = - 1 Начальные значения для цикла
sg – переменная для учета знакопеременности
U = x: s = U
ряда
Do Начало цикла
U = sg * U * r /(i + 1)/(i + 2) Вычисление очередного члена ряда,
s=s+U зависящего от x и I и накопление суммы
sg = - sg Смена знака
Возвращаемся, если полученный член ряда
Loop While Abs(U) > eps
больше заданного eps = ε
Передача результата на возвращаемое
sinx = s
значение sinx.
End Function Завершение программы

4.2 Задания для самостоятельного чтения программ


с итерационным циклом

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


которых приводится.

1) a = prog1(2; 5) 2) b = prog2(6; 5) 3) c = prog3(7; 10)


Function prog1 (x, Z) Function prog2 (q, P) Function prog3 (g, V)
U = - 6: p = 3 A = 7: t = 3 B = 7: y = 3
Do Do Until A < P Do While B < V
F=x^p A=q/t H = (g + y) ^ 2
U=U+F B=B+H
p=p+1 t=t-4 y = y* 4
Loop Until F < Z Loop Loop
prog1 = U prog2 = A prog3 = y
End Function End Function End Function
51

4) x = prog4(16; 28) 5) z = prog5(-2; 1) 6) d = prog6(2.1E+01; 36)


Function prog4 (x, C) Function prog5 (t, D) Function prog6 (a, B)
W = 7: s = 3 c = - 16: v = 8 H = 7: z = 3
Do Until W > C Do Do
A = Sqr(x) *s^ (Sqr(x)) h = v ^ (1 / 3) * t x=a/z
W = -W + A c = c /h H=H*x
s=s-1 t=t-4 z=z+3
Loop Loop While Abs (c) >D Loop Until H = > Sqr(B)
prog4 = A prog5 = Abs (c) prog6 = x
End Function End Function End Function

7) z = prog7(18, 13) 8) f = prog8(0, 5) 9) d = prog9 (6, 10)


Function prog7 (x, C) Function prog8 (i, K) Function prog9 (b, C)
D = 25: a = 3 h = 36: j = 10 f = 0: k = 2
Do While Sqr(D) < C Do Until h < K Do
b = a^2 j = j *(i+1)^2 b = b ^ (k – 1)
D=D*b h = h / (j -4) f=f+b
a=a+x i=i-4 k=k*2
Loop Loop Loop While f < C
prog7 = D prog8 = h * j prog9 = b
End Function End Function End Function

4.3. Задания для самостоятельной разработки программ


с итерационным циклом

1. Осваивая производство нового изделия, предприятие выпустило их в


первый день 10 000 шт. Каждый следующий день оно выпускало на 10 %
больше от нормы предыдущего дня. Определить, через сколько дней
предприятие выпустит 100 000-е изделие?
2. Написать программу нахождения среди последовательности чисел :
1, 1 + 12 ; 1 + 12 + 13 ; … – первого, большего числа а.
3. Дано положительное число ε. Последовательность образована по
( 2) ( 3) ( )
следующему закону: ai = 1 − 1 ⋅ 1 − 1 ⋅ L ⋅ 1 − 1 . Найти первый член an ,
i +1
для которого выполнено условие: a n − a n −1 < ε .
x 2i
4. Создать программу вычисления cos x = ∑ (− 1)
i
с точностью ε.
(2i )!
52

5. Написать программу вычисления числа Фибоначчи, не


превосходящего заранее заданное число N. Числа Фибоначчи вычисляются с
помощью следующих соотношений: F0 = 0; F1 = 1; Fi = Fi-1 + Fi-2 для i > 1.
6. Найти произведение первых нечетных натуральных чисел, сумма
которых не превосходит заданного числа M.
7. Вычислить такую сумму квадратов натуральных чисел, кратных m, и
кубов чисел, кратных k, которая не превосходит некоторого наперед
заданного числа S0. Определить, сколько всего чисел учтено при вычислении
суммы.
8. По полю случайным образом разбросано 45 источников
рентгеновского излучения. При радиусе обзора 1 км в поле зрения попали
3 источника. При увеличении радиуса на 0,5км, количество источников
увеличивается в 2 раза. Определить, до каких размеров надо увеличить
радиус поиска, чтобы выявить все источники.

***
Авторы выражают благодарность ассистенту каф. ИИУС КГЭУ
Рябовой О.В. за помощь в наборе сложных математических формул и
выражений.

Библиографический список

1. В.А. Белавин. Основы программирования на Бейсике. Учебное


пособие по курсу «Информатика». / В.А. Белавин, М.М. Волченко,
Р.А. Ишмуратов, В.В. Косулин, Н.К. Петрова. – Казань: Казан. гос. энерг.
ун-т, 2003.
2. М.М. Волченко. Табличный процессор Microsoft Excel. Лаборат.
работа. / М.М. Волченко, Н.К. Петрова. – Казань: Казан. гос. энерг. ун-т,
2004.
3. А. Ю. Гарнаев. Самоучитель VBA. / А. Ю. Гарнаев. – СПб.: БХВ-
Петербург, 2003. – 512с.
4. Л.А. Демидова. Программирование в среде Visual Basic for
Applications: Практикум. / Л.А. Демидова, А.Н. Пылькин. – М.: Горячая
линия – Телеком, 2004.
5. П.П. Мельников. Практикум по экономической информатике:
Учебное пособие: в 3-х ч. / П.П. Мельников, И.В. Миронова,
И.Ю. Шполянская. – Часть III. – М.: Финансы и статистика; Перспектива,
2002. – 160с.
53

Содержание

Предисловие……………………………………………………………...……. 3
Общие теоретические сведения по программированию на VBA.................. 3
I. Структура программ на VBA. Процедуры и функции пользователя…. 4
II. Типы констант. Представление числовых констант в формате с
фиксированной и плавающей десятичной точкой………..................... 6
III. Объявление переменных на VBA……………………………………… 7
IV. Значения и типы переменных по умолчанию………………………… 9
V. Встроенные математические функции…………………………………. 10
VI. Приоритет (порядок выполнения) математических операций в
арифметических выражениях VBA………………………………...…. 12
VII. Адресация к ячейкам листа Excel на VBA. Простейшие средства
ввода-вывода…………………………………………………………. 12
VIII. Применение встроенных диалоговых окон VBA для ввода и
вывода данных в программе……………………………………….… 13
Примеры решения типовых задач и задачи для самостоятельного решения 15
I. Линейные алгоритмы……………………………………………...... 15
1.1. Примеры чтения программ с линейным алгоритмом…………….. 15
1.2. Задания для самостоятельного чтения линейных программ……... 17
1.3. Примеры разработки линейных программ для задач с неявным
алгоритмом………………………………………………………….. 19
1.4. Задания для программирования задач с неявно заданным
линейным алгоритмом……………………………………………... 21
1.5. Примеры программирования сложных арифметических
выражений…………………………………………………………... 22
1.6 Задания для самостоятельного программирования арифметических
выражений………………………………………………………. 22
II. Алгоритмическая структура «ветвление»…………………………… 24
2.1. Операции отношения и логические операции…………………...... 24
2.2. Условный оператор IF … THEN…………………………………… 25
2.3. Примеры чтения программ с алгоритмом «ветвление»…...…... 25
2.4. Задания для самостоятельного чтения программ со структурой
«ветвление»…………………………………………………………... 27
2.5. Задания для самостоятельного программирования неэлементарных
математических функций….……………………… 29
2.6. Примеры разработки программ с алгоритмом «ветвление» для
задач с неявным алгоритмом……………………………………….. 31
2.6. Задания для программирования задач с неявно заданным
54

алгоритмом «ветвление»………………….……………………..... 33
III. Алгоритм циклической структуры…….……………………………….. 34
3.1. Оператор арифметического цикла For…Next……….…..…………. 34
3.2. Примеры чтения программ с алгоритмом «арифметический цикл» 35
3.3. Задания для самостоятельного чтения программ с алгоритмом
«арифметический цикл»……………………………………………... 38
3.4. Примеры программирования задач с алгоритмом накопления
суммы и произведения, табулирования математических функций. 41
3.4. Задачи для самостоятельного программирования алгоритмов
накопления суммы и произведения, табулирования
математических функций……………………………………………. 43
3.5. Примеры задач с неявно заданным арифметическим циклом……... 45
3.6. Задания для самостоятельной разработки программ с неявно
заданным циклическим алгоритмом………………………………... 47
IV. Итерационные алгоритмы……………………………………………… 48
4.1. Оператор цикла с условием Do…Loop……………………………… 48
4.2. Задания для самостоятельного чтения программ с итерационным
циклом………………….…………………………………………….. 51
4.3. Задания для самостоятельной разработки программ с итерационным
циклом……………………..……………………………..…………… 52
Библиографический список…………………………………………………… 53
55

Учебное издание

Петрова Наталья Константиновна,


Волченко Маргарита Мироновна

ПРОГРАММИРОВАНИЕ НА VBA
В ПРИМЕРАХ И ЗАДАЧАХ
ЧАСТЬ I. БАЗОВЫЕ АЛГОРИТМИЧЕСКИЕ СТРУКТУРЫ

Практикум к лабораторным работам, практическим занятиям,


расчетному заданию и самостоятельной работе студентов
по дисциплинам
«Информатика», «Компьютерные технологии в науке и образовании», «Про-
граммные средства информатики»,
«Новые информационные технологии»

Кафедра информатики и информационно-управляющих систем КГЭУ

Редактор издательского отдела С.Н. Кашеваров


Компьютерная верстка Т.И. Лунченкова

Подписано в печать
Формат 60×84/16. Бумага «Business». Гарнитура «Times». Вид печати РОМ.
Усл. печ. л. Уч.-изд. л. Тираж экз. Заказ №

Издательство КГЭУ, 420066, Казань, Красносельская, 51


Типография КГЭУ, 420066, Казань, Красносельская, 51

Вам также может понравиться