プログラム中に文字列を記述する場合,その前後を" "でくくります。
" "でくくった文字列を文字列定数といいます。
文字列定数に"を含めるときは,"を重ねて""とします。
例 54
10 PRINT "Say ""Hello!""" 20 END
文字列を値としてもつ変数を文字列変数といいます。
BASICでは,文字列変数には,末尾に$(ドル記号)を持つ名前を用いる約束になっています。
文字列には,連結の演算が定義されています。文字列の連結を文字列と文字列の間に&を書いて表します。
例 55
10 LET s$="Brown" 20 LET s$="Mr. " & s$ 30 PRINT s$ 40 END
組込関数STR$(x)は数値xを文字列化します。数値の前後には空白を含めません。
次のプログラムは,入力された数値を2進法に変換し上位桁が左にくるように表示します。
例 56
10 INPUT n 20 LET s$ = "" 30 DO UNTIL n=0 40 LET r = MOD(n,2) 50 LET s$ = STR$(r) & s$ 60 LET n = (n-r)/2 70 LOOP 80 PRINT s$ 90 END
文字を1個も含まない文字列を空文字列といいます。空文字列は""で表されます。
上のプログラムは,最初,s$を空文字列としておき,入力された数値を2で割った余りを求めるたびに,それを文字列化し,s$の左に連結しています。
BASICにはプログラム中にデータを記述する文法が用意されています。
DATA文には,コンマで区切ってデータを記述します。
変数にデータを読み込む命令はREAD文です。READ文に複数の変数を書くこともできます。その場合,変数名はコンマで区切って書きます。変数には,DATA文に書かれた順に代入されていきます。
例 57
10 DATA 1,2,3,4,5,6,7,8,9,10 20 FOR i=1 TO 5 30 READ a,b 40 PRINT a,b 50 NEXT i 60 END
すべてのデータを1行に記述しきれないときは,複数行に分けて記述することができます。そのとき,行の末尾にコンマを書く必要はありません(書くと,文法誤りになります)。
たとえば,上の例のDATA文は,
10 DATA 1,2,3,4 12 DATA 5,6,7,8 14 DATA 9,10
のように3行に分けて書くこともできます。
上の例では,データは2個セットで5組あるので,FOR〜NEXTループを5回くり返してデータを読んでいますが,データ個数が変化したり,データ個数自体がいくつあるか分からないときは面倒です。
Full BASICには,不定個数のデータを読んで処理するための命令が用意されています。
READ文をDO〜LOOPの中で使うとき,READと変数名の間に IF MISSING THEN EXIT DO:を書くと,データがなくなったときにDO〜LOOPの繰り返しを抜けます。
次の例は,DATA文に書かれたデータの平均を計算するプログラムです。
例 58
100 DATA 34,71,85,80,58,49,52,13 110 LET n=0 120 LET t=0 130 DO 140 READ IF MISSING THEN EXIT DO: x 150 LET t=t+x 160 LET n=n+1 170 LOOP 180 PRINT t/n 190 END
RESTORE文は,READ文が再び先頭のデータから読むようにします。
次のプログラムは,各データについて,平均との差(偏差)を計算します。偏差の計算には平均があらかじめ計算されていることが必要なので,データを2回,読むことが必要です。
例 59
100 DATA 34,71,85,80,58,49,52,13 110 LET n=0 120 LET t=0 130 DO 140 READ IF MISSING THEN EXIT DO: x 150 LET t=t+x 160 LET n=n+1 170 LOOP 180 LET m=t/n 190 RESTORE 200 FOR i=1 TO n 210 READ x 220 PRINT x-m 230 NEXT i 240 END
BASICでは,テキストファイルに書かれたデータを読み込んで処理したり,結果をテキストファイルに出力したりすることができます。テキストファイルは,Windowsのメモ帳やワープロソフトなどで読み書きすることのできる最も単純な形式のファイルです。
ファイルを使うとき,ファイルを経路という仮想的な存在に割り当てます。経路には,正の整数で識別番号を付加します。通常,1や2などの若い番号から順に用いる習慣があります。
ファイルを経路に割り当てる命令はOPEN文です。OPEN文は,
OPEN #経路番号 : NAME ファイル名
の形式に書きます。経路番号は数値式で指定します。ファイル名は文字列式です。
ファイルの使用が終わったら,
CLOSE #経路番号
の形式のCLOSE文を実行します。
INPUT文の入力応答と同じ内容をテキストファイルに書いておくと,ファイルから連続的にデータを入力することができます。通常,INPUT文の1回の実行に対応する入力応答がテキストファイルでの1行に対応しますが,行末にコンマを書くことで,1回分の入力応答を複数行に分けて書くこともできます。
ファイルからの入力を行うとき,INPUT文は,経路番号を指定して,
INPUT #経路番号: 変数,変数,・・・,変数
の形に書きます。
たとえば,Aドライブに作成したDATA1.TXTという名称のファイルからデータを入力する場合は,次のようなプログラムを作成します。(ファイル名の指示の仕方はOSにより異なります。"A:\DATA1.TXT"はWindowsのファイル名です。ドライブ名の部分は,実際に利用可能なドライブに変更してください。)
例 60
10 OPEN #1: NAME "A:\DATA1.TXT" 20 FOR i=1 TO 4 30 INPUT #1:s$,n 40 PRINT s$,n 50 NEXT i 60 CLOSE #1 70 END
DATA1.TXTには,30行の入力に対応する文字列定数と数値定数をコンマで区切って書いたものを4行分,用意します。たとえば,
"Yamada", 78 "Nakano", 90 "Sakai", 100 "Okano", 76
なお,コンマの直後で改行して8行で書くこともできます。
IF MISSING THEN EXIT DO を書いたINPUT文をDO〜LOOPで用いると,データ件数が不定な入力に対応したプログラムが作れます。この場合,IF MISSING … は経路番号の後にコンマを打って続け,EXIT DOと変数名の区切りにはコロンを書くのが約束です。
例 61
10 OPEN #1: NAME "A:DATA1.TXT" 20 DO 30 INPUT #1, IF MISSING THEN EXIT DO: s$,n 40 PRINT s$,n 50 LOOP 60 CLOSE #1 70 END
ファイルに書き出す方法には,上書きと追記の2通りがあります。上書きは,もし,指定されたファイルに既存の内容があれば,それを消去して新たな内容で書き換える書き出し方です。追記は,既存のテキストの末尾に付け加える形で書き出します。
上書きで書き出すときは,OPEN文の実行直後にERASE文を実行します。なお,指定された名称のファイルが存在しなければ,新たに作成されますが,空のファイルに対してERASEを実行しても問題はありません。
例 62
10 OPEN #2:NAME "A:DATA2.TXT" 20 ERASE #2 30 FOR x=1 TO 10 40 PRINT #2: x,SQR(x) 50 NEXT x 60 CLOSE #2 70 END
テキストファイルへの書き出しは,通常の画面への出力と同じ形式で出力されます。つまり,テキスト出力のウィンドウの内容をファイルに保存したのと同じになります。項目間には空白が出力されるので,再びBASICで読み込むのには対応しませんが,区切り文字にスペースを指定すれば,Excelなどの表計算ソフトで読むことができます。
追記書き出しの場合は,20行を
20 SET #2: POINTER END
に変更します。
項目が2個以上あるデータをテキストファイルとして書き出すと再びBASICで読み込むことができませんが,内部形式を利用すれば,BASICで書き出したデータを再びBASICで読み込むことができます。内部形式は,OPEN文の末尾に ,RECTYPE INTERNALを付加し,出力にPRINT文の代わりWRITE文,入力にINPUT文の代わりにREAD文を用います。
(仮称)十進BASICの内部形式ファイルの実体は,コンマ区切りのテキストファイル(CSV)なので,表計算ソフトなどとの間のデータのやり取りに用いることができます。
例 63 内部形式での書き出し
10 OPEN #1:NAME "A:DATA2.CSV" ,RECTYPE INTERNAL 20 ERASE #1 30 FOR x=1 TO 10 40 WRITE #1: x,SQR(x) 50 NEXT x 60 CLOSE #1 70 END
例 64 内部形式ファイルの読み込み
10 OPEN #1: NAME "A:DATA2.CSV" ,RECTYPE INTERNAL 20 DO 30 READ #1, IF MISSING THEN EXIT DO: x,y 40 PRINT x,y 50 LOOP 60 CLOSE #1 70 END
なお,READ文,WRITE文を内部形式でないファイルで用いることもできますが,その場合の効果は,INPUT文,PRINT文と同じです。