初めてのプログラムシリーズも残すところ今回含めてあと2回
6日目は繰り返し処理について、長いけれど大切なところ
初めてのプログラム 5日目 SmallBASICで作った電卓プログラムを改良して整数のべき乗計算が出来るようにするよ
べき乗は5の3乗なら1*5x5x5と1に5を3回かけ、5の-3乗なら1/5/5/5と1に5を3回割る計算を行う計算のこと。
SmallBasicを起動したら
昨日保存した5_Dentakuを開いて、
名前を付けて保存で「6_Bekijo」で保存する。
繰り返しはWhileかForを使って行う。
5日目の電卓プログラムではGoTo文を使って=が押されるまで繰り返し計算を行っていたけれど、これはあんまり良くない方法。
まずはこれをWhileに変える。
While
Whileは次のように書く
While 条件
繰り返す処理
EndWhile
条件に一致している間中、While〜EndWhile間の処理が繰り返される。
もし、無条件に繰り返したい場合は、条件を"True"とする。
ループの開始点をラベルからWhileに変更する。
変更前
ReStart:
変更後
While "True"
ループの終了地点をGoToからEndWhileに変更する。
変更前
Goto ReStart
変更後
EndWhile
これで実行すると、GoToを使わなくても、繰り返し処理が実行できる。
Whileに条件を付けてみる
While では条件に"True"を指定して無条件にループを行い、途中のGoTo文でループを抜けているけれど
Whileに繰り返し条件を設定することでGoToを使わずにループから抜けることが出来る。
計算方法(f)が=以外の場合繰り返すので、繰り返し条件は
f <> "="
変更前
While "True"
変更後
While f <> "="
に変更する。
繰り返しの終了判定をWhileで出来るようになるので
GoToと飛び先のラベルは消してしまう。
削除
If f = "=" Then
Goto Equal
EndIf
削除
Equal:
実行すると一見上手く動いているように見えるけれど、=を押した後に「計算する値を入れてね」と「計算できないです。」が表示されてしまう。
これは、While条件が判断されるのは処理がWhileに来たときだけのため、
f = TextWindow.Read()
実行時に=が入力されても、そこからEndWhileまでの間の
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a
が実行されてしまったため
fに"="以外が入力されたときだけ、処理を行うように
If f <> "=" Then
〜
EndIf
でかこむ
If f <> "=" Then
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a
EndIf
ココまでの全文は次の通り
TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()
a = x
While f <> "="
TextWindow.WriteLine("計算する方法を選んでね [+ - * / =]")
f = TextWindow.Read()
If f <> "=" Then
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a
EndIf
EndWhile
TextWindow.WriteLine("計算結果は" + a + "です。")
For
もう一つの繰り返し、Forを使って計算する方法に「^」が押されるとべき乗計算を行うようにする。
TextWindow.WriteLine("計算する方法を選んでね [+ - * / =]")
に^を加えて
TextWindow.WriteLine("計算する方法を選んでね [+ - * / ^ =]")
に変更する。
Forは
For 変数 = 初期化 To 終点 Step 変数の増分値
繰り返す処理
EndFor
と書く。
例えば
For i = 1 To 2 Step 1
繰り返す処理
EndFor
とすると、最初にForに入ったときにiに1が代入される。
1回目の処理が終わってEndForに来ると、Forに戻ってiに増分値(1)が足されて2になる。
2回目の処理が終わるとiにまた増分値(1)が足されて3になる。
3は終点を越えているので、繰り返しから抜ける。
複数の処理を一度に行うので複雑だけれど、分解すると次の通りになる。
i=1
Loop:
If i > 2 Then
GoTo EndLoop
EndIf
繰り返す処理
i = i + 1
GoTo Loop
EndLoop:
増分値に-の値を入れると初期値から変数が減っていき終点の数より減るまでの間繰り返される。
For i = 0 To -2 Step -1
繰り返す処理
EndFor
1回目の処理が終わってEndForに来ると、Forに戻ってiに増分値(-1)が足されて-1になる。
2回目の処理で-2に3回目の処理で-3となり、-3は終点を越えているので、繰り返しから抜ける。
実際に使うときはStep 増分値は省略されることが多く、省略した場合はStep 1を指定したことと同じになる。
べき乗計算を作ってみる。
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
の下に^が入力された場合の処理を追加する。
ElseIf f="^" Then
べき乗は、指数(y)の値が正の数の場合は1に基数(x)の値を指数回掛けて求めるので
If y >= 0 Then
a = 1
For i = 1 To y
a = a * x
EndLoop
End IF
TextWindow.WriteLine(x + "^" + y + "=" + a)
指数が負の数の場合は1に基数の値を指数回割って求めるので
If y >= 0 Then
a = 1
For i = 1 To y
a = a * x
EndLoop
Else
a = 1
For i = -1 To y step -1
a= a / x
EndFor
End IF
TextWindow.WriteLine(x + "^" + y + "=" + a)
プログラム全体は次の通り
TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()
a = x
While f <> "="
TextWindow.WriteLine("計算する方法を選んでね [+ - * / ^ =]")
f = TextWindow.Read()
If f <> "=" Then
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
ElseIf f="^" Then
If y >= 0 Then
a = 1
For i = 1 To y
a= a * x
EndFor
Else
a = 1
For i = -1 To y step -1
a= a / x
EndFor
EndIf
TextWindow.WriteLine(x + "^" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a
EndIf
EndWhile
TextWindow.WriteLine("計算結果は" + a + "です。")
入力し終わったらプログラムを実行してべき乗計算できることを確認して保存しよう。

繰り返し処理はIf文とGoToをつかえばForやWhileが無くても作ることが出来る。
それでもForやWhileがあるのには理由があって、
繰り返し処理はよく使うのに、難しくて、しかも、失敗すると被害が大きく
プログラマーが楽しつつミスをしにくいように、これだけの手段が出来てる。
特に、終了条件が訪れない状態を無限ループといい、プログラムが反応しなくなってしまう。
無限ループの例 赤の×を押すか「プログラムの終了」を押すまで動き続ける。
i=1
label1:
If i=0 Then
GoTo label2
EndIf
TextWindow.WriteLine(i)
i = i + 1
GoTo label1
label2:
GoTo文はループしている事や終了条件が見えづらいので、無限ループに陥りがち、
ForやWhileを上手く使うことでループがすっきりして失敗しにくくなる。
繰り返す回数が決まっている場合はForを使えば
For i = 1 To 繰り返したい回数
繰り返す処理
EndFor
とするだけなので簡単で間違いが起きにくい。
繰り返す回数が決まっておらず繰り返している処理の中で条件を求める場合はWhileを使うと繰り返す範囲とその条件がまとまるので見やすくなる。
同じループをForとWhileとGoToで作ってみる。Forが一番シンプルで、次にWhile、
GoToはループしている事すら見えづらくなっているのが分かると思う。
For
For i = 1 To 5
TextWindow.WriteLine(i)
EndFor
While
i = 1
While i <= 5
TextWindow.WriteLine(i)
i = i + 1
EndWhile
GoTo
i = 1
label1:
If i > 5 Then
GoTo label2
EndIf
TextWindow.WriteLine(i)
i = i + 1
GoTo label1
label2:
地味だった初めてのプログラムも次回で最後の予定です。
次回は配列についてを行う予定。
その後は絵を描いたりゲームを作ったりもっと派手で面白いプログラムを作っていこうかと思います。
初めてのプログラム 7日目 完成電卓プログラム