配列と繰り返し

今回は、制御のもうひとつの要素である繰り返し文と配列を取り上げる。

たとえば、5人の生徒の成績の平均値を計算するとする。 これまでの知識で作れるプログラムは以下のようなものになろう。


Dim Seiseki1,Seiseki2,Seiseki3,Seiseki4,Seiseki5 as Single
Dim Heikin As Single

Seiseki1 = 30.0
Seiseki2 = 34.0
Seiseki3 = 55.0
Seiseki4 = 80.0
Seiseki5 = 24.0

Heikin = 0.0
Heikin = Heikin + Seiseki1
Heikin = Heikin + Seiseki2
Heikin = Heikin + Seiseki3
Heikin = Heikin + Seiseki4
Heikin = Heikin + Seiseki5

Heikin = Heikin / 5.0

5人分の成績を格納する変数を作り、成績を代入する。
(上の例であげたように、成績を直接代入してもよいし、あるいはテキストボックスを5つ作って、 そこから変数へと成績を代入する。) それらの和をとり、人数5で割って平均値を出す。 これはこれで問題なく動くであろう。

しかし、生徒が100人いたらどうしたらよいか?
100人分の変数をいちいち作るのか?
100個の変数の和を計算するのか?

生徒の数は固定されているというのも芸がない。 生徒の数が10人でも、20人でも33人でも動くようなプログラムを作るにはどうしたらいいか?

ポイントは繰り返しと配列にある。上のプログラムはほとんどが同じ操作の繰り返しである。 同じ操作を生徒の数だけ繰り返しているにすぎない。 このようなプログラムは、配列と繰り返し文を用いて簡略化できる。

配列

同じような目的のために使用する多くの変数を一挙に宣言するには、配列を使用する。 次のように書けばよい。

Dim Seiseki(100) As Single

これは、実数型変数Seisekiを100個宣言したものである。 これにより、 Seiseki(1)からSeiseki(100)までの100個の変数を使用することができる。 ポイントは、配列の添え字に計算式や変数を使うことができる点である。

繰り返し文

繰り返し文にはいろいろな種類があるが、とりあえずFor~Next文を説明する。 まず、例をあげる。


For I = 1 To 5
   Heikin = Heikin + Seiseki(I)
Next I

For文に出てくる I = 1 To 5 は、制御変数Iを1から5まで変化させながら、 ブロックを変化させることを意味する。 したがって、これは次の文と等価である。


I = 1
   Heikin = Heikin + Seiseki(I)
I = 2
   Heikin = Heikin + Seiseki(I)
I = 3
   Heikin = Heikin + Seiseki(I)
I = 4
   Heikin = Heikin + Seiseki(I)
I = 5
   Heikin = Heikin + Seiseki(I)

したがって

   Heikin = Heikin + Seiseki(1)
   Heikin = Heikin + Seiseki(2)
   Heikin = Heikin + Seiseki(3)
   Heikin = Heikin + Seiseki(4)
   Heikin = Heikin + Seiseki(5)

と同じである。

配列と繰り返し文を使用することで、最初のプログラムを簡略化できる。 たとえば、次のようにする。 学生の数を示す変数Gakuseisuを新たに導入している。 こうすることで学生数が何人の場合にも容易に対応できる。


Dim Seiseki(5) as Single
Dim Heikin As Single
Dim Gakuseisu As Integer
Dim I As Integer

Gakuseisu = 5
Seiseki(1) = 30.0
Seiseki(2) = 34.0
Seiseki(3) = 55.0
Seiseki(4) = 80.0
Seiseki(5) = 24.0

Heikin = 0.0
For I = 1 To Gakuseisu
	Heikin = Heikin + Seiseki(I)
Next I

Heikin = Heikin / Gakuseisu

練習

実際には、データ入力部分のユーザインターフェイスが未解決のままである。
とりあえず、テキストボックスを10個作り、そこに入力された値を
Seiseki(1)からSeiseki(10)までに格納して平均を計算するプログラムを作れ。

繰り返しの例:素数の判定

ある入力された数が素数か否かを判定するプログラムを考える。 たとえば、237が素数であるためには、237が1と237以外の数では割り切れないことを示せばよい。 このためには、

237は2では割りきれない
237は3では割りきれない
237は4では割りきれない
237は5では割りきれない
237は6では割りきれない
・・・・・
と続けていく。

237は236では割りきれない

まで計算し、素数であることが確定する。
このとき、ひとつでも割り切れる数があったら237は素数ではない。

このような考え方(アルゴリズム)に対するプログラムは以下のようなものになる。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim N As Integer
        Dim I As Integer
        Dim IsPrime As Boolean

        N = 237

        IsPrime = True
        For I = 2 To 236
            if N Mod I =0 Then
                IsPrime = False
            End If
        Next I

        If IsPrime = True Then
            lblAnswer.Text = "素数です"
        Else
            lblAnswer.Text = "素数ではない"
        End If
    End Sub

ここでModは剰余を計算する演算子である。
237 Mod 45 が 0 であれば、237を45で割った余りが0、すなわち割り切れることになる。
実際には、236まで計算を行う必要はない。CInt(Math.Sqrt(237))(237の平方を越えない整数)までで十分である。 また、ある数で割り切れればそこで素数でないことは確定しているので、それ以上の計算を行う必要はない。

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim N As Integer
        Dim I As Integer
        Dim IsPrime As Boolean

        N = 237

        IsPrime = True
        For I = 2 To CInt(Math.Sqrt(N))
            If N Mod I = 0 Then
                IsPrime = False
                Exit For
            End If
        Next I

        If IsPrime = True Then
            lblAnswer.Text = "素数です"
        Else
            lblAnswer.Text = "素数ではない"
        End If
    End Sub

ここでは、Exit For を使ってFor〜Nextループを強制脱出した。 Exit Forで脱出できるのは一番内側のFor〜Nextループのみである。

繰り返しの例:素数の個数

ここまでは、ある整数が素数か否かを単純に判断するプログラムであった。
次は、1からある整数までの間に、いくつ素数があるか計算するプログラムを作りたい。

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim N As Integer
        Dim I As Integer
        Dim IsPrime As Boolean

        N = 237

        IsPrime = True
        For I = 2 To CInt(Math.Sqrt(N))
            If N Mod I = 0 Then
                IsPrime = False
                Exit For
            End If
        Next I
If IsPrime = True Then lblAnswer.Text = "素数です" Else lblAnswer.Text = "素数ではない" End If End Sub

この青い枠内が、Nに入った整数が素数か否かを変数isPrimeに返しているのに注目すると、 入力した整数をMとして

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim N As Integer
	Dim M As Integer
	Dim NumberOfPrime as Integer
        Dim I As Integer
        Dim IsPrime As Boolean

	NumberOfPrime=0
	M = 555
	For N = 2 To M

        IsPrime = True
        For I = 2 To CInt(Math.Sqrt(N))
            If N Mod I = 0 Then
                IsPrime = False
                Exit For
            End If
        Next I
If IsPrime = True Then NumberOfPrime=NumberOfPrime + 1 End If Next N lblAnswer.Text=CStr(NumberOfPrime) End Sub

とすると、求めた個数を得ることができる。 ある数が素数かどうかを調べるためのFor〜Nextループと、 素数の個数を数えるためのFor〜Nextループが二重になっていることに注意せよ。

このようにFor〜Nextループは何重にも入れ子にすることができる。

課題4

数学の順列組み合わせで、nCmは次の式を示す。

nCm = n!/m!(n-m)!

整数nとmを入力すると nCmを計算するプログラムkadai04を作成せよ。