HSP3 プログラミングの基礎T
前へ 目次へ 次へ 

(4) 制御文(繰り返し)

 プログラムは基本的に、上から下に向かって実行される。実行する順序を変える(制御する)命令を制御文という。
 ここでは、同じ命令を繰り返し処理する繰り返しについて学習する。

repeat
 実行する命令 群
loop
repeat 繰り返す回数
 実行する命令 群
loop
repeat 繰り返す回数,cntの初期値
 実行する命令 群
loop
 繰り返す回数は数値や変数で指定する。
 何回目の繰り返しかを知るために、特別な変数(システム変数という)cntが用意されている。初期値を指定しなければcnt=0, 1, 2 ・・・と0から始まる。
 ※注意…繰り返す回数を省略または負数を指定すると無限ループになる。

 

サンプル「HSPプログラミング」と5回表示する。

    repeat 5
        mes "HSPプログラミング"
    loop
    stop

実行「HSPプログラミング」と5回表示される。

試してみよう5回繰り返して、「今、xx回目です。」と表示する。

    repeat 5
        mes "今、" + cnt + "回目です。"
    loop
    stop
実行
今、0回目です。
今、1回目です。
今、2回目です。
今、3回目です。
今、4回目です。

 実行結果のように変数cntは、0からカウントしていくようである。

試してみよう5回繰り返して、「今、xx回目です。」と表示する。ただし、1回目から表示するようにする。

    repeat 5
        mes "今、" + (cnt + 1) + "回目です。"
    loop
    stop
実行
今、1回目です。
今、2回目です。
今、3回目です。
今、4回目です。
今、5回目です。

試してみよう同じ処理をする。cntの初期値を設定する。

    repeat 5, 1
        mes "今、" + cnt + "回目です。"
    loop
    stop
実行
今、1回目です。
今、2回目です。
今、3回目です。
今、4回目です。
今、5回目です。

 繰り返し回数の後に、システム変数cntの初期値を設定することができる。

 

サンプル1から10までの整数の和を計算する。

    owari = 10
    wa = 0
    x = 1
    repeat owari
        wa = wa + x      ;和の計算
        x = x + 1        ;カウント
    loop
    mes "答えは、" + wa + " です。"
    stop

実行「答えは、55 です。」と表示される。

 wa = wa + x は、和(合計)を計算するときの基本的な計算式である。和を求めるための変数waと加算していくデータを持つ変数xでできている。
 同じように、x = x + 1は、カウント(数える)するときの基本的な計算式である。

 最初は、
 次の繰り返しでは、
 さらに次の繰り返しでは、
wa=0, x=1なので、wa=wa+xでwa=1となる。次のx=x+1でx=2となる。
wa=1, x=2なので、wa=wa+xでwa=3となる。次のx=x+1でx=3となる。
wa=3, x=3なので、wa=wa+xでwa=6となる。次のx=x+1でx=4となる。
 このように、1行ずつ命令を追いかけながら変数の変化などを調べていくことを「トレース」という。
 「変数=変数+データ」のように左辺(=の左)の変数にデータを加算するような場合、「+=」という演算子を使って、「変数+=データ」と書くことができる。同じように、「−=」、「*=」や「/=」などが使える。
 サンプルの和の計算とカウントは次のように書くことができる。
    wa += x  (wa = wa + x と同じ)
    x += 1   (x = x + 1 と同じ)
 さらに、1を加算(減算)するだけであれば次のように書くことができる。
    x+   (x = x + 1 と同じ)
    x-   (x = x - 1 と同じ)

試してみようシステム変数cntを使って、1から100までの整数の和を計算する。

    owari = 10
    wa = 0
    repeat owari, 1
        wa = wa + cnt
    loop
    mes "答えは、" + wa + " です。"
    stop

実行「答えは、55 です。」と表示される。

 

サンプル1から10までの整数の和を計算していき、和が20以上になったときの和と回数を表示する。

    owari = 10
    wa = 0
    repeat owari, 1
        wa = wa + cnt
        if wa >= 20 {
            mes "" + cnt + "までです。"
            mes "答えは、" + wa + " です。"
            stop
    }
    loop
    stop
実行
6までです。
答えは、21 です。

 求めるデータが計算できたとき、結果を表示して、stop命令で実行を中断している。この後も処理を続けるためには命令をstop命令の部分に書く必要がある。このように求めるデータが計算できたときなど、repeat〜loopの繰り返し範囲を途中で抜け出すために、break命令がある。

試してみようbreak命令を使って書く。

    owari = 10
    wa = 0
    repeat owari, 1
        wa = wa + cnt
        if wa >= 20 : break
    loop
    mes "" + cnt + "までです。"
    mes "答えは、" + wa + " です。"
    stop
実行
0までです。
答えは、21 です。

 回数が間違っている。
 repeat〜loopを抜け出すと、システム変数cntは0にリセットされるようである。

試してみようbreak命令を使って正しい結果が出るようにする。

    owari = 10
    wa = 0
    repeat owari, 1
        wa = wa + cnt
        if wa >= 20 : kai = cnt : break
    loop
    mes "" + kai + "までです。"
    mes "答えは、" + wa + " です。"
    stop

 

サンプル1から10までの整数のうち、奇数の和を計算する。途中の計算結果も表示する。

    owari = 10
    wa = 0
    repeat owari, 1
        if cnt \ 2 = 1 {
            wa = wa + cnt
            mes wa
        }
    loop
    mes "答えは、" + wa + " です。"
    stop
実行
1
4
9
16
25
答えは、25 です。

 奇数は、2で割り算したときの余りが常に1である。条件式の¥記号は剰余(余り)を計算する演算子である。

 repeat〜loopの繰り返しで、特定の行以降を実行しないで繰り返しを継続するために、continue命令がある。

試してみようcontinue命令を使って書く。

    owari = 10
    wa = 0
    repeat owari, 1
        if cnt \ 2 = 0 : continue
        wa = wa + cnt
        mes wa
    loop
    mes "答えは、" + wa + " です。"
    stop
実行
1
4
9
16
25
答えは、25 です。

 偶数は、2で割り算したときの余りが常に0である。偶数のとき、すなわち条件式が真のとき、continue命令によって以降のwa=wa+・・・とmes waの行を実行しないで、repeat命令に戻って繰り返しを続ける。

 

サンプルaからbまでの整数の和を計算する。a=10, b=20とする。(10+11+12+13+14+15+16+17+18+19+20)

    a = 10
    b = 20
    wa = 0
    kaisu = b - a + 1
    repeat kaisu
        wa += a    ;wa=wa+a
        a+
    loop
    mes "答えは、" + wa + " です。"
    stop
    a = 10
    b = 20
    wa = 0
    kaisu = b - a + 1
    repeat kaisu, a
        wa += cnt    ;wa=wa+cnt
    loop
    mes "答えは、" + wa + " です。"
    stop

実行「答えは、165 です。」と表示される。

 

サンプル二重ループでのシステム変数cntの値を調べる。

;cnt変数のテスト
    repeat 5    ;1つ目のループ(5回ループ)
        mes "1つ目=" + cnt
        repeat 3, 10    ;2つ目のループ(3回ループ)
            mes "\t2つ目=" + cnt
        loop
    loop
    stop
実行
1つ目=0
            2つ目=10
            2つ目=11
            2つ目=12
1つ目=1
            2つ目=10
            2つ目=11
            2つ目=12
1つ目=2
            2つ目=10
            2つ目=11
            2つ目=12
1つ目=3
            2つ目=10
            2つ目=11
            2つ目=12
1つ目=4
            2つ目=10
            2つ目=11
            2つ目=12


 サンプルではrepeat命令で、5回繰り返すループとそのループの中に3回繰り返すループを入れてある。
 repeat命令などの繰り返し回数はシステム変数cntで調べることができる。しかし、システム変数は一つだけなので、サンプルプログラムのように二重ループの場合は実行結果のように、処理中のループの回数を記憶している。
 2つ目のループ内で1つ目のループ回数が必要な場合は、次のように1つ目のループ内でシステム変数cntの値を別の変数に記憶させておく必要がある。

    repeat 5    ;1つ目のループ(5回ループ)
        mes "1つ目=" + cnt
        cnt1 = cnt
        repeat 3, 10    ;2つ目のループ(3回ループ)
            mes "\t2つ目=" + cnt + "\t1つ目=" + cnt1        
        loop
    loop
    stop

 HSPのヘルプには、
 「repeat〜loopを含む部分をさらにループさせるネスト構造も記述することができます。ただし、正常にloop命令を通ってループしないで抜けたりすると、ネスト構造がおかしくなるのでループから強制的に抜けるような構造にはしないようにしてください。」とかかれている。ネスト構造とは、このサンプルのようにループの中にループを入れる形にすることである。

 


☆繰り返し命令について

 repeat〜loop命令以外にも繰り返し命令は用意されている。foreach 〜 loop命令については配列変数の後で学習する。
 次の繰り返し命令は、C言語やJAVAなどに近い形でプログラムが書けるように用意されているものなので、ここでは取り上げません。

do 〜 until do
  実行する命令群
until 条件式
 条件式が真になるまで繰り返す。
while 〜 wend while 条件式
  実行する命令群
wend
 条件式が真の間、繰り返す。
for 〜 next for 変数, 初期値, 終値, 増分
  実行する命令群
next
for  x, 1, 5, 1
  mes x
next
 1, 2, 3, 4 と表示される。


前へ 目次へ 次へ 
2006, 2007 © Hiroshi Masuda 

 

 

inserted by FC2 system