コンピュータにさせることの有効性が高い処理の1つとして,「同じ作業や似た作業を複数回行わせる」ということがあります。今回は同じ作業を反復して行う方法を扱います。
まず,次のプログラムを見て下さい。
#prompt Print 1^2 Print 2^2 Print 3^2 Print 4^2 Print 5^2 Print 6^2 Print 7^2
実行結果は
1 4 9 16 25 36 49
となります。これは1から7までの整数の2乗を表示するものですが,これを1から10000までやれと言われても無理があるでしょう。このように1つずつ数値が変わるときに同じ処理を行うには,For 文が有効です。
次のプログラムは,やることは先程のプログラムと同じです。
#prompt Dim i As Double For i=1 To 7 Print i^2 Next
この For i=1 To 7 ・・・ Next というのは,以下のような処理を行います。
[1]まず,最初にこの行に処理が回ってきたとき,i に 1 を代入する(i=1)。
[2]i=1 の状態のまま Next まで処理を続ける。
[3]Next に到達したら,i の値を 1 増やす。この時点で i の値が 7 を上回っていたら,次のループは行わず Next の後へ(ループは終了)。まだ i が 7 以下であれば,もう一度 For の次の行へ戻って,増えた i の値で処理を行う。([2]へ戻る。)
※ループというのは,繰り返されて実行される部分(この場合は For 文と Next 文の間の1行)を指します。
このプログラムでは,
ループ | iの値 | 動作 | Next まで来た時の処理 | 1回目 | i=1 | 「1」と表示 | i=2(7 以下なのでループ続行) | 2回目 | i=2 | 「4」と表示 | i=3(7 以下なのでループ続行) | 3回目 | i=3 | 「9」と表示 | i=4(7 以下なのでループ続行) | 4回目 | i=4 | 「16」と表示 | i=5(7 以下なのでループ続行) | 5回目 | i=5 | 「25」と表示 | i=6(7 以下なのでループ続行) | 6回目 | i=6 | 「36」と表示 | i=7(7 以下なのでループ続行) | 7回目 | i=7 | 「49」と表示 | i=8(7 を超えたのでループ終了) |
のような反復処理が行われます。
プログラムがかなりすっきりしたというのも1つの違いですが,一番の違い簡単にループの回数を変えられることでしょう。
くれぐれもループのための変数(i)の宣言はお忘れなく。
問13 1から10までの整数について,その値の平方根を表示していくプログラムを作成せよ。
先程の For 文では,ループに用いる変数(先程の場合は i)を1ずつ増加させていましたが,増やし方は1以外にもできます。
#prompt Dim i As Integer For i=1 To 7 Step 2 Print i^2 Next
For文の後ろに Step が付いてます。これはいくつずつループ変数(ここでは i)の値が変化するかを表します。
この場合は2ずつ増えますから,実行したときの表示は
1 9 25 49
となります。1から始まって2ずつ増えているのですから,i の値が1・3・5・7のときの値を表示しています。
もちろん Step で指定する値はマイナスでも構いません。
#prompt Dim i As Integer For i=5 To -2 Step -1 Print i^2 Next
とすれば,i の値は5・4・3・2・1・0・−1・−2と変化していきますので,実行すると
25 16 9 4 1 0 1 4
となります。
問14 問13のプログラムの表示順序を逆にした(つまり,最初に10の平方根を表示し最後に1の平方根を表示する)プログラムを作成せよ。
さて,For は数値の増加に伴う変化しかできませんでしたが,より一般的に「ある条件のときにループを繰り返し,その条件が成り立たなくなったらループを抜ける」という方法が必要な場合もあります。
例えば,パスワードを入力してもらう際に
(1)正しいパスワードなら次へ進む。
(2)正しくないパスワードならもう一度入力してもらう。
といったときは,「入力されたパスワードが一致しない間は,『再度名前を入力してもらう』という作業のループを繰り返す」わけです。
このような場合は,While 〜 Wend 文を用います。
#prompt Dim password As String While password<>"sinryow" Input "パスワード>";password Wend Print "正しいパスワードが入力されました。"
While〜Wend の中の文(ここでは「Input "パスワード>";password」の部分)がループになります。
まず,最初の「While password<>"sinryow"」は,ループが繰り返され続ける条件です。password が "sinryow" でない間はずっとループを繰り返します。まず最初に「password<>"sinryow"」の条件が成り立っているかを調べますが,ここでは password は何もいじられていないので,文字列は空です。よって「password<>"sinryow"」の条件は必ず成り立ちません。
その後Wendまで動作を行い,その時点でもう一度「password<>"sinryow"」の条件が成り立っているかを調べます。そこで成り立っていればもう一度ループに入り,成り立っていなければWendの次の行に処理を移します。
実行例も挙げておきます。
パスワード<? Sinryow パスワード<? sinryoww パスワード<? sinryow 正しいパスワードが入力されました。
正しいパスワードが入力されるまで,パスワードを尋ね続けられます。
問15 パスワードを入力してもらい,次のように表示せよ。
(1)パスワードが「sinryow」なら,「Sinryowさん,こんにちは」と表示。
(2)パスワードが「activebasic」なら,「Discoversoftさん,こんにちは」と表示。
(3)それ以外のパスワードが入力されたら,パスワードはもう一度入力してもらう。
最後に,Whileに似てWhileよりちょっとだけ便利なループを紹介します。
次のプログラムは,上のものと同じ動作をします。
#prompt Dim password As String Do While password<>"sinryow" Input "パスワード>";password Loop Print "正しいパスワードが入力されました。"
これは Do 〜 Loop というループ命令です。これだけだと上のWhileと同じ機能しかありませんが,以下のような機能がさらについています。
(1)Whileの代わりにUntilを使える。
Whileで指定すると,条件が成り立っている間ループを繰り返しますが,Untilは逆に条件が成り立っていない間(条件が成り立つまで)ループを繰り返します。よって上のプログラムは以下のようにも書けます。
#prompt
Dim password As String
Do Until password="sinryow"
Input "パスワード>";password
Loop
Print "正しいパスワードが入力されました。"
「While password<>"sinryow"」が「Until password="sinryow"」に置き換わっています。
(2)WhileやUntilを後ろに置ける。
後ろに置くとは,以下のようなことです。
#prompt
Dim password As String
Do
Input "パスワード>";password
Loop While password<>"sinryow"
Print "正しいパスワードが入力されました。"
前に置く場合との違いは,前に置くと1回目のループを行う前にも条件(この場合は「password<>"sinryow"」)をチェックしますが,後ろに置くと最初に1回ループを行い,その後から条件のチェックを行います。
以下の例では,Whileを前に置くか後ろに置くかで結果が変わります。
#prompt Dim n As Long n=10 Do While n<10 n=n+1 Print n Loop
前置きなら,ループに入る前の最初の条件のチェックに引っかかり,ループには入れてくれません。しかしこれを後ろ置きにして
#prompt Dim n As Long n=10 Do n=n+1 Print n Loop While n<10
とすれば,ループの中は最低1回行われますから,「11」と表示されます。
多くの場合はWhileだけでも事足りますが,そうならない場合もあるので,この後ろ置きのWhile・Untilは頭の片隅に残しておいて下さい。
注:Do〜Loopで,条件を前と後ろの両方に置くことはできません。