十進BASICまとめ
第I部. BASIC入門
1. 十進BASICの使用法,はじめてのBASIC
1.1. 十進BASICの使用法
1.1.1. 十進BASICのダウンロードとインストール
「(仮称)十進BASICのホームページ」http://hp.vector.co.jp/authors/VA008683/から必要なファイルをダウンロードする。最新版に随時更新されているので,不具合などがあればこのページでチェックすること。
- Windows PCにインストールする場合は,「Windows95/98/Me/NT4.0/2000/XP/Vista/7 インストーラ版」からインストーラをダウンロード,実行。
- Windows PCでUSBメモリから起動したい場合は,「Windows95/98/Me/NT4.0/2000/XP/Vista/7 アーカイブ版」からZIPファイルをダウンロード,USBメモリに保存,右クリック→すべて展開(Windows2000以前ではZIP展開用ソフトが必要)。
- Mac(Intel Macのみ)の場合は,「MAC (Intel)」のページの指示に従って,Mac用ZIPファイルをダウンロードして展開。USBメモリからの起動も可。ただし,日本語がうまく使えないので,注意が必要。
1.1.2. 十進BASICの起動
十進BASICをインストールしたフォルダを開く→実行ファイル(Windows版はBASIC.exe,Mac版はBASIC.app)をダブルクリックして起動。
1.1.3. 十進BASICの終了,プログラムの保存
メニュー→終了で終了。
1.1.3. 十進BASICのプログラムの作成・編集・保存
十進BASICを起動すると,エディタ画面が開く。エディタ画面にプログラムを記述して作成する。
オプション設定で「入力時に機能語を大文字に変換する」がチェックされていれば,命令語などの機能語が自動的に大文字に変換されるので,スペルチェックできてわかりやすい。
プログラムの保存の必要があれば,名前を付けて保存。ファイルの拡張子は.BAS。
メニュー→ファイル→開くで,作成済みのプログラムファイルを開いて編集・実行できる。
1.1.4. 十進BASICのプログラムの実行・中断
再生ボタンあるいはF9ボタン(Mac版はF8ボタン)を押すと,そのとき最前面に表示されているプログラムが実行される。
プログラムを実行中に一時停止ボタンを押すと,実行を中断することができる。
ステップ実行を利用すると,プログラムを1行1行確認しながら実行することもできる。
1.2. はじめてのBASIC
次のプログラムを入力して実行してみよう。実行結果画面に「Hello, BASIC.」と「こんにちは。」が表示されればOK。
10 PROGRAM Hello 20 REM はじめてのBASIC 30 PRINT "Hello, BASIC." 40 PRINT "こんにちは。" 50 END
1.3. BASICプログラムの基本
1.3.1. プログラムの基本構成
- 最初にPROGRAM文(省略化)
- 1行に1つの命令文 ただし複数行にわたる構文も有り
- 最後にEND文(必須)
- 各行に行番号をつけることができる(省略可) 十進BASICでは編集メニューから行番号の挿入・削除が可能
- 単語(機能語,プログラム名,変数名,数値等)は必ず空白で区切りを
区切り記号(演算子等)の前後には空白は不要
1.3.2. BASICプログラムで使える文字
- 半角文字
- 英字: A 〜 Z , a 〜 z
- 数字: 0 〜 9
- 空白:スペースキーで入力される空白
- 引用符: "
- 下線: _ (Shift+「ろ」)
- その他の記号: ! # $ % & ' ( ) * , / : ; < = > ? ^ これ以外の記号文字は使えない。
- 全角文字(漢字,特殊文字等)は,文字列の内容や,注釈にのみ使える。
(Mac OSではうまく入力できないことがあるので注意)
1.3.3. 名前付けのルール
- プログラムや変数,配列,関数などは名前(識別名)をつけて区別する。
- 基本は 英字名 = 英字で始まり英字・数字・下線からなる列。
下線以外の記号を混ぜることはできない。 英字の大小は区別されない。
命令語など意味の決まっている名前や機能語は使えない。
- プログラムや副プログラム,数値の変数・配列・関数の名前は 英字名 のみ。
例) a , x , abc , y0_1 , for1 , to10 , finding_nimo はOK; 11b , 2x3 , y*z , 0to , $zz , m:i-2 はNG。
- 文字列の変数・配列・関数の名前は 英字名 のあとに $ をつける。 x$ , ten$ など。
- 機能語は大文字に自動変換できるので,変数等の名前は小文字にしておくと,区別しやすくなる。
1.3.4. 基本的な/特殊な命令文
- PRINT文:変数や数式等の値,引用符で囲まれた文字列,を表示する。複数のものを並べて表示する場合は,コンマやセミコロンで区切る。 → 2.2節参照
- REM文:1行すべて注釈
行の先頭や途中に!を書くと,そこから行末まではすべて注釈
- WAIT DELAY文: WAIT DELAY sec と書くと,sec秒だけ休止してから,次の命令文の実行に移る。秒数secが無い場合は,Returnキーが押されるまで待機する。
区切り記号(演算子等)の前後には空白は不要
- 半角文字
- 英字: A 〜 Z , a 〜 z
- 数字: 0 〜 9
- 空白:スペースキーで入力される空白
- 引用符: "
- 下線: _ (Shift+「ろ」)
- その他の記号: ! # $ % & ' ( ) * , / : ; < = > ? ^ これ以外の記号文字は使えない。
- 全角文字(漢字,特殊文字等)は,文字列の内容や,注釈にのみ使える。
(Mac OSではうまく入力できないことがあるので注意)
1.3.3. 名前付けのルール
- プログラムや変数,配列,関数などは名前(識別名)をつけて区別する。
- 基本は 英字名 = 英字で始まり英字・数字・下線からなる列。
下線以外の記号を混ぜることはできない。 英字の大小は区別されない。
命令語など意味の決まっている名前や機能語は使えない。
- プログラムや副プログラム,数値の変数・配列・関数の名前は 英字名 のみ。
例) a , x , abc , y0_1 , for1 , to10 , finding_nimo はOK; 11b , 2x3 , y*z , 0to , $zz , m:i-2 はNG。
- 文字列の変数・配列・関数の名前は 英字名 のあとに $ をつける。 x$ , ten$ など。
- 機能語は大文字に自動変換できるので,変数等の名前は小文字にしておくと,区別しやすくなる。
1.3.4. 基本的な/特殊な命令文
- PRINT文:変数や数式等の値,引用符で囲まれた文字列,を表示する。複数のものを並べて表示する場合は,コンマやセミコロンで区切る。 → 2.2節参照
- REM文:1行すべて注釈
行の先頭や途中に!を書くと,そこから行末まではすべて注釈
- WAIT DELAY文: WAIT DELAY sec と書くと,sec秒だけ休止してから,次の命令文の実行に移る。秒数secが無い場合は,Returnキーが押されるまで待機する。
下線以外の記号を混ぜることはできない。 英字の大小は区別されない。
命令語など意味の決まっている名前や機能語は使えない。
例) a , x , abc , y0_1 , for1 , to10 , finding_nimo はOK; 11b , 2x3 , y*z , 0to , $zz , m:i-2 はNG。
- PRINT文:変数や数式等の値,引用符で囲まれた文字列,を表示する。複数のものを並べて表示する場合は,コンマやセミコロンで区切る。 → 2.2節参照
- REM文:1行すべて注釈
行の先頭や途中に!を書くと,そこから行末まではすべて注釈 - WAIT DELAY文: WAIT DELAY sec と書くと,sec秒だけ休止してから,次の命令文の実行に移る。秒数secが無い場合は,Returnキーが押されるまで待機する。
2. 数値のデータ型と演算,変数,組込み関数,数値の表示形式・内部表現と有効数字
2.1. 数値のデータ型と演算
十進BASICで扱える数値データは,十進15桁の実数。他のプログラミング言語でよくあるような整数型と実数型の区別は無い。
演算記号は,足し算 + ,引き算 - ,掛け算 * ,割り算 / ,ベキ乗 ^ ,括弧 ( ) が使える。
10 PRINT 2+3*4-5 20 PRINT (8-3)^2/9 30 END
2.2. 数値の変数
数値を保存するために変数を用いることができる。電卓のメモリ機能と同じ。変数名は英字名。あくまで値の保存であって,計算式を保持してくれる訳ではないので注意。
十進BASICでは,変数は初めて使われるとき,記憶領域が確保されて,値0がセットされる(十進BASICの特殊仕様)。他のプログラミング言語のような変数宣言は不要。
変数に値を代入するにはLET文を用いる。LET (変数名) = (式)
10 LET a=2 20 LET b=3 30 PRINT a 40 PRINT b 50 LET c=a*b 60 PRINT c 70 LET c=c*5 ! 右辺で今の値を使って計算して,新しい値として左辺へ代入 80 PRINT c 90 END
INPUT文を用いると,キーボード入力から変数に値を与えることができる。十進BASICではINPUT文を実行するときに入力用ウィンドウが開く。INPUT文に複数の変数があるときは,コンマ , で区切って複数の数値を一度に与える。
10 PRINT "2個の数値を入力してください。" 20 INPUT a,b 30 LET c=a*b 40 PRINT "その2数の積は" ; c ; "ですね。" 50 END
変数の値を表示するにもPRINT文を用いる。 PRINT文で複数の項目を並べて表示する場合は,項目をセミコロン ; あるいはコンマ , で区切って並べる。セミコロンの場合は間を詰めて,コンマの場合はタブ位置に合わせて,表示する。末尾にセミコロンやコンマを書くと,次のPRINT文の項目を同じ行に続けて表示する。
2.3. 数値の組込み関数
よく使われる数学関数などはあらかじめBASICで用意されている。 円周率PI,平方根SQR(x),絶対値ABS(x),三角関数COS(x), SIN(x), TAN(x),指数関数EXP(x),対数関数LOG(x),小数点以下切り捨てINT(x),xをyで割った余りMOD(x,y),など →一覧表(附録A)
三角関数などの角度の単位は,基本はラジアン(rad)だが,プログラムの始めに一度
OPTION ANGLE DEGREES
と書くと,単位を度(degree)に変更する。
10 OPTION ANGLE DEGREES 20 PRINT "60°のCOSの値=";COS(60) 30 PRINT "TANが1になる角度=";ATN(1) 40 END
擬似乱数RNDは,0以上1未満の数値を等しい確率でランダムに発生させる。プログラムの先頭にRANDOMIZE文を書いておくと,プログラムを実行するたびに異なる擬似乱数列を使うことができる。次の例はさいころを100回振って出た目を並べるプログラム(FOR〜NEXT構文については6節で)。
10 RANDOMIZE 20 FOR i=1 TO 100 30 PRINT INT(RND*6)+1; 40 NEXT i 50 END
<補足> RNDは,Mersenne Twister MT19937 (松本眞・西村拓士,1992年版) による,周期 219937-1 の長周期一様乱数を生成する。(十進BASICヘルプより)
2.4. 数値の表示形式
数値を画面に表示する際,絶対値の大きな数や小さな数では,指数表記が使われる。例えば,2.998×108 は 2.998E+08 , 0.625×10-3 は 0.625E-03 のように表示される。数値表示の中に文字 E が混ざっているときは注意。
PRINT USING文を使うと,有効数字とは無関係に,表示桁数の指定などができる。(省略) →白石和夫先生の JIS Full BASIC入門 2.7.5節
2.5. 数値の内部表現と有効数字
基本設定では内部でも十進表現で保存・演算される。15桁以内の整数値であれば正確に扱うことができる。実数の範囲では有効数字15桁。有効数字の誤差,つまり数xの直前あるいは直後の数との差はEPS(x)でわかる。
十進BASICで扱える,つまり内部表現可能な数は絶対値が MAXNUM=1E+99 以下の範囲のみ。演算結果が内部表現可能な数の範囲を超えると「数値演算の桁あふれ」というエラーになる。
オプション設定で内部表現を2進数に切り替えできる。有効数字は約16桁,表現可能な絶対値最大の数はMAXNUM=2^(1024)-1≒1.8E+308。
3. 配列・MAT文
3.1. 配列の定義と使い方
複数の変数にまとめて名前を付けたものを,配列という。配列の個々の要素は添字と呼ばれる番号をつけて区別する。個々の要素を添字付き変数とも呼ぶ。配列をタンス,個々の要素を引き出しに例えると分かりやすい。
配列は使う前にあらかじめ,変数や関数等でないことを明示するために,DIM文による配列宣言が必要。 DIM a(5) と書くと,a(1),a(2),a(3),a(4),a(5)の5個の添字付き変数が使えるようになる。 添字の下限を指定することもできて, DIM b(0 TO 10) と書くと,b(0)〜b(10)の11個の添字付き変数が使える。 |
|
添字の指定には変数を使うこともできる。 個々の添字付き変数は,普通の変数と同じように使うことができる。
10 DIM a(10) 20 LET a(1)=1 30 LET a(2)=a(1) 40 LET a(3)=a(1)+a(2) 50 LET a(4)=a(2)+a(3) 60 LET i=5 70 LET a(i)=a(i-2)+a(i-1) 80 PRINT a(1),a(i) 90 END
このプログラム例では,要素数10の配列を用意しておきながら,そのうち5番目までの要素しか使っていない。このように,実際に使う個数より多い要素を用意しても,全く問題ない。むしろ推奨。
添字を2個持つ配列も使うことができる。これを2次元配列と呼ぶ。引き出しが縦横に並ぶようなタンスを思い浮かべるとよい。
DIM文は
DIM x(4,3)
のように縦横に並ぶ要素数を書く。これでx(1,1),x(1,2),x(1,3),x(2,1),x(2,2),...,x(4,3)の12個の要素つまり添字付き変数が使えるようになる。
同様に3次元配列も使うことができる。FullBASICでは3次元まで。
3.2. MAT文
配列の要素をまとめて処理するための命令も用意されている。
10 DIM a(5) 20 MAT INPUT a ! 5個の添字付き変数にまとめてキーボード入力 30 MAT PRINT a ! 5個の添字付き変数の内容をまとめて並べて表示 40 END
30行目は
PRINT a(1),a(2),a(3),a(4),a(5)
と書いたのと同じ。ここで
MAT PRINT a;
と書くと,
PRINT a(1);a(2);a(3);a(4);a(5)
と同じになる。 ほかに,
MAT a=ZER ! すべての要素に0を代入 MAT b=k*CON ! すべての要素にkを代入 MAT b=a ! 要素ごとに代入 MAT c=a+b ! 要素ごとに足し算 MAT c=a-b ! 要素ごとに引き算 MAT c=x*a ! 要素ごとにx倍
4. 文字列の利用
4.1. 文字列のデータと変数と演算
引用符"で囲まれた部分は文字列データとして扱われる。例えば "A" "Hello" "こんにちは" など。あくまでもデータなので,変数名などと同じ並びであっても,変数とは無関係である。
文字列も,数値と同じく,変数を使うことができる。文字列変数の名前は英字名+$。例えば a$ , s$ など(str$ は組込み関数にあるので注意)。文字列変数は,やはり変数宣言などは不要で,初めて使われるときに生成され,空の文字列 "" が割り当てられる。
文字列変数へ文字列を割り当てるつまり代入するには,やはりLET文を用いる。 LET a$ = "Hello" など。
INPUT文を使ってキーボードから文字列を入力することもできる。 INPUT name$ など。
当然のようにPRINT文で変数の内容を表示することができる。 PRINT a$ など。
文字列データでほぼ唯一可能な演算は連結,つまり複数の文字列をつないで新たにひとつの文字列データを生成することである。例えば LET s$ = a$ & "Good" & "Bye" とすると,s$の内容は"HelloGoodBye" となる。
10 LET a$ = "Hello" 20 PRINT a$ 30 PRINT "Your name?" 40 INPUT name$ 50 PRINT a$ ; name$ 60 LET s$ = a$ & "Good" & "Bye" 70 PRINT s$ 80 END
4.2. 文字列の組込み関数
日付DATE$,時刻TIME$,数値xを文字列に変換するSTR$(x),などがある。 →一覧表(附録A)
第II部. 制御構造
5. 条件分岐:単純IF文・IF〜END IF構文,条件の書き方
5.1 単純IF文:1行に書けるとき
ある条件が成立する場合としない場合で,実行文を切り替えたいときは,IF文を使えばよい。特にその実行文がひとつの単純文だけのときは,この単純IF文が使える。 IF {条件} THEN {単純文1} ELSE {単純文2} 条件の成立がYesの場合は単純文1が,Noの場合は単純文2が実行される。 |
|
Noの場合に何も実行する必要がなければ,ELSE以下を省略できる。 IF {条件} THEN {単純文1} Yesの場合に何も実行する必要がない場合は,…条件を逆にすればよい。 |
|
単純IF文は,ひとつのYes/No分岐しか書けないし,実行文もひとつの単純文の場合に限られる。複数分岐や,複数の実行文がある場合は,次の構文を使わなければならない。
5.2 IF〜END IF構文:1行に書けないとき
各分岐で複数行の実行文,または3個以上あるいは多段の分岐が必要な場合は,上の単純IF文では書けないので,構文を使うことになる。
基本はYes/No分岐。 IF {条件1} THEN {ブロック1} ELSE {ブロック2} END IF 条件1の成立がYesの場合はブロック1が,Noの場合はブロック2が実行される。 |
|
各ブロックには複数の実行文を書くことができる。
BASICは,THENの直後で改行されているかどうかで,IF〜END IF構文か単純IF文かを判断する。
Noの場合に何も実行する必要がなければ,ELSEを省略できる。 IF {条件1} THEN {ブロック1} END IF Yesの場合に何も実行する必要がない場合は,…条件を逆にすればよい。 |
|
ELSEIF句を使ってYes/No分岐を重ねることによって,複数の場合分けができる。 IF {条件1} THEN {ブロック1} ELSEIF {条件2} THEN {ブロック2} : ELSEIF {条件(n-1)} THEN {ブロック(n-1)} ELSE {ブロックn} END IF |
|
この構文におけるYes/No分岐は,上から順に判断されることに注意が必要である。{条件1}〜{条件(i-1)}がすべてNoであって{条件i}がYesであるとき,{ブロックi}だけが実行される。最後の{ブロックn}は,{条件1}〜{条件(n-1)}がすべてNoである場合にのみ実行される。
さらに,IF〜END IF構文を入れ込むこともできる。例えば: IF {条件1} THEN {ブロック1-0} IF {条件1-1} THEN {ブロック1-1} ELSE {ブロック1-2} END IF {ブロック1-3} ELSE {ブロック2-0} IF {条件2-1} THEN {ブロック2-1} ELSE {ブロック2-2} END IF {ブロック2-3} END IF |
|
5.3 条件の書き方
条件(論理式)は比較演算と論理演算の組み合わせで書かれる。括弧 ( ) も使える。演算子はすべて二項演算子なので,例えば3項以上の比較をする場合は2つの2項比較をANDでつなぐ必要がある。
- 比較演算: 等しい = 等しくない <> 小さい < 大きい > 小さいか等しい <= 大きいか等しい >=
- 論理演算: かつ AND または OR 否定 NOT
例) y <> 100 a >= 0 AND a <= 100 (x < 0 OR x > 1) AND z <> 0
6. 繰返し(1) 単純繰返しと条件繰返し:DO〜LOOP構文・EXIT DO文
6.1 DO〜LOOP構文
同じ実行文を(変数の値は変わってもよい)繰返し実行する場合は,DO〜LOOP構文かFOR〜NEXT構文を用いればよい。
DO {ブロック} LOOP
ただし,このままでは繰返しを無限に続けて,終わることができない。条件分岐とEXIT DO文を使って強制的に繰返しを終える必要がある。
6.2 DO WHILE〜LOOP構文
DO WHILE {継続条件} {ブロック} LOOP 継続条件が成立する間,ブロック部分の実行を繰返す。つまり,継続条件が成立しなくなったときに,繰返しを終える。条件の確認は,ブロック部分の実行の直前に,つまり繰返しの先頭に戻ってきたときに行われる。 |
|
6.3 DO UNTIL〜LOOP構文
DO UNTIL {終了条件} {ブロック} LOOP 終了条件が成立しない間,ブロック部分の実行を繰返す。つまり,終了条件が成立したときに,繰返しを終える。UNTIL条件とWHILE条件はちょうど否定の関係にあることになる。条件の確認はやはり,ブロック部分の実行の直前,繰返しの先頭に戻ってきたときに行われる。 |
|
6.4 DO〜LOOP WHILE構文
DO {ブロック} LOOP WHILE {継続条件} DO WHILE〜LOOP構文とほぼ同じだが,継続条件の確認は,ブロック部分の実行の後に,つまり繰返しを終えてから行われる。そのため繰返しの一度目は,条件確認無しに必ず実行されることになる。 |
|
6.5 DO〜LOOP UNTIL構文
DO {ブロック} LOOP UNTIL {終了条件} こちらも,DO UNTIL〜LOOP構文とほぼ同じで,終了条件の確認は,ブロック部分の実行の後,繰返しを終えてから行われる。繰返しの一度目は必ず実行される。 |
|
6.6 繰返しの中断
EXIT DO
D0〜LOOP構文のブロックの途中で,繰返しを強制的に終える。条件分岐と組み合わせて使うことが多い。
7. 繰返し(2) 計数繰返し:FOR〜NEXT構文・EXIT FOR文
7.1 FOR〜NEXT構文
繰返しの継続/終了が条件判断でなく,変数の値の範囲などで決まるときは,FOR〜NEXT構文を使える。
FOR {制御変数}={初期値} TO {終値} STEP {変化量} {ブロック} NEXT {制御変数} この構文の流れは次のようになる。
また,この構文は次のように書いたものと同じ。 LET {制御変数}={初期値} DO WHILE {制御変数}<={終値} {ブロック} LET {制御変数}={制御変数}+{変化量} LOOP あるいは LET {制御変数}={初期値} DO UNTIL {制御変数}>{終値} {ブロック} LET {制御変数}={制御変数}+{変化量} LOOP あるいは LET {制御変数}={初期値} DO IF {制御変数}>{終値} THEN EXIT DO {ブロック} LET {制御変数}={制御変数}+{変化量} LOOP |
|
なお,「STEP {変化量}」が省略された場合は,「STEP 1」,つまり {変化量}=1 と指定されたものと見なされる。
7.2 繰返しの中断
EXIT FOR
制御変数による終了条件以外に,何らかの条件を満たした時に計数繰返しを終えるときなどに使える。
第III部. グラフィクス機能
8. グラフィクス
8.1 描画領域の設定
これらはプログラム冒頭で一度だけ実行すればよい。
- SET WINDOW x1,x2,y1,y2
- x座標をx1からx2に,y座標をy1からy2に設定
- DRAW grid
- グリッド(格子線)を表示(gridは外部絵定義で宣言されている)
8.2 図形の描画
- PLOT LINES: x1,y1; x2,y2
- (x1,y1)と(x2,y2)を結ぶ線分を描画する。
- PLOT LINES: x1,y1; x2,y2; ...
- 折れ線を描画。セミコロンで終わると,次のPLOT LINESに継続する。
- PLOT LINES
- 直前のPLOT LINES文から継続している折れ線描画を終了,つまりセミコロンを無効化する。「空のPLOT LINES文」と呼ぶこともある。
- PLOT POINTS: x,y
- 点を描画する。
- PLOT AREA: x1,y1; x2,y2; ...; xn,yn
- 多角形領域を塗りつぶす。
PLOT LINESと違って,セミコロンで終わるとエラーになる。 - PLOT TEXT, AT x,y: s$
- x,yを左下の基準点にして,文字列s$を描画する。数値を書きたい場合はSTR$関数を使って文字列に変換する必要がある。
- PAINT x,y
- 現在のLINE COLORで区切られた領域のうち点x,yが含まれるものを,現在のAREA COLORで塗りつぶす。
8.3 図形の特性の指定(変更)
描画文が実行されるときに,そのとき有効な色/スタイル/サイズが使われる。
8.3.1 図形の色の指定
- SET {LINE,POINT,AREA,TEXT} COLOR n
- nは色の番号。 →色見本(JPEG)
8.3.2 図形のスタイルの指定
- SET {LINE,POINT} STYLE n
- nは線や点の形の番号。 →形見本(JPEG)
8.3.3 線分の幅の指定
- SET LINE WIDTH n
- nは描画ウィンドウ上のドット数。座標形の単位でもないし,ポイント(pt)でもない。
8.3.4 テキストの文字サイズの指定
- SET TEXT HEIGHT n
- nは描画ウィンドウ上のドット数。座標形の単位でもないし,ポイント(pt)でもない。
第IV部. データ入出力(準備中)
第V部. プログラムの分割(準備中)