否定を表すNOTは,否定対象の直前に書きます。AND,OR,NOTが混じった条件を書いたときには,NOTが最も優先します。ANDとORとではANDが優先します。優先順位を変更したいときは括弧を用いることができます。書きますが,BASICではこういう書き方はできません。ピタゴラス数x2+y2=z2となる3整数x,y,zをピタゴラス数といいます。整数となるときのx,y,zを出力するようなプログラムを作ればいいでしょう。zが整数であるかどうかは,INT(z)がzと一致するかどうか調べればわかります。次のプログラムは,1≦x≦y≦100の範囲でピタゴラス数を探します。上のプログラムは,N88-BASICのような古いタイプのBASICでも動作するでしょう。正しい結果は得られないかも知れません。BASICでは,べき乗や平方根などの計算で,真の値が有効数字の桁数以下の十進数で表現できる場合には真の値が得られることになっているので,上のプログラムで正しい結果が得られます。DO〜LOOPDO文とLOOP文は対にして用いられ,繰り返しの処理を記述するのに用いられます。ENDDO〜LOOPの構文を書くと,DO文とLOOPの間に書かれた文が繰り返し実行されます。上の例では30行と40行が繰り返し実行されます。クリックするか,実行メニューから中断を選んで実行を打ち切ってください。WHILE〜LOOP条件が成立する間,繰り返しを実行する構文です。END例29の20行を修正して上のようにすると,Aの値が100になると繰り返しをやめるようになります。LOOPは次の形式で書きます。この構文の動作を流れ図で表すと図のようになります。条件LOOPこの構文では繰り返すべき処理を実行する前に条件を調べますから,最初から条件が成立しない場合には,1回も繰り返しを実行しません。A<0に変えると30行,40行は1回も実行されません。LOOPは,繰り返しを終了する条件を指定して繰り返しを実行させる構文です。END例31は例30とまったく同じ意味です。LOOPは相互に書き換えが可能です。どちらを用いるかは,プログラムを書く人がどちらを向いて思考しているかの相違によります。素因数分解DO〜LOOPを利用して入力された自然数を素因数分解するプログラムを作ることができます。変数nに分解すべき自然数を入力するものとします。最初にnが2で割れるかどうか調べ,割れるときは2を出力してnを2で割ったもので置き換えます。これをnが2で割り切れる間,繰り返し実行します。nが2で割れなくなったら割る数を3にして同様のことを繰り返します。次は割る数を5にして同様のことを繰り返せばよいのですが,「次の素数」をコンピュータに答えさせるのは難しいので,割る数は単に1を加算していくだけにします。すると,割る数3の次は割る数4になるのですが,それでも不都合はありません。いうと,すでに2で割れるだけ割ってあるからです。END変数fは割る数(因数,factor)を表します。120行で最初の割る数2をセットしています。140行から170行までの繰り返しでfで割れる間,割ります。割れなくなると(180行),fは1加算されます。これを130行のDO文と190行のLOOP文とで繰り返すのですが,いつか繰り返しを止めなければなりません。その条件は,nからすべての因数を取り尽くしたときですから,n=1になります。それが,130行に書かれた条件です。DO文は,DO〜LOOPの繰り返しを終了してLOOP文の次の行に制御を移す命令です。LOOPは繰り返しの中身を実行する前にそれを実行すべきかどうか判断します。その位置では繰り返しを継続すべきかどうかの判断ができない場合があります。次のプログラムは,正しい答えを入力するまで繰り返し入力を要求します。この場合,入力してからでないと正しいかどうかの判断のしようがありません。END例33の処理の流れを図に表すと次のようになります。正の整数nを入力するとnを2進法で表示するプログラムを作ります。=11とすると11=1×23+0×22+1×2+1ですから,11を2進法で表すと1011です。これを下位の桁から順に求めたいときは,次のようにします。・・・10整数aを整数bで割ったときの商をINT(a/b),余りをMOD(a,b)で求められるので,次のプログラムが得られます。ユークリッドの互除法2つの正の整数a,bに対して,a,bの最大公約数をgcd(a,b)で表すことにすると,次の性質が成り立ちます。gcd(b,r)この性質を繰り返し利用し,次のようにすると,2つの整数の最大公約数を求めることができます。これをユークリッドの互除法といいます。aをbで割り,余りをrとする。r=0であれば,bが最大公約数である。r>0であれば,b,rを新たなa,bとしてこの操作を再度実行する。この操作は,繰り返しのたびにbの値が小さくなっていくので,何回かの繰り返しの後,必ず終了します。END繰り返し処理の最後のところで,b,rの値を次のa,bの値とするために50行,60行に示すような順に代入文を用いることに注意してください。A(10)と書くと,A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9),A(10)の計10個の変数が用意されます。A(1),A(2),A(3),...,A(10)は,それぞれ,普通の変数として使えます。このとき,この10個の変数をまとめて配列といって,個々の変数は添字付き変数といいます。括弧内を添字(そえじ)といいます。ENDDIM文では,配列名と添字の上限を上のような形に書きます。配列名の付け方は普通の変数と同じです。添字の上限には10,20のような定数のみを書くことができます。基本BASICから変更されています。配列の添字が1から始まることに注意してください。添字付き変数では,添字に変数を含む式を書くことができます。ENDこの機能を利用すると,処理の対象となる変数をプログラムのなかで選ぶことが可能になります。BASICでは,B1,B2,B3のような変数名を使うこともできます。B3のうちのいずれかを選ぶことはできません。...)で定義される数列です。配列を利用してフィボナッチ数列のはじめの20項を求めるプログラムを書くと,次のようになります。分布表を作る配列は分布表を作るのに利用できます。ここでは,例として100点満点の試験の結果を10点刻みで分布を調べるプログラムを作成します。m(0)からm(10)までの11個の添字付き変数を用意し,0点から9点までの人数をm(0),10点から19点までの人数をm(1),20点から29点までの人数をm(2),...,で表すことにします。10)のようなDIM文をプログラムのはじめに書きます。m=ZERを実行し,配列mの全要素に0(zero)を代入しておきます。数値を入力すると,どのランクに属するかを表す指標iを計算し,その指標が示す添字付き変数に1を加算します。すべての数値が入力されたら,負の数を入力することにします。MATは,matrix(行列)のはじめの3文字をとったもので,行列演算命令の意味です。ZERはzeroのはじめの3文字です。10個のさいころを振るときの目の数の和を求めるシミュレーションを10000回繰り返し,その結果を集計してヒストグラムに表示するプログラム。END目の数の和は10以上60以下になるので,添字の範囲を10から60までにした配列Aを用意し,度数分布を求めています。エラトステネスのふるい整数の集合から合成数を順序よく取り除き,素数のみを残す方法で素数の集合を得ることができます。この手法は「エラトステネスのふるい」として古くから知られたものです。印をつけると,最後に残るのは素数です。2から1000までの添字のついた配列sを用意し,添字付き変数s(n)で整数nを表します。整数nに印がついていることをs(n)=1,印がついていないことをs(n)=0で表現します。ENDnより小さいすべてのk(ただし2以上)について,kの倍数すべてに印をつける処理が終わっていれば,nに印がないことからnは素数であるという判断が下せます。この性質を利用して手順を合理化し,120〜190行のFOR〜NEXTループですべてを処理しています。150〜170行のFOR〜NEXTでnの倍数に印をつけています。kの値をn2から順にnずつ増加させていくのではkの値が1000にならないことがありますが,FOR〜NEXT構文の性質からkの値が1000を超えたとき繰り返しを終了するのでこれで問題なく動作します。配列には2次元,3次元のものも使えます。書くと,A(1,1),A(1,2),A(1,3),A(2,1),A(2,2),A(2,3)の6個の添字付き変数が用意されます。DIM文では,複数の配列をまとめて宣言することができます。その場合,各配列宣言はコンマで区切って書きます。A(4),B(10),C(20)のように書きます。BASICでは,配列の添字は1から始まるものと考えています。すると,すべての配列で添字の下限が0になります。END添字の下限を1または0以外の値にしたい場合や,配列ごとに異なる値にしたい場合には次の例に示すような構文を用いることもできます。3)この配列宣言でA(-4)からA(5)までの10個の添字付き変数と,B(0,1)からB(2,3)までの9の添字付き変数が用意されます。2項係数(パスカルの三角形)2次元配列を利用してパスカルの三角形,すなわち,組合せの数nCrの表を作ってみましょう。nCrは,次の漸化式を用いて計算することができます。MAT文BASICは配列を処理するための便利な機能を用意しています。PRINT文を用いると配列入出力が簡単になります。INPUT文は,配列に数値をまとめて入力します。INPUT文の実行時には5個の数値をコンマで区切って入力してください。PRINT文は,配列に属するすべての添字付き変数の値をまとめて出力します。A;のように配列名に続けてセミコロンを書いておくと,数値が詰めて出力されます。READ文はDATA文から配列に数値を代入します。DATA文には必要な個数だけの数値をコンマで区切って書いておきます。テスト段階のプログラムなどで毎回同じデータを入力したいとき便利です。整列(選択ソート)10個の数値を入力すると大きさの順に並べ替えて出力するプログラムを作ります。10個の数値はa(1)からa(10)までの10個の添字付き変数に入力するものとします。a(1)からa(10)までの数値のうちで最小のものをa(1)と交換します。すると,a(1)が一番小さい数になります。次に,a(2)からa(10)までのうちで最小のものをa(2)と交換します。すると,a(2)に2番目に小さい数が入ります。iを実行すれば,配列aには数値が小さい順に並べ替えられて入ることになります。END130〜160行はa(i)〜a(10)の最小値の番号を変数kに取得する処理です。170〜190行ではtを作業用の変数として利用してa(i)の値とa(k)の値とを交換しています。プログラムの実行には影響しません。プログラムの意味を説明したいときなどに利用します。PRINT文を適当な位置に移してみるとよいでしょう。挿入ソート再帰的な発想法を用いると,少し異なった種類の整列アルゴリズムを作ることができます。a(1)〜a(i-1)がすでに大きさの順に並んでいるとしたら,a(i)をしかるべき位置に挿入して以後の数値を順に後ろにずらしてやればa(1)〜a(i)が大きさの順に並びます。そこで,i=2からi=10まで順に上に述べた処理を繰り返せば大きさの順に並ぶことになります。END130〜180行でa(i)の値を挿入すべき位置を探しています。そのとき,同時に各変数の値を後ろにずらしています。BASICのANDとORには特徴的な性質があります。qでは,pが偽であるとわかったときにはqの真偽を調べません。qでは,pが真であるとわかったときにはqの真偽を調べません。150行のAND演算では,j>1とa(j-1)>bを調べる順序が重要です。150行ではj=1になることがありますから,j>1よりも先にa(j-1)>bを調べると添字が範囲外となってエラーになってしまいます。実行時エラー(例外)PRINTをPLINTと綴ったり,FORに対応するNEXTがなかったりするとコンパイラはエラーを報告します。これは文法上の誤りです。計算すれば当然エラーになります。BASICには扱いうる最大の数が定められていて,計算結果の絶対値がその値(MAXNUM)を超える場合にもエラーになります(桁あふれ)。このように実行時に起こるエラーを特に例外と呼んで,文法上の誤りと区別します。ゼロ除算のエラーならばあらかじめ除数が0であるかどうか調べておけば防げますが,桁あふれのエラーを予測するのは実質的に不可能です。このような場合にはエラーが起きてから対処するしか方法がありません。EXCEPTION構文は,実行時エラー(例外)が発生したときの処理を記述する構文です。IN行とUSE行の間に書かれた文で例外が起こると,その文の実行を中断してUSE行の次の行に制御を移します。WHEN行の間に書かれた文は実行されません。この構文は関数のグラフを描く場合には不可欠なものといえます。LINESがないと,たとえば,2点(89,TAN(89)),(91,TAN(91))を結ぶ線分が描かれてしまいます。