Приложение В Транслятор Turbo Basic

advertisement
Министерство образования и науки Республики Казахстан
Павлодарский государственный университет им. С. Торайгырова
Кафедра Электрические станции и автоматизация энергосистем
Программирование
в среде
TURBO BASIC
Учебное пособие
Павлодар
УДК 681.3.06(075.8)
ББК 32.973.26 – 018я73
Б83
Рекомендовано ученым Советом ПГУ им. С. Торайгырова
Рецензенты:
к. т. н., доцент Зайцева Н. М., университет "Кайнар"
к. т. н., доцент Кургузов Н. Н., ПГУ им. С. Торайгырова
Бороденко В. А.
Программирование в среде Turbo Basic. Учебное пособие. –
Павлодар, Изд-во ПГУ, 2003. – 83 с.
Учебное пособие предназначено для использования в процессе
изучения информатики и основ программирования, оно может
служить справочником для практического создания на ЭВМ простых
приложений. Пособие описывает основные операторы и функции
языка Turbo Basic, особенности работы с редактором языка и
операционной системой DOS. Оно может быть полезно как студентам
всех специальностей или преподавателям, так и работникам науки и
производства.
© Бороденко В. А., 2003
© Павлодарский государственный университет, 2003
2
Содержание
Введение
5
1 Общие определения
6
2 Структура программы в Турбо Бейсике
10
2.1 Структура программы
10
2.2 Данные – константы и переменные
11
2.3 Вывод текста на экран
13
2.4 Ввод данных с клавиатуры
16
2.5 Меню
17
3 Операции в ТБ
18
3.1 Операции арифметические
19
3.2 Операции отношений
20
3.3 Операции логические (булевы)
21
3.4 Операции функциональные (встроенные функции)
21
3.5 Операции строковые
23
4 Управляющие структуры
24
4.1 Передача управления
24
4.2 Циклы
27
4.3 Типовые алгоритмы
30
5 Массивы
30
5.1 Описание массива
30
5.2 Работа с матрицами
32
5.3 Поиск и сортировка
34
6 Программные модули
35
6.1 Подпрограммы
35
6.2 Внешние функции
36
3
6.3 Процедуры
37
7 Работа с изображением
38
7.1 Графические операторы
38
7.2 Макрокоманда DRAW
41
7.3 Построение графиков
42
8 Считывание данных
46
8.1 Ввод данных из программы
46
8.2 Ввод данных с экрана
46
9 Работа с памятью и системными переменными
48
10 Обработка ошибок
49
11 Взаимодействие с DOS
49
12 Работа с файлами данных
51
12.1 Файлы последовательного доступа
51
12.2 Файлы параллельного доступа
53
12.3 Двоичные файлы
55
13 Управление звуком
57
14 Команды компиляции
58
Литература
59
Приложение А Программирование в DOS
60
Приложение Б Представление и хранение данных
66
Приложение В Транслятор Turbo Basic
71
Приложение Г Редактор Turbo Basic
76
Приложение Д Зарезервированные слова Turbo Basic
80
Приложение Е ASCII-коды страницы 866 (DOS)
81
Приложение Ж Скан-коды клавиатуры
82
4
Введение
Обязательной частью информатики, как предмета, являются основы программирования. Суть программирования не язык, а способность систематизировать предмет анализа, найти главное, разбить на
подзадачи, выделить повторяющиеся элементы и т.д., а затем составить последовательность (программу) решения задачи. Поэтому главное – освоить принципы программирования, а знание языков программирования необходимо во вторую очередь.
Пособие предназначено, прежде всего, для студентов технических специальностей, перед которыми не стоит цель стать системными
программистами или разрабатывать объемные приложения. Однако
специалисту-технологу в любой отрасли нужно представлять процесс
программирования, чтобы оценить сложность задачи, необходимое
время, стоимость работ. Он должен уметь быстро создать программу
для решения возникшей вычислительной задачи с использованием
ЭВМ.
Какой язык программирования лучше? В процессе обучения такой, чтобы в нем было как можно меньше отвлекающих от главной
задачи трудностей, но как можно больше одинаковых с другими языками элементов, чтобы он был максимально распространен. В СНГ
учебными языками считаются Паскаль и Бейсик. Для выполнения
конкретной задачи лучшим будет тот язык, который наиболее для этого подходит (для WEB страниц надо использовать HTML, Perl и т.д., а
не Бейсик или Паскаль) и тот, которым лучше владеешь. Например,
FORTRAN до сих пор считается самым быстрым языком для математических вычислений, особенно с комплексными числами, и фрагменты на нём вставляются в программы на других языках.
Количество языков подсчитать невозможно, особенно с учетом
их эволюции (BasicA, GW Basic, Quick Basic, QBasic), диалектов (XBasic, Atari Basic, Liberty Basic, Power Basic), коммерческих особенностей (VB6 Standard – 118US, VB6 Pro – 436US, VB6Ent – 1494US –
один язык, но в разной комплектации, что отражается на стоимости) и
т.п. Тем более что неясна терминология, например, HTML – это язык
или нет.
Мы будем учиться программировать в среде разработки Turbo
Basic (ТБ) фирмы Borland [1-3]. Бейсик – достаточно простой язык
программирования, изначально предназначенный для решения практических задач, а Turbo Basic – его наиболее удобный для обучения
диалект.
5
1 Общие определения
Рассмотрим вначале три понятия – программирование, алгоритм, языки программирования.
Существуют три метода программирования: алгоритмическое
(операционное), структурное и объектно-ориентированное. Алгоритмическое программирование – подход, при котором программа представляет собой одно целое, он пригоден для простых программ на любых языках. Структурное программирование предполагает деление
задачи на подзадачи (модули, процедуры), каждая из которых может
быть налажена и выполнена отдельно, этот метод пригоден для программ средней сложности.
Объектно-ориентированное программирование – это наиболее
прогрессивный подход. Он предполагает деление всех данных на
классы, объединяющие набор свойств семейства однотипных объектов и методы работы с этими свойствами. Подход основывается на
принципах инкапсуляции, наследования и полиморфизма. Инкапсуляция обеспечивает оформление класса со всеми необходимыми атрибутами (методы-свойства-события) и его защиту от изменений. Наследование позволяет формировать на базе существующих классов новые,
сохраняя родительские свойства (человек – женщина/мужчина). Полиморфизм позволяет использовать одноименные методы для объектов разных классов (человек идет – часы идут).
Последовательное описание способа решения класса однотипных задач называется алгоритмом. Алгоритм – это план сочинения (сначала записываем основные пункты, затем их детализируем).
Алгоритм характеризуется свойствами:
дискретность означает, что решение задачи представлено
последовательностью отдельных шагов (предписаний);
детерминированность (определенность) не допускает
неоднозначного толкования шага;
массовость означает, что алгоритм применим для разных
задач одного класса и при разных исходных данных;
результативность означает, что заранее точно известен
результат, который должен быть получен на некотором шаге;
понятность означает, что алгоритм может быть прочтен
любым исполнителем, для которого он предназначен.
Способы записи алгоритма – словесный (на естественном языке), графический (блок-схема), табличный, программа для ЭВМ,
написанная на алгоритмическом языке.
6
Все блоки графической (структурной) схемы алгоритма должны
иметь одинаковые размеры, т.е. длина и высота всех блоков должна
быть единой для всего алгоритма программы. Размеры кратны 5 мм,
соотношение сторон a к b обычно 1:2 или 1:1,5, где a – высота блока,
b – его ширина. У блоков с закруглением высота равна a/2.
Блок начала-конца алгоритма
Блок цикла
Блок ввода-вывода данных
Блок процедуры
Блок действия
Узел
Блок разветвления по условию
Печать документа
Блок множественного выбора
Для комментария, либо для записи информации, превышающей
размеры блока, применяется специальная сноска
текст
Расстояния между линиями и блоками не должно быть менее
5 мм. Направление алгоритма сверху вниз или слева направо считается основным и может не обозначаться стрелкой в конце, направления снизу вверх и справа налево должны быть обозначены стрелкой.
Как правило, все блоки нумеруются в разрезе контурной линии обозначения блока вверху слева.
Алгоритмы могут иметь линейную (последовательную), разветвляющуюся и циклическую структуру. В линейном алгоритме действия
выполняются последовательно от начала до конца – обычно так выглядят только фрагменты программ. Алгоритмы с разветвлением
включают переходы в нарушение нормальной последовательности
действий, обычно это передача управления по выполнению какоголибо условия. Циклическая структура подразумевает многократное
выполнение некоторых действий.
Пример: вычислить значение функции Z 
x3
, где
y
y  sin( x )  0.5 , при произвольном значении x [4].
В расчете производится деление на переменную y, которая может принимать значение 0. Так как деление на ноль не допускается, в
алгоритме должна осуществляться проверка условия y<>0 с разным
7
результатом, т.е. разветвлением, в зависимости от его выполнения
(две ветви – смотри рисунок).
начало
x
y=sin(x)+0.5
Да
y=0
Нет
Z=x3/y
“y=0”
Z
конец
Программа – это запись алгоритма решения задачи на языке
программирования. Алгоритмический язык (язык программирования)
представляет собой совокупность предписаний и правил их записи.
Языки делят по иерархии – низшего уровня (машинноориентированные) и высшего уровня (близкие к естественным). Возможно, лучше сказать иначе – базовые и производные. Ассемблер –
это машинно-ориентированный базовый язык, т.к. с его помощью созданы другие языки – и Бейсик, и Паскаль и т.п. Если какой-то язык
написан на Си, то Ассемблер – базовый для Си, а Си – базовый для
того языка. Если один язык быстрее другого, то это потому, что в этих
языках операторы одного назначения и работа с переменными реализованы на Ассемблере по-разному.
Языки также можно разделить на языки общего применения (например, Бейсик) и специализированные, предназначенные для решения узкого класса задач (например, HTML). Хотя говорят, что языки
высокого уровня не зависят от типа машины, на самом деле существуют проблемы, связанные с национальными и отраслевыми стандартами.
Важную роль играет среда программирования: QBasic и Турбо
Бейсик – это один язык, но разные редакторы и трансляторы (среды
программирования). Современная среда программирования (говорят
также – среда разработки) на Паскале – Дельфи, на Бейсике – VB,
VBA, VBScript. Среда разработки включает, как правило, следующие
элементы: редактор, транслятор, систему помощи (справка, HELP),
систему отладки программ (Debug), библиотеку готовых элементов.
8
Редактор предназначен для создания и редактирования программ на языке программирования (исходных модулей). Редакторы
совершенствуют, вводя функции анализа текста в момент набора.
Транслятор предназначен для преобразования исходных модулей в программы на машинном языке. Трансляторы делятся на компиляторы и интерпретаторы. Интерпретатор можно сравнить с синхронным переводчиком, компилятор – это литературный переводчик.
Интерпретатор преобразует в машинный код и сразу выполняет команды по мере поступления, не запоминая их и не используя
накопленный опыт (каждый раз заново). При повторяющихся действиях это резко замедляет выполнение программы. Весь необходимый
набор инструкций должен быть всё время в памяти, что ограничивает
допустимый размер программы. Зато исходный текст является и
окончательным текстом программы.
Компилятор выполняет программу в несколько проходов: из исходного модуля (.PAS, .BAS) создает объектный модуль (.OBJ), выявляя ошибки и заменяя куски готовыми подпрограммами из библиотеки, затем преобразует объектный модуль в исполняемый (.EXE), используя машинные коды. При повторяющихся действиях выполнение
программы ускоряется, сам компилятор из памяти в момент окончательного выполнения выгружается, но на диске может храниться
больше вспомогательных файлов.
В современных средах разработки приложений редактор обычно
является интерпретатором, а транслятор – компилятором. Существуют также компиляторы, преобразующие исходный текст в некий
промежуточный код (полуфабрикат) – такая программа выполняется
только в среде разработки, но гораздо быстрее исходного модуля.
При выполнении программа использует специальные участки
памяти – буфер и стек. Данные, используемые программой, записываются в буфер (Buffer) и считываются из него каждый раз, начиная с
первой ячейки, последовательно, в соответствии с возрастающим
смещением (индексом). В стеке (Stack) обычно хранятся адреса переходов по программе в соответствии с принципом LIFO (последним
пришел – первым ушел), как патроны в магазине пистолета.
Среда разработки TURBO BASIC включает простой текстовый
редактор, транслятор-компилятор, систему помощи и систему отладки, скомпонованные в три файла: TB.EXE (основной),
TBHELP.TBH и TBCONFIG.TB. Она поддерживает принципы последовательного и структурного программирования.
9
2 Структура программы в Турбо Бейсике
2.1 Структура программы
При записи программ существует два вида правил – обязательные, нарушение которых приводит к ошибке выполнения, и рекомендации, принятые в мире программистов.
Программа состоит из модулей (блоков), главный (Main) модуль
следует заканчивать словом END (рекомендация) и после него размещать функции, подпрограммы и процедуры. Оператор END останавливает программу, он может использоваться в программе многократно. Операторы STOP, SYSTEM аналогичны END и обычно не используются. Начало программы представляет собой раздел объявлений
(блок инициализации), который, как правило, включает комментарий с
названием программы и именем программиста, описание переменных
и констант, их типов, описание массивов, объявление режима экрана и
т.п.
Программа пишется по строкам в порядке выполнения. Регистр
не учитывается, т.е. АА и аа – одно и то же имя. Русские символы допустимы только в комментариях и текстах – нельзя путать английское
O, русское О, ноль. Незначащие пробелы в тексте игнорируются, их
можно использовать для лучшей читаемости программы, однако отсутствие значащих пробелов является ошибкой, например, delay 5 –
это задержка на 5 с, а delay5 – уже переменная. Разные операторы в
одной строке отделяются двоеточием. Не поощряются строки длиннее
80 символов (размера экрана), перенос строки производится знаком
подчеркивания _ (не действует внутри комментария и текста в кавычках, не всегда правильно работает в операторе DATA).
Для передачи управления используются адреса (номера строк
или метки), одинаковые адреса не допускаются. Номера строк (числа
от 0 до 65535) необязательны, располагаются в произвольном порядке, после номера через пробел может идти любой текст. Меткой
называется содержательное имя (идентификатор) длиной до 64 символов, начинающееся буквой и заканчивающееся двоеточием; на
строке с меткой допустим только комментарий.
Идентификатор – имя объекта (переменной, метки, процедуры
и т.п.), позволяющее отличить объект от другого.
Комментарий – это примечание программиста, обязательный
элемент документирования программы. Он всегда заканчивает строку
или единственный на ней, начинается невыполняемым оператором
REM или одиночной кавычкой ' (апостроф). После других операторов
REM пишется через двоеточие, апостроф этого не требует. Коммента10
рий компьютером не обрабатывается, поэтому его удобно использовать для временного исключения каких-то строк программы при её
отладке. Комментарий не выводится на экран в ходе выполнения программы и может содержать любые символы.
Строка программы может содержать переменные, постоянные
(константы), операторы, выражения, например, с=a + 100, где = и +
операторы, а + 100 – выражение, с и а – переменные, 100 – константа.
Оператор – это инструкция, что делать, операнд – это объект, с которым производятся действия. Операторы делятся на простые и сложные (структурированные или составные). Функции записывают либо
после оператора присваивания, либо в составе какого-нибудь оператора, они всегда возвращают строковый или числовой результат.
2.2 Данные – константы и переменные
Константы (постоянные величины) задаются и хранятся в теле
программы и не могут изменяться в ходе исполнения. Они бывают
строковыми – текст в кавычках ("123456", "Москва") длиной до 246
символов, и числовыми (целая 100, вещественная 3.456 – разделитель
точка, с фиксированной 3.456 и плавающей точкой 1.0Е02). Здесь
символ E обозначает 10, а цифры после него – порядок, т.е. степень, в
которую возводится число 10 (для вещественных чисел двойной точности допускается вместо E писать D). Тип числовой константы задается способом записи (с точкой или без).
Именованной константой называется целое десятичное число в
пределах ±32767, обозначаемое именем со знаком % впереди, например, %zero=0, оно может использоваться многократно. Целые константы в других системах счисления обозначаются двумя символами
впереди, начиная с амперсенда, например &h11 (шестнадцатеричная,
до 4 цифр) – это 17, &o11 (восьмеричная, до 6 цифр) – это 9, &b11
(двоичная, до 16 цифр) – это 3 десятичное (смотри приложение Б).
Переменная – это именованное место в памяти для хранения
данных, которые могут изменяться в ходе выполнения программы.
Обращение к таким данным производится по имени переменной.
Имя переменной начинается с латинской буквы, может включать цифры и специальные символы (кроме пробела), не должно полностью совпадать со служебным словом ТБ или повторяться, обычно
бывает содержательным. Не следует делать его слишком длинным
(более 64 символов). Если имя переменной составлено из отдельных
слов, их обычно выделяют прописной буквой, например, SizeOfBall,
реже точкой, например, Size.X.
11
Тип переменной определяет размер места в памяти, характер и
скорость производимых операций, точность хранения данных. Он задается либо первой буквой имени для группы переменных (общее определение), например, Defint i-m, n (i-m – диапазон, m,n – перечисление), либо индивидуально специальным символом (суффиксом) в
конце имени переменной, например, C$. Индивидуальное определение типа переменной отменяет общее. Тип всех переменных рекомендуется задавать явно, хотя ТБ и не требует этого обязательно.
Тип переменной
Общее
Частное
Память, Размер Максимальное
определение определение байт
массива значение
2
32767 ±32767
DEFINT
%
±2,147,483,647
4
16384
DEFLNG
&
целая Integer
целая двойной
точности Long
вещественная
DEFSNG
Single
веществ. двойной
DEFDBL
точности Double
строковая String DEFSTR
! или ничего 4
#
8
$
4+" "
от ±1.4Е-45
до ±3.4Е+38
от ± 4.94D-324
8192
до ± 1.79D+308
16384 32767 символов
16384
Заметим, что в ТБ A%, A&, A!, A#, A$ и A(i) – это разные переменные, А и А! или a – одна и та же.
Действия над целыми числами и переменными выполняются намного быстрее. По умолчанию все числовые переменные и результат
функций пользователя DEF FN в ТБ являются вещественными одинарной точности. Необъявленные числовые переменные имеют при
первом появлении значение 0, строковые переменные имеют значение "", т.е. «пустая строка». У вещественных переменных одинарной
точности только 6 цифр являются значащими (правильными), двойной
точности – только 15. Большинство встроенных арифметических
функций возвращает вещественный результат двойной точности.
До первого использования значение переменной должно быть
задано явно (даже ноль) с клавиатуры, из файла или внутри программы с помощью оператора = (присваивание). Оператор присваивания
может содержать специальное служебное слово LET, например,
LET с=c+1, но, как правило, его опускают. Допускается, но не рекомендуется, для задания значений сразу нескольких переменных использовать одну величину, например, a = b = c = 4.
Оператор CLEAR очищает сразу все переменные и все массивы,
помогает от ложного формирования ошибки переполнения, для чего
его следует помещать в самом начале программы.
12
Оператор SWAP a, b производит обмен значений переменных
одного типа.
2.3 Вывод текста на экран
Оператор SCREEN 0 – задает текстовый режим работы экрана
(видеоадаптера), восстанавливает исходные цвета (цвета по умолчанию), очищает экран, ставит курсор в положение 1,1 (первая строка из
25, первый столбец из 80). Обычно используется в программе однократно. Он не проверяет число символов в строке, поэтому для правильной работы, например, после употребления оператора SCREEN 1
(строка из 40 символов) нужно обязательно задать 80 символов оператором WIDTH.
Оператор WIDTH 40 или WIDTH 80 – устанавливает 40 или 80
символов в строке экрана (по умолчанию 80 в текстовом режиме).
Оператор CLS – очищает экран (закрашивает цветом фона),
устанавливает курсор в положение 1,1, может использоваться многократно.
Цвета кодируются числами: 0 – черный (Black), 1 – синий (Blue),
2 – зеленый (Green), 3 – бирюзовый (Cyan), 4 – красный (Red), 5 – фиолетовый (Magenta), 6 – коричневый (Brown), 7 – белый (White). Плюс
8 – увеличивается яркость, например, 8 – это серый (Grey), 14 – это
желтый (Yellow), 15 – ярко-белый; ещё плюс 16 – добавляется мигание. Цвет 31 (ярко-белый мигающий) равен 7+8+16. При работе в
среде Windows мигание символа не поддерживается.
Оператор COLOR символ, фон – задает цвет символа и фона (целые числа). Всегда хотя бы один цвет указывается, для пропущенного
цвета сохраняется ранее заданное значение. Позиция пропущенного
спереди цвета выделяется запятой, например, COLOR ,8, сзади необязательно: COLOR 15. Цвет символа может быть равен 0...31, цвет фона 0...7, по умолчанию при первом включении и объявлении SCREEN
0 устанавливается цвет символа 7 (белый), цвет фона 0 (черный).
Оператор LOCATE строка, столбец [, показ курсора, верх курсора, низ курсора] – помещает курсор на экране в нужную строку
(1...25), столбец (1...80 или 1...40). Если третье число равно 0, курсор
при выводе выключается, если 1 – присутствует. Размер курсора
(верх, низ) лежит в пределах 0...7, что соответствует размеру знакоместа 8х8.
Либо строку, либо столбец нужно указывать обязательно, для
пропущенного номера строки сохраняется предыдущее значение, например, LOCATE ,40 – на той же строке поместить курсор в позицию
13
40. Можно написать и просто LOCATE 12, но в этом случае курсор
уcтанавливается всегда в первый столбец.
(Здесь и далее квадратные скобки означают просто указание на
то, что их содержимое может отсутствовать – в тексте программы
квадратные скобки не пишутся).
Оператор PRINT – вывод на экран, имеет много форм применения и символ-заменитель – знак вопроса.
PRINT
‘ печать пустой строки (перевод строки)
PRINT “текст” ‘ печать сообщения внутри кавычек (допускается, но не рекомендуется не писать закрывающие кавычки)
PRINT 2*5-7
‘ печать результата выражения 2*5-7=3 (у
чисел при печати спереди добавляется позиция для знака)
PRINT a; b; c ‘ печать значений переменных подряд
PRINT a b c
‘ печать значений переменных подряд
PRINT a, b, c ‘ печать значений переменных в фиксированных зонах экрана – со сдвигом примерно на 14 колонок
PRINT a;
‘ вывести значение а без перевода строки
PRINT CHR$(m) ‘ вывести символ с кодом m, например, кавычки; для управляющих символов (от 0 до 31) производится не печать, а выполнение команды, например, PRINT CHR$(7) – это звонок
PRINT STRING$(n, m) ‘ вывести n символов, имеющих код m
PRINT STRING$(n,”.”)‘ вывести n символов, указанных в кавычках
PRINT SPC(n)
‘ напечатать n пробелов (стереть
текст)
PRINT SPACE$(n)
‘ напечатать n пробелов (стереть
текст)
PRINT TAB(n)
‘ начать печать с n колонки (если заданный номер столбца больше, чем ширина строки, то есть 80 символов, печать начнется в следующей строке с n-80 позиции; если заданный номер столбца меньше текущей позиции курсора, печать
начнется в следующей строке с n колонки; текст по пути стирается).
Если выводимый блок текста или переменная не умещаются до
конца текущей строки, их печать начинается со следующей строки.
На всем протяжении от предыдущей до новой позиции курсора
оператор PRINT закрашивает фон цветом, заданным последним оператором COLOR. Избежать этого при необходимости позволяют оператор LOCATE или переопределение в нужный момент цвета фона
оператором COLOR.
14
Чтобы избежать прокрутки (Scrolling) экрана при печати в 24 и
25 строку в конце оператора печати для этих строк обязательно должна стоять точка с запятой. Этот же способ предотвращает двойной перевод строки при печати в последнюю колонку экрана.
Оператор PRINT USING формат; список применяется для форматного вывода чисел на экран, например, PRINT USING "#####.###";
a, b. Переменные, выражения или константы в списке могут разделяться пробелом, запятой или точкой с запятой, их тип должен соответствовать формату. Формат задается строковой константой или переменной, после которых обязательно ставится точка с запятой. Число
решеток задает число знаков до и после десятичной точки, при печати
недостающие числа спереди заменяются пробелом, сзади – нулем. Если дробная часть числа не умещается в отведенный формат, она округляется. Если целая часть числа превышает отведенный формат,
число печатается полностью – без форматирования, но с символом
ошибки (знаком процента) впереди.
Экспоненциальный (научный) формат – PRINT USING
"##.#^^^^^"; a (не менее пяти каре ^ для вещественных переменных
двойной точности и четырех каре для вещественных переменных одинарной точности), используется для вывода очень больших или очень
маленьких чисел, либо просто чисел с плавающей точкой.
В одном формате возможно совмещение разных способов записи, например, PRINT USING " A(#) = ####.#"; i, a(i), j, a(j) – значение
переменной вещественное, индекс целого типа, числа совмещены с
текстом. Допускается оператор USING печатать отдельно от PRINT,
но обязательно после него, например, PRINT “Результат:”; USING F$;
Pi.
Специальные символы ! ? + – ** $$ , _ \ расширяют возможности форматирования. Например, частичная печать строки
PRINT USING "\ \"; "перемена" "иначе"
(печатает столько символов от начала каждой переменной, сколько
указано пробелов плюс два слеша – получится "перина").
Для обрамления надписей в рамку из одинарных или двойных
линий, создания теней и в других целях оформления используются
символы псевдографики. Часть кодов псевдографики приведена ниже
на рисунке рядом с соответствующими символами (смотри также
приложение Е).
15
218 196 194
191
┌───────┬───────┐
│
│
179│
├───────┼───────┤
│195
│197
│180
└───────┴───────┘
192
193
217
201 205 203
187
╔═══════╦═══════╗
║
║
186║
╠═══════╬═══════╣
║204
║206
║185
╚═══════╩═══════╝
200
202
188
Символы псевдографики вводят в текст программы, например,
PRINT "╚══╝", удерживая нажатой клавишу Alt и одновременно
набирая код символа на цифровой (серой) клавиатуре справа. Так
можно набрать любой символ, в частности, английское А (код 65).
2.4 Ввод данных с клавиатуры
Все данные, которые хотя бы один раз могут измениться, должны вводиться с клавиатуры или из файла.
Оператор INPUT [;]["сообщение"][,] список переменных – считывает значения переменных с клавиатуры в соответствии со списком,
отображая ввод на экране, имена переменных в списке разделяются
запятой. Точка с запятой за INPUT отменяет перевод строки после
ввода, запятая перед списком отменяет печать знака вопроса, сообщение предназначено пользователю. Первые пробелы во вводимых числовых данных игнорируются.
При вводе списком переменные следует отделять друг от друга
запятой или пробелом, ввод заканчивается нажатием клавиши Enter,
тип данных должен соответствовать типу переменной. Не введенным
переменным по умолчанию присваиваются значения 0 (числу) или
«пусто» (строке). Не стоит вводить данные списком, так как это часто
приводит к ошибкам. Пример:
INPUT "Введите коэффициент ", a
Оператор LINE INPUT [;]["сообщение"] строка – помещает до
255 вводимых символов последовательно в строковую переменную,
отображает ввод на экране, конец ввода – клавиша Enter. В отличие от
оператора INPUT при вводе строки не теряет первые пробелы. Пример
LINE INPUT a$
16
Функция INPUT$(n) – служит для ввода n символов (до 32676) в
строковую переменную без отображения на экране, нажатия Enter не
требуется. Управляющие клавиши не воспринимаются. Можно использовать функцию для ввода пароля или ожидания нажатия любой
клавиши, т.к. она останавливает ход программы. Пример
c$=INPUT$(2)
Функция INKEY$ – опрашивает буфер клавиатуры, ничего не
выводит на экран, не требует нажатия Enter, не останавливает программу. Возвращает код ASCII нажатой клавиши (одна или две цифры, значащая цифра всегда последняя). Если ничего не нажималось,
выдается пустая строка. Пример
1 C$=INKEY$:IF C$="" THEN 1
' нажмите любую клавишу
Функция INSTAT – определяет, введен ли в буфер клавиатуры
символ, сохраняет полученное значение до тех пор, пока не использовалась INKEY$ или другая функция опроса буфера. Возвращает 0, если буфер пустой, ничего не выводит на экран, не останавливает для
опроса программу. Пример
WHILE NOT INSTAT: WEND
' цикл выполняется, пока не нажата любая клавиша
2.5 Меню
Любая программа должна обеспечивать многократность использования без выхода из нее, для чего применяют меню. В стандарте
Windows меню формируется элементами управления или специально.
В ДОС минимальные меню – нажмите любую клавишу для продолжения и закончить/начать сначала Y/N? Нужно четко указывать, какой символ следует вводить в том или ином случае, предусматривать
все вероятные случаи ввода (регистр, алфавит), предпочтительную
возможность выполнять без проверки.
Пример
WHILE NOT INSTAT:WEND
'нажмите любую клавишу
или
17
'если нажата клавиша Esc, закончить работу
c$=INPUT$(1)
icode=ASC(RIGHT$(c$,1)) ' значащая цифра справа
IF icode=27 THEN END
' выход по клавише Escape, код 27
(наиболее употребительные коды – клавиши Space (Пробел) 32,
Escape 27, Enter 13, курсор 72757780)
В программу целесообразно ввести возможность (объявленную
или скрытую) прерывания хода программы по усмотрению пользователя, например, при образовании бесконечного цикла.
‘ прерывание по нажатию клавиши F10
ON KEY(10) GOSUB ENDPGM:KEY(10) ON ' в начале программы
…………….
ENDPGM:
END
' метка перед последним оператором End
или
DO
операторы
IF INKEY$<>"" THEN EXIT LOOP
операторы
LOOP
Обычно меню находится перед оператором END главного модуля программы, после которого размещаются все подпрограммы и процедуры.
3 Операции в ТБ
Основные виды операций с данными (по снижению приоритета):
-
NOT (логическое отрицание);
арифметические;
отношений;
логические;
функциональные;
строковые.
18
3.1 Операции арифметические
Располагаем по старшинству, т.е. приоритету выполнения:
+, - присвоение знака;
^ (каре)
- возведение в степень;
*, /, \ (обратный слеш), MOD - умножение, деление, целочисленное деление, остаток от целочисленного деления;
+, - сложение, вычитание;
INCR, DECR
- увеличение, уменьшение
(используются отдельно от других операций).
Выражение записывается в строку, обязательно указание каждой операции, порядок выполнения операций одного ранга – слева направо, может изменяться скобками. Тип результата выражения зависит от типа (максимального размера) входящих переменных, например, для данного выражения результат будет вещественным двойной
точности b#=a%+a&+a!+a# (участвуют только числа!).
Результат присвоения знака не всегда однозначен: 2^-2=0.25;
-2^2=-4; (-2)^2=4, поэтому при использовании его стоит проверять.
Для 2...5 целого порядка возведение в степень лучше заменить
умножением (выполняется быстрее), т.е. вместо a^2 писать a*a. Знак
умножения следует указывать обязательно. При делении на 0 возникает ошибка Division by zero, поэтому перед любым делением нужно
проверять, что делитель не равен нулю, и указывать характер действий в противном случае.
Все целочисленные операции произвоa
3.1 3.1 3
дятся с преобразованием и исходных чисел и
b
1.4 1.5 5
результата к целому виду (только одинарной
a\b
3
1
0
точности). Примеры целочисленного деления
a MOD b 0
1
3
и вычисления остатка показаны в таблице.
Операцию MOD обычно используют для проверки четности
чисел
if a% mod 2 then print "Число нечетное"
Операторы INCR, DECR выполняются быстрее обычного сложения и вычитания. Они имеют формат INCR a [,b] (увеличить a на b) и
DECR a [,b] (уменьшить a на b), что соответствует a=a+b и a=a-b. По
умолчанию b=1 и можно писать просто INCR n вместо n=n+1. Предпочтительнее эти операторы использовать для действий с целыми
числами.
Ошибки переполнения (OVERFLOW) или потери порядка возникают, если в ходе вычислений получается очень большое или очень
19
маленькое (но не ноль!) число, либо просто полученное значение выходит из диапазона используемого типа переменной или операции.
3.2 Операции отношений
Они применяются для однотипных операндов – только чисел
или только строк, отображаются символами = равно, > больше, <
меньше, >= не менее, <= не более, <> не равно.
Если отношение выполняется, результатом сравнения является
ненулевое значение –1 (Истина), которое можно использовать, в противном случае ноль (Ложь). Результатом PRINT 5>1 будет –1, результатом PRINT 5<1 будет 0. Используем это в программе: если a>b, то
напечатать a, иначе вывести 0
PRINT (a>b)*-a
Точное сравнение возможно только для целых чисел из-за ошибок хранения данных (например, ± 4.94D-324 всё-таки не ноль!). Пример несовпадения текущего и хранимого результатов операций
a=1/3
? a=1/3
? a=a
(печатает 0)
(печатает –1)
Поэтому при сравнении действительных чисел сравнивают не
их значения, а их абсолютную разницу с заведомо малым числом Eps
или Tol, характеризующим точность сравнения, например
Eps=0.0001:IF ABS(a-1/3)<eps THEN PRINT "а равно 1/3"
Результат сравнения строк зависит от места последовательно
сравниваемых символов в алфавите (кодовой таблице). Два символьных выражения равны тогда и только тогда, когда они содержат одни
и те же символы в одном и том же порядке, т.е. содержат одинаковую
последовательность кодов. Сравнение производится слева направо до
первого неравенства кодов. Длина строк учитывается только тогда,
когда они оказались идентичными вплоть до последнего символа более короткой строки. Тогда считается, что более короткая строка
меньше более длинной.
20
3.3 Операции логические (булевы)
Они выполняют побитовую обработку операндов и возвращают
ненулевое значение TRUE (истина, -1) или нулевое значение FALSE
(ложь, 0) в зависимости от исхода.
x1 x2
F
F
T
T
F
T
F
T
AND
(И)
F
F
F
T
OR
(ИЛИ)
F
T
T
T
EQV
(x1=x2)
T
F
F
T
XOR
IMP
NOT x1
(x1x2) (x1+x2) (НЕ¬)
F
T
T
T
T
T
T
F
F
F
T
F
Обычно логические операции используются в условных выражениях ЕСЛИ ... ТО для связки нескольких условий. Другое их использование – маска для проверки наличия определенного бита,
например, приводимая ниже программа для числа 179 напечатает его
содержимое по битам 128 0 32 16 0 0 2 1.
cls
k=179: j=7
while j>=0
print k AND 2^j;
decr j
wend
A
B
A and B
A+B
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
1
0
0
1
1
1
0
0
1
0
1
10
15
10
25
Вспомним детскую считалку "А И Б сидели на трубе": учтем,
что коды английских букв А=65, B=66, тогда на трубе в результате
операции И (A AND B) остался элемент с кодом 64=@ (собачка).
Логические операции позволяют установить или сбросить заданное значение бита, например, x = x AND &b11110111 (сбросить 3й бит – приравнять его нулю), x = x OR &b01000000 (установить 6-ой
бит = 64) в целой переменной x.
Оператор NOT инвертирует значение переменной, добавляя или
вычитая единицу в MSB и LSB (приложение Б). Для логических значений –1 и 0 логическое отрицание равно 0 и –1, а вот для других значений образуются странные числа, например, для a=100:? NOT a получится результат –101.
3.4 Операции функциональные (встроенные функции)
Функция может быть встроенной и внешней (задаваемой пользователем). Она возвращает одно значение (обычно вещественное
21
двойной точности), зависящее от заданной переменной (аргумента)
или выражения, например, c = SIN(x).
SQR(x)
– корень квадратный из x, не допускается x<0;
Преобразование значения (типа):
ABS(x)
– модуль x (просто обнуляет MSB);
SGN(x)
– знак x, возвращает –1 при x<0, 1 при x>0 и 0 при
x=0;
FIX(x)
– целая часть числа;
INT(x)
– ближайшее меньшее целое, например,
INT(0.999)=0, INT(-0.999)= -1, INT(1.001)=1, INT(-1.001)= -2;
CEIL(x)
– ближайшее большее целое, например,
CEIL(1.001)=2, CEIL(-1.001)= -1, CEIL(-0.999)=0;
CINT(x)
– просто ближайшее целое, например,
CINT(1.499)=1, CINT(1.5)=2, CINT(-1.5)= -2 (преобразование в одинарную целую);
CLNG(x) – преобразование в целую переменную двойной
точности;
CSNG(x), CDBL(x) – преобразование переменной двойной точности в одинарную и наоборот;
тригонометрические функции:
SIN(x), COS(x), TAN(x) – угол x задается в радианах;
ATN(x)
– arc tg(x), возвращает основное значение угла (в
радианах) в пределах от –π/2 до +π/2; перевод в градусы производится
по формуле угол(град) = угол(рад)*Pi#/180, причем величину Pi в ТБ
лучше задавать с помощью формулы Pi# = 4*Atn(1#).
Через встроенные функции могут задаваться другие, например,
COT(x) = 1/TAN(x),
ARCSIN(x)=ATN(x/SQR(1-x*x)),
ARCCOS(x)=ATN(-x/SQR(1-x*x))+2*ATN(1);
экспоненциальные и логарифмические функции:
EXP(x)
– ex - возможно переполнение при x>1419,
потеря порядка при x<-1419;
EXP2(x)
– 2x EXP10(x)
– 10x Основание натурального логарифма может определяться с помощью встроенной функции e# = EXP(1).
LOG(x)
– ln(x)
- не допускается x<=0;
LOG2(x)
– lg2(x)
LOG10(x)
– log(x)
Логарифм по произвольному основанию N может быть вычислен с использованием встроенной функции LOGN(x)=LOG(x)/LOG(N).
22
генератор случайных чисел – RND(x) или просто RND:
если х>0 – возвращает случайное число от 0 до значения <1, последовательность чисел определяется начальным (опорным) числом,
но при каждом запуске повторяется;
если x<0 – начинается новая серия случайных чисел;
если x=0 – повторяет последнее случайное число.
Оператор RANDOMIZE [n] – вводит в генератор случайных чисел новое опорное число n, должен опережать RND (если не указать
число, то запрашивает его). Удобно использовать опорное значение,
предоставляемое системным таймером RANDOMIZE TIMER. Для записи i=СINT(RND*n-m) результатом будут случайные целые значения
переменной i от n-m до -m.
3.5 Операции строковые
Операция КОНКАТЕНАЦИЯ (слияние строк) – выполняется
знаком плюс: c$="body" + "building".
Функция LEN(строка) – определяет количество символов в
строковой переменной, включая окаймляющие пробелы. Для пустой
строки возвращает 0.
Функция INSTR([m, ] строка, подстрока) – проверяет наличие
подстроки в строке, начиная с позиции m (по умолчанию с первого
символа), возвращает номер позиции первого вхождения (смещение),
либо 0. Пример: INSTR(3, "titul", "i") равно 0, INSTR(2, "titul", "i")
равно 1, INSTR("titul", "i") равно 2.
Функция LEFT$(строка, n) – выбор n левых символов строки.
Функция RIGHT$(строка, n) – выбор n правых символов строки.
Функция МID$(строка, m [, n]) – выбор n символов из строки,
начиная с m-ой позиции. По умолчанию выбираются все символы до
конца.
Оператор МID$(строка, m [, n])=подстрока – вставляет в строку n символов подстроки, начиная с m-ой позиции (по умолчанию всю
подстроку).
Функция UCASE$(строка) – преобразует все буквы строки в
большие (удобно для сортировки или поиска независимо от регистра).
Функция LCASE$(строка) – преобразует все буквы строки в малые (строчные).
Функции HEX$(a), OCT$(a), BIN$(a) – возвращают строку с шестнадцатеричным, восьмеричным, двоичным представлением целой
части числа a, находящегося в пределах от –32768 до 65535.
23
Функция STR$(переменная|выражение) – преобразует число в
строку из цифр.
Функция VAL(строка) – преобразует строку из цифр в число, в
качестве разделителя целой и дробной частей допускает только точку,
на первом недопустимом символе прекращает преобразование.
Функция CHR$(n) – возвращает символ с кодом n.
Функция ASC(строка) – возвращает значение ASCII кода первого символа строки.
Функция SPACE$(n) – возвращает строку из n пробелов, в графических режимах с оператором PRINT предпочтительней, чем
SPC(n).
Функция STRING$(n, m) – возвращает строку из n символов с
кодом m.
Функция STRING$(n, "символ") – возвращает строку из n символов, заданных в виде строковой константы или переменной.
Пример использования строковых функций для ввода чисел с
проверкой правильности вводимого значения:
f$="0123456789+-." ‘ допустимые символы
locate 3,20,1:print "введите число : "; ‘ вид курсора
do
‘ цикл, пока не нажата клавиша Enter (код 13)
c$=input$(1)
if c$="," then c$="." ‘ заменить запятую точкой
if instr(f$,c$) then a$=a$+c$:print c$;
loop until c$=chr$(13)
print:a=val(a$)
‘ преобразуем строку в число, присваи-
ваем а
При сортировке информации, содержащей как строчные, так и
прописные латинские буквы, можно использовать функции UCASE$
или LCASE$, чтобы разница в регистре, на котором набрана буква, не
влияла на результат сортировки. Правильность сравнения строк с русскими символами зависит от способа кодировки (размещения символов в кодовой таблице – приложение Е).
4 Управляющие структуры
4.1 Передача управления
Для изменения порядка выполнения команд используют операторы передачи управления.
а) Оператор GOTO адрес – безусловная передача управления на
строку с указанным адресом (номером или меткой). Не стоит им зло24
употреблять – программу с большим числом операторов GOTO называют лапшой (спагетти) или мочалкой, её трудно читать.
б) Условный оператор IF: первая форма – однострочная
IF условие THEN действие1 [ ELSE действие2]
‘ ЕСЛИ условие выполняется ТО действия1 ИНАЧЕ действия2
При этом все операторы, начиная с IF, обязательно должны
умещаться в одной строке, которая может при необходимости разрываться знаком переноса _. Часть со слова ELSE может отсутствовать,
оператор GOTO после THEN можно не писать. Если действие содержит несколько операторов, они разделяются двоеточием. Условие
может быть составным, либо представлять собой выражение. Пример
‘ если n равно 0 или переменной nvar, то подать сигнал
IF n=0 OR n=nvar THEN BEEP
Условный оператор IF: вторая форма – блочная
IF условия1 THEN
действия1
[ELSEIF условия2 THEN
действия2]
[ELSE
действия3]
END IF
Обязательным является перенос строки после оператора THEN
и завершение блока оператором END IF. Досрочный выход производится оператором EXIT IF. Рекомендуется блочные операторы записывать с отступом относительно основного текста. Эта форма допускает вложение до восьми дополнительных условий, описываемых с
помощью оператора ELSEIF, количество операторов в действиях не
ограничивается.
При объединении нескольких условий в одно каждое из объединяемых должно записываться полностью: IF a>1 AND a<20 THEN …,
скобки необязательны. В частных случаях условия можно записывать
короче: вместо IF a=0 THEN... можно писать IF NOT a THEN …, вместо IF a<>0 THEN можно писать просто IF a THEN …
в) Условие множественного выбора SELECT
Для первого значения, совпавшего с условием проверки, выполняются необходимые действия и автоматический выход из блока, до-
25
срочный выход можно осуществить оператором EXIT SELECT. Действие без сравнения (CASE ELSE) выполняется быстрее.
SELECT CASE выражение| переменная
CASE значение1
действия
[CASE значение2
действия
CASE ELSE
' все остальные случаи
действия]
END SELECT
Примеры проверки
CASE <b
CASE 14
CASE b TO 90
CASE b, 14
CASE b TO 90, 14
Пример
SELECT CASE a
CASE <0:PRINT "Число отрицательное"
CASE >0:PRINT "Число положительное"
CASE ELSE:PRINT "Число равно нулю"
END SELECT
г) Передача управления по условию ON ... (устаревшее)
Оператор ON index GOTO список_адресов – значение целой порядковой переменной index характеризует смещение в прилагаемом
списке и должно находиться в пределах от 1 до количества адресов n.
Если значение index не входит в 1...n, но остаётся в пределах ±32767,
управление переходит к следующему оператору, иначе формируется
ошибка.
Оператор ON index GOSUB список_адресов – отличается от предыдущего тем, что после выполнения подпрограммы управление возвращается на следующий после рассматриваемого оператор.
Оператор ON key(n) GOSUB адрес – выполнение подпрограммы
по нажатию определенной клавиши (прерывание). При этом учитывается состояние опроса клавиш key(n) ON|OFF|STOP – ON включает
опрос, STOP – временно его приостанавливает до повторного использования ON, OFF – полностью удаляет прерывание из программы.
Соглашение: n=1…10, 30…31 соответствует функциональным
клавишам F1…F10, F11…F12; n=11…14 соответствует клавишам курсора вверх, влево, вправо, вниз; n=15…25 соответствует задаваемым
пользователем клавишам.
Объявление контролируемой клавиши производится по формату
key n, chr$(флаг служебной клавиши) + chr$(скан-код клавиши),
26
где n=15…25, флаг служебной клавиши равен: 0 – нет служебных клавиш, 1-3 – одна из клавиш Shift, 4 – клавиша Ctrl, 8 – клавиша Alt, 32 –
клавиша NumLock, 64 – клавиша CapsLock, 128 – клавиши расширенной клавиатуры. Например, объявляется прерывание по комбинации
Ctrl+S (смотри приложение Ж) для выполнения подпрограммы 222:
KEY 15, CHR$(4) + CHR$(31)
ON KEY(15) GOSUB 222: KEY(15) ON
Другие операторы передачи управления ON (с учетом
ON|OFF|STOP):
ON TIMER(n) GOSUB адрес – запуск (прерывание) по достижению времени n с момента команды TIMER ON, после выполнения
прерывания отсчет начинается сначала. Пример программы, выводящей на экран с частотой 1 с значение системного времени
on timer(1) gosub 2: timer on
do: loop until inkey$<>""
end
2 locate 1,70: print time$: return
ON PLAY(n) GOSUB адрес
' запуск по остатку нот в
фоновом музыкальном буфере (n лежит в пределах от 1 до 32)
ON PEN GOSUB адрес
' запуск по световому перу
ON STRIG(n) GOSUB адрес
' запуск по кнопке джойстика
4.2 Циклы
Повторяющиеся действия оформляются в виде циклов. Общие
правила: выбирается переменная цикла и задается ее начальное значение (вне цикла); проверяется соответствие переменной условию – в
начале цикла (цикл с предусловием) или в конце (цикл с постусловием); если условие не выполняется, переменная изменяется на заданную величину (шаг) или в заданное число раз (кратность) и действие
повторяется. Нельзя входить в тело цикла со стороны!
а) Неявный цикл (без специальных операторов начала-конца) организуется обычно с помощью оператора GOTO адрес, например
1 INCR a: IF a<10 THEN [GOTO] 1
27
Существует опасность образования бесконечного цикла, если
условие выхода из цикла неверно сформулировано, недостижимо, либо вообще отсутствует. Например
1 a=0: IF a<10 THEN 1
б) Счётный цикл FOR…NEXT – число повторов заранее известно, начальное и конечное значения переменной цикла счетчик задаются в начале цикла.
FOR счетчик=начало TO конец [ STEP шаг ]
действия
NEXT [счетчик]
Шаг может быть и отрицательным, тогда начальное значение
должно быть больше конечного. Если шаг не задан, то по умолчанию
он равен 1. Значение счетчика изменяется только сложением (вычитанием).
Значения переменных начала, конца и шага фиксируются перед
первым повторением и далее не опрашиваются. Не рекомендуется
принудительно менять значение счетной переменной в теле цикла –
это может привести к неожиданным результатам.
Циклы допускают до 8 вложений друг в друга, например
FOR i=1 TO 10
FOR j=1 TO 10
a(i,j)=0
NEXT j,i
' вложенный цикл
Переменная внутреннего цикла должна изменяться первой.
Можно завершать несколько вложенных циклов одним оператором
NEXT со списком всех переменных, можно не указывать счетную переменную в операторе NEXT, тогда цикл выполняется быстрее.
Проверка условия производится в начале цикла, если условие не
может быть выполнено, цикл не реализуется. Например, цикл
FOR I=0 TO b STEP –1: PRINT i: NEXT
при b=0 будет выполнен один раз, при b=1 – не выполнится ни разу.
Увеличение счетчика происходит в операторе NEXT, поэтому после
окончания цикла значение счетчика равно конец+шаг. Досрочно выйти из цикла по дополнительному условию можно оператором EXIT
FOR.
28
Тип переменной цикла может быть любым числовым, но рекомендуется целый – тогда цикл выполняется быстрее и нет проблем с
числом повторений из-за особенностей хранения вещественных чисел
в компьютере 1 = 0.999999... = 1.0000001 и т.д.
Пустой цикл FOR i=1 TO n:NEXT – аналог оператора задержки
DELAY n на n секунд, в отличие от последнего задержка составляет
микросекунды и зависит от тактовой частоты процессора.
в) Цикл типа WHILE…WEND (делать, пока ещё выполняется ...)
– это цикл с предусловием, число повторений заранее не определено,
переменная цикла изменяется произвольным образом, начальное значение переменной задается вне цикла
WHILE условие
действия
[EXIT LOOP]
действия
WEND
Например
WHILE NOT INSTAT:WEND
' опрос клавиатуры
г) Цикл типа DO…LOOP – число повторов не определено, переменная цикла изменяется произвольно, начальное значение переменной задается до цикла. Условие может проверяться как в начале, так и
в конце цикла, добавлен оператор проверки условия UNTIL – выполняй до тех пор, пока не наступит ...
DO WHILE a<10|UNTIL a>9
INCR a
LOOP
DO
INCR a
LOOP WHILE a<10|UNTIL a>9
Если перед началом цикла а=10, первый цикл не будет исполнен
ни разу, второй – будет один раз. Досрочный выход из цикла производится оператором EXIT LOOP, пример
do
if inkey$<>"" then exit loop 'выход по любой клавише
locate 1,72:print time$:delay 0.1 ' отсчет времени
loop
29
4.3 Типовые алгоритмы
Вычисление суммы – всегда до цикла должно задаваться
начальное значение, обычно равное нулю. Найдем, в частности, сумму
ряда
sum=0.
FOR i=1 TO n
sum=sum+1/i
NEXT
n
1
1 1
1
Sum    1    ... 
2 3
n
i 1 i
Заметим, что можно было присвоить переменной sum, называемой накопитель или аккумулятор, начальное значение 1, а цикл начать со значения счетной переменной 2.
При вычислении произведения всегда до цикла должно быть задано его начальное значение, обычно равное 1. Вычислим, например,
факториал n!=1*2*3*…*n
f%=1
FOR i%=2 TO n%
f%=f%*i%
NEXT
5 Массивы
5.1 Описание массива
Массив – конечный набор данных одного типа, имеющих общее
имя.
В отличие от других переменных (простых, неделимых) элемент массива называется индексированной переменной, т.к. элементы
выбираются из массива по индексу (позиции). Индекс – это смещение
элемента в массиве, положительное число. По умолчанию первый индекс массива 0, поэтому а(2) – это третий по очереди элемент массива
а.
Одномерный массив в математике называется вектором, в экономике списком. Двумерный массив – в математике матрица, в экономике таблица. Каждому массиву отводится максимум 64 к памяти, однако число самих массивов ограничено в ТБ лишь размером свободной памяти.
В элементе символьного массива содержится только указатель
адреса и длина строки. Сама строка данных хранится в специальном
пространстве памяти, отведенном под символьные строки, и занимает
столько байт, сколько в ней имеется символов. Пространство символьных строк максимально может содержать 64 к символов.
30
Размер массива по каждому измерению и число измерений (до
восьми) задаются оператором DIM с обязательным указанием последнего индекса, интервал индексов задается через двоеточие, например
DIM a(9), b(10,10), c(3:10), d(2,2:4,0:4)
По умолчанию ТВ присваивает любому неописанному одномерному массиву размер 0:10, например, если массив не был ранее описан, можно выполнить ? a(10) – напечатает ноль, однако ? a(11), b(1,1)
– уже ошибка: в первом случае индекс больше 10, во втором используется неописанный двумерный массив.
Общее задание начального индекса n, который не должен превышать значения последнего индекса, производится оператором
OPTION BASE n до первого появления DIM. Оператор DIM отменяет
общую установку для отдельного массива. При динамическом определении массивов в качестве индексов могут использоваться переменные и выражения, например, DIM a(m),b(n+1,m-1), их значения
должны быть известны до появления DIM. Перед возвратом к началу
программы или при переопределении размеров имеющиеся динамические массивы должны уничтожаться оператором ERASE массив1,
массив2…, иначе возникает ошибка повторного определения массивов. Этот оператор также позволяет освободить память под вновь
описываемые массивы.
DIM {STATIC|DYNAMIC} массив – необязательные аргументы
STATIC и DYNAMIC определяют, задается ли пространство под массив заранее компилятором, или оно будет выделяться динамически в
ходе выполнения программы. Если эти аргументы опущены, то по
умолчанию массив считается статическим до тех пор, пока не встретится метаоператор $DYNAMIC, или в операторе DIM будет использовано выражение, или имя массива появится в двух операторах DIM,
или массив будет объявлен локальным в процедуре или функции.
Индексы в массивах должны быть только целыми числами, иначе ТВ округляет их сам в сторону ближайшего целого. Например, присвоим значения a(i) = i от 0 до 10, а затем прочитаем содержание массива с шагом изменения индекса i = 0.1, тогда получим результат
0 при a(0.0 – 0.5)
1 при a(0.6 – 1.4)*
2 при a(1.5 – 2.5)
3 при a(2.6 – 3.5)…
8 при a(7.6 – 8.5)
9 при a(8.6 – 9.4)
10 при a(9.5 – 10.4)
31
*) влияет и ошибка округления чисел компьютером.
Функция LBOUND(номер_размерности) позволяет узнать нижний, а UBOUND(номер_размерности) – верхний индексы массива по
указанному измерению. Например,
DIM b(2,3)
PRINT LBOUND(a(1)),
PRINT LBOUND(b(1)),
PRINT LBOUND(b(2)),
PRINT LBOUND(b(3)),
UBOUND(a(1))
UBOUND(b(1))
UBOUND(b(2))
UBOUND(b(3))
‘ результат
0
10
0
2
0
3
0
0
5.2 Работа с матрицами
В матрице a(i,j) – это переменная, у которой i – номер строки, j –
номер столбца, первый индекс обычно 1. Число строк матрицы, как
правило, обозначают n, число столбцов m.
В большинстве случаев матричные операции проводятся с вложенным циклом. Например, обнуление матрицы a(n * m) – часто говорят "… а остальные элементы должны быть равны нулю"
FOR i=1 TO n
' стандартный метод (для любых массивов)
FOR j=1 TO m
a(i, j)=0
NEXT
NEXT
или
ERASE a
' нестандартный метод (для статических массивов)
Заметим, что нестандартные методы программирования делают
программу более эффективной, но менее понятной.
Ввод матрицы a(n * m) – вводят по одному элементу с обязательным указанием на экране его индексов
FOR i=1 TO n
FOR j=1 TO m
PRINT "a("i","j") = ";: INPUT, a(i, j)
NEXT
NEXT
Печать матрицы a(n * m) на экране по строкам из m элементов
32
FOR i=1 TO n
FOR j=1 TO m
PRINT USING "######.###"; a(i, j);
NEXT
PRINT
' прекращает печать текущей строки
NEXT
Сумма матриц a(n * m) и b(n * m) – обязательно нужно проверять, что размеры матриц одинаковы!
FOR i=1 TO n
FOR j=1 TO m
с(i, j) = a(i, j) + b(i, j)
NEXT
NEXT
Произведение матриц a(n * k) и b(k * m) – обязательно следует
проверять, что число столбцов левой матрицы равно числу строк правой (здесь не два, а три цикла)
FOR i=1 to n
FOR j=1 to m
s=0. ' эффективней использовать простую переменную
FOR ij=1 TO k
s=s+a(i, ij)*b(ij, j)
NEXT
c(i, j)=s ' переходим к индексированной переменной
NEXT
NEXT
Зато при расчете следа матрицы (суммы элементов главной диагонали) достаточен один цикл, так как значения индексов одинаковы
trace=0
FOR i=1 TO n
trace=trace+a(i,i)
NEXT
Алгебраический полином вида a0xn + a1xn-1 + …+ an – это тоже
разновидность массива (список коэффициентов с фиксацией их места). Для расчета значения полинома при некотором значении переменной x применяют схему Горнера, соответствующую алгоритму
((((a(0)*x+a(1))*x+a(2))*x+a(3))*x+…+a(n)
33
pol=a(0)
for i=1 to n
pol=pol*x + a(i)
next
5.3 Поиск и сортировка
Массив, специально предназначенный для хранения, замены,
сортировки, поиска и выборки данных, называется базой данных. Типичными для базы данных операциями являются поиск и сортировка.
Поиск заключается в отыскании элемента массива, значение которого совпадает с ключом поиска, самым простым является последовательный поиск методом перебора. При выборке элемента с заданными свойствами, в частности, наибольшего, нередко требуется также
запомнить место (индекс) этого элемента в массиве, например
amax=a(1): index=1
' присваиваем начальные значения
for i=2 to n
if amax<a(i) then amax=a(i):index=i
next
Для оператора отношения "< " индекс будет соответствовать
первому найденному наибольшему значению, для оператора "<=" –
последнему, оператор ">" организует поиск наименьшего элемента.
Поиск значительно эффективней, если данные каким-либо образом
упорядочены.
Сортировкой называется такая перестановка элементов в массиве, после которой они оказываются упорядоченными требуемым
образом. Обычно сортировка производится либо по неубыванию значения, либо по невозрастанию (если отсутствуют попарно одинаковые элементы, то по возрастанию или убыванию). Упорядочим одномерный массив по неубыванию
for i=1 to n-1
for j=1 to n-1
' если текущий элемент больше следующего, меняем их местами
if x(j)>x(j+1) then swap x(j),x(j+1)
next
next
Этот метод называется пузырьковой сортировкой (элемент с заданными свойствами всплывает к концу массива), он наиболее простой, но длительный. Способ относится к группе сортировок обменами. Если элементы разных массивов, имеющие одинаковый индекс,
34
относятся и к одному объекту (например, фамилия абонента, номер
телефона, адрес), то одновременно производят обмен и в указанных
массивах.
Поскольку упорядочение данных является одной из основных
задач обработки информации, разработано множество методов сортировки. Например, найти элемент массива, имеющий наименьшее значение, переставить его с первым элементом, повторить действия, начиная со второго элемента и т.п. (сортировка выбором). Другой метод
– упорядочить первые два элемента, затем взять третий элемент и
вставить его на нужное место относительно первых двух, затем проделать то же для следующего элемента (сортировка простыми вставками – похоже на упорядочение карт в руках при новой взятке). Известны также сортировка методом Шелла и быстрая (Quick) сортировка. Быстрые методы сортировки требуют использования дополнительных переменных или массивов, характеризуются более сложным
алгоритмом.
Пример пузырьковой сортировки с использованием дополнительного целочисленного массива индексов (если исходный массив не
должен меняться) – выводить на печать будем a(k(i))
for i=1 to n: k(i)=i: next
for i=n to 2 step –1
for j=1 to i-1
i1=k(j):i2=k(j+1)
if a(i1)<a(i2) then k(j)=i2:k(j+1)=i1
next j
next i
6 Программные модули
Выполняемые повторно фрагменты программ могут быть
оформлены и использованы в виде модулей – это подпрограммы,
функции пользователя и процедуры. При согласовании главного
(Main) и вспомогательного модулей важную роль играет видимость
переменных – возможность работы с переменными одного модуля из
другого.
6.1 Подпрограммы
Подпрограммой называется модуль, выполняемый по команде
GOSUB адрес, его начало (вход) обозначается номером строки или
меткой, конец – оператором RETURN [адрес]. Входов в подпрограмму может быть несколько. Оператор RETURN возвращает управление
35
на строку, адрес которой был в нем указан, либо на оператор, следующий по очереди за тем, которым подпрограмма была вызвана.
Нельзя входить в подпрограмму или выходить из неё оператором GOTO – это нарушает порядок чтения адресов из стека и может
вызвать зависание программы. Из-за отсутствия четких границ между
подпрограммами и главным модулем их лучше размещать после оператора END главного модуля, либо следует организовывать обход.
Подпрограмма использует глобальные (общие – SHARED) переменные, поэтому нужно следить, чтобы не происходило случайного
изменения значений переменных, особенно в циклах. Подпрограмма
не обладает свойством рекурсии, т.е. не может вызвать саму себя.
Пример использования подпрограммы вывода числа на экран
a=10:gosub vyvod
a=13.145:gosub vyvod
end
vyvod:
print using "#####.#####";a
return
6.2 Внешние функции
Это функции, задаваемые пользователем, они всегда возвращают одно значение, делятся на однострочные и блочные.
Определение строчной функции производится оператором
DEF FNимя(список формальных параметров) = выражение
в любом месте программы (но лучше в самом начале или после
END). Обращение к функции в программе производится по имени:
FNимя(список фактических параметров).
Тип возвращаемого значения определяется именем функции, например, DEF FNT$() – возвращается строка. Пример (возвращаемое
значение является вещественным одинарной точности)
DEF Fnmaxim(a, b) = (a+b+ABS(a-b))/2
Обращение amax=Fnmaxim(A1,A2)
DEF Fnminim(a, b) = (a+b-ABS(a-b))/2
Обращение amin=Fnminim(A1,A2)
или
DEF Fnarccos(x)=1.57-ATN(x/SQR(1-x*x))
Обращение fi=fnarccos(x)
DEF Fnarcsin(x)=ATN(x/SQR(1-x*x))
Обращение fi=fnarcsin(x)
36
Фактические параметры – те, что используются в главном модуле, формальные же используются для вычислений только в функции, при обращении первые подставляются вместо вторых. Они
должны быть одного типа и соответствовать друг другу по месту и
количеству (не более 16). Параметры передают в функцию, а из неё
получают результат по имени функции.
Определение многострочной (блочной) функции:
DEF FNимя(список формальных параметров)
вычисления
FNимя=результат
' перед выходом присвоить результат
END DEF
Определения функций следует трактовать как изолированные
участки программы: недопустимо входить в них или выходить из них
с помощью операторов GOTO, GOSUB или RETURN. Однако в пределах определения функции такие операторы являются допустимыми.
Из определения функции можно выйти досрочно оператором EXIT
DEF, присвоив перед этим значение результата.
Функция может быть рекурсивной, т.е. вызывать саму себя.
Формальные параметры по определению являются LOCAL (местными), в памяти не сохраняются и в главной программе переменных с
аналогичным именем не изменяют. Остальные переменные являются
общими с главной программой (SHARED). Переменные, объявленные
STATIC, не зависят от главного модуля, но сохраняют значения, полученные при предыдущем обращении к функции (хранятся в памяти).
6.3 Процедуры
Процедурой называется модуль, полностью независимый от
главной программы (все переменные LOCAL по умолчанию) и наиболее соответствующий принципам структурного программирования.
Объявление процедуры может производиться в любом месте программы, но правильнее после оператора END.
SUB имя(список формальных параметров)
[объявление массивов, объявление видимости переменных]
операторы
[EXIT SUB]
операторы
END SUB
Обращение к процедуре производится оператором
CALL имя(список фактических параметров)
37
Формальные и фактические параметры должны быть одного типа и соответствовать друг другу по месту и количеству (не более 16).
В списке параметров часть их является входящими (передаются в процедуру), часть исходящими (возвращаются ею), но проверяться направление должно самим программистом. Существует опасность того,
что передаваемая переменная в процедуре изменяется и в главную
программу возвращается уже не исходное значение, но этого явно не
видно.
При вызове процедуры оператором CALL массив просто помечается как индексированная переменная, например,
CALL PROC(a(), irank),
зато в имени процедуры необходимо указывать число размерностей
массива SUB PROC(с(2), irank). При этом передаваемый массив должен быть описан в главном модуле, а массив, используемый лишь в
процедуре (динамический), может быть и описан только в ней.
Метки и номера строк в процедуре и главном модуле не должны
совпадать. Видимость переменных регулируется объявлением их типа
операторами SHARED (общие с главной программой), LOCAL (только в этом блоке, без запоминания – это тип переменных по умолчанию) и STATIC (только в этом блоке, с запоминанием).
Определения функций и процедур не могут быть вложенными,
т.е. нельзя определять процедуру или функцию в другой процедуре
или функции (хотя определение процедуры или функции может содержать вызовы других процедур или функций).
7 Работа с изображением
7.1 Графические операторы
В ТБ существуют режимы вывода на экран только текста (Screen
0) и комбинированного вывода Screen 1 – Screen 13, из них наиболее
приемлемы режимы Screen 9 (640x350 точек или пикселей) и Screen
12 (640х480). В последнем режиме у ТБ наблюдается несовпадение
положения курсора при вводе и выводе текста, поэтому его можно рекомендовать только для вывода. Не все операторы текстового режима
ведут себя аналогично в графических (это нужно проверять).
Оператор SCREEN n, где n ≠ 0 – задает графический режим работы видеоадаптера, восстанавливает исходные цвета, очищает экран
черным цветом, устанавливает текстовый курсор в строку 1, колонку
1, а графический курсор (перо) в центр экрана, делает рабочим окном
для вывода графики весь экран. Выполняется с переходом в ДОС.
38
Оператор CLS – очищает текущее окно, устанавливает текстовый курсор в строку 1, колонку 1 экрана, а графический курсор (перо)
– в центр рабочего окна. Оператор COLOR n – задает цвет n для текста (второй цвет для фона под символом не рекомендуется использовать, т.к. он заливает весь экран), по умолчанию после объявления
графического режима оператором SCREEN устанавливается цвет символов 15 (ярко-белый) и цвет фона 0 (черный). В операторе LOCATE
не действует управление курсором, отсутствует его мигание. Оператор PRINT в некоторых ОС перестает выводить символы кириллицы.
Координаты рисунка задают в пикселях слева направо (ось X) и
сверху вниз (если не использовали Window), от начала экрана (если не
использовали View), первая позиция 0,0, последняя 639,349 (для режима 9) – сначала горизонтальное смещение, потом вертикальное. Если задавали View (окно), координаты пера отсчитываются от начала
окна и ограничены его размером. Важную роль играет последняя точка пребывания пера – LPR (Last Point Reference).
Установка видимого окна для вывода графика
VIEW [(x1, y1) – (x2, y2), цвет_заливки, цвет_рамки]
Оператор VIEW без параметров задает в качестве текущего окна
весь экран. Окон на экране может быть назначено несколько, каждый
раз вывод графики производится в пределах последнего указанного
окна относительно его левого верхнего угла. Очистка окна выполняется цветом заливки при задании окна, либо оператором CLS.
Оператор WINDOW (x1, y1) – (x2, y2) – согласовывает физические координаты графика x1, y1, x2, y2 в именованных единицах с логическими координатами окна в пикселях (вписывает график в окно),
изменяет направление оси Y снизу вверх. Обычно операторы VIEW и
WINDOW записывают последовательно, связывая друг с другом.
Рисование точки в абсолютных координатах x, y
PSET (x, y) [, цвет_пера] – по умолчанию высший номер цвета в
палитре, то есть 15;
PRESET (x, y) [, цвет_пера] – по умолчанию объявленный ранее
цвет фона, например 0.
и в относительных координатах dx, dy (смещение от LPR)
PSET STEP (dx, dy) [, цвет_пера]
PRESET STEP (dx, dy) [, цвет_пера]
Рисование линии (начало x1, y1, конец x2, y2)
LINE [(x1, y1)] – (x2, y2) [, цвет_пера, BF, шаблон]
LINE STEP [(dx, dy)] – (x2, y2) [, цвет_пера, BF, шаблон]
По умолчанию используется цвет 15, при отсутствии первых
скобок с координатами отсчет идет от LPR, В – рисует рамку, F – за39
крашивает ее, поэтому может указываться только при наличии В.
Шаблон – это шестнадцатеричная константа, описывающая форму
линии (например, пунктир) в виде группы из четырех тетрад. Так, запись LINE – (19, 34),,,&h5F5F соответствует таблице
8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1
*
* * * * *
*
* * * * *
5
F
5
F
Рисование круга
CIRCLE(xc, yc), радиус [, цвет, начало_дуги, конец_дуги, аспект]
CIRCLE STEP(dxc, dyc), радиус[,цвет, начало_дуги, конец_дуги,
аспект] – здесь xc, yc – абсолютные, dxc, dyc – относительные координаты центра круга (в пикселях); если цвет не указан, то используется самый яркий в палитре, т.е. 15. Аспект определяется отношением
размера экрана по вертикали к размеру по горизонтали и равен по
умолчанию y/x=5/6 (0.73) в режиме SCREEN 9. Он необходим для получения на экране правильного круга. Если аспект меньше 1, то
уменьшается y, а x остается постоянным, если аспект больше 1, то наоборот.
LPR после вывода на дисплей окружности находится в ее центре. Оператор позволяет нарисовать часть окружности (дугу), задавая
в радианах угол начала дуги и угол ее конца (рисуется против часовой
стрелки). Если у ненулевого значения начала или конца дуги поставить
минус, эта точка будет соединена линией с центром окружности – так
строят круговые диаграммы (Pie). Пример
CIRCLE(100, 100), 20, , 1, 5
CIRCLE(100, 100), 20, , -5, -1
Закрашивание замкнутой фигуры
PAINT(x, y) [, заполнитель, ограничитель, блокировка]
PAINT STEP(dx, dy) [, заполнитель, ограничитель, блокировка]
Заполнителем может быть номер цвета (по умолчанию 15), шаблон в виде строковой константы или переменной с шестнадцатеричными числами, например "AB9DDEA" (до 64 символов) или C$, задающий коды и последовательность закраски. Ограничитель – это
цвет границы области заливки; если цвет LPR сразу совпадает с цветом ограничителя, заливка не производится, следует выбрать другую
начальную точку. Блокировка предотвращает останов заливки из-за
40
особенностей построения шаблона заполнителя. Например, два одинаковых символа подряд могут остановить заливку, тогда указывают
PAINT(80, 110), "ABCDDE", 2, "D"
Перерисовывание областей экрана (быстрое перемещение) производят операторами
' перенести изображение с экрана в массив
GET(x1, y1) – (x2, y2), массив
' перенести изображение из массива на экран
PUT(x, y), массив[, метод]
Здесь метод задает способ совмещения старого и нового изображения на экране: PSET, PRESET, AND, OR, XOR (по умолчанию
используется XOR). Размер массива для хранения изображения определяется по приблизительной формуле
(4 + INT((x*bp + 7)/8)*y)/2 ,
где bp=byte/pixel для режима SCREEN 1 соответствует 2, для
режима SCREEN 2 соответствует 1 и для режима SCREEN 9 соответствует 4. Для ширины прямоугольника x и его высоты y лучше использовать значения, кратные 4 при среднем разрешении экрана и
кратные 8 – при высоком разрешении.
В графических режимах 9 и 12 (и текстовом 0) можно использовать 64 цвета, если присваивать номерам цветов 0…15 индексы оттенков 0…63 с помощью оператора PALETTE [номер_цвета, оттенок].
Применение оператора без параметров восстанавливает соответствие
цветов по умолчанию. Изменить сразу весь ряд цветов позволяет оператор PALETTE USING массив(индекс) – используется целочисленный массив с размером, кратным 16, индекс соответствует элементу,
значение которого будет присвоено цвету с номером 0. Если элемент
массива равен –1, исходный цвет не меняется, иные отрицательные
значения не допускаются.
7.2 Макрокоманда DRAW
Макрокоманда рисования DRAW явно имеет родство с рисующей черепашкой из языка LOGO, её формат (команды в строке можно
писать без пробелов):
DRAW строка, например, DRAW "c2 u10 r15" или DRAW C$.
Команды Un, Dn, Ln, Rn, En, Fn, Gn, Hn производят перемещение графического пера с оставлением следа на n точек в соответствии
с рисунком, по умолчанию – на одну точку. Переход в произвольную
точку с абсолютными координатами x, y выполняет команда Mx, y, со
смещением относительно LPR – команда M±x, ±y.
41
B (перед командой) – выполнить команду без оставления следа;
N (перед командой) – выполнить команду и вернуться в LPR;
P цвет, граница – заливка замкнутой фигуры (Paint);
C цвет – задать цвет линии (по умолчанию 15);
Sn – изменить масштаб движения в n/4 раз (по умолчанию n=4),
где n=0…255;
Tan – повернуть направление движения на угол n градусов (минус 360…0…плюс 360);
An – повернуть всю фигуру на угол n*90 по часовой стрелке
(n=0, 1, 2, 3). Эта команда должна опережать другие команды, относящиеся к данной фигуре, но быть последней в строке, например
DRAW "A1"
DRAW "U10C2TA30BR20"
Использовать готовую подстроку можно двумя способами:
а) специальной командой DRAW "x" + VARPTR$(подстрока$),
причем буква x должна быть последней или единственной в предшествующей строке;
б) обычными строковыми операциями включения и присоединения, например
C$="U10L10D10R10"
MID$(C$, 4) = "L60"
DRAW C$
Цифру девять рисует команда
n9$="c10 r30 u60 l30 d30 r30": draw n9$
7.3 Построение графиков
График – наиболее наглядная форма представления данных, однако его информативность определяется ещё и методом построения
графика. Графики строят: с выделением окна (без), с масштабированием (без), с разметкой окна нанесением осей, сетки (без), с нанесением делений и печатью значений шкалы (без), с использованием
массива для промежуточного хранения данных (без).
Если использовать для хранения данных специальный массив
(несколько массивов), увеличивается расход памяти, зато появляется
42
возможность быстрого просмотра (вывода) данных. В ином случае
выполняются повторяющиеся циклы вычислений – первый раз для
оценки масштаба, второй раз – для построения графика, третий раз –
для вывода параметров конкретной точки графика при просмотре.
Масштаб графика по оси абсцисс часто вытекает из заданного
диапазона изменения аргумента и специально не определяется; масштаб по оси ординат нужно определять всегда.
if ymax<y then ymax=y
if ymin>y then ymin=y
За начальные значения ymax, ymin принимают:
а) заведомо крайние значения – самое большое возможное число
для ymin, самое маленькое возможное число для ymax, например
ymin=1e308; ymax= -1e308;
б) первые рассчитанные вне цикла значения (одинаково для
ymin и ymax), тогда следующие значения в цикле сравниваются с ними.
Если в языке существуют операторы вписывания в окно, например, в ТБ это пара View/Window, вычисленные значения ymin-ymax
указываются в этих операторах. При их отсутствии следует найти цену деления del=(ymax-ymin)/число_точек и в дальнейшем положение
точки по оси ординат рассчитывать в виде отступа от крайнего положения через цену деления.
Нанесение горизонтальной сетки на график (для вертикальной
разметки аналогично):
dy=abs((ymax-ymin)/N)
' здесь N - число горизонтальных линий сетки
for y=ymin to ymax step dy
line(xmin, y)-(xmax, y),8
next
Линии оси соответствуют нулевому значению какой-либо координаты. Обычно сначала проверяют, что нулевое значение есть на
графике, а потом рисуют ось, например, ось y:
If xmin*xmax<=0 then line(0,ymin)-(0,ymax),11,,&h0505
(на самом деле и рамку рисуют чуть шире, чем график, и проверку
производят не на точное равенство, а на близость к нулю – а вдруг до
нуля не хватило всего 0.001 при цене деления 100?).
43
Масштаб (крайние значения параметров) для всех осей выводят
обязательно, цену промежуточных делений – по усмотрению. Если
масштаб не нормировать, получается иногда странная цена делений,
например, 3.17354. Способы нормирования – цену делений делают
кратной целым единицам, например, вместо 3.17354 будет 4.0 (оператор ceil); выравнивают масштаб оси относительно нуля – с обеих сторон будет одинаковое крайнее значение; приводят к квадратной сетке
– по оси x и y будет одинаковый размер (удобно отсчитывать углы на
комплексной плоскости в реальном масштабе). Если значения слишком малы или велики, выводят отдельно общий множитель типа
x102...
Например, выравнивание масштаба по оси y:
if ymin*ymax<0 then
if ymax>abs(ymin) then
ymin=-abs(ymin)
else
ymax=-ymin
end if
end if
печать цены делений у оси Х
x=xmin
for i=0 to 3
locate NL, 40+i*10
print using "######.###";x
x=x+dx
next
Для графика нескольких переменных нужно производить масштабирование каждой переменной и затем вписывать кривые в общий
график, выбирать цвет или вид маркеров каждой кривой, предоставлять пользователю возможность выбора числа кривых, вывода параметров по каждой кривой. Увеличивается общее время счета или расход памяти (возрастает количество массивов).
Обычно кривую удобно чертить оператором LINE, т.к. он создает впечатление непрерывности, в этом случае первую точку графика
рассчитывают вне цикла и рисуют оператором PSET. Однако при
большом расстоянии между точками спиральных кривых график становится ломаной линией, тогда добавляют число промежуточных точек в этом интервале путем дополнительного расчета по формуле или
аппроксимации.
44
Иногда для большей равномерности графика приходится делать
неравномерным шаг – например, при построении частотных характеристик обычно в начале интервала частота должна изменяться медленнее, чем в конце. При бросках или разрывах в особых точках кривой (график фазовой характеристики) приходится искать специальные
методы сглаживания кривой. Если при остановке курсора или указателя мыши на точке кривой предусмотрен вывод ее параметров, следует найти форму (место) вывода этих данных.
Как правило, в итерационных методах требуется знать координаты пересечения кривой с осями – например, при отделении корней,
построении частотных характеристик. Обычно для этого фиксируют
изменение знака функции при текущем шаге, запоминая предыдущие
значения f(xi)*f(xi+1)<0. Если задана точность eps определения точки
перехода оси (в абсолютном измерении или, что лучше, как доля от
диапазона), далее изменяют направление движения и/или значение
шага. Поиск производят до тех пор, пока не будет достигнута заданная величина шага или функции, например, abs(f(xi+1) – f(xi))<eps, либо не будет исчерпано допустимое число итераций. Затем движение
возобновляют с первоначальным шагом в первоначальном направлении. Могут использоваться и другие методы, например, деление отрезка пополам.
Глобальный максимум (минимум) функции в заданном интервале обычно определяют по масштабу, локальный – по изменению
знака разницы соседних значений функции
sgn(f(xi+1)–(xi))<>sgn(f(xi)–f(xi-1)).
Пример построения графика синусоиды с масштабированием
ymax=-1.e-37:ymin=1.e37
for i=0 to 200
res=sin(0.0314*i)
if ymin>res then ymin=res
if ymax<res then ymax=res
next
view (150,200)-(350,300),8,12
window(0,ymin)-(200,ymax)
line(0,0)-(200,0),2,,&h0505 ‘ ось абсцисс
'повторяем расчет без использования массивов
for i=0 to 200
res=sin(0.0314*i)
pset (i,res),15
next
45
8 Считывание данных
8.1 Ввод данных из программы
Для загрузки больших объемов неизменяемых в дальнейшем
данных, хранящихся в теле (Body) программы, используются операторы:
DATA список – хранит данные, перечисленные в виде списка
через запятую. Число операторов DATA не ограничивается, они не обрабатываются компьютером и могут находиться в любом месте программы. Следует учесть, что комментарий, обозначенный апострофом, может восприниматься как часть данных последнего элемента
списка, для этого случая рекомендуется использовать :REM.
READ список – задает порядок чтения данных из списка данных
и тип данных (должен соответствовать). При запуске программы всегда начинает чтение с первого элемента первого оператора DATA, каждый раз смещение увеличивается на единицу. При выходе смещения
за пределы последнего элемента последнего оператора DATA возникает ошибка.
RESTORE [n] – оператор установки смещения на строку с номером (меткой) n, позволяет читать данные многократно. Если n отсутствует, указатель смещения автоматически сбрасывается, т. е. устанавливается на первый оператор DATA в тексте.
В старых версиях Бейсика таким способом вводили подпрограммы на Ассемблере или готовые рисунки, большие массивы неизменных данных, сейчас предпочтительнее ввод данных из специального
файла. Кроме того, если размер кодов не превышает одного байта, т.е.
значения 255, их можно хранить как символы в строковой переменной, считывая из неё с помощью изменяемого смещения.
8.2 Ввод данных с экрана
Функция POINT(код) – позволяет получить параметры графика
с экрана для кода:
0 – текущую логическую координату x LPR в пикселях;
1 – текущую логическую координату y LPR в пикселях;
2 – текущую физическую координату x LPR в системе единиц
пользователя;
3 – текущую физическую координату y LPR в системе единиц
пользователя.
Функция POINT(x, y) – позволяет получить номер цвета 0…15
точки графика с заданными координатами x, y в текущем окне без
учета палитры.
46
Функция POS(n), где n – любое число, позволяет узнать текущее
положение текстового курсора в строке (столбец). Функция CSRLIN
позволяет узнать текущее положение курсора в столбце (строку).
Следующий фрагмент программы перемещает курсор на строку
вверх и на столбец влево относительно текущего положения:
x=CSRLIN: y=POS(0) ‘ находим текущее положение курсора
LOCATE x-1, y-1
‘ помещаем курсор на новое место
Функция SCREEN(строка, колонка [, 0 – код символа| 1 – цвет
символа]) – позволяет получить код или цвет символа, находящегося в
заданной точке экрана. Пример
' узнать код символа во 2-й строке и 3-м столбце
icode=SCREEN(2,3)
' узнать цвет этого символа
icolr=SCREEN(2,3,1)
Точнее icolr содержит сумму номеров цветов знакоместа в кодированном виде (без учета возможности изменения краски в режимах
SCREEN 0 – SCREEN 9 оператором PALETTE).
мигание
16
128
цвет фона
4
2
1
R
G
B
64
32 16
яркость
8
8
цвет символа
4
2
1
R G
B
4
2
1
Здесь R, G, B – основные цвета Red, Green и Blue (красный, зеленый и синий), из которых формируются остальные оттенки. Используя логическую операцию AND, можно уточнить конкретные параметры, например, если icolr AND 128 = 1, то символ мигающий.
47
9 Работа с памятью и системными переменными
Функция FRE(n) возвращает объем доступной памяти в байтах,
результат зависит от значения n:
FRE(0) – доступное символьное пространство (для хранения
строк);
FRE(-1) – доступная память массивов;
FRE(-2) – доступный объем стека.
Например, для единственной в программе команды PRINT
FRE(0), FRE(-1), FRE(-2) были напечатаны значения 65512, 359808 и
1016.
DATE$ – функция возвращает строку с текущей датой в формате "мм-дд-гггг", оператор позволяет присвоить новое значение в том
же формате.
TIME$ – функция возвращает строку с текущим временем в
формате "чч:мм:сс", оператор позволяет присвоить новое значение в
том же формате.
Функция TIMER – возвращает вещественное значение двойной
точности, целая часть которого соответствует в секундах полному
времени, прошедшему с начала суток, и может быть в пределах от 0
до 86400. Подсчет длительности какого-либо процесса обычно ведут
от зафиксированного значения, например
start=timer
do
loop until timer-start>0.06
print start,timer
Оператор DELAY n – задает паузу в выполнении программы на
n секунд, допускает установку дробных чисел с шагом не менее чем
0.054 с.
Прямой доступ к памяти позволяет прочесть или изменить содержание ячеек памяти компьютера из программы. Для этого предварительно задают область памяти (сегмент) DEF SEG [=адрес]. Затем
внутри этого участка памяти указывают смещение нужной ячейки относительно начала сегмента. После необходимых действий следует
восстановить текущий сегментный адрес командой DEF SEG без параметров.
Num = PEEK(смещение) – прочесть содержимое ячейки памяти
с заданным адресом в переменную Num.
POKE смещение, значение – присвоить ячейке памяти по указанному адресу новое значение.
48
Получить значения адреса сегмента памяти, где хранится интересующая нас переменная, и ее смещения в сегменте можно соответственно с помощью функций
Addr=VARSEG(имя_переменной)
Index=VARPTR(имя_переменной),
либо узнать имя переменной, которая хранится по известному адресу
Name$=VARPTR$(адрес), например
B%=55
DEF SEG=VARSEG(B%)
Address%=VARPTR(B%)
PRINT PEEK(Address%)
10 Обработка ошибок
Оператор ON ERROR GOTO адрес – при появлении ошибки в
выполнении программы передает управление на строку с указанным
адресом, где можно определить характер ошибки, закончить работу
или просто выдать сообщение. В программе может находиться несколько таких операторов, выполняется ближайший предшествующий
месту появления ошибки.
Оператор RESUME [адрес| NEXT] – ставится в конце блока обработки ошибки, позволяет вернуться на строку с указанным адресом,
или перейти на оператор, следующий за вызвавшим ошибку, либо повторно выполнить оператор с ошибкой (если оператор RESUME используется без параметров).
Оператор ERROR номер_ошибки – позволяет вызвать требуемую ошибку специально для целей отладки программы.
Имеются системные переменные, хранящие:
ERL – номер строки с ошибкой (не метку);
ERR – код последней ошибки;
ERADR – адрес последней ошибки.
11 Взаимодействие с DOS
При формировании команд для работы с дисковой операционной системой должны выполняться стандартные требования DOS,
например, правила именования файлов и каталогов, применения масок (шаблонов) типа * или ? и т.д (приложение А).
Оператор NAME "имя_файла1" AS "имя_файла2" – индивидуальное переименование файла на диске, например
NAME "read.bak" AS "read.bas"
49
Он может переместить файл в другой каталог, например name
"box.bak" as "\basics\box.bak", но не может переместить каталог.
Оператор KILL "имя_файла" – удаляет файл (группу файлов при
использовании шаблона) с диска, кроме файлов, имеющих атрибут
«скрытый» и «только для чтения».
Оператор FILES ["имя| маска"] – выводит на экран по столбцам
список всех или избранных файлов из заданного каталога, не требуя
оператора PRINT. Например, files "*.bak"
Оператор MKDIR "имя" – создает новый каталог.
Оператор CHDIR "имя" – переход в указанный каталог, допускаются команды типа CHDIR "\" или CHDIR "..".
Оператор RMDIR "имя" – удаляет заданный пустой каталог,
путь не должен превышать 127 символов.
Оператор SHELL [строка параметров] загружает и выполняет
порождаемый процесс (исполняемый файл).
Строка параметров представляет собой символьное выражение,
которое содержит имя запускаемой программы .COM, .EXE или .BAT
или команды ДОС, например, SHELL "DIR /w" или SHELL "DIR>
dir.txt". Кроме того, она может содержать параметры, которые вы хотите передать порождаемому процессу. Например,
print "выберите тип файла > ";
line input f$
' введен тип *.BAK
shell "DIR "+f$+"/o:s"
' вывод с сортировкой по размеру
После завершения заданной программы или команды выполнение основного модуля продолжается со следующего оператора.
Если "строка параметров" опущена, то появляется запрос DOS,
и можно вводить стандартные команды DOS, например, DIR, COPY, в
интерактивном режиме. Возврат в исходную программу производится
вводом команды EXIT в ответ на запрос DOS.
Оператор CHAIN присоединяет в ходе выполнения программы
следующий файл и передает ему управление (в BAS-файлах присоединяемый файл должен быть тоже BAS, в EXE – тоже EXE).
Доступные переменные среды (COMSPEC, PATH, TEMP и т.п.)
можно получить функцией ENVIRON$, например
for i=1 to 10:print environ$(i):next
а оператором ENVIRON строка временно изменить их содержание.
50
12 Работа с файлами данных
В Бейсике все файлы делятся на три типа: файлы с последовательным доступом, файлы с параллельным доступом и двоичные файлы.
12.1 Файлы последовательного доступа
Последовательные файлы являются аналогом клавиатуры и экрана: все, что выводилось на монитор, в таком же виде и по тем же
правилам выводится в файл или вводится из него.
Последовательный файл состоит из записей, доступ к которым
осуществляется последовательно, т.е. n+1 запись следует за n-ой как
при формировании файла, так и при считывании из него. Создание
последовательного файла включает следующие шаги: открытие файла
(оператор OPEN), вывод данных в файл (операторы PRINT#, WRITE#,
или PRINT# USING) и закрытие файла (оператор CLOSE).
Считывание из последовательного файла включает следующие
шаги: открытие файла, ввод данных из файла (операторы INPUT#,
LINE INPUT#, INPUT$), закрытие файла.
Оператор OPEN подготавливает файл для чтения из файла
(INPUT) или записи в файл (OUTPUT, если создается новый файл,
APPEND, если добавляются записи в уже существующий файл) и
имеет две формы – полную и краткую. Полная форма:
 INPUT 
OPEN имя_файла FOR OUTPUT  AS #номер_канала
 APPEND 


Краткая форма:
OPEN {"I"|"O"|"A"}, #номер канала, "имя_файла"
Имя файла указывается в кавычках или в виде строковой переменной и должно при необходимости включать полный маршрут
(путь), при работе с несколькими файлами номера каналов не должны
совпадать.
Оператор CLOSE закрывает файл, т.е. делает невозможным чтение или запись. Он имеет формат CLOSE [#номер_канала]. Оператор
CLOSE без параметров закрывает все открытые файлы.
Функция EOF(номер_канала) – позволяет обнаружить наступление конца файла, обычно входит в цикл чтения данных WHILE NOT
EOF() … WEND.
51
Единицей информации, которая передается при записи в файл
или чтении из файла, является запись (логическая запись). Запись делится на поля. Каждое поле связано с одним элементом данных.
Могут быть созданы два типа последовательных файлов:
1) с разделителями полей, когда каждое поле автоматически отделяется специальным символом (например, запятой, знаком табуляции). Для создания такого файла используется оператор WRITE#, для
чтения из него оператор INPUT#.
Данные в файле хранятся в таком виде, как если бы они набирались на клавиатуре при выполнении оператора INPUT, т.е. разделены
запятыми и каждая запись заканчивается переводом строки. Оператор
INPUT# имеет вид
INPUT #номер файла, список переменных
где переменные в списке по типу должны соответствовать данным в
файле.
2) поля не разделены, и каждая запись точно такая же, как если
бы эти данные отображались на экране или печатались на принтере.
Для создания такого файла используется оператор PRINT#, для чтения
из него – операторы INPUT$ или LINE INPUT#. Оператор INPUT$ передает из файла сразу всю строку (запись) указанной длины n в символьную переменную, например, ST$
ST$ = INPUT$(n, #номер_канала)
Оператор LINE INPUT# передает в указанную переменную ST$
всю строку независимо от ее длины
LINE INPUT #номер_канала, ST$
Пример (с разделителями полей):
DATA "Иванов", 1972, 75.3, "Петров", 1975, 62.5
OPEN "SEQU.DAT" FOR OUTPUT AS #1
' записываем данные в файл
for i=1 to 2
READ ST$, IT%, FLOT!
WRITE #1, ST$, IT%, FLOT!
NEXT
CLOSE #1
OPEN "SEQU.DAT" FOR INPUT AS #1
' читаем данные из файла
WHILE NOT EOF(1)
INPUT #1, ST$, IT%, FLOT!
PRINT ST$, IT%, FLOT!
WEND
CLOSE #1
END
52
Распечатанное содержимое файла будет следующим:
ИВАНОВ
1972
75.3
ПЕТРОВ
1975
62.5
Пример (без разделителей полей):
OPEN "SEQUEN.DAT" FOR OUTPUT AS #1
ST$ = " ИВАНОВ ": IT% = 1972: FlOT! = 73.1
'записываем строку текста в файл
PRINT #1, ST$, IT%, FLOT!
ST$ = " ПЕТРОВ ": IT% = 1975: FLOT! = 64.3
'запишем другую строку и в ином порядке, используя оператор
PRINT #1, USING "+####$#.##^^^^"; IT%, ST$, FLOT!
CLOSE #1
END
Содержание созданного файла будет таким:
ИВАНОВ 1972 73.1
1975 ПЕТРОВ 6.43Е+01
Следующая программа читает из этого файла:
OPEN "SEQUEN.DAT" FOR INPUT AS #1
ST$ = INPUT$(80,#1) ‘ первый способ
PRINT ST$
LINE INPUT #1, ST$ ‘ второй способ
PRINT ST$
CLOSE #1
END
12.2 Файлы параллельного доступа
Файл прямого (или параллельного) доступа состоит из записей,
доступ к которым возможен в произвольном порядке по номеру записи, записи состоят из полей и имеют одинаковую (фиксированную)
длину. В программе можно обращаться к отдельным полям записи, но
ввод-вывод всегда происходит целой записью.
Создание файла прямого доступа включает следующие шаги:
открытие файла (оператор OPEN); задание структуры записи файла,
или разметка буфера (оператор FIELD); передача записи в буфер
(операторы LSET или RSET); пересылка содержимого буфера в файл
(оператор PUT); закрытие файла (оператор CLOSE – обязательный!).
Если номер записи в операторе PUT не указан явно, буфер помещается на место текущей записи, при открытии файла указатель текущей
записи равен 1, после каждой операции ввода или вывода указатель
автоматически сдвигается на следующую запись
53
Записи передаются в виде строк символов. Поэтому в операциях
вывода/ввода необходимо использовать соответствующие функции
преобразования данных в строку символов и обратно.
Ниже перечислены функции для преобразования при записи:
CHR$(x) – целого числа до 256 в однобайтовую строку;
MKI$ (MKL$) – целого (длинного целого) в 2-х (4-х) байтовую
строку;
MKS$ (MKD$) – вещественного (вещественного двойной точности) в 4-х (8-ми) байтовую строку.
Преобразование при считывании:
ASC(x$) – однобайтовой строки в целое число, меньшее 256;
CVI(CVL) – 2-х (4-х) байтовой строки в целое (длинное целое);
CVS(CVD) – 4-x (8-ми) байтовой строки в вещественное число
(вещественное двойной точности).
Считывание из файла прямого доступа включает также пять шагов: открытие файла; разметка буфера; передача записи из файла в
буфер (оператор GET); обработка данных буфера (переменные буфера
доступны из программы); закрытие файла.
Если вывод в файл и ввод из файла осуществляются в одной
программе, то открытие и закрытие файла осуществляется один раз
перед началом и после окончания всех операций с файлом.
Оператор OPEN имеет вид
OPEN имя_файла AS #номер_канала LEN=длина_записи (отсутствие указания режима ввода или вывода означает, что файл прямого
доступа). Иначе
OPEN "R", #номер_канала, имя_файла, длина_записи
OPEN имя_файла FOR RANDOM AS #номер_канала LEN= длина_записи
Оператор FIELD устанавливает последовательно число байт для
каждого поля записи и имеет вид
FIELD #номер_канала, n1 AS имя1 [ , n2 AS имя2, ...] , где n1,
n2, ... – длина поля в байтах под строковые переменные имя1, имя2, ...
Операторы LSET, RSET имеют вид
LSET имя = символьное выражение, например
LSET NAME$="Иванов".
RSET имя = символьное выражение
Оператор LSET (RSET) заполняет одно поле записи в буфере
(оператор LSET – с начала, RSET – с конца, оставшиеся позиции заполняются пробелами).
54
Оператор PUT #номер_канала [, номер_записи] – передает содержимое буфера в файл на место записи с указанным номером (или
текущей, если номер не указан).
Оператор GET #номер_канала [, номер_записи] – передает содержимое записи с указанным номером в буфер (если номера нет, передается текущая запись).
Функция LOF(номер_канала) – позволяет получить размер файла в байтах.
В качестве примера приводится программа, которая формирует
файл прямого доступа из записей следующей структуры:
N п/п Фамилия Год рождения
В программе эти переменные обозначены как n%, nam$, dat%;
для соответствующих полей буфера используются обозначения np$ (2
байта), nm$ (10 байт), dt$ (6 байт).
OPEN "GSR.DAT" AS #1 LEN = 18
FIELD #1, 2 AS np$, 10 AS nm$, 6 AS dt$
FOR i%=1 to 3
INPUT n%, nam$, dat%
LSET np$ = MKI$ (n%)
LSET nm$ = nam$
LSET dt$ = MKI$ (dat%)
PUT #1,i%
NEXT i%
CLOSE #1
END
Следующая программа осуществляет ввод данных из файла
GSR.DAT и их печать в обратном порядке.
OPEN "GSR.DAT" AS #1 LEN = 18
FIELD #1, 2 AS np$, 10 AS nm$, 6 AS dt$
FOR i% = 3 to 1 STEP -1
GET #1, i%
n% = CVI(np$)
dat% = CVI(dt$)
PRINT n%, nm$, dat%
NEXT i%
CLOSE #1
END
12.3 Двоичные файлы
Если файл определен, как двоичный, он допускает работу с любым байтом независимо от собственной структуры и содержимого
этого байта. Основа работы – указатель, который непрерывно отсле55
живает смещение заданного байта относительно начала файла (первый элемент файла имеет индекс 0).
Оператор открытия файла – полная форма
OPEN имя_файла FOR BINARY AS #номер_канала
или краткая форма
OPEN "B", #номер_канала, имя_файла
Пример Open "b", #1, "c:\User\AS11\readmy.dat".
Оператор SEEK #номер_канала, смещение – устанавливает указатель на нужный байт в файле по его позиции (смещению).
Оператор PUT$ #номер_канала, строка – записывает строку
символов в файл, начиная с заданной позиции.
Оператор GET$ #номер_канала, число_байт, строка – читает
заданное количество байт из файла в строку символов, начиная с заданной позиции.
Функция LOC(номер_канала) – возвращает текущую позицию
указателя в файле.
Функция LOF(номер_канала) – возвращает длину файла, можно
использовать и EOF(номер_канала).
Существует возможность сохранения содержимого участка памяти в двоичный файл
BSAVE имя_файла, адрес_начала_участка_памяти, длина_участка_памяти
и его загрузки в память из файла
BLOAD имя_файла, адрес_начала_участка_памяти.
Например, поскольку адрес начала видеопамяти &hB800, а размер этой области &h4000, можно сначала сохранить картинку с экрана
на диск в виде двоичного файла
DEF SEG=&HB800
BSAVE "C:\User\Screen.dat", 0, &H4000
а затем прочесть ее с прямым выводом на экран
DEF SEG=&HB800
BLOAD "C:\User\Screen.dat", 0
56
13 Управление звуком
Оператор BEEP [n] – выводит на системный динамик n звуковых сигналов частотой 800 Гц и длительностью 0.25 с, по умолчанию
n=1. Если используется без параметра n, то формирует одиночный
сигнал аналогично PRINT CHR$(7).
Оператор SOUND частота, длительность – выводит звук заданной частоты (от 37 до 32767 Гц), не останавливая выполнение других операторов, в течение интервала времени, измеряемого в тиках
(один тик равен 1/18 с). Например, для четвертой октавы нота "до" –
это 262 Гц, "ре" – 294 Гц, "ми"- 330 Гц, "фа" – 349 Гц, "соль" – 392 Гц,
"ля" – 440 Гц, "си"- 494 Гц, "до" следующей октавы – 524 Гц.
Оператор PLAY строка – позволяет воспроизвести любое музыкальное произведение, размер строки ограничен емкостью музыкального буфера (может изменяться при компиляции). Основные сведения:
- ноты до, ре, ми, фа, соль, ля, си любой октавы обозначаются буквами
C, D, E, F, G, A, B; диез (# или +) или бемоль (-) после символа ноты
выбирает черную клавишу;
- абсолютное значение Nn позволяет напрямую задать одну из существующих (1…84) нот;
- октава задается командой On, где n=0…6 (по умолчанию подразумевается 4 октава); знак >n увеличивает номер октавы и задает ноту n,
знак <n – уменьшает номер октавы;
- длительность звука задается как Lm, где m=1…64 (1 – это нормальная длительность, 2 – это ½ нормальной, 4 – это ¼ нормальной и т.д;
- темп задается в виде Tn, где т=32…255 (по умолчанию выбрано число 120);
- пауза задается как Pn, где n=1…64$; точки в конце ноты (паузы) увеличивают их длительность (каждая – в 1,5 раза);
- дополнительно: MF – музыка с приоритетом (играть сразу), MB –
фоновая музыка (когда ждет), ML – легато (L), MS – стаккато (3/4 L),
MN – нормальное исполнение (7/8 L).
Функция PLAY(x), где x – фиктивный аргумент, возвращает оставшееся количество нот в музыкальном буфере.
57
14 Команды компиляции
Псевдокоманды компиляции $СОМ, $INLINE, $DYNAMIC,
$SEGMENT, $EVENT, $SOUND, $IF/$ELSE/$ENDIF, $STACK,
$INCLUDE, $STATIC, включаются в текст программы, но не используются в ходе ее выполнения, а лишь влияют на процесс компиляции.
Рассмотрим синтаксис команд:
$COMn size, (n – указывает номер адаптера, size –задает размер
буфера этого адаптера);
$DYNAMIC (указывает транслятору, что явно не описанные
массивы нужно размещать динамически);
$EVENT {ON, OFF} (указывает, что программы могут обмениваться событиями);
$IF (выражение 1) [$ELSE (выражение 2)] $ENDIF (позволяет в зависимости от условия включать в текст программы во
время компиляции либо выражение 1, либо выражение 2; допустима
глубина вложения операций $IF не более 256);
$INLINE [byte_list] : (filespec literal) (позволяет включить в текст
программы подпрограмму в машинных кодах из другого файла);
$INCLUDE filename (указывает место в программе, куда вставляется файл, хранящийся на диске);
$SEGMENT (указывает начало нового сегмента программы, используется, если программа превышает 64 Кбайт);
$SOUND buffer_size (задание буфера фона в операторе PLAY;
от 1 до 4096 нот).
$STACK count (задание размера стека во время выполнения;
count – число в интервале от 1024 до 32 К, по умолчанию – 1024 бит);
$STATIC (размещение явно не объявленных массивов статически, память для них отводится во время компиляции).
58
Литература
1 Смирнов Н. Н. Программные средства персональных ЭВМ. –
Л.: Машиностроение. Ленингр. отд-ние, 1990. – 272 с.
2 Светозарова Г. И. Описание языка Турбо-Бейсик: Справочное
пособие для студентов всех специальностей. – М.: Изд-во МГИСиС,
1994. – 33 с.
3 Алиев В. К. Языки Бейсик. – М.: Изд-во «Солон-Р», 2000. –
224 с.
4 В. Е. Алексеев и др. Вычислительная техника и программирование. Практикум по программированию – М.: Высш. шк., 1991. –
400 с.
59
Приложение А
(справочное)
Программирование в DOS
Дисковая операционная система DOS – это среда программирования-интерпретатор. Она имеет два режима – прямой и программный. В прямом режиме команды анализируются и выполняются сразу после ввода. Команды могут быть внутренними и внешними (файлы), последние у Windows помещены в папку Command. Внутренние
команды DOS находятся в файле COMMAND.COM.
Язык DOS лежит в основе многих программ и используется при
установке/ удалении самой Windows. Программа ДОС пишется в виде
пакетного (Batch) файла. Это обычный текстовый файл с расширением .BAT, в котором каждой команде соответствует одна строка, функции редактирования в самой ДОС ограничены.
Дисковая операционная система MS DOS 6.22 выпущена фирмой Microsoft. Загрузка ДОС производится после нажатия клавиш
Ctrl+Alt+Del, при нажатии RESET, при включении питания, из Windows (сеанс MS DOS, командная строка).
Порядок загрузки: BIOS (базовая система ввода-вывода),
IO.SYS и MSDOS.SYS, CONFIG.SYS, COMMAND.COM (командный
процессор – интерпретатор), AUTOEXEC.BAT (пакетный файл, исполняемый автоматически в конце загрузки). Модуль BIOS производит проверку памяти, конфигурации ПК и передает управление. Загрузка производится – с гибкого диска А: (В:), если в нем находится
системная дискета, иначе с жесткого диска С:.
Используемые знаки ДОС: > – перенаправление (замещение),
>> – добавление в конец.
Имена стандартных устройств, с которыми работает ДОС:
AUX
- асинхронный порт,
COM1-COM3
- последовательные (series) порты,
LPT1-LPT3
- параллельные порты,
PRN
- принтер (печатающее устройство),
CON (Console) - при вводе клавиатура, при выводе экран,
NUL
- пустое устройство, позволяет не выполнять
ввод/вывод,
DISKNAME:
- имя дисковода.
Все данные в ПК хранят на дисках, имя диска – одна латинская
буква с двоеточием. Гибкие диски (Floppy Disk, 5.25" или 3.5", внешние носители) имеют имя А: или В:, жесткий диск (Hard Disk, внутри
60
компьютера) С: и далее. Физический жесткий диск может быть разбит
на несколько логических D:, E: и т.д.
При записи на диски данные объединяют в файлы (FILE). Файл
– поименованный набор данных одного назначения, записанный на
носителе. Характеристики файла, отличающие его от других: имя
(NAME), тип или расширение (EXT), размер (SIZE), дата (DATE) и
время (TIME) его создания, атрибуты (ATTRIBUTES). Имя в формате
DOS содержит 1...8 символов, буквы (латинские) или цифры, всегда
начинается с буквы (не допускается пробел! можно подчеркивание _).
Расширение содержит 0...3 символа, пишется после точки, например, CONFIG.SYS; если расширение не указывается, точка не
нужна. Расширение отображает формат и содержание файла, определяет запускающую программу. Например, .SYS – системный, BAT,
COM, EXE – исполняемые (запускаются сами), BAS, PAS – на языках
Бейсик и Паскаль, BAK – предыдущая версия (копия) файла, TXT,
DOC – текстовые, BMP, PCX – графические, BIN – в двоичном коде.
Размер файла указывают в байтах. Атрибуты отражают дополнительные свойства файла – S (System) – системный, R (Read Only) –
только для чтения, A (Archive) – архивный, H (Hidden) – скрытый, D
(Directory) – каталог, папка.
На диске файлы помещают в папки (каталоги) DIR, которые могут быть и пустыми. Мы находимся в текущем каталоге. Имя каталога содержит 1...8 символов, отделяется чертой \, может иметь расширение. Главный (первый) каталог диска не имеет имени, называется
корневым (ROOT) и обозначается только символом \ (обратный слеш).
Путь к файлу (PATH) задается списком последовательно вложенных
каталогов, например, C:\USER\ES11\readme.txt. Имена текущего каталога и текущего дисковода могут не указываться. Совокупность всех
путей диска образует дерево каталогов (TREE). Число вложений каталогов в ДОС не должно быть более восьми.
Общие команды ДОС
После загрузки ПК и выполнения команд выводится приглашение ДОС, например, F:\>_. Строка с приглашением называется командной. Ввод команд заканчивается нажатием Enter. Клавиши F3,
управления курсором позволяют вернуть предыдущие команды. Вызов справки по любой команде имеет вид ИМЯ_КОМАНДЫ /?
Рассмотрим лишь некоторые команды ДОС.
CLS
- очистить экран
VER
- показать номер версии
MODE device var - задание режима работы устройства device
61
EXIT
ложение
MEM
/m /p)
DATE [дата]
TIME [время]
MORE файл
Ctrl+C
Ctrl+S
- возврат из командного процессора в при- показ распределения памяти (ключи /c /d /f
- чтение или установка даты
- чтение или установка времени
- вывод текстового файла постранично
- приостановить выполнение
- приостановить вывод
Работа с каталогами
Для перехода на другой диск (смены диска) нужно указать имя
диска с двоеточием, например, F:\>U: (перейти на U). Просмотр содержания каталога производится по команде DIR. Она имеет много
вариантов (если не для текущего каталога, то нужно указывать полный путь, начиная от корневого каталога):
DIR - распечатать содержание текущего каталога,
DIR R: или DIR R:\ – просмотр корневого каталога диска R,
DIR>katalog.txt или DIR G:\DOS >dir.txt – сохранить содержание каталога в виде файла,
DIR имя_каталога > PRN – вывести содержимое каталога на
принтер,
DIR имя_файла – показать параметры только этого файла.
Можно обращаться сразу к нескольким файлам, используя маски (шаблоны). Шаблон * заменяет все неуказанные символы в имени
или расширении файла, ? – только один, например, *.BAS – все файлы
с расширением BAS, T*.B? – все файлы с первой буквой имени T и
двумя символами в расширении, причем первый из них B, *.* – вообще все файлы каталога (All).
. .. означает вложенный каталог.
Ключи команды DIR (ключи управляют дополнительными возможностями команды, минус перед значением ключа меняет его на
противоположное):
/p – вывод по страницам, /w – по столбцам, /b – только имена,
/L – в нижнем регистре, /v – полные сведения, /s – включая содержание подкаталогов, /o – с сортировкой, /a – с учетом атрибутов
[/o:n – вывод с сортировкой по имени, /o:e – по типу, /o:s – по
размеру (с меньшего), /o:d – по дате (с последнего), /o:g – поместить
каталоги в начале списка, просто /o – сортировка по именам внутри
групп].
62
[/a – все, включая скрытые и системные, только /a:s, /a:a, /a:r,
/a:h, например, /a:d – только каталоги, /a:-d – без каталогов].
Смена каталога: CD (Change Dir), например, CD OS2 – перейти
ниже в каталог OS2, CD .. – подняться на уровень выше, CD ..\.. – подняться на два уровня выше, CD \ – перейти в корневой каталог.
Создать каталог: MD (Make Dir), например, MD etus1102, MD
c:\user\proba.
Удалить каталог: RD (Remove Dir), например, RD probe. Нельзя
удалить в DOS непустой, текущий и корневой каталоги.
Работа с файлами
Запуск исполняемых файлов производится просто вводом их
имени (как команд).
Создать файл путем ввода данных с клавиатуры:
COPY CON имя_файла,
TYPE CON> имя_файла,
TYPE CON>>имя_файла (если такой файл уже существует, то
дописать). Конец ввода обозначается EOF (End Of File) и выполняется
клавишей F6 или комбинацией Ctrl+Z.
Вывести содержимое файла на экран (распечатать):
TYPE имя_файла
COPY имя_файла CON
MORE имя_файла
Переименовать файл: REN имя1 имя2 (Rename)
Удалить файл: DEL имя_файла или ERASE имя_файла. Ключи:
/p – запрашивать подтверждение. Нельзя удалить файл с атрибутами
R, H, S, сначала следует эти атрибуты снять.
Копирование:
COPY имя1 имя2 – создать копию первого файла под вторым
именем;
COPY имя1+имя2 – присоединить в конец первого файла содержимое второго без изменения имен файлов;
COPY имя1+имя2 имя3 – создать под третьим именем файл с
суммой содержимого первого и второго файлов;
COPY файл каталог – создать копию файла с тем же именем в
другом каталоге;
COPY файл PRN – распечатать содержимое файла на принтере;
ключи: /v – с проверкой, /y – отключить подтверждение, /-y –
включить подтверждение.
Назначить атрибуты (+ установить, – снять):
ATTRIB [+R -R +A -A +H -H +S -S] [имя_файла]
63
Команда ATTRIB без параметров отображает содержимое каталога с указанием атрибутов для каждого файла;
команда без имени файла присваивает (снимает) указываемый
атрибут для всех файлов каталога;
команда с ключом /s – всех файлов, включая подкаталоги.
Пересылка файлов, переименование каталогов – команда
MOVE, например,
переименование MOVE dir1 dir2
MOVE [/y|/-y] файл1 файл2
пересылка файла MOVE [/y|/-y] файл1 каталог (старые файлы
стираются!)
MOVE [/y|/-y] файл1, файл2 каталог – пересылка группы файлов.
Команда не выполняется для файлов с атрибутами R, H, S без
снятия этих атрибутов.
Работа с дискетой
FORMAT диск – форматирование (все данные теряются!). Ключи /v:название – с записью метки диска (не более 11 символов), /s – с
записью системных файлов, /b – оставить место под системные файлы, /q – быстрое форматирование. Быстрое форматирование очищает
только оглавление диска (FAT и корневой каталог), полное форматирование очищает весь диск и помечает плохие сектора, его рекомендуется проводить регулярно.
LABEL [диск:] [метка] – создание, изменение и удаление имени
тома (диска).
SYS каталог(откуда) диск(куда) – запись системных файлов на
диск с зарезервированным местом.
DISK COPY [диск(откуда) [диск(куда)]], – копирование дискет,
ключ /m – через память, по умолчанию используется дисковод А:.
CHKDSK (SCANDISK) – проверка диска.
Командные (пакетные) файлы (.BAT)
Это программа в виде обычного текстового файла, в котором
последовательно записаны команды ДОС (одна команда – одна строка). Выполнение каждой команды ДОС сопровождается её распечаткой на экране.
ECHO ON/OFF – включить/отключить вывод всех сообщений на
экран,
@ перед строкой – отключить показ на экране сообщений для
этой строки,
64
echo текст– распечатать на экране заданный текст,
:NAME – метка (адрес) NAME для передачи управления,
GOTO метка – оператор безусловной передачи управления,
IF условие действие – действие по выполнению условия, например, передача управления по указанному адресу,
== – знак равенства,
= – знак присвоения,
REM текст – строка с комментарием программиста,
CALL имя.BAT – вызов одного пакетного файла из другого,
PAUSE – приостановка выполнения пакетного файла с выводом
сообщения "нажмите любую клавишу для продолжения",
CHOICE … – выбор пользователя (ответ помещается в переменную errorlevel),
PATH C:\; C:\NC;..;..\.. – установка пути для быстрого поиска
файлов,
SET TMP=C:\TEMP – установка значений системных переменных (TEMP – каталог для временных файлов), здесь = символ присвоения значения,
FILES n – число одновременно открытых файлов n,
BUFFERS n – число открытых буферов,
DEVICE=C:\MOUSE.SYS – подключение новых устройств
(драйверов), указание раздела памяти DEVICEHIGH,
PROMPT текст – задание вида приглашения ДОС: $p – текущий дисковод и путь, $n – текущий дисковод, $d – дата, $t – время, $v
– версия ДОС, $h – удаление символа слева, $s – пробел, $_ – перевод
строки, символы $g – >, $L – <, $b – |, $$ – $.
Если какие-то параметры или ключи команд не задаёт пользователь, они устанавливаются ДОС по умолчанию. Содержание пакетного файла Autoexec.bat – пример 1
mode con codepage prepare=((866) C:\WINDOWS\COMMAND\ega3.cpi)
mode con codepage select=866
keyb ru,,C:\WINDOWS\COMMAND\keybrd3.sys
Пример 2
@ECHO OFF
PROMPT $p$g
PATH C:\NC;D:\QEMM;C:\WINDOWS;C:\WINDOWS\SYSTEM
set symantec=d:\nu95
SET TEMP=C:\TEMP
d:\qemm\loadhi /r:1 cyrill
c:\mouse\mouse.com
65
Приложение Б
(справочное)
Представление и хранение данных
Система счисления – это совокупность символов, отображающих число, и правил работы с ними. Число может быть целым и дробным (вещественным), для последнего применяют запись в форматах с
фиксированной запятой (Fixed Point) и с плавающей запятой или экспоненциальную (Floating Point), так, записи 1.23е00, 0.123е01 и 12.3е01 соответствуют одному и тому же числу.
В компьютере используются позиционные системы счисления, у
которых вес символа зависит от его места (позиции). В позиционной
системе любое число может быть представлено формулой
N x  a0 x  a1 x
n
n 1
 a2 x
n2
n
 ...  an x   ai x n i .
0
i 0
Здесь x – основание (число используемых символов), n – число
позиций (разрядов). Основание показывает во сколько раз значение
(вес) данной позиции больше той, что находится от неё справа, в собственной системе оно отображается набором символов 10. Распространены десятичная, двоичная, шестнадцатеричная и восьмеричная
системы счисления.
Десятичная (Decimal, DEC) система использует набор символов
0…9, основанием является число 10, а запись 123,456 подразумевает
представление числа в форме
N10 = 1*102 + 2*101 + 3*100 + 4*10-1 + 5*10-2 + 6*10-3
Восьмеричная (Oct) система счисления имеет основание 8 и
набор символов 0…7. Шестнадцатеричная (Hexadecimal, HEX) система имеет основание 16, использует символы 0...9, A, B, C, D, E, F, где
А=10 и т.д. Она позволяет записывать числа более компактно, например, число 255=FF вместо трех передается всего двумя символами
FF = F*16+F = 15*161+15*160 = 255,
поэтому применяется при программировании для экономии памяти и
повышения быстродействия. В этой системе один разряд может содержать 16 бит информации.
66
В двоичной (Binary, BIN) системе x = 2, один разряд содержит 1
Бит информации и может принимать значения 1 или 0. Соответственно, все коэффициенты ai равны либо 1, либо 0. Следующие единицы
измерения – Байт (Byte) = 8 Бит, слово (Word) – 2 байта, двойное слово (Dword) – 4 байта, килобайт, Мегабайт, Гигабайт. Одновременно
используются понятия «двоичный» килобайт (1024 = 210 байт) и «десятичный» (1000 = 103 байт). Несмотря на одинаковое название, численно они не равны, например, 256DEC k = 262144BIN байт, 1048576 –
это один двоичный Мегабайт и т.п. Оперативную память производители оценивают в десятичных мегабайтах, объем жестких дисков –
в двоичных, хотя нигде вид единиц измерения не расшифровывается.
Один байт способен передать десятичное число 255 (без знака)
111111112 = 1*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20 =
= 128+64+32+16+8+4+2+1=25510
Счет разрядов в двоичной системе идет справа налево, по нарастанию степени двух. Самый правый (младший) разряд называется
LSB (Наименьший значащий бит), а самый левый (старший) разряд
называется MSB (Наибольший значащий бит). Отрицательные числа
имеют 1 в старшем бите (MSB), поэтому двумя байтами можно отобразить целое число 65535=256*256-1 (без учета знака) и только
±32767=128*256-1 (с учетом знака).
Перевод в десятичную систему из любой другой:
целая часть – последовательно справа налево умножают коэффициенты на возрастающую степень основания исходной системы и
находят сумму;
дробная часть – последовательно слева направо умножают коэффициенты на возрастающую отрицательную степень основания исходной системы и находят сумму.
Для хранения целой и дробной частей вещественного числа используются разные байты, причем обычно для числа одинарной точности 4 байта, для числа двойной точности – 8 байт. Нули слева у целой части и справа у дробной части числа дописывают произвольно
до размера заданной разрядной сетки или отбрасывают.
Пример перевода числа 00110101.011110002 в десятичное:
целая часть
110101=1*25 + 1*24 + 0*23 + 1*22 + 0*21 + 1*20 = 32 + 16 + 4 + 1 = 53,
дробная часть
01111= 0*2-1 + 1*2-2 + 1*2-3 + 1*2-4 + 1*2-5 =
= 0.25 + 0.125 + 0.0625 + 0.03125 = 0.46875
67
и окончательно число равно N10=53,46875.
Перевод шестнадцатеричного числа выполняется аналогично
А716 =А*16 + 7 = 10*16 + 7 = 16710.
Для расчета величины полинома при любом значении переменной x (основания системы счисления) применяют схему Горнера, позволяющую заменить возведение в степень более простой операцией
умножения
P(x) = ((((a(0)*x+a(1))*x+a(2))*x+a(3))*x+…+a(n)
Этой схеме соответствует следующий способ перевода целых
двоичных чисел: начиная с первой слева единицы умножают каждый
разряд на два и добавляют к сумме значение разряда справа, пока таковой имеется. Приведем пример для числа 101012: умножаем 1 на 2
(справа 0), умножаем 2 на 2 и добавляем 1 (итого 5), умножаем 5 х 2 =
10 (справа 0), умножаем и добавляем 10 х 2 + 1 = 2110.
Перевод десятичного числа в двоичное:
а) для чисел более 255 производится последовательное деление
целой части на 2 с записью остатков от деления в виде коэффициентов
справа налево до тех пор, пока остаток не станет меньше 2; последовательное умножение дробной части на 2 с записью целой части произведений слева направо до заполнения разрядной сетки.
Например, число Nx=47,37610
целая
47/2, остаток 1
заполнение справа налево
часть
23/2, остаток 1
11/2, остаток 1 
Nx=001011112
5/2, остаток 1
2/2, остаток 0
хватит 8 разрядов – 1 байта
1/2, остаток 1
дробная
часть
0.376·2 = .752, целое 0
заполнение слева направо
·
0.752 2 = .504, целое 1
0.504·2 = .008, целое 1
Nx=0,01100000….
·
0.008 2 = .016, целое 0

0.016·2 = .032, целое 0
остается отбрасываемая часть,
·
0.032 2 = .064, целое 0
вызывающая неточность
·
0.064 2 = .128, целое 0
расчета и хранения чисел
·
0.128 2 = .256, целое 0
в компьютере
и окончательно Nx=00101111.01100000…
При преобразовании какая-то часть числа была отброшена, т.к.
не уместилась в разрядную сетку, это явление приводит к принципи68
альной неточности компьютера при работе с дробными числами. Восстановим дробную часть: 0*0.5 + 1*0.25 + 1*0.125… = 0.375 (ошибка в
третьем знаке после запятой).
Чем больше разрядов выделяется для хранения чисел, тем они
воспроизводятся точнее.
б) для чисел до 255 (байт) предпочтительнее последовательное
деление на степени 2, начиная с наибольшей помещающейся, разряды
записываются слева направо, например,
234DEC = 1*128+1*64+1*32+0*16+1*8+0*4+1*2+0*1=11101010BIN.
При сложении двух единиц в двоичной системе производится
перенос в следующий разряд налево. Если перенос происходит с MSB,
то на процессоре устанавливается флажок переполнения в соответствующем регистре. Таким образом, выполнение операций происходит с
помощью регистров (специальных контрольных выходов) процессора.
Например, 234+131=365 или 256+109
1 1 1 0 1 0 1 0 234
1 0 0 0 0 0 1 1 131
Перенос 256 в старший байт  1 0 1 1 0 1 1 0 1 109
Выход числа за пределы установленной разрядной сетки вызывает ошибку переполнения OVERFLOW (если число больше) или ошибку потери порядка (число меньше).
Особенно хорошо это видно на примере деления на 2, которое
производится простым сдвигом числа по сетке вправо, или умножения
на 2, которое производится сдвигом значений разрядов влево, например 15*2
0 0 0 0 1 1 1 1 15DEC
0 0 0 1 1 1 1 0 30DEC
Перевод чисел в системах, основание которых кратно двум,
например 16 = 24, 8 = 23, производится с объединением символов в
группы с размером, равным кратности систем, и кодированием независимо каждой группы. Так, преобразование из двоичной системы в
шестнадцатеричную производится группировкой двоичного числа в
тетрады (4 разряда) и кодированием отдельно каждой тетрады
0101|1011|11002 = 5BC16
69
Обратный перевод из шестнадцатеричного кода в двоичный производится подстановкой вместо шестнадцатеричного кода его двоичного эквивалента-тетрады
FFFF16 = 1111|1111|1111|11112
При преобразованиях, связанных с восьмеричной системой, аналогично используются триады.
Побитовая запись употребляется в очень многих случаях, часто с
целью экономии, например, для хранения растровых шрифтов. Так,
большой английской букве А в памяти компьютера будет соответствовать восемь чисел (сверху вниз) 24 36 66 66 126 66 66 0, описывающих последовательно положение светящихся точек в каждой
строке изображения буквы.
128 64 32 16 8 4 2 1 Код
* *
24
*
*
36
*
*
66
*
*
66
* * * * * *
126
*
*
66
*
*
66
0
Шрифт загружается в память с известного адреса 0, тогда каждый следующий символ считывается из памяти со смещением от начала код*размер. Код символа зависит от способа кодировки, так, в
системе ASCII, код А равен 65, код пробела 32 и т.д.
Таблицы кодировок символов (кодовые страницы) сначала
включали 128 символов, потом 256, а сейчас ещё больше. Русские
символы добавились позднее, им не сразу нашли место, поэтому существует несколько видов кодировки русских символов (кириллицы):
КОИ-8(R), DOS (страница 866, альтернативная, ASCII), Windows
(страница 1251, ANSI), ISO, Unicode. Они отличаются местом и порядком размещения символов кириллицы в кодовой таблице. Если кодировки записи и чтения не совпадают, на экране (принтере) печатается бессмыслица, квадратики и т.п., так как на нужном месте в таблице находятся другие символы. Кодовая таблица (страница) 866, с
которой работает ТБ, приведена в приложении Е.
70
Приложение В
(справочное)
Транслятор Turbo Basic
Транслятор языка Turbo Basic – это компилятор, который из исходного файла BAS создает исполняемый файл EXE в памяти или на
диске. Обычно он содержит три файла: основной TB.EXE, файл конфигурации TBCONFIG.TB и файл помощи TBHELP.TBH. Для вызова
транслятора достаточно выполнить команду TB. При успешной загрузке на экране появляется меню функций вверху и строка подсказок
внизу. После нажатия любой клавиши курсор с подсветкой устанавливается на первой слева функции File. Клавишами перемещения курсора можно выбрать другую функцию, нажатием клавиши Enter перейти в режим выбора опций этой функции; клавиша Esc позволяет
вернуться в меню.
Функция File имеет опции LOAD, NEW, SAVE, WRITE TO, MAIN
FILE, DIRECTORY, CHANGE DIR, OS SHELL, QUIT.
Load – загружает файл в буфер для последующей обработки. По
умолчанию транслятор автоматически использует расширение .BAS,
допускается использование символов ? и * для вывода всего каталога
или его части. Перемещением курсора в окне можно выбрать необходимый файл из данной или другой директории и загрузить его.
New – очищает экран и удаляет из буфера текущий редактируемый файл, сохраняя его имя. По умолчанию устанавливается имя
файла NONAME.BAS.
Save – используется для записи текущего файла с расширением
.BAS на диск, предыдущей версии этого файла будет присвоено расширение .BAK. Можно задавать и другие расширения с помощью опции Backup source file функции Setup.
Write to – присоединяет новое имя к каталогу, позволяет записать текущий файл под новым именем.
Main file – задает имя главного файла при многоступенчатых
процессах работы с программой на стадиях компиляции, сборки или
отладки.
Directory – позволяет просмотреть на экране содержание текущего каталога, подкаталога, изменить маску для работы с файлами.
Change dir – позволяет выбрать для загрузки или записи файлов
другой каталог, причем транслятор продолжает работать в текущем
каталоге.
71
OS Shell – используется для временного выхода в ДОС, при этом
Turbo Basic остается резидентно в памяти. Выполнив необходимые
действия в ДОС, можно вернуться снова в транслятор вводом команды EXIT.
Quit – окончательный выход из транслятора в ДОС или Norton
Commander. Другой способ выхода – на любом этапе достаточно нажать комбинацию клавиш Alt+X.
Esc – всегда возврат в предыдущее состояние (главное меню).
Функция Edit обеспечивает редактирование загруженного или
нового файла. Если имя файла не указывалось при загрузке опцией
Load, ему автоматически присваивается имя NONAME.BAS. Рекомендуется сразу же расширить окно редактирования клавишей F5 и,
если создается новый файл текста, задать ему имя, нажав клавишу F3.
Возврат в главное меню производится клавишей Esc.
Функция Run обеспечивает автоматическую компиляцию и выполнение программы, находящейся в буфере, при отсутствии в ней
ошибок. В случае ошибки происходит возврат в режим редактирования, при этом сообщение об ошибке появляется в верхней части экрана. Процесс выполнения программы можно прервать нажатием
Ctrl+Break, если была предварительно установлена (ON) опция Keyboard Break в функции Options и выполняемая программа не производит операции ввода-вывода.
Для расширения окна при прогоне программы нажмите Alt+F5.
Функция Compile – компиляция текущей программы. Если
главный файл (Main) не определен, то компилируется загруженный
файл, в противном случае необходимо сохранить текущий рабочий
файл, а потом уже начинать компиляцию.
Результатом компиляции может быть Memory-файл (по умолчанию), ЕХЕ-файл или ТВС-файл в зависимости от того, включает ли
текущая программа обращения к другим подпрограммам, определен
ли Main-файл, надо ли сохранять объектный код.
Компиляция в память (Memory) используется в тех случаях, когда программа будет отлаживаться и редактироваться. Если программа окончательно отлажена и проверена, ее компилируют в обычный исполняемый файл (EXE File).
Файлы с расширением ТВС не содержат библиотеку процедур,
поэтому в отличие от ЕХЕ-файлов, они не могут быть инициированы
операционной системой. Работа с ними возможна лишь под управлением Turbo Basic.
72
Функция Options включает следующие опции: Compile to ...;
8087 required; Keyboard break; Bounds; Overflow; Stack test; Parameter
line; Metastatements.
Compile to ... позволяет выбрать для режима компиляции Compile одну из следующих возможностей: Memory, EXE file, Chain (см.
функцию Compile).
8087 required (On|Off) – разрешить использование арифметического сопроцессора. В этом случае транслятор генерирует более быстрый и компактный код, специально приспособленный для эффективных вычислений с плавающей точкой.
Keyboard break (On|Off) – разрешить аварийный останов отлаживаемой программы. Останов программы производится комбинацией клавиш Ctrl+Break (но не Ctrl+С). Отметим особо, что в случае
аварийного останова операции ввода/вывода прерываются не сразу.
Bounds (On|Off) – разрешить проверку границ массивов.
Overflow (On|Off) – разрешить отслеживание ситуации переполнения в арифметических операциях.
Stack test (On|Off) – разрешить проверку стеков при включении в
программу процедур или функций. Команда $Stack позволяет расширить стековую память.
Parameter line – используется при отладке программы для того,
чтобы сообщить выполняемой программе информацию, запрашиваемую ею по команде Commands.
Metastatement – псевдокоманды компиляции. Они делятся на три
класса: Stack size – переопределяет размеры стеков; Music buffer –
определяет размер буфера для музыкальных фрагментов; Communications – определяет размер буфера обмена данными каждого порта
COM.
Эти команды включаются в текст программы, но они не являются программно выполняемыми командами, а лишь влияют на процесс
компиляции программы.
Функция Setup позволяет менять и запоминать конфигурацию
Turbo Basic в ТВ-файле (обычно TBCONFIG.ТВ).
Задание функции производится с помощью следующих опций:
Colors, Miscellaneous, Save Options/Window/ Setup, Directories, Load
Options/Window/Setup.
Colors – позволяет изменять подсветку окон, оформлять меню,
удобно организовывать движение курсора по экрану.
Чтобы запомнить измененную конфигурацию, нужно задать опцию Save Options/Window/Setup. Конфигурация запоминается в файле
с расширением ТВ (по умолчанию TBCONFIG.TB).
73
Directories – позволяют задать конфигурацию используемых системой каталогов: Include – включение каталогов при компиляции;
Executable – для ЕХЕ и ТВС (Сhain)-файлов; Turbo – для системных
Turbo-файлов.
Miscellaneous – имеет опции: Auto save edit, Backup source files
(Auto save edit – автоматическое сохранение отредактированного текста программы в случае, если во время выполнения этой программы
пришлось прибегнуть к аварийному останову; Backup source files – автоматическое сохранение предыдущей версии текста программы).
Load Options/Window/Setup – позволяет задать имя нового файла
конфигурации Turbo Basic.
Save Options/Window/Setup – сохранение текущей конфигурации
Turbo Basic (файл конфигурации имеет расширение ТВ; по умолчанию – TBCONFIG. ТВ).
Функция Window – позволяет управлять размерами окон, цветом, открывать или закрывать их. Для задания окон используются опции: Open, Close, Next, Goto, Tile, Stack, Zoom (по умолчанию все окна
открыты).
Open – открыть окно. Предусмотрены окна: Run, Edit, Message,
Trace. Выбранное окно становится активным, т. е. все команды движения по экрану, функциональные клавиши и помощь относятся к
этому окну.
Close – закрыть окно. Закрытое окно становится невидимым на
экране.
Next – сделать активным следующее по порядку окно. Предусмотрен следующий порядок окон: Run, Edit, Message, Trace. To же
самое можно сделать нажатием клавиши F6.
Goto – сделать активным ранее открытое окно. Используется в
том случае, когда нежелательно возвращаться в главное меню.
Tile – высветить на экран все открытые окна. Окна при этом будут иметь одинаковые размеры. Клавиша F6 позволяет активизировать следующее по порядку окно.
Stack – сделать все открытые окна максимально большими по
размеру.
Zoom – увеличить размеры окон Run и Edit до максимально возможных, т. е. до размера экрана. При этом контурные рамки с главным меню не будут высвечиваться на экране. Повторение команды
(или нажатие клавиши F6) вернет этим окнам первоначальные размеры.
Функция Debug предназначена для управления процессом отладки. Этот режим имеет опции Trace и Run-time errors.
74
Trace – позволяет проследить выполнение программы по командам.
Run-time errors – выполнение программы до первой ошибки.
Заметим, что кроме этого транслятор сообщает номер ошибки и
курсор указывает ее место в исходной программе. При повторной
трансляции Turbo Basic, находя это место в исходной программе, не
производит заново компиляцию, а заменяет команду в объектном коде
на новую, то есть эта опция задает прямой режим работы транслятора
в качестве интерпретатора. В дальнейшем, когда программа будет
полностью отлажена, необходимо еще раз компилировать программу
с целью получения эффективного объектного кода.
75
Приложение Г
(справочное)
Редактор Turbo Basic
Редактор открывается по команде Edit, предназначен для ввода
и правки текста программы. Если курсор приближается к краю экрана,
при его дальнейшем перемещении происходит прокрутка (Scrolling)
изображения на экране, однако писать текст с длиною строки более 80
символов не рекомендуется.
Наряду с обычными командами движения курсора по тексту при
редактировании используются команды:
Движение по экрану и тексту
Ctrl+A (стрелка влево) – переместить курсор на начало предыдущего слова,
Ctrl+F (стрелка вправо) – переместить курсор на начало следующего слова,
Home
– переместить курсор в начало текущей строки,
Ctrl+Home – переместить курсор в верхнюю строку экрана,
End
– переместить курсор в конец текущей строки,
Ctrl+End
– переместить курсор в нижнюю строку экрана,
PgUp
– переместить курсор на страницу (экран) вверх,
Ctrl+PgUp – переместить курсор в начало текста,
PgDn
– переместить курсор на страницу (экран) вниз,
Ctrl+PgDn – переместить курсор в конец текста,
Ctrl+Kn
– пометить место в тексте (поставить маркер),
n = 0-3,
Ctrl+Qn
– переместить курсор в помеченное маркером место, n = 0-3,
Ctrl+QB
– перейти в начало помеченного блока (независимо
от Ctrl+KH),
Ctrl+QK
– перейти в конец помеченного блока (независимо
от Ctrl+KH),
Ctrl+QP
– перейти в позицию курсора, предшествующую
последней команде,
Ctrl+W
– показ текста выше курсора,
Ctrl+Z
– показ текста ниже курсора.
76
Вставка и удаление
Ins
– переключатель режимов вставки/замены символов (индикация – наличие или отсутствие надписи Insert вверху). В
режиме замены невозможны вставка новых строк, действие Enter,
Tab
– сдвинуть курсор (текст) вправо на интервал табуляции,
Ctrl+N
– вставить пустую строку,
Ctrl+Y
– удалить строку, помеченную курсором,
Ctrl+QY
– удалить символы от курсора до конца строки,
Ctrl+QL
– отменить все изменения в текущей строке до ухода с нее,
BackSpace – сдвинуть курсор влево с удалением символа под
ним,
Del
– удалить символ под курсором и сдвинуть остаток
строки влево,
Ctrl+T
– удалить слово справа от курсора.
Работа с блоками
F7 (Ctrl+KB)
– пометить начало блока, обозначенное курсором,
F8 (Ctrl+KK)
– пометить конец блока, обозначенный курсором,
Ctrl+KH
– спрятать/показать помеченный блок,
Ctrl+KY
– удалить помеченный блок,
Ctrl+KC
– копировать помеченный блок в место, обозначенное курсором,
Ctrl+KV
– перенести помеченный блок в место, обозначенное курсором,
Ctrl+KR
– читать блок с диска в место, обозначенное курсором (на запрос указать имя файла. Если просто нажать Enter, будет
выведен каталог).
Ctrl+KW
– записать помеченный блок на диск (указать имя
файла),
Ctrl+KP
– распечатать помеченный блок на принтере (весь
текст, если блок не был выделен),
Ctrl+KT
– пометить одно слово слева/под курсором.
77
Прочие команды
F2
– обновить содержание файла на диске без выхода
из редактора,
F3
– задать новое имя/стереть редактируемый файл,
F5
– раскрыть/сжать окна редактирования (Edit) и выполнения (Run),
Ctrl+OT
– включить/отключить режим табуляции (надпись
вверху Tab),
Ctrl+OI
– включить/отключить режим автоотступа (надпись
вверху Indent),
Ctrl+QF
– найти в тексте цепочку символов длиной до 30
знаков,
Ctrl+QA
– найти в тексте и заменить (согласно опциям поиска и замены),
Ctrl+L
– повторить предыдущий поиск заново,
Ctrl+P
– предваряет ввод в текст управляющих символов с
кодами 0-31,
Ctrl+U
– прервать выполнение текущей команды,
Ctrl+QW
– показать повторно последнее сообщение об
ошибке.
Опции поиска и замены
Обычный поиск осуществляется от курсора до конца текста;
нажатие только клавиши Enter на запрос о замене соответствует вводу
пустой строки, т.е. стиранию искомого текста.
B
– произвести поиск от курсора к началу текста,
G
– произвести полный поиск от начала текста до его конца,
n
– начиная с n-го (или следующие n) повторений искомой
цепочки,
N
– заменять без дополнительного запроса-разрешения,
U
– не делать различия между прописными и строчными
буквами,
W
– поиск для целого слова, а не части.
Примечание – Из режима редактирования в любой другой режим работы транслятора можно быстро перейти с помощью комбинации клавиши Alt и первой буквы названия соответствующей функции
78
Alt+F
Alt+R
Alt+C
Alt+O
Alt+S
Alt+W
Alt+D
Alt+X
– работа с файлами и диском,
– выполнение программы,
– компиляция программы,
– опции компиляции,
– установка конфигурации,
– управление окнами,
– управление процессом отладки,
– выход из транслятора и т.д.
79
Приложение Д
(справочное)
Зарезервированные слова Turbo Basic
$COM1
$COM2
$DEBUG
$DYNAMIC
$ELSE
$ENDIF
$EVENT
$IF
$INCLUDE
$INLINE
$LIST
$OPTION
$SEGMENT
$SOUND
$STACK
$STATIC
ABS
ABSOLUTE
AND
APPEND
AS
ASC
AT
ATN
BASE
BEEP
BIN$
BINARY
BLOAD
BSAVE
CALL
CASE
CDBL
CEIL
CHAIN
CHDIR
CHR$
CLOSE
CLS
COLOR
COM
COMMAND$
COMMON
COS
CSNG
CSRLIN
CVD
CVI
CVL
CVMD
CVMS
CVS
DATA
DATE$
DECR
DEF
DEFDBL
DEFINT
DEFLNG
DEFSNG
DEFSTR
DELAY
DIM
DO
DRAM
DYNAMIC
ELSE
ELSEIF
END
ENDMEM
ENVIRON
ENVIRON$
EOF
EQV
ERR
ERROR
EXIT
EXP
EXP10
EXP2
FIELD
FILES
FIX
FN
FOR
FRE
GET
GET$
GOSUB
GOTO
HEX$
IF
IMP
INCR
INKEY$
INLINE
INP
INPUT
INPUT#
INPUT$
INSTAT
INSTR
INT
INTERRUPT
IOCTL
IOCTL$
KEY
KILL
LBOUND
LCASE$
LEFT$
LOC
LOCAL
LOCATE
LOF
LOG
LOG10
LOG2
LOOP
LPOS
LPRINT
LPRINT#
LSET
MEMSET
MID$
MKDIR
MKD$
MKI$
MKL$
MKMD$
MKMS$
MKS$
MOD
MTIMER
NAME
NEXT
NOT
OCT$
OFF
ON
OPEN
OPTION
OR
OUT
OUTPUT
PAINT
PALETTE
CINT
CIRCLE
CLEAR
CLNG
ERADR
ERASE
ERDEV
ERDEV$
ERL
LEN
LET
LINE
LIST
PEEK
PEN
PLAY
PMAP
POINT
80
PALETTE
USING
POKE
POS
PRESET
PRINT
PRINT#
PSET
PUT
PUT$
RANDOM
RANDOMIZE
READ
REG
REM
RESET
RESTORE
RESUME
RETURN
RIGHT$
RMDIR
RND
RSET
RUN
SAVE
SCREEN
SEEK
SEG
SELECT
SERVICE
SGN
SHARED
SHELL
SIN
SOUND
SPACE$
SPC
SQR
STATIC
STRING$
SUB
SWAP
SYSTEM
TAB
TAN
THEN
TIME$
TIMER
TO
TROFF
TRON
UBOUND
UCASE$
UNTIL
USING
USR
USR0
USR1
USR2
USR3
USR4
USR5
USR6
USR7
USR8
USR9
VAL
VARPTR
VARPTR$
VARSEG
VIEW
WAIT
WEND
WHILE
WIDTH
WINDOW
STEP
STICK
STOP
STR$
STRIG
WRITE
WRITE#
XOR
Приложение Е
(справочное)
ASCII-коды страницы 866 (DOS)
Код
Символ
Код
Символ
Код
Символ
Код
Символ
Код
Символ
Код
Символ
Код
000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
nul
soh
stx
etx
eot
enq
ack
bel
bs
tab
lf
vt
ff
cr
so
si
dle
dc1
dc2
dc3
dc4
nak
syn
etb
can
em
eof
esc
fs
gs
rs
us
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
Sp
!
"
#
$
%
&
'
(
)
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
T
S
U
V
W
X
Y
Z
[
\
]
^
_
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
del
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
а
б
в
г
д
е
ж
з
и
й
к
л
м
н
о
п
░
▒
▓
│
┤
╡
╢
╖
╕
╣
║
╗
╝
╜
╛
┐
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
└
┴
┬
├
─
┼
╞
╟
╚
╔
╩
╦
╠
═
╬
╧
╨
╤
╥
╙
╘
╒
╓
╫
╪
┘
┌
█
▄
▌
▐
▀
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
Примечание – коды с 0 по 31 и 127 являются управляющими.
81
Символ
Символ
Расширенная таблица (коды 128 – 255)
Код
Стандартная таблица (коды 0 – 127)
р
с
т
у
ф
х
ц
ч
ш
щ
ъ
ы
ь
э
ю
я
Ё
ё
Є
є
Ї
ї
Ў
ў
°
•
·
√
№
¤
■
Приложение Ж
(справочное)
Скан-коды клавиатуры
Клавиша
Esc
! или 1
@ или 2
# или 3
$ или 4
% или 5
^ или 6
& или 7
* или 8
( или 9
) или 0
_ или + или =
BackSpace
Tab
Q
W
E
R
T
Y
U
I
O
P
{ или [
} или ]
Enter
Ctrl
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Клавиша
A
S
D
F
G
H
J
K
L
: или ;
" или '
~ или `
Left Shift
| или \
Z
X
C
V
B
N
M
< или ,
> или .
? или /
Right Shift
PrtSc или *
Alt
Space Bar
82
Код
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Клавиша
Caps Lock
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
NumLock
Scroll Lock
Home или 7
Up или 8
PgUp или 9
Gray Left или 4
Center или 5
Right или 6
Gray +
End или 1
Down или 2
PgDn или 3
Ins или 0
Del или .
Код
58
59
60
61
62
63
64
65
66
67
68
133
134
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Формат 29, х 42 ½. Бумага книжно-журнальная.
Объем
уч.- изд. л. Тираж 100 экз. Цена договорная.
Заказ № ЮЕИНаучно-издательский центр
Павлодарского государственного университета
им. С. Торайгырова
637000, г. Павлодар, ул. Ломова, 64
E-mail: publish@psu.kz
83
Download