
Лабораторная работа № 1. Работа с величинами
Теоретические сведения
Величина – отдельный информационный объект, который имеет имя, значение и тип.
Величины бывают постоянные и переменные.
Постоянная величина (константа) не изменяет своего значения в ходе выполнения алгоритма. Использование констант делает программы легче читаемыми и позволяет проще вносить изменения: отпадает необходимость многократно исправлять значения по тексту программы, т.к. достаточно ввести новое значение при определении константы.
Переменная величина (или просто переменная) может изменять значение в ходе выполнения алгоритма. Переменные задаются именами, которые определяют области памяти, в которых хранятся значения. Значениями переменных могут быть данные различных типов.
Тип данных относят к самым фундаментальным понятиям любого языка программирования. Тип данных определяет множество допустимых значений, которое может принимать величина, и множество действий, которые можно выполнить с этой величиной.
Основные типы данных VBA
Тип данных |
Диапазон значений |
Объем занимаемой памяти, байт |
Приставка к имени |
Суффикс |
Byte (байт) Integer (целое число) Long (длинное целое число) Single (число с плавающей точкой обычной точности)
Double (число с плавающей точкой двойной точности)
Boolean (логический) String (строка символов) Currency (денежный)
Date (дата) Object (объект) Variant (строковые или числовые подтипы) |
Целые числа от 0 до 255 Целые числа от –32768 до 32767 Целые числа двойной длины (от –2147483648 до 2147483647) От -3.402823E38 до -1.401298E-45 для отрицательных значений; От 1.401298E-45 до 3.402823E38 для положительных значений; От -1.79769313486232E308 до -4.94065645841247E-324 для отрицательных значений; От 4.94065645841247E-324 до 1.79769313486232E308 для положительных значений; Логическое значение True или False
От 0 до приблизительно 2 миллиардов
От –922337203685477,5808 до 922337203685477,5807 От 1 января 100 г. до 31 декабря 9999 г. Любой указатель объекта Любое числовое или строковое значение |
1 2 4
4
8
2 1 на каждый символ
8
8 4 16 |
byt int lng
sng
dbl
bln str
cur
dtm obj vnt |
– % &
!
#
– $
@
– – – |
Обозначения типов данных является ключевыми словами языка (и выделяется после набора в редакторе VBA).
Над различными типами данных допустимы различные операции. В VBA имеются три основных типа операций:
математические, выполняются над числами, их результатом являются числа;
операции отношения, могут применяться не только к числам, их результатом является значения логического типа;
логические, используются в логических выражениях и их результатом являются логические значения.
Операции VBA
Математические операции
[Операнд 1] + [Операнд 2] |
Сложение |
[Операнд 1] - [Операнд 2] |
Вычитание |
-[Операнд] |
Перемена знака |
[Операнд 1] * [Операнд 2] |
Умножение |
[Операнд 1] / [Операнд 2] |
Деление |
[Операнд 1] \ [Операнд 2] |
Целочисленное деление |
[Операнд 1 Mod [Операнд 2] |
Остаток от деления по модулю |
[Операнд 1] ^ [Операнд 2] |
Возведение в степень |
Операции отношения
[Операнд 1] < [Операнд 2] |
Меньше |
[Операнд 1] > [Операнд 2] |
Больше |
[Операнд 1] <= [Операнд 2] |
Меньше или равно |
[Операнд 1] >=[Операнд 2] |
Больше или равно |
[Операнд 1] <> [Операнд 2] |
Не равно |
[Операнд 1] = [Операнд 2] |
Равно |
[Операнд 1] Is [Операнд 2] |
Сравнение двух операндов, содержащих ссылки на объекты |
[Операнд 1] Like [Операнд 2] |
Сравнение двух строковых выражений |
Логические операции
[Операнд 1] And [Операнд 2] |
(И) логическое умножение |
[Операнд 1] Or [Операнд 2] |
(Или) логическое сложение |
[Операнд 1] Xor [Операнд 2] |
Исключающее Or (или) |
Not [Операнд] |
Логическое отрицание |
Другие операции
[Строка 1] & [Строка 2] |
Конкатенация (сложение) строк. Для сложения строк допустимо использование операции [Строка 1] + [Строка 2], но предпочтительнее, во избежание путаницы, применять операцию со знаком &. |
VBA выполняет операции в соответствии с их приоритетом, что обеспечивает однозначность в трактовании значений выражений.
Приоритеты операций
Приоритет |
Операция |
1 2 3 4 5 6 7 8 9 10 11 12 |
Вызов функции и скобки ^ - (смена знака) *, / \ Mod +, – >, <, >=, <=, <>, = Not And Or Xor |
В VBA пользователь определяет имена переменных, функций, процедур, постоянных и других объектов. Вводимые пользователем имена должны отражать суть обозначаемого объекта так, чтобы делать программу легко читаемой. В VBA имеются следующие ограничения на имена:
длина имени не должна превышать 255 символов;
имя не может содержать стандартные разделители (точку, запятую, двоеточие, дефисов, пробелов и т.п.) и следующих символов: %, &, !, @, #, $;
имя может содержать любую комбинацию не запрещенных символов, но начинаться должно с буквы;
имена должны быть уникальны внутри области, в которой они определены;
запрещено использовать имена, совпадающие с ключевыми словами VBA и именами встроенных функций и процедур.
Замечание. Хотя регистр букв (верхний или нижний) в имени не имеет значения, его умелое использование может существенно облегчить понимание содержательной стороны переменной. Вместо плоских и невыразительных имен предпочтительнее использовать имена, которые легче воспринимаются благодаря выделению некоторых входящих в них символов разумным использованием верхнего регистра. Например, представляется более удачным вместо имен “процентнаяставка”, “x-начзнач” использовать “ПроцентнаяСтавка”, “x-НачЗнач”.
Для того чтобы начать оперировать с любой величиной (постоянной или переменной) ее необходимо соответствующим образом описать. Важно, чтобы не только разработчик программы понимал, величины какого типа используются в программе, но и исполнитель программы (компьютер). Второе даже более важно, т.к. если компьютер не будет знать, величина какого типа используется в программе, он будет считать ее величиной универсального типа Variant и отведет для ее хранения в памяти 16 и более ячеек. Это будет приводить к неэффективному использованию памяти и замедлению работы программы.
Кроме того, описание переменных и констант делает программу надежнее, убыстряет ее работу, т.к. компилятору VBA не требуется тратить время на распознавание типа неописанной величины при каждом обращении к ней.
Блок описания переменных имеет следующий синтаксис:
Dim <Имя> [As <Тип>]
Здесь Dim и As – ключевые слова VBA;
<Имя> – имя переменной, удовлетворяющее стандартным правилам именования переменных;
<Тип> – тип данных переменной.
Назначение этого оператора – объявить переменную, т.е. задать ее имя и тип, однако объявление типа может отсутствовать. В этом случае по умолчанию переменная получает тип Variant.
Переменные, описанные с помощью слова Dim на уровне модуля, доступны для всех процедур в данном модуле. Переменные, описанные на уровне процедуры, доступны только в данной процедуре.
Примеры:
Dim N As Integer – инструкция описывает переменную N типа Integer.
Можно объявить сразу несколько переменных: Dim Строка As String, Число As Single – инструкция описывает переменную Строка типа String, переменную Число типа Single.
Dim K1, K2 As Integer – инструкция описывает переменную K2 типа Integer, переменную K1, тип которой не задан (по умолчанию будет приписан тип Variant).
Альтернативным способом описания пеыременных некоторых типов может быть использование суффиксов. Например, инструкция
Dim A%, Text$
служит для описания переменной A типа Integer и переменной Text типа String. Последующее использование этих переменных в тексте программы не требует использования суффикса.
Описание констант осуществляется следующим образом:
[Public | Private] Const <Имя> [As <Тип>] = <Выражение>
Public – ключевое слово, используемое на уровне модуля для описания констант, доступных всем процедурам во всех модулях; не допускается в процедурах;
Private – ключевое слово, используемое на уровне модуля для описания констант, доступных только внутри модуля, в котором выполняется описание; не допускается в процедурах;
As – ключевое слово VBA;
<Имя> – имя константы, удовлетворяющее стандартным правилам именования;
<Тип> – один из поддерживаемых типов данных. Для каждой описываемой константы следует использовать отдельное предложение As <Тип>.
<Выражение> – запись, определяющая последовательность действий над величинами; может содержать константы, переменные, знаки операций (за исключением Is), функции.
Примеры:
Const L As Integer = 12345 – инструкция описывает константу L типа Integer, значение которой равно 12345, доступную на уровне процедуры.
Private Const Строка As String = “Большая перемена” – инструкция описывает константу Строка типа String, доступную на уровне модуля, со значением “Большая перемена”.
Const K1 As Integer = 350, K2 As Integer = 750, K3 = 3678 \ 57 – инструкция описывает константы K1 и K2 типа Integer, константу K3, тип которой не задан (по умолчанию будет приписан тип Variant); все константы доступны на уровне процедуры.
Важнейшей операцией в алгоритмах, работающих с величинами, является присваивание. Переменная может получить или изменить свое значение в результате присваивания. Оператор присваивания всегда включает знак “=” и имеет следующий синтаксис:
[Let] <Имя> =<Выражение>
<Имя> – имя переменной, удовлетворяющее стандартным правилам именования;
<Выражение> – произвольное выражение любого типа;
Let –ключевое слово, которое не является обязательным и чаще всего опускается.
При выполнении оператора присваивания переменная, имя которой указано слева от знак равенства, получает значение, равное значению выражения, которое находится справа от знака равенства.
Примеры:
Рассмотрим последовательно выполняемые команды присваивания, в которых участвуют несколько переменных. В таблице напротив каждой команды укажем значения переменных, которые установятся после ее выполнения. Такая таблица называется трассировочной таблицей, а процесс ее заполнения называется трассировкой алгоритма.
1) |
Команда |
А |
В |
|
A=1 |
1 |
- |
|
B=2*A |
1 |
2 |
|
A=B |
2 |
2 |
|
B=A+B |
2 |
4 |
Прочерк в таблице означает неопределенное значение переменной. Конечные значение, которые получают переменные A и B, соответственно равны 2 и 4.
Этот пример иллюстрирует три основных свойства присваивания.
пока переменной не присвоено значение, она остается неопределенной;
значение, присвоенное переменной, сохраняется в ней вплоть до выполнения следующего присваивания этой переменной нового значения;
новое значение, присвоенное переменой, заменяет ее предыдущее значение.
2) |
Команда |
А |
B |
C |
|
A= 5>3 |
True |
- |
- |
|
B= 2*2=5 |
True |
False |
- |
|
C=A And B |
True |
False |
False |
Задачи для самостоятельного решения
Каждый студент должен выполнить все задания блока А и упражнения своего варианта из блока Б.
А
Вычислите значения логических выражений:
X*X + Y*Y = 9 при X = 1, Y = -2;
B*B + 4*A*C < 0 при A = 2, B = 1, C = -2;
(a >= 1) And (a <= 2) при a = 1,5;
(a mod 7 = 1) And (a \ 7 = 1) при a = 8;
(a < 1) Or (a > 1.2) при a = 1,5;
Not ((A > B) And (A < 9) Or (A*A = 4)) при A = 5, B = 4.
Запишите в обычной математической форме арифметические выражения:
a) a / b ^ 2
b) a + b / c + 1
c) 1 / a * b / c
d) a^ b ^ c / 2
e) (a ^ b) ^ c / 2
f) a / b / c / d * p * q
g) x ^ y ^ z / a / b
h) 4 / 3 * 3.14* r ^ 3
i) d * c / 2 / R + a ^ 3
Запишите логические выражения, истинные только при выполнении указанных условий:
a) x принадлежит отрезку [a;b] |
b) x не принадлежит отрезку [a;b] |
c) x принадлежит промежутку [a;b ) или (c;d] |
d) x лежит вне отрезков [a;b] и [c;d] |
e) целое k является нечетным числом |
f) целое n является трехзначным числом, кратным пяти |
g) из чисел a, b, c меньшим является c, а большим b |
h) среди чисел a, b, c, d есть взаимно противоположные |
Б
Вариант 1.
Укажите допустимые имена:
Переменная
G1G2H3
Dim
D&G
2_значное
Нов.значение
qaz wer
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim a As String, b As String, c As String a = “У нас ” b = “3” с = a & b & “пары”
Dim Q1 As Integer, Q2 As Integer Const Q As Integer = 15 Q1 = 1 Q2 = 2 Q1 = Q + Q2 Q2 = Q1 *Q2
Dim a As Byte, b As Byte, c As Byte a = 3 b = 100 b = b + a с = a * b
Вариант 2.
Укажите допустимые имена:
BOX_56
byte
Ура!
Максимум
44ВеселыхЧижа
Первая программа
try-три
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim L1 As Boolean, L2 As Boolean, L3 As Boolean L1 = 3*3 = 6 L2 = 8 < 12 L3 = L1 Or L2 L1 = L2 / L3
Dim a As Integer, b As Long Const c As Integer = 1000 a = 100000 b = a * c a = a mod c b = b / 200
Dim a As String, b As String, c As String a = “Что-то ” b = “стало” b = “с памятью моей” & b с = a & b
Вариант 3.
Укажите допустимые имена:
Проба пера
Лаб_раб_5
doll$
Boolean
33коровы
Скорость
S1_S2
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim a As String, b As String, c As String a = “Мело” b = “по всей земле,” a = a & “, ” & a с = a & b & “во все пределы”
Dim T As Integer, R As Integer Const K As Integer = 12 T = 4 R = 2 T = T * K R = T / R
Dim a As Byte, b As Byte, c As Byte a = 237 b = 12 a = a + b с = a * b
Вариант 4.
Укажите допустимые имена:
First_Program
const
mail@ru
Наибольшее
9_step
Подоходный налог
ПРИМЕР7_3
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim a As Integer, b As Long Const c As Integer = 5000 a = 255000 b = a / c a = a \ c b = b * a
Dim a As String, b As String, c As String a = “Breakfast” b = “Supper” c = “ in the ” a = a & c & “morning,” b = b & c & “evening” с = a & b
Dim Logic1 As Boolean, Logic2 As Boolean, Logic3 As Boolean Logic1 = 356 > 123 Logic2 = 17 < 678 Logic3 = Logic1 And Logic2 Logic1 = Logic2 * Logic3
Вариант 5.
Укажите допустимые имена:
Single
C.-Петербург
Построение_графика
Милениум
28попугаев
max_min
ставка%
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim S1 As String, S2 As String, S3 As String S1 = “Я на солнышк” S2 = S1 & “е лежу,” S3 = S1 & “о гляжу” S1 = S2 & S3
Dim a As Integer, b As Integer Const c As Byte = 50 a = 7 b = a * c a = a + c b = b / a
Dim V1 As Boolean, V2 As Boolean, V3 As Boolean V1 = 4+4 = 8 V2 = 25 > 13 V3 = V1 Or Not (V2)
Вариант 6.
Укажите допустимые имена:
Простая программа
13-е_пятница
победа!
Поиск_значения
face567
Ст.знач.
DOUBLE
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim X As Integer, Y As Integer Const Z As Integer = 12 X = 5 Y = 2 X = X * Z Y = X - Y
Dim a As String, b As String, c As String a = “Петушок” b = “ золотой гребешок” a = a & “-” & a с = a & b
Dim m As Byte, b As Byte, c As Byte m = 177 b = 100 m = m + 23 с = m * b
Вариант 7.
Укажите допустимые имена:
программа_12
1сентября
String
New#
FRODO
Условный оператор
PEACE_1_МИР
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim k As Integer, m As Integer Const n As Integer = 557 k = 1 m = 7 k = k + n m = n - m k = k - m
Dim S1 As String, S2 As String, S3 As String S1 = “Little mouse,” S2 = “ where is your” S3 = S1 & S1 S1 = S3 & S2 & “house?”
Dim m As Byte, b As Byte, f As Byte m = 222 b = 78 m = m + b f = m * b
Вариант 8.
Укажите допустимые имена:
FALSE
Задание_34
Я&Я
from1to2
317_аудитория
My program
Продажа-покупка
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim U1 As Boolean, U2 As Boolean, U3 As Boolean U1 = 7*7 = 47 U2 = 356 > 212 U3 = Not (U1) Or U2
Dim a As String, b As String, c As String a = “Муха ” b = “добрая была,” с = “дом себе нашла” a = a & b & a & c
Dim h As Byte, g As Byte, c As Byte h = 10 g = 5 h =h + g с = h * g g = c - h
Вариант 9.
Укажите допустимые имена:
AMD750Процессор
День_рождения
Prog15
lok#21
Currency
Нов.значение
Константа
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim S1 As String, S2 As String, S3 As String S1 = “In that ” S2 = “ there is a ,” S3 = S1 & “town” & S2 & “street,” S1 = S1 & “street”& S2 “yard” S3 = S3 & S1
Dim a As Integer, b As Integer Const c As Integer = 65 a = 17 b = c - a a = a + c b = b / a
Dim TR1 As Boolean, TR2 As Boolean, TR3 As Boolean TR1 = 98 > 97 TR2 = 36 > 13 TR1 = TR1 And TR2 TR3 = TR1 Or Not (TR2)
Вариант 10.
Укажите допустимые имена:
Date
Proba@678
Линейный_алгоритм
5-symbol
Bold_Italy
Example 3
МониторSamsung
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim S1 As String, S2 As String, S3 As String Const S = “В Африке…” S1 = S & “акулы, ” S2 = S & “гориллы, ” S3 = S & “большие злые крокодилы!” S1 = S1 & S1 & S3
Dim a As Integer, b As Integer Const c As Byte =24 a = 8 b = c - a a = a + c b = b + a
Dim B1 As Boolean, B2 As Boolean, B3 As Boolean B1 = 5*5 = 25 B2 = 35 > = 35 B3 = B1 And B2 B3 = B1 / B3
Вариант 11.
Укажите допустимые имена:
Пробный_вариант
LONG
Др.переменная
Наша_взяла!
2-хКамерный
stepen4
VID69ДИВ
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim J As Integer, K As Integer , L As Byte J = 20 K = 30 J = J*2 K = K + J L = J + K
Dim a As Boolean, b As Boolean, c As Boolean a = 6*6 = 25 b = (a+25) > = 35 c = a Or b
Dim S1 As String, S2 As String, S3 As String Const S = “А за ним” S1 = S & “и кот задом наперед,” S2 = S & “ комарики ” S3 = S2 & “на воздушном шарике” S1 = S1 & S3
Вариант 12.
Укажите допустимые имена:
Object
Стар.знач.
СтароеЗначение
Adis#55
Program_1_Вычисление
5-тиЗначноеЧисло
Дробная_часть
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim Log1 As Boolean, Log2 As Boolean, Log3 As Boolean Log1 = 2345 <5432 Log2 = Log1 Or (4*5 = 30) Log3 = Log1 And Log2
Dim S1 As String, S2 As String, S3 As String Const S As String= “глазка”, SS As String= “Были у нее дочери:” S1 = “Одно” & S & “, ” S2 = “Дву” & S & “, ” S3 = “Три” & S & “.” S1 = SS & S1 & S2 & S3
Dim J As Integer, K As Integer , L As Integer J = 15 K = 25 J = J + 8 K = K - J L = K / J
Вариант 13.
Укажите допустимые имена:
EXAMPLE$37
Мышь1Genius
Преобразование_формата
Variant
Тип.значение
OldVar
40-сороков
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim a As Byte, b As Byte , c As Byte a = 200 b = 5 c = a + b b = b +25 a = b * c
Dim Log1 As Boolean, Log2 As Boolean, Log3 As Boolean Log1 = 32 <= 32 Log2 = Log1 Or (4*5 = 30) Log3 = 25 = 25 Log1 = Log2 * Log3
Dim S1 As String, S2 As String, S3 As String Const S As String= “ конц” S1 = “В доме том в” & S & “е ” S2 = S & “ов ” S3 = S1 & S2 & “стало множество жильцов.”
Вариант 14.
Укажите допустимые имена:
Депозит%3
MY_BIRTHDAY
TRUE
Строковое выражение
Процедура_3_procedure
3-хЛистник
Проверка_значений
2. Определите значение переменных по фрагменту программы с помощью трассировки:
Dim a As Integer, b As Integer , c As Long a = 200000 b = 50000 a = a + a b = b +50000 c = b * a
Dim Log1 As Boolean, Log2 As Boolean, Log3 As Boolean Log1 = 567 <= 12 Log2 = Log1 Or (4*4 = 16) Log3 = 3 < 57 Log1 = Log2 Or Log3
Dim Str1 As String, Str2 As String, Str3 As String Const Str As String= “ где-то ” Str1 = “Если” & Str & “нет кого-то,” Str2 = “Значит кто-то” & Str & “есть.” Str3 = Str1 & Str2
Лабораторная работа № 2. Организация ввода-вывода. Структура программы
Теоретические сведения
Редактор VBA
Будем осуществлять написание собственного кода на языке VBA в среде редактора Visual Basic Excel.
Для входа в среду VBA Excel можно воспользоваться одним из следующих способов:
выполнить команду Tool (Сервис) / Macro (Макрос) / Visual Basic Editor (Редактор Visual Basic);
воспользоваться комбинацией клавиш <Alt>+<F11>;
нажать кнопку Visual Basic Editor (Редактор Visual Basic)
панели инструментов Visual Basic.
Возвратиться из редактора
VBA в рабочую книгу Excel можно с помощью
команды Viev (Вид) /
Microsoft Excel (Microsoft Excel),
комбинации клавиш <Alt>+<F11> или
нажатием соответствующей кнопки
панели
инструментов Стандарт.
Структурным элементом программы, написанной на языке VBA, является модуль – совокупность объявлений и процедур, объединенных в единое целое. По своему предназначению модули делятся на два типа: стандартные модули и модули объектов. К стандартным модулям относятся те, которые содержат макросы. К модулям объектов относятся модули, связанные с рабочей книгой, рабочими листами, формами и модули класса. Мы будем использовать только стандартные модули.
Чтобы осуществить вставку модуля необходимо находясь в среде VBA выполнить команду Insert (Вcтавить) / Module (Модуль).
Окно редактирования кода служит в качестве редактора для ввода и изменения кода внутри модуля. Каждый модуль состоит из области описания и одной или нескольких процедур. Процедура представляет собой последовательность операторов, которые часто называют программными кодами. Входящие в модуль процедуры объединены общей областью описания. В ней описываются данные и объекты, которые являются общепринятыми для процедур модуля. Иерархия указанных объектов такова:
модуль;
область описания;
процедура;
код;
оператор.
При создании и редактировании кода удобно пользоваться командой Insert (Вcтавить) / Procedure (Процедуру). В появившемся окне необходимо выбрать функцию или подпрограмму и задать ее имя. После этого будут автоматически сформированы операторы начала и конца процедуры и можно переходить непосредственно к набору операторов процедуры. Для набора следующей процедуры в том же модуле необходимо повторить команду Insert (Вcтавить) / Procedure (Процедуру). Если нужно создать новый модуль повторяется команда Insert (Вcтавить) / Module (Модуль).
Проверка правописания
осуществляется на этапе компиляции
командой Debug (Отладка)
/ Compile VBAProject (компилировать).
Для запуска программы требуется выполнить
команду Run (Запуск)
/ Run Sub/UserForm (Запуск подпрограммы/UserForm) или
нажать клавишу <F5> или
соответствующую кнопку
панели
инструментов.
В появившемся окне следует выбрать имя нужной программы и щелкнуть по кнопке Run (Выполнить).
Для того чтобы сохранить или открыть созданную ранее программу используют стандартные средства Excel, например, соответствующие пункты меню Файл: Сохранить как… , Открыть.
Запуск или редактирование существующего программного кода после запуска Excel может быть осуществлен после последовательного выполнения команд: Tool (Сервис) / Macro (Макрос) / Макросы. В появившемся диалоговом окне следует указать имя процедуры и нажать кнопку, отвечающую за выполнение требуемого действия (выполнить или изменить).
Структура программного кода
На данном этапе мы будем создавать программы в рамках следующей синтаксической конструкции:
[Option Explicit]
[Private | Public] [Static] Sub <Имя> ([<Список аргументов>])
[Dim <Имя> [As <Тип>]]
[Const <Имя> [As <Тип>] = <Выражение>]
[Инструкции]
[Exit Sub]
[Инструкции]
End Sub
В этой записи:
Option Explicit – инструкция, предписывающая явное описание всех переменных, встречающихся в программе;
Public – ключевое слово, которое указывает, что процедура доступна для всех других процедур во всех модулях;
Private – ключевое слово, указывающее, что процедура доступна для других процедур только того модуля, в котором она описана;
Static – ключевое слово, указывающее, что локальные переменные процедуры сохраняются в промежутках времени между вызовами этой процедуры;
<Имя> – имя процедуры, удовлетворяющее стандартным правилам именования;
<Список аргументов> – список переменных, представляющий аргументы, которые передаются в процедуру при ее вызове. Имена переменных разделяются запятой.
Dim <Имя> [As <Тип>] –блок описания переменных;
Const <Имя> [As <Тип>] = <Выражение> –блок описания констант;
Инструкции – любой набор любых команд VBA;
Exit Sub – инструкция, выполнение которой приводит к немедленному выходу из процедуры;
Sub, End Sub –служебные слова VBA.
Замечание. Использование инструкции Option Explicit является простейшим средством предотвращения случайных ошибок. В частности, она позволяет избежать следующей трудно отслеживаемой ошибки. Предположим, что в программе используется переменная с именем “Ссуда”, а при наборе имени этой переменной где-то в программе вместо русской буквы “с” по ошибке набрана латинская буква “с”. Визуально эти имена ничем не отличаются друг от друга, но воспринимаются компилятором VBA как имена разных переменных. Если используется инструкция Option Explicit, а значит, имеет место явное описание переменной “Ссуда”, то компилятор укажет на переменную “Ссуда” с латинской буквой “с”, как на не описанную и ошибка будет найдена.
Встроенные диалоговые окна
В программном коде на VBA ввод и вывод организуется с помощью встроенных диалоговых окон: окон ввода и окон сообщений. Окно сообщений (процедура MsgBox) выводит простейшие сообщения для пользователя, а окно ввода (Функция InputBox) обеспечивает ввод информации.
Функция InputBox выводит на экран диалоговое окно, содержащее сообщение и поле ввода, устанавливает режим ожидания ввода текста пользователем или нажатия кнопки. Затем возвращает значение типа String, содержащее текст, введенный в поле. Синтаксис:
InputBox (promt, [, title] [, default] [, xpos] [, ypos] [, helpfile, context])
Аргументы:
prompt – строковое выражение, отображаемое как сообщение в диалоговом окне.
title – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку помещается имя приложения.
default – строковое выражение, отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода изображается пустым.
xpos – числовое выражение, задающее расстояние по горизонтали между левой границей диалогового окна и левым краем экрана. Если этот аргумент опущен, диалоговое окно выравнивается по центру экрана по горизонтали.
ypos – числовое выражение, задающее расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана. Если этот аргумент опущен, диалоговое окно помещается по вертикали примерно на одну треть высоты экрана.
helpfile – строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо также наличие аргумента context.
context – числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо также наличие аргумента helpfile.
Процедура MsgBox выводит на экран диалоговое окно, содержащее сообщение, устанавливает режим ожидания нажатия кнопки пользователем. Затем возвращает значение типа Integer, указывающее, какая кнопка была нажата.
Значение |
Нажатая кнопка |
1 |
OK |
2 |
Отмена |
3 |
Стоп |
4 |
Повтор |
5 |
Пропустить |
6 |
Да |
7 |
Нет |
Синтаксис:
MsgBox (prompt, [, button][, title] [, helpfile, context])
Аргументы:
prompt – строковое выражение, отображаемое как сообщение в диалоговом окне.
button – числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку. Значение этого аргумента по умолчанию равняется 0.
Значения аргумента, определяющие отображаемые кнопки:
Константа |
Значение |
Отображаемые кнопки |
VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel |
0 1 2 3 4 5 |
OK OK, Отмена Стоп, Повтор, Пропустить Да, Нет, Отмена Да, Нет Повтор, Отмена |
Значения аргумента, определяющие отображаемые значки
Константа |
Значение |
Значок сообщения |
VbCritical VbQuestion
VbExclamation
VbInformation |
16 32
48
64 |
|
Значения аргумента, определяющие основную кнопку окна
Константа |
Значение |
Номер основной кнопки |
VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 |
0 256 512 768 |
1 2 3 4 |
title – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку помещается имя приложения.
helpfile – строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо также наличие аргумента context.
context – числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо также наличие аргумента helpfile.
Демонстрационные примеры
Приведем пример использования встроенных диалоговых окон.
Sub Тест()
Dim msg As String, style As Integer, title As String, x
Dim default
msg = “Мои первые шаги в VB!”
title = “Cообщение с одной кнопкой”
MsgBox msg, , title
title = “Cообщение с двумя кнопками”
style = vbYesNo
MsgBox msg, style, title
title = “Cообщение с двумя кнопками и значком”
style = vbYesNo + vbCritical
MsgBox msg, style, title
msg = “Введите число, кратное 16, не больше 64!”
title = ”Формируем окно для ввода информации ”
default = 16
x = InputBox (msg, title, default)
msg = “ Мои первые шаги в VB!”
title = “ Мое сообщение”
style = vbYesNo + x
MsgBox msg, style, title
End Sub
В результате выполнения приведенной ниже программы на экране последовательно будут появляться окна. В таблице отражены окна, соответствующие определенным участкам кода. Отметим, что значок, который будет изображен в последнем окне, определяется значением переменной x, вводимым с клавиатуры при появлении окна “Формируем окно для ввода информации”. В нашем случае было введено значение, равное 48.
msg = “Мои первые шаги в VB!” title = “Cообщение с одной кнопкой” MsgBox msg, , title |
|
title = “Cообщение с двумя кнопками” style = vbYesNo MsgBox msg, style, title |
|
title = “Cообщение с двумя кнопками и значком” style = vbYesNo + vbCritical MsgBox msg, style, title |
|
msg = “Введите число, кратное 16, не больше 64!” title = ”Формируем окно для ввода информации ” default = 16 x = InputBox (msg, title, default) |
|
msg = "Мои первые шаги в VB!" title = "Мое сообщение" style = vbYesNo + x MsgBox msg, style, title |
|
Приведенная программа может быть переписана следующим образом:
Sub Тест1()
Dim x as Byte
MsgBox “Мои первые шаги в VB!”, , “Cообщение с одной кнопкой”
MsgBox “Мои первые шаги в VB!”, vbYesNo, “Cообщение с двумя кнопками”
MsgBox “Мои первые шаги в VB!”, vbYesNo + vbCritical, “Cообщение с двумя кнопками и значком”
x = InputBox (“Введите число, кратное 16, не больше 64!”, ”Формируем окно для ввода информации ”, 16)
MsgBox “ Мои первые шаги в VB!”, vbYesNo + x, “ Мое сообщение”
End Sub
Задачи для самостоятельного решения
1. Организуйте ввод с клавиатуры двух чисел. Окна ввода должны иметь различные заголовки, появляться в разных частях экрана, содержать разные сообщения и неравные значения в поле ввода по умолчанию.
Требуется найти сумму, произведение, частное и остаток от деления первого числа на второе. Результаты операций вывести на экран. Все окна сообщений должны иметь различное количество кнопок и разные значки.
2. Напишите программу, осуществляющую простейший диалог с пользователем. Вначале появляется окно ввода, значением по умолчанию в котором является строка, содержащая ваше имя. После обработки полученных данных, на экране должно появиться окно сообщения с текстом приветствия, содержащего обращение по имени, введенному ранее.
Лабораторная работа № 3. Реализация линейных алгоритмов
Теоретические сведения
Программы с линейной структурой составляются из операторов присваивания, ввода, вывода, обращения к процедурам.
Ранее был рассмотрен синтаксис оператора присваивания, организация ввода и вывода, основные операции VBA и приоритет операций, описана структура программного кода. Для организации математических вычислений потребуется знание встроенных математических функций VBA.
Математические функции
В VBA имеется большой набор встроенных математических функций, использование которых существенно упрощает программирование.
Функция |
Возвращаемое значение |
Abs (<число>) |
Модуль (абсолютная величина) числа |
Atn (<число>) |
Арктангенс |
Cos (<число>) |
Косинус |
Exp (<число>) |
Экспонента, т. е. результат возведения основания натурального логарифма в указанную степень |
Log(<число>) |
Натуральный логарифм |
Rnd (<число>) |
Случайное число из интервала [0,1). Если число меньше нуля, то Rnd возвращает каждый раз одно и то же число, используя аргумент в качестве опорного числа. Если число больше нуля или аргумент опущен, то — следующее случайное число в последовательности; если число равняется нулю то — случайное число, возвращенное при предыдущем вызове этой функции. Перед вызовом функции Rnd используйте инструкцию Randomize без аргумента |
Sgn (<число>) |
Знак числа |
Sin (<число>) |
Синус |
Sqr (<число>) |
Квадратный корень из числа |
Tan (<число>) |
Тангенс |
Fix (<число>) Int (<число>) |
Обе функции, Int и Fix, отбрасывают дробную часть числа и возвращают целое значение. Различие между функциями int и Fix состоит в том, что для отрицательного значения аргумента функция Int возвращает ближайшее отрицательное целое число, меньшее либо рaвное указанному, a Fix — ближайшее отрицательное целое число, большее либо равное указанному |
Перенос строки
Расположение символов <Пробел> + <Знак подчеркивания> в конце обеспечивает то, что последующая строка является продолжением предыдущей. При этом надо помнить, что:
нельзя разбивать переносом строковые константы;
допустимо не более семи продолжений одной и той же строки;
сама строка не может состоять более, чем из 1024 символов.
В следующем примере первая из конструкций является разбиением второй на две строки:
у = Sin(Pi()*x) + (1 + x)^(l/2)/ _
(1 + х^2)
у = Sin(Pi()*x) + (1 + x)^(l/2)/(1 + х^2)
Комментарии
Работая с программой, удобно использовать комментарии, т. е. фрагменты текста программы, не являющиеся программными кодами и игнорируемые компилятором. Комментарии выполняют две важные функции:
делают программу легко читаемой, поясняя смысл программных кодов и алгоритма;
временно отключают фрагменты программы при ее отладке.
В языке VBA существуют два способа ввода комментариев:
Применение апострофа (‘). Его можно ставить в любом месте строки. При этом все символы, начиная от апострофа до конца строки, будут восприниматься компилятором как комментарий.
Применение зарезервированного слова Rem вместо апострофа.
Ниже приведен пример использования комментариев в тексте программы:
Dim a As Integer
‘
‘а — целая переменная
‘
Dim b As String
‘b – строковая переменная
Расположение нескольких операторов на одной строке
Использование знака двоеточия позволяет разместить несколько операторов на одной строке. Таким образом, следующие две конструкции эквивалентны:
x = x+1 y = x+2 |
x = x+1 : y = x+2 |
Функции преобразования форматов
При обработке выражений, введенных с помощью функции InputBox, и последующем выводе результата на экран, иногда приходится прибегать к функциям преобразования форматов (типов).
Преобразование строки в число и обратно осуществляются следующими функциями.
Val(<строка>) |
Возвращает число, содержащееся в строке, как значение числового типа |
Str(<число>) |
Возвращает значение типа Variant (String), являющееся строковым представлением числа |
Замечание. В качестве допустимого десятичного разделителя функция Str воспринимает точку.
Часто возникает потребность в выводе нескольких результатов в одном окне сообщений. Помимо операции конкатенации (сложения строк &) используют функцию Chr.
Chr(<число>) |
Возвращает строку, ASCII-код которой равен аргументу. Например, Chr (13) – возвращает символ “возврат каретки”, т.е. осуществляет переход на новую строку. |
Например, такая следующая строка кода:
MsgBox "Первая строка" & Chr(13) & "Вторая строка" & Chr(13) & "Третья строка", , _
"Многострочное сообщение"
приводит к выводу следующего окна сообщения:
Демонстрационные примеры:
1. Рассмотрим очень полезный алгоритм, с которым при программировании часто приходится встречаться. Даны две переменные X и Y. Требуется произвести между ними обмен значениями. Например, если первоначально было X=1, Y=2, то после обмена должно стать: X=2, Y=1.
Попытка обойтись без дополнительной переменной, написав
X = Y
Y = X
не приводит к цели (безвозвратно утрачивается начальное значение переменной X).
Хорошим аналогом для решения такой задачи является следующая: даны два стакана, в первом – молоко, во втором – вода; требуется произвести обмен их содержимым. Ясно, что в этом случае нужен дополнительный третий пустой стакан. Последовательность действий будет следующей:
перелить из первого в третий;
перелить из второго в первый;
перелить из третьего во второй.
По аналогии для обмена значениями двух переменных нужна дополнительная третья переменная. Назовем ее Z. Тогда задача решается последовательным выполнением трех операторов присваивания.
Z = X
X = Y
Y = Z
Построим трассировочную таблицу при следующих начальных значениях переменных: X=1, Y=2.
Команда |
X |
Y |
Z |
Z = X |
1 |
2 |
1 |
X = Y |
2 |
2 |
1 |
Y = Z |
2 |
1 |
1 |
Действительно, в итоге значения переменных X и Y поменялись местами.
Аналогия со стаканами не совсем верна в том смысле, что при переливании из одного стакана в другой первый становится пустым. В результате же присваивания (X =Y) переменная, стоящая справа (Y) сохраняет свое значение.
Программа на VBA для решения этой задачи может быть записана следующим образом:
Option Explicit
Sub Обмен_двух()
Dim X As Integer, Y As Integer, Z As Integer
'Осуществим ввод значений;
' функция Val используется для преобразования строки в число
X = Val(InputBox("Введите первое число", "Ввод числа"))
Y = Val(InputBox("Введите второе число", "Ввод числа"))
'Осуществим обмен значений переменных
Z = X
X = Y
Y = Z
'Выведем результат в окне сообщений;
'функция Str применяется для преобразования строки в число
'функция Chr (в данном случае) - для организации перевода строки
MsgBox "Первое число " & Str(X) & Chr(13) & "Второе число " & Str(Y), , "Вывод результата"
End Sub
2. Решим предыдущую задачу, не используя дополнительных переменных.
Приведем последовательность команд присваивания, приводящих к требуемому результату (начальные значения X и Y обозначим X0, Y0).
X = X + Y ‘X = X0 + Y0, Y = Y0
Y = X – Y ‘X = X0 + Y0, Y = X0
X = X – Y ‘X = Y0, Y = X0
Соотвествующую программу на VBA попытаетесь написать самостоятельно.
3. Составим алгоритм решения такой задачи: даны две простые дроби; получить дробь, являющуюся результатом их деления.
В школьном учебнике математики правило деления обыкновенных дробей описано следующим образом:
числитель первой дроби умножить на знаменатель второй;
знаменатель первой дроби умножить на числитель второй;
записать дробь, числителем которой является результат выполнения пункта (1), а знаменателем – результат выполнения пункта (2).
В алгебраической форме это выглядит следующим образом:
Теперь построим алгоритм деления дробей для компьютера. В этом алгоритме сохраним те же обозначения для переменных, которые использованы в записанной формуле. Исходными данными являются целочисленные переменные a, b, c, d. Результатом – так же целые величины m и n.
Представим алгоритм вначале в виде блок-схемы. В блок-схемах приняты такие обозначения:
|
Начало или конец алгоритма |
|
Простая команда |
|
Ввод и вывод данных |
|
Проверка условия |
|
Начало цикла |
|
Обращение к вспомогательному алгоритму |
|
Option Explicit Sub Деление_дробей () Dim a As Integer, b As Integer, c As Integer, d As Integer Dim m As Integer, n As Integer a = Val(InputBox("Введите числитель", "Первая дробь")) b = Val(InputBox("Введите знаменатель", "Первая дробь")) c = Val(InputBox("Введите числитель", "Вторая дробь")) d = Val(InputBox("Введите знаменатель", "Вторая дробь")) m = a*d n = b*c MsgBox "Числитель: " & Str(m) & Chr(13) & "Знаменатель: " & Str(n), , "Результат деления" End Sub |
4. Составим программу, в результате выполнения которой будет выведено значение TRUE, если точка с заданными координатами (x,y) лежит внутри заштрихованной области и FALSE в противном случае.
Рассматриваемая область состоит из двух частей, каждая из которых описывается системой неравенств.
1-я часть: х 0; х2 + у2 9; у -х - 3.
2-я часть: х 0; х2 + у2 25.
Точка с координатами (х, у) лежит в заштрихованной области, если она принадлежит 1-й или 2-й части. Программа осуществляет ввод координат точки, вычисление значения логического выражения, которое определяет принадлежность точки области и выводит полученную логическую величину на экран.
Option Explicit
Sub Принадлежность_точки ()
Dim x As Single, x As Single, L As Boolean
x = Val(InputBox("Введите абсциссу", "Ввод координат"))
y = Val(InputBox("Введите ординату", " Ввод координат"))
L = (x <=0) And (x*x+ y*y<=9) And (y >= -x-3) Or (x >=0) And (x*x+ y*y<=25)
MsgBox "Лежит ли точка в заданной области?" & L, , "Результат"
End Sub
Лабораторная работа № 1 Линейные алгоритмы
Время выполнения
4 часа
Цель работы
Научиться использовать язык программирования Visual Basic for Applications (VBA) для разработки модулей в Excel на основе линейных алгоритмов.
Задачи лабораторной работы
После выполнения данной работы студент должен знать и уметь:
знать все операторы, используемые в программах;
уметь применять любые из изученных операторов для написания своих модулей;
уметь объяснить написанную программу.
Перечень обеспечивающих средств
Для обеспечения выполнения работы необходимо иметь компьютер со следующим математическим обеспечением: операционная система Windows XP, электронные таблицы Excel с приложением в виде языка Visual Basic for Applications.
Общие теоретические сведения
VBA – это язык объектно-ориентированного программирования.
Основными парадигмами являются объект, свойство, метод, событие, класс и семейство объектов.
Объект – это инкапсуляция данных вместе с кодом, предназначенным для их обработки.
Семейство – объект, содержащий несколько других объектов того же типа:
Worksheets (“Лист 1”) – рабочий лист с имени Лист1,
Worksheets (1) – первый лист рабочей книги.
Классы – это проект, на основе которого будет создан объект, т.е. класс определяет имя объекта, его свойства и действия, над ним выполняемые. А каждый объект, свою очередь, является экземпляром класса.
Методы – это действия, выполняемые над объектом.
Объект.метод – синтаксис метода
Пример.
Application.Quit – закрыть объект Application.
Worksheets (“Лист1”).Chartobjects.Delete – удалит все диаграммы с листа “Лист1”.
Свойства – это атрибут объекта, определяющий его характеристики: размер, цвет, положение на экране или состояние (доступность, видимость).
Для изменения характеристик меняют его свойства:
Объект.Свойство=Значение свойства
Пример.
Worksheets.Visible = False
Есть свойства, возвращающие объект:
ActiveCell возвращает активную ячейку активного листа активной рабочей книги.
ActiveWindow – активное окно.
Свойства ActiveCell, ActiveWindow. ActiveCell и Application. ActiveWindow. ActiveCell возвращают одну и ту же активную ячейку.
События – это действия, распознаваемые объектом.
Суть программирования на VBA и заключается в том, чтобы на событие получить отклик.
Пример 1. Написать программу, которая вычисляет периметр треугольника.
Запись программы в виде блок-схемы (рис. 1) и визуальное представление формы для ввода данных (рис. 2) и результата (рис. 3):
Рисунок 1. Блок-схема решения задачи
Рисунок 2. Ввод исходных данных в процессе выполнения программы
Рисунок 3. Вывод результата в процессе выполнения программы
Программный код
Option Explicit
Sub ПериметрТреугольника()
Dim ВтораяСторона, ТретьяСторона, Периметр As Single
ВтораяСторона = 3.5
ТретьяСторона = InputBox("Введите значение третьей стороны треугольника", "Третья сторона")
Периметр = Cells(1, 4) + ВтораяСторона + ТретьяСторона
MsgBox "Периметр треугольника = " & Периметр
End Sub
Пример 2. Вычислите значение квадратного корня из суммы трех переменных.
Запись программы в виде блок-схемы (рис. 4) и визуальное представление формы для ввода данных (рис. 5) и результата (рис. 6):
Рисунок 4. Блок-схема решения задачи
а)
б)
в)
Рисунок 5. Ввод исходных данных в процессе выполнения программы
Рисунок 6. Вывод результата в процессе выполнения программы
Программный код
Option Explicit
Sub КореньКвадратныйИзСуммыТрехПеременных()
Dim ПерваяПеременная, ВтораяПеременная, ТретьяПеременная, Сумма As Single
Dim Корень As Double
ПерваяПеременная = InputBox("Введите значение первой переменной", "Первая Переменная")
ВтораяПеременная = InputBox("Введите значение второй переменной", "Вторая Переменная")
ТретьяПеременная = InputBox("Введите значение третьей переменной", "Третья Переменная")
Сумма = ТретьяПеременная + ВтораяПеременная + ПерваяПеременная
Корень = Sqr(Сумма)
MsgBox "Корень из суммы трех переменных = " & Корень
End Sub
Пример 3. Вычислить Y, задав значения переменным:
Программный код
Sub Main()
Dim x, b, a, res As Single
x = -3
b = 2
a = 0,5
res = (Sqr(5 * x ^ 4 + 2 * Sin(b) ^ 2)) / Cos(Abs(a ^ 3 - 3 * Tan(b)))
MsgBox "res=" & CStr(res)
End Sub
Private Sub CommandButton1_Click()
Dim x, b, a, res As Single
x = Cells(3, 1)
b = Cells(3, 2)
a = Cells(3, 3)
res = (Sqr(5 * x ^ 4 + 2 * Sin(b) ^ 2)) / Cos(Abs(a ^ 3 - 3 * Tan(b)))
Cells(5, 2) = res
End Sub
Визуальное представление решения задачи представлено на рис. 7.
Рисунок 7. Визуальное представление решения задачи
Пример 4. Вычислить f, задав значения переменным:
Программный код
Sub Main()
Dim x, y, t, res As Single
x = -3
y = 2
t = 0.5
res = (x / (4.8 * x ^ 3 - y) ^ 3) + 1 / 4 * (t - 3 / x)
MsgBox "res=" & CStr(res)
End Sub
Private Sub CommandButton2_Click()
Dim x, y, t, res As Single
x = Cells(3, 9)
y = Cells(3, 10)
t = Cells(3, 11)
res = (x / (4.8 * x ^ 3 - y) ^ 3) + 1 / 4 * (t - 3 / x)
Cells(5, 10) = res
End Sub
Визуальное представление решения задачи представлено на рис. 8.
Рисунок 8. Визуальное представление решения задачи
Задачи для самостоятельного решения
Каждый студент должен решить две задачи из каждого блока А, Б, В и Г. Предполагается, что в задачах из блоков А и Г результат вычислений обоих заданий будет выдаваться в одном окне сообщений.
А
Вычислить значения выражений по формулам (предполагается, что значениями переменных могут быть любые действительные числа):
1. |
2. |
3. |
4. |
5. |
6. |
7. |
8. |
9. |
10. |
11. |
12. |
13. |
14. |
15. |
16. |
17. |
18. |
19. |
20. |
21. |
22. |
23. |
24. |
Б
Вычислить периметр и площадь прямоугольного треугольника по заданным длинам двух катетов а и b.
Заданы координаты трех вершин треугольника (x1,y1), (x2,y2), (x3,y3). Найти его периметр и площадь.
Вычислить длину окружности и площадь круга одного и того же заданного радиуса R.
Найти произведение цифр заданного четырехзначного числа.
Даны два числа. Найти среднее арифметическое кубов этих чисел и среднее геометрическое модулей этих чисел.
Вычислить расстояние между двумя точками с данными координатами (x1,y1) и (x2,y2).
Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.
Дана сторона равностороннего треугольника. Найти площадь этого треугольника, его высоты, радиусы вписанной и описанной окружностей.
Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.
Найти площадь кольца, внутренний радиус которого равен r, а внешний — заданному числу R (R > r).
Треугольник задан величинами своих углов и радиусом описанной окружности. Найти стороны треугольника.
Найти площадь равнобедренной трапеции с основаниями a и b и углом при большем основании а.
Вычислить корни квадратного уравнения ax2 + bx + с = 0, заданного коэффициентами a, b и с (предполагается, что а 0 и что дискриминант уравнения неотрицателен).
Дано действительное число х. Не пользуясь никакими другими арифметическими операциями, кроме умножения, сложения и вычитания, вычислить за минимальное число операций 2х4 - Зх3 + 4.х2 - 5х + 6.
Дано х. Получить значения -2х + Зх2 - 4х3 и 1 + 2х + Зх2 + 4х3. Позаботиться об экономии операций.
Найти площадь треугольника, две стороны которого равны а и b, а угол между этими сторонами равен .
Дано а. Не используя никаких функций и никаких операций, кроме умножения, получить а8 за три операции; a10 и a16 за четыре операции.
Найти сумму членов арифметической прогрессии, если известны ее первый член, знаменатель и число членов прогрессии.
Найти все углы треугольника со сторонами а, b, с. Предусмотреть в программе перевод радианной меры угла в градусы, минуты и секунды.
Три сопротивления –R1, R2, R3 соединены параллельно. Найдите сопротивление соединения.
Составить программу для вычисления пути, пройденного лодкой, если ее скорость в стоячей воде v1 км/ч, скорость течения реки v2 км/ч, время движения по озеру t1 ч, а против течения реки — t2 ч.
Текущее показание электронных часов: т часов (0 т 23), n мин (0 n 59), k сек (0 . k 59). Какое время будут показывать часы через р ч q мин r с?
Полторы кошки за полтора часа съедают полторы мышки. Сколько мышек съедят Х кошек за Y часов?
Составить программу вычисления объема цилиндра и конуса, которые имеют одинаковую высоту Н и одинаковый радиус основания R.
Дана величина А, выражающая объем информации в байтах. Перевести А в более крупные единицы измерения информации.
В
Составить программу, печатающую значение true, если указанное высказывание является истинным, и false в противном случае:
сумма двух первых цифр заданного четырехзначного числа равна сумме двух его последних цифр;
сумма цифр данного трехзначного числа N является четным числом;
точка с координатами (x, y) принадлежит части плоскости, лежащей между прямыми х = m, х = n (m < n);
квадрат заданного трехзначного числа равен кубу суммы цифр этого числа;
целое число N является четным двузначным числом;
среди чисел а, b, с есть хотя бы одна пара взаимно противоположных чисел;
числа a и b выражают длины катетов одного прямоугольного треугольника, с и d — другого. Эти треугольники являются подобными;
даны три стороны одного и три стороны другого треугольника. Эти треугольники равновеликие, т.е. имеют равные площади;
данная тройка натуральных чисел а, b, с является тройкой Пифагора, т.е. с2 = а2 + b2;
все цифры данного четырехзначного числа N различны;
данные числа х, y являются координатами точки, лежащей в первой координатной четверти;
(х1, у1) и (х2, у2) — координаты левой верхней и правой нижней вершин прямоугольника; точка A(х, у) лежит внутри этого прямоугольника или на одной из его сторон;
число с является средним арифметическим чисел а и b;
натуральное число N является точным квадратом;
цифры данного четырехзначного числа N образуют строго возрастающую последовательность;
цифры данного трехзначного числа N являются членами арифметической прогрессии;
цифры данного трехзначного числа N являются членами геометрической прогрессии;
данные числа c и d являются соответственно квадратом и кубом числа a;
цифра М входит в десятичную запись четырехзначного числа N;
данное четырехзначное число читается одинаково слева направо и справа налево;
сумма двух натуральных чисел кратна 2;
произведение натуральных чисел a и b кратно числу c;
сумма двух действительных чисел а и b является целым числом, т.е. дробная часть суммы равна нулю;
данное натуральное число а кратно числу b, но не кратно числу c.
Г
Составить программу, которая печатает true, если точка с координатами (х, у) принадлежит заштрихованной области, и false в противном случае:
Лабораторная работа № 4. Оператор условного перехода
Теоретические сведения
Ранее были рассмотрены команды присваивания, ввода и вывода. С помощью этих команд можно записывать простейшие алгоритмы, содержащие действия, выполняемые одно за другим (линейные алгоритмы). В практических задачах часто бывает необходимо обеспечить выбор одного из альтернативных путей работы алгоритма в зависимости от результатов проверки условия. В этом случае говорят о базовой алгоритмической конструкции – ветвлении. Оператор ветвления позволяет проверить некое условие и в зависимости от результатов проверки выполнить то или иное действие, т.е. он является средством ветвления вычислительного процесса.
Синтаксис оператора:
If <условие> Then
<инструкции_1>
[Else
<инструкции_2>
End If]
Здесь If, Then, Else, End If – зарезервированные слова VBA (если, то, иначе, конец ветвления);
<условие> – произвольное выражение логического типа;
< инструкции_1>, < инструкции_2> – любые операторы языка VBA.
Условный оператор работает по следующему алгоритму. Вначале вычисляется значение условного выражения <условие>. Если результат есть True (истина), то выполняются <инструкции_1>, а <инструкции_2> пропускаются. Если результат есть False (ложь), наоборот, <инструкции_1>пропускаются, а выполняются <инструкции_2>.
Часть условного оператора, начинающаяся со слова Else, может быть опущена, в этом случае имеет место неполная форма условного оператора. При этом, если условное выражение имеет значение True, выполняются инструкции, стоящие за Then; в противном случае весь оператор пропускается.
Представим условный оператор в виде блок-схемы. Напомним, что в языке блок-схем приняты следующие обозначения:
|
Начало или конец алгоритма |
||||||
|
Простая команда |
||||||
|
Ввод и вывод данных
|
||||||
|
Проверка условия
|
Оператор условного перехода в виде блок схемы:
Полная форма |
Неполная форма |
|
Допустимо так же использование вложенных ветвлений. В этом случае синтаксис таков:
If <условие_1> Then
<инструкции_1>
ElseIf <условие_2> Then
<инструкции_2>
…………………………………
[Else
<инструкции_n>
End If]
Демонстрационные примеры
1. Даны значения двух величин. Выбрать большее из них.
Обозначим данные величины через А и В, результат – С.
Приведем блок-схему алгоритма решения этой задачи. Рассмотрим два способа: (a) с использованием полного ветвления; (б) с использованием неполного ветвления.
(а) (б)
Условием, по которому разветвляется алгоритм, является отношение неравенства – логическое выражение. Логические выражения описывают некоторые условия, которые могут выполняться или не выполняться. Логическое выражение может принимать только два значения True (истина) или False (ложь).
Если логическое условие справедливо, то результатом будет логическая величина True и выполнение алгоритма продолжится по стрелке “истина”; в противном случае логическое выражение примет значение False и выполнение алгоритма пойдет по ветви “ложь”.
Соответствующие программы на VBA имеют следующий вид.
(а)
Sub Большее_из_двух ()
Dim A As Integer, B As Integer, C As Integer
A= Val (InputBox (“Введите число”, ”Ввод числа”))
B= Val (InputBox (“Введите число”, ”Ввод числа”))
If A>=B Then
C=A
Else
C=B
End If
MsgBox “Наибольшее число ”& C , ”Вывод результата”
End Sub
Правильность алгоритма можно проверить путем заполнения трассировочной таблицы. Вот так будет выглядеть трассировка алгоритма для исходных значений A=5, B=8.
-
Шаг
Команда
A
B
C
Проверка условия
1
A= Val (InputBox (“Введите число”, ”Ввод числа”))
5
-
-
2
B= Val (InputBox (“Введите число”, ”Ввод числа”))
5
8
-
3
A>=B
5
8
-
5>=8, False (ложь)
4
C=B
5
8
8
5
MsgBox “Наибольшее число ”& C , ”Вывод результата”
5
8
8
(б) аналогично.
2. Найти наибольшее значение среди трех величин A, B и C.
Возникает следующая идея алгоритма решения этой задачи: сначала нужно найти большее значение среди A и B и присвоить его какой-то переменной, например, D. Затем наитии большее среди D и C. Это значение можно присвоить той же переменной D.
Решение задачи сводится к двукратному применению уже знакомого алгоритма нахождения большего из двух.
|
В структуре алгоритма содержится два последовательных ветвления: первое – полное, второе – неполное. Очевидно, что эту задачу можно решить с использованием алгоритма, содержащего только неполные ветвления. В последнем случае возможны так же несколько вариантов решения в зависимости от характера условия: с простыми условиями и со сложными условиями. Заметим, что сложными условиями называют условные выражения, содержащие логические операции And (и), Or (или). Xor(исключающее или), Not (отрицание).
|
Приведем фрагмент программы, реализующей этот алгоритм, с последовательными неполными ветвлениями и сложными логическими выражениями:
If (A>=B) And (A>=C) Then D=A
If (B>=A) And (B>=C) Then D=B
If (C>=A) And (C>=B) Then D=C
Эту же задачу можно решить с помощью алгоритма совсем другой структуры, которая представляет собой вложенные ветвления. Написать программный код для решения этой задачи попытайтесь самостоятельно.
Задачи для самостоятельного решения
Каждый студент должен решить либо по две задачи из групп A, Б и одну – из группы В, либо одну задачу из группы В и одну задачу из группы Г. Привести блок-схемы решения задач из групп Б и Г соответственно.
А
1. Даны три действительные числа. Возвести в квадрат те из них, значения которых неотрицательны, и в четвертую степень — отрицательные.
2. Даны две точки А(x1, y1) и В(x2, y2). Составить алгоритм, определяющий, которая из точек находится ближе к началу координат.
3. Даны два угла треугольника (в градусах). Определить, существует ли такой треугольник. Если да, то будет ли он прямоугольным.
4. Даны действительные числа x и y, не равные друг другу. Меньшее из этих двух чисел заменить половиной их суммы, а большее — их удвоенным произведением.
5. На плоскости XOY задана своими координатами точка А. Указать, где она расположена: на какой оси или в каком координатном угле.
6. Даны целые числа m, n. Если числа не равны, то заменить каждое из них одним и тем же числом, равным большему из исходных, а если равны, то заменить числа нулями.
7. Дано трехзначное число N. Проверить, будет ли сумма его цифр четным числом.
8. Определить, равен ли квадрат заданного трехзначного числа кубу суммы цифр этого числа.
9. Определить, является ли целое число N четным двузначным числом.
10. Определить, является ли треугольник со сторонами a, b, c равносторонним.
11. Определить, является ли треугольник со сторонами a, b, c равнобедренным .
12. Определить, имеется ли среди чисел a, b, c хотя бы одна пара взаимно противоположных чисел.
13. Подсчитать количество отрицательных чисел среди чисел a, b, c.
14. Подсчитать количество положительных чисел среди чисел a, b, c.
15. Подсчитать количество целых чисел среди чисел a, b, c.
16. Определить, делителем каких из чисел a, b, c является число k.
17. Услуги телефонной сети оплачиваются по следующему правилу: за разговоры до А минут в месяц оплачиваются В р., а разговоры сверх установленной нормы оплачиваются из расчета С р. в минуту. Написать программу, вычисляющую плату за пользование телефоном для введенного времени разговоров за месяц.
18. Даны три стороны одного и три стороны другого треугольника. Определить, будут ли эти треугольники равновеликими, т.е. имеют ли они равные площади.
19. Программа-льстец. На экране появляется вопрос “Какой ты: высокий или невысокий? Введи В или Н”. В зависимости от ответа на экране должен появиться текст “Мне нравятся высокие люди!” или “Мне нравятся невысокие люди!”.
20. Грузовой автомобиль выехал из одного города в другой со скоростью v1 км/ч. Через t ч в этом же направлении выехал легковой автомобиль со скоростью v2 км/ч. Составить программу, определяющую, догонит ли легковой автомобиль грузовой через n ч после своего выезда.
21. Перераспределить значения переменных x и y так, чтобы в x оказалось большее из этих значений, а в y — меньшее.
22. Определить правильность даты, введенной с клавиатуры (число — от 1 до 31, месяц — от 1 до 12). Если введены некорректные данные, то сообщить об этом.
23. Составить программу, определяющую результат гадания на ромашке — “любит — не любит”, взяв за исходное данное количество лепестков n.
Б
1. Написать программу нахождения суммы большего и меньшего из 3 чисел.
2. Написать программу, определяющую по длинам сторон треугольника, является ли он прямоугольным. Если треугольник не прямоугольный, то вычислить косинус угла, лежащего против большей стороны.
3. Найти max{min{a, b}, min{c, d}}.
4. Даны три числа а, b, с. Определить, какое из них равно d. Если ни одно не равно d, то найти max{d-a, d-b, d-c}.
5. Даны четыре точки А1 (x1, y1), A2 (x2, y2), А3 (x3, y3), А4 (x4, y4). Определить, будут ли они вершинами параллелограмма.
6. Даны три точки А (x1, y1), B (x2, y2), C (x3, y3). Определить, будут ли они расположены на одной прямой. Если нет, то вычислить периметр треугольника ABC.
7. Даны действительные числа а, b, с. Удвоить эти числа, если а<b<с, и заменить их абсолютными значениями, если это не так.
8. На оси ОХ расположены три точки а, b, с. Определить, какая из точек b,c расположена ближе к а.
9. Даны три положительных числа а, b, с. Проверить, могут ли они быть длинами сторон треугольника. Если да, то вычислить площадь этого треугольника.
10. Написать программу решения уравнения ax3 + bх = 0 для произвольных а, b.
11. Дан круг радиуса R. Определить, поместится ли правильный треугольник со стороной а в этом круге.
12. Даны числа
x, y, z. Найти
значение выражения:
13. Дано число x. Напечатать в порядке возрастания числа: sinx, cosx. lnx. Если при каком-либо x некоторые из выражений не имеют смысла, вывести сообщение об этом и сравнивать значения только тех, которые имеют смысл.
14. Заданы размеры A, B прямоугольного отверстия и размеры X, Y, Z кирпича. Определить, пройдет ли кирпич через отверстие.
15. Составить программу, осуществляющую перевод величин из радианной меры в градусную или наоборот. Программа должна запрашивать, какой перевод нужно осуществить, и выполнять указанное действие.
16. Два прямоугольника, расположенные в первом квадранте, со сторонами, параллельными осям координат, заданы координатами своих левого верхнего и правого нижнего углов. Для первого прямоугольника это точки (x1, y1) и (x2, 0), для второго — (x3, y3), (x4, 0) Составить программу, определяющую, пересекаются ли данные прямоугольники, и вычисляющую площадь общей части, если они пересекаются.
17. В небоскребе N этажей и всего один подъезд; на каждом этаже по 3 квартиры; лифт может останавливаться только на нечетных этажах. Человек садится в лифт и набирает номер нужной ему квартиры М. На какой этаж должен доставить лифт пассажира?
18. Написать программу, которая по заданным трем числам определяет, является ли сумма каких-либо двух из них положительной.
19. Известно, что из четырех чисел a1, a2, a3 и a4 одно отлично от трех других, равных между собой; присвоить номер этого числа переменной n.
20. Составить программу, которая проверяла бы, не приводит ли суммирование двух целых чисел А и В к переполнению (т.е. к результату большему, чем 32767). Если будет переполнение, то сообщить об этом, иначе вывести сумму этих чисел.
В
Для данного x вычислить значение функции:
1. |
2. |
3. |
4. |
5. |
6. |
7. |
8. |
9. |
10. |
11. |
12. |
Г
1. Даны действительные числа a, b, c (a > 0). Полностью исследовать биквадратное уравнение ax4 + bх2 + с = 0, т.е. если действительных корней нет, то должно быть выдано сообщение об этом, иначе найти действительные корни, сообщив, сколько из них являются различными.
2. Дана точка А(х, у). Определить, принадлежит ли она треугольнику с вершинами в точках (x1, y1), (x2, y2), (x3, y3).
3. Написать программу, определяющую, будут ли прямые А1х + В1у + С = 0 и А2х + В2у + С = 0 перпендикулярны. Если нет, то найти угол между ними.
4. Если сумма трех попарно различных действительных чисел X, Y, Z меньше единицы, то наименьшее из этих трех чисел заменить полусуммой двух других; в противном случае заменить меньшее из X, Y полусуммой двух оставшихся значений.
5.
Написать
программу решения системы линейных
уравнений
a1x + b1y = c1
a2x + b2y = c2
6. Даны три положительных числа. Определить, можно ли построить треугольник с длинами сторон, равным этим числам. Если можно, то ответить на вопрос, является ли он остроугольным.
7. Найти координаты точек пересечения прямой y = kx + b и окружности радиуса R с центром в начале координат. В каких координатных четвертях находятся точки пересечения? Если точек пересечения нет или прямая касается окружности, выдать соответствующее сообщение.
8. Заданы координаты вершин прямоугольника: (x1, y1), (x2, y2), (x3, y3), (x4, y4). Определить площадь части прямоугольника, расположенной в I-й координатной четверти.
Лабораторная работа № 5. Оператор безусловного перехода
Теоретические сведения
Наряду с оператором условного перехода, позволяющим организовать выполнение той или иной группы операторов в зависимости от результатов проверки условия, иногда применяется и оператор безусловного перехода. Оператор безусловного перехода задает переход на строку внутри процедуры, помеченную меткой.
Синтаксис оператора:
GoTo <имя метки>
<имя метки> – произвольное имя, отвечающее стандартным правилам именования.
Это же имя должно стоять в начале строки, на которую будет осуществляться переход; при этом имя метки от оператора отделяется двоеточием.
Заметим, что этот оператор в языке программирования VBA является избыточным, поскольку его работа моделируется другими средствами. Кроме того, часто использование этого оператора свидетельствует о “плохом” стиле программирования.
Мы будем использовать оператор безусловного перехода для организации ввода, отвечающего определенным требованиям. В записываемых при этом логических выражениях, помимо арифметических операций, операций отношения, логических операций часто используются функции проверки типов.
Функции проверки типов
Имя функции |
Выполняемая проверка |
IsArray (<переменная>) |
Является ли <переменная> массивом |
IsData (<переменная>) |
Является ли <переменная> датой |
IsEmpty (<переменная>) |
Была ли <переменная> описана инструкцией Dim |
IsError (<переменная>) |
Является ли <переменная> кодом ошибки |
IsNull (<переменная>) |
Является ли <переменная> пустым значением |
IsNumeric (<переменная>) |
Является ли <переменная> числовым значением |
IsObject (<переменная>) |
Является ли <переменная> объектом |
Поскольку функция InputBox возвращает значение типа String, иногда более удобно анализировать результаты ввода, считая их строковыми величинами.
Некоторые функции обработки строк:
Len (<строка>)
Возвращает длину строки, т.е. количество символов в строке.
Например,
Len (“cat”) возвращает значение, равное 3;
Len (“3451787”) возвращает значение, равное 7;
Len (“Пример № 5”) возвращает значение, равное 10.
Mid (<строка>, <начальная позиция> [, <количество символов>])
Возвращает подстроку строки <строка>, начиная с символа, номер которого <начальная позиция>, длиной в указанное <количество символов>. Если последний аргумент <количество символов> не задан, то функция возвратит подстроку, включающую в себя символы с указанного аргументом <начальная позиция> до конца исходной строки.
Например, если
S = “весенний день”, то
Mid (S, 10, 4) возвращает значение, равное “день”;
Mid (S, 5, 3) возвращает значение, равное “нн”;
Mid (S, 3) возвращает значение, равное “сенний день”
Демонстрационные примеры:
1. Приведем пример программы, в которой оператор безусловного перехода используется в конструкции If – Them – Else. Требуется найти частное от деления числа a на число b, при этом, если водится b=0, должен быть предусмотрен повторный ввод.
Option Explicit
Sub Частное ()
Dim a As Integer, b As Integer
a = InputBox ("Введите делимое", "Ввод значений")
1: b = InputBox ("Введите делитетель", "Ввод значений")
If b = 0 Then
MsgBox "Делитель должен быть отличен от нуля," & Chr(13) & "повторите его ввод"
GoTo 1
End If
MsgBox "Частное от деления: " & a / b, vbExclamation, "Результат"
End Sub
2. Напишем программу, которая заставляла бы пользователя повторять ввод в случаях, когда вводимое значение пустое или не является числом. Если ввод прошел успешно, то введенное число должно выдаваться в окне сообщения.
Option Explicit
Sub Проверка ()
Dim x As Variant
Метка: x = InputBox("Введите любое число", "Ввод числа")
If IsNull(x) Then ‘проверка на пустое значение
GoTo Метка
ElseIf Not IsNumeric(x) Then ‘проверка на число
GoTo Метка
Else
MsgBox "Введенное число =" & x
End If
End Sub
В приведенной программе было использовано вложенное ветвление, последовательно осуществляющее проверку указанных условий. Эта же программа может быть написана по-другому – с использованием оператора ветвления, содержащего сложное логическое условие.
Option Explicit
Sub Проверка ()
Dim x As Variant
Метка: x = InputBox("Введите любое число", "Ввод числа")
If IsNull(x) Or Not IsNumeric(x) Then 'использование сложного логического условия
GoTo Метка
Else
MsgBox "Введенное число =" & x
End If
End Sub
Задачи для самостоятельного решения
Каждый студент должен решить обе задачи.
1. С клавиатуры вводятся числа a, b, c, d. Подсчитать значение выражения (a+b)/(c+d). Если c+d=0, заставить пользователя повторить ввод.
2. Написать программу, проверяющую правильность ввода даты (формат ввода: дд.мм.гг):
- введено нужное количество символов;
- дд и мм являются числами;
- 1 дд 31;
- 1 мм 12.
В случае неправильного ввода заставить пользователя повторить ввод. Если ввод прошел успешно, то введенная дата должно выдаваться в окне сообщения в виде списка:
День: дд;
Месяц: мм;
Год: гг.
Лабораторная работа № 6. Оператор выбора
Теоретические сведения
Оператор множественного выбора (или просто оператор выбора) позволяет выбрать одно из нескольких возможных продолжений программы, т.е. позволяет программировать ветвление по многим направлениям. Этот оператор организует переход на одну из нескольких ветвей в зависимости от значения заданного выражения. Это выражение называю ключом выбора, переключателем, селектором.
Синтаксис оператора выбора следующий:
Select Case <переключатель>
Case <условие_1>
<инструкции_1>
Case <условие_2>
<инструкции_2>
……………………
[Case Else
<инструкции_n>]
End Select
Здесь Select Case, Case, Case Else, End Select – зарезервированные слова VBA;
<переключатель> – выражение;
<условие> – выражение по типу соответствующее переключателю, записанное в одной из трех рассматриваемых ниже форм;
<инструкции_1>, <инструкции_2>, …<инструкции_n> – любые операторы языка VBA.
Исполнение оператора начинается с вычисления значения ключа. Затем выполняется проверка: удовлетворяет ли это значение одному из условий, стоящих после Case. Если такое условие найдено, то выполняются соответствующий набор инструкций, после чего работа передается оператору, идущему за End Select. Если ни одно из условий не выполняется, то работает блок команд <инструкции_n>, идущий после слова Else.
Возможно использование неполного оператора выбора – когда ветвь Case Else отсутствует. В этом случае, если не выполнено ни одно из условий, работа оператора завершается и управление передается оператору, стоящему после End Select.
Условие после слова Case может быть записано в одной из трех форм:
1) Case <константа_1>, <константа_2>, … <константа_m>
2) Сase Is <знак операции отношения> <константа>
3) Сase <константа_1> To <константа_2>
Для этих форм соответствующий блок команд <инструкции> выполняется в следующих случаях:
1) если значение переключателя равно одной из констант;
2) если выполняется условие отношения между значением переключателя и константой;
3) если выполняется соотношение <константа_1> £ <значение переключателя> £ <константа_2>
В виде блок схемы оператор выбора может быть изображен следующим образом.
Полная форма оператора выбора |
Неполная форма оператора выбора |
|
|