3章 プログラム例とアルゴリズム
3.1 繰り返し(ループ)命令
BASICで繰り返しをするために、2種類の命令が用意されています。
つまり、FOR 〜 NEXTとWHILE 〜 WENDです。
FOR 〜 NEXTループ
- 書式
- FOR 変数名=初期値 TO 限界 [STEP 増分]
- …
- NEXT [変数名]
- 文例
- FOR I=1 TO 10 STEP 3
- PRINT I
- NEXT I
- 解説
- FORとNEXTの間に置かれた全命令をFOR文で指定した条件のもとで繰り返して実行します。変数名で指定する変数は整数型か単精度型のものにします。初期値から限界まで増分ずつ、変数の値は増えていきます。増分が省略されると増分は1となります。
- 初期値が限界より大きく、増分が正である場合と初期値が限界より小さく、増分が負である場合は、FOR〜NEXT間にある命令は実行されません。
WHILE 〜 WENDループ
- 書式
- WHILE 論理式
- …
- WEND
- 文例
- WHILE I<=10
- PRINT I:I=I+1
- WEND
- 解説
- WHILEとWENDの間に置かれた全命令をWHILE文で指定した論理式が成立している間だけ実行します。
- すなわち論理式が不成立になった時点でWHILE〜WEND間にある命令は実行されなくなります。
繰り返し文は入れ子構造にすることができます。すなわち、ループ命令の中にループ命令を埋め込むこと(前章の九九を表示するプログラムを参照してください)ができます。ただし、ループ命令は必ず、FORはNEXTと、WHILEはWENDと1組として使用しなければいけません。NEXT、WENDを省略することはできないのです。
3.2 条件分岐命令
ある一定の条件が満たされたときに、別の処理をさせる命令を条件分岐命令といいます。IF文を用いてこれをあらわします。
- 書式
- IF 条件 THEN 成立時の命令文 ELSE 非成立時の命令文
- 文例
- IF I>10 THEN PRINT I
- 解説
- 条件が成り立つとき、THENの後ろの命令文を実行します。
- 条件が成り立たないときは、ELSEの後ろの命令文を実行します。
- ELSEが省略されているとき、条件が成り立たなければ、次の行へ進みます。
- 文例では、Iが10より大きいとき、Iの値を表示します。
3.3 グラフィック画面の使用
N88BASICではグラフィック画面を使用してグラフなどを描くことができます。
グラフィック画面での座標系
グラフィック画面に図形を描く場合には、画面のどの位置に出力するかを指定するために、xy座標系を用います。つまり、ディスプレイの左上を(X,Y)=(0,0)、右下を(X,Y)=(640,400)と決めて座標を設定します。
グラフィック画面の消去
N88BASICではグラフィック画面とテキスト画面を重ねることが出来ます。テキスト画面を消去する命令はCLSでした。では、グラフィック画面を消去するにはどうしたらいいんでしょうか?答えは、CLS 2です。ちなみに両方を同時に消去するのは、CLS 3です。
カラーコード
N88BASICでは標準で8色(黒、青、赤、紫、緑、水色、黄、白)使用できます。それぞれの色を数字で表します。この数字をカラーコードといいます。
カラーコード | 色 |
0 | 黒 |
1 | 青 |
2 | 赤 |
3 | 紫 |
4 | 緑 |
5 | 水色 |
6 | 黄 |
7 | 白 |
線を引く
線を引く命令は
LINEです。
- 書式
- LINE(X1,Y1)-(X2,Y2)[,C][,B|BF]
- 解説
- (X1,Y1)を始点、(X2,Y2)を終点とする直線、または四角形を描く命令です。
- このとき、Cにカラーコードを指定すると、指定した色で線を引きます。省略された場合には、現在設定されているフォアグラウンドカラーを使用します。
- 例
- (20,35)から(42,85)まで直線を引きます。
LINE(20,35)-(42,85)
- (12,18)から(23,55)まで青色の直線を引きます。
LINE(12,18)-(23,55),1
- (42,15)から(32,22)まで四角形を描きます。
LINE(42,15)-(32,22),,B
- (63,19)から(88,21)まで赤色で塗りつぶした四角形を描きます。
LINE(63,19)-(88,21),2,BF
円を描く
円(と楕円)を描く命令は
CIRCLEです。
- 書式
- CIRCLE(X,Y),R[,C][,D1][,D2][,RA][,F]
- 解説
- 座標(X,Y)に半径Rの円を描きます。Cにカラーコードを指定できます。D1は開始角度、D2は終了角度で、これを指定すると円弧を描けます。D1、D2ともに-2π〜2πのラジアン値でなければなりません。RAには縦横比率を指定します。これを指定することで、楕円を描くことが出来ます。Fを指定すると円の中を塗りつぶします。
- 例
-
- (80,80)を中心とする、半径40、色が緑の円を描きます。
CIRCLE(80,80),40,4
- (25,30)を中心とする、半径30、色が紫で塗りつぶした円を描きます。
CIRCLE(25,30),30,3,,,F
塗りつぶす
塗りつぶしは
PAINT命令で指示します。
- 書式
- PAINT(X,Y),C1,C2
- 解説
- (X,Y)を中心に境界色C2で囲まれた領域を、指定された領域色C1で塗りつぶします。
- 例
- (50,110)を中心として水色の境界色で囲まれた領域を黄色で塗りつぶします。
PAINT(50,110),6,5
3.4 乱数の利用方法
乱数というのは
不規則に数が並んだ乱数列の一つの要素です。この不規則性はゲームに多用されます。たとえばさいころを振って出た目は一回一回異なります。この不規則性は乱数を用いて再現できます。
10 RANDOMIZE
20 I=RND(1)
30 I=INT(I*6)+1
40 PRINT I
10行では、乱数系列の初期化を行っています。RANDOMIZE命令を実行すると、乱数の系列番号の入力を求められます。この系列番号によって乱数の並びが異なるのです。系列番号は-32768以上32767以下の数値でなければいけません。RANDOMIZE命令に系列番号を直接指定することもできます。たとえば系列番号652で初期化する場合は、
RANDOMIZE 652
と入力します。
20行で実際に乱数を求めています。乱数は関数
RND()で求められます。引数には普通1を指定します。求めた乱数は
0以上1未満の小数です。
30行では、求めた乱数を
1以上6以下の整数にするため、関数
INT()を使っています。関数
INT()は引数に与えられた数値の
小数点以下を切り捨てます。この場合は、I*6ですから、
0以上6未満の整数が返されます。これを1以上6以下にするため、1を加えています。
- 補足
-
- RND()関数の返す値について
RND()関数によって与えられる乱数は本物のでたらめな数値列ではありません。乱数系列が同じ限り、常に同じ並びで数値を返しているのです。こういう乱数のことを疑似乱数といいます。
- RND()関数の引数について
RND()関数の引数には負の数・0・正の数を指定することでそれぞれ働きが異なっています。すなわち、負の数を指定すると、乱数系列を初期化します。0を指定すると、1つ前に発生した乱数を返します。正の数を指定すると、次に発生する乱数を返します。
3.5 関数の近似値を求める
関数の近似値を求めるには、テイラー展開、マクローリン展開、ニュートン近似などを用います。
3.6 ユークリッドの互除法
最大公約数を求めるのに、普通は筆算(のようなもの)で求めます。しかし、これは人間から見るととてもわかりやすいやり方ですが、いざコンピュータにやらせようと思うと、かなり難しいやり方なのです。
そこで、コンピュータ向き、つまり、
機械的に繰り返すだけで求められる方法というのがユークリッドの互除法です。
- m,nの最大公約数GCDを考えます。
- mがnと等しくない間、3.を繰り返します。
- m>nならばm=m-n
m<nならばn=n-m
- m=nとなったらm(=n)が求める最大公約数GCDです。
これはプログラムにすると、
10 INPUT A,B
20 M=A:N=B
30 WHILE M<>N
40 IF M>N THEN M=M-N ELSE N=N-M
50 WEND
60 PRINT "GCD : ";M
となります。
3.7 エラトステネスのふるい
2以上、N以下の素数を数え上げていく方法で、簡単に、しかも素早く行える方法です。
単純に素数を数え上げていくには、2からNまでの全ての整数について、それが素数であるか否かを判別すればいいので、すなわちプログラムとしては以下のようになります。
10 FOR J=2 TO N
20 FOR I=SQR(J) TO 2 STEP -1
30 IF (J MOD I)=0 THEN GOTO 50
40 NEXT
50 IF I=1 THEN PRINT J;" ";
60 NEXT
このプログラムより効率のいい、素数を数え上げる方法、それがエラトステネスのふるいです。
エラトステネスのふるいでの処理の手順は次の通りです。
- 2〜Nの数を全て列挙します。
- 列挙した数の中で最小のものを素数とします。
- 今求めた素数の倍数を全て列挙した数からはずします。
- この2.と3.の手順をNまで繰り返します。
これをプログラムにしてみると、
10 DIM P(N+1)
20 FOR I=2 TO N:P(I)=1:NEXT
30 LM=SQR(N)
40 FOR I=2 TO LM
50 IF P(I)=1 THEN FOR J=2*I TO N:IF (J MOD I)=0 THEN P(J)=0:NEXT
60 NEXT
70 FOR I=2 TO N:IF P(I)=1 THEN PRINT I;" ";
80 NEXT
となります。