【第5章】繰り返し処理(1)
2022.04.07

 ここまでで、当カテゴリーで必要なVB2022の操作は習得できたと思います。本章以後はプログラム作成・修正画面、実行画面は省略します。VB2022の操作がまだ不安な方は、ここまでの章をもう一度復習してください。


 [順次処理と繰り返し処理]

 ここまででやってきたプログラムをもう一度見直してみましょう。コンピュータのプログラムはコンサートや運動会のプログラムと同じで、最初から終わりまで書かれている指示(命令)が順番に実行されてゆくものです。これを順次処理(順処理)といいます。順次処理はコンピュータのプログラミングの基本中の基本です。


図5-1.コンサートのプログラム


 図5-1はピアノリサイタルのプログラムの例です(しつこいようですが管理人の本業は・・・えーい、それもういいから)。音楽会では普通プログラムの順に曲が演奏されます。この例ならベートーヴェン、シューベルト、ドビュッシーの順に演奏されて終わります。よほどの事態が発生しない限りドビュッシーまで終わったところでベートーヴェンに戻ってもう一度全曲演奏されたり、シューベルトかドビュッシーのどちらか一方のみ演奏され他方は演奏されないということはありません。しかしコンピュータのプログラムでは、このようなことはしばしば行われます。同じ処理を繰り返し実行することを繰り返し処理、条件によりどちらか一方の処理のみ実行されることを選択処理といいます。この章では繰り返し処理について学びます。

 まずは簡単な平均を求めるプログラムで繰り返し処理の基本を身につけてください。
たとえば次のような5つの数の平均を求めるとします。
   67, 55, 42, 28, 30
 暗算が得意な方なら、これをパッと見て44.4とすぐにわかることでしょう。しかし記憶力も計算速度も人間よりはるかに勝っているはずのコンピュータにはそれができないのです。コンピュータで数の平均を求めるにはひとつひとつの数をエッチラオッチラと足し算していって、その合計をデータ件数で割る、という行程をたどる必要があります。この考え方に基づいたVB2022のプログラムはこうなります。


  1:Dim Gokei As Integer 
  2:Dim Ninzu As Integer
  3:Dim Tensu As Integer
  4:Dim i As Integer
  5:Dim Heikin As Single
  6:Gokei = 0
  7:Ninzu = 0
  8:For i = 0 To 4
  9:    Console.Write(" 点数 = ")
10:    Tensu = Console.ReadLine()
11:    Gokei = Gokei + Tensu
12:    Ninzu = Ninzu + 1
13:Next i
14:Heikin = Gokei / Ninzu
15:Console.WriteLine()
16:Console.WriteLine(" 平均 = " & Heikin)
17:Console.ReadKey()

以後、説明をスムーズに行なうためにプログラムリストに行番号を付けます。上のプログラムリストをコピー&ペーストで
Sub Main~End Subに貼り付ける場合、面倒ですが、行番号は消してください。


[プログラムの説明]
1~5行目はプログラム中で使用する変数の宣言です。
   Gokei  各々の生徒のテストの点数を加算する(整数型、テストの点は正の整数とします)
   Ninzu  データの数(この場合、受験した生徒の人数)をカウントする(整数型)
   Tensu  キーボードから入力したデータを受け付ける(整数型、テストの点は正の整数とします)
   i      繰り返しの回数をカウントする(整数型)
   Heikin  計算した平均点を代入する(実数型、割り算が入る以上、結果は少数になることもある)
   
 順番が入れ替わりますが、先に8行目の
   For i = 0 To 4
 について説明します。ここで ForはPresent for you💓のforではなく「~の間」の意味と考えてください。つまり
  「変数i の値が0から(1ずつ増加して)4になるまで、以下の処理を繰り返せ」
 ということになります。これが繰り返し処理の指示です。どこまでを繰り返すのか、ということを示しているのが13行目のNext iです。
 これで9~12行目は、i=0 として1回目、i=1 として2回目・・・i=4 として5回目と5回繰り返されます。繰り返される処理内容はこうなります。
9行目:画面に「点数 = 」と表示します
10行目:キーボードから読み込んだデータを変数Tensuに格納します(変数Tensuにキーボードから入力されたデータを保存する、と考えてもOKです)
11行目:今、入力されたデータを変数Tensuに加算します
12行目:データの件数を+1します
 この11~12行目は、数学の先生に叱られてしまいそうな式ですね。=は数学では等号といい左辺と右辺の値が等しいという意味でした。VB2022に限らずプログラミング言語では=は条件判定(後述)の場合を除き、統合ではなく代入演算子(右辺の値を左辺に代入する)です。忘れてしまった方は第3章をもう一度復習してください。
 繰り返しを抜けた後は平均の計算です。
14行目:データの合計÷データの件数を変数Heikinに代入(保存)します
15行目:結果を表示する前に1行空けます
16行目:計算結果(ここでは平均)を表示します
17行目:何かキーが押されるまで画面を閉じるのを待ちます


[コンピュータのプログラムならではの書き方]

 繰り返し処理の流れについてはご理解いただけたでしょうか。ではちょっと戻って先程説明を飛ばしてしまった6、7行目です。これらの変数GokeiとNinzuはキーボードからデータが入力される度に、そのデータを加算(足しこみ)し、データ件数をカウントするものですが、これを最初に0としています。そろばんで最初に「ご破算で願いましては」とやる(電卓なら最初にオールクリアキーを押す)のと同じです。どうしてこんなことをしなくてはならないかというと、変数は最初に宣言しただけではそこにどういうデータが入っているかわからない、からです。たとえば1行目でデータの合計をとるGokeiという整数型変数を宣言していますが、宣言した段階でここに100というデータが入ってしまっていて、かつ6行目がなかったらどうなるでしょうか。計算結果は全く誤ったものとなってしまいます(VB2022では数値型変数は宣言した段階で0が、ストリング型変数ではNull""が代入されるようになっているのですが、すべてのプログラミング言語がそうなっているとは限りません。管理人がコンピュータ屋だった頃使っていたCOBOLやFORTRAN言語ではそのような親切なことはやってくれませんでした)。合計をとるための変数は繰り返し処理に入る前に0にしておく、と覚えておきましょう。


[For ~ Nextによる繰り返しの条件]
 For ~ Nextで繰り返し処理の範囲を指定するには
   For 数値変数 = 初期値 To 終端値 Step 増分値
   Next 数値変数
 という書き方になります。ここで Nextの後の数値変数はForの後の数値変数と同じものにする必要があります。ただしNextの後の数値変数は省略することができます。省略した場合、そのNextはそこからさかのぼっていちばん近いForとペアとみなされます。
 For ~ Nextは「Forの後の数値変数が初期値から始まって増分値ずつ変化し、終端地を越えるまでの間、Nextの手前までの処理を繰り返せ」という指示になります。Step 増分値を省略するとStep 1とみなされます。つまり、次の3つのプログラムはどれも「VB2022」が5回表示されることになります。
    Dim i As Integer
    For i = 0 To 4
       Console.WriteLine("VB2022")
    Next i
    Console.ReadKey()


    Dim i As Integer
    For i = 3 To 7
       Console.WriteLine("VB2022")
    Next i
    Console.ReadKey()

    Dim i As Integer
    For i = 4 To 0 Step -1
       Console.WriteLine("VB2022")
    Next i
    Console.ReadKey()

 次のプログラムは初期値と終端値が同じです。この場合「VB2022」は1回だけ表示されます(For ~ Next内は1回だけ実行されます)。
    Dim i As Integer
    For i = 3 To 3
       Console.WriteLine("VB2022")
    Next i
    Console.ReadKey()


 次のように初期値が終端値を越えていると「VB2022」は1回も表示されません(For ~ Next内は1回も実行されません)。
    Dim i As Integer
    For i = 3 To 2
       Console.WriteLine("VB2022")
    Next i
    Console.ReadKey()
[注意]
1)Forの後の数値変数(繰り返しの回数を数えるのでループカウンタとよびます)は特に必要がない限り整数型にしておきましょう。次のプログラムは「VB2022」と10回表示されるかと思いきや実際には9回しか表示されません。この理由については後の章で詳しくお話します。
    Dim i As Single
    For i = 0.1 To 1 Step 0.1
       Console.WriteLine("VB2022")
    Next i
    Console.ReadKey()
2)ループカウンタは参照するのはかまいませんが値を変えるのは慣れないうちはやめておきましょう。具体的には式の右辺に使うのやConsole.Writeline()などで表示するのはかまいませんが、式の左辺に使うのやConsole.Readline()で値を代入するのは避ける方が無難です。
 次のプログラムを実行するとどうなるでしょう。
  1:  Dim i As Integer
  2:  For i = 11 To 20
  3:     Console.WriteLine("ピーターパンは" & i & "歳になりました")
  4:     i = 10
  5:  Next i
  6:  Console.ReadKey()


 実行するとこうなります。


 ループカウンタは11から始まって1ずつ増えて20を越えたら終わるはずです。3行目を見るとConsole.Writelineの( )の中にループカウンタの i が入っているのでその時点でのループカウンタ i の値が表示されるので「ピーターパンは11歳になりました」「ピーターパンは12歳になりました」 ・・・と表示されてゆき「ピーターパンは20歳になりました」で止まるはずなのですが、実行すると「ピーターパンは11歳になりました」と延々と表示され終わりません。なんでこんなことになってしまうのでしょうか。そうです。4行目に i = 10 があるため(ここを通る度にループカウンタ i に10が代入されてしまうので)、Next iで繰り返しに戻っても i の値は常に11になってしまい終端値の20を超えることはないのです。「ピーターパンは永遠に歳とらない男の子だからこれでいいのだ」ではなく、プログラムのミスでコンピュータが止まらなくなっているのですからこれは立派な暴走です。

[演習2]粗利益の合計を求めるプログラム
 前章の[演習1]で作ったプログラムを改造し、照り扱い商品が5つある場合のそれぞれの粗利益と最後にすべての商品の粗利益合計を求めるプログラム(下図参照)を作りましょう。



コメント一覧
コメント投稿

名前

URL

メッセージ

- CafeNote -