突然ですが皆さんは数学者ガウスを知っていますか?
子供の頃、1から100までの合計を一瞬で答えたという人です。
ちなみに、その計算方法は1〜100をその逆の100〜1を足し算します。1+100=101、2+99=101、……99+2=101、100+1=10lというようになり、101が100個できます。これにより101×100=10100となります。しかし、1〜100を2種類足しているため2で割ります。10100÷2=5050となり1〜100の合計は5050となります。
コンピュータの場合、この計算方法ではなく1から100まで順に足していって一瞬で答を出します。
そのプログラムを今回は作ってみましょう。
「Sum」という名前でプロジェクトを作ります。
フォーム上のボタンをクリックすると合計を行い、答をメッセージボックスを表示するようにします。
まずは以下のフォームを作ります。
各プロパティ設定
コントロール種類 |
プロパティ |
値 |
テキストボックス |
Name |
txtNum |
|
Text |
1 |
ラベル |
Name |
lblSum |
|
Text |
までの合計 |
ボタン |
Name |
btnSum |
|
Text |
合計 |
単に1〜100までと固定しても面白くないので、どこまで足すかという部分を指定できるようにしました。
本来ならプログラム実行時に1未満の値が入った時や数字未入力の状態で合計ボタンをクリックした時の処理の記述とかも考える必要があるのですが、今回は単純に合計の部分のみを考えることにします。気休め程度かもしれませんが、プログラム実行時にデフォルトで1の数字が表示されるようにしています。
さて、それではプログラムコードを記述しましょう。
今回は、実行時に合計ボタンをクリックすると合計処理をするので、フォームの編集画面で合計ボタンをダブルクリックして合計ボタンクリック時のイベントを表示しそこに処理を記載します。
Public Class Form1
Private Sub btnSum_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSum.Click
End Sub
End Class
ボタンをダブルクリックするとこの記載が表示されます。これに以下のように記載を加えます。
Public Class Form1
Private Sub btnSum_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSum.Click
'変数
Dim i As Integer = 0 'Forループ用カウンタ
Dim intSum As Integer = 0 '合計した数値を格納
For i = 1 To txtNum.Text '(1)1からtxtNum.Textの値まで繰り返す
intSum = intSum + i '(2)intSumの値にiの値を足し、その合計値をintSumに入れる
Next '(3)繰り返し地点
MessageBox.Show(intSum)
End Sub
End Class
今回は2つの点に着目します。
まず(1)の部分です。For ○ = △ To □というのは「変数○が△から□まで繰り返す(ループする)」というような意味になります。
○というのは任意の変数です。通例 i 以降を使います。〜は変数の初期値を表します。そして・・・になるまで繰り返す度に変数に、特に指定がなければ1が加えられていきます。
ではコードのどこまでを繰り返しているのかというと、(3)のNextまでです。
つまり上記プログラムで言うと、「For i = 1 To txtNum.Text」の行が実行されると変数 i に1が入り、そのまま下に向かって順番にコードが実行されます。そして(3)の行、即ち「Next」で再度(1)の行に戻り、i には1が加えられ2となってまた下へ向かってコードが実行されます。また(3)の行で(1)に戻り i には1加えられ3になりまたコード実行、という流れが i が100になるまで繰り返されます。
i が101になった段階で繰り返し処理は中止され、(3)の直後、「Messagebox.Show(intSum)」が実行されます。
この繰り返し処理は上記のように同じことを何回も行う場合に非常に便利です。
次に(2)の行を見て下さい。
今まで「intSum = i」のように変数に値を代入する方式をやってきました。
今回は少し書き方が違っており、「intSum = intSum + i」となっています。
これはintSumの値にi の値を加えた合計値を再度intSumに代入するというものです。これがなぜ必要かというと先程の繰り返しが絡んできます。
繰り返しにより、i の値は毎回1ずつ増えています。今回その値を毎回足していくわけですから、前回の繰り返しまでに足された値、即ち累積値に i の値を足しその値を新しい累積値とします。
ここでintSumは累積値の役割を果たしているわけです。 ちょっとわかり辛いですか?簡単な表で見てみましょう。
繰り返し回数 |
今回の累積値
(左辺のintSum) |
前回の累積値
(右辺のintSum) |
i の値 |
1回目 |
1 |
0 |
1 |
2回目 |
3 |
1 |
2 |
3回目 |
6 |
3 |
3 |
・
・
・ |
100回目 |
5050 |
4950 |
100 |
このようにして累積値を計算していくのです。(この表は1〜100までの計算を前提にしたものです。)
このプログラムを実行しテキストボックスに100を入力して合計ボタンを押すと、
というようにガウスが計算した答と同じ値が一瞬で表示されますね。
今回は少し複雑なので改めてまとめておきましょう。
- For ○ = △ To □
〜〜〜
Next
(「Forループ」と言ったりします。)
- 変数○が数値△から□になるまで毎回1ずつ増えながら任意のコード〜〜〜を繰り返す。
- ○=○+△
- 任意の変数○に任意の数値△を足して○に再代入する。(累積値を求める場面でよく使われる。)
今回ご説明したものもよく使われるので、しっかり身に付けましょう。 |