ScriptBasic講座
[繰り返しだ!]

BASICは勉強したから繰り返しなんてわかっているという方は次へお進みください。
ただ、BASICでよく使うFOR命令のほかにWHILEの説明があります。

1.繰り返しは6つ
FOR
WHILE
DO WHILE
REPEAT
DO UNTILE

ScriptBasicで使える繰り返しはこんなものです。全て覚える必要はありません。ここではFORとWHILEを説明します。
FORとWHILEを覚えてしまえば代用できますので、他の命令は原則必要ありません。




2.BASICの基本 FOR命令
-roop1.bas-
#!/usr/bin/scriba

print "Content-Type: text/html; charset=euc-jp\n\n"
print "<html><body>"

FOR A=1 TO 3
print A
NEXT

print "</body></html>"

▼実行結果
123

なぜ123と表示されたのでしょうか?
まずFORの次にある、A=1で、変数Aに1が代入されます。
TO 3はAが3になるまでという意味です。これはAが3になるまでNEXTまでの文(print A)を繰り返し実行せよという意味です。

print A でAの内容を表示します。先ほどAに1を代入したので、1を表示します。

次のNEXTでAが一つ増えます。これではAは2になりました。3まで実行するのでまだ繰り返します。
今度はAは2ですのでprint Aで2を表示します。NEXTでAがまた一つ増えて3になります。
3まで実行なので今回が最後の実行です。print Aで3が表示されます。NEXTでAは4になりますが、
3まで実行なのでこれで繰り返しを抜けます。

もっとよく理解する為にTO 3の部分を4や5に変更してみてください。
この変は複雑なところです。第三章以降で実践していれば自然と身につくと思います。
あまり必死にならず気楽にがんばりましょう。






3.BASICの基本その2、STEP
先ほどのFOR NEXTのNEXTでは1つ増えただけでした。
では二つずつ増やしたい場合はどうするのでしょう。二つずつ増やすことで偶数なら偶数のみ、奇数なら奇数のみの表示が可能です

-roop2.bas-
#!/usr/bin/scriba

print "Content-Type: text/html; charset=euc-jp\n\n"
print "<html><body>"

FOR A=1 TO 10 STEP 2
print A
NEXT


print "</body></html>"

▼実行結果
13579

ちなみにSTEP -1という書き方も出来ます。
これは1ずつ減らしていくという意味です。

-roop2.bas-
#!/usr/bin/scriba

print "Content-Type: text/html; charset=euc-jp\n\n"
print "<html><body>"

FOR A=9 TO 1 STEP -1
print A
NEXT

print "</body></html>"

▼実行結果
987654321

STEPを書かなければ123456789と表示される筈ですから、これで逆に表示できました。





4.FOR命令の書き方
FOR 変数名=初期値 TO 終了値 [STEP 増分]

ここに書かれているものを繰り返し実行

NEXT





4.WHILEの方がよく使うかも
BASIC言語ではFOR命令をよく使うかもしれませんが、CGIではWHILEの方をよく使うかもしれません。
WHILEの方が覚えるのは簡単だと思います。

while 条件式

条件が真(TRUE)の時、ここに書かれているものを繰り返し実行

wend


つまり真の間繰り返すってことです。

-roop3.bas-
#!/usr/bin/scriba

print "Content-Type: text/html; charset=euc-jp\n\n"
print "<html><body>"

A=1

while A<10
print A
A=A+1
wend

print "</body></html>"

▼実行結果
123456789

Aは1です。whileの条件式が評価されます。Aは1なので10より小さい、つまり真(TRUE)となります。
print Aが実行され、変数Aを表示します。次の行でA+1して、もう一度条件チェックです。
条件が満たす間はこの作業を何回も繰り返します。偽になった時点で繰り返し終了です。




5.九九表を作ってみよう!
いきなりですが九九表をFOR命令で作ってみましょう。


-roop4.bas-
#!/usr/bin/scriba

print "Content-Type: text/html; charset=euc-jp\n\n"
print "<html><body><table border=\"1\">"

FOR A=1 TO 9
        print "<TR>"
        FOR B=1 TO 9
        print "<TD>",A*B,"</TD>"
        NEXT
        
        print "</TR>"
NEXT

print "</table></body></html>"

▼実行結果
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81



とてもシンプルな九九表です。こんなもん作って何になるんだぁ!と聞かれたら悩んでしまいます。
でも一応、プログラムの解説です。

4行目で<table>タグの指定をしています。<table>タグは表を制作する為のタグです。
▼HTML説明:TABLEタグ
<table>タグは表を制作する為のタグです。ScriptBasic同様HTMLも大文字・小文字は問いません
<TABLE border="1"><TR>
<TD>内容<TD>
</TR></TABLE>

これで表が作れます。borderは外枠の太さ(ピクセル単位)です。
例えば、以下の表を作るには
<table border="1">
<tr>
<td>1</td>
<td>2</td>
</tr><tr>
<td>3</td>
<td>4</td>
</tr>
</table>


<TR></TR>で列を作る、<TD></TD>で行を作ると考えればわかりやすくなります。
4行目の<table border=\"1\">で表を作成しようとしています。print ""の中ではそのままでは"(ダブルクウォテーション)
は使えないので\を前に書いてあることに注目してください。\を付け忘れるとInternal Server Errorとなってしまいます

5行目は空行で6行目でFOR命令を書いています。
1から9までが繰り返されます。

その中にまた、FOR命令があるので少しややこしいですが、こちらもまた1〜9までを繰り返す命令です。
そして、そのお互いの変数、AとBを掛け算して、表示しています。

1:<table border="1">タグの表示
2:FOR命令にやってきました。Aに1が代入、9回繰り返しです
 3:<TR>タグで新しい行を作ります。
 4:Aは現在1です。内側のFOR命令に来ました。Bに1が代入され、こちらを9回繰り返します
  5:<TD>タグで列を作ります。
  6:A*Bを計算し、その計算結果を表示します。
  7:表示終了です。</TD>でこの列が終了です。
 8:NEXTに到達しましたのでBを2にします。まだ9ではないのでもう一度繰り返します
  9:<TD>タグで列を作ります。
  10:A*Bを計算し、その計算結果を表示します。
  11:表示終了です。</TD>でこの列が終了です。
 9:NEXTに到達しましたのでBを3にします。まだ9ではないのでもう一度繰り返します
    このままB=10になるまで繰り返します。この段階で1行が完成しました。
 10:NEXTに到達しましたので、Bが10になりました。繰り返しを抜けます。
11:<TR>タグが表示されます。
12:NEXTに到達しましたので、Aが2になりました。まだ9ではないので繰り返します。

こんな感じで繰り返し、最後にループを抜け、</TABLE>で表の完成です。
一度にぱっと表を作るのではなく、右から左、左がいっぱいになったら新たな行を作成し下に続いていく感じです。


繰り返しは少しややこしいです。
一度で完全にマスターするのは不可能でしょう。ある程度考えたら次に進みましょう。
後でだんだんわかってくると思います。


注:WHILEで二重ループは出来ないようです。なぜか一つ目のWENDでループを抜けてしまいます。






6.無限ループにご注意
WHILEではFOR命令と違い条件文を自分で決定しなければなりません。
例えば以下のプログラムを見てください。

-roop6.bas-
#!/usr/bin/scriba

print "Content-Type: text/html; charset=euc-jp\n\n"
print "<html><body>"

A=1

WHILE A<=9
        print "+"
A=A+1
WEND

print "</body></html>"

▼実行結果
123456789

では、A=A+1という部分を削除したらどうなるでしょうか?
いつまでたってもAの中身(値)は変わらずAは1のままです。A<=9が偽になることはありません。
こういう状態を無限ループといいます。ひたすら実行します。十分注意してください。
最悪の場合、パソコンがフリーズしてしまいます

FOR命令は書き忘れても勝手に+1してくれますので、無限ループにはまる心配はありません。

戻る

ウメ研究所