【第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とは比べ物にならないくらい便利になったことがわかります。


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

名前

URL

メッセージ

- CafeNote -