|
|
Строка 1: |
Строка 1: |
| {{ДИ}}
| | '''Материал удален по требованию автора.''' |
| {{TOCright}}
| |
| | |
| <pre>
| |
| В данной главе приводится описание языка программирования Бейсик
| |
| для БК-0010-01 (далее просто "Бейсик"). Авторы надеются, что эта глава
| |
| будет полезна прежде всего преподавателям и учащимся, работающим на
| |
| КУВТах, где одно руководство по Бейсику [1,2] приходится на весь
| |
| дисплейный класс. Индивидуальным владельцам БК, имеющим эту литературу
| |
| в своем распоряжении, имеет смысл детально ознакомиться только с пунк-
| |
| тами 3.8, 3.9, которые рассказывают о приемах повышения эффективности
| |
| программирования на Бейсике и содержат различные примеры программ.
| |
| | |
| 3.1. Алфавит языка
| |
| | |
| Язык программирования Бейсик так же, как и любой естественный язык,
| |
| имеет свой алфавит. Алфавит языка Бейсик содержит следующие символы:
| |
| 1. Заглавные латинские буквы от А до Z.
| |
| 2. Арабские цифры от 0 до 9.
| |
| 3. Знаки, используемые в арифметических выражениях:
| |
| * - умножение;
| |
| / - деление;
| |
| + - сложение;
| |
| - - вычитание;
| |
| ^ - возведение в степень ( например, 3^2=9 );
| |
| \ - деление нацело ( например, 5\2=2 );
| |
| ( - левая скобка;
| |
| ) - правая скобка.
| |
| 4. Другие символы:
| |
| < - меньше;
| |
| > - больше;
| |
| = - равно;
| |
| ; - точка с запятой;
| |
| ! - восклицательный знак;
| |
| ? - вопросительный знак;
| |
| " - кавычки;
| |
| ' - апостроф;
| |
| $ - "солнышко", "клоп", "жук"
| |
| % - процент;
| |
| # - номер ( "решетка" );
| |
| @ - знак "относительно";
| |
| & - амперсанд;
| |
| - пробел.
| |
| Кроме вышеперечисленных символов, в текстовых константах могут
| |
| использоваться следующие символы:
| |
| 1. Строчные латинские буквы от a до z.
| |
| 2. Заглавные русские буквы от А до Я.
| |
| 3. Строчные русские буквы от а до я.
| |
| 4. Символы псевдографики (выводятся на экран при одновременном
| |
| нажатии клавиши "АР2" и соответствующих буквенных клавиш).
| |
| Для отличия от буквы "О" цифра "0" ("ноль") при выводе на экран
| |
| перечеркивается наклонной чертой.
| |
| Пробел, хотя и не имеет своего начертания, считается символом языка
| |
| Бейсик и используется только для удобства чтения текста программы
| |
| человеком.
| |
| | |
| | |
| | |
| 3.2. Программа на языке Бейсик
| |
| | |
| Программа, написанная на языке Бейсик, состоит из строк, каждая из
| |
| которых имеет свой номер.
| |
| Приведем в качестве примера программу, состоящую из 3-х строк:
| |
| | |
| 1 CLS
| |
| 2 CIRCLE ( 120,120 ),30,1
| |
| 3 END
| |
| | |
| Каждая строка представляет собой приказ для машины. И исполняются
| |
| эти приказы машиной (один за другим) в порядке возрастания
| |
| соответствующих номеров строк. Строки нумеруются целыми числами из
| |
| интервала от 0 до 65535.
| |
| Первое слово в строке называется оператором и указывает, какое
| |
| действие машина должна выполнить. Оператор CLS (строка 1) очищает
| |
| экран - стирает с экрана всю информацию, кроме служебной строки.
| |
| Оператор CIRCLE (строка 2) рисует окружность. Выражение (120,120),30,1
| |
| (после оператора CIRCLE) определяет координаты центра, радиус и цвет
| |
| окружности. Оператор END (строка 3) указывает на конец программы.
| |
| Когда программа полностью набрана, ее можно запустить на выполнение
| |
| командой RUN. Ввод команды или строки программы всегда заканчивается
| |
| нажатием клавиши "ВК". Команды набираются на клавиатуре без номера
| |
| строки. В отличие от операторов программы, команды исполняются
| |
| незамедлительно (сразу же после нажатия клавиши "ВК").
| |
| Операторы и команды представляют собою либо целые английские слова,
| |
| либо их сокращения, как, например, оператор CLS (Clear Screen -
| |
| очистить экран).
| |
| Номера соседних строк не обязательно должны отличаться на единицу.
| |
| Рекомендуется нумеровать строки числами, кратными 5 или 10. Это
| |
| позволяет при необходимости вставлять в промежутки между уже
| |
| имеющимися строками новые строки.
| |
| Если необходимо удалить из программы какую-либо строку, достаточно
| |
| набрать ее номер и нажать клавишу "ВК".
| |
| Одна строка программы (логическая строка) может занимать несколько
| |
| символьных строк экрана (физических строк) и состоять не более, чем из
| |
| 255 символов. Логическая строка принимается транслятором Бейсика для
| |
| обработки только после нажатия клавиши "ВК". До этого ее можно
| |
| редактировать, используя клавиши управления курсором.
| |
| Приняв строку, транслятор либо сразу выполняет указанные в ней
| |
| действия (если нет номера строки), либо запоминает информацию строки в
| |
| ОЗУ (если есть номер строки). Первый режим работы транслятора называ-
| |
| ется непосредственным, второй - косвенным (режим ввода программы).
| |
| | |
| 3.3. Типы данных
| |
| | |
| Для решения любой задачи требуются данные (числовые и другие), над
| |
| которыми выполняются определенные действия для получения результата.
| |
| Классификация типов данных, с которыми может работать Бейсик,
| |
| приведена на рис.8. По способу работы с ними данные разделяются на
| |
| постоянные (константы) и переменные.
| |
| | |
| 3.3.1. Константы
| |
| | |
| Постоянные величины принято называть константами. Константы - это
| |
| такие данные, значения которых в программе известны заранее и на
| |
| протяжении работы всей программы не меняются. Например, если в
| |
| | |
| ┌───────────┐
| |
| │ данные │
| |
| └─────┬─────┘
| |
| ┌─────┴───────────────┐
| |
| ┌────┴─────┐ ┌─────┴─────╖
| |
| │ числовые │ │ строковые ║
| |
| └────┬─────┘ ╘═══════════╝
| |
| ┌─────────┴──────────────┐
| |
| ┌──────┴──────╖ ┌────────────┴─────────────┐
| |
| │ целого типа ║ │ вещественного типа │
| |
| ╘═════════════╝ └────────────┬─────────────┘
| |
| ┌──────────┴──────────┐
| |
| ┌────────────┴───────╖ ┌───────┴──────────╖
| |
| │ одинарной точности ║ │ двойной точности ║
| |
| ╘════════════════════╝ ╘══════════════════╝
| |
| | |
| Рис.8. Классификация типов данных в Бейсике
| |
| | |
| программе есть число 47, то оно и будет числом 47 на протяжении работы
| |
| всей программы.
| |
| Строковая константа может быть образована из последовательности
| |
| любых символов (букв, цифр и других знаков). Такая последовательность
| |
| обычно заключается в кавычки для указания границ строковой константы.
| |
| Ниже приводятся примеры строковых констант:
| |
| | |
| "ПРИВЕТ"
| |
| "ЭВМ БК-0010-01"
| |
| "***ПРОГРАММА***"
| |
| | |
| Числовая константа целого типа - это целое число из интервала от
| |
| -32768 до 32767.
| |
| Числовые константы вещественного типа - это действительные числа,
| |
| то есть числа, которые могут принимать дробные значения. Во всех
| |
| языках программирования принято отделять дробную часть числа от целой
| |
| точкой (а не запятой, как принято в математике). Дело в том, что
| |
| родина вычислительной техники - США, а там принято использовать при
| |
| записи чисел десятичную точку. Числовые константы можно записывать в
| |
| экспоненциальной форме (с указанием порядка числа).
| |
| В Бейсике БК данные вещественного типа могут быть одинарной (около
| |
| 7 значащих десятичных цифр) или двойной точности (около 17 значащих
| |
| цифр). В таблице 2 приведены примеры записи числовых констант.
| |
| Константы целого типа занимают меньше места в памяти, чем константы
| |
| вещественного типа. Поэтому при составлении программ к константам
| |
| целого типа рекомендуется приписывать символ "%", к константам
| |
| вещественого типа одинарной точности - символ "!".
| |
| При этом машина будет отводить для каждой константы соответствующее
| |
| количество байт (см. таблицу 2).
| |
| | |
| | |
| Таблица 2. Примеры записи числовых констант
| |
| ┌────────────────────┬──────────────────┬───────────────────────┐
| |
| │ Числовая константа │ Занимает памяти, │ Примеры записи │
| |
| │ │ байт │ констант │
| |
| ├────────────────────┼──────────────────┼───────────────────────┤
| |
| │ Целая │ 2 │ 47% │
| |
| │ │ │ -2% │
| |
| ├────────────────────┼──────────────────┼───────────────────────┤
| |
| │ Одинарной │ 4 │ 47! │
| |
| │ точности │ │ -123.4! или -1.234Е2 │
| |
| │ │ │ 0.0013! или 1.3Е-3 │
| |
| ├────────────────────┼──────────────────┼───────────────────────┤
| |
| │ Двойной │ 8 │ 47 │
| |
| │ точности │ │ 0.0013 или 1.3D-3 │
| |
| └────────────────────┴──────────────────┴───────────────────────┘
| |
| | |
| Числовую константу целого типа можно записывать не только в
| |
| десятичной системе счисления, но и в двоичной, восьмеричной или
| |
| шестнадцатеричной системе. Для этого перед ней ставится знак "&" и
| |
| одна из следующих букв:
| |
| В - для двоичных чисел (например: &В100101011101),
| |
| О - для восьмеричных чисел (например: &О156743),
| |
| Н - для шестнадцатеричных чисел (например: &Н9А8В).
| |
| | |
| 3.3.2. Переменные
| |
| | |
| Переменными называются данные, которые в процессе выполнения
| |
| программы могут принимать различные допустимые значения. Числовые и
| |
| строковые переменные могут быть простыми или индексированными. Здесь
| |
| мы рассмотрим только простые типы переменных.
| |
| Для обозначения переменных используются имена (идентификаторы).
| |
| Идентификатор переменной представляет собой последовательность из букв
| |
| и цифр, но начинается с буквы:
| |
| Х% - числовая переменная Х целого типа;
| |
| А2! - числовая переменная А2 одинарной точности;
| |
| Х3 - числовая переменная Х3 двойной точности;
| |
| Н$ - строковая переменная Н.
| |
| Переменные числовых типов (рис.8) занимают в ОЗУ столько же места,
| |
| как и константы (табл.2), плюс еще место для имени переменной. Из
| |
| соображений экономии памяти Бейсик БК использует только первые два
| |
| символа идентификатора, поэтому "PRIWET" и "PROBA" будут считаться
| |
| одинаковыми именами.
| |
| Числовой переменной любого типа могут присваиваться числовые
| |
| константы, переменные и выражения с данными любого типа. Но при этом
| |
| тип результата вычисления выражения преобразуется в тип переменной.
| |
| Например, если переменной целого типа Х% присваивается вещественное
| |
| число 23.16, то Х% будет иметь значение 23% (дробная часть числа будет
| |
| отброшена).
| |
| | |
| 3.3.3. Выражения
| |
| | |
| В Бейсике используются 2 типа выражений:
| |
| - арифметические выражения;
| |
| - строковые (символьные) выражения.
| |
| Арифметическое выражение задает порядок выполнения арифметических
| |
| операций над числовыми данными и состоит из констант, имен переменных,
| |
| обозначений математических функций, круглых скобок и знаков
| |
| арифметических операций. В частном случае арифметическое выражение
| |
| может состоять только из одной константы (или одного имени
| |
| переменной). Ниже приведены примеры арифметических выражений:
| |
| | |
| (47+Х)/Р
| |
| Х!
| |
| 23.134
| |
| | |
| Целым выражением мы будем называть арифметическое выражение,
| |
| принимающее значение целого типа (из интервала от -32768 до 32767).
| |
| Кроме известных из школьного курса арифметических операций в
| |
| Бейсике используются операция деления нацело (обозначается знаком "\")
| |
| и операция деления по модулю (обозначается "MOD"). Например, результат
| |
| 5\2 равен 2 (целой части результата деления 5 на 2), а результат 5MOD2
| |
| равен 1 (остатку от деления 5 на 2).
| |
| Строковое выражение задает последовательность выполнения действий
| |
| над строковыми данными и может состоять из строковых констант, имен
| |
| строковых переменных и строковых (символьных) функций, соединенных
| |
| знаком конкатенации (объединения строковых данных). Результат
| |
| строкового выражения - строковая константа. Например: "МА"+"ШИНА" -
| |
| конкатенация двух строковых констант (результат конкатенации -
| |
| строковая константа "МАШИНА").
| |
| | |
| 3.4. Команды языка Бейсик
| |
| | |
| Команды набираются на клавиатуре без номера строки и исполняются
| |
| сразу же после нажатия клавиши "ВК".
| |
| | |
| 3.4.1. Команда RUN
| |
| | |
| Команда RUN производит запуск программы на выполнение. Если есть
| |
| необходимость запуска программы с определенной строки, то за командой
| |
| RUN указывается номер соответствующей строки. Например, RUN 150.
| |
| | |
| 3.4.2. Команда CONT
| |
| | |
| Выполнение программы останавливается, если в программе встретились
| |
| операторы STOP или END, а также при нажатии клавиши "СТОП". По команде
| |
| CONT выполнение программы продолжится с того места, где она была
| |
| остановлена оператором STOP или нажатием клавиши "СТОП".
| |
| Эта команда в сочетании с оператором STOP используется в том
| |
| случае, если есть необходимость в определенном месте приостановить
| |
| выполнение программы (оператором STOP), вывести на экран (или
| |
| изменить) значения некоторых переменных и затем продолжить выполнение
| |
| прерванной программы со строки, следующей за оператором STOP.
| |
| | |
| 3.4.3. Команды CSAVE, CLOAD
| |
| | |
| Команда CSAVE записывает программу на Бейсике, хранящуюся в памяти
| |
| компьютера, на магнитную ленту. После команды CSAVE в кавычках
| |
| указывается имя файла (программы), состоящее не более, чем из 6
| |
| символов. Например, команда CSAVE "МАКС" записывает на магнитныю ленту
| |
| файл под именем "МАКС". Этот файл можно считать ( загрузить ) в память
| |
| компьютера с магнитной ленты командой CLOAD "МАКС".
| |
| | |
| 3.4.4. Команды LIST и "."
| |
| | |
| По команде LIST на экран выводится текст программы (листинг). В
| |
| таблице 3 приведены примеры использования команды LIST.
| |
| Если количество строк выводимого текста больше 23, то текст будет
| |
| перемещаться вверх по экрану, пока не будут выведены все строки.
| |
| Остановить движение строк вверх по экрану можно одновременным нажатием
| |
| клавиш "СУ" и "Ю". Повторное нажатие возобновит перемещение строк.
| |
| Для редактирования строки используется команда "." (точка).
| |
| Например, команда .117 (за точкой следует номер строки) выводит на
| |
| экран строку 117, которую можно изменить и ввести заново.
| |
| | |
| Таблица 3. Примеры использования команды LIST
| |
| ┌─────────────────┬──────────────────────────────────────────────────┐
| |
| │ Формат команды │ На экран выводится │
| |
| ├─────────────────┼──────────────────────────────────────────────────┤
| |
| │ LIST │ весь текст программы │
| |
| │ LIST -110 │ часть текста программы - от начала до строки 110 │
| |
| │ LIST 125- │ часть текста программы - от строки 125 до конца │
| |
| │ LIST 115-295 │ часть текста программы - от строки 115 до строки │
| |
| │ │ 295 │
| |
| │ LIST 195 │ строка 195 │
| |
| └─────────────────┴──────────────────────────────────────────────────┘
| |
| | |
| 3.4.5. Команда DELETE
| |
| | |
| Командой DELETE можно удалить из текста программы несколько строк.
| |
| В таблице 4 приведены примеры использования команды DELETE.
| |
| | |
| Таблица 4. Примеры использования команды DELETE.
| |
| ┌─────────────────┬──────────────────────────────────────────────────┐
| |
| │ Формат команды │ Какие строки программы удаляются │
| |
| ├─────────────────┼──────────────────────────────────────────────────┤
| |
| │ DELETE │ все │
| |
| │ DELETE -55 │ от начальной строки до строки 55 (включительно) │
| |
| │ DELETE 245- │ от строки 245 до конечной строки программы │
| |
| │ DELETE 135-145 │ от строки 135 до строки 145 │
| |
| └─────────────────┴──────────────────────────────────────────────────┘
| |
| | |
| Для удаления из памяти одной строки достаточно набрать ее номер и
| |
| нажать клавишу "ВК".
| |
| | |
| 3.4.6. Команда NEW
| |
| | |
| Командой NEW удаляется из памяти вся программа, поэтому
| |
| пользоваться этой командой надо осторожно.
| |
| | |
| 3.4.7. Команда RENUM
| |
| | |
| Команда RENUM перенумеровывает строки (изменяет номера строк)
| |
| текста программы. Формат команды:
| |
| | |
| RENUM L1,L2,S
| |
| | |
| где L1 - номер первой строки перенумерованной части программы (после
| |
| перенумерации),
| |
| L2 - номер строки, с которой начинается перенумерация (до пере-
| |
| нумерации),
| |
| S - шаг перенумерации, число из интервала от 0 до 65535.
| |
| Например, команда RENUM 10,3,5 перенумеровывает строки программы,
| |
| начиная со строки 3, которой присваивается новый номер 10, а
| |
| последующие строки нумеруются с шагом 5 (то есть разность номеров двух
| |
| соседних строк будет равна 5).
| |
| | |
| 3.4.8. Команда AUTO
| |
| | |
| Команда AUTO включает режим автонумерации строк. Этот режим
| |
| избавляет программиста от необходимасти набирать номера строк
| |
| программы - процесс набора программы при этом ускоряется.
| |
| В режиме автонумерации машина печатает на экране номер каждой
| |
| следующей строки. Программисту остается набрать текст строки и нажать
| |
| клавишу "ВК". После этого машина печатает на экране номер следующей
| |
| строки, полученный прибавлением шага автонумерации к номеру предыдущей
| |
| строки.
| |
| Формат команды:
| |
| | |
| AUTO L,S
| |
| | |
| где L - номер строки, начиная с которого включится автонумерация,
| |
| S - приращение номера строки (шаг автонумерации), число из
| |
| интервала от 0 до 65535.
| |
| Например, после подачи команды AUTO 25,5 машина будет печатать
| |
| номера строк, начиная с 25. Далее номера строк увеличиваются с шагом,
| |
| равным 5.
| |
| Для выхода из режима автонумерации достаточно нажать клавишу "СТОП".
| |
| | |
| 3.5. Операторы языка Бейсик
| |
| | |
| Здесь приводятся лишь наиболее употребляемые операторы языка
| |
| Бейсик.
| |
| | |
| 3.5.1. Операторы, задающие цвет
| |
| | |
| 3.5.1.1. Оператор COLOR
| |
| | |
| БК может выводить изображение на экран черно-белого или цветного
| |
| видеомонитора (телевизора). Далее предполагается, что изображение
| |
| выводится на цветной экран.
| |
| Символы, выводимые на экран, могут быть красного, зеленого, синего
| |
| или черного цвета. Под черным цветом подразумевается цвет экрана
| |
| выключенного телевизора. Каждый цвет имеет свой номер:
| |
| 0 - цвет фона (прозрачный);
| |
| 1 - красный;
| |
| 2 - зеленый;
| |
| 3 - синий;
| |
| 4 - черный.
| |
| Оператор COLOR устанавливает цвет экрана (фона) и цвет изображения:
| |
| | |
| COLOR C,F
| |
| | |
| где С - номер цвета символов, выводимых на экран,
| |
| F - номер цвета экрана, на фоне которого будут высвечиваться
| |
| символы.
| |
| Например, после выполнения оператора COLOR 1,3 все выводимые на
| |
| экран символы будут красного цвета на синем фоне. В данном случае
| |
| текущий цвет изображения - красный, а текущий цвет фона (экрана) -
| |
| синий.
| |
| Оператор COLOR 0,1 включает красный цвет фона (цифра 1). Цвет
| |
| символа будет такой же, как и цвет фона (цифра 0), то есть красный.
| |
| Разумеется, эти символы красного цвета на красном фоне будут невидимы
| |
| (прозрачного цвета).
| |
| Номер 0 для фона означает черный цвет. Например, оператор COLOR 1,0
| |
| устанавливает исходный режим - красные буквы на черном фоне.
| |
| | |
| 3.5.1.2. Оператор CLS
| |
| | |
| Оператор CLS окрашивает весь экран в текущий цвет фона.
| |
| Если текущий цвет фона черный, то этот оператор просто очищает
| |
| экран ("окрашивает" в черный цвет).
| |
| | |
| 3.5.2. Операторы графики
| |
| | |
| Графические операторы позволяют изображать на экране точки, линии,
| |
| окружности, эллипсы, дуги. Изображения всех фигур формируются
| |
| высвечиванием (или гашением) точек в определенных строках экрана.
| |
| Местонахождение любой точки на экране определяется соответствующими
| |
| ей номером точечной позиции (координатой Х) и номером точечной строки
| |
| (координатой Y), как показано на рис. 6.
| |
| | |
| 3.5.2.1. Оператор PSET
| |
| | |
| Чтобы окрасить точку на экране в определенный цвет, применяется
| |
| оператор
| |
| | |
| PSET (X,Y),C
| |
| | |
| где Х и Y - целые выражения, задающие координаты точки;
| |
| С - целое выражение, задающее цвет точки и принимающее значение
| |
| из интервала от 0 до 4.
| |
| Пример:
| |
| | |
| 1 CLS
| |
| 2 PSET (120,120),0
| |
| 3 PSET (1,33),2
| |
| | |
| Точка с координатами (120,120) станет прозрачной (невидимой), так
| |
| как примет цвет фона, а точка (1,33) будет зеленого цвета.
| |
| | |
| 3.5.2.2. Оператор LINE
| |
| | |
| Оператор
| |
| | |
| LINE (X1,Y1)-(X2,Y2),C
| |
| | |
| рисует линию от точки с координатами (Х1,Y1) до точки с координатами
| |
| (X2,Y2). Цвет линии определяется целым выражением С. X1,Y1,X2,Y2 -
| |
| целые выражения. Пример:
| |
| | |
| 1 CLS
| |
| 2 LINE (10,15)-(210,223),3
| |
| | |
| С помощью оператора LINE можно начертить и прямоугольник. Если
| |
| стороны прямоугольника параллельны осям Х и Y, то его можно начертить,
| |
| зная расположение диагонали, которое можно задать оператором LINE.
| |
| Чтобы машина "знала", что рисовать нужно прямоугольник, а не линию
| |
| (диагональ), к списку аргументов оператора LINE приписывается буква
| |
| "В". Например, оператор LINE (12,15)-(143,147),3,B чертит
| |
| прямоугольник, стороны которого параллельны осям Х и Y, и диагональ
| |
| которого расположена между точками с координатами (12,15) и (143,147).
| |
| Стороны прямоугольника чертятся здесь синим цветом.
| |
| | |
| 3.5.2.3. Оператор CIRCLE
| |
| | |
| Оператор
| |
| | |
| CIRCLE (X,Y),R,C
| |
| | |
| рисует окружность с центром в точке с координатами (Х,Y), радиусом R.
| |
| Номер цвета окружности определяется целым выражением С. Х,Y,R - целые
| |
| выражения. Пример:
| |
| | |
| 1 CLS
| |
| 2 CIRCLE (150,150),20,1
| |
| | |
| Программа рисует окружность с центром в точке с координатами
| |
| (150,150), радиус окружности - 20 точек, цвет - красный.
| |
| Оператор
| |
| | |
| CIRCLE (X,Y),R,C,F1,F2
| |
| | |
| рисует часть окружности (дугу). Здесь F1 и F2 - арифметические
| |
| выражения, значения которых равны углам, определяющим положения
| |
| соответственно начальной и конечной точек дуги. Отсчет углов ведется в
| |
| радианах (не в градусах !). Пример:
| |
| | |
| 1 CLS
| |
| 2 CIRCLE (X,Y),20,2,1.57,3.14
| |
| | |
| С помощью оператора CIRCLE можно рисовать также эллипсы. Оператор
| |
| | |
| CIRCLE (X,Y),R,C,,,S
| |
| | |
| рисует эллипс. Отсутствие параметров F1 и F2 означает, что рисуется
| |
| целый эллипс. Арифметическое выражение S, называемое коэффициентом
| |
| сжатия, определяет отношение высоты эллипса к его ширине. Пример:
| |
| | |
| 1 CLS
| |
| 2 CIRCLE (100,100),20,1,,,0.4
| |
| | |
| Если нужно рисовать часть эллипса (дугу эллипса), то необходимо
| |
| указать параметры F1 и F2, например:
| |
| | |
| 1 CLS
| |
| 2 CIRCLE (100,100),20,1,1.57,3.14,5
| |
| | |
| 3.5.2.4. Оператор PAINT
| |
| | |
| Любую замкнутую фигуру на экране можно закрасить в определенный
| |
| цвет оператором
| |
| | |
| PAINT (X,Y),C1,C2
| |
| где (X,Y) - координаты любой точки внутри закрашиваемой области;
| |
| С1 - номер цвета закрашивания;
| |
| С2 - номер цвета границы закрашиваемой области (по умолчанию
| |
| равен С1); X,Y,С1,С2 - целые выражения.
| |
| | |
| 3.5.2.5. Оператор DRAW
| |
| | |
| Оператор DRAW позволяет изображать на экране рисунки, составленные
| |
| из прямых линий. Начиная от последней обработанной оператором графики
| |
| точки (высвеченной или погашенной), с помощью оператора DRAW можно
| |
| провести отрезок определенной длины в любом из восьми направлений. От
| |
| конца этого отрезка можно провести другой отрезок и так далее.
| |
| Команды оператора DRAW представлены на рисунке 9. Каждой команде
| |
| соответствует луч, показывающий направление черчения от текущей точки.
| |
| Все углы между лучами равны 45 градусам.
| |
| | |
| U
| |
| | |
| H │ E
| |
| │
| |
| L ────┼──── R
| |
| │
| |
| G │ F
| |
| | |
| D
| |
| | |
| Рис.9. Команды оператора DRAW
| |
| | |
| После оператора DRAW в кавычках указывается список команд с
| |
| аргументами. Например, команда U5 рисует линию от текущей (последней
| |
| обработанной оператором графики) точки вверх. Цифра 5 - аргумент,
| |
| задающий длину линии. Аргументом может быть целое число из интервала
| |
| от 0 до 32767. Пример:
| |
| | |
| 215 CLS
| |
| 220 PSET (100,100),1
| |
| 225 DRAW "R20D20L20U20"
| |
| | |
| На экране отображаются только те точки, координаты которых не
| |
| выходят за пределы экрана.
| |
| Для черчения с указанием координат используется команда М.
| |
| Например, команда М100,120 чертит линию от текущей точки до точки с
| |
| координатами (100,120). Если в этой команде перед первым аргуметом (в
| |
| данном случае, числом 100) поставить знак "+" или "-", то координаты
| |
| будут подсчитываться относительно координат текущей точки.
| |
| Имеются команды, используемые непосредственно перед перечисленными
| |
| командами, изменяющие их действие:
| |
| В - указывает, что команда должна передвигать текущую точку,
| |
| но линия при этом чертиться не будет;
| |
| N - указывает,что после выполнения команды восстанавливаются
| |
| бывшие координаты текущей точки.
| |
| Команда С с аргументом из интервала от 0 до 4 задает новый цвет
| |
| черчения.
| |
| Использование команды Х поясним на примере:
| |
| 5 CLS
| |
| 10 K$="U5R5D5L5"
| |
| 15 PSET (104,123),1
| |
| 20 DRAW"D45R70XK$;"
| |
| | |
| В строке 20 после оператора DRAW команда Х к списку команд "D45R70"
| |
| добавляет список команд, заданный в переменной К$ (в строке 10). После
| |
| имени переменной К$ обязательно ставится точка с запятой.
| |
| Здесь приводится краткое описание оператора DRAW. Более подробное
| |
| описание приводится в [5].
| |
| Еще один пример с оператором DRAW:
| |
| | |
| 5 CLS
| |
| 10 COLOR 1,3
| |
| 15 DRAW "BM70,80 R15 D25 L15 U25"
| |
| 20 DRAW "BM75,85 C2 R5 D15 L5 U15"
| |
| | |
| 3.5.2.6. Относительность координат
| |
| | |
| В операторах PSET, LINE, CIRCLE, PAINT отсчет координат точек мы
| |
| вели от точки с координатами (0,0) - от верхнего левого угла экрана.
| |
| Однако в некоторых случаях координаты, указанные в этих операторах,
| |
| удобнее подсчитывать относительно последней обработанной оператором
| |
| графики точки (текущей точки). Для этого необходимо перед указанием
| |
| координат точки поставить символ "@". Пример:
| |
| | |
| 1 CLS
| |
| 2 PSET (100,100),1
| |
| 3 PSET @(2,2),1
| |
| | |
| Программа рисует две точки: первую с координатами (100,100),
| |
| вторую с координатами (102,102).
| |
| | |
| 3.5.3. Основные операторы
| |
| | |
| 3.5.3.1. Оператор LET
| |
| | |
| Оператор LET присваивает переменной, записанной слева от знака
| |
| равенства, значение выражения, указанного справа от знака равенства.
| |
| Пример:
| |
| | |
| 1 LET X%=22
| |
| 2 LET K%=17+X%
| |
| 3 PRINT X%,K%
| |
| 4 END
| |
| | |
| Переменная Х% получает значение 22 (строка 1), а переменная К% -
| |
| значение арифметического выражения 17+Х% (строка 2). Оператор PRINT
| |
| (строка 3) выводит значения переменных Х% и К% на экран.
| |
| Слово LET в операторе присваивания писать необязательно.
| |
| Рассмотрим другой пример с оператором присваивания (слова LET далее
| |
| писать не будем):
| |
| | |
| 1 CLS
| |
| 2 А$="МА"
| |
| 3 В$="ШИНА"
| |
| 4 С$=А$+В$
| |
| 5 PRINT C$
| |
| 6 END
| |
| | |
| В строке 4 строковой переменной С$ присваивается результат
| |
| конкатенации (объединения) значений двух строковых переменных А$ и В$:
| |
| "МАШИНА".
| |
| 3.5.3.2. Оператор GOTO
| |
| | |
| Оператор безусловного перехода GOTO передает управление строке с
| |
| указанным номером:
| |
| GOTO L
| |
| | |
| где L - номер строки программы (число из интервала от 0 до 65535).
| |
| Например, после выполнения оператора GOTO 185 программа продолжает
| |
| работу со строки 185 (управление передается на строку с номером 185).
| |
| Пример:
| |
| 1 ВЕЕР
| |
| 2 GOTO 1
| |
| | |
| В строке 1 стоит оператор ВЕЕР, дающий короткий звуковой сигнал
| |
| ("бип"). Кстати, такой же сигнал издает машина при нажатии на
| |
| определенные клавиши. Эта программа будет воспроизводить звуковой
| |
| сигнал "бип" до тех пор, пока не будет нажата клавиша "СТОП".
| |
| | |
| 3.5.3.3. Оператор PRINT
| |
| | |
| Оператор PRINT предназначен для вывода на дисплей сообщений,
| |
| значений переменных и выражений. Вместо "PRINT" разрешается записывать
| |
| "?", что короче и удобнее.
| |
| За словом "PRINT" (или "?") обычно следует список выражений (любого
| |
| типа), значения которых выводятся на экран. Для разделения выражений в
| |
| списке используются запятая или точка с запятой.
| |
| Значения двух числовых выражений, разделенных точкой с запятой,
| |
| выводятся на экран через пробелы, причем один пробел ставится слева от
| |
| выводимого значения, а другой справа:
| |
| | |
| 10 X%=5
| |
| 20 PRINT X%;2/X%
| |
| | |
| Значения двух строковых выражений, разделенных точкой с запятой,
| |
| выводятся одно за другим (без пробела):
| |
| | |
| 10 А$="МА"
| |
| 20 В$="ШИНА"
| |
| 30 PRINT A$;B$
| |
| | |
| Если два выражения в списке разделены запятой, то их значения будут
| |
| выводиться на экран зонами, то есть для вывода каждого значения будет
| |
| отведено 16 символьных позиций экрана. Если значение выражения,
| |
| выводимое на экран, не помещается в одной зоне, то берется следующая
| |
| зона:
| |
| 10 X%=12
| |
| 20 PRINT X%,2^X%
| |
| | |
| Список выражений после оператора PRINT может заканчиватся точкой с
| |
| запятой или запятой - тогда следующий оператор PRINT будет выводить
| |
| данные в той же строке экрана, иначе данные будут выводиться от начала
| |
| следующей символьной строки:
| |
| | |
| 10 ? "*******";
| |
| 20 ? " BASIC ";
| |
| 30 ? "*******"
| |
| | |
| Список оператора PRINT может быть пустым - в этом случае машина
| |
| печатает пустую строку:
| |
| | |
| 10 ? "ЭВМ"
| |
| 20 ?
| |
| 30 ? "БК-0010-01"
| |
| | |
| Есть две функции оператора PRINT, позволяющие выводить информацию
| |
| в определенном месте экрана:
| |
| | |
| 10 CLS
| |
| 20 ? AT(3,17)"МИР"
| |
| | |
| В данном случае функция АТ оператора PRINT указывает, что слово
| |
| "МИР" выводится на экран начиная с 3-ей позиции 17-ой символьной
| |
| строки.
| |
| Следующая функция оператора PRINT TAB(X) выводит информацию на
| |
| экран начиная с позиции, равной значению выражения Х:
| |
| | |
| 10 CLS
| |
| 20 ? ТАВ(7)"ТАБУЛЯЦИЯ"
| |
| | |
| Слово "ТАБУЛЯЦИЯ" выводится на экран, начиная с 7-ой позиции той
| |
| строки, где находился курсор.
| |
| Аргументами функции АТ и ТАВ могут быть выражения со значениями от
| |
| 0 до 255.
| |
| Напомним, что символьные позиции экрана нумеруются от 0 до 31 слева
| |
| направо, а символьные строки - от 0 до 23 сверху вниз. Если значение
| |
| номера позиции больше 31, тогда номер позиции будет равен остатку от
| |
| деления первоначального значения на 32, то есть ТАВ(3) совпадает с
| |
| ТАВ(35), ТАВ(67) и так далее. Так же АТ(3,22) совпадает с АТ(35,22),
| |
| АТ(67,22) и так далее. Аналогичные действия происходят и со строками
| |
| (для функции АТ) - например, АТ(17,3) совпадает с АТ(17,27), АТ(17,51)
| |
| и так далее.
| |
| | |
| 3.5.3.4. Оператор INPUT
| |
| | |
| Для начала рассмотрим пример:
| |
| | |
| 1 А=126
| |
| 2 В=145
| |
| 3 ?"ПРОИЗВЕДЕНИЕ ЧИСЕЛ РАВНО:";А*В
| |
| | |
| Программа печатает результат произведения двух чисел(126 и 145). Но
| |
| программу можно переписать таким образом, что после ее запуска пользо-
| |
| ватель сам сможет выбрать произвольные значения для переменных А и В:
| |
| | |
| 1 INPUT"ВВЕДИТЕ ДВА ЧИСЛА";А,В
| |
| 2 ?"ПРОИЗВЕДЕНИЕ ЧИСЕЛ РАВНО:";А*В
| |
| После запуска этой программы на экране появится надпись:
| |
| ВВЕДИТЕ ДВА ЧИСЛА?
| |
| | |
| В ответ на это приглашение пользователь набирает на клавиатуре
| |
| числовое значение для переменной А, а затем через запятую - числовое
| |
| значение для переменной В. После этого пользователю достаточно нажать
| |
| клавишу "ВК", и программа продолжит свою работу со строки, следующей
| |
| за строкой с оператором INPUT.
| |
| В данном случае выражение "ВВЕДИТЕ ДВА ЧИСЛА" является подсказкой
| |
| пользователю. Подсказка в операторе INPUT может отсутствовать.
| |
| Например, при выполнении оператора INPUT P$,H%,E% машина в качестве
| |
| приглашения вводить значения (для переменных Р$,Н%,Е%) печатает только
| |
| знак вопроса "?". Если при вводе значений клавиша "ВК" нажата раньше
| |
| конца списка переменных, то на экране печатаются два вопросительных
| |
| знака "??", указывающие пользователю на то, что ввод значений не
| |
| закончен.
| |
| За оператором INPUT может стоять список имен переменных разного
| |
| типа. Строковые константы (для строковых переменных) можно набирать
| |
| без кавычек, если константы не содержат запятых.
| |
| Еще один пример с оператором INPUT:
| |
| | |
| 10 INPUT "ВВЕДИТЕ ПУТЬ И СКОРОСТЬ";S,V
| |
| 20 ? "ВРЕМЯ В ПУТИ = ";S/V
| |
| | |
| 3.5.3.5. Операторы FOR и NEXT
| |
| | |
| Рассмотрим конкретный пример:
| |
| | |
| 1 CLS
| |
| 2 FOR X%=1% TO 30% STEP 2%
| |
| 3 ? AT(X%,1%);"*"
| |
| 4 ? AT(X%,20%);"*"
| |
| 5 NEXT X%
| |
| | |
| Строки 2,3,4,5 составляют цикл. После запуска программа выполняется
| |
| следующим образом. Параметру цикла (переменной Х%) присваивается
| |
| значение 1 (аргумент, стоящий после знака "="), затем выполняются все
| |
| операторы, заключенные между операторами FOR и NEXT), после чего
| |
| значение параметра Х% увеличивается на шаг цикла - на число 2, стоящее
| |
| после служебного слова STEP). Если полученное значение параметра цикла
| |
| Х% больше 30 (значения, стоящего после слова ТО), то выполняются
| |
| операторы, следующие за оператором NEXT. Иначе выполнение цикла
| |
| повторяется со строки с оператором FOR.
| |
| В общем случае вместо чисел 1,30,2 (см. строку 2) в качестве
| |
| аргументов цикла могут использоваться арифметические выражения, а
| |
| вместо переменной Х% - любая другая числовая переменная.
| |
| Результаты выполнения нижеследующей и предыдущей программ одинако-
| |
| вы:
| |
| 1 CLS
| |
| 2 FOR X%=30% TO 1% STEP -2%
| |
| 3 ? AT(X%,1%);"*"
| |
| 4 ? AT(X%,20%);"*"
| |
| 5 NEXT X%
| |
| | |
| В данном примере шаг цикла равен -2. Если же шаг равен 1, то его
| |
| можно не указывать. Например:
| |
| | |
| | |
| 10 CLS
| |
| 20 FOR K%=0% TO 100%
| |
| 30 LINE (K%,100%-K%)-(100%-K%,K%),1,B
| |
| 40 NEXT K%
| |
| | |
| Возможен досрочный выход из цикла при помощи оператора GOTO, минуя
| |
| оператор NEXT. Вход в цикл, минуя оператор FOR, приводит к ошибке 1.
| |
| Циклы могут быть вложены друг в друга. Ниже приведен пример
| |
| программы, где один цикл (строки 25-55) вложен в другой (строки
| |
| 15-60):
| |
| 10 CLS
| |
| 15 FOR C=1 TO 3 'НАЧАЛО ВНЕШНЕГО ЦИКЛА
| |
| 20 ? CHR$(157);CHR$(157);
| |
| 25 FOR R=0 TO 100 STEP 5 'НАЧАЛО ВЛОЖЕННОГО ЦИКЛА
| |
| 30 CIRCLE (128,120),R,C
| |
| 35 CIRCLE (64,60),R,C
| |
| 40 CIRCLE (196,60),R,C
| |
| 45 CIRCLE (64,180),R,C
| |
| 50 CIRCLE (196,180),R,C
| |
| 55 NEXT R 'КОНЕЦ ВЛОЖЕННОГО ЦИКЛА
| |
| 60 NEXT C 'КОНЕЦ ВНЕШНЕГО ЦИКЛА
| |
| 65 END
| |
| | |
| Рекомендуется для удобства чтения программы выделять входящие в
| |
| циклы операторы отступами, но на Бейсике-БК такой текст программы все
| |
| равно подровняется к левому краю. Однако, если Вы при написании
| |
| программы на бумаге будете делать эти отступы, Ваша программа не
| |
| только будет выглядеть более культурно, но такой стиль работы
| |
| убережет Вас от возможных ошибок. Например, труднее будет перепутать
| |
| строки 55 и 60 (тогда произойдет ошибка, так как все внутренние циклы
| |
| должны полностью находиться внутри внешних циклов).
| |
| | |
| 3.5.3.6. Оператор REM
| |
| | |
| Оператор REM применяется для включения в текст программы строк
| |
| комментариев, облегчающих понимание текста программы при чтении.
| |
| Строка с оператором REM не выполняется и на работу всей программы не
| |
| влияет:
| |
| 1 REM КОРОТКИЙ СВИСТОК
| |
| 2 FOR I%=1 TO 25
| |
| 3 BEEP
| |
| 4 NEXT I%
| |
| | |
| Пояснения также можно разместить в любой строке, за любым
| |
| оператором (кроме оператора DATA), отделяя пояснительную запись от
| |
| оператора апострофом (см. предыдущий пример).
| |
| | |
| 3.5.3.7. Операторы DATA, READ, RESTORE
| |
| | |
| После оператора DATA перечисляется список данных - числовых или
| |
| строковых констант. Строковые константы в кавычках или без кавычек
| |
| (если не содержат запятых):
| |
| | |
| 10 DATA 48,16
| |
| 20 READ X%,A%,B%
| |
| 30 READ E$,K$,P%
| |
| 40 DATA 17,ПРИВЕТ,ЭВМ,23
| |
| 50 RESTORE 40
| |
| 60 READ H%,T$
| |
| | |
| В строках 10 и 40 перечислены данные - числовые и строковые
| |
| константы, значения которых присваиваются переменным, перечисленным
| |
| после операторов READ в строках 20,30 и 60.
| |
| Рассмотрим правила, по которым происходит присваивание значений
| |
| констант переменным. Представим, что есть указатель, который после
| |
| запуска программы указывает на первую константу после оператора DATA с
| |
| наименьшим номером строки. В нашем примере - это оператор DATA в
| |
| строке 10. Значит, после запуска данной программы указатель указывает
| |
| на число 48. Каждой переменной, указанной после оператора READ,
| |
| присваивается значение константы, на которую в данный момент указывает
| |
| указатель. В строке 20 переменной Х% присваивается значение 48. Затем
| |
| указатель смещается на число 16, которое будет присвоено переменной
| |
| А%. Затем указатель указывает на число 17 (после оператора DATA в
| |
| строке 40), и переменной В% будет присвоено значение 17. Таким же
| |
| образом переменной Е$ будет присвоено слово "ПРИВЕТ", переменной К$ -
| |
| слово "ЭВМ", а переменной Р% число 23.
| |
| Данные, перечисленные после операторов DATA можно читать
| |
| (присваивать переменным) повторно. Для этого применяется оператор
| |
| RESTORE. В нашем примере строка 50 RESTORE 40 возвращает указатель на
| |
| строку 40, то есть указатель будет указывать на число 17. Поэтому в
| |
| строке 60 переменной Н% будет присвоено значение 17 (которое в строке
| |
| 20 уже присваивалось переменной В%).
| |
| Переменные после выполнения программы будут иметь следующие
| |
| значения:
| |
| Х%=48%
| |
| А%=16%
| |
| В%=17%
| |
| Е$="ПРИВЕТ"
| |
| К$="ЭВМ"
| |
| Р%=23%
| |
| Н%=17%
| |
| Т$="ПРИВЕТ"
| |
| | |
| 3.5.3.8. Оператор DIM
| |
| | |
| В некоторых программах приходится работать с группой (массивом)
| |
| чисел. Но для того, чтобы работать с массивом чисел, нужно
| |
| зарезервировать (оставить) место в памяти машины для размещения этих
| |
| чисел. В таких случаях применяется оператор DIM:
| |
| | |
| 10 DIM A%(15)
| |
| 20 FOR K%=0 TO 15
| |
| 30 INPUT "ВВЕДИТЕ ЧИСЛО";A%(K%)
| |
| 40 NEXT K%
| |
| | |
| В строке 10 резервируется место в памяти для массива целых чисел с
| |
| именем А% (знак "%" указывает на то, что числа в массиве целые).
| |
| Каждый элемент (число) массива имеет свой номер (индекс). В операторе
| |
| DIM после имени массива в скобках записывается максимальный номер
| |
| элемента массива. Если учесть, что нумерация элементов массива
| |
| начинается с 0, то в нашем примере резервируется место в памяти для
| |
| 16-ти целых чисел.
| |
| Значение каждого элемента массива - переменная величина. Например,
| |
| А%(3) - это переменная, значение которой равно значению элемента с
| |
| номером 3 массива А%. Такие переменные с номерами (индексами)
| |
| называются индексированными (в отличие от простых переменных).
| |
| Значения числовых индексированных переменных сразу же после
| |
| резервирования памяти оператором DIM равны 0.
| |
| В строках 20,30 и 40 происходит заполнение массива числами.
| |
| Рассмотренный выше массив - одномерный.
| |
| В Бейсике используются также и двумерные массивы, элементы которых
| |
| имеют по два индекса. Индексы двумерного массива также записываются в
| |
| скобках и разделяются запятой. Двумерный массив можно представить в
| |
| виде таблицы, где номер строки задается первым индексом, а номер
| |
| столбца - вторым, при этом считается, что элементы массива расположены
| |
| на пересечении строк и столбцов. Пример:
| |
| | |
| 10 DIM B%(3,2)
| |
| 20 DATA 23,45,51,27,53,17,48,56,89,42,17,188
| |
| 30 FOR Y%=0 TO 3 ' ЦИКЛ ПО НОМЕРУ СТРОКИ
| |
| 40 FOR X%=0 TO 2 ' ЦИКЛ ПО НОМЕРУ СТОЛБЦА
| |
| 50 READ B%(Y%,X%)
| |
| 60 NEXT X%
| |
| 70 NEXT Y%
| |
| 80 END
| |
| | |
| В данном примере описывается и заполняется значениями двумерный
| |
| массив В%, который можно представить в виде таблицы:
| |
| ┌────────────┬────────────┬─────────────┐
| |
| │ В%(0,0)=23 │ В%(0,1)=45 │ В%(0,2)=51 │
| |
| ├────────────┼────────────┼─────────────┤
| |
| │ В%(1,0)=27 │ В%(1,1)=53 │ В%(1,2)=17 │
| |
| ├────────────┼────────────┼─────────────┤
| |
| │ В%(2,0)=48 │ В%(2,1)=56 │ В%(2,2)=89 │
| |
| ├────────────┼────────────┼─────────────┤
| |
| │ В%(3,0)=42 │ В%(3,1)=17 │ В%(3,2)=188 │
| |
| └────────────┴────────────┴─────────────┘
| |
| В качестве индекса допускается использование арифметического
| |
| выражения, принимающего значение от 0 до 255.
| |
| Оператор DIM может резервировать место в памяти также и для
| |
| строковых массивов, элементами которых являются строковые переменные,
| |
| но работает Бейсик со строковыми массивами очень медленно.
| |
| | |
| 3.5.3.9. Оператор IF
| |
| | |
| До изучения этого оператора полезно запомнить перевод с английского
| |
| следующих слов:
| |
| IF - если
| |
| THEN - то, тогда
| |
| ELSE - иначе
| |
| AND - и
| |
| OR - или
| |
| | |
| Почти в любой программе есть такие места, где необходимо проверить
| |
| выполнение какого-либо условия (истинность какого-либо высказывания).
| |
| Такие действия задаются условным оператором следующего формата:
| |
| | |
| IF B THEN O1 ELSE O2
| |
| | |
| где В - условие;
| |
| О1 и О2 - операторы.
| |
| Если условие В выполняется (если высказывание В истинно), то
| |
| выполняется оператор О1, иначе выполняется оператор О2.
| |
| Для записи условий используются операции отношения, записываемые,
| |
| почти как в математике: ">" - больше, "<" - меньше, "=" - равно, "<>"
| |
| - не равно, ">=" - больше или равно, "<=" - меньше или равно.
| |
| В качестве оператора О1 или О2 может быть любой оператор Бейсика.
| |
| Если в качестве оператора используется оператор GOTO, то слово "GOTO"
| |
| можно пропускать - например, вместо THEN GOTO 15 можно писать THEN 15.
| |
| Условный оператор может иметь и короткий формат:
| |
| | |
| IF B THEN O1
| |
| | |
| Пример:
| |
| | |
| 10 ? "ВВЕДИТЕ ДВА ПОЛОЖИТЕЛЬНЫХ ЧИСЛА"
| |
| 20 INPUT "ПЕРВОЕ ЧИСЛО";A
| |
| 30 IF A<0 THEN 20 ' КОНТРОЛЬ ПРАВИЛЬНОСТИ ВВОДА
| |
| 40 INPUT "ВТОРОЕ ЧИСЛО";B
| |
| 50 IF B<0 THEN 40 ' КОНТРОЛЬ ПРАВИЛЬНОСТИ ВВОДА
| |
| 60 IF A>B THEN M=A ELSE M=B
| |
| 70 ? "НАИБОЛЬШЕЕ ИЗ ДВУХ ЧИСЕЛ РАВНО";М
| |
| | |
| В этом примере оператор IF применяется 3 раза. В строке 30, если
| |
| высказывание А<0 истинно, управление передается на строку 20, иначе
| |
| (если высказывание А<0 ложно) программа выполняется дальше (со строки
| |
| 40). Строка 50 выполняется аналогично. В строке 60, если высказывание
| |
| А>В истинно, переменной М присваивается значение переменной А, иначе -
| |
| значение переменной В.
| |
| Если нужно проверить истинность сразу нескольких высказываний, то
| |
| на помощь приходят так называемые логические операции. Приведем два
| |
| типа логических операций, применяемых в Бейсике - OR и AND.
| |
| Представим, что есть два высказывания В1 и В2, тогда выражение В1
| |
| OR В2 рассматривается как одно высказывание, которое истинно, если
| |
| хотя бы одно из этих высказываний (В1 или В2) истинно. Высказывание В1
| |
| AND В2 истинно, если истинны одновременно оба высказывания (В1 и В2).
| |
| Пример:
| |
| | |
| 10 INPUT "ВВЕДИТЕ 3 РАЗНЫХ ЧИСЛА";A,B,C
| |
| 20 IF A>B AND A>C THEN M=A ELSE IF B>A AND B>C THEN M=B
| |
| ELSE M=C
| |
| 30 ? "НАИБОЛЬШЕЕ ИЗ 3-х ЧИСЕЛ РАВНО";M
| |
| 40 END
| |
| | |
| 3.5.3.10. Операторы GOSUB и RETURN
| |
| | |
| Если в нескольких местах программы необходимо проделаать одну и ту
| |
| же последовательность операторов, то эту последовательность выгодно
| |
| оформить в виде подпрограммы, к которой управление передается
| |
| оператором GOSUB. Возврщение из подпрограммы в основную программу
| |
| производится оператором RETURN, который возвращает управление из
| |
| подпрограммы на строку, следующую за строкой с оператором GOSUB.
| |
| Пример:
| |
| | |
| 1 CLS
| |
| 2 INPUT X%,Y%
| |
| 3 GOSUB 9
| |
| 4 INPUT X%,Y%
| |
| 5 GOSUB 9
| |
| 6 END
| |
| 9 FOR I%=10 TO 20 STEP 2
| |
| 10 CIRCLE ( X%,Y% ),I%,3
| |
| 11 NEXT I%
| |
| 12 RETURN
| |
| | |
| В строке 3 оператором GOSUB 9 управление передается на строку 9
| |
| (подпрограмме, состоящей из строк 9,10,11,12). В строке 12 оператор
| |
| RETURN производит возврат из подпрограммы (на строку 4). В строке 5
| |
| происходит повторное обращение к той же подпрограмме. Возврат из
| |
| подпрограммы произойдет на строку 6.
| |
| | |
| 3.5.3.11. Оператор ON
| |
| | |
| Формат оператора:
| |
| ON B GOTO C
| |
| где
| |
| В - целое выражение, принимающее значение из интервала от 0 до 32767;
| |
| С - список номеров существующих строк, разделенных запятыми.
| |
| Оператор ON вычисляет значение выражения В и передает управление на
| |
| строку, порядковый номер которой в списке равен вычисленному значению
| |
| выражения В. Например, если значение выражения В равно 1, то
| |
| управление будет передано на строку, номер которой в списке С стоит
| |
| первым. Пример:
| |
| | |
| 10 CLS
| |
| 20 ? "ВВЕДИТЕ ЧИСЛО:"
| |
| 30 ? "1-ПРЯМОУГОЛЬНИК"
| |
| 40 ? "2-ОКРУЖНОСТЬ"
| |
| 50 INPUT X%
| |
| 55 IF X%<>1 AND X%<>2 THEN 50
| |
| 60 ON X% GOTO 80,100
| |
| 80 LINE (100,100)-@(10,10),1,B
| |
| 90 END
| |
| 100 CIRCLE (170,170),20,1
| |
| 110 END
| |
| | |
| В строке 60 управление будет передано на строку 80 (если Х%=1) или
| |
| на строку 100 (если Х%=2).
| |
| В операторе ON вместо служебного слова GOTO возможно использование
| |
| слова GOSUB:
| |
| | |
| 10 CLS
| |
| 20 ? "ВВЕДИТЕ ЧИСЛО:"
| |
| 30 ? "1-ПРЯМОУГОЛЬНИК"
| |
| 40 ? "2-ОКРУЖНОСТЬ"
| |
| 50 INPUT X%
| |
| 55 IF X%<>1 AND X%<>2 THEN 50
| |
| 60 ON X% GOSUB 80,100
| |
| 70 END
| |
| 80 LINE ( 100,100)-@(10,10),1,B
| |
| 90 RETURN
| |
| 100 CIRCLE ( 170,170 ),20,1
| |
| 110 RETURN
| |
| | |
| 3.5.3.12. Оператор KEY
| |
| | |
| Сразу же после включения компьютера в служебной строке появляется
| |
| надпись из 10 символов: "CAGLRCCC.R". Каждый из этих символов - первый
| |
| символ оператора (или команды), для набора которого на клавиатуре
| |
| достаточно одновременно нажать клавишу "АР2" и соответствующую
| |
| цифровую клавишу. В таблице 5 указаны цифровые клавиши и
| |
| соответствующие им операторы и команды. Выражения "<СБР>" и "<ВК>"
| |
| означают соответственно очистку экрана и действия компьютера при
| |
| нажатии клавиши "ВК".
| |
| | |
| Таблица 5. Применение цифровых клавиш в качестве функциональных
| |
| ┌──────────────────┬────────────────────────────────────────────────┐
| |
| │ Цифровая клавиша │ Оператор (или команда) и действия компьютера │
| |
| ├──────────────────┼────────────────────────────────────────────────┤
| |
| │ 1 │ COLOR │
| |
| │ 2 │ AUTO │
| |
| │ 3 │ GOTO │
| |
| │ 4 │ LIST │
| |
| │ 5 │ RUN <BK> │
| |
| │ 6 │ COLOR 1,0 <BK> │
| |
| │ 7 │ CLOAD" │
| |
| │ 8 │ CONT <BK> │
| |
| │ 9 │ . <BK> │
| |
| │ 0 │ <СБР> RUN <BK> │
| |
| └──────────────────┴────────────────────────────────────────────────┘
| |
| | |
| Например, вместо того, чтобы набрать оператор COLOR по буквам,
| |
| достаточно одновременно нажать клавиши "АР2" и "1". Одновременное
| |
| нажатие клавиш "АР2" и "0" производит сброс (очистку) экрана и запуск
| |
| программы.
| |
| Текст, выводимый на экран при одновременном нажатии цифровой
| |
| клавиши и клавиши "АР2", можно изменить оператором KEY:
| |
| | |
| KEY K,O$
| |
| | |
| где К - целое выражение, задающее цифровую клавишу (число из интервала
| |
| от 1 до 10); при этом число 10 соответствует клавише "0";
| |
| О$ - строковое выражение, определяющее выводимый на экран текст.
| |
| Цифровая клавиша при нажатой клавише "АР2" рассматривается как
| |
| программируемый ключ с соответствующим номером.
| |
| Оператор использует только первые 16 символов строкового выражения
| |
| О$. Например, после выполнения оператора KEY 1,"PRINT" клавише 1 будет
| |
| соответствовать слово "PRINT".
| |
| Возможность вывода на экран целого слова (оператора, команды или
| |
| другого строкового выражения) одновременным нажатием 2-х клавиш
| |
| облегчает работу на компьютере - особенно, при составлении длинных
| |
| программ.
| |
| | |
| 3.6. Функции
| |
| | |
| 3.6.1. Числовые функции
| |
| | |
| Большинство стандартных числовых функций применяется для вычисления
| |
| элементарных математических функций. Имя функции, как правило, состоит
| |
| из 3-х букв. Например, SIN(X) вычисляет синус угла Х.
| |
| В таблице 6 приведены стандартные числовые функции (далее функции).
| |
| Аргумент каждой функции задается арифметическим выражением Х в
| |
| скобках. Функция EXP(X) вычисляет значение е=2.718282, возведенное в
| |
| степень Х. Аргумент Х задается арифметическим выражением, принимающим
| |
| значения из интервала от -88.4999999999999992 до 88.029685974121092.
| |
| Функцию LOG можно использовать для вычисления логарифма с любым
| |
| основанием. Например, десятичный логарифм числа Х равен отношению
| |
| LOG(X)/LOG(10) .
| |
| Функции FIX(X) и INT(X) вычисляют целую часть от числа X путем
| |
| отбрасывания дробной части (а не округления до ближайшего).
| |
| При одинаковых положительных значениях аргумента результаты
| |
| функций FIX и INT равны. Различия между двумя этими функциями
| |
| проявляются при отрицательных результатах - функция INT всегда
| |
| округляет результат в меньшую сторону. Проверьте это сами на примере:
| |
| | |
| 10 ? INT(8.2);FIX(8.2)
| |
| 20 ? INT(-8.2);FIX(-8.2)
| |
| | |
| Аргументом функции FRE может быть символьное или арифметическое
| |
| выражение. Если аргумент функции числовой, то ее результат - свободный
| |
| объем памяти (в байтах) для программы пользователя, а иначе результат
| |
| функции - свободный объем памяти, отведенной под символьные
| |
| переменные. Результат функции не зависит от значения аргумента:
| |
| | |
| 10 ? FRE("A")
| |
| 20 ? FRE(2)
| |
| | |
| Здесь же рассмотрим числовую функцию POINT. Результат функции
| |
| POINT(X,Y) равен номеру цвета точки с координатами Х,Y. X,Y - целые
| |
| выражения:
| |
| | |
| 10 CLS
| |
| 20 PSET (15,15),2
| |
| 30 PSET (120,120),POINT(15,15)
| |
| | |
| Точка с координатами (120,120) закрашивается в такой же цвет, в
| |
| какой закрашена точка с координатами (15,15).
| |
| Если координаты точки выходят за пределы экрана, то функция POINT
| |
| выдает значение, равное -1.
| |
| С помощью функции POINT можно определить, вычерчивалось ли
| |
| что-нибудь в указанном месте экрана.
| |
| Приведем пример программы, рисующей графики функций SIN и COS:
| |
| | |
| 5 REM графики функций синус и косинус
| |
| 10 LINE (0,100)-(200,100),1
| |
| 20 LINE (0,50)-(0,150),1
| |
| 30 FOR X%=0 TO 200
| |
| 40 Y1%=30*SIN(X%/10)+100
| |
| 50 Y2%=30*COS(X%/10)+100
| |
| 60 PSET (X%,Y1%),2
| |
| 70 PSET (X%,Y2%),3
| |
| 80 NEXT X%
| |
| Таблица 6. Числовые функции
| |
| ┌───────────────┬────────────────────────────────┬───────────────────┐
| |
| │ Обозначение │ Результат функции │ Примечание │
| |
| ├───────────────┼────────────────────────────────┼───────────────────┤
| |
| │ SQR(X) │ квадратный корень от Х │ Х>=0 │
| |
| ├───────────────┼────────────────────────────────┼───────────────────┤
| |
| │ SIN(X) │ синус Х │Значение Х задается│
| |
| ├───────────────┼────────────────────────────────┤в радианах │
| |
| │ COS(X) │ косинус Х │ │
| |
| ├───────────────┼────────────────────────────────┤ │
| |
| │ TAN(X) │ тангенс Х │ │
| |
| ├───────────────┼────────────────────────────────┼───────────────────┤
| |
| │ ATN(X) │ арктангенс Х │ Результат функции │
| |
| │ │ │ в радианах │
| |
| ├───────────────┼────────────────────────────────┼───────────────────┤
| |
| │ EXP(X) │ число е в степени Х │ е=2,718282. │
| |
| ├───────────────┼────────────────────────────────┼───────────────────┤
| |
| │ LOG(X) │ логарифм по основанию, равному │ Х>0 │
| |
| │ │ числу е(натуральный логарифм). │ │
| |
| ├───────────────┼────────────────────────────────┼───────────────────┤
| |
| │ ABS(X) │ абсолютное значение │ │
| |
| │ │ ( модуль ) Х │ │
| |
| ├───────────────┼────────────────────────────────┤ │
| |
| │ FIX(X) │ целая часть Х │ │
| |
| ├───────────────┼────────────────────────────────┤ │
| |
| │ INT(X) │ математически целая часть Х │ │
| |
| │ │ ( ближайшее целое число, │ │
| |
| │ │ меньшее или равное Х). │ │
| |
| ├───────────────┼────────────────────────────────┤ │
| |
| │ SGN(X) │ -1, если Х<0; │ │
| |
| │ │ 0, если Х=0; │ │
| |
| │ │ 1, если Х>0. │ │
| |
| ├───────────────┼────────────────────────────────┤ │
| |
| │ RND(X) │ случайное число из интервала │ │
| |
| │ │ от 0 до 1 │ │
| |
| ├───────────────┼────────────────────────────────┤ │
| |
| │ FRE(0) │ объем свободной памяти │ │
| |
| ├───────────────┼────────────────────────────────┤ │
| |
| │ FRE("") │ объем свободной памяти для │ │
| |
| │ │ строковых переменных │ │
| |
| └───────────────┴────────────────────────────────┴───────────────────┘
| |
| | |
| 3.6.2. Строковые функции
| |
| | |
| Строковые (символьные) функции служат для выполнения различных
| |
| операций над строковыми переменными и константами. Если имя строковой
| |
| функции оканчивается знаком "$", то ее результат - строковая
| |
| константа, а иначе - целое число.
| |
| Каждый символ имеет свой код - число из интервала от 0 до 255.
| |
| Например, код латинской буквы "А" равен 65. Коды символов приведены в
| |
| Приложении 1.
| |
| 3.6.2.1. Функции BIN$, OCT$, HEX$
| |
| | |
| Аргумент каждой из этих трех функций - целое выражение. Результат -
| |
| строковая константа, изображающая представление аргумента в
| |
| соответствующей системе счисления:
| |
| 10 INPUT "ВВЕДИТЕ ЦЕЛОЕ ЧИСЛО ";X%
| |
| 20 ? BIN$(X%);" -ДВОИЧНОЕ ПРЕДСТАВЛЕНИЕ"
| |
| 30 ? OCT$(X%);" -ВОСЬМЕРИЧНОЕ ПРЕДСТАВЛЕНИЕ"
| |
| 40 ? HEX$(X%);" -ШЕСТНАДЦАТЕРИЧНОЕ ПРЕДСТАВЛЕНИЕ"
| |
| 50 END
| |
| | |
| 3.6.2.2. Функции CHR$ и ASC
| |
| | |
| Аргументом функции CHR$ является целое выражение, принимающее
| |
| значение из интервала от 0 до 255. Результат функции - символ, код
| |
| которого равен аргументу функции. Если значение аргумента (целого
| |
| выражения) выходит за пределы интервала от 0 до 255, то выдается
| |
| сообщение об ошибке 5. Пример:
| |
| | |
| 10 INPUT "ВВЕДИТЕ КОД СИМВОЛА";K%
| |
| 20 IF K%>255 OR K%<=0 THEN 10
| |
| 30 ? CHR$(K%)
| |
| 40 GOTO 10
| |
| | |
| Программа печатает символ, код которого вводится в строке 10.
| |
| Используя функцию CHR$ можно включать (выключать) определенные
| |
| режимы работы компьютера:
| |
| | |
| 10 ? CHR$(&O237)
| |
| 20 ? "ПЕЧАТЬ С ПОДЧЕРКИВАНИЕМ"
| |
| 30 ? CHR$(&O237)
| |
| 40 ? "ПЕЧАТЬ БЕЗ ПОДЧЕРКИВАНИЯ"
| |
| | |
| Режим включения подчеркивания символов имеет свой восьмеричный код,
| |
| равный 237. Оператором PRINT CHR$(&O237) производится включение
| |
| (строка 10) и выключение (строка 30) режима подчеркивания символов.
| |
| Функция ASC является обратной по отношению к функции CHR$.
| |
| Аргументом функции ASC является строковое выражение. Результат
| |
| функции - код первого символа аргумента:
| |
| | |
| 10 INPUT "ВВЕДИТЕ СИМВОЛ";K$
| |
| 20 ? ASC(K$)
| |
| 30 GOTO 10
| |
| | |
| Программа выводит на экран код символа К$, введенного оператором
| |
| INPUT в строке 10.
| |
| Если аргумент - пустая строка, то при вызове функции выдается
| |
| сообщение об ошибке 5.
| |
| | |
| 3.6.2.3. Функция LEN
| |
| | |
| Аргументом функции LEN является символьное выражение. Результат
| |
| функции - длина символьного выражения (количество символов в нем):
| |
| | |
| 10 INPUT "ВВЕДИТЕ СЛОВО";A$
| |
| 20 ? "ВЫ ВВЕЛИ СЛОВО ДЛИНОЙ";LEN(A$);"СИМВОЛОВ"
| |
| | |
| 3.6.2.4. Функция STRING$
| |
| | |
| Результатом этой функции является строка, содержащая одинаковые
| |
| символы:
| |
| 10 ? STRING$(17,"+")
| |
| | |
| Эта программа печатает знак "+" 17 раз. В общем случае вместо числа
| |
| 17 может стоять целое выражение, принимающее значение от 0 до 255, а
| |
| вместо знака "+" - символьное выражение, первый символ которого
| |
| берется для создания строки, содержащей одинаковые символы.
| |
| Вместо символьного выражения можно указать код символа целым
| |
| выражением, принимающим значение от 0 до 255:
| |
| | |
| 10 INPUT"ДЛИНА СИМВОЛА";L%
| |
| 20 INPUT"КОД СИМВОЛА";K%
| |
| 40 ? STRING$(L%,K%)
| |
| 50 GOTO 10
| |
| | |
| 3.6.2.5. Функция INKEY$
| |
| | |
| Рассмотрим пример:
| |
| | |
| 10 CLS
| |
| 20 I$=INKEY$
| |
| 30 IF I$="" THEN 20
| |
| 40 ? ASC(I$)
| |
| 50 GOTO 20
| |
| | |
| Оператор I$=INKEY$ подобен оператору INPUT I$, но в отличие от
| |
| последнего не ждет ввода символа с клавиатуры (нажатия какой-либо
| |
| клавиши). Если к моменту выполнения функции клавиша не была нажата, то
| |
| результатом функции INKEY$ будет пустая строка "".
| |
| В строке 40 печатается код нажатой клавиши.
| |
| Рассмотрим пример, где с помощью функции INKEY$ организовано
| |
| управление перемещением точки:
| |
| | |
| 10 CLS
| |
| 20 X=100
| |
| 30 Y=100
| |
| 50 I$=INKEY$
| |
| 60 IF I$="" THEN 50
| |
| 70 PSET (X,Y),0
| |
| 80 IF I$=CHR$(&O31) THEN X=X+5
| |
| 90 IF I$=CHR$(&O10) THEN X=X-5
| |
| 100 IF I$=CHR$(&O32) THEN Y=Y-5
| |
| 110 IF I$=CHR$(&O33) THEN Y=Y+5
| |
| 120 PSET (X,Y),1
| |
| 130 GOTO 50
| |
| | |
| В строках 20 и 30 устанавливаются первоначальные значения координат
| |
| точки. В строках 50 и 60 переменной I$ присваивается символ, клавиша
| |
| которого будет нажата. Если нажата клавиша "курсор вправо", то
| |
| координата Х увеличивается (строка 80) - восьмеричный код клавиши
| |
| "курсор вправо" равен 31. Аналогично работают строки 90,100,110 (см.
| |
| таблицу кодов символов в приложении 1). Затем рисуется точка с новыми
| |
| координатами (строка 120). Со строки 130 управление будет передано на
| |
| строку 50. Как только будет нажата одна из клавиш управления курсором,
| |
| стирается точка, изменяется одна из координат (в зависимости от
| |
| нажатой клавиши) и точка высветится на новом месте. Точка как бы
| |
| двигается при нажатии на одну из клавиш управления курсором.
| |
| | |
| 3.6.2.6. Функции STR$ и VAL
| |
| | |
| Функция STR$ превращает значение арифметического выражения в строку
| |
| цифровых символов (строковую константу). Например, если Х=125, то
| |
| результат функции STR$(X) - строковая константа "125".
| |
| Функция VAL является обратной по отношению к функции STR$.
| |
| Аргументом этой функции является символьное выражение, а результатом -
| |
| число. Например, результат функции VAL("125") - число 125.
| |
| | |
| 3.6.2.7. Функция MID$
| |
| | |
| Результат функции - строковая константа. Формат функции:
| |
| | |
| MID$(A$,H,K)
| |
| где
| |
| А$ - строковое выражение, из которого выделяется результат функции;
| |
| Н - целое выражение, принимающее значение из интервала от 1 до 255
| |
| и задающее номер символа (в выражении А$), с которого
| |
| начинается выделение результата функции;
| |
| К - целое выражение, принимающее неотрицательное значение, и
| |
| задающее количество символов, выделяемых из выражения А$
| |
| (длина результата).
| |
| Значение Н не должно превышать длину строкового выражения А$. Если
| |
| аргумент К не указан или выходит за правую границу выражения А$, то
| |
| выделяется часть строки от символа, указанного аргументом Н, до конца
| |
| строки А$.
| |
| Пример:
| |
| 10 А$="ТРАКТОР"
| |
| 20 ? MID$(A$,5,3)
| |
| | |
| В строке 20 из слова "ТРАКТОР", начиная с 5-ого символа, выделяется
| |
| слово, состоящее из 3-х букв. Результат (слово "ТОР") выводится на
| |
| экран.
| |
| MID$ - единственная функция, которая может стоять слева от знака
| |
| равенства. При этом формат функции следующий:
| |
| | |
| MID$(A$,H,K)=P$
| |
| | |
| В этом случае часть строкового выражения А$ длиной К, начиная с
| |
| символа с номером Н, заменяется строковым выражением Р$. Пример:
| |
| | |
| 10 А$="РАКЕТА"
| |
| 20 MID$(A$,4) = STRING$(3," ")
| |
| 30 ? A$
| |
| | |
| Значение переменной А$ после преобразования в строке 20 будет равно
| |
| строковой константе "РАК " - часть слова "РАКЕТА", начиная с 4-ого
| |
| символа, заменяется тремя пробелами - результатом функции
| |
| STRING$(3," ") .
| |
| | |
| 3.6.3. Функции, определяемые пользователем
| |
| | |
| Иногда в разных местах программы нужно вычислить значение одного и
| |
| того же арифметического выражения при различных значениях переменных,
| |
| входящих в это выражение. В таких случаях рекомендуется в начале
| |
| программы с помощью оператора DEF обозначить это выражение каким-либо
| |
| именем - то есть определить новую функцию и обращться к ней по
| |
| необходимости из любого места программы.
| |
| Формат оператора следующий:
| |
| | |
| DEF FN<имя>(список)=<выражение>
| |
| где
| |
| <имя> - любое допустимое имя переменной;
| |
| список - список аргументов функции, разделенных запятыми;
| |
| <выражение> - выражение того же типа, что и <имя> - формула для
| |
| получения результата функции.
| |
| | |
| Аргументы функции назовем формальными, так как при обращении к
| |
| функции, определенной оператором DEF, они заменяются выражениями,
| |
| имеющими определенное значение.
| |
| Формат обращения к функции следующий:
| |
| | |
| Y=FN<имя>(список)
| |
| где
| |
| <имя> - имя переменной, указанное в операторе DEF;
| |
| список - список выражений, разделенных запятыми и заменяющих
| |
| формальные аргументы функции при определении ее значения.
| |
| При этом эти выражения становятся фактическими аргументами
| |
| функции.
| |
| Пример:
| |
| | |
| 10 DEF FNG(X,Y)=SQR(X*X+Y*Y)
| |
| 20 INPUT A,B
| |
| 30 G1=FNG(A,B)
| |
| 40 G2=FNG(2*A,2*B)
| |
| 50 G3=FNG(3*A,3*B)
| |
| 60 ? G1;G2;G3
| |
| | |
| В строке 10 определяется (объявляется) функция FNG(X,Y). В строках
| |
| 30,40 и 50 вычисляется значение этой функции при разных аргументах.
| |
| Значения переменных G1, G2 и G3 определяются по следующим формулам
| |
| (лишние скобки проставлены для большей наглядности):
| |
| | |
| G1=SQR(A*A+B*B),
| |
| G2=SQR((2*A)*(2*A)+(2*B)*(2*B)),
| |
| G3=SQR((3*A)*(3*A)+(3*B)*(3*B)).
| |
| | |
| 3.7. Непосредственный доступ к памяти
| |
| | |
| Целые числа в памяти машины хранятся в виде 16-разрядных двоичных
| |
| чисел. Например, десятичное число 27 хранится в виде двоичного кода
| |
| 0000000000011011.
| |
| Для записи целого числа в ОЗУ машина отводит две 8-разрядные ячейки
| |
| памяти (2 байта), образующие одно 16-разрядное слово. Рассматриваемые
| |
| здесь операторы и функции предназначены для работы с отдельными
| |
| словами памяти.
| |
| Каждая ячейка имеет свой адрес (номер). Так как одно слово
| |
| образуется из двух ячеек, то адреса слов - целые четные числа из
| |
| интервала от &O0 до &O177776 (адреса обычно пишут в восьмеричной
| |
| системе счисления).
| |
| Аргументы рассматриваемых здесь операторов и функций - целые
| |
| выражения.
| |
| | |
| 3.7.1. Оператор РОКЕ
| |
| | |
| Оператор РОКЕ А,В записывает числовое значение В в память машины по
| |
| адресу А. Если значение адреса нечетное, то оно уменьшается на 1.
| |
| Данный оператор удобно использовать при составлении подпрограмм
| |
| (или программ) в машинных кодах.
| |
| | |
| 3.7.2. Оператор OUT
| |
| | |
| Оператор OUT A,M,K позволяет обнулить или установить в "1"
| |
| определенные разряды числа, хранящегося по адресу А. Числовое значение
| |
| М, называемое маской, определяет разряды двоичного числа, которые
| |
| обнуляются (если К=0), или устанавливаются в "1" (если К не равно 0).
| |
| Пример:
| |
| | |
| 145 OUT &O7010,&B1111,0%
| |
| | |
| В этом примере оператор OUT обнуляет 4 младших разряда двоичного
| |
| числа, хранящегося по адресу &О7010.
| |
| | |
| 3.7.3. Функция РЕЕК
| |
| | |
| Результат функции РЕЕК(А) - целое число, хранящееся по адресу А.
| |
| Пример:
| |
| | |
| 10 X1=12
| |
| 20 Y1=12
| |
| 30 X=X1
| |
| 40 Y=Y1
| |
| 50 ? AT(X1,Y1);" "
| |
| 60 ? AT(X,Y);"$"
| |
| 70 X1=X
| |
| 80 Y1=Y
| |
| 90 K=PEEK(&O177662)
| |
| 100 IF K=&О10 THEN X=X-1
| |
| 110 IF K=&O31 THEN X=X+1
| |
| 120 IF K=&O32 THEN Y=Y-1
| |
| 130 IF K=&O33 THEN Y=Y+1
| |
| 140 FOR I=1 TO 200 ' ЗАДЕРЖКА ДЛЯ ЗАМЕДЛЕНИЯ
| |
| 150 NEXT I ' ДВИЖЕНИЯ
| |
| 160 GOTO 50
| |
| | |
| По адресу &О177662 хранится код последней нажатой клавиши. В строке
| |
| 90 код нажатой клавиши (результат функции РЕЕК(&О177662) )
| |
| присваивается переменной К. В зависимости от кода нажатой клавиши
| |
| определяется направление перемещения символа "$" (строки 100 - 130).
| |
| | |
| 3.7.4. Функция INP
| |
| | |
| Результат функции с форматом INP(A,M) - целое число, в двоичном
| |
| представлении которого разряды, соответствующие ненулевым двоичным
| |
| разрядам маски М, равны значениям соответствующих двоичных разрядов
| |
| числа, хранящегося по адресу А. Остальные разряды двоичного кода
| |
| результата нулевые.
| |
| | |
| 3.8. Предложения и советы программисту
| |
| | |
| Если программирование - Ваше хобби или призвание, то Вы со временем
| |
| поймете (и очень быстро), что, даже хорошо зная Бейсик, невозможно
| |
| создать эффективную программу без учета ряда особенностей той ЭВМ, на
| |
| которой Вы работаете. Можно с уверенностью перечислить все те
| |
| трудности, с которыми Вы встретитесь в процессе своей работы:
| |
| 1. Не хватает памяти на вводимую программу.
| |
| 2. Программа выполняется слишком медленно.
| |
| 3. Всего три цвета, нет операторов звукового сопровождения,
| |
| спрайтов, прокрутки экрана (рулонного сдвига), таймера,
| |
| и так далее.
| |
| Существует много способов и "хитрых" приемов в решении данных задач
| |
| на языке Бейсик.
| |
| | |
| 1. Ваша программа не помещается в памяти БК. Есть два способа
| |
| "борьбы" с такой неприятностью - или сократить программу, или
| |
| увеличить память, используемую программой.
| |
| Первый способ наиболее простой. Как сказал один из великих
| |
| программистов: "Нет такой программы, которую невозможно было бы
| |
| сократить хотя бы на одну строчку". И он же сказал: "Не сокращай на
| |
| одну строчку, сокращай сразу на пятьдесят".
| |
| Общепризнанные рецепты сокращения объема памяти, занимаемой
| |
| программой:
| |
| а) убедитесь, что лучшего алгоритма Вы уже не придумаете;
| |
| б) выделяйте одинаковые части программы в подпрограмму;
| |
| в) используйте по возможности целые переменные, для чего
| |
| дописывайте символ "%" (например, А%=5%, V%(I%)=C%, FOR I%=1% TO 100%,
| |
| и так далее) - переменные целого типа занимают в памяти места в 4 раза
| |
| меньше, чем переменные двойной точности. При этом необходимо помнить,
| |
| что сам символ "%" занимает в памяти 1 байт - поэтому, если имя
| |
| переменной встречается в программе часто, то такой прием может
| |
| привести к обратному эффекту (увеличению объема программы);
| |
| г) и последний отчаянный шаг - это сокращенное написание служебных
| |
| слов операторов IF и FOR. Ниже приведены эти служебные слова; справа
| |
| от каждого слова - его допустимое сокращение в листинге программы:
| |
| | |
| THEN - TH
| |
| ELSE - EL
| |
| STEP - ST
| |
| | |
| Если и теперь Ваша программа не умещается в отведенной области ОЗУ,
| |
| то Вы можете увеличить объем памяти, используемой программой -
| |
| включить режим расширенной памяти (режим "РП"). При этом объем рабочей
| |
| области ОЗУ увеличивается с 16К до 28К за счет уменьшения объема ОЗУ
| |
| экрана. В нормальном режиме ОЗУ экрана занимает адресное пространство
| |
| от 40000 до 77777. После включения режима "РП" объем ОЗУ экрана
| |
| уменьшится с 16К до 4К - на экране будут отображаться только служебная
| |
| строка и 4 информационные строки. Включить режим "РП" можно
| |
| одновременным нажатием клавиш "АР2" и "СБР" или оператором
| |
| PRINT CHR$(140).
| |
| ОЗУ экрана можно также использовать для размещения данных
| |
| (организации массивов). При этом, правда, придется пожертвовать
| |
| красотой части экрана. Ниже приводится пример записи 200 случайных
| |
| чисел в область ОЗУ, отведенную для хранения "изображения" служебной
| |
| строки (строки 10-40). Строки 100-160 производят вывод этих чисел на
| |
| экран - при этом экран не должен "сдвигаться" вверх (для чего
| |
| применена функция AT оператора PRINT), и не должно быть изменения
| |
| изображения служебной строки (например, достаточно переключения
| |
| регистров "РУС" и "ЛАТ", чтобы испортить содержимое массива).
| |
| | |
| 10 ? CHR$(140)CHR$(140)
| |
| 20 FOR I%=0 TO 199
| |
| 30 POKE &O40000+2*I%, RND(1)*99+1
| |
| 40 NEXT I%
| |
| . . . . . . . . . . . . . . . . .
| |
| . . . . . . . . . . . . . . . . .
| |
| 100 FOR K%=0 TO 199
| |
| 110 ? AT(X,Y)PEEK(&O40000+2*K%)
| |
| 120 Y=Y+1
| |
| 130 IF Y<23 THEN 160
| |
| 140 X=X+3
| |
| 150 Y=0
| |
| 160 NEXT K%
| |
| | |
| Аналогично можно размещать значения любых целочисленных переменных
| |
| в любой области экрана, заранее предусмотрев невозможность наложения
| |
| текстовой или графической информации на полученную картину данной
| |
| области ОЗУ. Следует иметь в виду, что в памяти, выделенной для одной
| |
| точечной строки, можно разместить 32 целых числа (например, в области
| |
| ОЗУ, отведенной для хранения "изображения" служебной строки, можно
| |
| разместить 512 целых чисел).
| |
| Рассмотрим еще один пример использования ОЗУ экрана для размещения
| |
| данных:
| |
| | |
| 10 INPUT "КОЛИЧЕСТВО ИНФОРМАЦИОННЫХ СТРОК(18-23)";N
| |
| 20 ? CHR$(140)CHR$(140)
| |
| 30 FOR I%=0 TO 149 ' запись 150 целых чисел в ОЗУ экрана
| |
| 40 POKE &O42000+N*640+2*I%, RND(1)*99+1
| |
| 50 NEXT I%
| |
| . . . . . . . . . . . . . . . . . . . .
| |
| . . . . . . . . . . . . . . . . . . . .
| |
| 160 FOR I%=0 TO 149 ' считывание чисел из ОЗУ экрана
| |
| 170 ? AT(X,Y)PEEK(&O42000+N*640+2*I%)
| |
| 180 Y=Y+1
| |
| 190 IF Y<18 THEN 220
| |
| 200 X=X+3
| |
| 210 Y=0
| |
| 220 NEXT I%
| |
| | |
| В строке 10 задается количество информационных строк экрана,
| |
| используемых программой (каждая строка занимает 640 байт).
| |
| В строке 20 производится включение и выключение режима "РП", что
| |
| нужно для того, чтобы настроить начало информационной части экрана на
| |
| адрес 42000. Во время выполнения этой программы экран также не должен
| |
| "сдвигаться" вверх.
| |
| Разумеется, все сказанное здесь не исчерпывает весь арсенал
| |
| способов экономии памяти.
| |
| | |
| 2. Первый вопрос мы успешно решили и Ваша программа благополучно
| |
| заняла свое место в БК. Теперь нужно ее заставить быстро работать.
| |
| Понятие быстро/медленно - относительно, поэтому будем считать, что
| |
| если Ваша программа работает почти как программа в машинных кодах, то
| |
| это быстро, иначе - медленно.
| |
| Для увеличения скорости работы программы очень важно знать скорость
| |
| выполнения каждого оператора и делать так, чтобы в циклах, особенно
| |
| вложенных, находились самые "быстрые" операторы и операнды.
| |
| В таблице 7 приводится сравнение быстродействия некоторых
| |
| операторов (время выполнения каждого оператора в микросекундах) и
| |
| объем памяти, используемой каждым оператором в байтах.
| |
| | |
| Таблица 7 . Сравнение быстродействия операторов
| |
| ┌───────────────┬───────┬───────┐┌──────────────────┬───────┬───────┐
| |
| │ │время, │память,││ │время, │память,│
| |
| │ ОПЕРАЦИЯ │ мкс │ байт ││ ОПЕРАЦИЯ │ мкс │ байт │
| |
| ├───────────────┼───────┼───────┤├──────────────────┼───────┼───────┤
| |
| │ P=22+33 │ 950 │ 52 ││ P%=22%+11% │ 82 │ 36 │
| |
| │ P=22-33 │ 950 │ 52 ││ P%=22%-33% │ 82 │ 36 │
| |
| │ P=2*3 │ 7360 │ 52 ││ P%=2%*3% │ 328 │ 36 │
| |
| │ P=A*B │ 7360 │ 52 ││ P%=A%*B% │ 328 │ 36 │
| |
| │ P=8/2 │ 9631 │ 52 ││ P%=8%/2% │ 7032 │ 42 │
| |
| │ P=2^3 │ 94837 │ 52 ││ P%=2%^3% │ 4788 │ 40 │
| |
| │ P=TAN(3.14) │190166 │ 44 ││ P=SIN(3.14) │ 90897 │ 44 │
| |
| │ P=SQR(3) │ 28200 │ 42 ││ P=SQR(3%) │ 28200 │ 38 │
| |
| │ P=A │ 600 │ 36 ││ P%=A% │ 55 │ 28 │
| |
| │ V(1)=10 │ 574 │ 140 ││ V%(1%)=10 │ 274 │ 64 │
| |
| │ POKE 16384%,1%│ 55 │ 26 ││ PEEK(16384%) │ 55 │ 26 │
| |
| │ PSET (10%,10%)│ 629 │ 28 ││ PSET (10%,10%),1%│ 1368 │ 40 │
| |
| │ COLOR 1% │ 739 │ 16 ││ P=RND(1) │ 684 │ 42 │
| |
| └───────────────┴───────┴───────┘└──────────────────┴───────┴───────┘
| |
| | |
| Если алгоритм Вашей программы построен рационально, то, используя
| |
| таблицу 7 и правила "хорошего тона" в программировании, Вы сможете
| |
| увеличить скорость выполнения программы как минимум на порядок (в 10
| |
| раз). К правилам "хорошего тона" относятся:
| |
| а) везде, где можно (и где есть смысл), используйте переменные
| |
| целого типа. Это всегда увеличивает скорость и экономит память;
| |
| б) старайтесь всегда по возможности заменять возведение в степень
| |
| произведением; например: A^2 на A*A , C^3 на C*C*C;
| |
| в) как можно реже пользуйтесь оператором PRINT. Старайтесь одним
| |
| оператором PRINT вывести всю нужную информацию; например:
| |
| ? AT(1%,9%)"V="V%" Z="Z" Y="Y ;
| |
| г) запоминайте одномерные массивы через операторы POKE - PEEK, как
| |
| делалось в двух предыдущих примерах;
| |
| д) если вам нужно многократно использовать тригонометрическую
| |
| функцию (а они работают ужасно медленно!), то в самом начале программы
| |
| в цикле запишите в массив значения Y=f(X). Например:
| |
| | |
| 10 DIM V(90%)
| |
| 20 FOR I%=0% TO 90% ' углы от 0 до 90 градусов
| |
| 30 V(I%)=SIN(I%/57.3) ' перевод град. в радианы
| |
| 40 NEXT I%
| |
| | |
| Теперь в программе для I%=от 0 до 90 град. значение синуса можно
| |
| вывести из массива в 100 раз быстрее. Аналогичную операцию Вы сможете
| |
| проделать с любой функцией.
| |
| | |
| 3. Ниже описываются небольшие программы, имеющие практическую
| |
| ценность в смысле раскрытия потенциальных возможностей БК. Авторы
| |
| рекомендуют Вам поэкспериментировать с ними, поэтому ограничатся
| |
| только их листингом.
| |
| А. Сброс служебной строки
| |
| | |
| 10 ? CHR$(148%)CHR$(158%)CHR$(140%)CHR$(140%)CHR$(145%)
| |
| | |
| Б. Рулонный сдвиг экрана (прокрутка)
| |
| | |
| 10 REM ПРОКРУТКА ВВЕРХ
| |
| 20 X%=PEEK(&O177664)
| |
| 30 FOR I%=X% TO 255%+X%
| |
| 40 POKE &O177664,I%
| |
| 50 A=4/2 ' ПАУЗА
| |
| 60 NEXT I%
| |
| | |
| Для включения прокрутки экрана вниз достаточно исправить строку 30:
| |
| | |
| 30 FOR I%=X%+255% TO X% ST -1%
| |
| | |
| В. Звук различной высоты и длительности
| |
| | |
| 10 FOR I%=0% TO 1000%
| |
| 20 POKE &O177716,0%
| |
| 30 POKE &O177716,64%
| |
| 40 X=2*2 ' ПАУЗА
| |
| 50 NEXT I%
| |
| | |
| Заменив 1000% на другое число, Вы измените длительность звука, а
| |
| изменив длительность паузы - высоту звука.
| |
| | |
| | |
| Г. Работа с таймером
| |
| | |
| Подробное описние таймера (счетчика времени) БК с интересными
| |
| примерами приводится в [6] и [12]. Здесь лишь приведем простейший
| |
| пример работы с ним и порекомендуем читателю поэкспериментировать, так
| |
| как в БК разных заводов таймер может работать по-разному. Посмотрите,
| |
| что получится, если вместо &O160 записать 0, &O20, &O60, &O120 и как
| |
| зависит период Т от начального значения S0 (рис.10):
| |
| | |
| 10 POKE &O177706,32767% 'установка длительности периода S0
| |
| 20 POKE &O177712,&O160 'запуск таймера
| |
| 30 ? AT(0,0)PEEK(&O177710) 'смотрим, как он работает
| |
| 40 GOTO 30
| |
| | |
| содержимое счетчика
| |
| S0 ─┤
| |
| │
| |
| │
| |
| │
| |
| │
| |
| │
| |
| │ время
| |
| 0 └──────────────┬──────────────┬──────────────┬────────
| |
| T 2*T 3*T c
| |
| | |
| Рис.10. Иллюстрация работы таймера.
| |
| Таймер работает независимо от работы программы. Содержимое счетчика
| |
| времени определяется как результат функции PEEK(&O177710) и
| |
| периодически уменьшается от S0 до 0 (рис.10).
| |
| В приведенном примере при S0=32767 период счетчика Т=89,657 с [6].
| |
| | |
| Д. Чтение кодов клавиатуры
| |
| | |
| Чтение кода последней нажатой клавиши производится оператором:
| |
| | |
| P%=PEEK(&O177662)
| |
| | |
| В следующем примере при нажатии на определенную клавишу выдается ее
| |
| код:
| |
| 10 POKE &O177660,&O100 'запрещение прерывания от клавиатуры
| |
| 20 IF INP(&O177660,&O200)=0 THEN 20 'если клавиши отжаты, ждать
| |
| 30 ? PEEK(&O177662) 'вывод кода клавиши на экран
| |
| 40 GOTO 20
| |
| | |
| Е. Запись символов в служебной строке.
| |
| | |
| 10 ? CHR$(140)CHR$(140)
| |
| 20 POKE &O160,&O40000
| |
| 30 ? "ТЕКСТ"
| |
| | |
| Здесь же скажем несколько слов о том, как облегчить работу на
| |
| клавиатуре. Прежде всего рекомендуем набирать оператор (или команду)
| |
| не полностью, а только несколько (2 - 4) первых символов. Например, в
| |
| операторе ввода вместо слова INPUT достаточно набрать IN. По команде
| |
| LIST операторы выводятся на экран полностью. Ниже в алфавитном порядке
| |
| приведены некоторые операторы и команды Бейсика. Скобками
| |
| ограничивается та часть оператора, которую при наборе программы писать
| |
| необязательно.
| |
| | |
| AU(TO) DI(M) PA(INT)
| |
| BE(EP) DR(AW) PO(KE)
| |
| BL(OAD) FO(R) PRI(NT)
| |
| BS(AVE) GOS(UB) PS(ET)
| |
| CI(RCLE) IN(PUT) REA(D)
| |
| CLE(AR) KE(Y) REN(UM)
| |
| COL(OR) LIN(E) RES(TORE)
| |
| CS(AVE) MO(NIT) RET(URN)
| |
| DA(TA) NEX(T) ST(OP)
| |
| DEL(ETE) OU(T)
| |
| | |
| Полезно также помнить, что при наборе программы необязательно
| |
| ставить пробелы между номером строки и оператором, а также между
| |
| оператором и аргументами. Например, вместо строки
| |
| 145 FOR X=1 TO 25
| |
| можно писать
| |
| 145FORX=1 TO 25
| |
| По команде LIST машина выводит на экран строки программы,
| |
| расставляя слева и справа от каждого оператора по одному пробелу
| |
| (независимо от того, как они были набраны пользователем).
| |
| | |
| 3.9. Примеры программ на языке Бейсик
| |
| | |
| Приводимые здесь тексты (листинги) игровых программ на языке Бейсик
| |
| являются примерами практического применения рассмотренных операторов.
| |
| | |
| Пример 1:
| |
| | |
| 5 REM УГАДАЙ ЧИСЛО
| |
| 10 CLS
| |
| 15 ? "Нажми любую клавишу, и я задумаю число от 0 до 100"
| |
| 20 X%=RND(1)*100%'Начальная установка генератора случайных чисел
| |
| 30 IF INKEY$="" THEN 20
| |
| 40 N%=0% 'счетчик числа попыток
| |
| 50 INPUT "Угадай, какое число я задумала"; A%
| |
| 55 N%=N%+1%
| |
| 60 IF A%=X% THEN 90
| |
| 70 IF A%>X% THEN ?"Много !" ELSE ?"Мало !"
| |
| 80 GOTO 50
| |
| 90 IF N%<7% THEN ?"Тебе очень повезло !"
| |
| 100 IF N%=7% THEN ?"Точно. Молодец !"
| |
| 110 IF N%>7% THEN ?"Тебе надо еще потренироваться !"
| |
| | |
| В игре "Угадай число" игроку предлагается угадать число,
| |
| "задуманное" машиной.
| |
| В Бейсике БК отсутствует оператор RANDOMIZE, который есть в других
| |
| Бейсиках (он настраивает функцию RND на новую последовательность
| |
| "случайных" чисел). Однако заменить отсутствующий в данной версии
| |
| Бейсика оператор можно последовательностью других операторов -
| |
| например, так, как это сделано в строках 15-30.
| |
| | |
| Пример 2:
| |
| | |
| 10 REM МАКСИТ
| |
| 20 CLS
| |
| 30 DIM A%(6,6)
| |
| 40 INPUT "Имя 1-го игрока";L$
| |
| 50 INPUT "Имя 2-го игрока";R$
| |
| 60 R%=RND(-LEN(L$+R$)) 'RANDOMIZE
| |
| 70 CLS
| |
| 80 FOR Y=1 TO 6
| |
| 90 ? AT(0,2*Y);Y
| |
| 100 FOR X=1 TO 6
| |
| 110 A%(X,Y)=RND(1)*99+1
| |
| 120 S%=S%+A%(X,Y)
| |
| 130 ? AT(4*X-1,2*Y);A%(X,Y)
| |
| 140 NEXT X
| |
| 150 NEXT Y
| |
| 160 ? AT(0,0);" 1 2 3 4 5 6"
| |
| 170 DRAW "BM20,145 U133 R205"
| |
| 180 N=0
| |
| 190 Y=1
| |
| 200 ? AT(0,16);L$;", введите номер столбца "
| |
| 210 INPUT X
| |
| 220 IF X<1 OR X>6 THEN 200
| |
| 230 IF N=0 THEN 250
| |
| 240 ? AT(4*X1,2*Y);"--"
| |
| 250 Y1=Y
| |
| 260 L%=L%+A%(X,Y) 'Очки 1-го игрока
| |
| 270 A%(X,Y)=0
| |
| 280 ? AT(4*X,2*Y);CHR$(173);CHR$(179)
| |
| 290 ? AT(0,16);R$;", введите номер строки "
| |
| 300 INPUT Y
| |
| 310 IF Y<1 OR Y>6 THEN 290
| |
| 320 ? AT(4*X,2*Y1);"--"
| |
| 330 X1=X
| |
| 340 R%=R%+A%(X,Y) 'Очки 2-го игрока
| |
| 350 A%(X,Y)=0
| |
| 360 ? AT(4*X,2*Y);CHR$(177);CHR$(190)
| |
| 370 N=1
| |
| 380 ? AT(0,20);"очки: ";L%;" очки: ";R%
| |
| 390 IF L%+R%=S% THEN END ELSE 200
| |
| | |
| Максит - известная игра для двух игроков. В начале игры на экране
| |
| видны 6 строк чисел (номера строк проставлены в левой части экрана).
| |
| Эти же числа образуют 6 столбцов (номера столбцов указаны в верхней
| |
| части экрана). Игра начинается в первой строке чисел - первый игрок
| |
| выбирает столбец - точнее, число, расположенное на пересечении
| |
| выбранного столбца и текущей (первой) строки. Затем второй игрок в
| |
| столбце, выбранном первым игроком, выбирает строку - точнее, число,
| |
| расположенное на пересечении выбранной строки и текущего столбца.
| |
| Теперь в выбранной (текущей) строке первый игрок выбирает столбец и
| |
| так далее. Выбранное число увеличивает очки игрока.
| |
| | |
| Пример 3:
| |
| | |
| 10 REM ХАНОЙСКАЯ БАШНЯ
| |
| 20 CLS
| |
| 30 DIM S(3),X(3)
| |
| 40 S(1)=&O30002
| |
| 50 S(2)=&O30036
| |
| 60 S(3)=&O30056
| |
| 70 FOR I=&O30002 TO &O30016 STEP 2
| |
| 80 POKE I,(I-&O30000)/2
| |
| 90 NEXT I
| |
| 100 POKE &O30036,7
| |
| 110 POKE &O30056,7
| |
| 120 X(1)=50
| |
| 130 X(2)=130
| |
| 140 X(3)=210
| |
| 150 P=0
| |
| 160 INPUT "СКОЛЬКО КОЛЕЦ (2-6)";N
| |
| 170 CLS
| |
| 180 FOR K=1 TO N 'Рисуются кольца
| |
| 190 LINE (50-5*K,96+4*K)-(50+5*K,96+4*K)
| |
| 200 NEXT K
| |
| 210 LINE (10,124)-(250,124)
| |
| 220 FOR J=1 TO 3 'Рисуются 3 стержня
| |
| 230 LINE (X(J),97)-(X(J),124)
| |
| 240 NEXT J
| |
| 250 ? AT(1,17);"ОТКУДА,КУДА"
| |
| 260 INPUT FROM,TO
| |
| 270 IF FROM=TO THEN 400 'Выход из игры
| |
| 280 X1=PEEK(S(FROM))
| |
| 290 X2=PEEK(S(TO))
| |
| 300 IF X1=>X2 THEN 250
| |
| 310 S(TO)=S(TO)-2
| |
| 320 POKE S(TO),X1
| |
| 330 S(FROM)=S(FROM)+2
| |
| 340 Y=96+4*X1
| |
| 350 LINE (X(FROM)-5*X1,Y)-(X(FROM)+5*X1,Y),0 'Снятие кольца
| |
| 360 LINE (X(FROM),97)-(X(FROM),124)
| |
| 370 LINE (X(TO)-5*X1,Y)-(X(TO)+5*X1,Y) 'Укладывание кольца
| |
| 380 P=P+1
| |
| 390 GOTO 250
| |
| 400 ? "СДЕЛАНО ХОДОВ";P
| |
| 410 END
| |
| | |
| Ханойская башня - популярная логическая игра. Правила игры просты.
| |
| Имеются 3 вертикальных стержня - левый, промежуточный и правый. На
| |
| левый стержень нанизаны кольца. Требуется перенести все кольца на
| |
| правый стержень, чтобы в конце игры они были расположены так же, как
| |
| первоначально на левом. За одно действие можно переносить только одно
| |
| кольцо. Любое кольцо можно укладывать либо на большее кольцо, либо на
| |
| свободный стержень. Количество колец задается в начале игры.
| |
| | |
| Пример 4:
| |
| | |
| 10 CLS
| |
| 20 O=0
| |
| 30 DIM A$(30),B$(20),C$(20)
| |
| 40 DATA БЛОК,БАНК,ВАЛ,ВОДА,ДРУГ,ВЕСНА,ВЕТЕР,ГУЛ,ДЕНЬ,ДОМ
| |
| 50 DATA ЗЕМЛЯ,ИВА,КОТ,КИТ,КОНЬ,ЛЕТО,ЛИСТ,МИР,МОРЕ,ОСЕНЬ
| |
| 60 DATA ПИР,РОСТ,РЕКА,САД,СЫР,СНЕГ,ХЛЕБ,ЦЕЛЬ,ШАР,ЮЛА
| |
| 80 INPUT "КОЛИЧЕСТВО СЛОВ(1-20)";N
| |
| 90 FOR I=1 TO 30
| |
| 100 READ A$(I)
| |
| 110 NEXT I
| |
| 120 FOR K=1 TO N
| |
| 130 P%=RND(3)*31+1
| |
| 140 B$(K)=A$(P%)
| |
| 150 ? B$(K)
| |
| 160 NEXT K
| |
| 170 FOR P=1 TO 1500
| |
| 180 NEXT P
| |
| 190 CLS
| |
| 200 ? "ВВЕДИТЕ ЭТИ ЖЕ СЛОВА"
| |
| 210 FOR J=1 TO N
| |
| 220 INPUT C$(J)
| |
| 230 IF C$(J)<>B$(J) THEN O=O+1
| |
| 240 NEXT J
| |
| 250 IF O=0 THEN ? "ВЫ БЕЗОШИБОЧНО НАБРАЛИ ВСЕ СЛОВА"
| |
| ELSE ? "ВЫ ДОПУСТИЛИ ОШИБОК:";O
| |
| 260 END
| |
| | |
| На экран выводятся несколько слов (их количество задается в начале
| |
| игры). Через определенное время экран очищается , и игрок по памяти
| |
| вводит эти же слова и в такой же последовательности. Игра развивает
| |
| память игрока.
| |
| | |
| Пример 5:
| |
| | |
| 10 CLS
| |
| 20 COLOR 3,0
| |
| 30 FOR I=1 TO 3 'РИСУЮТСЯ ЗМЕИ
| |
| 40 GOSUB 360
| |
| 50 PSET (XR%,YR%),1
| |
| 60 DRAW "C1 R47 D1 L47 D1 R47 D1 L47 D1 R47 D1 L47 D1 R47 D1 L47 D1
| |
| R47 D1 L47"
| |
| 70 NEXT I
| |
| 80 N=0
| |
| 90 O=0
| |
| 100 GOSUB 360
| |
| 110 LINE (XR%+3,YR%+4)-(XR%+4,YR%+5),2,B 'РИСУЕТСЯ МУХА
| |
| 120 IF N=1 THEN 160
| |
| 130 GOSUB 360
| |
| 140 X%=XR%
| |
| 150 Y%=YR%
| |
| 160 PSET (X%,Y%),2
| |
| 170 DRAW "C2 R7 D1 L7 D1 R7 D1 L7 D1 R7 D1 L7 D1 R7 D1 L7 D1 R7 D1 L7"
| |
| 180 IF N=0 THEN 210
| |
| 190 PSET (X1%,Y1%),0
| |
| 200 DRAW "C0 R7 D1 L7 D1 R7 D1 L7 D1 R7 D1 L7 D1 R7 D1 L7 D1 R7 D1 L7"
| |
| 210 N=1
| |
| 220 X1%=X%
| |
| 230 Y1%=Y%
| |
| 240 K=PEEK(&O177662)
| |
| 250 IF K=8 THEN X%=X%-8
| |
| 260 IF K=25 THEN X%=X%+8
| |
| 270 IF K=26 THEN Y%=Y%-10
| |
| 280 IF K=27 THEN Y%=Y%+10
| |
| 290 IF K<>8 AND (K<25 OR K>27) THEN 240
| |
| 300 IF POINT(X%,Y%)=1 THEN END
| |
| 310 IF POINT(X%+3,Y%+4)<>2 THEN 160
| |
| 320 LINE (X%+3,Y%+4)-(X%+4,Y%+5),0,B
| |
| 330 O=O+1
| |
| 340 ? AT(0,22);"ОЧКИ:";O
| |
| 350 GOTO 100
| |
| 360 XR%=RND(1)*200
| |
| 370 YR%=RND(1)*200
| |
| 380 XR%=XR%-XR%MOD8
| |
| 390 YR%=YR%-YR%MOD10
| |
| 400 IF POINT(XR%+3,YR%+4)<>4 THEN 360
| |
| 410 RETURN
| |
| | |
| В этой игре на экране постоянно отображаются три "змеи", "лягушка"
| |
| и "муха". Игрок, нажимая на клавиши управления курсором, перемещает по
| |
| экрану "лягушку", ловящую "муху". Игра заканчивается при столкновении
| |
| "лягушки" со "змеей".
| |
| | |
| 3.10. Сообщения об ошибках
| |
| | |
| После запуска программы на Бейсике машина, обнаружив ошибку в
| |
| какой-либо строке, выдает сообщение в следующем формате:
| |
| | |
| ОШИБКА ХХХ В СТРОКЕ ННННН
| |
| где
| |
| ХХХ - код ошибки;
| |
| ННННН - номер строки, содержащей ошибку.
| |
| Ниже приводятся коды ошибок и их описания:
| |
| 1 - вход в цикл не через оператор FOR, или переменная,
| |
| использованная в FOR, не соответствует переменной,
| |
| использованной в NEXT.
| |
| 2 - синтаксическая ошибка: неправильная запись операторов,
| |
| неправильное использование символов (скобок, запятых и
| |
| других символов).
| |
| 3 - оператор RETURN был обнаружен без выполнения GOSUB.
| |
| 4 - при выполнении оператора READ обнаружено, что список
| |
| оператора DATA исчерпан.
| |
| 5 - значение аргумента оператора (или функции) выходит за
| |
| пределы допустимого интервала. Неправильная запись команд
| |
| оператора DRAW.
| |
| 6 - результат арифметической операции не может быть записан
| |
| в формате, принятом для чисел в Бейсике.
| |
| 7 - переполнение памяти: не хватает места в памяти для программы
| |
| (или для размещения переменных).
| |
| 8 - в операторе перехода используется номер несуществующей
| |
| строки.
| |
| 9 - неправильно указаны индексы элементов массива.
| |
| 10 - попытка повторного определения массива.
| |
| 11 - деление на нуль или возведение нуля в отрицательную степень.
| |
| 12 - использование команды в тексте программы.
| |
| 13 - неправильное использование типов данных. Например, попытка
| |
| присвоить строковой переменной числовое значение.
| |
| 14 - в памяти не хватает места строковым переменным.
| |
| 15 - попытка создать строку длиной более 255 символов.
| |
| 17 - продолжение выполнения программы невозможно.
| |
| 18 - неопределена функция пользователя оператором DEF.
| |
| 19 - ошибка устройства ввода/вывода.
| |
| 24 - в выражении отсутствует операнд (число или переменная).
| |
| | |
| </pre>
| |
|
| |
|
| [[Категория:Программирование на БК-0010-01]] | | [[Категория:Программирование на БК-0010-01]] |