Немного о БЕЙСИКе

 

В математике имеют дело с такими объектами как числа разной природы (натуральные, целые, рациональные, действительные, комплексные), многочлены одной и нескольких переменных, матрицы, рациональные функции, геометрические линии, фигуры и тела и т.д. К ним применяются различные операции и отображения; это правила «переработки» объектов одного типа в объекты другого (или того же самого) типа. Между алгебраическими объектами устанавливаются различного рода отношения (равно, больше, принадлежит, лежит, делит, перпендикулярно, параллельно и т.п.). В памяти компьютера, как объекты, так и операции и отношения записываются в виде бинарной строки вида

 

0011101110000111101100101011101101101101100000111000111000101010111100001111000010101111111000000101010111001110101010101010 0010Поле памяти
Процессор
Компьютер
На физическом уровне 0 и 1 соответствуют двум состояниям элементарной ячейки памяти – биту. В отвлеченном виде компьютер можно представлять как процессор, который перерабатывает поле памяти в соответствии с инструкцией, которая записана в виде битовой строки в том же самом поле памяти. Переработка происходит через определенный интервал времени, обратная величина которого называется тактовой частотой процессора. В современных ПК тактовая частота 2.7 Ггц (=2700000 тактов в секунду), а память 1-2 Тбт (1Тб = Гбт= Мгб= кбт= ). Количество бит, которые за один такт может обработать процессор, называется разрядностью процессора; сейчас это 32 бита. Процессор может находится в одном из строго определенных состояний; число их невелико по сравнению с памятью компьютера. Результат «обработки» полностью определяется состоянием памяти (т.е. распределением нулей и единиц) и состоянием процессора.

Основной наш инструмент решения задач – язык программирования Бейсик, а точнее Visual Basic for Application (кратко: VBA). В качестве “Application” почти всегда будем пользоваться электронными таблицами Excel. Я рассчитываю на то, что вы знакомы с Excel на уровне пользователя; умеете открывать программу, записывать в ячейки числовые и строковые данные, копировать и перемещать различные области листов Excel и все это сохранять. Сохранять файлы Exel нам придется, выбрав опции

Сохранит как/Книга Excel с поддержкой макросов

для того, что бы VBA был подключен к соответствующему файлу. Запустить VBA можно щелкнут на «Разработчик/Visual Basic». Нам нужны будут два окна VBA.

1) Окно “Module”, где пишутся коды программ (если оно отсутствует, то в VBA надо использовать опции Insert/Module).

2) Окно Immediate. В нем можно проводить простые и непосредственные вычисления. Например, набрав в этом окне

? sqr(9)*2^(-1)*exp(0)

и нажав “Enter”, мы получим строкой ниже результат 1,5. Окно Immediate нам понадобиться и для распечатки результатов работы программы. Если в программе записать код

Debug.Print “значение=”;5 (1)

то при запуске программы в окне Immediate появиться

значение= 5 (2)

Если же в (1) знак “;” заменить на запятую, то в (2) после равенства появиться большой пробел – строковое выражение “значение=” и число 5 будут отпечатаны в режиме табуляции. Отмечу одну полезную опцию

Debug.Print Newline

означающую переход на новую строку при распечатке результатов. Однако чаще всего мы будем пользоваться ячейками Excel для записи результатов работы программы, а также для присвоения конкретных значений переменным. Разберем пример (см. файл Немного Бейсика.xlsm)

Sub Деление_с_остатком()
Const n As Byte = 5
Dim m As Integer
Cells(2, 1) = "Делитель равен ": Cells(2, 3) = n
m = Cells(3, 3)
Cells(5, 1) = "Неполное частное от деления m на " & n & "=":Cells(5, 5)=mn
Cells(6, 1) = "Остаток от деления m на " & n & " равен": Cells(6, 5)=m Mod n
End Sub

Первая трока открывает программу с названием «Деление_с_остатком». В скобках пишутся входные данные программы; у нас сейчас их нет. Вторая строка объявляет константу n типа Byte, под которую в памяти компьютера отводится 8 бит (=1 байт) и в эти восемь бит будет записано число 5 в двоичной системе: 00000101. Итак, тип Byte предназначен для записи и обработки целых чисел от 0 до 255 включительно. Заметим, что в теле программы константе запрещено присваивать какие-либо значения, т.е. она может встречаться только по правую сторону знака равенства. В третьей строке объявляется переменная m типа Integer. В общем, оператор вида

Dim идентификатор as тип переменной

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

Типу Integer отводится два байта для записи целого числа в пределах от до . Один бит отводится под запись знака числа: если этот бит равен 0, то число неотрицательно, а если равен 1, то оно отрицательно. Запишем выделенные два байта в виде

 

Здесь первый бит указывает на знак числа. Если sgn=0, то (2) кодирует число , пределы изменения которого от 0 до . Если же sgn=1, то (2) кодирует отрицательное число

 

Чертой сверху обозначена унарная операция отрицания, в VBA она имеет имя not:

 

Итак, строка из шестнадцати единиц кодирует число , а (1,0,0,…,0) кодирует . Следовательно, . Для работы с целыми числами имеется также тип Long, переменным которого выделяется четыре байта с тем же самым принципом кодирования чисел, что и для типа Integer. Следовательно, пределы изменения переменной типа Long -- от до .

В четвертой строке программы мы записываем в активный лист Excel значение делителя. Еще раз подчеркнем, если активным листом был «Лист 2», то данные запишутся именно во второй лист. Двоеточие между операторами -- удобный способ записи нескольких операторов в одной строке. В пятой строке переменной m присваивается значение, содержащееся в ячейке (3,3) (третья строка и третий столбец С). Если в этой ячейке ничего нет, то присваивается 0, если стоит вещественное число типа или то присваивается ближайшее целое, т.е. 6 или 0 в данном случае (этому соответствует функция round(x) в VBA). Если же в ячейке С3 записать целое число за рамками отрезка , то возникла бы ситуация ошибки №6 Overflow, о которой вас немедленно, во время работы программы, известит компилятор VBA. Кстати, перед запуском программы полезно запустить опцию Debug/Compile Project. Произойдет проверка на правильность записи программы. Однако ошибку времени исполнения программы, по типу той, что отмечена выше, никакая компиляторная проверка в начале отследить не может.

В шестой и седьмой строках происходит запись результатов деления с остатком.

Немного теории: любое натуральное число m можно поделить на натуральное число n с остатком так, что

 

Целые числа q (неполное частное) и r (остаток) определяются в (4) однозначно и им в VBA соответствуют функции

 

Воспользовавшись окном «Immediate» в VBA проверим работу этих функций:

?53 → 1, ? 5(-3) → -1, ?(-5)(-3) → 1, ?(-5)3 → -1

?5 mod 3 → 2; ? 5 mod -3 → 2; ? -5 mod 3 → -2; ? -5 mod -3 → -2

Мы и видим, что операция нечетна по обоим аргументам, в то время как нечетна по первому и четна по второму аргументу. Кроме того, подстановка нуля вместо делителя выдаст ожидаемую ошибку №11 “Division by zero”.

Отмечу также операцию соединения строк

“по”&”бе”&”да”→ “победа”

Вместо знака & можно пользоваться обычным знаком +.