【第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つある場合のそれぞれの粗利益と最後にすべての商品の粗利益合計を求めるプログラム(下図参照)を作りましょう。



【第4章】キーボードからデータを入力するプログラム
2022.04.06

変数を使う意味
 前章のプログラムで学んだとおり変数には、違う数値(データ)で同じ計算(処理)をしたい場合、変数に入れる数を変えるだけで済むという利点があります(図4-1)。



図4-1.変数を使うと

 しかし、このままだと違う数値で同じ計算をする度にいちいちプログラムの修正が必要になります(図3-3の8~10行目)。VB2022の起動に時間がかかり、ConsoleApp1の呼び出しにはタバコ1本吸うくらい待たされ(非喫煙な方にはわかりにくい例えでごめんなさい)、こんなの筆算でやった方が早いわ!そんな声が聞こえてきそうです。この章では、前章のプログラムの変数に値を代入する部分をプログラムを変更することなくできるように改造してみましょう。

[実習4]キーボードからデータを読み込むプログラム
 では再びVB2022を起動しConsoleApp1を呼び出してください。呼び出したらこのプログラムを次のように改造します(例によってキー入力が面倒な方はSub Main()とEnd Subの間をすべて消して下のプログラムをコピペで入れていただいてもかまいません)。

Dim a As Integer
Dim b As Integer
Dim c As String
c = Console.ReadLine()
a = Console.ReadLine()
b = Console.ReadLine()
Console.WriteLine("Hello! " & c & "さん")
Console.WriteLine(a + b)
Console.WriteLine(a - b)
Console.WriteLine(b * a)
Console.WriteLine(b / a)
Console.WriteLine(b ¥ a) '(¥は半角に直してください)
Console.WriteLine(b Mod a)
Console.WriteLine(b ^ a)
Console.Readkey()


図4-2.プログラム修正後

 図4-2のように修正出来たら保存し実行してみましょう。今度は最初に図4-3のように真っ黒な画面の左上でカーソルが点滅していると思います。

図4-3.プログラム実行開始直後

 ではここでご自分の名前でも好きな人の名前でも「青春のバカ野郎!」(筆者の歳がバレますね・・・大汗)でもいいので入れてEnterキー(Returnキー)を押しましょう。するとカーソルの点滅が次の行に移ります。こんどは半角で 3 と入れてEnterキーです。同じようにカーソル点滅が次の行に移ったら半角で 5 と入れましょう(数値は必ず半角の整数で、小数や全角で入れると不都合が発生します)(*1)。

図4-4.名前と2つの数値を入れ終わった

 2つ目の数値(この例では 5)まで入れてEnterキーを押すと、実行画面が図4-5のようになります。

図4-5.プログラム実行結果


[プログラムの解説]
 今回のプログラムは実行するとすぐにキーボードからの入力待ち状態になりました。カーソルが点滅している状態がそれです。これはプログラム中のどこがなせる業かといいますと、図4-2の8~10行目です。この3行に

Console.ReadLine()

というのが出てきますが、これはキーボードから1行分のデータを読み込みなさい、という命令です。1行分というのはキー入力を始めてからEnterキーを押すまでのことです。つまりプログラムは実行開始後8行目でオペレーター(このプログラムの使用者)が何かデータを入れるのを待っているわけです。ここで自分の名前などを入れてEnterキーを押すと次は9行目で入力待ちに、何か数を入れてEnterキーを押すと10行目で入力待ちに、ここでもうひとつ数を入れてEnterキーを押すと11行目以下の処理を行い図4-5のようになります。
 Console.Readline()で読み込んだデータはそのままでは入力を受け付けただけで消えてしまいます。そこで8~10行目のように、
変数 = Console.ReadLine()

で読み込んだものを変数に代入しておくのが普通です。

 変数に代入する値をキーボードから入力できるようにすると、異なるデータで同じ処理(*2)を行う場合、プログラムの修正の必要がなくなるなどの利点はたしかにあるのですが、キーボードを操作するのは人間です。人間のやることにはミスが付き物です(筆者はそう思っています)。もし銀行の窓口に預金に行って10000円預金するところを行員さんが誤って1000000円と入力してしまったら?たいへん嬉しいことになりますね。たいへんなことになります。キーボードやタッチパネルからの入力が多くなればなるほど誤操作が起こる確率は高まります。ということで、データ入力を行うプログラムでは誤操作をできるだけ防ぐ工夫が必要になります。

[実習5]台形の面積を求めるプログラム~誤操作対策を施す(1)

 台形の面積を求めるプログラムを考えましょう。台形の面積は一時期、小学校の算数から消えていたため、習っていないという方もいらっしゃるかもしれませんから簡単に説明しておきます。台形とは少なくとも2辺が平行な四角形のことで、その平行な2辺をそれぞれ「上底」「下底」とよびます。そして台形の面積は(上底+下底)×高さ÷2で求められます(図4-6)


図4-6.台形

 ここでは、上底、下底、高さはキーボードからの入力で整数のみとします。そして求めた面積も変数に代入してから表示することにします(*3)。
 ではさっそくプログラムを作りましょう。今度は全く新しいプログラムを作るので、新規作成にします。VB2022を一度終了した方は再起動して新しいプロジェクトの作成にしてください(忘れてしまった方は第1章をご覧ください)。図4-2の画面のままの方は保存した後、画面左上のファイルメニューから新規作成→プロジェクト→コンソールアプリと進んでください。どちらにしても今度は名称がConsoleApp2になります。
 ここまでの内容がマスターできた方は、プログラムは次のようになることは容易にわかると思います。

Dim a As Integer
Dim b As Integer
Dim h As Integer
Dim s As Single
a = Console.ReadLine()
b = Console.ReadLine()
h = Console.ReadLine()
s = (a + b) * h / 2
Console.WriteLine(s)
Console.Readkey()

 変数a、b、hはそれぞれキーボードから入力された上底、下底、高さを代入するものです。今回は整数に限定されていますので、Dimによる型宣言はIntegerでOKです。変数sは計算した台形の面積が代入されるものですが、a、b、hすべてが整数だとしても最後に÷2がある以上、計算結果は小数になる可能性もあります。小数を代入する変数の型はSingle(実数型)でした(【第3章】変数とデータの型の[プログラムの解説]参照)。
 (a + b)× h ÷ 2 をVB2022で書くと

s = (a + b) * h / 2


となります。ここで( )は半角で入れてください。演算の優先順位は算数と同じで、最初に( )内が計算されます。次にべき乗、乗除算、加減算の順に計算されます。ここまでは算数と同じ(VB2022に限らずほとんどのプログラミング言語でそうなっています)ですが、ひとつ注意を要するのは算数で使う{ }(大括弧)がないことです。たとえばx - { y + ( a + b )× h ÷ 2 }という式の場合、VB2010ではこう書きます。

x - (y + ( a + b ) *  h / 2)

 { }の部分は( )となります。かなりゴチャゴチャしてきますので( )の対に注意してください。

 このプログラムを実行すると図4-7のようになるのですが・・・。


図4-7.プログラムの実行画面


 いかがですか?皆さんはこの画面を見てどう思いますか?オペレーターになったつもりで見てください。
 このプログラムは実行開始直後にすぐ入力待ちとなり、まずここで上底の長さを入力します。次に下底の長さ、最後に高さを入れるのですが、この画面では入力待ちでカーソルが点滅するだけで、何の値を入れればよいのかが(プログラムを作った当人でない限り)わかりません。また、VB2022ではConsole.WriteLine( )で表示すると数値もストリングもすべて左詰めになるので画面が大変見づらくなります。「操作がわかりにくい」「画面が見辛い」は誤操作を引き起こす最大原因です。しかし、これが図4-8のような実行画面ならかなりオペレーターに優しいものになります。


図4-8.改良された実行画面


 では、このようになるようプログラムを改造しましょう。こうなります。

Dim a As Integer
Dim b As Integer
Dim h As Integer
Dim s As Single
Console.WriteLine(" 台形の面積を求める")
Console.WriteLine()
Console.Write(" 上底 ") : a = Console.ReadLine()
Console.Write(" 下底 ") : b = Console.ReadLine()
Console.Write(" 高さ ") : h = Console.ReadLine()
s = (a + b) * h / 2
Console.WriteLine()
Console.WriteLine(" 面積 = " & s)
Console.Readkey()

[プログラムの解説]


図4-9.画面の見やすさを改良したプログラム

 5~8行目はもう説明不要ですね。まだよくわからない方は【第3章】データの型を復習してください。
 9行目では「何のプログラム」かを表示しています。これも誤操作防止のひとつです。LINEなどのコミュニケーションツールでは送信相手の名前が画面最上段に表示されるのが普通ですがあれも誤送信防止のためです。「今から帰る。愛してるよ、Chu」と奥様に送るのを間違えて、学生連絡用のグループに送信してしまったら?翌日どのツラ下げて出勤するんだ、ということになります。筆者に言わせてもらえれば、情報漏洩の原因のうちかなりのパーセンテージを誤操作が占めます。これと同じで、コンピュータを使う仕事が1日1つしかないのならともかく、1日に3つも4つもある場合、今何のプログラムを起動したのかを表示しておくことにより、違うプログラムを誤って実行してしまうミスを防げます。
 10行目はConsole.Writeline()だけで表示する内容が書かれていません。これで空白行が1行できます。ここでは画面を見やすくするために入っています。空白行の場合でもConsole.Writeline()と、()が必要になることに注意してください。11~13行目では
Console.Write( )

というのが出てきました。Console.Writeline()は行単位の表示(1行表示された後改行)ですが、Console.Write( )は表示後の改行はしません。
 11~13行目では、さらに : が出てきました。これはマルチステートメントといい、プログラムの1行の中に複数のステートメント(プログラム中に書かれる命令や計算式などのこと)を書きたい場合に使用します。たとえば11行目は、「上底」と表示し、キーボードからの入力待ちとなります。これは

Console.Write(" 上底 ")
a = Console.ReadLine()

と2行に分けて書いてもコンピュータは同じ動作をします。12、13行目も同様に「下底」と表示して入力待ち、「高さ」と表示して入力待ちとなります。このマルチステートメントはむやみに使うと、プログラムがわかりにくくなるので使う際には注意が必要です。このプログラムでは実行画面の1行の表示と入力待ちをプログラムの1行に対応させる目的で使っています。

 それから、Console.Write( )で表示するストリングはすべて左に全角1文字分のスペースを入れました。これにより表示内容が画面の左にギュッと寄ってしまうことはなくなります。
 16行目は計算結果の表示ですが、ここでは1行に表示する内容が「面積 =」というストリングと s という実数型変数が混在しています。このようにストリングと数値を連結するときはストリング演算子の & を使います( + を使うと不具合が起こります)(*4)。
 誤操作防止は操作をわかりやすくする、画面を見やすくするの他にもいろいろあります。以後のサンプルプログラムでも少しずつお話してゆきます。

[演習1]粗利益を求めるプログラム
 ここまでで覚えた知識を使って、自分でプログラムを作ってみましょう。最初は粗利益を計算するプログラムです。会社員の方には説明不要ですが、このサイトは小学生も見ている可能性もあるので説明しておきます。
 粗利益とは売上金額から仕入金額を引いたものです。たとえば1個100円で仕入れた品物を150円で売ると150円-100円で、50円利益が出たことになります。この品物が10個売れたとすると売上金額(150円×10個=1500円)から仕入金額(100円×10個=1000円)を引いた500円がこの品物を売って得られた利益ということになるのですが、会社をやってゆくためにはこの利益から社員の給料や会社で使うパソコンを買ったり電気代などを支払います。なのでこの500円はそういう必要なお金を支払う前の大雑把な利益という意味で粗利益(そりえき)といいます。
 では次の画面のようなプログラムを作ってください。



[コラム]コンピュータってどういう機械(2)
 筆者がコンピュータの勉強を始めた頃読んだ入門書にこんなことが書かれていました。

「コンピュータとは、使用目的が決まっていない機械である」

 たしかにそのとおりです。ここまでで皆さんが学んだ範囲でも、プログラムを入れ替えることによって、四則演算のための計算機になったり台形の面積を求める機械になったりしました。さらに家計簿のプログラムを入れれば家計簿になりますし、ネット回線につないでインターネット上のコンテンツを見るためのブラウザを使えば、いろいろな人とコミュニケーションをとることができたり、動画を鑑賞したりもできます。

 第2章のコラムではコンピュータを構成する様々な装置についてお話しました。この機械(装置)そのもののことをハードウェアといいます。ハードウェアは元々金物という意味です。これに対し皆さんが作ったプログラムや市販のパソコン家計簿、インターネットブラウザなどのことをソフトウェアといいます(*5)。ソフトウェアという言葉は、コンピュータの出現により出てきた造語で、狭義ではコンピュータを動かすプログラムのこと、広義ではコンピュータの利用技術全般を意味します。コンピュータ以外の世界でも「ハード面の整備はできた。これからはソフト面の充実が課題だ」などと使われたりします。コンピュータとはプログラム(ソフトウェア)により、様々な動作をする機械ということになります(*6)。
 
[昔はよかったなぁ]
 この章のサンプルプログラムを昔のBASICで書くとこうなります。

100 DEFINT A,B,H
110 DEFSNG S
120 PRINT
130 PRINT "台形の面積"
140 PRINT
150 INPUT " 上底 ",A
160 INPUT " 下底 ",B
170 INPUT " 高さ ",H
180 S = (A + B) * H /2
190 PRINT
200 PRINT " 面積 = ";S
210 END

 DEFINTは整数型変数の、DEFSNGは単精度型本数の宣言でした。第2章でもお話ししたとおり、昔のBASICではこの2行はなくてもプログラムは問題なく動きました。INPUT命令は行番号150~170のようにストリングを間に入れることができました。図4-9の11~13行目のように、1行で入力内容の表示とキー入力を行ないたい場合は大変便利でしたが、VB2022ではこれはできません。a  = Console.ReadLine("上底")などとやると実行時に不具合が発生します。ご注意ください(*7)。

(注)
*1)VB2022が数値として認識するのは半角数字と符合を示す +(プラス)と -(マイナス)、 .(小数点)だけです。全角文字はすべてストリングとみなされます。VB2022だけでなく、筆者が知る限りほとんどのプログラミング言語でそうです。
*2)計算に限らず、コンピュータが行う仕事全般を「処理」といいます。
*3)実用プログラムでは計算結果は一度変数に代入してから表示するようにするのが普通です。その計算結果をあとでもう一度使うということが起こることはしばしばあるからです。
*4)後の章でデータ型変換について学びますが、そこでガッツリ説明します。
*5)近年、スマートフォンやタブレットでの言い方に合わせて「アプリ」とよぶことが多いようです。
*6)昔よくいわれたことに「コンピュータ、ソフトがなければただの箱」というのがあります。どんなに高性能なパソコンを買ってもその性能を充分引き出せるソフトウェアがなければただの粗大ゴミです。
*7)VB2022のコンソールアプリを使う限り、画面出力、キーボード入力は昔のBASICに比べると不便です。Windowsアプリ(フォームアプリ)では画面レイアウトが昔のBASICとは比べ物にならないくらい便利になったことがわかります。


【第3章】変数とデータの型
2022.04.05

[実習3]変数を使うプログラム


 VB2022を起動し、前章でやった要領でConsoleApp1を呼び出してください。「今までもそうだったけど呼び出しにしても新規作成にしてもすごく時間がかかるな」、ほとんどの方は今そのような感想をお持ちのことと思います。図3-1のような画面が出たきり、長い時は5分くらい待たされます。今日はプログラムの話をする前に最初にこのことを説明しておきます。



図3-1.プロジェクトの起動中


 これはVB2022ではたとえ数行の短いプログラムでもプロジェクト、ソリューションが作成されるためです。たとえば鉄道を作ることを考えてみます(筆者の趣味が入った例ですみません)。鉄道建設は線路を敷く、駅を作る、そこを走る電車を作るなど、様々な仕事が融合しているものです。この1つ1つがプロジェクト(project=事業)です。そしてたとえば線路を敷くにしてもこの鉄道が通る場所が平坦な所ばかりとは限りませんから、高架線を作る、トンネルを掘る、鉄橋を掛けるなどの作業が融合しています。これらの作業がプログラムです。そしてこうしたプログラム、プロジェクトが一体となって鉄道建設というソリューション(solution=解決)が実現します。VB2022のプロジェクト、ソリューションもこれと同じ考え方です。



図3-2.プログラムとプロジェクト、ソリューションの関係


 前章でみなさんが作ったプログラムは図3-2でいえばプロジェクトAの中のプログラム1だけです。しかし、1つの短いプログラムだとしても、それを作る時にはVB2022はプロジェクト用の作業場所や会議室に相当するスペース、さらに将来的にたくさんのプロジェクトが誕生することを見越してソリューション用のビルを用意するものと思ってください。それゆえ、プログラム新規作成時も呼び出し時もかなりの時間がかかるのです。

 お話している間に、前章で作ったプログラムが出てきたと思います。ではこのプログラムを次のように改造してみましょう。

Dim a As Integer
Dim b As Integer
Dim c As String
a = 3
b = 5
c = "Boys and Girls"

Console.WriteLine("Hello! " & c)
Console.WriteLine(a + b)
Console.WriteLine(a - b)
Console.WriteLine(b * a)
Console.WriteLine(b / a)
Console.WriteLine(b ¥ a)
Console.WriteLine(b Mod a)
Console.WriteLine(b ^ a)
Console.Readkey()

変更する箇所がかなりたくさんあるので、キー入力が得意ではない方は、前に作ったプログラム(Sub Main()とEnd Subの間に書き込まれているプログラム)をいったん消して、上のプログラムをコピー&ペーストで入れていただいてもけっこうです。



図3-3.プログラム追加・修正が終わったところ


図3-3のように追加・修正ができたら、保存してから実行してみましょう。今度は図3-4のような実行結果になったと思います。

図3-4.実行結果

[プログラムの解説]
 図3-3のプログラムと前章の図をもう一度見てください。お気づきのことと思いますが、前章でやったプログラムのConsole.WriteLine(3 + 5)の3、5に相当する部分がa、bに、そして"Everyone"に相当する部分がcという文字に置き換わっていて、8~10行目を見ると中1の数学で初めて習った、あの式みたいなのが新たに入りました(筆者は中1で数学で初めてこれを習った時、なんかボク、すごいことができるようになったのかな、とワクワクした記憶があります)。さらに実行結果(図3-4)と照らし合わせてみると、どうやら今度はこのa、b、cに代入された数値やストリングをもとにプログラムが実行されたことがわかります。
 このプログラムに出てきたa、b、cのようなものを変数といいます。数学でいう変数とは少し意味が違っていて、コンピュータのプログラミングでいう変数とは「データの入れ物」とお考えください(*1)。そしてこのデータの入れ物には数値だけでなく、ストリングも入れられます。
この変数をプログラム中で使用するには、使用する前に何という名前の変数にどのようなデータを入れます、という宣言(*2)が必要になります。それが5~7行目です。変数の宣言の仕方は

Dim 変数名 As データ型

となります。ここで変数名は何でもかまいません。試してみたところVB2022では日本語(全角)も変数名として使えるようです。
 次にデータ型です。たとえば紙袋は軽い書類やおみやげのお菓子などを入れるもので、5kgもあるような重い書類を入れれば持ち手の紐が切れたりしますし、水を直接注入することはできません。重い書類を持ち運ぶには丈夫なバッグが、水を持ち歩くにはペットボトルやポットが必要なように変数もどのようなデータを入れるのかによって用途に合わせたものを用意しなくてはなりません。とりあえず今は次の3つだけ覚えてください。


Integer  整数型   整数のみ入れられる     
  Single    実数型   小数を含む数値が入れられる
String    文字列型  ストリングが入れられる   

 データ型はこの他にもたくさんあるのですが、必要になったところでまだ追加説明します。現段階ではこれだけ覚えておけばサンプルプログラムは理解できます。
 ところで変数もなのですが、数学で使用するものとプログラミングで使用するものではまるで意味が違うのが=(イコール)です。数学では=は左辺の値と右辺の値が等しいことを表す「等号」でしたが、プログラミングの世界では=は代入演算子と呼ばれ、右辺の値を左辺に代入するという意味になります(*3)。ですから数学のように、a + b = b + aのような使い方はできません。=の左辺は必ず変数1個です(*4)。代入演算子の使い方は次のようになります。
変数名 = 式


 したがって、このプログラムはaを3、bを5とし、11~18行目の計算を行うプログラムということになります。18行目の^(べき乗)はまだ説明していませんでしたが、これは a ^ nのように使います。この場合aのn乗というとになります。
 今まで覚えた算術演算子、代入演算子の他、このプログラムでは&という演算子が出てきました。これはストリング(文字列)連結演算子とよばれ、文字列を連結する際に使います。このプログラムでは&のかわりに+でも同じ結果が表示されるのですが、ストリング連結では&と+では少し意味が異なります(後にデータ型の変換のところで学びます)。
Dim a As String
Dim b As String
Dim c As String
Dim d As String
a = "I "
b = "Love"
c = "You"
d = a & b & c
Console.Writeline(d & ".")
Console.Read()
というプログラムなら実行結果は I Love You. となります。

[昔はよかったなぁ]
この章の実習でやったプログラムを昔のBASICで書くとこうなります。
100 A=3
110 B=5
120 C$="Boys and Girls"
140 PRINT A+B
150 PRINT A-B
160 PRINT B*A
170 PRINT B/A
180 PRINT B¥A
190 PRINT B MOD A
200 PRINT B^A
210 WHILE INKEY$="":WEND
220 END


 昔のBASICでは変数の使用宣言はとくに必要ありませんでした。ストリングを入れる変数のみ変数名の末尾に$を付けるだけでOKでした。VB2022では変数名+$というのはありません。
昔のBASICではDEFINT、DEFSNGなどによる型宣言はしなくてもプログラムは問題なく動作しましたが、VB2022では変数はデータ型に関係なく使用宣言が必要になります。
 また昔のBASICでは計算式はA+B、A¥Bのように書けたものが、VB2022では演算子の左右には半角スペース1個が必要になります。今のBASICはいろいろと面倒になったもんじゃのう。しかしその面倒さを差し引いてもVB2022には昔のBASICでは想像もつかなかった便利な機能がたくさんあります。これから少しずつ覚えてゆくことにします。



(注)
*1)もう少し正確にいうと、データが入っている場所を示すものです。本や書類で必要な、大事なところに貼っておく付箋紙のようなものです。詳しくは後の章で説明します。
*2)パソコンに向かって「宣誓!我々は~」とやるわけではありません。プログラミングでは何かをするための準備段階のこととお考え下さい。
*3)後の章で学びますが、条件判定のときには等号となります。
*4)正確に言うと、オブジェクト1個です(後の章で学びます)。  


【第2章】一度作ったプログラムを修正しましょう
2022.04.04

 一度作ったプログラムは未来永劫ずっとそのまま使われるということは滅多にありません。不具合が見つかって修正の必要が出てきた、もっと便利で使いやすく改良して欲しいという要望が出てきた、ゲームならルールやキャラクタ設定を変更したいなど、最初のバージョン(版)に追加・修正等を加えなくてはならない場面はいくらでもあります。プロのプログラマのお仕事の半分以上はこれだったりするくらいです。ここでは前の章で作ったプログラムを呼び出して(*1)追加・修正する方法を覚えましょう。
[実習2]プログラムの修正
 それではVB2022を起動してください。前章までの実習が終わっていれば起動後の画面は図2-1のようになっていると思います。



図2-1.VB2022起動後の画面


 画面左に先ほど作ったプログラムConsoleApp1という名前があります。これをクリックします(*2)。


図2-2.前に作ったプログラムが呼び出された


 すると前章で作ったプログラムが呼び出され図2-2のようになります(少々時間がかかります)。
 では、このプログラムを次のように修正します。前章でお気づきかと思いますが、プログラム作成画面はWordかメモ帳のように使えますので、太字の部分のみ追加修正します。

Console.WriteLine("Hello Everyone")
Console.WriteLine(3 + 5)
Console.WriteLine(3 - 5)
Console.WriteLine(5 * 3)
Console.WriteLine(5 / 3)
Console.WriteLine(5 ¥ 3)
(*3)
Console.WriteLine(5 Mod 3)



図2-3.修正後のプログラム


 追加・修正が全部済むと図2-3のようになります。
 さあ、プログラムがどのように変わったかさっそく実行してみよう!
 そう思った方は、もう一度前章を読み直してください。プログラムを作成したら実行前にまず保存でしたね。これは前に作ったプログラムの修正の場合でも同じです。前章と同じく「ファイル」→「すべて保存」で保存しましょう。保存したら実行してみましょう。実行結果は図2-4のようになったと思います。


図2-4.修正したプログラムの実行結果画面


[プログラムの解説]
 図2-4をもう一度見てください。プログラムの各行の左に上から1、2、3・・・と連番がふられています。これは何行目ということを示す行番号です。この程度の短いプログラムではあまりありがたみはありませんが、100行以上の長いプログラムを作っている時にはたいへん重宝します。以下、プログラムの説明ではこの行番号を使ってお話します。
 まず5行目です。Console.Writeline( )は前章でやったとおり、コンソール(操作卓)に1行で( )の中味を表示する命令でした。( )内がストリングの場合、お使いのパソコンで入れられる文字、表示できる文字なら何でも入れられます。今回はHello! Everyoneに変更したので実行画面にもHello! Everyoneと表示されています。
 6行目と7行目は前章でやった足し算と引き算の計算結果の表示です。
 8行目から11行目の( )内も何かの計算式のように見えますが、*、/、¥、Modって何だ?と思われた方が多いと思います。*は算数で使う×(かける)の意味で、/は÷(割る)です。VB2022に限らずほとんどのプログラミング言語では、掛け算、割り算ではこうなっています。
じゃ¥とかModは?この2つは小学校3、4年生で習う割り算を思い出してください。たとえば10÷3の場合、商は3余り1とやりました。この商を求めるのが¥で、余りを求めるのがModです。プログラムの各行と実行結果を照らし合わせて確認してください。
 これら+、-、*、/などの文字が計算式で使われるとき、これらの記号(文字)を演算子、とよびます。演算子には計算の他、比較や条件判定、ストリングの連結に使われるものなどいろいろな種類があるのですが、普通の計算に使われる演算子を算術演算子といいます。

図2-6.VB2010の算術演算子


[コラム]コンピュータってどういう機械?(1)
 [コラム]では、コンピュータの基本についていろいろお話してゆきます。一日も早くVB2022によるプログラミングだけを覚えたいという方は読み飛ばしていただいても今後の実習には差支えありませんが、管理人としてはプログラミング実習を通してコンピュータの基本を学びたいという方にはぜひ読んでいただきたいお話をしてゆくつもりです。まず最初は、コンピュータとはどういう機械なのかを知っておきましょう。

図2-7.近年のパソコン(2019年11月現在)


 上の写真は管理人が仕事や当コンテンツ制作に使っているパソコンです。私がパソコンを初めて手にした時代とは異なり、こんなコンパクトなボディで持ち歩き可能、電源アダプタ、各種ケーブル、マウス全部含めて重量は3kgあるかないかでしょうか。しかし、このA4版のルーズリーフノート程度の大きさの箱の中には大きく分けると図2-8のような装置が詰まっています。

図2-8.コンピュータを構成する各装置

 ここまでで私たちは簡単な計算を行うプログラムを作って実行してみましたが、その計算を行なっているのが演算装置です。コンピュータの演算装置は計算の他にも様々な仕事をします。たとえばパソコンゲームの場合、勝ち負けの判定やマウスの動き、アニメーションの表示などは実は膨大な量の計算処理であり、この演算装置が司っています。
 その演算装置に対して、コンピュータで処理するデータを入れるための装置が入力装置であり、パソコンならキーボードやマウスがそうです。そしてディスプレイやプリンタなど処理した結果を印字したり表示するのが出力装置です。
 そしてコンピュータのコンピュータらしい機能といえば記憶です。これを担当するのが記憶装置ですが、記憶装置には、主記憶装置補助記憶装置があります。この2つの違いについては後の章で説明します。最近のパソコン、タブレット、スマートフォンなどは、特にこれを意識しないで使えるものがほとんどですが、プログラムを作る立場の者としてはこの違いをしっかり把握しておく必要があります。
 これらの各装置が間違いなく動作するように監視、指令を出しているのが制御装置です。演算装置と制御装置を合わせて中央処理装置(Central Processing Unit=CPU)と呼びます(*4)。
 図2-9の中にデータの流れと制御の流れというものがありますが、ひと口に言えばデータの流れは私たちがプログラムで作ってゆく流れで、人間の動作で言えば「カレーライスを食べる」「仕事をする」など自分の意思でどうこうすることができるものです。制御の流れは自律神経のように、体中に血液と酸素を送るために心臓を動かす、空腹になったので胃液の分泌を止めるなど自分の意思でどうこうすることができないものです。

[昔はよかったなぁ]
 このコーナーは主に1980年代までパソコンに標準で搭載されていたBASICでのプログラミングをお仕事、趣味にしていた方(私と同世代?)に、当時のBASICとVB2022の違いをお話するものです。もちろんお若い方でも昔のBASICってどんなものだったのか知りたいという方は歓迎です。昔のBASICは各パソコンメーカーにより若干の違いがありましたが(標準化されていなかった)、ここではどのメーカーのBASICにも共通していた命令・関数を使ってお話してゆきます。
 この章の実習でやったプログラムを昔のBASICで書くとこうなります。
10 PRINT "Hello! Everyone"
20 PRINT 3 + 5
30 PRINT 3 - 5
40 PRINT 5 * 3
50 PRINT 5 / 3
60 PRINT 5 ¥ 3
70 PRINT 5 MOD 3
80 END
 VB2022との違いのひとつは行番号です。昔のBASICは各行の行番号はプログラマ自身が付けるもので、行の順番を示すとともに各行のラベルの役割をもっていました。たとえばGOTO 10などのようにGOTO命令を使ってプログラムの実行順序を変えることができましたが、VB2022では行番号はVB2022が勝手に付け、プログラムの編集やデバッグに活用するものです。GOTO 1のような使い方はできなくはないのですが、昔のBASICのように無制限にどこへでもというわけにはいきません)。このことはぜひ早いうちに慣れてください。
 昔のBASICで書かれたこのプログラムを実行するとこうなります。

図2-9.この章のプログラムを昔のBASICで実行すると

 このように昔のBASICでは数値を表示するとき、デフォルトで最上位桁の左に符号用の半角スペースが空き、マイナスの数のときはそこに半角の-が入りました。図2-5と見比べていただけばわかりますが、VB2022では特別な書式設定をしない限り符号用の半角スペースが空くことはなく、デフォルトでは数値もストリングも左詰めで表示されます。


(注)
(*1)パソコンに向かって「おーい、プログラム出ておいで」と呼びかけるわけではありません。プログラムやデータをコンピュータ本体に取り込むことです。コンピュータ屋さんがよく使う言葉なので慣れておきましょう。
(*2)VB2022では一度作ったプログラムを呼び出す方法はいろいろあるのですが、今は最も簡単なこの方法を使うことにします。
(*3)半角の¥マークです。お使いのOS、ブラウザによってはバックスラッシュ(左上から右下への斜線)で表示される場合があります。
(*4)近年、CPUの意味が少し曖昧になっています。というのは実際の部品(回路)としては、制御装置が電源部(ACアダプタのことではありません)に組み込まれている製品があったり、大規模集積回路の発達で、演算装置、制御装置、主記憶装置が部品として一体化したマイクロプロセッサが普及してきたためです。


【第1章】とりあえずプログラムを作ってみましょう
2022.04.03


図1-1.VB2022の起動画面

 
[実習1]プログラムの作成
それでは、さっそくVB2022でプログラムを作ってみましょう。まずVB2022を起動してください。起動のやり方を忘れてしまった方は前章をもう一度ご覧ください。
 起動すると図1-1のような画面になります。ここで「新しいプロジェクトの作成」をクリックします(*1)。


図1-2.作成するプロジェクトの言語とプロジェクトタイプを選ぶ

 次に図1-2.のような画面になります。ここでプロジェクト作成に使用するプログラミング言語(*2)を選びます。画面上の「言語」をクリックします。するとさらにメニューが開きます。この中からVisual Basicをクリックします。次に
VB2022で作成できるプロジェクトタイプの一覧が出るので、この中からコンソールアプリ(.NET Framework)を選びただのコンソールアプリと間違えないように画面右下の「次へ」をクリックします。すると図1-3のような画面に変わります。


図1-3.プロジェクトに名前を付ける

 これから作成するプロジェクト(プログラム)に名前を付けます。このまま「次へ」をクリックするとVB2022が自動作成した名前(この例の場合ConsoleApp1)になります。名前は何でもいいのですが、半角英数字でなるべく後で見てわかりやすい名前にしておくことをおすすめします。今、ここではこの自動作成された名前を使うことにします。
その下の方に「ソリューションとプロジェクトを同じディレクトリに配置する」というオプションがあります。現段階では、ここにチェックが入ってなかったら入れておくことにします。ここまで準備が出来たら画面右下の「作成」をクリックしてください。図1-4の画面になります。


図1-4.プロジェクト(プログラム)作成画面

 さあ、いよいよプログラムを作りますが、その前にひとつご注意を。すでに入っている図1-4のこの4行は変更したり削除しないでください。これらの意味は現段階ではわからなくてもけっこうです。今のところは自分で作るプログラムはSub Main()とEnd Subの間に書き込む、という理解でかまいません。


Module Module1

Sub Main()
   ユーザーが作るプログラムはこの間に書き込みます
End Sub

End Module

 では、Sub Main()とEnd Subの間に、下のプログラムを書き込みましょう。えっ?ちょっと待って、書き込める行は1行しかないけど、とあわてなくて大丈夫です。1行入れたらEnterキー(またはリターンキー)を押せば次の行が自動で生成されます。Wordやメモ帳の操作と同じです。キー入力が苦手な方は、下の4行をコピー&ペーストしていただいてもけっこうです。

Console.WriteLine("Hello! VB2022")
Console.WriteLine(3 + 5)
Console.WriteLine(3 - 5)
Console.Readkey()


図1-5.プログラム作成画面

 これでプログラムが入りました(図1-5)。ではさっそく実行してみましょう(*3)。ちょっと待ったぁ!(なんだよ、急に)。
 作ったプログラムは実行前に必ず保存(Save)しましょう。なぜかというと、万一、プログラムにミスがあってコンピュータが暴走(*4)してしまったら、通常はコンピュータを強制再起動するか、強引に電源を切るしかなくなります(かなり無茶ですが)。そしてそうなった場合、今入れていたプログラムはすべて消えてしまいます(この理由は後に学びます)。今回のサンプルプログラムは高々4行ですから消えたら消えたでもう一度入れなおせばいいのですが、これがもし実務で使用するプログラムや研究データの分析プログラムで500行にも及ぶ長いプログラムだったら・・・もう、空を見上げて泣くしかありません(*5)。

 なのでプログラムは保存してから実行、これは初心のうちから習慣づけてください。(*6)




図1-6.プログラムの保存と実行開始画面

 プログラムを保存するには、画面左上の「ファイル」をクリックし、開いたサブメニューの中の「すべて保存」をクリックします(図1-6)。プログラムの保存のしかたはいろいろなものがあるのですが、VB2022のことを熟知するまでは「すべて保存」を使用してください

 プログラムの保存が出来たら実行してみましょう。画面上部の真ん中あたりにある「開始」をクリックしてください。プログラムが実行され、図1-7のような画面が別ウィンドウで表示されたと思います。

図1-7.プログラムの実行結果画面


[プログラムの解説]
 では、今作ったプログラムを1行ずつ見ていきましょう。今回のサンプルでは

Console.WriteLine(  )

というのがたくさん出てきますが、これはコンソール(操作卓、お使いのパソコンのこととお考えください)に1行で表示する「命令」です(VB2022では「関数」というのが正しい言い方ですが今のところコンピュータに指示を与える命令という理解でOKです)。Write(書く)という言葉を使っていますがコンピュータが鉛筆持って何か書くわけではなく、「画面に表示せよ」という意味です。
 何を表示するのかは続く(  )内で指示します。"Hello! VB2022"という指示ならコンソールにHello! VB2022と表示します。この" "で囲まれた部分をコンピュータプログラミングの世界ではストリングとか文字列と呼びます。
(  )の中がストリングではなく計算式ならその計算結果を表示します。3 + 5ならその計算結果の8を、3 - 5ならー2と表示します。注意することは計算式の場合は"  "で囲んではいけません。 "3 + 5" のようにやってしまうとこれはストリングになってしまい、画面には計算結果の8ではなく 3 + 5 と表示されてしまいます。
 最後の1行の Console.Readkey() はコンソールから1文字分の入力を受け付ける(パソコンのキーボードからです)命令ですが、これがないと実行終了と同時に実行結果画面が閉じてしまうために付け加えてあります。当分の間、プログラムの最後にはこれを付けることにします。

 実行結果と照らし合わせてプログラムの内容が確認できたら、マウスカーソルを実行結果画面(背景が黒いウィンドゥ)のどこかに持っていって任意の英数字キー、またはスペースキーかENTERキー(RETURNキー)を押してください。これで実行画面が閉じます(この操作は当カテゴリーで作成するほとんどのプログラムに共通します)。
 では、今日の実習はここまでにしておきますので、VB2022を終了しましょう。終了の仕方はVB2022の画面右上の×印をクリックするか、左上の「ファイル」をクリックし、開いたメニューの一番下にある「終了」をクリックします(図1-8)。WordやExcelなどの終了と同じです。


図1-8.VB2022の終了方法


[コンソールアプリで入門する理由]
 ここではプロジェクトの種類にコンソールアプリケーションを選びました。コンソールアプリケーションはコマンドライン上で動くプログラムで、画像や文字飾り等は扱えません。VBで作成したアプリケーションというと図1-9のようなものを思い浮かべる方が多いと思います(思い切り筆者の趣味が入ったサンプルでごめんなさい💦)。これはWindowsフォームアプリケーションといい、画像や文字飾りが使え、画面レイアウトも好きなようにできます。せっかくVB2022を覚えるならWindowsフォームアプリケーションをやりたい、その気持ちはよくわかります。ただ、Windowsフォームアプリケーションが作れるようになるためには、やれ、コントロールだ、プロバティだ、オブジェクトだとプログラミング以前にフォームデザインの部分で覚えなければならないことがドカンと出てきてしまって、本カテゴリーの目的からどんどん外れていってしまうのです。ここを読んでくださっている皆さんがこの勉強のために1日2時間以上、1か月以上の時間・期間を割けるのならそうするのですが、このカテゴリーは短期間(せいぜい1週間)、1日30分ほどの勉強でプログラミング的思考とコンピュータの基本を身につけなければならない方々を対象としたものです。
 ということで本カテゴリーでは始めはプログラミングの基本をすぐ学べるコンソールアプリケーションを使うことにします。

図1-9.Windowsアォームアプリの例

(注)
(*1)現段階では、VB2022ではプログラムのことはプロジェクトと呼ぶ、という理解でかまいません。
(*2)コンピュータに命令を与える言葉のことです。詳細は後で学びます
(*3)作ったプログラムで実際にコンピュータを動かすことを、コンピュータ屋さんはしばしば「実行する」とか「走らせる」という言い方をします。慣れておいてください。
(*4)コンピュータがブワンブワンとエンジンを鳴り響かせて走り出すわけではなく、誤動作によりキー入力やマウスクリックを受け付けなくなる状態のことです。
(*5)Windows10上でVB2022で作るプログラムではそこまで危険なことには普通ではなりませんが、それでも作業中にメモリ不足でコンピュータがフリーズしてしまって再起動を余儀なくされることはあります。
(*6)保存(Save)はプログラム作成途中でもできます。長いプログラムを作るときは、途中でこまめに保存しましょう。

- CafeNote -