BASICプログラムの実行方法

PP Basicプログラムはテキストファイルにプログラムを書き込んで保存し、コマンドラインからbasコマンドで実行します。
例えば、PostPlot3D付属のチュートリアルプログラム「01_roop.bas」を実行するには、以下の手順を踏みます。

・「Macro〜Open Console」メニューでコンソールを開く
・cdコマンドまたはcddコマンドで「:Tutrial:PPBasic:basic」フォルダへ移動
・「bas 01_roop.bas」とタイプしてreturnキーを押すとプログラムが実行されます。
 (このとき、「bas 01」までタイプしてからtabキーを押すとファイル名補完機能により01_roop.basが選択されます。

他に、「Macro〜Run BASIC」メニューから直接ファイルを指定してプログラムを実行することもできます。
しかし、このときはカレントディレクトリがプログラムのあるディレクトリにはならないことに注意してください。


PP Basicの基本コマンド



変数
PP Basicで使用できる変数は

・数値型変数
・PICT型変数

の二種類です。数値型変数は数値を格納するために、PICT型変数はMacintoshの標準画像フォーマットであるPICTデータを格納するために使用できます。
PP Basicでは数値変数はすべて単精度実数として取り扱われます。また、 数値変数は最大2次元の配列変数として定義することが出来ます。配列の宣言にはdim文を使用します。PICT型変数の宣言にはpict文を使用します。

#-----------------------------数値型配列変数サンプルコード
i=3
dim a(3), b(i,i)
for i=1 to 3
a(i)=i
for j=1 to 3
b(i,j)=i^2+j^2
print " a,b -> ", a(i),b(i,j)
next j : next i
#-----------------------------PICT型変数サンプルコード
pict mypict
openPictFile("mypict.pict",mypict)
drawPict(mypict,100,100)

なお、openPictFileなどのPICTファイル読み込み関数はPICT以外にGIFおよびJPEGファイルを読み込むことが可能です。
Post Plot 3D ver 1.0では、PICT型変数を配列変数として定義することは出来ません。また、Post Plot 3D ver 1.0では文字列変数をサポートしていません。



四則演算及びその他の演算記号
使用可能な演算子は以下の通りです。
+:加算
-:減算
*:乗算
/:除算
^:べき乗

#-----------------------------サンプルコード
a=10+5
b=10-5
c=10*5
d=10/5
e=10^5
print a,b,c,d,e
#-----------------------------結果
15 5 50 2 100000



文字列表示:print文、print using

Post Plot 3Dコンソールへの文字列表示にはprint文を使用します。また、数値(変数)の書式付表示のために、print using文が使用できます。 print文では、行末に「;」を付けることで改行せずに連続表示することが出来ます。

#-----------------------------文字列表示サンプルコード
print "Hello, Post plot 3D!!"
a=1.4142
b=2.2360
print "a -> ",a," b -> ",b
print using "a -> #.## b -> #.##",a,b
print "改行";
print "しません"

#-----------------------------実行結果
Hello, Post plot 3D!!
a -> 1.4142 b -> 2.236
a -> 1.41 b -> 2.23
改行しません



制御文および判定文
fornext文、ifthenelse文、
goto文、gosubreturn


跳躍文
goto *label
goto文は*labelで示されるラベル文へ制御を移します。
ラベル名はPP Basicで文や関数名として予約されている文字列でなければ何でも使用できます。
goto文で指定するラベル文はプログラムのどこかにひとつ存在する必要があります。

#-----------------------------サンプルコード
print "チェックポイント1"
goto *jamp1
*jamp2
print "チェックポイント2"
end
*jamp1
print "チェックポイント3"
goto *jamp2


#-----------------------------結果
チェックポイント1
チェックポイント3
チェックポイント2




反復文
for i=i1 to i2 step istp
next i

for i=i1 to i2
next

for文とnext文で囲まれた行を、変数iがi1からi2に到達するまで繰り返し実行します。
iの増分はistpで指定できますが、stepを省略した場合は1になります。
iの増分は処理がnext文に到達したときに行われ、ここでiがi2に到達するとループを抜けます。

#-----------------------------サンプルコード1
for i=1 to 10
print using "i=##.#",i," sqrt(i)=#.####",sqrt(i)
next
#-----------------------------結果
i= 1.0 sqrt(i)=1.0000
i= 2.0 sqrt(i)=1.4142
i= 3.0 sqrt(i)=1.7320
i= 4.0 sqrt(i)=2.0000
i= 5.0 sqrt(i)=2.2360
i= 6.0 sqrt(i)=2.4494
i= 7.0 sqrt(i)=2.6457
i= 8.0 sqrt(i)=2.8284
i= 9.0 sqrt(i)=3.0000
i=10.0 sqrt(i)=3.1622


#-----------------------------サンプルコード2
for i=1 to 10 step 2
print using "i=##.#",i," sqrt(i)=#.####",sqrt(i)
next
#-----------------------------結果
i= 1.0 sqrt(i)=1.0000
i= 3.0 sqrt(i)=1.7320
i= 5.0 sqrt(i)=2.2360
i= 7.0 sqrt(i)=2.6457
i= 9.0 sqrt(i)=3.0000




跳躍文/復帰文
gosub *label
return

gosub文はgoto文と同様に*labelで指定したラベル文へ制御を移動しますが、復帰文(return文)によって元の位置(gosub文の次の行)へ制御を戻すことが出来ます。
これはプログラムのあちこちで同じ処理を実施したいときに、処理をサブルーチン化し、何度も同じ処理を記述することを避けるために使用されます。

#-----------------------------サンプルコード
print "チェックポイント1"
gosub *sub1
print "チェックポイント2"
gosub *sub1
print "チェックポイント3"
end

*sub1
print "サブルーチンです!!"
return
#-----------------------------結果
チェックポイント1
サブルーチンです!!
チェックポイント2
サブルーチンです!!
チェックポイント3



判定文
if 判定式 then 処理1
if 判定式 then 処理1 else 処理2
if 判定式 処理1

if文は判定式を評価し、それが成立していれば処理1を、成立していなければ処理2を実行します。
else以下を省略した場合には、判定式が成立していない場合には何も実行されません。
条件式には以下の記述を利用できます。

a=b :aとbが等しい
a>b :aがbより大きい
a<b :aがbより小さい
a>=b:aがb以上である
a<=b:aがb以下である
a<>b:aとbが一致しない

if文では変数同士の比較が可能ですが、PICT変数の比較はできません。


#-----------------------------サンプルコード
#---------------変数aとbの最大公約数を求める
a=221
b=289

if a>b goto *label
c=a:a=b:b=c

*label
c=mod(a,b)
if c=0 then goto *stopprog
a=b
b=c
goto *label

*stopprog
print "最大公約数=",b
end
#-----------------------------結果
最大公約数= 17






ファイル入出力文
openfor input as #
openfor output as #
input #
write #
close #

テキストファイルからの数値データの読み込み及び出力を行います。
ファイルを取り扱うには、まずopen文でファイルを開き、次にinput文またはwrite文でデータの入出力を行います。
ファイルは一度に複数開くことが可能で(最大19)、各ファイルはファイル番号で区別します。ファイル番号には19以下の数を指定しなければなりません。
write文でもprint文と同様に、行末に「;」を付けることで改行無しの文字列出力を行うことが出来ます。
input文では、スペース区切りテキストファイルのみ対応しています。

#-----------------------------ファイル入出力サンプルコード
open "inputTest.data" for input as #1
open "writeTest.data" for output as #2
dim x(2) ,y(2)
x(1)=10
x(2)=20
y(1)=30
input #1 b,c,d,e
input #1 f,g,h,i,j,k
close #1
write #2 "This is test."
write #2 "write ";
write #2 x(1),y(1)
write #2 "read check -> b,c,d,e,f : ",b,c,d,e,f
close #2




コンソールからの数値入力
input

input in1,in2,....
input "string",in1,in2,....

コンソールから数値データを読み込み、変数in1,in2,...に代入します。
#-----------------------------サンプルコード
print "変数a,bを入力してください。"
input a,b
print "a,b ",a,b
print " "
input "input x,y -> ",x,y
print "x,y ",x,y
print " "

		



プログラム内からのデータ読み込み
data文、read文、restore文

read in1,in2,...
data NUM,NUM,...
プログラムの中からデータを入力する場合、read/data文を使用します。
read文を使用すると、プログラムテスト中に同じデータを何度もコンソールから入力しなくて済むなどの利点があります。
また、restore文を使用するとデータを初めから読むことが出来ます。
#-----------------------------サンプルコード
dim x(10)
read a,b,c
print "a,b,c -> ",a,b,c
for i=1 to 10
   read x(i)
next

for i=1 to 10
   print "i,x(i) ->",i,x(i)
next

data 1.1,2.2,3.3
data 10,20,30,40,50
data 60,70,80,90,100


		
#-----------------------------結果
a,b,c ->  1.1 2.2 3.3
i,x(i) -> 1 10
i,x(i) -> 2 20
i,x(i) -> 3 30
i,x(i) -> 4 40
i,x(i) -> 5 50
i,x(i) -> 6 60
i,x(i) -> 7 70
i,x(i) -> 8 80
i,x(i) -> 9 90
i,x(i) -> 10 100