Lesson 8 - 同じ作業の反復

コンピュータにさせることの有効性が高い処理の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で,条件を前と後ろの両方に置くことはできません。

戻る