第4講 if文の学習

第13話 順位(ランク)付けと出席番号順並び替え
ソース例
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
                ・
                ・
                ・
           //データ並び替え
           int bn;
           
Object^ w1; //Object^型変数の用意
 
           for(i=40;i>=2;i--){
             min=500;
             for(j=1;j<=i;j++){
               if((int)(dataGridView1[6,j]->Value)<=min){
                 min=(int)(dataGridView1[6,j]->Value);
                 bn=j;
               }
             }
             for(j=0;j<=12;j++){
               w1=dataGridView1[j,bn]->Value;  //キャストが必要ない
               dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;  //ここもキャストは必要ない
               dataGridView1[j,i]->Value=w1; //ここもキャストは必要ない
             }
           }
                
           //順位付け
           for(i=1;i<=40;i++){
             dataGridView1[11,i]->Value=i;
           }
           for(i=2;i<=40;i++){
             if((int)(dataGridView1[6,i-1]->Value)==(int)(dataGridView1[6,i]->Value))dataGridView1[11,i]->Value=dataGridView1[11,i-1]->Value;
           }
    }
};
}
実行例
順位付け
ランクデータ並び替え
(合計と順位だけを抜き出した。)

解説
           for(i=1;i<=40;i++){
             dataGridView1[11,i]->Value=i;
           }

は仮の順位付けです。
上から順番に1位から40位まで順位がつきます。
これだと同じ点なのに別順位がしまうという問題を残します。
その問題を解消するのが次のfor文です。
           for(i=2;i<=40;i++){
             if((int)(dataGridView1[6,i-1]->Value)==(int)(dataGridView1[6,i]->Value))dataGridView1[11,i]->Value=dataGridView1[11,i-1]->Value;
           }

同点なら
ランク
Object^
前の人の順位をその人の順位にしています。
訂正前は、出席番号25番の人は22位となっていたわけですが、21位と訂正されています。

さて、いよいよ出席番号順に並び替えてこの講の課題は遂行されたことになります。
ソース例は、30行下。





























#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
                ・
                ・
                ・

           //データ並び替え
           int bn;
           
Object^ w1; //Object^型変数の用意
 
           for(i=40;i>=2;i--){
             min=500;
             for(j=1;j<=i;j++){
               if((int)(dataGridView1[6,j]->Value)<=min){
                 min=(int)(dataGridView1[6,j]->Value);
                 bn=j;
               }
             }
             for(j=0;j<=12;j++){
               w1=dataGridView1[j,bn]->Value;  //キャストが必要ない
               dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;  //ここもキャストは必要ない
               dataGridView1[j,i]->Value=w1; //ここもキャストは必要ない
             }
           }

                
           //順位付け
           for(i=1;i<=40;i++){
             dataGridView1[11,i]->Value=i;
           }
           for(i=2;i<=40;i++){
             if((int)(dataGridView1[6,i-1]->Value)==(int)(dataGridView1[6,i]->Value))dataGridView1[11,i]->Value=dataGridView1[11,i-1]->Value;
           }


           //出席番号並び替え
          for(i=40;i>=2;i--){
            max=0;
            for(j=1;j<=i;j++){
              if((int)(dataGridView1[0,j]->Value)>max){
                max=(int)(dataGridView1[0,j]->Value);
                bn=j;
              }
            }
            for(j=0;j<=12;j++){
              w1=dataGridView1[j,bn]->Value;
              dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
              dataGridView1[j,i]->Value=w1;
            }
          }

    }
};
}
実行例
成績一覧表

成績一覧表詳細
順位付けに成功しました。
よく考えてみると、合否と順位の列は逆の方がいいですね。
皆さん、逆にしてください。
成績一覧表詳細
訂正箇所は皆さん、よく考えてください。


第12話へ 第5講第1話へ

025


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

数学研究室に戻る