第4講 If文(もしもボックスの世界)
第4話 100以下のランダムなデータを発生させて40人の合否を判定するソフト
実行画面が
各教科の点数をキーボードから入力して下さい。
出席番号=1
国語=42
社会=68
数学=35
理科=1
英語=70
合計点=216
出席番号1番は不合格
出席番号=2
国語=25
社会=79
数学=59
理科=63
英語=65
合計点=291
出席番号2番は不合格
・
・
・
出席番号=39
国語=29
社会=94
数学=49
理科=84
英語=8
合計点=264
出席番号39番は不合格
出席番号=40
国語=22
社会=11
数学=18
理科=14
英語=15
合計点=80
出席番号40番は不合格
(C言語入門から借用しているためにランダムデータは異なります。)
となるソフトのコード例
Module Module1
Sub Main() '私は社長だ。
Dim s, a, b, c, d, e, g As Integer 's:出席番号 a:国語 b:社会 c:数学 d:理科 e:英語 g:合計
Console.WriteLine ("各教科の点数をキーボードから入力して下さい。")
For s = 1 To 40
Console.WriteLine("出席番号={0:d}", s) '出席番号表示
'以下各教科得点ランダム発生
a = Int(Rnd() * 100) + 1
b = Int(Rnd() * 100) + 1
c = Int(Rnd() * 100) + 1
d = Int(Rnd() * 100) + 1
e = Int(Rnd() * 100) + 1
'以上各教科得点ランダム発生
g = a + b + c + d + e '合計点算出
'以下各教科得点、合計点、合否結果の表示
Console.WriteLine("合計点={0:d}", a) '国語得点の表示
Console.WriteLine("合計点={0:d}", b) '社会得点の表示
Console.WriteLine("合計点={0:d}", c) '数学得点の表示
Console.WriteLine("合計点={0:d}", d) '理科得点の表示
Console.WriteLine("合計点={0:d}", e) '英語得点の表示
Console.WriteLine("合計点={0:d}", g) '合計点の表示
Console.Write("出席番号{0:d}番は", s)
If g >= 300 Then Console.WriteLine ("合格") Else Console.WriteLine ("不合格") '合否結果の表示
Console.WriteLine()
Next
End Sub
End Module
皆さん、コンソール画面を上から下まで見て下さい。
ほとんどが不合格であることがわかります。
ランダムにデータを発生させる場合300点以上合格は厳しいということがわかります。
いったい合格倍率はどのぐらいでしょうか。
ソフトを改良して合格倍率=受験者数÷合格者数を出すソフトにしましょう。
・
・
・
出席番号39番は不合格
出席番号=40
国語=22
社会=11
数学=18
理科=14
英語=15
合計点=80
出席番号40番は不合格
合格倍率は*.*倍です。
(C言語入門から借用しているためにランダムデータは異なります。)
答えがわかってしまうと面白くないですから、
*.*
と伏せてありますが、小数第1位まで求めて下さい。
合格者数をカウントする整数型の変数
Dim cn As Integer
cn = 0
を宣言して0に初期化しておくとよいでしょう。
前に申し上げたことがありますが、
VBの場合には宣言すると自動的に0に初期化されますが、
C言語やC++では、初期化は自動的には行ってくれませんので、
VBでも初期化する習慣を身につけて下さい。
初期化は0とは限らないこともその理由でしたね。
例えば、階乗の計算ではaを1に初期化していますね。
初期化は意図的に行うようにした方が良いでしょう。
ただし、後に配列を学習すると変数は100個でも1万個でも扱えるようになります。
変数が数十万個であり、初期化は0であることがわかっている場合には、
初期化しない方がもちろん良いでしょう。
C言語やC++は処理速度ではプログラム言語のNo.1といわれていますが、
VBのように自動的に0に初期化してくれないので、
いちいち配列を0に初期化する必要があって、
せっかくの高速処理を妨げる要因になっています。
データ数が数万単位になるとさすがに、
コンピュータでも処理に負荷がかかり、
処理速度が遅くなってしまいます。
VBの場合自動的に0に初期化されることになっていますから、
配列などは0に初期化することは無駄なことをしていることになり、
処理速度を遅くするだけです。
変数が1個の時は、初期化が0であっても初期化するようにすると良いでしょう。
40 / cn は整数同士の演算で、
C言語など変数型の扱いが厳格になっているプログラム言語では、
整数に丸められてしまいますが、
VBが割り算に関しては柔軟に対応してくれて、
小数のまま処理してくれます。
尚、整数に丸めるという言葉が出てきましたが、
小数部分を切り捨てまたは四捨五入して整数にすることをその言葉は指しています。
切り捨てるのか四捨五入するかは、プログラム言語によって異なります。
いったい何倍程度になるのでしょうか。
楽しみですね。
尚、
If g >= 300 Then Console.WriteLine ("合格") Else Console.WriteLine
("不合格") '合否結果の表示
は合格の場合に2つの命令文を実行しなければなりませんから、
'合否結果の表示
If g >= 300 Then
Console.WriteLine ("合格")
・・・
Else
Console.WriteLine ("不合格")
End If
としておきましょう。
基本命令文が1つしかないときは、1文でも良いですが、
肯定部分でも否定部分でも命令文が複数になるときには、
上のようにすることをおすすめします。