N88-BASIC(86) BASICの文法
出典
- N88-日本語BASIC(86)(Ver6.2) リファレンスマニュアル、日本電気株式会社、1991年発行
BASICの文法
1. 文
文は, BASICが行う手続き(すなわちコンピュータに実行させるべき処理)を記述する最小単位です.
文は1つの命令からなります.そして命令は,命令の名前と,命令に与える情報(パラメータ)とからなります.パラメータには定数,変数,関数(「第2章10.4 関数」参照)のほか,これらを組み合せた式などを指定することができます.
2. 行
行とは,プログラムモードで実行する場合において,メモリ中に格納(記憶)されるプログラムとして書かれる,行単位の文の集まりのことです.
行の先頭には行番号をつけます. 1行(行番号も含めて)には255バイトの範囲で文の記述が可能です.
行は,基本的には1つの文からなりますが,複数の文を記述することも可能です. 1行に複数の文を記述する場合,各文をコロン(:)で区切ります.これは複文(マルチステートメント)と呼ばれ, 1行の範囲内で任意の数の複文が記述できます.
3. 行番号
行番号は1から65529までの整数で指定します.
行番号は行をメモリに格納したりディスクにセーブしたりする場合の格納順序を示すものです.
行番号をつけた行は, リターンキーの入力とともにメモリに格納されます.この方法で1行以上の行をメモリに格納したものがプログラムであり, RUNなどを使って実行させることができます.
このように,行番号をともなった行を入力する方法が、プログラムモードかです.これに対し,行番号なしで命令を入力することによってただちに実行を行う方法が"ダイレクトモード"です(「第1章3. BASICの動作モード」参照).
プログラムの実行は行番号の小さいものから行われます.
行番号は分岐(プログラムの実行順序を変えること)の場合の分岐先として使用されるほか,LIST. DELETEなど〈行番号〉を対象とする命令のパラメータ(引数)として使われます.
4. BASICで使用できる文字と特殊記号
使用できる文字は次のとおりです.
- 文字
- 1バイト系文字
- 英大文字
- 英小文字
- 数字
- カナ
- 特殊記号
- グラフィックキャラクタ
- コントロールキャラクタ
- 日本語文字(2バイト系日本語文字)
- 2バイト系全角文字
- 2バイト系半角文字
- 2バイト系4分の1角文字
- 利用者定義文字
- 1バイト系文字
1バイト系の英大文字と英小文字は,キーボード上から入力できる通常の英文字です.BASICでは,特定の場所(たとえば文字型定数の中・・・文字型定数に関しては「第2章5.1 文字型定数」参照)を除き,英大文字と小文字とは同じ意味に解釈されます.
コントロールキャラクタは,スクリーンエディタに直接指示を与えるために使うもので,キーボード上のCTRLキーを押しながら英文字1文字のキーを押すことによって入力します.
日本語文字は,日本語処理システムによって入力する文字です.命令によっては使えないものもありますので注意してください
これらの文字の詳細については,「付録B. コントロールコード表」,「付録C. キャラクタコード表」,あるいはBASICユーザーズマニュアル,日本語入力ガイドなどを参照してください.
■特殊記号の使い方
算術演算子(+,-,*,/)などの他にも特別な意味を持つ記号があります.ここでその意味をまとめて説明しておきます.なお,ここで説明しているのは1バイト系の特殊記号です.2バイト系日本語文字の中にも同様な記号がありますが,それらは文字型定数としてのみ使えるもので,特殊記号として使うことはできません.
(1) ピリオド(.)
最後にBASICの処理の対象となった行(現在行,着目行などという)の行番号の値を示す記号で,命令中の〈行番号〉の代わりとして使用することができます.たとえば,新しい行を挿入した,エラーが発生したなどの行です.
例) LlST .
(2) マイナス(?)
LIST, DELETEなどで行の範囲を指定するとき,何行から何行までという場合に使います.算術演算子の負号と同じ記号です.
例) DELETE 100-200
(3) コロン(:)
マルチステートメントの区切りとして使います.
例) A=B+C:PRINT A
(4) コンマ(,)
パラメータが並ぶ場合その区切りとして使います.
例) INPUT A, B, C
COLOR 7, , ,0
(5) セミコロン(;)
PRINTなどの出力文中でパラメータが並ぶ場合その区切りとして使います.
例) PRINT "A=";A
(6) アポストロフィ(')
REM (第3章中のREM 項参照)の代用として使います.
(7) クエッションマーク(?)
PRINTの代用として使います.
(8) アスタリスク(*)
ラベル名の先頭につけます(「第2章13. ラベル名」参照).
(9) スペース
原則として文字型定数に含まれているスペース以外のスペースは無視されますが,命令の名前の直後には必ずスペースを入れなければなりません.
5. 定数
定数とは,それぞれ固有の値を持ったデータのことで,プログラム中などに直接表記されるものです.定数は,次のように分類することができます.定数の表記法は,型によってそれぞれ異なります.
- 定数
- 文字型
- 文字列(日本語文字も含む)
- 数値型
- 整数型
- 8進形式
- 10進形式
- 16進形式
- 実数型
- 単精度実数型
- 倍精度実数型
- 整数型
- 文字型
5.1 文字型定数
文字型定数とは. 255バイト以内の文字をつなぎ,その前後をダブルクォーテーション(")で囲んだ,文字列データのことです.文字列中には, 1バイト系の英数字,カナ文字,特殊記号,グラフィックキャラクタならびに2パイト系日本語文字などを使用できます(混在も可能です).
BASICの命令のなかには. 2バイト系日本語文字が使用できないものもあります(各命令参照).また, (")を文字型定数中に直接記述することはできません. (")を文字型定数としたい場合. CHR$を用いて,例のようにCHR$(&H22)とします.
なお,文字型定数を算術演算に使うことはできません.
例) "Good Morning" "1 2 3 4 5 6 7 8 9" "パーソナル コンピュータ" "日本語BASIC" CHR$(&H22)+"TEST"+CHR$(&H22)
5.2 数値型定数
数値型定数とは,算術演算を行うことのできる数値データを直接表記したもので,大きく分けて,整数型と実数型とがあります.
5.3 整数型定数
整数型定数は,表記上の観点から, 8進・10進・16進の3つの形式に分類されます
■10進形式
-32768から+32767までのすべての整数です.負の整数の場合,数値の前には必ずマイナス符号をつけなければなりませんが,正の数の前の符号は省略できます.また,同じ範囲内の実数の後ろに%をつけると,小数点以下は四捨五入され,整数型の定数とみなされます.
例) 32767 -123 +5 31100.5% ←整数を表す.
■8進形式
頭に&Oまたは&をともなった, 0から7までの数字の並び. &0〜&177777の範囲内です.
例) &12345 &O7777
■16進形式
頭に&Hをともなった, 0からFまでの並び. &H0〜&HFFFF の範囲内です.
例) &H100 &HCFFF
注意:8進形式または16進形式で入力された数値は, PRINTなどの出力文では10進形式で出力されます.10進以外の形式で出力するときは,それぞれOCT$,HEX$を使って文字列として出力してください.
5.4 実数型定数
実数型定数は,単精度実数型と倍精度実数型に分けられます.
5.5 単精度実数型定数
有効桁7桁の精度をもつ実数のデータです.出力のときは7桁目が四捨五入され, 6桁以下で表示されます.単精度型実数の値の範囲は, -1.70141E+38〜1.70141E+38です.
単精度実数型の定数には,表記上の分類により,次の3つの形式があります.
- 7桁以下の実数
- 最後に!をともなった数
- Eを使った指数形式
例) 3525.68 3.14! -7.09E-06
5.6 倍精度実数型定数
有効桁16桁の精度をもつ実数のデータです.出力のときは, 16桁以下で表示されます.倍精度型実数の値の範囲は, -1.701411834604692D+38〜1.701411834604692D+38です.
倍精度実数型の定数には,表記上の分類により,次の3つの形式があります.
- 8桁以上の実数
- 最後に#をともなった数
- Dを使った指数形式
例) 1234567.890 56789.0# -1.09432D-38
6. 変数
変数は,プログラム中で使うデータをしまっておくことができる入れ物のようなもので, 1バイト系の英数字で名前(変数名)をつけます.変数は,演算,参照などに使うことができます.
なお,変数に値を格納する(入れる)前は,数値変数の値は0,文字変数はヌルストリング(空の文字列)であるものとみなされます.
6.1 変数名
変数名は長さ40文字以内の, 1バイト系英数字とピリオド(.)の組み合せで表されます.ただし,変数名の初めの1文字は英字でなくてはなりません.この規約にしたがって名前をつけられた変数は,すべて区別されます.
たとえば,次の2つの変数は異なった変数名として解釈されます.
COUNTER.OF.TABLE.DATA.999888777666555.01 COUNTER.OF.TABLE.DATA 999888777666555.02
変数名は予約語(「第2章8.予約語」,「付録E.予約語一覧」参照)であってはなりませんが,予約語を含んだものはかまいません.ただし, FNで始まる変数名は許されません(第3章中のDEF FNの項参照).また英文字において大文字,小文字の区別はありません.
6.2 変数の型
変数にも,定数と同様,格納するデータに応じた型があります.
変数に値を格納するためには,代入文やINPUTなどを用いますが,いずれの場合にも変数の型は,格納されるデータの型と一致していなければなりません.
- 変数
- 文字型
- 数値型
- 整数型
- 実数型
- 単精度実数型
- 倍精度実数型
変数の型は,変数名の最後に型宣言文字をつけることによって区別します.型宣言文字の種類は次の4つです.
- 型宣言文字
- $ - 文字型
- % - 整数型
- ! - 単精度実数型
- # - 倍精度実数型
通常は,型宣言文字を省略すると,"!"がついているとみなされます(単精度実数型変数となる).
例) A!, A#, A%, A$. これらは区別されるが, A! と A は同じ.
ただし,型宣言命令(DEFINT,DEFSNGなど)を用いて一括指定を行った場合,型宣言文字省略時の型は,型宣言命令によって宣言された型となります.たとえば,次の例では, A?Cで始まる変数は,型宣言文字をつけないとみな整数型となります.
例) DEFINT A-C C=A+B ←A, B, C は,型宣言文字をつけなげれば整数型 L=M*N ←A?C以外は,型宣言文字をつけなければ単精度実数型
7. 配列変数
配列変数は,たくさんのデータを変数に代入したり,参照する場合に使います.たとえば,データの数が100個あるとき, 100個の別の変数を用意するのはたいへんです.このようなときに, A(0)?A(99) のように変数名の後にカッコつきの番号をつけた形で配列として扱うと,100個のデータを1つの変数名で処理することができます.
カッコ内の番号は添字といし、配列のなかの何番目の要素であるかを表します.たとえば,A(0)は, Aという配列変数の0番目の要素という意味になります.添字には整数定数,または整数型の変数を使うことができます.
配列変数の型(すなわち配列変数内の各要素の型)は,通常の変数と同様,その配列変数名の最後(カッコの直前)につけられた型宣言文字によって決まります.ただし,型宣言命令で一括指定を行った場合は,この限りではありません.詳しくは, 「第2章6.2 変数の型」を参照してください.
プログラム内で配列を使うには,あらかじめDIMによる、配列の宣言が必要です.配列の宣言とは,変数の名前と配列に入れる要素の個数を決めてやることです.DIMでは次のように,その配列で使用可能な添字の最大値を指定することにより,要素の個数を決めます.
DIM A(5) 添字の最大値が5で,名前が"A"という配列変数を宣言
添字は,原則として0から始まりますので,実際の要素数は添字の値+1となります.この例では, 5 + 1で,要素数は6個となります.
"添字が0から始まる"ということを,"添字の最小値(OPTION BASE) が0である"といい, BASICの起動時にはこの状態になっています.なお, OPTION BASEという命令を使うことにより,添字の最小値を1にすることもできます.
また, DIM中で配列変数を宣言する際,複数の添字をコンマで区切って指定すると,その配列変数は,添字の個数に応じた、次元か数をもつことになります.
たとえば,添字の最小値が0であるとして次のような配列を宣言した場合の,各配列の次元数および要素の合計数を示してみます.
DIM A(10) 1次元配列,要素数は11 DIM TA(2, 3) 2次元配列,要素数は3 x 4 = 12 DIM NAMAE$(2, 5, 3) 3次元配列,要素数は3 x 6 x 4 = 72
2番目の例の場合,次のような2次元(縦方向と横方向の2次元)の配列がとられます.
TA(0, 0) TA(0, 1) TA(0, 2) TA(0, 3) TA(1, 0) TA(1, 1) TA(1, 2) TA(1, 3) TA(2, 0) TA(2, 1) TA(2, 2) TA(2, 3)
配列変数の次元および添字の最大値は,メモリ容量や変数の型によって制限がありますので注意してください(第3章中のDIMの項参照).
なお,添字の最大値が10以下(添字の最小値が0でも1でもかまわない)のときは, DIMによる宣言を行わなくとも,配列変数を用いることができます.
8. 予約語
N88-BASIC(86)は,命令(関数も含む)の名前,演算子の名前などを,処理上,特殊なものとして扱います.これは"予約語"と呼ばれ,文字どおりBASICによってその使用方法を予約されているものです.したがって,予約語をそのまま変数名として使用したりすることはできません.
予約語を使用する場合には, BASICがその語を予約語であるか否か認識できるようにするため,語の前,後ろ,またはその両方に, BASIC文法上で許された,あるいは規定された特殊文字(スペース,ダブルクォーテーション("),ナンバー記号(#),コロン(:)など)を挿入しなくてはなりません.
BASICの予約語は, 「付録E.予約語一覧」に掲げてあります.
9. 型変換
数値データは,必要に応じて他の型に変換することができます.型の変換は次の規則にしたがって行われます.
なお,文字型と数値型の間では型変換を行うことはできませんが,数値表記の文字列に限り,数値との相互変換を関数によって行うことができます(第3章中のSTR$,VALの項参照).
(1) ある型の数値データが,違った型の数値変数に代入された場合,数値は,その変数名によって宣言された型に変換されます.
例) 10 ABC%=1.234 20 PRINT ABC% RUN 1
(2) 精度の違う数値間の演算の場合,精度の高い方に変換されて,演算が行われます.たとえば, 10#/3の場合, 10#/3#として演算が行われます.
例) 10 A#=10#/3 20 B#=10#/3# 30 PRINT A#, B# RUN 3.333333333333333 3.333333333333333
(3) 論理演算の場合,扱われる数値はすべて整数に変換され,結果は整数で与えられます.
例) 10 A=12.34 20 B=NOT A 30 PRINT B, A RUN -13 12.34
(4) 実数が整数に変換される場合は,小数点以下は四捨五入されます.このとき,整数型で扱える範囲を超えた場合はエラーが起こります.
例)
10 A%=34.4 20 B%=34.5 30 PRINT A%, B% RUN 34 35 |
10 A#=1.234E+07 20 B%=A# 30 PRINT B%, A# RUN Overflow in 20 |
(5) 倍精度実数型変数が単精度実数型変数に代入されたときは,変数の値は有効数字7桁に丸めたものとなります.単精度実数型変数の精度は7桁であり,もとの倍精度の数値との誤差の絶対値は, 5.96E-8以下となります.
例) 10 A#=1.23456789# 20 B!=A# 30 PRINT A#, B! RUN 1.23456789 1.23457
倍精度実数型変数(あるいは倍精度実数型定数)と単精度実数型変数(あるいは単精度実数型定数)を混合して演算したり,単精度の値を倍精度実数型変数に代入したりすると,単精度値に変換する際,有効桁以隆の桁に変換誤差が混入しますので注意してください.
例1) 精度の異なる数値による演算
・好ましくない例(演算結果に変換誤差が混入する) A#=1.41421356#+0.12 ・改良例 A#=1.41421356#+0.12#
例2) 精度の高い変数に対する精度の低い値の代入
・好ましくない例 A#=3.1415 ・改良例 A#=3.1415#
10. 式と演算
式とは,定数や変数を演算子(計算に使う特殊記号のこと)で結合した一般的な数式をはじめ,たんなる文字列や数値,変数だけのもの,または関数の総称です.たとえば次のものは,すべて式です.
例) 10+3/5 A+B/C-D "BASIC" 3.14 A$ TAN(D)
演算は,演算子または関数を用いて行う式の操作のことで,次の5つに分類されます.
- 算術演算
- 関係演算
- 論理演算
- 関数
- 文字列演算
以下に,それぞれの演算について説明します.
10.1 算術演算
算術演算子には次のようなものがあり,示された順序にもとづいて演算を行います.なお,算術式の中に文字定数や文字変数が入ってはいけません.
算術演算子 | 演算内容 | 例 | |
---|---|---|---|
実 行 順 序 ↓ |
^ | 指数(べき乗)演算 | X^Y |
- | 負号 | -X |
|
*, / | 乗算,実数の除算 | X*Y, X/Y |
|
+, - | 加算,減算 | X+Y, X-Y |
演算の実行順序を変更する場合は,カッコを使用します.カッコの中の演算子は他の演算より先に実行されます.カッコ内においては通常の実行順序に従います.
代数表記 | BASICの表記 | |
---|---|---|
1) | 2X+Y | 2*X+Y |
2) | X/Y+2 | X/Y+2 |
3) | (X+Y)/2 | (X+Y)/2 |
4) | X2+2X+1 | X^2+2*X+1 |
5) | XY2 | X^(Y^2) |
6) | (XY)2 | X^Y^2 |
7) | Y(-X) | Y*-X |
なお,演算の実行順序についての詳細は, 「第2章10.6 演算の優先順位」を参照してください.
■整数の除算と剰余の計算
整数の除算は¥によって行われます.扱われる数値が実数の場合は,演算が実行される前に小数点以下が四捨五入されます.商は小数点以下が切り捨てられた整数となります.
例) 10¥3 →3 (10÷3=3・・・1) 23.75¥5 →4 (24÷5=4・・・4)
剰余の演算はMODによって行われます.扱われる数値が実数の場合は,演算が実行される前に小数点以下が四捨五入されます.結果は整数の割り算の余りです.
例) 13.3 MOO 4 →1 (13÷4=3・・・1) 25.68 MOO 6.99 →5 (26÷7=3・・・5)
■0での除算
式の実行時に0での除算が行われた場合は,"/0"(Division by zero)エラーを出力しますが,数値の型に応じてBASICが扱うことのできる最大の数を結果として処理を続行します.
また, 0に対して負のべき乗演算を行った場合も同様になります.
例)
PRINT 2#/0 /0 1.701411834604692D+38 |
PRINT 0^-1 /0 1.70141E+38 |
■桁あふれ(オーバーフロー)
代入や演算の結果がその変数の型内で表現することのできる範囲を超えた場合,桁あふれが発生します.
桁あふれが起こった場合,"OV"(Overflow)エラーを出力し,最大の数を結果として処理を続行します.
例) PRINT 3^300 OV 1.70141E+38
10.2 関係演算
関係演算子は2つの数値を比較するときに用います.結果は,真(-1),偽(0)で得られ,条件判定文などプログラムの流れを変えるのに用いられます(第3章中のIF...THEN........ELSEの項参照).
関係演算子 | 演算内容 | 例 |
---|---|---|
= | 等しい | X=Y |
<>. >< | 等しくない | X<>Y, X><Y |
< | 小さい | X<Y |
> | 大きい | X>Y |
<=, =< | 小さいか等しい | X<=Y, X=<Y |
>=, => | 大きいか等しい | X>=Y, X=>Y |
注意: =は代入文にも使うので注意すること.
IF...THEN........ELSEの中での使い方の例を次に示します.
例) IF X=0 THEN 1000 IF A+B<>0 THEN X=X+1:Y=Y+1
10.3 論理演算
論理演算子は,ビット操作やブール演算(2進演算)を行ったり,複数の関係演算式を結合して複合条件を判定したりするのに用いられます.
論理演算子は,扱う数値を-32768から+32767までの2の補数表示の整数に変換してから,演算を行います.変換時にこの範囲外となれば、"OV" (Overflow)エラーとなります.
各論理演算の内容は次のとおりです.論理演算は,扱う整数値の2進表記(16ビット分)に対してビットごとに行われます.次に示すのは,単一のビットX,Yについての演算結果を表しています.
AND:and (論理積)
X | Y | X AND Y | |
---|---|---|---|
1 | 1 | 1 | |
1 | 0 | 0 | |
0 | 1 | 0 | |
0 | 0 | 0 |
OR:or (論理和)
X | Y | X OR Y | |
---|---|---|---|
1 | 1 | 1 | |
1 | 0 | 1 | |
0 | 1 | 1 | |
0 | 0 | 0 |
XOR:exclusive or (排他的論理和)
X | Y | X XOR Y | |
---|---|---|---|
1 | 1 | 0 | |
1 | 0 | 1 | |
0 | 1 | 1 | |
0 | 0 | 0 |
IMP:implication (包含)
X | Y | X IMP Y | |
---|---|---|---|
1 | 1 | 1 | |
1 | 0 | 0 | |
0 | 1 | 1 | |
0 | 0 | 1 |
EQV:equivalence (同値)
X | Y | X EQV Y | |
---|---|---|---|
1 | 1 | 1 | |
1 | 0 | 0 | |
0 | 1 | 0 | |
0 | 0 | 1 |
論理演算を利用することにより,バイトデータをあるビットパターンに照らし合わせて調べることができます.
たとえば.AND演算子は機器の入出力ポートのステータスバイトの必要なビット以外のすべてのビットをマスクするのに使えます.またOR演算子はある2進数を作るために2つのビットパターンを混合するのに使うことができます.
以下に,論理演算子がどのように働くかの例を示します.演算がビットごとに行われているようすに注意してください
-1 OR 0 → -1 | -1= | (1111 1111 1111 1111)2 |
0= | (0000 0000 0000 0000)2 | |
-1 OR 0 = | (1111 1111 1111 1111)2 | |
48 AND 24 → 16 | 48= | (0000 0000 0011 0000)2 |
24= | (0000 0000 0001 1000)2 | |
48 AND 24= | (0000 0000 0001 0000)2 | |
15 XOR 60 → 51 | 15= | (0000 0000 0000 1111)2 |
60= | (0000 0000 0011 1100)2 | |
15 XOR 60= | (0000 0000 0011 0011)2 | |
17 EQV 12 → -30 | 17= | (0000 0000 0001 0001)2 |
12= | (0000 0000 0000 1100)2 | |
17 EQV 12= | (1111 1111 1110 0010)2 | |
28 IMP 9 → -21 | 28= | (0000 0000 0001 1100)2 |
9= | (0000 0000 0000 1001)2 | |
28 IMP 9= | (1111 1111 1110 1011)2 | |
NOT 23 → -24 | 23= | (0000 0000 0001 0111)2 |
NOT 23= | (1111 1111 1110 1000)2 |
論理演算において,もし, 0(偽)と-1(真)しか与えられなかったなら,扱う整数値の16ビット全部について同ーの演算が行われることになり,演算の結果は0か-1のどちらかとなります(前例の-1 OR 0を参照).したがって,論理演算子で2つ以上の関係演算を結ぶようにして使用することにより,複合条件によってプログラムの流れを変えるのに用いることができます.
例) IF X<0 OR 99<X THEN 1000 Xが負または,99より大きければ,行番号1000へ飛ぶ.
IF 0<X AND X<100 THEN X=0 Xが正でかつ,100より小さければ,Xに0を代入する
IF NOT (A=0) THEN 20 Aが0でなければ,行番号20へ飛ぶ.
10.4 関数
関数とは,指定されたある値(これを関数の引数(ひきすう)という)に対して,ある決まった演算を行い,その演算の結果を得ることができるものです(ただし,関数によっては,引数を必要としないものもあります).
関数は,演算子を使用する他の演算とは異なり,実行後にそれ自身が値をもつ,一種の命令として扱われます.したがって,ふつうの命令のように機能別に決められた名前をもっています.
N88-BASIC(86)には, SIN (正弦), SQR (平方根)などの数値関数やCHR$,LEFT$などの文字列関数といった、組み込み関数かが用意されています.これらの関数については,第3章で通常の命令とともに詳しく説明されています.
また,‘ユーザー定義関数'としてユーザーが自由に定義できる関数機能もあります.これは第3章DEF FNの項で説明します.
なお,初等関数(SIN関数などの数学関数)では,引数が整数や単精度のときは単精度の結果が得られますが,引数が倍精度のときは倍精度の結果を得ること(DISKモードのみ)ができます.
例) A=SIN(3.1416)+COS(3.1416) PRINT 2,2*2, SQR(2)
10.5 文字列の演算
BASICでは,文字列に対して,演算を行うことができます.
■文字列の連結
文字列は,演算子"+"によって連結することができます.
例) 10 A$="SUPER":B$="PERSONAL":C$="COMPUTER" 20 D$=A$+"-"+B$+"-"+C$ 30 PRINT D$ RUN SUPER-PERSONAL-COMPUTER
■文字列の比較
文字も,数値の比較に用いられるものとまったく同じ関係演算子を用いて比較することができます.
=, <, >, <>, ><, <=, =<, >=, =>
文字列の場合それぞれの文字列の最初から1文字ずつ,文字の比較を行います.もし相互にまったく同じ文字列の場合は,その2つの文字列は等しくなりますが, 1個所でも違った場合は,その文字のキャラクタコード(「付録C.キャラクタコード表」参照)の大きい方の文字列が大きくなります.文字列の片方が短くて比較が途中で終わった場合は,短い文字列の方が小さくなります.
文字列の比較においては,空白なども意味をもちますから注意してください.
次の例は,すべて真(-1)となります.
例) "AA"<"AB" "BASIC"="BASIC" "X&">"X#" "PEN ">"PEN" "cm">"CM" "DESK"<"DESKS"
文字列の比較は,文字列の内容を調べたり,文字をアルファベット順に並べたり(ソート)するのに使うことができます.
10.6 演算の優先順佐
種々の演算には優先順位があり,実行時において次の番号順に処理されます.
- カッコで囲まれた式
- 関数
- ^ (指数)
- -(負号)
- *./ (乗算,実数の除算)
- ¥ (整数の除算)
- MOD (整数の剰余)
- +. -(加算,減算)
- 関係演算子(<,>,=など)
- NOT
- AND
- OR
- XOR
- IMP
- EQV
11. ファイル
11.1 ファイルとは
ファイルとは,意味を持つ情報の集まりです.ディスクに保存したプログラムやデータは,ファイルとして扱われます.また他の周辺機器との入出力も,まとまったデータの入出力という意味で,ファイルというとらえかたで扱うことができます.
N88-BASIC(86)では,この捉え方にもとづき,ディスク装置をはじめとして,その他の周辺機器をも一括してファイルとしてみなすことにより,統ーされた入出力操作が可能となっています.
ファイルは"ファイルディスクリプタ"という一定の規則にしたがってつけられた名前によって区別されます.
11.2 ファイルディスクリプタ
ファイルディスクリプタは,周辺機器をも含むファイルを区別する名前で,次のような構成の文字列で表されます.
"[〈デバイス名〉:] 〈ファイル名〉"
ファイルディスクリプタは文字列ですから,必ず,文字の並びをダブルクォーテーション(")で囲んだ文字定数,または文字列を代入した文字変数の,いずれかでなければなりません.
■デバイス名
〈デバイス名〉はディスク装置や他の周辺機器(まとめて入出力機器という)の名称を表すもので,アルファベット4文字,もしくはアルファベット3文字と数字1文字に,":" (コロン)をつけたものを原則としています.ただし,ディスク装置については, ドライブ番号を示す数字に":"をつけた形が用いられます.
N88-BASIC(86)で定義されているデバイス名は,次のとおりです.
デバイス名 | 入出力機器名 | 入力 | 出力 |
---|---|---|---|
KYBD: | キーボード | ○ | × |
SCRN: | スクリーン | × | ○ |
LPT: | プリンタ | × | ○ |
1: 2: ? 30: |
ディスクドライブ1 ディスクドライブ2 ? ディスクドライブ30 |
○ ○ ? ○ |
○ ○ ? ○ |
COM1: COM2: COM3: |
RS-232C第1回線 RS-232C第2回線 RS-232C第3回線 |
○ ○ ○ |
○ ○ ○ |
注意:
- KYBD:およびSCRN:は, DISKモードBASICでのみ指定可能です.
- 1:?30: は,ディスク装置の実装数分だけ指定可能です.
- COM2:, COM3:は,専用のRS-232Cインタフェースボードを実装している場合のみ指定可能です.
〈デバイス名〉:は次の場合に限り,省略することができます.
- DISKモードBASICの場合のフロッピィディスク1 (1:)
なお, RS-232C回線(COMn:)をファイルとして指定する場合は, OPENにより,データビット長やパリティチェックの有無などの,種々のモードを設定しなければなりません.詳しくは第3章中のOPENの項を参照してください.
デバイス名についての詳細は, BASICユーザーズマニュアルを参照してください.
■ファイル名
〈ファイル名〉とは,プログラムファイルやデータファイルにつける名前で,これはユーザーが指定します.ファイル名を必要とするのは,ディスク装置との入出力を行う場合のみです.
ファイル名は次のような書式をとります.
〈ファイル名〉[.] [〈拡張子〉]
最初の〈ファイル名〉は6文字,ピリオドに続く〈拡張子〉は,もしあれば3文字までの文字列より構成されます.それぞれの文字数がそれ以下の場合には空いた部分に空白がうめられます.一般的には, 〈ファイル名〉がファイルの名前を,〈拡張子〉がファイルの性質を表すようにしますが, とくにこれにこだわることなく自由に名前をつけてかまいません.
ふつうファイル名と言う場合は,〈拡張子〉まで含んだものを意味します.
ファイル名には1バイト系の英数カナ文字を使用できますが,コロン(:)およびキャラクタコード0と255で表される文字は使えません.
最初の〈ファイル名〉が6文字を超えて指定された場合,先頭から6文字目までの6文字が〈ファイル名〉として,続く9文字目までの3文字が〈拡張子〉としてみなされます. 10文字目以降の文字は無視されます.
11.3 データファイルとファイル番号
プログラム中で,データファイルを扱うときには,まず, OPENによってファイルの使用を宣言します.
OPENでは,扱うファイルを〈ファイルディスクリプタ〉で指定して,〈ファイル番号〉を割り当てます.ファイル番号は入出力のために必要なメモリ領域(バッファ)に対してつける固有の番号であり,以後, OPENされたファイルへの入出力はこのファイル番号を指示することによって行います.
N88-BASIC(86)が起動したときに最初に指定するファイル数(「第1章3. BASICの動作モード」参照)は,同時にOPENすることのできるファイルの数を意味しますが,このときに指定した数の範囲内でファイル番号を指定することができます.
データファイルの種類やその使い方などに関しては,第3章のファイル関連命令の各項,およびBASICユーザーズマニュアルを参照してください.
12. 割り込み
コンピュータの頭脳であるCPU(Central Processing Unit)は,一般に同時に2つ以上の処理をすることができません.したがって, 1つ仕事を処理している間は他で何が起ころうと,CPUはその処理に移ることはできませんし,それを知ることさえできないのです.このことは,1つの決まった一連の流れを頭から処理するようなプログラムの場合,さほど問題にはなりませんが, 1つのプログラムの処理中に,即実行しなければならないような特別なことがら("事象"と呼ぶ)が起きたときに,その処理を先に実行させるようなプログラムを必要とする場合があります.
"割り込み"とは,このような処理を実現するための手段です.たとえば, CPUがある処理を実行しているとき,ファンクションキーが押されたなどの特別な事象が発生したとします.このような場合,専用のハードウェアはCPUにその事象が起きたことを,ハードウェア的手段で伝えます.そこでCPUは,現在実行中の処理を一時停止し,特別な事象の処理を優先的に実行し,その処理の終了後,元の処理に復帰するのです.
以上のような流れを,"割り込み"と呼ぶわけですが, PC-9800シリーズでは,多くの周辺装置でこの割り込みを使える(すなわち,割り込みの事象を発生させることができる)ようになっており, N88-BASIC(86)もこれらの割り込みをサポートしています.
次に, N88-BASICがサポートしている割り込み機能を示します.
- STOPキー(ON STOP GOSUB参照)
- HELPキー(ON HELP GOSUB参照)
- リアルタイム・タイマ(ON TIME$ GOSUB参照)
- ファンクションキー(ON KEY GOSUB参照)
- RS-232C回線(ON COM GOSUB参照)
- サウンド(ON PLAY GOSUB参照)
- 電話機(CMD ON LINE GOSUB参照)
- 通信エラー(CMD ON ERROR GOSUB参照)
13. ラベル名
N88-BASIC(86)では,プログラムの分岐先やプログラムの編集時などに利用する行番号の代わりとして,"ラベル名"を用いることができます.
あるルーチンの始まりなどに意味のあるラベル名をつけておけば,いちいち行番号を覚えておかなくともよく,またRENUMで行番号のつけ替えを行ってもそのたびに新しい行番号を確かめる必要もなくなるため,プログラムの作成を非常に楽に行うことができます.後でプログラムの修正などを行うときにもたいへん有利です.
まず,ラベル名を使わないで, ふつうに行番号を分岐先として用いたプログラムを例として示します.
10 INPUT A 20 IF A<0 THEN 80 30 IF A>0 THEN 60 40 PRINT "zero" 50 GOTO 90 60 PRINT "plus" 70 GOTO 90 80 PRINT "minus" 90 END
これは, 10行で入力された値が正か負か0かを調べるプログラムです.ここで処理の流れを変える命令が20,30, 50, 70行で使われていて,その分岐先の指定はすべて行番号になっています.
これを,ラベル名を使って書き換えると次のようになります.
10 INPUT A 20 IF A<0 THEN *MINUS 30 IF A>0 THEN *PLUS 40 PRINT "zero" 50 GOTO *EXIT 60 *PLUS:PRINT "plus" 70 GOTO *EXIT 80 *MINUS:PRINT "minus" 90 *EXIT:END
プログラムが見やすくなり,処理の内容もよくわかるようになりました.
このように,ラベル名とは,分岐先の目印として自由につけることのできるものです.
ラベル名の使用については,次の注意を守らなければなりません.
- ラベル名の頭には必ずアスタリスク(*)をつけなければなりません.
- 先頭のアスタリスクを除いて,ラベル名は必ず1バイト系の英文字で始まらなければなりません.
- ラベル名に使用できる文字は,先頭のアスタリスクを除いて1バイト系英文字と数字とピリオド(.)であり,大文字と小文字の区別はありません.
- 予約語をラベルとして使用することはできません.ただし,中に含む場合はかまいません.
- ラベル名の長さは,プログラムの1行の範囲(255バイト以内)によってのみ制限を受けます.
- 参照されるラベル名(呼ばれる方のラベル名)は,必ず行の最初になければなりません.
- 1行中でラベル名の後に続けて命令を記述し,マルチステートメントとするときは,コロン(: )またはスペースによって区切ります.
以上のような制限を無視すると"Syntax error" となります.
その他参照されるラベル名に同じものがあった場合,二重定義されているという意味の"Duplicate label"エラーが生じます.これらのエラーの検出は,"RUN"したとき,プログラムの実行に先だって行われますから,ラベル名のエラーがあるとプログラムを1行も実行することができません.
また,この場合のエラーメッセージはエラー箇所を示す〈行番号〉はともないません.
ラベル名は,プログラム中で分岐の目印として使用できるほか, LIST, DELETEなど〈行番号〉を対象とする命令のパラメータにも使用することが可能です.
例) LlST *START-*LAST DELETE *LOOP1-*EXIT1
14. エラーメッセージ
N88-BASIC(86)は,プログラムの実行を中断させなければならないようなエラーを実行時に検出したとき,エラーメッセージを画面に出力し,コマンドレベルにもどります.
ダイレクトモードの場合,エラーメッセージは次のような形式で出力されます.
XXXX・・・
プログラムモードの場合は次のように出力されます.
xxxx・・・in yyyy
xxxx・・・はエラーメッセージで, yyyyはエラーが検出された行番号です.この行はあくまでも, BASICがエラーを検出した行であり,真のエラーの原因は他の行にある場合がありますのでご注意ください.
エラーメッセージの内容とその対策については, 「付録A.エラーメッセージとその対策」を参照してください.