パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
BASIC超基本1(30分でBASIC−−基本8語)(互換)
====================================================================================
・行番号、変数、代入
・Print / Locate / Width / Input / If then else / Goto / Inkey$
/For Next /
BASICの詳細については、お使いのBASICのマニュアルや、HELP,その他BASIC
の一般書籍でお調べいただくとして、まったくの初心者でもBASICで手っ取り早く簡単なプログラム
ができるように、超基本の8命令を厳選してまとめてみました。
なお、本ページで使うBASICはWINDOWS上のフリーソフトである、潮田氏による
N88互換BASIC for Winを念頭においてますが、他のBASICでもほぼ共通です。
====================================================================================
(1) 行番号
BASICプログラムは、先頭に行番号を記述します。行番号は1づつ増やしてもかまい
ませんが、たいていは10おきにつけます。(あとで、途中に追加しやすいようにという配慮)
実行時には、基本的に小さい行番号から実行されていきます。
(2) 変数と代入
変数は大きく分けて数値変数と文字変数があります。変数名の最後に$をつけると、
文字変数として扱われます。詳しくは「(3)変数の型」で説明します。
A=5 Aは数値変数で Aの値は5
Q$="5" Q$は文字変数でQ$は5という文字が入っている
上記の場合の =
は等号ではなく、代入をあらわしています。すなわち、
Aに5を代入するという意味です。(BASICの場合、等号としても = を使うので注意
等号としての使用は IF 文の個所を参照)
従って、A = A + 1というのは、(元の)Aに1加えた値を(新しい)Aに代入するということ
になります。
では
10 A=3
20 A=A+2
30 PRINT A , B
というプログラム(PRINT文は下を参照。画面への表示の命令)で、A、Bはそれぞれいくつ
でしょうか。Aは5ですね。さて、Bはどうでしょう。いちども、Bに数値が代入されていません。
N88互換BASIC for Win では一度も数値の代入されていない変数には、初期値として0が
設定されます。(BASICの種類によって取り扱いが違うが、だいたい0が設定される)
従って、この場合
5 0 |
と画面に表示されます。
このように大方のBASICにおいては、未定義(初期値を与えてない)変数をいきなり使っても、0を初期値
として与えてくれます。これはBASICのおおらかで、プログラムしやすい点ですが、反面ルーズとも言えます。
他の言語では、未定義の変数は全てエラーとしてペケにするものが多いです。
(3) 変数の型
(NECの本家の)N88Basicでは、変数の型として、文字方、整数型、単精度実数型、倍精度実数型があり、
それぞれ変数名の最後に以下の型宣言文字をつけることによって区別しています。
なお、型宣言文字を省略した場合は、"!"が付いているとみなし、単精度実数型になります。
! 単精度実数型 (省略された場合も)
# 倍精度実数型
% 整数型
$ 文字型
例えば、
A! 単精度実数型
I% 整数型
S$ 文字型
単に、Aと書くと単精度実数型と見なされます。
なお、型宣言命令(DEFINT, DEFSNGなど)を用いて一括指定を行うと、型宣言文字を省略した場合は、
型宣言命令によって宣言された型になります。
例えば、DEFINT A-C とすると、A-Cで始まる変数は整数型になります。ただし、型宣言文字のほうが
優先されるので、上記の宣言がされていてもC#とすると倍精度型の変数になります。
上記はN88Basicの場合の説明ですが、他のBasicおよびN88互換Basic for winでもほぼ同じです。
数値型の場合は、それぞれの型の精度(有効ケタ数)の問題があります。
昔のBASIC(N88Basic, F-Basicなど)では整数型は16bitで表わせる範囲内、つまり符号付では、
-32768 〜 32767 の範囲内しか表わすことが出来ませんでしたが、
N88互換Basic for Win95の場合は整数型の場合でも15ケタ程度の有効ケタ数(*)になるようです。
(*)内部的にはVB5で作成されているためと思われる。
数値型の精度の問題については、C言語のページですが「Unsigned型と浮動小数点型の内部構造」
というページをご参照下さい。
(4) 定数
固有の値(123などの数値や"abc"などの文字列)を定数といいます。
定数は、以下の通りに分類されます。
@ 文字列 "abc" などダブルクォーテーションで囲んだ文字列
A 数値
A-1 整数型 8進法形式 10進法形式 16進法形式
A-2 実数型 単精度実数 倍精度実数
N88Basicでは頭に&Oを付けると8進法形式の数値になります。 &O234
など
頭に&Hを付けると16進法形式になります。 &HDFF など。
7ケタ以下の実数、数値の最後に!を付けた数値やEを使った指数形式で書いた数値が単精度実数の数値になります。
356.123! 3.05E-04 など
8ケタ以上の実数、数値の最後に#を付けた数値やDを使った指数形式で書いた数値が倍精度実数になります。
3456.987# 1.23674D-11 など
上記はN88Basicの場合の説明ですが、他のBasicでもほぼ同じです。
なにはともあれ、画面に表示することが、一番の感心事ですよね。
PRINT 文で画面に表示します。
PRINT 式<数値>
(例) PRINT 4+5 PRINT 変数<数値変数、文字変数> (例) PRINT A PRINT "<文字列>" (例) PRINT "HELLO" もちろん、式、変数、文字列を組み合わせて、使うことができます。 その際、複数のデータの区切りとして , (コロン) ;(セミコロン)を使います (例)PRINT "金額"; A*100; "円" |
以下の2つのサンプルプログラムがどう表示されるか、実験してみて下さい。
10 A=5 20 PRINT A |
結果画面は下図のような感じ
5 |
10 PRINT
"HELLO" 20 PRINT "HELLO" 30 PRINT "HELLO","HELLO" '区切りがコロンです(コロンの場合空白が出力されます) 40 PRINT "HELLO";"HELLO" '区切りがセミコロンです (セミコロンでは、続けて文字が出力) |
結果画面は下図のような感じ
HELLO HELLO HELLO HELLO HELLOHELLO |
画面上の表示する座標を指定するのが LOCATE文です。
LOCATE x座標<数値、変数、式>, y座標<数値、変数、式> |
画面は 横*縦で、40*20, 40*25, 80*20, 80*25の4タイプがあり
これはWIDTH で指定します。 (例)WIDTH
80, 20
80*20の指定の時は、左上が(0,0)、 右下が(79,19)という座標になります。
(例)
(0,0)....................... .......(79,0) ......... ........... .....(79,19) |
SAMPLE-3は画面のど真ん中に Aという文字を表示します。
10 WIDTH 80,20 20 LOCATE 39,9 30 PRINT "A" |
これで、好きな位置に表示できるようになりました。
ユーザーに何か数値を入力させたい時に使うのがINPUTです。
INPUT ["<文字列>
" {,|;}]
変数 ,[変数]
変数はいくつでもOKです。 [ ]は省略可 { | }はどちらか選択 INPUT文が実行されると、(文字列)を表示して、キーボードからの入力待ちになります。 |
SAMPLE-4は身長と体重を入力させ、そのまま画面に再度表示するプログラムです。
10 INPUT"身長と体重を入れて下さい";H,W 20 PRINT"身長";H;"体重";W |
SAMPLE-5は半径を入力し、円の面積を出すプログラム
10 INPUT "半径";R 20 MENSEKI=R*R*3.14 30 PRINT "面積";MENSEKI |
論理式の条件判定をします。
IF 論理式 THEN 文
[ELSE 文 ] ELSEは省略可能 論理式を判定し、論理式が真なら THEN を実行 、 偽なら ELSEを 実行します。 |
SAMPLE-6は入力した歳により、出力文をかえます。
10 MYAGE=30 20 INPUT "あなたの歳を入れて下さい" ; YOUR 30 IF MYAGE>=YOUR THEN PRINT "私は同い歳か、年上" ELSE PRINT "私は年下" |
指定された行番号へジャンプさせます。
(例) GOTO 200
SAMPLE-7は永遠に、0から9までの数字を画面の真ん中に表示し続けます
10 WIDTH 80,20 20 X=0 30 LOCATE 39,9 40 PRINT X 50 X=X+1 60 IF X>9 THEN X=0 70 GOTO 30 |
INPUT文は、キーボードからの入力待ちとなり、リターンキーが押されるまで、そこで
プログラムは実行待機となりましたが、これではシューティングゲームはできません。
それに対しINKEY$はキー入力待ちをせず、その時押されているキーの文字を得ます。
もし何もキーが押されていなければ、INKEY$の値はヌルストリング(空文字)となります。
SAMPLE-7は永遠に止まらないプログラムとなっていますが、これでは困ります。
1
のキーが押されたら終了するようにしたのが、SAMPLE-8です。
10 WIDTH 80,20 20 X=0 30 LOCATE 39,9 40 PRINT X 50 X=X+1 60 IF X>9 THEN X=0 70 A$=INKEY$ 'ここで押されているキーを取得しA$に代入 80 IF A$="1" THEN GOTO 90 ELSE GOTO 30 'A$の判定 1なら 90へ 90 END |
ここまで、使えれば、簡単なプログラムならいろいろ組めるようになるはずです。
コンピューターに一番やらせたいのは、何といっても単純な繰り返し作業です。(生身の人間が一番やりたく
ないことです。)そのための命令が FOR........ NEXTです
FOR 変数=初期値<数値、変数>
TO 終値<数値、変数> 文 NEXT [変数] [ ]は省略可 変数が終値になるまでFOR
NEXTのループを繰り返します。 |
SAMPLE-9、SAMPLE-10はそれぞれ、1から入力された数までの総和(1+2+3+....)
を求めるプログラムです。SAMPLE-9はFOR NEXTを使わない場合です。
10 INPUT "総和の終値を入力"
; E 20 TOTAL=0 : X=1 30 TOTAL=TOTAL+X 40 X=X+1 50 IF X>E THEN GOTO 60 ELSE GOTO 30 60 PRINT TOTAL |
10 INPUT "総和の終値を入力"
; E 20 TOTAL=0 30 FOR X=1 TO E 40 TOTAL=TOTAL+X 50 NEXT X 60 PRINT TOTAL |
N88互換Basic for Windows95のプログラム画面
実行したところ
FOR ... NEXTにはその仕様をしっかり把握しておかないと、思いもかけない落とし穴にはまることが
あります。FORループの落とし穴もあわせて参照下さい。
以上の命令でBASICのプログラムは簡単なものならそこそこ、組めるはずです。
あとは、基本命令はGOSUB、 RETURN
(サブルーチンにとばして、戻る)
CLS(画面を消去する)とかぐらいでしょうか。
そこらへんは、BASIC超基本(10語でシューティングゲームを作る)を参考にして、
研究してみて下さい。