Языки Бейсик
.pdfГлава X. Файлы данных |
81 |
Так как в шаблоне указан знак “+”, то знак выводится как для положительного числа, так и для отрицательного.
PRINT USING “##+”; 23; — 26 23+26 — результат
Знак появляется после числа, то есть там, где он указан в шаблоне.
PRINT USING “##-”; 23; — 26 23 26 — результат
Так как в шаблоне указан знак минус, то для положительного числа знак заменяется пробелом.
PRINT USING “##”; 23; — 26 23%-26 результат
Знак % для второго числа указывает на то, что шаблон для этого числа маловат.
PRINT USING “ ##-”; 23; — 26; 23
23 26 — 23 результат
PRINT USING “ #####”; 23; — 327; 327 23 — 327 327 результат
Незначащие нули замещаются пробелами
PRINT USING “**##”; 23; 327; — 327 **23*327-327 результат
Незначащие нули замещаются звездочками
PRINT USING “**$###”; 155; 127; — 345 **$155**$127*-$345 результат
Незначащие нули замещаются звездочками, а перед первой значащей цифрой ставится знак $.
PRINT USING “+######”; 23 +23 результат
Незначащие нули замещаются пробелами
10.6.2.2. Шаблоны для вывода чисел с фиксированной точкой имеют вид:
[+]{#...#[,].#...#}[+,-] [+]{**#...#[,].#...#}[+,-] [+]{$$#...#[,].#...#}[+,-] [+]{**$#...#[,].#...#}[+,-]
и отличаются от предыдущего формата тем, что в формате присутствует десяти- чная точка. Точка выводится в той позиции, в которой указана в шаблоне. Относительно этой точки выводятся целая и дробная части числа. Порядок вывода знаков чисел и символов заполнителей такой же, как в шаблоне для целых чисел. Запятая может быть включена перед десятичной точкой. Это приводит к появлению запятых перед каждой третьей цифрой числа слева от точки.
82 |
Языки Бейсик |
Пример 10.6.3:
PRINT USING “ #.#”; 1.5; 5; .5 1.5 5.0 0.5 результат
Во втором числе добавляются нули после точки, в третьем перед точкой
PRINT USING “##.#”; — 75.66
%-75.7 результат
Результат усекается с округлением; знак % свидетельствует о том, что не хватает места для значащих цифр
PRINT USING “#.##”; 75.62
%75.62 результат
Знак % свидетельствует о том, что не хватает места для значащих цифр
PRINT USING “**###.###”; 74.5
***74.500 результат
Добавляются нули в дробной части, вставляются символы заполнители ***
PRINT USING “###########,.###”; 123456789.7896#
123,456,789.790 результат
Результат усекается с округлением; перед каждой третьей цифрой ставится запятая (справа налево от точки)
PRINT USING “#.# M”; 1.66
1.7 M результат
Результат усекается с округлением; через пробел вставлена буква
PRINT USING “MP = #.#”; 1.66
MP = 1.7 результат
Результат усекается с округлением; перед числом вставлены символы MP.
10.6.2.3. Шаблоны для вывода чисел с плавающей точкой имеют вид:
[+]{#...#[,].#...#}[+,-]^^^^ [+]{**#...#[,].#...#}[+,-]^^^^ [+]{$$#...#[,].#...#}[+,-]^^^^ [+]{**$#...#[,].#...#}[+,-]^^^^
и отличаются от предыдущего формата тем, что в формат добавляются знаки
^^^^; первый знак — для буквы E или D; второй — для знака порядка; остальные — для порядка числа. По этим шаблонам выводятся числа, если их порядок не превышает 38 степени.
Пример 10.6.4:
PRINT USING “#.#^^^^”; 15 0.2E+02 результат
Результат округляется до одной значащей цифры
a = 5.8: b = 48.127 b$ = “ ##.###”
Глава X. Файлы данных |
83 |
PRINT USING b$; a; b 5.800 48.127 результат
Вывод по шаблону чисел с фиксированной точкой
a = 158: b = 47
PRINT USING “Цена=####Руб. ##Коп.”; a; b Цена= 158Руб. 47Коп. результат
Пример 10.6.5:
создать последовательный файл с помощью оператора PRINT USING
OPEN “c:\chis.bas” FOR OUTPUT AS #2 'открытие файла для записи данных
a1: INPUT “ввести числовые данные:”; a, b, c, d, e INPUT “Ввод данных закончился(да,нет)?”; konec$
PRINT #2, USING “ ###.## “; a; b; c; d; e 'запись данных на диск IF UCASE$(konec$) = “Н” OR UCASE$(konec$) = “Y” THEN GOTO a1 'проверка на окончание
CLOSE #2 END
При работе программы вводятся числа
123.45,456.7,5.68,0.12,7 è 0.23,5.5,4.57,6,2.78
Пример 10.6.6:
считать с помощью оператора INPUT последовательный файл, созданный в примере 10.6.5
OPEN “c:\chis.bas” FOR INPUT AS #2 'открытие файла для чтения ‘данных
GOSUB shapka 'печать шапки документа на экране
a2: INPUT #2, a, b, c, d, e 'чтение данных из файла
PRINT a, b, c, d, e 'вывод прочитанного на экран дисплея в ‘зонном формате
IF EOF(2) THEN PRINT L$: END 'проверка конца файла
GOTO a2 shapka:
'формирование шапки таблицы
PRINT SPACE$(20); “Таблица данных”
L$ = STRING$(65, 45): PRINT L$ 'формирование и вывод на экран линии 'вывод на экран монитора наименование граф
PRINT “ A ! B ! C ! D ! E”
PRINT L$ 'формирование и вывод на экран линии RETURN
Результат выполнения программы
Таблица данных
——————————————————
A ! B ! C ! D ! E
84 |
|
|
|
Языки Бейсик |
—————————————————— |
||||
123.45 |
456.7 |
5.68 .12 |
7. |
|
.23 |
5.5 |
4.57 |
6 |
2.78 |
——————————————————
Пример 10.6.7:
Считать с помощью оператора INPUT последовательный файл, созданный в примере 10.6.5 и напечатать его с помощью оператора PRINT USING
OPEN “c:\chis.bas” FOR INPUT AS #2'открытие файла для чтения данных
GOSUB shapka1 'печать шапки документа на экране
a3: INPUT #2, a, b, c, d, e 'чтение данных из файла
PRINT USING “ ###.## “; a; b; c; d; e 'вывод прочитанного на
экран
‘дисплея по шаблону
IF EOF(2) THEN PRINT L$: END 'проверка конца файла GOTO a3
shapka1:
'формирование шапки таблици
PRINT SPACE$(20); “Таблица данных”
L$ = STRING$(65, 45): PRINT #1, L$ 'формирование и вывод на экран ‘линии
PRINT “ A ! B ! C ! D ! E” 'вывод на экран монитора ‘наименование граф
PRINT L$ 'формирование и вывод на экран линии
RETURN
Результат выполнения программы
Таблица данных
——————————————————
A ! B ! C ! D ! E
——————————————————
123.45 456.70 5.68 0.12 7.00
0.23 5.50 4.57 6.00 2.78
——————————————————
10.7. Оператор PRINT#
PRINT# выводит данные в последовательный файл.
LPRINT печатает данные на принтере LPT1.
Формат оператора PRINT#:
PRINT [#номер_файла%,] [выражения] [{; | ,}]
ãäå
Номер_файла%— номер файла, открытого оператором OPEN. Если номер файла не указан, PRINT выводит данные на экран.
Глава X. Файлы данных |
85 |
|
Выражения |
— одно или несколько числовых или символьных выражений |
|
|
для печати. |
|
{; | ,} |
— определяет, где начинается следующий вывод: |
|
|
; — печать сразу после последнего значения. |
|
|
, — печать в начале следующей зоны печати. |
|
|
Ширина зоны печати — 14 символов. |
|
Оператор PRINT# отличается от оператора WRITE# тем, что за один раз выводит одну запись, независимо от того, сколько переменных в нем указано, в то время как оператор WRITE# для каждого указанного в нем выражения формирует отдельную запись. Поэтому, используя оператор PRINT#, программист должен сам заниматься позиционированием прочитанных записей, которые были записаны с помощью оператора PRINT#. Данный оператор удобно использовать при работе с одной переменной, хотя это и весьма условное удобство. Автор лично склоняется к мнению, что уж если оператор носит название “Печать”(PRINT), то и наилучшее его использование — это печатать на экране монитора или принтере.
Пример :
a$=“abcd Проверка “ b=10.789
оператор PRINT# a$,b создаст запись следующего вида: abcd Проверка 10.789
оператор PRINT# a$;b создаст запись следующего вида: abcd Проверка 10.789
а оператор WRITE# a$,b создаст две записи:
“abcd Проверка “ и 10.789
10.8. Оператор LINE INPUT#
LINE INPUT считывает строку, содержащую до 255 символов с клавиатуры или из файла.
Формат оператора LINE INPUT:
LINE INPUT [;] [“приглашение”;] переменная$
èëè
LINE INPUT #номер файла%, переменная$
приглашение |
необязательная строка, отображаемая на экране перед вводом |
|
пользователем данных. Точка с запятой, стоящая сразу после |
|
приглашения, добавляет знак вопроса в строку приглашения. |
переменная$ |
хранит строку символов, введенных с клавиатуры или считан- |
|
ных из файла. |
номер файла% номер файла, открытого оператором OPEN.
Оператор LINE INPUT# считывает все символы до символа возврата каретки.
Пример :
CLS
86 Языки Бейсик
OPEN “spisok” FOR OUTPUT AS #1 DO
INPUT “ ИМЯ: “, name$ 'Считываем имя с клавиатуры. INPUT “ ВОЗРАСТ: “, age$
WRITE #1, name$, age$ 'записываем в файл имя и возраст INPUT “Продолжить(Да,Нет)”; R$
LOOP WHILE UCASE$(R$) = “Ä” CLOSE #1
'Просмотр файла.
OPEN “spisok” FOR INPUT AS #1 CLS
PRINT “Записи в файле:”: PRINT DO WHILE NOT EOF(1)
LINE INPUT #1, REC$ 'Считывает записи из файла. PRINT REC$ 'Печатает записи на экране.
LOOP CLOSE #1
KILL “spisok” 'уничтожает файл на диске
В приведенном фрагменте программы оператор LINE INPUT #1, REC$ про- читает в REC$ сразу и имя и возраст
10.9. Функция INPUT$#
Функция INPUT$# возвращает строку символов, считанных из указанного файла.
Формат записи функции:
INPUT$(n[,[#]номер_файла%])
ãäå
n — число символов (байтов) для чтения.
номер_файла% — номер файла, открытого оператором OPEN. Если номер_файла% опущен, INPUT$ считывает с клавиатуры.
Пример :
OPEN “TEST.DAT” FOR OUTPUT AS #1 PRINT #1, “Текст”
CLOSE
OPEN “TEST.DAT” FOR INPUT AS #1
PRINT INPUT$(3, 1) 'Печатает первые три символа из файла #1 CLOSE
10.10. Оператор FIELD
Оператор FIELD отводит место для буфера при работе с файлами прямого доступа. Можно создать несколько буферных областей.
Формат оператора FIELD:
FIELD [#]номер_файла%, ширина_поля% AS переменная$
[,ширина_поля% AS переменная$] ...
Глава X. Файлы данных |
87 |
ãäå
номер_файла% — номер файла, указанный в операторе OPEN. ширина_поля% — число символов в переменной.
переменная$ — переменная, идентифицирующая поле и содержащая данные поля.
Общая длина буферного поля не должна превышать реальную длину записи, с которой будут работать операторы GET и PUT.
Использование переменой пользователя обычно обеспечивает лучший способ для управления записью данных.
Пример :
OPEN “ФАЙЛДАН.ДАН” FOR RANDOM AS #1 LEN = 80
FIELD #1, 30 AS name$, 50 AS address$
10.11. Функции MKI$, MKS$, MKD$, MKL$
Все числовые данные, которые записываются в файл прямого доступа, обязательно должны быть переведены в символьную форму. Этот перевод выполняется с помощью функций MKI$(Make Integer-представить обычным целым), MKL$(Make integer Long-представить длинным целым), MKS$(Make Sing- le-представить с обычной точностью), MKD$(Make Double-представить с двойной точностью), которые преобразуют числа в символьную форму при пересылке в буфер с помощью операторов LSET и RSET.
Формат записи функций:
MKI$(целое_выражение%)
MKL$(длинное_целое_выражение&)
MKS$(выражение_одинарн_точности!)
MKD$(выражение_двойной_точности#)
Функция MKI$ позволяет системе рассматривать целое число, как символьную строку длиной два байта; MKL$ — позволяет системе рассматривать длинное целое число, как символьную строку длиной четыре байта; MKS$ — позволяет системе рассматривать число обычной точности, как символьную строку длиной четыре байта; MKD$ — позволяет системе рассматривать число двойной точности, как символьную строку длиной восемь байт;
Функция |
Возвращает |
|
|
|
|
MKI$ |
2 |
байт. строку |
|
|
|
MKL$ |
4 |
байт.строку |
|
|
|
MKS$ |
4 |
байт. строку |
|
|
|
MKD$ |
8 |
байт. строку |
|
|
|
|
|
|
Пример: ccoltime$=MKI$(clock%)
где CLOCK%-целочисленная переменная, равная, например 2767.
88 |
Языки Бейсик |
10.12. Операторы LSET и RSET
Операторы LSET(Left Set-поместить слева) и RSET(Right Set-поместить справа) пересылают данные в буфер перед записью их на диск оператором PUT.
LSET и RSET перемещают данные в буфер файлов прямого доступа (подготавливая его к оператору PUT) и осуществляют правое или левое выравнивание значений строковой переменной. LSET также копирует содержимое одной записи переменной в другую.
Формат записи операторов LSET и RSET:
LSET строк_переменная$=строк_выражение$
RSET строк_переменная$=строк_выражение$
LSET запись_переменной1=запись_переменной2
ãäå
Строк_переменная$ Любая строковая переменная или поле файлов прямого доступа, определенное в операторе FIELD.
Строк_выражение$ Для LSET — версия строк_переменной$ для левого края. Для RSET, версия строк_переменной$ для правого края. Длина каждого строк_выражения$ должна быть не более той длины, которая отведена ей в операторе FIELD. Если длина строк_выражения$ меньше выделенного ей поля, то оператор LSET разместит данные, начиная с его левой границы поля, а оператор RSET — с правой. Незанятые позиции в буферных полях заполняются пробелами.
Запись_переменной1 запись переменных любого, определенного Запись_переменной2 пользователем типа данных.
Используйте LSET для присвоения записи переменной одного типа данных другому типу данных, определенному пользователем.
Пример :
OPEN “FILEDAT.DAT” FOR RANDOM AS #1 LEN = 10
FIELD #1, 5 AS Ls1$, 5 AS Rs1$
LSET Ls1$ = “ËSET”
RSET Rs1$ = “ÏSET”
PUT #1, 1
CLOSE #1
OPEN “FILEDAT.DAT” FOR RANDOM AS #1 LEN = 10
FIELD #1, 5 AS Ls2$, 5 AS Rs2$
GET #1, 1
PRINT “*” + Ls2$ + “*”, “*” + Rs2$ + “*”
CLOSE #1
10.13. Оператор PUT
Оператор PUT записывает содержимое переменной или буфера в файл прямого доступа.
Формат оператора:
Глава X. Файлы данных |
89 |
PUT [#]номер_файла%[,[номер_записи&][,переменная]]
ãäå
номер_файла% номер файла, указанного в операторе OPEN. номер_записи&для файлов прямого доступа — номер записи. Целочисленное
значение номера записи может находиться в диапазоне от 1 до 32 767. Под этим номером запись будет помещена в файл и в дальнейшем считана. Если номер записи опущен, то записи присваивается следующий по порядку номер по отношению к последнему оператору PUT. Если оператор PUT первый после оператора OPEN, то записи присваивается номер один. Любая попытка при записи или чтении выйти за границы буфера вызывает сообщение об ошибке.
Для двоичных файлов — позиция байта, где начинается чтение или запись.
переменная переменная, содержащая вывод для записи в файл. Переменной обычно является переменная определенного пользователем типа данных.
Используя оператор PUT, необходимо иметь ввиду, что система не проверяет, существуют ли в файле записи с номером, меньшим, чем у записи, которая записывается в текущий момент. То есть, если программа создает и записывает первой запись с номером 100, то эта запись помещается в файл на 100-м месте, формируется длина файла, равная длине записи умноженная на номер последней записи. И если возникнет необходимость хранить только 50 записей, удалить ненужные записи невозможно иначе, чем реорганизуя файл, то есть переписав его в другое место с нужными записями. Реорганизация файла прямого доступа целиком лежит на прикладном программисте.
Пример 10.13.1:
'создание файла произвольного доступа c использованием буфера
обмена CLS
OPEN “FINAL.DAT” FOR RANDOM AS #1 'ОТКРЫВАЕМ ФАЙЛ
‘ПРЯМОГО ДОСТУПА 'создаем буфер
FIELD #1, 12 AS chislo$, 16 AS denned$, 19 AS coltime$, 20 AS fio$
nom% = 1 'начальное значение номера записи a1: INPUT “Ввести число (дд):”; c$
INPUT “Ввести день недели (нн):”, d$ INPUT “Ввести кол-во часов (чч):”, clock% INPUT “Ввести ФИО преподавателя:”, f$ 'пересылка в буфер
LSET chislo$ = c$ LSET denned$ = d$
LSET coltime$ = MKI$(clock%) LSET fio$ = f$
PUT #1, nom% 'помещаем запись на диск nom% = nom% + 1 'увеличиваем номер записи
90 |
Языки Бейсик |
INPUT “будете еще вводить(д,н)?”; da$
IF da$ = “д” OR da$ = “Д” GOTO a1 'проверка конца работы CLOSE #1 'закрытие файла
В качестве альтернативного варианта автор приводит текст программы, которая делает то же самое, но не пользуется буфером обмена, а использует переменную пользователя.
Пример 10.13.2:
Создание файла прямого доступа с использованием переменной пользовательского типа
CLS
TYPE TestRecord 'Определение переменной пользовательского
òèïà
chislo AS STRING * 2 denned AS STRING * 2 coltime AS INTEGER fio AS STRING * 20
END TYPE
DIM uchet AS TestRecord 'Определение типа переменной, как ‘пользовательской
nom% = 1 'начальное значение номера записи
OPEN “FINAL.DAT” FOR RANDOM AS #1 LEN = LEN(uchet) a1: INPUT “Ввести число (дд):”; uchet.chislo
INPUT “Ввести день недели (нн):”, uchet.denned INPUT “Ввести кол-во часов (чч):”, uchet.coltime INPUT “Ввести ФИО преподавателя:”, uchet.fio
PUT #1, nom%, uchet 'помещаем запись на диск nom% = nom% + 1 'увеличиваем номер записи PRINT “будете еще вводить(д,н)?”;
da$ = INPUT$(1) 'ожидание нажатия клавиши PRINT da$
'проверка конца работы
IF UCASE$(da$) = “L” OR da$ = “Ä” OR da$ = “ä” GOTO a1: CLOSE
'закрытие файла
В качестве же комментария достаточно заметить, что второй вариант программы получился более смысловой и хотя программирование — очень специфическое занятие, но делать из программы своего рода “черный ящик” — занятие неблагодарное и как правило возвращается бумерангом к автору “произведения”.
Результат выполнения программы.
Ввести число (дд): 19 Ввести день недели (нн): пн
Ввести кол-во часов (чч): 13
Ввести ФИО преподавателя: Иванов И.И. будете еще вводить(д н)? д Ввести число (дд): 20 Ввести день недели (нн): вт
Ввести кол-во часов (чч): 11
