第4講 If文の学習
第7話 合計・平均・合否・講評の算出と表示
第6話問題解答例
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim i As Integer, j As Integer
'45行追加
For i = 1 To 45
DataGridView1.Rows.Add()
Next
'1行目に列見出しを入れる。
DataGridView1(0, 0).Value = "番号 "
DataGridView1(1, 0).Value = "国語 "
DataGridView1(2, 0).Value = "社会 "
DataGridView1(3, 0).Value = "数学 "
DataGridView1(4, 0).Value = "理科 "
DataGridView1(5, 0).Value = "英語 "
DataGridView1(6, 0).Value = "合計 "
DataGridView1(7, 0).Value = "平均 "
DataGridView1(8, 0).Value = "最高点"
DataGridView1(9, 0).Value = "最低点"
DataGridView1(10, 0).Value = "合否 "
DataGridView1(11, 0).Value = "講評 "
'41行から44行 行見出し
DataGridView1(0, 41).Value = "合計 "
DataGridView1(0, 42).Value = "平均 "
DataGridView1(0, 43).Value = "最高点"
DataGridView1(0, 44).Value = "最低点"
'出席番号とランダムデータの発生
For i = 1 To 40
DataGridView1(0, i).Value = i
For j = 1 To 5
DataGridView1(j, i).Value = Int(101 * Rnd())
Next
Next
'各生徒の5教科合計・平均・合否・講評の算出と表示
For i = 1 To 40
'合計・平均の算出
w = 0
For j = 1 To 5
w = w + DataGridView1(j, i).Value
Next
'合計・平均の表示
DataGridView1(6, i).Value = w
DataGridView1(7, i).Value = w / 5
'合否の表示
If w >= 250 Then
DataGridView1(10, i).Value = "合格"
Else
DataGridView1(10, i).Value = "不合格"
End If
'講評の表示
If w >= 350 Then
DataGridView1(11, i).Value = "上位合格です。"
Else
If w >= 280 Then
DataGridView1(11, i).Value = "余裕で合格です。"
Else
If w >= 250 Then
DataGridView1(11, i).Value = "ぎりぎり合格です。"
Else
If w >= 230 Then
DataGridView1(11, i).Value = "合格まで後一歩。"
Else
DataGridView1(11, i).Value = "よく勉強して再挑戦!"
End If
End If
End If
End If
Next
'教科合計・平均の算出と表示
For i = 1 To 5
'合計・平均の算出
w = 0
For j = 1 To 40
w = w + DataGridView1(i, j).Value
Next
'合計・平均の表示
DataGridView1(i, 41).Value = w
DataGridView1(i, 42).Value = w / 40
Next
End Sub
End Class
実行結果例
では、皆さん残りの最高点、最低点の算出と表示に入りましょう。
if文を使って、最大値、最小値を見つけるには次のようにします。
プログラミング例
Dim a1 As Integer,a2 As Integer,a3 As Integer,min As Integer,max As Integer
'サンプルデータ
a1=54
a2=4
a3=62
'最小値・最大値の初期化
min=100 //考えられる範囲の最も大きい値を選ぶ。
max=0 //考えられる範囲の最も小さい値を選ぶ。
//最小値の算出
If a1 < min then min = a1
If a2 < min then min = a2
If a3 < min then min = a3
//最大値の算出
If a1 > max then min = a1
If a2 > max then min = a2
If a3 > max then min = a3
//最小値・最大値の表示
Label1.Text=min
Label2.Text=max
解説
最小値を出す場合には、今考えている範囲では(最も大きい)あるいは(あり得ないほど大きい)値を選びます。
例えば、100点満点のテストの最低点を出すときには、min=100とかmin=1000にしておけばよいのです。
最低点は、基本的には100点未満です。この場合は、min=100でもいいことになります。
全員満点の可能性があるなら、min=101とかmin=1000等絶対にあり得ない値にしておけばよいのです。
こうしておけば最低点は必ずこれより低いはずです。
今回はmin=100としてプログラムを組んでいます。
常識的には、最低点は100点未満だからです。
If a1 < min then min = a1
a1と100を比較した場合、a1の方が小さいので、If文が実行されminは54に変更されます。
すると次のif文
If a2 < min then min = a2
は
If 42 < 54 then min=42
ですが42の方が小さいので再びif文は実行され、minは42になります。
すると3行目のif文
If a3 < min then min = a3
は、
if 62 < 42 then min=62
は条件の部分が満たされませんので実行されません。
結局、
min=42
と正しく認識されます。
最大値については、皆さんでトレースして下さい。
また、配列(添え字付き変数)を学んでいませんので、
If a1 < min then min = a1
If a2 < min then min = a2
If a3 < min then min = a3
の部分をFor文にすることはできませんが、
配列を学ぶとFor文を使い、
For i = 1 to 3
If a(i) <min then a(i)=min;
Next
とできます。配列の強さは、
For i = 1 to 100
If a(i) <min then a(i)=min;
Next
と変更するだけで、一気に3つのデータから10000個のデータを扱えるようになる点です。
配列がないと、10000回も
For i = 1 to 3
If a(i) <min then a(i)=min;
Next
のようなものを書かなければなりません。
また、変数も10000個用意しなければなりません。
皆さんは、配列はまだ学んでいませんが幸いにして基本的にはそれと同じであるDataGridView1(i,j)
を知っていますので、For文を使って最低点と最高点の算出ができることになります。
尚、DataGridView1(i,j)は実質添え字を2つ持つ2次元配列です。
それに対して添え字を一つしか持たないa(i)を1次元配列といいます。
4次元というと、霊の世界などを考え神秘的に考えてしまう人がいますが、
次元とは数学的には、座標数に過ぎません。
A(4,5,2,6)のように座標を4つもっていれば4次元なのです。
配列でもa(i,j,k,l)なら、4次元です。
アインシュタインの相対性理論も4次元空間理論です。
これは純粋な理論物理であり科学であり、神秘的な部分はどこにもありません。
霊と4次元を結びつけるのは、はっきり言って何の根拠もありません。
尚、添え字の扱い方はDataGridViewの場合、dataGridView1(列,行)
ですが、配列ではa(行,列)です。
DataGridViewの方が列→行なのに対して、配列では行→列であることと
VC++では、2次元配列はa[i][j]ですが、
VB(Visual Basic)ではa(i,j)です。
また、同じDataGridView1でもVC++ではdataGridView1[列,行]です。
DataGridViewとVC++とVBすべてで微妙に記述の仕方が変わります。
複数のプログラム言語を学ぶ際の困難は、基本的には文法が似ているのに、
『,』の使い方などが微妙に違い頭が混乱することです。
似ているのに少し違う、これが混乱の原因になります。
私が20年ぐらい前にプログラムの勉強を始めたとき、BASIC、パスカル、C言語、Quick Basic、C++などを同時に学習していましたが、
頭の中で混線してしまい、結局悩みつつC言語1本に絞っていきました。
最後まで、どちらにするか、悩んだのがパスカルです。
C言語同様、構造化プログラミング(各パーツが独立していて、プラモデルのように各部品から全体を組み立てることができるプログラミング)
が徹底していたからです。
結局パスカルは非常に魅力がありましたが、
パスカルを採用しているのは日立(日立製作所は公式言語にパスカルを選んでいました。)ぐらいで、
ほとんどのプログラマーが採用していたのがC言語ということで、C言語選んだのですが、
後にこれを悔やむことになります。時代はすでにC++(Cの拡張版)の時代となっていたからです。
Windows時代になり、VC++(C++の統合開発環境=C++を直感的に操作するツール)への変更を考え、
わざわざ1時間もかけて宇都宮に車でVC++を買いに行き、
レジまでVC++をもっていきましたが、なんと財布にはお金が入っていなくて、
VBA(エクセルに付いているVisual_Basic_for_Applications)で妥協してしまいました。
VBAは、マルチスレッド対応プログラミングができないということで、
この妥協も後に後悔することになりました。
そして、1年前にVC++2008を購入しWindows版マルチスレッド対応の数独問題作成ソフトVer.1を完成させました。
15年以上の迂回を経て、やっとVC++(C++の統合開発環境=C++を直感的に操作するツール)にたどり着いたのです。
ただ、Visual Basicの名誉のためにいっておけば、
かつてBASICの時代にあった二つの欠点、@コンパイラでないA構造化プログラミングができない、
はQuick Basicの時代にすでに解消されていました。
コンパイラというのは、プログラム言語をまとめて機械語に翻訳するソフトのことです。
簡単に言うとEXEファイル(実行ファイル)を作るものです。
EXEファイルとは、m.exe のようにクリックするだけで起動するファイルです。
VC++はVisual Basicに比べとやはり初心者には大変な言語です。
欠点が改善されたVBなら決してVC++に劣るということはありません。
マルチスレッドができないという欠点がありますが、
マルチスレッドは初心者の扱える代物ではありませんので、
初心者はVBからプログラミングの世界に入るのが正解だと思います。
また、また脱線が長くなりました。
さて、皆さんプログラムを組んで、最高点、最低点を表示させましょう。