情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

学生でも社会人でも分かる!!初めてのプログラミング入門 第8回 変数と繰り返しの組み合わせ

2017/02/19

第7回

↑ ↑ ↑

前回はプログラム中で直接計算を行う方法や変数の使い方について解説しました。

変数という仕組みを単体で使うだけでもプログラムの中だけで様々な計算を行うことができ、非常に便利なのですが、変数というのは繰り返しや分岐と組み合わせた場合に更に大きな力を発揮します。

そこで、今回は変数と繰り返しを組み合わせた幾つかの有用なプログラミングパターンを紹介したいと思います。

繰り返し計算

まず、変数と繰り返しの組み合わせとして一番最初に思い当たるかもしれないのは何らかの計算を単純に繰り返し行うことではないでしょうか。

しかし、本当に全く同じ計算を繰り返し行っても、幾つかの例外を除いて基本的には毎回同じ計算結果が得られるだけで意味がありません。たとえば、1 + 1の計算結果は何回計算しても2から変わることはあり得ません。

それでは、どういった場合に同じ計算を繰り返し行うことに意味があるかというと、前の計算で得られた結果を次の計算で使うような場合です。

たとえば、2を10回足し合わせた結果を求めるような場合です。

この場合、最初は0から始まり、これに2を10回連続で繰り返し足し合わせることにより最終的な計算結果を求めることができます。

つまり、足し算を10回連続で行うということになりますが、その足し算というのは前の計算で得られた結果に2を加えるという足し算です(ただし、一番最初の足し算は02を加えるという足し算です)。

この計算を繰り返し命令を使わないでプログラム化するとどうなるでしょうか?

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の元の値にカウント変数の値を足し合わせています。

カウント変数の値は繰り返し毎に123、・・・と1ずつ増えていきますから、このようにすることで、1から100までの数を順番に変数sumに足し合わせていくことができます。

そして、最後に、最終的な計算結果をメッセージボックスに表示するようにしています。

このプログラムを実行してみると5050と書かれたメッセージボックスが表示され、正しく計算が行われていることが分かります。

計算結果

このように、カウント変数自体を計算の中で使用すると様々な計算が行えるようになってきます。

繰り返し回数

繰り返しにおける繰り返し回数とは繰り返し開始命令で指定する数値のことであり、繰り返しの回数を決める数値でした。

しかし、実は、HiMacroExでは繰り返し回数に具体的な数値の代わりに変数を指定することができます

変数を指定するには繰り返し開始命令で繰り返し回数を記述していた部分に#と変数名を記述します。

そして、繰り返し回数として変数を指定した場合には変数に格納されている数値がそのまま繰り返し回数となります

たとえば、下のようにします。

プログラムの一部

    ・・・    

#x = 10
変数x10を格納する。

    ・・・    

<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行のプログラムであることを考えると、プログラム中で直接計算を行うようにするとかなりのプログラム短縮効果があることが分かります。

また、「電卓」のような別のプログラムを態々起動させる必要がないというのも利点です。

つづく

今回は変数と繰り返しを組み合わせる方法について解説しました。

変数と繰り返しを組み合わせることにより、より柔軟な繰り返しを行うことができるようになります。

次回は変数と分岐を組み合わせる方法について解説したいと思います。

↓ ↓ ↓

第9回

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-プログラミング, 講座