Информатика
.pdf
11
Метка
целое без знака
пробел
идентификатор
:

Метка начинает строку операторов при необходимости обращения к ней из программы.
Оператор |
служебное слово |
||||
приказ машине |
|
|
|
|
|
|
|
|
|
||
(для исполнения) |
|
|
|
разделитель |
|
|
|
|
|
||
В качестве разделителя чаще всего используется пробел, двоеточие, переход на новую строку.
Арифметическое |
вычислимая арифметическая |
|||
выражение |
|
формула |
||
|
|
|
|
|
|
|
|
идентификатор |
|
|
|
|
|
|
Поскольку значение логической формулы также заносится в память с помощью оператора присваивания, то ее также естественно включить в арифметическое выражение.
Комментарий – произвольная последовательность символов, начинающаяся с апострофа или служебного слова REM, продолжающаяся до конца текущей строки. Комментарий не рассматривается интерпретатором и не влияет на объем исполняемой программы.
Предложение – последовательность слов и разделителей, логически связанная последовательность операторов, размещаемая в одной строке.
Программа – последовательность предложений. В рассматриваемых ниже приложениях программы оформляются различно.
QB: программа записывается текстом на рабочем поле редактора и запускается выбором пункта "Run" в меню запуска, либо нажатием клавиши "F5" консоли. Интерпретатор запускает выполнение каждого приказа с первой строки до последней (при отсутствии ошибок) и останавливается.
VBA: в приложениях программа записывается между служебными словами "SUB ‹имя программы›()" и "END SUB" (блок с операторными скобками) и размещается на кодовой странице приложения, либо в программном модуле. Запускается программа аналогично QB либо из меню "Пуск" (команда "Run"), либо нажатием клавиши F5 консоли (предварительно выделив имя программы), либо подходящим элементом управления.
12
Mcd: программа оформляется на рабочем листе в виде отдельной процедуры, функции или отдельного блока с указанием возвращаемых величин. Запустить ее можно, поставив после имени программы или программного блока знак "=" (с консоли), побуждающий интерпретатор к вычислению.
Нужно при этом иметь в виду следующее: в любом языке программирования (конечно же, и в VBA) любое арифметическое выражение должно быть записано в одну строку с необходимым количеством круглых скобок, регулирующих порядок действий. Одна из приятных особенностей пакета Mcd заключается в том, что арифметические выражения записываются в привычном для пользователя виде.
|
1+ sin x + |
1 |
|
|
|
Например, выражение R= |
x2+1 |
|
должно быть записано |
||
|
2 |
|
|
||
|
- x |
|
|
|
|
|
e |
2 + ln(1+|x|) |
|
||
в QB и VBA строкой:
R = Sqr((1+Sin(x)+Sqr(1/(x^2+1)))/(Exp(-x^2/2)+Log(1+Abs(x)))),
тогда как в Mcd оно записывается в следующем, вполне привычном, виде:
R:– |
. |
|
Здесь использованы имена встроенных функций, о которых будет сказано ниже, и операторы присваивания: "=" в QB и VBA, ":–" в Mcd.
Полезно отметить, что при вводе арифметических выражений в Mcd следует ориентироваться на голубой подчеркивающий уголок, отмечающий выражение, к которому применяется результат последуюшего ввода. Величина и положение этого уголка регулируется с помощью мыши и клавиши "пробел" (spacebar) консоли. Например, если
(1+x)2+x
необходимо вычислить (при х = 2) выражение 2x-1 , то необходимо
последовательно нажать на консоли клавиши: 1, +, x, "пробел" (для выделения 1+х), "Shift"+6 (ввести степень), 2, "пробел" (для выделения (1+х)2), +, х, "пробел" (выделить весь числитель), /, 2, *, х, -, 1 [,"пробел", "пробел", "пробел" – выделение всей дроби], = (на листе появится результат 3.667).
13
1.2. ОСНОВНЫЕ ТИПЫ
Пользователь должен сообщить интерпретатору его программы, какое место в памяти следует отводить используемым переменным и константам и как этой памятью можно распорядиться. Поэтому перед использованием этих объектов их нужно определить, указав для каждого его (базовый) тип с помощью инструкции:
Dim ‹имя переменной› As ‹тип›.
В одной строке можно определить несколько переменных:
Dim ‹имя1› As ‹тип1›, ‹имя2› As ‹тип2›, ‹имя3› As ‹тип3›, и т.д.
Константы определяются служеным словом Const, например,
Const pi As Double = 3.1415926535895.
Перечислим основные типы с указанием занимаемой памяти, допустимого диапазона, доступности в рассматриваемой среде (табл. 1).
Таблица 1
Название |
Тип |
Диапазон |
память |
QB |
VBA |
Mcd |
||
|
|
|
|
в байтах |
||||
Байты |
Byte |
0…255 |
1 |
- |
+ |
- |
||
Логические |
Boolean |
True-False |
2 |
+ |
+ |
- |
||
|
Целые |
Integer |
|x| ≤ 215-1 |
2 |
+ |
+ |
- |
|
|
Длинные |
Long |
|x| ≤ 231 |
4 |
+ |
+ |
- |
|
числа |
Веществ. |
Single |
|x| ≤ 3.41038 |
4 |
+ |
+ |
- |
|
Двойные |
Double |
|x| ≤ 1.710308 |
8 |
+ |
+ |
+ |
||
|
веществ. |
|
||||||
|
|
|
|
|
|
|
||
|
С фикс. |
Currency |
Целая часть до 15 |
8 |
- |
+ |
- |
|
|
точкой |
знаков, дробная – до 4 |
||||||
Текстовые |
String |
~ 230 символов |
10+1b/s |
+ |
+ |
+ |
||
Произвольные |
Variant |
В зависимости от |
≥ 16 |
- |
+ |
- |
||
содержания |
||||||||
|
|
|
|
|
|
|
||
Объекты |
Object |
Ссылки |
4 |
- |
+ |
- |
||
Таким образом, Mcd по умолчанию использует лишь два типа данных, остальные при необходимости получаются преобразованием из этих двух с помощью встроенных функций.
1.2.1. Числа
Основным признаком действительного числа является наличие десятичного разделителя – точки (не запятой, как в русскоязычной литературе). В формате с плавающей точкой число может быть записано с масштабным множителем, указывающим степень десяти:
14
-3.92Е+4 есть запись числа -39200, запись
Const eps As Single = 1E-10
вводит константу ε = 0.0000000001. Константы (в отличие от переменных) не допускают изменения значений в программе.
При присваивании значений переменным типы данных преобразуются автоматически, когда не возникает конфликта памяти. Например, если переменная А определена типом Byte, В - типом Integer, C - типом Single, D - типом Double, то после присваиваний (двоеточие яв-
ляется разделителем операторов внутри одной строки)
D = 3.14159265358937: C = D: B = C: A = B
получим значения 3 для А и В, 3.141593 для С (выполнено автоматическое округление при переходе к целому типу). Если вначале присвоим переменной D отрицательное значение, то на операторе А = В возникнет ошибка (переполнения).
Аналогично взаимодействуют типы Boolean и Integer. Значение False логической переменной соответствует нулевому значению целой переменной, тогда как True соответствует целому значению -1 (все разряды заняты единицами). С другой стороны, если целочисленная переменная имеет ненулевое значение, то ее логическое значение есть True. Например, цепочка присваиваний
Dim B As Boolean, C As Integer, D As Long
C = -123: B = C: D = B
приводит к значениям True для В и -1 для D.
Приведем короткий список встроенных QB-функций, облегчающий конструирование алгебраических выражений (табл. 2).
|
|
|
|
|
Таблица 2 |
|
|
|
|
|
|
|
|
функция |
интерпретация |
функция |
интерпретация |
|||
ABS(x) |
|x| |
x MOD y |
Остаток от деления х |
|||
на у |
||||||
|
|
|
||||
ATN(x) |
arctg(x) |
RND |
Случайное число из |
|||
(0, 1) |
||||||
|
|
|
||||
COS(x) |
cos(x) |
SGN(x) |
Знак числа х |
|||
EXP(x) |
ex |
SIN(x) |
sin(x) |
|||
FIX(x) |
Отбрасывает дробную часть |
SQR(x) |
|
|
|
|
|
x |
|||||
INT(x) |
Наибольшее целое, не |
TAN(x) |
tg(x) |
|||
превосходящее х |
||||||
|
|
|
|
|
||
LOG(x) |
ln(x) |
RANDOMIZE |
Старт для RND |
|||
15
VBA имеет более богатый набор встроенных функций. С полным их списком можно познакомиться непосредственно в разрабатываемом приложении, введя в программе "vba." (не забудьте точку!).
Mcd позволяет часто используемые элементарные функции и алгебраические операции вводить из меню "Калькулятор" (см. рис. 2). С полным набором встроенных функций можно ознакомиться в меню "f(x)" (вставка функций) с раскрывающимся списком разделов и содержанием разделов (рис. 3).
Рис. 2
Рис. 3
Рассмотрим простой пример. Возьмем случайное число из промежутка (1, 5) и найдем произведение его целой и дробной частей. В VBA задачу можно решить с помощью кода (с комментаниями):
Dim x As Single, a As Integer, b As Single, res As Single
Randomize Timer |
'***запускаем прцесс рандомизации |
x = 1 + 4*Rnd |
'***случайное число |
a = Int(x): b = x - a |
'***выделение целой и дробной части |
res = a * b |
|
ВMcd код выглядит чуть иначе:
x:– 1 + rnd(4) a :– trunc(x) b :– x - a res :– a∙b = ‹результат›.
Кроме обычных действительных чисел Mcd допускает использование комплексных чисел с введением мнимой единицы.
1.2.2. Строки
Строкой назовем конкретное значение переменной или константы типа String (заключенное в кавычки). Этот тип предполагает динамическое распределение памяти, поскольку произвольная строка может содержать до 230 символов. Это несколько замедляет работу процессора. Можно определять строки фиксированной длины с помощью инструкции:
16
Dim ‹имя переменной› As String*‹количество символов›,
при этом, если переменной присваивается строка более длинная, чем указано, то лишние символы отбрасываются (теряются), если строка имеет меньший размер, то недостающие символы заменяются пробелами. Приведем неполный перечень функций и операторов обработки строк в QB и VBA:
+ или "пробел"&"пробел" – последовательное сложение (объединение,
конкатенация) двух строк,
ASC(∙) возвращает значение кода одного символа в кодировке ASCII, CHR(∙) возвращает символ с указанным ASCII-кодом,
HEX(∙) возвращает строку 16-чного представления числа, INSTR([i],x,y) возвращает номер позиции, где впервые строка у входит
в состав строки х (выявление подстроки), начиная с позиции i (нумерация начинается с единицы),
LEFT(x,i) возвращает i левых символов строки х, RIGHT(x,i) возвращает i правых символов строки х, LEN(x) возвращает длину строки х (количество символов),
MID(x,i,j) возвращает подстроку в строке х длиной j символов, начиная с i-ой позиции (если аргумент j отсутствует, то выделяются все символы строки х, начиная с i-го). Функция позволяет в заданное место одной строки вставлять другую строку (это единственный случай, когда имя функции может стоять слева от оператора присваивания).
FORMAT(∙), STR(∙) преобразуют число в текстовый формат (вторая функция в отличие от первой добавляет пробел в начало строки),
STRING(n, z) возвращает строку из n символов z (или символов с
ASCII-кодом z).
TRIM(∙) убирает начальные и конечные пробелы в строке.
UCASE(∙), LCASE(∙) преобразуют элементы строки к верхнему и нижнему регистрам.
VAL(x) преобразует строку х в соответствующий числовой формат (если это невозможно, функция возвращает ноль).
Mcd использует другие названия функций для сходных операций:
concat(∙) возвращает конкатенацию (объединение) строк-аргументов, IsString(S) возвращает 1, если S – строка, иначе возвращает 0, num2str(∙) переводит число в текстовый формат,
strlen(∙) возвращает длину (количество символов) строки, str2num(∙) преобразует текстовое выражение в числовой формат, str2vec(∙) преобразует текстовое выражение в последовательность
ASCII-кодов,
17
substr(S,m,n) действует, как Mid(S,m,n) VBA (но нумерация по умолчанию начинается с нуля),
vec2str(v) возвращает строку символов с ASCII-кодами v.
Преобразование строк полезно использовать для подготовки данных к выводу на печать или для сохранения в текстовом файле, также в тех случаях, когда нужно обрабатывать часть числа.
Пример. Пусть дано целое четырехзначное число N. Требуется переставить в нем циклически цифры четыре раза, все полученные числа сложить и результат поделить на сумму цифр числа N.
Рассмотрим решение задачи в VBA в терминах целых чисел. Определим четыре целых числа для результатов перестановок цифр и для суммы цифр числа N:
Dim N1 As Integer, N2 As Integer, N3 As Integer, S As Integer
Dim k As Integer, res As Integer.
Сумму цифр получим последовательностью операций:
k = N: S = k Mod 10: k = k \10 '***целочисленное деление S = S + k Mod 10: k = k \ 10: S = S + k Mod 10 + k \ 10.
Выполним перестановку цифр:
N1 = (N Mod 10)*1000 + N \ 10: N2 = (N1 Mod 10)*1000 + N1 \ 10
N3 = (N2 Mod 10)*1000 + N2 \ 10.
Теперь получим результат:
res = (N + N1 + N2 + N3) \ S.
В Mcd те же операции из-за отсутствия целого типа выглядят несколько иначе (функция trunc возвращает целую часть числа):
k :– n s :– mod(k, 10) k :– trunc(0.1∙k) |
s :– s + mod(k, 10) |
|
k :– trunc(0.1∙k) s :– s + mod(k, 10) + trunc(0.1∙k) |
||
n1 |
:– 1000∙mod(n, 10) + trunc(0.1∙n) |
|
n2 |
:– 1000∙mod(n1, 10) + trunc(0.1∙n1) |
|
n3 |
:– 1000∙mod(n2, 10) + trunc(0.1∙n2) |
res :– n+n1+n2+n3 . |
|
|
s |
Используя преобразования типов число строка, можно решение организовать по-другому.
В VBA: введем дополнительно четыре текстовые переменные
Dim t As String, t1 As String, t2 As String, t3 As String.
Далее,
t = Format(N)
k = Val(Left(t,1)) + Val(Mid(t,2,1)) + Val(Mid(t,3,1)) + Val(Right(t,1)) t1 = Right(t,1) & Left(t,3): t2 = Right(t1,1) & Left(t1,3)
18
t3 = Right(t2,1) & Left(t2,3)
res = (Val(t) + Val(t1) + Val(t2) + Val(t3)) \ k .
ВMcd выглядит все совершенно аналогично, если в соответствии
спредыдущим всюду функцию Val заменить на str2num, Left(), Mid() и Right() заменить функцией substr() с соответствующими параметрами (учитывая индексацию с нуля).
Приведем таблицу кодов основных символов ASCII.
Таблица 3. Основная таблица кодов
1 |
|
17 |
|
33 |
! |
49 |
1 |
65 |
A |
81 |
Q |
97 |
a |
113 |
q |
2 |
|
18 |
|
34 |
" |
50 |
2 |
66 |
B |
82 |
R |
98 |
b |
114 |
r |
3 |
|
19 |
|
35 |
# |
51 |
3 |
67 |
C |
83 |
S |
99 |
c |
115 |
s |
4 |
|
20 |
|
36 |
$ |
52 |
4 |
68 |
D |
84 |
T |
100 |
d |
116 |
t |
5 |
|
21 |
|
37 |
% |
53 |
5 |
69 |
E |
85 |
U |
101 |
e |
117 |
u |
6 |
|
22 |
|
38 |
& |
54 |
6 |
70 |
F |
86 |
V |
102 |
f |
118 |
v |
7 |
♦ |
23 |
|
39 |
' |
55 |
7 |
71 |
G |
87 |
W |
103 |
g |
119 |
w |
8 |
|
24 |
|
40 |
( |
56 |
8 |
72 |
H |
88 |
X |
104 |
h |
120 |
x |
9 |
tab |
25 |
|
41 |
) |
57 |
9 |
73 |
I |
89 |
Y |
105 |
i |
121 |
y |
10 |
|
26 |
|
42 |
* |
58 |
: |
74 |
J |
90 |
Z |
106 |
j |
122 |
z |
11 |
♂ |
27 |
|
43 |
+ |
59 |
; |
75 |
K |
91 |
[ |
107 |
k |
123 |
{ |
12 |
|
28 |
|
44 |
, |
60 |
< |
76 |
L |
92 |
\ |
108 |
l |
124 |
| |
13 |
|
29 |
|
45 |
- |
61 |
= |
77 |
M |
93 |
] |
109 |
m |
125 |
} |
14 |
♫ |
30 |
- |
46 |
. |
62 |
> |
78 |
N |
94 |
^ |
110 |
n |
126 |
~ |
15 |
|
31 |
|
47 |
/ |
63 |
? |
79 |
O |
95 |
_ |
111 |
o |
127 |
• |
16 |
|
32 |
|
48 |
0 |
64 |
@ |
80 |
P |
96 |
` |
112 |
p |
|
|
Таблица 4. Дополнительная (расширенная) таблица кодов
128 |
Ђ |
144 |
ђ |
160 |
|
176 |
° |
192 |
А |
208 |
Р |
224 |
а |
240 |
р |
129 |
Ѓ |
145 |
‘ |
161 |
Ў |
177 |
± |
193 |
Б |
209 |
С |
225 |
б |
241 |
с |
130 |
‚ |
146 |
’ |
162 |
ў |
178 |
І |
194 |
В |
210 |
Т |
226 |
в |
242 |
т |
131 |
ѓ |
147 |
“ |
163 |
Ј |
179 |
і |
195 |
Г |
211 |
У |
227 |
г |
243 |
у |
132 |
„ |
148 |
” |
164 |
¤ |
180 |
ґ |
196 |
Д |
212 |
Ф |
228 |
д |
244 |
ф |
133 |
… |
149 |
• |
165 |
Ґ |
181 |
µ |
197 |
Е |
213 |
Х |
229 |
е |
245 |
х |
134 |
† |
150 |
– |
166 |
¦ |
182 |
¶ |
198 |
Ж |
214 |
Ц |
230 |
ж |
246 |
ц |
135 |
‡ |
151 |
— |
167 |
§ |
183 |
∙ |
199 |
З |
215 |
Ч |
231 |
з |
247 |
ч |
136 |
€ |
152 |
|
168 |
Ё |
184 |
ё |
200 |
И |
216 |
Ш |
232 |
и |
248 |
ш |
137 |
‰ |
153 |
™ |
169 |
© |
185 |
№ |
201 |
Й |
217 |
Щ |
233 |
й |
249 |
щ |
138 |
Љ |
154 |
љ |
170 |
Є |
186 |
є |
202 |
К |
218 |
Ъ |
234 |
к |
250 |
ъ |
139 |
‹ |
155 |
› |
171 |
« |
187 |
» |
203 |
Л |
219 |
Ы |
235 |
л |
251 |
ы |
140 |
Њ |
156 |
њ |
172 |
¬ |
188 |
ј |
204 |
М |
220 |
Ь |
236 |
м |
252 |
ь |
141 |
Ќ |
157 |
ќ |
173 |
|
189 |
Ѕ |
205 |
Н |
221 |
Э |
237 |
н |
253 |
э |
142 |
Ћ |
158 |
ћ |
174 |
® |
190 |
ѕ |
206 |
О |
222 |
Ю |
238 |
о |
254 |
ю |
143 |
Џ |
159 |
џ |
175 |
Ї |
191 |
ї |
207 |
П |
223 |
Я |
239 |
п |
255 |
я |
19
Коды 1, 12, 31 – служебные, 9 – код табуляции, коды 10 и 13 вызывают при выводе переход на другую строку (их полезно использовать при выводе информации в несколько строк, принудительный "возврат каретки"), 32 – код "пробела", остальные – коды псевдографики, цифры, латинница, арифметические знаки, скобки и коды некоторых клавиш консоли. Дополнительная таблица содержит знаки кириллицы
ичасто используемые типографские знаки.
Стипами Variant и Object приходится сталкиваться в отдельных особых случаях. Эти типы будут оговорены в подходящих для этого местах. По поводу типа Variant полезно отметить следующее: если объект не определен соответствующей инструкцией Dim, то по умолчанию он считается принадлежащим типу Variant. Это некорректно с точки зрения программирования и в конфликтных ситуациях может приводить к скрытым, трудно определяемым ошибкам. Поэтому все переменные, константы и другие объекты должны быть определены с указанием их типов.
1.3. ОПЕРАТОРЫ ВВОДА И ВЫВОДА
Выше уже отмечена тенденция отделять пользователя от непосредственного участия в управлении компьютером. В Mcd все вычисления проводятся автоматически непосредственно на рабочем листе, поэтому там отпадает необходимость в специальных операторах вво- да-вывода (за исключением операций с файлами, но об этом позже).
В QB (при прямой работе в DOS – дисковой операционной системе) ввод с клавиатуры осуществлялся с помощью оператора INPUT, после которого следовал список переменных ввода. Этот же оператор использовался при вводе информации из файла (см. ниже). Оператор вывода PRINT, также со списком переменных (объектов вывода), использовался как для непосредственного вывода на экран дисплея, так и для вывода в файл.
VBA сохранил эти операторы, в основном для работы с файлами. В различных приложениях ввод информации организуется специальным для этого приложения способом (например, в таблицы, надписи, ячейки диалоговых окон, и т.д., о некоторых из них будет идти речь позже). В случае простого обмена (диалога) можно воспользоваться специальной функцией ввода InputBox() с необязательными аргументами Prompt – текст подсказки, Title – текст заголовка, Default – вводимое по умолчанию значение, и др. Функция вводит информацию с клавиатуры только в текстовом виде. Если необходимо ввести число, к функции следует применить функцию-преобразователь Val.
Ситуация с выводом в сущности такая же: каждое приложение имеет свои специфические формы вывода. Общим является диалоговое окно, вызываемое оператором MsgBox. Поскольку это оператор, а
20
не функция, т.е. он должен производить действие, а не возвращать значение, его (необязательные) аргументы указываются далее без скобок: Prompt – выводимый текст, дополнительные кнопки на диалоговой панели, Title – заголовок, и др. Так же, как и при вводе, если необходимо вывести в диалоговое окно числовое значение, то его полезно предварительно преобразовать в строковый формат.
Пример. Организуем диалог с компьютером (Комп – Студ):
Комп: "Доброе утро!" Студ: "Доброе утро!" Комп: "Как Ваше имя?" Студ: "Сергей"
Комп: "Привет, Сергей! Сколько тебе лет?"
Студ: "19"
Комп: "Ну-у, тебе еще жить, да жить. А я, вот, с прошлого века..." Студ: "Мне очень жаль. Сколько же тебе лет?"
Комп: "Да побольше, чем 20."
в виде кода:
Sub Dialog() |
|
Dim txt as string, n As Byte |
|
txt = InputBox("Доброе утро!", "", "") |
'***здоровается |
txt = InputBox("Как Ваше имя?", "", "") |
'***студент вводит имя |
'***прибавляется имя к приветствию, переход на новую строку n = Val(InputBox("Привет, " & txt & "!" & Chr(13) & _
"Сколько тебе лет?", "","0")) '***ввод возраста txt = InputBox("Ну-у, тебе еще жить, да жить." & Сhr(13) & _
"А я, вот, с прошлого века...", "", "") ' ***вводится реакция студента
MsgBox "Да побольше, чем " & Format(20), vbExclamation, "" End Sub .
Здесь использован комментарий '***... и способ непрерывного про-
должения строки на следующей: "пробел" и знак подчеркивания,
константа vbExclamation добавляет в диалоговое окно восклицательный знак.
Во многих приложениях (например, Excel, Word, и др.) пользователь может вводить специальную форму, которая является контейнером для различных элементов управления и дополнительных окон ввода и вывода информации. Visual Basic, как самостоятельный язык для создания приложений, имеет возможность непосредственного текстового вывода в форму с помощью оператора Form.Print. Форма при этом позволяет изменять тип, размер, цвет шрифта, стартовую позицию печати, выводить некоторые графические элементы, так что она вполне заменяет (на уровне окон) взаимодействие QB – экран.
