学生でも社会人でも分かる!!初めてのプログラミング入門 第8回 変数と繰り返しの組み合わせ
2017/02/19
↑ ↑ ↑
前回はプログラム中で直接計算を行う方法や変数の使い方について解説しました。
変数という仕組みを単体で使うだけでもプログラムの中だけで様々な計算を行うことができ、非常に便利なのですが、変数というのは繰り返しや分岐と組み合わせた場合に更に大きな力を発揮します。
そこで、今回は変数と繰り返しを組み合わせた幾つかの有用なプログラミングパターンを紹介したいと思います。
繰り返し計算
まず、変数と繰り返しの組み合わせとして一番最初に思い当たるかもしれないのは何らかの計算を単純に繰り返し行うことではないでしょうか。
しかし、本当に全く同じ計算を繰り返し行っても、幾つかの例外を除いて基本的には毎回同じ計算結果が得られるだけで意味がありません。たとえば、1 + 1
の計算結果は何回計算しても2
から変わることはあり得ません。
それでは、どういった場合に同じ計算を繰り返し行うことに意味があるかというと、前の計算で得られた結果を次の計算で使うような場合です。
たとえば、2
を10回足し合わせた結果を求めるような場合です。
この場合、最初は0
から始まり、これに2
を10回連続で繰り返し足し合わせることにより最終的な計算結果を求めることができます。
つまり、足し算を10回連続で行うということになりますが、その足し算というのは前の計算で得られた結果に2
を加えるという足し算です(ただし、一番最初の足し算は0
に2
を加えるという足し算です)。
この計算を繰り返し命令を使わないでプログラム化するとどうなるでしょうか?
1行で書くとしたら下のようになるかと思います。
プログラム9
- 1
#result = 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
- 変数
result
に計算結果を格納する。
しかし、このプログラムは+ 2
が10回も直接繰り返し書かれているのがあまりよろしくありません。今回は10回の繰り返しでしたが、これが100回、1000回となった場合は考えたくもありません。
やはり繰り返しは繰り返し命令を使って書くべきです。
しかし、どうすればこのプログラムを繰り返し命令を使ったものに書き換えることができるのでしょうか?
まず、上のプログラムは下のようにも書き直せることに着目してください。
プログラム9(書き直し1)
- 1
#result = 0
- 変数
result
に計算結果を格納する。 - 2
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 3
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 4
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 5
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 6
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 7
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 8
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 9
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 10
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 11
#result = #result + 2
- 変数
result
に計算結果を格納する。
何をしたかというと、1行で一気にやっていた足し算の計算を1回1回別の行でやるようにしただけです。
このプログラムの2行目から11行目までの計算は#result = #result + 2
となっており、=
の両側に変数result
が登場することに注意してください。
一見おかしいようにも見えますが、前回の記事でも書いた通りプログラミングにおける=
というのは数学における代入と似たものですので、問題はありません。
この場合、=
の右側の#result
は計算を行う直前に変数result
に格納されているデータを表します。
そして、=
の左側の#result
は計算の結果が変数result
に格納されることになるということを表しています。
ですから、この命令により変数result
に格納されているデータが更新されるということになります。
プログラミングにおいては変数に格納されている元のデータを使って同じ変数に格納する新しいデータを計算するということがよくありますので慣れていくようにしましょう。
そして、もう1点注目していただきたいのが、このプログラムの2行目から11行目までは全く同じ命令になっているということです。
ということは、繰り返し命令を使ってまとめることができるということです。
という訳で、このプログラムの2行目から11行目までを繰り返し命令を使って書き換えてみましょう。そうすると、下のようなプログラムになります。
プログラム9(書き直し2)
- 1
#result = 0
- 変数
result
に計算結果を格納する。 - 2
<r 10>
- 繰り返しを開始する。10回繰り返す。
- 3
#result = #result + 2
- 変数
result
に計算結果を格納する。 - 4
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
このようにすることで、同じ計算の繰り返しを繰り返し命令を使って書くことができます。
そして、このようにすることで計算の繰り返し回数を変えなければならなくなった場合でも繰り返し開始命令の繰り返し回数を変えるだけでプログラムの修正を終えることができます。最初の、書き換え前のプログラムに比べると非常に良いプログラムとなっています。
このプログラミングパターンは非常に有用ですので是非体得してください。
このプログラミングパターンで重要なのは1つの変数の中身を元の中身を使って繰り返し更新していくという考え方です。
それから、もう1つ地味に重要なのが最初に変数に何を格納しておくかということです。
たとえば、2
を10回掛け合わせる計算を行うプログラムは下のようになります。
プログラム10
- 1
#result = 1
- 変数
result
に計算結果を格納する。 - 2
<r 10>
- 繰り返しを開始する。10回繰り返す。
- 3
#result = #result * 2
- 変数
result
に計算結果を格納する。 - 4
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
1行目で変数result
に格納している初期値が1
であることに注目してください。
このように、変数の初期値は計算の種類により変わってきますので、繰り返し計算のプログラムを書く際には変数の初期値を何にすべきかはしっかり考えるようにしてください。
カウント変数
さて、前のセクションで繰り返し計算を行うプログラミングパターンを紹介しましたが、このパターンを使うと繰り返しにおける現在の繰り返し回数、すなわち、現在の繰り返しが何回目の繰り返しであるかを計算で求めることができます。
そのためには、下のようにします。
プログラム11
- 1
#count = 0
- 変数
count
に計算結果を格納する。 - 2
<r 10>
- 繰り返しを開始する。10回繰り返す。
- 3
#count = #count + 1
- 変数
count
に計算結果を格納する。 - 4
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
つまり、最初に変数(このプログラムの場合は変数count
)に0
を格納しておき、繰り返しを行う毎に元の変数の値に1
を加えていくようにします。
このようにすることで、1回目の繰り返しにおける変数の値は1
となり、2回目の繰り返しにおける値は2
となり、3回目の繰り返しにおける値は3
となり、・・・という風に繰り返し回数と変数の値を一致させることができます。
ちなみに、このような、繰り返し回数を示す変数を一般的にカウント変数と呼びます。
上のようなプログラミングパターンを使えばカウント変数を簡単に作ることができます。
もしかしたら、カウント変数があると何か嬉しいことがあるのかと疑問にお思いの方もおられるかもしれませんが、カウント変数があるとカウント変数の値に応じて実行する命令を変化させたり、カウント変数の値自体を別の計算に使用したりすることができます。
カウント変数の利用
カウント変数の値自体を別の計算に使用するプログラムの例としては、たとえば、1
から100
までの数を足し合わせた結果を求めるプログラムがあります。
このプログラムは下のように作ることができます。
プログラム12
- 1
#count = 0
- 変数
count
に計算結果を格納する。 - 2
#sum = 0
- 変数
sum
に計算結果を格納する。 - 3
<r 100>
- 繰り返しを開始する。100回繰り返す。
- 4
#count = #count + 1
- 変数
count
に計算結果を格納する。 - 5
#sum = #sum + #count
- 変数
sum
に計算結果を格納する。 - 6
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
- 7
MsgBox #sum
- メッセージボックスを表示する。
このプログラムではカウント変数の他にsum
というもう1つの変数を1
から100
までの数を足し合わせた結果を求めるために使っています。
2行目で変数sum
の初期値を0
とし、繰り返しの中で変数sum
の元の値にカウント変数の値を足し合わせています。
カウント変数の値は繰り返し毎に1
、2
、3
、・・・と1
ずつ増えていきますから、このようにすることで、1
から100
までの数を順番に変数sum
に足し合わせていくことができます。
そして、最後に、最終的な計算結果をメッセージボックスに表示するようにしています。
このプログラムを実行してみると5050
と書かれたメッセージボックスが表示され、正しく計算が行われていることが分かります。
このように、カウント変数自体を計算の中で使用すると様々な計算が行えるようになってきます。
繰り返し回数
繰り返しにおける繰り返し回数とは繰り返し開始命令で指定する数値のことであり、繰り返しの回数を決める数値でした。
しかし、実は、HiMacroExでは繰り返し回数に具体的な数値の代わりに変数を指定することができます。
変数を指定するには繰り返し開始命令で繰り返し回数を記述していた部分に#
と変数名を記述します。
そして、繰り返し回数として変数を指定した場合には変数に格納されている数値がそのまま繰り返し回数となります。
たとえば、下のようにします。
プログラムの一部
-
・・・
#x = 10
- 変数
x
に10
を格納する。 <r #x>
- 繰り返しを開始する。変数
x
に格納されている数値と同じ回数繰り返す。 </r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
・・・
・・・
・・・
このようにして変数と繰り返しを組み合わせることにより、繰り返しの回数をプログラム作成時に決めるのではなく、プログラム実行時に決めるようなことも可能となります。
繰り返し回数をプログラム作成時に決めるのではプログラム自体を変更しない限り何度同じプログラムを実行しても繰り返し回数は一定ということになりますが、繰り返し回数を実行時に決めることができればプログラムを実行する度にその時の状況に応じて繰り返し回数を変えるというようなこともできることになります。
そのため、より柔軟なプログラムを作成することができます。
ただし、このような形での変数と繰り返しの組み合わせにおいては注意すべき点が幾つかあります。
1つ目は繰り返し回数として指定された変数に数値以外のデータが格納されている場合にどうなるかです。
この場合、繰り返し回数は1回となります。
2つ目は繰り返しが行われている最中に繰り返し回数として指定された変数に元の数値とは別のデータが格納された場合にどうなるかです。
この場合、繰り返し回数が変わることはありません。
つまり、繰り返し回数というのは繰り返しの開始時に確定するものであって、繰り返し回数として変数が指定されている場合には繰り返しの開始時に変数に格納されているデータに基づいて繰り返し回数が確定します。
そのため、繰り返しが開始してから繰り返し回数として指定した変数に格納されているデータが変わったからといって繰り返し回数にまで変更の影響が及ぶことはありません。
以上、この2点は繰り返しで繰り返し回数として変数を指定した場合のルールとなりますので、間違いのないようにしてください。
さて、繰り返し回数として変数を指定するプログラムの例として、たとえば、ユーザから何か数値を入力してもらい、1
からユーザが入力した数値までの合計を計算するプログラムは下のように書くことができます。
プログラム13
- 1
#max = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
max
に格納する。 - 2
#count = 0
- 変数
count
に計算結果を格納する。 - 3
#sum = 0
- 変数
sum
に計算結果を格納する。 - 4
<r #max>
- 繰り返しを開始する。変数
max
に格納されている数値と同じ回数繰り返す。 - 5
#count = #count + 1
- 変数
count
に計算結果を格納する。 - 6
#sum = #sum + #count
- 変数
sum
に計算結果を格納する。 - 7
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
- 8
MsgBox #sum
- メッセージボックスを表示する。
このプログラムを実行してみるとユーザにデータの入力を求めるダイアログボックスが表示されます。
たとえば、このダイアログボックスの入力欄に123
と入力して「OK」ボタンをクリックすると、1
から123
までの合計がメッセージボックスに表示されます。
複利計算プログラムの改造
さて、今回は最後に、変数と繰り返しを組み合わせるプログラムの例として第5回の記事で作成した複利計算プログラムを改造してみたいと思います。
第5回の記事のプログラムは100万円を年利7%で借りた場合に10年後の元本と利息の合計がどうなるかを計算するものでしたが、今回のプログラムではユーザが元本や年利や期間を指定することができるようにしてみましょう。
そして、計算結果もメッセージボックスを使ってユーザに提示することにしましょう。
ですから、今回の複利計算プログラムの大まかな処理の流れは下のようになります。
- ユーザに元本を入力してもらう。
- ユーザに年利を入力してもらう。
- ユーザに期間を入力してもらう。
- 入力された元本、年利、期間の複利計算を行う。
- 計算結果を表示する。
入力
まずはユーザに元本や年利や期間を入力してもらう部分です。
これには、上のプログラムでも使いましたが、HiMacroExにはユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを計算結果とする計算が用意されていますので、これを使用すると良いでしょう。
この計算はInputBox
という計算でした。
ですから、元本、年利、期間のそれぞれについてこの計算を使ってユーザにそれぞれの数値を入力してもらい、適当な変数にそれぞれの数値を格納するようにします。
すなわち、これをプログラム化すると下のようになります。
プログラム14(作成中1)
- 1
#principal = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
principal
に格納する。 - 2
#yield = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
yield
に格納する。 - 3
#term = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
term
に格納する。
元本を変数principal
に格納し、年利を変数yield
に格納し、期間を変数term
に格納するようにしました。
計算
次は複利計算の部分です。
ユーザに入力してもらい、変数に格納した元本、年利、期間から最終的な計算結果である最終的な元本と利息の合計を計算します。
計算方法は第5回のものと同じです。ただし、今回は「電卓」は利用せず、プログラム中で直接計算を行います。
計算部分をプログラム化すると下のようになります。
プログラム14(作成中2)
-
・・・
- 3
#term = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
term
に格納する。 - 4
#total = #principal
- 変数
total
に変数principal
に格納されているデータを格納する。 - 5
<r #term>
- 繰り返しを開始する。変数
term
に格納されている数値と同じ回数繰り返す。 - 6
#total = #total * (1 + #yield)
- 変数
total
に計算結果を格納する。 - 7
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
この部分では変数total
を使って1年毎の元本と利息の合計を繰り返し計算していくことにより最終的な元本と利息の合計を求めます。
プログラミングパターンとしては「繰り返し計算」のセクションで説明したものと「繰り返し回数」のセクションで説明したものを同時に使っています。
4行目で変数total
の初期値を変数principal
に格納されている数値としているのは最初の時点での元本と利息の合計というのは元本そのものだからです。
そして、5行目から繰り返しが始まりますが、6行目で変数total
に格納されている数値を更新しています。1年後の元本と利息の合計というのは元の元本に利息分を加えたものですので、6行目のような計算をすることになります。
出力
最後に、計算結果を出力する部分です。
今まで何度となく使ってきましたが、メッセージボックスを表示するにはMsgBox
命令を使用します。
ですから、出力部分をプログラム化すると下のようになります。
プログラム14(作成中3)
-
・・・
- 7
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
- 8
MsgBox #total
- メッセージボックスを表示する。
完成
完成したプログラムは下のようになりました。
プログラム14(完成)
- 1
#principal = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
principal
に格納する。 - 2
#yield = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
yield
に格納する。 - 3
#term = InputBox
- ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数
term
に格納する。 - 4
#total = #principal
- 変数
total
に変数principal
に格納されているデータを格納する。 - 5
<r #term>
- 繰り返しを開始する。変数
term
に格納されている数値と同じ回数繰り返す。 - 6
#total = #total * (1 + #yield)
- 変数
total
に計算結果を格納する。 - 7
</r>
- 繰り返しが完了していない場合には繰り返しの最初の命令に戻る。完了した場合には次の命令に進む。
- 8
MsgBox #total
- メッセージボックスを表示する。
このプログラムを動かしてみると、3回データの入力が求められ、順番に元本、年利、期間を入力すると、適切な計算が行われ、計算結果がメッセージボックスに表示されます。
たとえば、元本として1000000
を入力し、年利として0.07
を入力し、期間として10
を入力すると、1967151.3572895605
という結果が表示されます。
適切な複利計算が行われていることが分かります。
また、前回の複利計算プログラムが全部で16行のプログラムで今回の複利計算プログラムが全部で8行のプログラムであることを考えると、プログラム中で直接計算を行うようにするとかなりのプログラム短縮効果があることが分かります。
また、「電卓」のような別のプログラムを態々起動させる必要がないというのも利点です。
つづく
今回は変数と繰り返しを組み合わせる方法について解説しました。
変数と繰り返しを組み合わせることにより、より柔軟な繰り返しを行うことができるようになります。
次回は変数と分岐を組み合わせる方法について解説したいと思います。
↓ ↓ ↓
