14. Функции для обеспечения ввода и вывода на языке Бейсик. 14.1. Функция INKEY$. Функция INKEY возвращает пустую строку символов, если не использовалась ни одна клавиша клавиатуры, в противном случае возвращается одноэлементная символьная строка. Формат: /<переменная символьной строки>= / INKEY коды клавиш на экран не выводятся. Разрешается использовать все клавиши вплоть до клавиши "CTRL+C". Функция имеет тип "символьной строки". Пример: . . . 310 BZ$=INKEY "цикл 320 IF BZ$= "" GOTO 310 310 "продолжение программы . . . 14.2. Функция INPUT$. Функция INPUT возвращает символьную строку задаваемой длины, причем ввод происходит с клавиатуры. Формат: /<переменная типа символьной строки>=/ INPUT$(<аргумент>) <аргумент> может быть числовым выражением, числовой переменной или числовой константой целого типа. Его значение задает длину вводимой последовательности символов. Значение должно лежать между 1 и 255. При вводе символов разрешается использовать все символы вплоть до символа "CTRL+C". Вводимые с клавиатуры символы на экран не выдаются. Фунеция имеет вид символьной строки. Пример: 70 A$=INPUT (10) "требуется ввести с клавиатуры 10 символов. 14.3. Функция INP для физического ввода какого-либо значения из входного канала. Функция INP обеспечивает прямое чтение какого-либо порта. Формат: /<целая переменная>=/ INP (<аргумент>). <Аргумент> может быть числовым выражением, числовой переменной или числовой константой целого типа.Значение аргумента должно лежать между 0 и 255 включительно. Оно определяет номер канала. Указание: функция является инверсной функцией по отношению к инструкции OUT (смотри пункт 13.8.). Пример: 100 C%=INP(52) Функция PEEK позволяет читать какой-либо байт из заданного адреса в диапозоне от 0 до 65535. Формат: /<целая переменная>=/ PEEK (<аргумент>) <аргумент> может быть числовым выражением, числовой переменной или числовой константой целого типа. Значение аргумента должно лежать между 0 и 65535 включительно. Значение выражения можно задавать в десятичном или в шестнадцатеричном виде. Указание: функция является инверсной инструкцией по отношению к инструкции POKE (смотри пункт 13.9.). Пример: 50 PRINT PEEK(&H440) 14.5. Функция SPC. Функция SPC поставляет некоторое задаваемое количество пробелов с текущей позиции печати строки печати. Формат: SPC (<аргуумент>) <аргумент> может быть числовым выражением, числовой переменной или числовой константой целого типа. Значение аргумента должно лежать между 0 и 255 включительно. Оно задает количество вставляемых пробелов. Указание: функцию разрешается использовать только в списке параметров инструкций печати PRINT и LPRINT. Пример: 40 PRINT "AB=>";SPC(12);"<=CD" RUN AB=> <=CD OK 14.6. Функция TAB. Функция TAB устанавливает курсор в заданную позицию по модулю длины строки. Формат: TAB (<аргумент>) <аргумент может быть числовым выражением, числовой переменной или числовой константой целого типа. Значение аргумента должно лежать между 0 и 255 включительно. Если текущая позиция курсора больше значения выражения по модулю длины строки, то курсор переходит в нужную позицию на следующей строке. Указание: функцию разрешается использовать только в списке параметров инструкций печати PRINT и LPRINT. Пример: 40 PRINT "AB" TAB(6) "CD" RUN AB CD OK функция LPOS указывает фактическую позицию печатающей головки. Формат: LPOS (<аргумент>) <аргумент> может быть какой-либо переменной, которая для выполнения функции не имеет никакого значения. Первой позицией является самая крайняя левая позиция печатающей головки. Пример: 70 PRINT LPOS(AR) 14.8. Функция POS. Функция POS указывает номер текущей позиции курсора на экране. Формат: POS (<аргумент>) <аргумент> может быть какой-либо переменной, которая для выполнения функции не имеет значения. Первой позицией является самая крайняя левая позиция. Пример: 70 IF POS(Z$) > 60 THEN PRINT CHR$(13) 15. Работа с наборами данных на языке бейсик. На языке Бейсик можно работать с последовательными наборами данных и с наборами данных прямого доступа. Работа с наборами данных базируется на работе с наборами данных в операционной системе СРМ. Стандартная длина физической записи составляет 128 байт. Логическая длина записи может быть любой, но должна оставаться постоянной. Динамически изменяемые длины записей невозможны. Существующие последовательные наборы данных нельзя динамически расширять. Если требуется расширение, то расширяемый данных следует скопировать во второй набор данных. INPUT-набор данных можно затем уничтожить командой KILL (смотри пункт 5.16.). Скопированный набор данных следует открыть как OUTPUT-набор данных. После этого набор данных можно расширять. По окончании работ выходной набор данных можно переименовать с помощью инструкции NAME (смотри пункт 5.17.). При работе с наборами данных прямого доступа можно обращаться к записям набора данных в любой последовательности. Ссылка к какой-либо записи присходит по относительному номеру, номеру записи. К записям набора данных можно обращаться прямым доступом. Возможен также и смешанный способ доступа, при котором начиная с какой-либо выбранной записи продолжают работать последовательно. В прямом доступе всегда используется 1024 байт. При этом пользователь должен самостоятельго контролировать незанятые ячейки памяти. Рекомендуется произвести дополнительное заполнение записи, позволяющее сразу видеть не относящиеся к записи данные и незанятые элементы записи. 15.1. Инструкция DATA для установки программных констант и данных в программных наборах данных. Программные константы и данные размещают в программных наборах данных с помощью инструкции DATA. Формат: DATA <константа>/,<константа>/... Инструкция DATA является невыполняемой инструкцией. Она может занимать несколько строк экрана и содержать максимально 255 байт. Несколько инструкций DATA в порядке возростания их номеров строк можно связать с каким-либо набором данных. Инструкции DATA можно использовать в любом месте программы. В качестве <константы> инструкции DATA можно использовать: - все типы числовых констант (целые числа, числа с фиксированной точкой, числа с плавающей точкой одинарной и двойной точности , шестнадцатеричные числа, восьмиричные числа); - константы типа символьной строки в качестве последовательности, которую также можно заключить в " ". Последнее требуется в тех случаях, когда необходимо вставить запятую, двоеточие или пробел перед, после или внутри символьной строки. Двойной апостроф не разрешается использовать в константах типа символьной строки. Указание: С точки зрения методики программирования следует описывать инструкции DATA для констант одинакового типа. Инструкции для символьных строк должны стоять перед инструкциями для числовых констант. Пример: 10 FOR I%=1 TO 5 20 READ A% 30 PRINT A%; 40 NEXT 50 DATA 5,4,3,2,1 RUN 5 4 3 2 1 OK 10 FOR I%=1 TO 5 20 READ A% 30 PRINT A%; 40 RESTORE 50 NEXT 60 DATA 5,4,3,2,1 RUN 5 5 5 5 5 OK 10 DATA A.MUELLER, 1036, "BERLIN SPREESTR.7" 20 DATA K.ANTON, 1090, "BERLIN FRIEDENSSTR.1" 30 DATA J.HARPE, 2135, "ADOLF DORFSTR.15" 40 DATA "END" 50 READ S$ 60 IF S$="END" THEN END 70 READ I%,S1$ 80 IF I% < 2000 THEN PRINT S$;I%;S1$ 90 GOTO 50 100 END RUN A.MULLER 1036 BERLIN SPREESTR.7 K.ANTON 1090 BERLIN FRIEDESSTRR.1 OK 15.2. Инструкция READ или чтение из программных наборов данных. С помощью инструкции READ считывают данные, организованные в программных наборах данных инструкции DATA, в переменные, в переменные, указанные в инструкции READ. Формат: READ инентификатор переменной /,идентификатор переменной/... При выполнении инструкции READ следующим друг за другом переменным присваиваются последовательно значения из программного набора данных. Если встречается какая-либо числовая переменная, то соответствующий элемент в инструкции DATA тоже должен быть какой-либо числовой константой. Если в инструкции READ встречается переменная типа символьной строки, то соответствующий элемент в инструкции DATA также должен быть константой типа символьной строки. С помощью инструкции RESTORE (смотри пункт 15.3.) Можно установить указатель набора данных в началоорганизованных инструкцией DATA данных. Благодаря этому можно еще раз считывать константы. Пример: 10 FOR I%=1 TO 10 STEP 2 20 READ A(I%),A(I%-1) 30 NEXT 40 DATA 23,27,88,17 50 DATA 13,17,78,-7 60 DATA -1,99,20,30 70 PRINT 80 FOR I%=0 TO 9 90 PRINT A(I%); 100 NEXT RUN 27 23 17 88 17 13 -7 78 99 -1 OK 15.3. Инструкция RESTORE для установки указателя программного набора данных С помощью инструкции RESTORE можно настроить указатель обработки программного набора данных на данные, стоящие в начале какой-либо инструкции DATA (смотри пункт 15.1.). Формат: RESTORE /<номер строки >/ У программного набора данных есть указатель, устанавливающий, какая следующая константа должна быть присвоена переменной. Данный указатель начинает с набора инструкции DATA и шаг за шагом проходит по программному набору данных. С помощью инструкции RESTORE возможен непоследовательный доступ. Обычная последовательность прерывается, а указатель устанавливается на первый элемент какой-либо выбранной инструкции DATA (смотри пункт 15.1.). Если в инструкции RESTORE указан какой-либо номер строки, то указатель устанавливается на первую константу в заданной инструкции DATA. Если никакой номер строки не задан, то указатель устанавливается на первую константу в первой в программе инструкции DATA. Пример: 10 DATA E,I,K,H 20 DATA M,A,T 30 READ A$,B$,C$,D$ 40 READ E$,F$,C$ 50 RESTORE 20 60 READ H$,I$,J$ 70 PRINT E$;F$;F$;A$;H$;I$;J$;B$;C$ RUN матнематик ОК 15.4. Инструкция OPEN для открытия набора данных Спомощью инструкции OPEN открывают наборы данных и устанавливают метод доступа. Формат: OPEN <режим>, /#/ <номер набора данных>,<допустимый идентификатор набора данных /,<длина записи>/. С помощью параметра <режим> устанавливают метод доступа к набору данных. В качестве режима можно указывать выражение из символьных строк, переменную типа символьной строки или константу типа символьной строки. Которые могут принимать следующие значения: "О": последовательный выходной набор данных, "I": последовательный входной набор данных, "R": набор данных прямого доступа для вывода/ввода. Параметр номер набора данных может быть целым выражением, целой переменной или целой константой. Числовое значение должно быть между 1 15 включительно. За счет этого каждый набор данных получает некоторый логический номер, по которому ссылаются различные инструкции при доступе к набору данных. Допустимый идентификатор набора данных является каким-либо допустимым в операционной системе СРМ идентификатором набора данных. Его можно задавать в виде заключенной в " " константы типа символьной строки, либо в качестве переменной типа символьной строки или выражения из символьных строк. С его помощью устанавливается соответствие с внешними областями памяти. В качестве идентификаторов наборов данных разрешается использовать только простые идентификаторы. Групповые идентификаторы наборов данных (т.е. "?" - И "*"- идентификаторы) недопустимы! Параметр длина записи можно использовать при работе с наборами данных прямого доступа. Если он не задан, то используется стандартная длина записи, описанная при старте Бейсик-интерпретатора. Данный параметр может быть целым выражением, целой переменной или целой константой. Примеры: 10 OPEN "I",I,"BEISPIEL" . . . 30 OPEN "0",3,"B:BEISPIEL.TXT" . . . 60 "B:PROGRAMM.DOC" 70 OPEN "0",2,S$ . . . Припечание: С помощью данной инструкции OPEN открывают какой-либо набор данных с соответствующим идентификатором набора данных во внешней памяти. Если набор данных еще не организован, то его необходимо сначала снова создать и внести в каталог наборов данных. Одновременно резервируется соответствующий буфер для набора данных заданной явно или с обычно стандартно используемой длиной записи. 15.5. Инструкция INPUT# для ввода из последовательного набора данных. С помощью инструкции INPUT# для ввода из последовательного набора данных считывают данные в коде ASCII из набора данных в том виде, в каком данные были введены с клавиатуры с помощью инструкции INPUT (смотри пункт 13.1.). Формат: INPUT# <номер набора данных>,<переменная>/,<переменная>/... При открытии набора данных с помощью инструкции OPEN (смотри пункт 15.4.) Каждый открытый набор данных получает логический номер набора данных, по которому к нему можно обращаться с помощью инструкций доступа. Соответственно задается <номер набора данных> для соответствующего набора данных.Номер набора данных может быть целым выражением, целой переменной или целой константой. Каждый элемент данных считывается из указанного набора данных в какую- либо <переменную> списка переменных в той последовательности, как они появляются в списке. При этом значения символьных строк должны присваиваться переменным типа символьной строки, числовые значения числовым переменным, в противном случае возникает ошибка. Если считываемое значение имеет не тот же тип, что и переменная, то происходит преобразование типов. Все считываемые с помощью инструкции INPUT# элементы данных должны быть разделены запятыми. Символьные строки должны быть заключены в " ". Первым считываемым элементом является тот элемент, который следует за текущей позицией указателя набора данных, т.е. первый элемент считывается сразу же по завершении последнего доступа. Физические границы записи игнорируются. Список считываемых элементовданных можно начать в середине какой-либо записи и окончить в середине любой другой записи. Пример: 10 OPEN "O",I,"BEISPIEL" 20 A%=10 30 B%=35 40 C%=20 50 PRINT# I,A%,B%,C% 60 PRINT# I,A%,B%,C% 70 CLOSE I 80 OPEN "I",I,"BEISPIEL" 90 IF EOF(I) THEN END 100 INPUT# 1,I,Z% 110 IF Z% > 30 THEN PRINT Z% 120 GOTO 90 RUN 35 35 OK Примечание: Для каждой переменной инструкции INPUT# считывает последовательность символов из набора данных, пока не будет найден соответствующий ограничительный символ. Для числовых данных это может быть пробел, запятая или управляющий символ перевода строки или возврата каретки. Для символьных строк ограничительными символами являются запятая и управляющие символы перевода строки и возврата карктки. Если какая-либо символьная строка