HSP3 プログラミングの基礎T | |
(4) 制御文(繰り返し)
プログラムは基本的に、上から下に向かって実行される。実行する順序を変える(制御する)命令を制御文という。
ここでは、同じ命令を繰り返し処理する繰り返しについて学習する。
繰り返す回数は数値や変数で指定する。
repeat
実行する命令 群
looprepeat 繰り返す回数
実行する命令 群
looprepeat 繰り返す回数,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 変数, 初期値, 終値, 増分
実行する命令群
nextfor x, 1, 5, 1
mes x
next
1, 2, 3, 4 と表示される。
2006, 2007 © Hiroshi Masuda |