正多角形を描くプログラムを改良しよう 🔰
前に作成した正多角形を描くプログラムに入力を加えると次のようにできます.
:N = INT (INPUT "辺の数") ; 辺の数を整数として入力する
:L = FLOAT (INPUT "辺の長さ") ; 辺の長さを実数として入力する
:A = 360/:N
REPEAT :N [
FD :L
RT :A
]

このプログラムを実行したとき,辺の数に 2 以下を入力したらどうなるでしょう?
2 や 1 を入力したときは,正多角形とはいえないまでもいちおう何かを描いてくれますが,0 を入力すると図 1 のようなエラーが表示されます.
これはプログラムの 3 行めの :A = 360/:N
において,360 をゼロで割ろうとしたために起こるエラーです.
算数でも,数をゼロで割ってはいけないと習ったはずですが,LibreLogo でもやはりゼロによる割り算をしてはいけないのです.
ゼロによる割り算が起こらないようにするには,次のような考えかたがありそうです.
- 入力された辺の数が 2 以下ならば何も描かずに終了する.
- 辺の数が 3 以上になるまで,くり返して入力を求める.
ここでは 2 つめの考え方でプログラムを改良してみましょう.
前回でてきた WHILE
が使えそうです.
今は WHILE
の条件を「:N
が 3 より小さい」とすればよいので,プログラムは次のように書きなおせばよいでしょう※1.
:N = 1
WHILE :N < 3 [
:N = INT (INPUT "3以上の辺の数")
]
: L = 0
WHILE :L <= 0 [
:L = FLOAT (INPUT "正の辺の長さ")
]
:A = 360/:N
REPEAT :N [
FD :L
RT :A
]
このプログラムでは辺の長さも正の値が入力されるまでくり返すようにもしています.
1 行めの :N = 1
や 5 行めの :L = 0
は,少なくとも 1 回はくり返しが実行されるようにするための「オマジナイ」です※2.
くり返しを制御してみよう 🔰
「オマジナイ」を使わずに辺の数として 3 以上を入力してもらうようにするには,次のようにすればよいでしょう※3.
WHILE TRUE [
:N = INT (INPUT "3以上の辺の数")
IF :N >= 3 [ BREAK ]
]
WHILE TRUE [
:L = FLOAT (INPUT "正の辺の長さ")
IF :L > 0 [ BREAK ]
]
:A = 360/:N
REPEAT :N [
FD :L
RT :A
]
TRUE
は必ず条件が成りたつようにするための値で,WHILE TRUE
とすることで,いつまでもくり返しが続く無限ループを作っています※4.
BREAK
はくり返しをやめる命令CONTINUE
といっしょにループを制御する命令と呼
くり返し処理CONTINUE
があると,それより後
WHILE TRUE [
:N = INT (INPUT "3以上の辺の数")
IF :N = 0 [ BREAK ]
IF :N < 3 [ CONTINUE ]
WHILE TRUE [
:L = FLOAT (INPUT "正の辺の長さ")
IF :L > 0 [ BREAK ]
]
:A = 360/:N
REPEAT :N [
FD :L
RT :A
]
]
このプログラムは,辺の数として 0 を入力すると終了し,3 より小さい数を入力すると上にもどって辺の数の入力を求めます.
辺の長さは正の値が入力されるようにして,正 :N
角形を描くことをくり返します.