С помощью оператора LINE 2 0можно также чертить и закрашивать
прямоугольники
LINE (x1, y1) - (x2, y2), 2 0[k], 2 0B[F]
Точки (x1, y1) и (x2, y2) трактуются при этом как левая нижняя и
- 18 -
правая верхняя вершины прямоугольника. Если цвет k отсутствует,
то прямоугольник будет начерчен 3-м цветом палитры. При наличии
параметра F площадь внутри прямоугольника будет закрашена. Напри-
мер, оператор
LINE (80, 175) - (100, 25), 2, BF закрашивает красным цветом
прямоугольник, расположенный между 80-ой и 100-ой позициями по
горизонтали и 175-ой и 25-ой позициями по вертикали.
_Оператор CIRCLE . 2 0позволяет строить окружности, дуги, секторы
и эллипсы.
Оператор CIRCLE 2 0(x, 2 0y), 2 0r, k
чертит окружность радиуса r с центром в точке (x, y) цветом k.
После вычерчивания окружности последней использованной точкой
считается ее центр.
Оператор CIRCLE (x, y), r, k, ALPHA1,ALPHA2
вычерчивает дугу, имеющую начало под углом ALPHA1 и конец - под
углом ALPHA2.
Например, оператор (при PI = 3.1416)
CIRCLE (160, 100), 80, 2, PI/2, PI строит дугу от PI/2 до PI ок-
ружности радиуса 80 с центром в точке (160, 100) вторым цветом
палитры.
Если использовать знак " - " перед начальной и конечной точ-
ками дуги, то будет нарисован сектор, т.е. конечные точки дуги
будут соединены с центром. Например,
CIRCLE (160, 100), 80, 2, - PI/2, - PI
Можно изобразить сплюснутую (или наоборот вытянутую) окруж-
ность, добавив в оператор CIRCLE еще один параметр. Если значение
этого параметра меньше 1, то окружность будет сплюснута по верти-
кали, если больше 1, то - по горизонтали. Например,
CIRCLE (160, 100), 80, 2, , , 3/4
Все параметры оператора CIRCLE задаются в определенном порядке и
разделяются запятыми. Обязательными являются только параметры,
указывающие положение центра и радиус окружности. Остальные пара-
метры необязательны, однако, запятые должны быть оставлены, если
пропущены параметры в середине списка.
_Оператор PAINT . 2 0позволяет закрашивать большие области экрана.
Для закрашивания необходимо указать произвольную точку внутри
закрашиваемой области (x, y), цвет, которым нужно закрасить об-
ласть (k1) и цвет границы, которую нельзя пересекать при закраши-
вании (k2), k1 и k2 могут совпадать. Оператор PAINT имеет вид
- 19 -
PAINT (x, y), k1, k2
Например, оператор
PAINT (160, 100), 2, 2
закрасит окружность нарисованную последним оператором CIRCLE,
красным цветом, как и цвет окружности, использованный в операторе
CIRCLE.
- 20 -
3. ФАЙЛЫ. РАБОТА В БЕЙСИКЕ С ФАЙЛАМИ ПОСЛЕДОВАТЕЛЬНОГО
И ПРЯМОГО ДОСТУПА
Если необходимо использовать набор данных или программу мно-
гократно, то необходимо сохранить их на внешнем устройстве памяти
(например, диске или дискете). Для этого создается файл. Файл
должен иметь имя. Имя состоит из двух частей: собственно имя и
расширение
1имя 0. 1расширение
Имя может содержать до 8 символов, расширение 1- 0до трех.
Могут использоваться следующие символы
A - z 0 - 9 ( ) { } @ # $ 1 0% ^ & ! - _ / ' ~
Полное имя файла в MS DOS содержит весь путь по дереву от
корневой директории к нужному файлу. Например,
C:\ST\LAB\work.bas,
где C - имя диска, ST - имя директории на диске, LAB - имя подди-
ректории директории ST, work.bas - имя программы на Бейсике.
Далее речь пойдет только о файлах данных.
3.1. Файлы последовательного доступа
Последовательный файл состоит из записей, доступ к которым
осуществляется последовательно, т.е. n-я запись следует за (n -
1)-ой как при формировании файла, так и при считывании из него.
Создание последовательного файла включает следующие шаги:
открытие файла (оператор OPEN), вывод данных в файл (операторы
PRINT#, WRITE#, или PRINT# USING) и закрытие файла (оператор
CLOSE).
Считывание из последовательного файла включает следующие ша-
ги: открытие файла, ввод данных из файла (операторы INPUT#,
INPUT$, LINE INPUT#), закрытие файла.
_Оператор OPEN . 2 0подготавливает файл для чтения из файла
(INPUT) или записи в файл (OUTPUT, если создается новый файл,
APPEND, если добавляются записи в уже существующий файл).
INPUT
OPEN 1имя файла 0FOR OUTPUT 1 0 AS # 1номер файла
APPEND
_Оператор CLOSE .закрывает файл, т.е. делает невозможным чте-
- 21 -
ние или запись.
CLOSE [# 1номер файла 0]
Оператор CLOSE без параметров закрывает все открытые файлы.
Единицей информации, которая передается при записи в файл
или чтении из файла 1, 0является запись (логическая запись) 2. 0Запись
делится на поля. Каждое поле связано с одним элементом данных.
0Могут быть созданы два типа последовательных файлов:
1) с разделителями полей, когда каждое поле автоматически
отделяется специальным символом (например, запятой). Для создания
такого файла используется оператор WRITE#, для чтения из него -
оператор INPUT#.
Данные в файле хранятся в таком виде, как если бы они наби-
рались на клавиатуре при выполнении оператора INPUT, т.е. разде-
лены запятыми и каждая запись заканчивается переводом строки.
_Оператор INPUT# . 2 0имеет вид
INPUT # 1номер файла 0, 2 1список переменных
где переменные в списке по типу должны соответствовать данным в
файле.
2) поля не разделены 1, 0и каждая запись точно такая же, как
если бы эти данные отображались на экране или печатались на прин-
тере. Для создания такого файла используется оператор PRINT#, для
чтения из него - операторы INPUT$ или LINE INPUT#. _Оператор
_INPUT$ . передает из файла сразу всю строку (запись) указанной дли-
ны n в символьную переменную, например, ST$
ST$ 2 = 0INPUT$ (n, # 1номер файла 0)
_Оператор LINE INPUT# . 2 0передает в указанную переменную ST$ всю
строку независимо от ее длины
LINE INPUT # 1номер файла 0, 2 0ST$
Пример (с разделителями полей):
OPEN "SEQU.DAT" FOR OUTPUT AS #1
ST$ = " ИВАНОВ "
INT% = 1972
FLOT! = 75.3
'теперь записываем строку в файл
WRITE #1, ST$, INT%, FLOT!
ST$ = " ПЕТРОВ "
INT% = 1975
FLOT! = 62.5
'записываем другую строку в файл
- 22 -
WRITE #1, INT%, ST$, FLOT!
CLOSE #1
END
Созданный файл будет следующим
" ИВАНОВ ", 1972, 75.3
1975, " ПЕТРОВ ", 62.5
Следующая программа читает из этого файла:
OPEN "SEQU.DAT" FOR INPUT AS #1
ST$ = " "
INT% = 0
FLOT! = 0
'теперь читаем строку текста из файла
INPUT #1, ST$, INT%, FLOT!
PRINT ST$, INT%, FLOT!
ST$ = " "
INT% = 0
FLOT! = 0
'читаем другую строку
INPUT #1, INT%, ST$, FLOT!
PRINT INT%, ST$, FLOT!
CLOSE #1
END
Пример (без разделителей полей):
OPEN "SEQUEN.DAT" FOR OUTPUT AS #1
ST$ = " ИВАНОВ "
INT% = 1972
FlOT! = 73.1
'записываем строку текста в файл
PRINT #1, ST$, INT%, FLOT!
ST$ = " ПЕТРОВ "
INT% = 1975
FLOT! = 64.3
'запишем другую строку, используя оператор
PRINT #1, USING "+####$#.##^^^^"; INT%, ST$, FLOT!
CLOSE #1
END
Содержание созданного файла будет таким:
ИВАНОВ 1972 73.1
1975 ПЕТРОВ 6.43Е+01
- 23 -
Следующая программа читает из этого файла:
OPEN "SEQUEN.DAT" FOR INPUT AS #1
ST$ = " "
ST$ = INPUT$ (80,#1)
PRINT ST$
LINE INPUT #1, ST$
PRINT ST$
CLOSE #1
END
3.2. Файлы прямого доступа
Файл прямого доступа состоит из записей, доступ к которым
возможен в произвольном порядке по номеру записи.
Создание файла прямого доступа включает следующие шаги:
открытие файла (оператор OPEN); задание структуры записи файла,
или разметка буфера (оператор FIELD); передача записи в буфер
(операторы LSET 2 0или RSET); пересылка содержимого буфера в файл
(оператор PUT), при этом если номер записи в операторе PUT 2 0не
указан явно, буфер помещается на место текущей записи, при откры-
тии файла указатель текущей записи равен 1, после каждой операции
ввода или вывода указатель сдвигается на следующую запись; закры-
тие файла (оператор CLOSE).
Записи передаются в виде строк символов. Поэтому необходимо
использовать соответствующие функции преобразования данных в
строку символов и обратно.
Ниже перечислены функции и осуществляемые ими преобразова-
ния.
MKI$ (MKL$) - целое (длинное целое) в 2-х (4-х) байтовую
строку;
MKS$ (MKD$) - вещественное (вещественное двойной точности) в
4-х (8-ми) байтовую строку.
CVI(CVL) - 2-х (4-х) байтовую строку в целое (длинное це-
лое);
CVS(CVD) - 4-x (8-ми) байтовую строку в вещественное (ве-
щественное двойной точности).
Считывание из файла прямого доступа включает также пять ша-
гов: открытие файла; разметка буфера; передача записи из файла в
буфер (оператор GET); обработка данных буфера (переменные буфера
- 24 -
доступны из программы); закрытие файла.
Если вывод в файл и ввод из файла осуществляются в одной
программе, то открытие и закрытие файла осуществляется один раз
перед началом и после окончания всех операций с файлом.
_Оператор OPEN . 2 0имеет вид
OPEN 2 1имя файла 2 0AS # 1номер файла 2 0LEN 2 0= 1длина записи
(отсутствие указания режима ввода или вывода означает, что файл
прямого доступа).
_Оператор FIELD . 2 0имеет вид
FIELD # 2 1номер файла 0, 2 0n1 2 0AS 2 1имя1 0 [ 2, 0n2 2 0AS 2 1имя2 0, 2 0...] 2 0,
где n1, n2, ... - длина поля в байтах под переменные 1имя1 0, 1имя2 0,
... ( 1имя1 0, 1имя2 0, - символьные переменные ).
_Операторы . _LSET, RSET . 2 0имеют вид
LSET 2 1имя 2 0= 2 1символьное выражение
RSET 2 1имя 2 0= 2 1символьное выражение
Оператор LSET (RSET) заполняет одно поле записи в буфере
(оператор LSET - с начала, RSET - с конца, оставшиеся позиции за-
полняются пробелами).
_Оператор PUT . имеет вид
PUT 2 0# 2 1номер файла 2 0[ 2, 1номер записи 0]
Этот оператор передает содержимое буфера в файл на место за-
писи с указанным номером (или текущей, если номер не указан).
_Оператор GET . 2 0имеет вид
GET 2 0# 2 1номер файла 2 0[, 2 1номер записи 2и 0]
Этот оператор передает содержимое записи с указанным но-
мером в буфер (если номера нет, передается текущая запись).
В качестве примера приводится программа, которая формирует
файл прямого доступа из записей следующей структуры:
N п/п Фамилия Год рождения
В программе переменные обозначены n%, nam$, dat%; для соответс-
твующих полей буфера используются обозначения np$ (2 байта), nm$
(10 байт), dt$ (6 байт).