第4講 if文の学習

第7話 合計・平均・合否・講評の算出と表示 

第6話問題解答例
#pragma once
#include<stdlib.h>
namespace 成績一覧表 {

    using namespace System;
          ・
          ・
          ・
#pragma endregion
    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            int i,j,max,min,w; //申し訳ありません。本日(2011/04/28)訂正させていただきました。

            //45行加える
            for(i=0;i<45;i++)dataGridView1->Rows->Add();

            //1行目 列見出し
            dataGridView1[0,0]->Value =L"番号 ";
            dataGridView1[1,0]->Value =L"国語 ";
            dataGridView1[2,0]->Value =L"社会 ";
            dataGridView1[3,0]->Value =L"数学 ";
            dataGridView1[4,0]->Value =L"理科 ";
            dataGridView1[5,0]->Value =L"社会 ";
            dataGridView1[6,0]->Value =L"合計 ";
            dataGridView1[7,0]->Value =L"平均 ";
            dataGridView1[8,0]->Value =L"最高点 ";
            dataGridView1[9,0]->Value =L"最低点 ";
            dataGridView1[10,0]->Value =L"合否 ";
            dataGridView1[11,0]->Value =L"講評  ";

            //出席番号とランダムデータの発生
            for(i=1;i<=40;i++){
              dataGridView1[0,i]->Value =i+L" ";
              for(j=1;j<=5;j++){
                dataGridView1[j,i]->Value =rand()%101;
              }
            }

            //42行から45行 行見出し
            dataGridView1[0,41]->Value =L"合計 ";
            dataGridView1[0,42]->Value =L"平均 ";
            dataGridView1[0,43]->Value =L"最高点 ";
            dataGridView1[0,44]->Value =L"最低点 ";

            //行(横)合計・平均・合否・講評の算出と表示
            for(i=1;i<=40;i++){
              //合計・平均の算出
              w=0;
              for(j=1;j<=5;j++){
                w=w+(int)(dataGridView1[j,i]->Value);
              }
              //合計・平均の表示
              dataGridView1[6,i]->Value=w;
              dataGridView1[7,i]->Value=((double)w)/5;  //申し訳ありません。本日(2011/04/28)訂正させていただきました。

              //合否の表示
              if(w>=250) dataGridView1[10,i]->Value=L"合格";
              if(w<250) dataGridView1[10,i]->Value=L"不合格";

              //講評の表示
              if(w>=350){
                dataGridView1[11,i]->Value=L"上位合格です。";
              }
              else{
                if(w>=280){
                  dataGridView1[11,i]->Value=L"余裕で合格です。";
                }
                else{
                  if(w>=250){
                    dataGridView1[11,i]->Value=L"ぎりぎり合格です。";
                  }
                  else{
                    if(w>=230){
                      dataGridView1[11,i]->Value=L"合格まで後一歩。";
                    }
                    else{
                      dataGridView1[11,i]->Value=L"よく勉強して再挑戦!";
                    }
                  }
                }
              }
            }

            //教科合計・平均の算出と表示
            for(i=1;i<=5;i++){
               //合計・平均の算出
               w=0;
               for(j=1;j<=40;j++){
                 w=w+(int)(dataGridView1[i,j]->Value);
               } 
               //合計・平均の表示
               dataGridView1[i,41]->Value=w;
               dataGridView1[i,42]->Value=w/40;
            }
            
          }
};
}
実行結果例
成績一覧表
成績一覧表合否
成績一覧表詳細

では、皆さん残りの最高点、最低点の算出と表示に入りましょう。
if文を使って、最大値、最小値を見つけるには次のようにします。

プログラミング例
  int a1,a2,a3,,min,max;

  //サンプルデータ
  a1=54;
  a2=42;
  a3=62;

  //最小値・最大値の初期化
  min=100; //考えられる範囲の最も大きい値を選ぶ。
  max=0; //考えられる範囲の最も小さい値を選ぶ。

  //最小値の算出
  if(a1<min)min=a1;
  if(a2<min)min=a2;
  if(a3<min)min=a3;

  //最大値の算出
  if(a1<max)max=a1;
  if(a2<max)max=a2;
  if(a3<max)max=a3;

  //最小値・最大値の表示
  label1->Text=min.ToString();
  label2->Text=max.ToString();

解説
最小値を出す場合には、今考えている範囲では(最も大きい)あるいは(あり得ないほど大きい)値を選びます。
例えば、100点満点のテストの最低点を出すときには、min=100とかmin=1000にしておけばよいのです。
最低点は、基本的には100点未満です。この場合は、min=100でもいいことになります。
全員満点の可能性があるなら、min=101とかmin=1000等絶対にあり得ない値にしておけばよいのです。
こうしておけば最低点は必ずこれより低いはずです。
今回はmin=100としてプログラムを組んでいます。
常識的には、最低点は100点未満だからです。
  if(a1<min)min=a1;
a1と100を比較した場合、a1の方が小さいので、if文が実行されminは54に変更されます。
すると次のif文
  if(a2<min)min=a2;

  if(42<54)min=42;
ですが42の方が小さいので再びif文は実行され、minは42になります。
すると3行目のif文
  if(a3<min)min=a3;
は、
  if(62<42)min=62;
は条件の部分が満たされませんので実行されません。
結局、
min=42
と正しく認識されます。

最大値については、皆さんでトレースして下さい。

また、配列(添え字付き変数)を学んでいませんので、
  if(a1<min)min=a1;
  if(a2<min)min=a2;
  if(a3<min)min=a3;
の部分をfor文にすることはできませんが、
配列を学ぶとfor文を使い、
  for(i=1;i<=3;i++){
    if(a[i]<min)a[i]min;
  }
とできます。for文の強さは、
  for(i=1;i<=10000;i++){
    if(a[i]<min)a[i]min;
  }
と変更するだけで、一気に3つのデータから10000個のデータを扱えるようになる点です。
配列がないと、10000行もif(a1<min)min=a1;のようなものを書かなければなりません。
また、変数も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[行][列]です。
違いは2点です。
DataGridViewの方が列→行なのに対して、配列では行→列であることと
[ ]の使い方の相違です。
VC++では、2次元配列はa[i][j]ですが、
VB(Visual Basic)ではa(i,j)です。
DataGridViewとVC++とVBすべてで微妙に記述の仕方が変わります。
複数のプログラム言語を学ぶ際の困難は、基本的には文法が似ているのに、
『,』の使い方などが微妙に違い頭が混乱することです。
似ているのに少し違う、これが混乱の原因になります。
私が20年ぐらい前にプログラムの勉強を始めたとき、BASIC、パスカル、C言語、Quick Basic、C++などを同時に学習していましたが、
頭の中で混線してしまい、結局悩みつつC言語1本に絞っていきました。
最後まで、どちらにするか、悩んだのがパスカルです。
C言語同様、構造化プログラミング(各パーツが独立していて、プラモデルのように各部品から全体を組み立てることができるプログラミング)
が徹底していたからです。
結局パスカルは非常に魅力がありましたが、
パスカルを採用しているのは日立(日立製作所は公式言語にパスカルを選んでいました。)ぐらいで、
ほとんどのプログラマーが採用していたのがC言語ということで、C言語選んだのですが、
後にこれを悔やむことになります。時代はすでにC++(Cの拡張版)の時代となっていたからです。
Windows時代になり、VC++(C++の拡張版=C++のWindows版)への変更を考え、
わざわざ1時間もかけて宇都宮に車でVC++を買いに行き、
レジまでVC++をもっていきましたが、なんと財布にはお金が入っていなくて、
VBA(エクセルに付いているVisual_Basic_for_Applications)で妥協してしまいました。
VBAは、マルチスレッド対応プログラミングができないということで、
この妥協も後に後悔することになりました。
そして、1年前にVC++2008を購入しWindows版マルチスレッド対応の数独問題作成ソフトVer.1を完成させました。
15年以上の迂回を経て、やっとVC++(C++の拡張版=C++のWindows版)にたどり着いたのです。

ただ、Visual Basicの名誉のためにいっておけば、
かつてBASICの時代にあった二つの欠点、@コンパイラでないA構造化プログラミングができない、
はQuick Basicの時代にすでに解消されていました。
コンパイラというのは、プログラム言語をまとめて機械語に翻訳するソフトのことです。
簡単に言うとEXEファイル(実行ファイル)を作るものです。
EXEファイルとは、m.exe のようにクリックするだけで起動するファイルです。

また、また脱線が長くなりました。
さて、皆さんプログラムを組んで、最高点、最低点を表示させましょう。



第6話へ 第8話へ

025


vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る