第5講 配列の学習
第8話 3次元配列の利用による年間成績一覧表の作成
解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,j,k,max,min,w;
//189行加える
for(i=0;i<188;i++)dataGridView1->Rows->Add();
for(i=0;i<4;i++){
//1行目 見出し
if(i==0)dataGridView1[0,47*i]->Value =L"1学期";
if(i==1)dataGridView1[0,47*i]->Value =L"2学期";
if(i==2)dataGridView1[0,47*i]->Value =L"3学期";
if(i==3)dataGridView1[0,47*i]->Value =L"1年間";
//2行目 列見出し
dataGridView1[0,1+47*i]->Value =L"番号 ";
dataGridView1[1,1+47*i]->Value =L"国語 ";
dataGridView1[2,1+47*i]->Value =L"社会 ";
dataGridView1[3,1+47*i]->Value =L"数学 ";
dataGridView1[4,1+47*i]->Value =L"理科 ";
dataGridView1[5,1+47*i]->Value =L"社会 ";
dataGridView1[6,1+47*i]->Value =L"合計 ";
dataGridView1[7,1+47*i]->Value =L"平均 ";
dataGridView1[8,1+47*i]->Value =L"最高点 ";
dataGridView1[9,1+47*i]->Value =L"最低点 ";
dataGridView1[10,1+47*i]->Value =L"順位 ";
dataGridView1[11,1+47*i]->Value =L"合否 ";
dataGridView1[12,1+47*i]->Value =L"講評 ";
//43行から46行 行見出し
dataGridView1[042+47*i]->Value =L"合計 ";
dataGridView1[0,43+47*i]->Value =L"平均 ";
dataGridView1[0,44+47*i]->Value =L"最高点 ";
dataGridView1[0,45+47*i]->Value =L"最低点 ";
}
//出席番号とランダムデータ発生
int a[4][40][7];
for(i=0;i<3;i++){
for(j=1;j<=40;j++){
a[i][j-1][0]=j;
}
for(j=1;j<=40;j++){
for(k=1;k<=5;k++){
a[i][j-1][k]=rand()%101;
}
}
}
//出席番号とデータの表示
for(i=0;i<=2;i++){
for(j=1;j<=40;j++){
dataGridView1[0,47*i+j+1]->Value=a[i][j-1][0];
}
for(j=1;j<=40;j++){
for(k=1;k<=5;k++){
dataGridView1[k,47*i+j+1]->Value=a[i][j-1][k];
}
}
}
//各生徒の合計・平均の算出と表示
for(i=0;i<=2;i++){
for(j=1;j<=40;j++){
a[i][j-1][6]=0;
for(k=1;k<=5;k++){
a[i][j-1][6]=a[i][j-1][6]+a[i][j-1][k];
}
dataGridView1[6,47*i+j+1]->Value=a[i][j-1][6];
dataGridView1[7,47*i+j+1]->Value=(double)(a[i][j-1][6])/5;
}
}
//各生徒の最高点・最低点の算出と表示
for(i=0;i<=2;i++){
for(j=1;j<=40;j++){
max=0;min=100;
for(k=1;k<=5;k++){
if(a[i][j-1][k]>max)max=a[i][j-1][k];
if(a[i][j-1][k]<min)min=a[i][j-1][k];
}
dataGridView1[8,47*i+j+1]->Value=max;
dataGridView1[9,47*i+j+1]->Value=min;
}
}
//各生徒の合否・講評の算出と表示
for(i=0;i<=2;i++){
for(j=1;j<=40;j++){
if(a[i][j-1][6]>=250)dataGridView1[11,47*i+j+1]->Value=L"合格";
if(a[i][j-1][6]<250)dataGridView1[11,47*i+j+1]->Value=L"不合格";
}
for(j=1;j<=40;j++){
if(a[i][j-1][6]>=350)dataGridView1[12,47*i+j+1]->Value=L"上位合格です。";
if(a[i][j-1][6]<350 && a[i][j-1][6]>=280)dataGridView1[12,47*i+j+1]->Value=L"余裕で合格です。";
if(a[i][j-1][6]<280 && a[i][j-1][6]>=250)dataGridView1[12,47*i+j+1]->Value=L"ぎりぎり合格です。";
if(a[i][j-1][6]<250 && a[i][j-1][6]>=230)dataGridView1[12,47*i+j+1]->Value=L"後一歩で合格です。";
if(a[i][j-1][6]<230)dataGridView1[12,47*i+j+1]->Value=L"かなりの努力が必要です。";
}
}
//各教科の合計・平均・最高点・最低点の算出と表示
for(i=0;i<=2;i++){
for(j=1;j<=6;j++){
w=0;
for(k=1;k<=40;k++){
w=w+a[i][k-1][j];
}
dataGridView1[j,47*i+42]->Value=w;
dataGridView1[j,47*i+43]->Value=((double)w)/40;
}
dataGridView1[7,47*i+42]->Value=((double)w)/5;
dataGridView1[7,47*i+43]->Value=((double)w)/200;
for(j=1;j<=6;j++){
max=0;min=500;
for(k=1;k<=40;k++){
if(a[i][k-1][j]>max)max=a[i][k-1][j];
if(a[i][k-1][j]<min)min=a[i][k-1][j];
}
dataGridView1[j,47*i+44]->Value=max;
dataGridView1[j,47*i+45]->Value=min;
}
}
//成績順並び替え
int bn;
Object^ w1;
for(i=0;i<=2;i++){
for(j=40;j>=2;j--){
min=500;
for(k=1;k<=j;k++){
if(a[i][k-1][6]<min){
min=a[i][k-1][6];
bn=k;
}
}
for(k=0;k<=6;k++){
w=a[i][bn-1][k];
a[i][bn-1][k]=a[i][j-1][k];
a[i][j-1][k]=w;
}
for(k=0;k<=12;k++){
w1=dataGridView1[k,47*i+bn+1]->Value;
dataGridView1[k,47*i+bn+1]->Value=dataGridView1[k,47*i+j+1]->Value;
dataGridView1[k,47*i+j+1]->Value=w1;
}
}
}
//順位付け
for(i=0;i<=2;i++){
for(j=1;j<=40;j++){
dataGridView1[10,47*i+j+1]->Value=j;
}
for(j=2;j<=40;j++){
if(a[i][j-1][6]==a[i][j-2][6])dataGridView1[10,47*i+j+1]->Value=dataGridView1[10,47*i+j]->Value;
}
}
//出席順並び替え
for(i=0;i<=2;i++){
for(j=40;j>=2;j--){
max=0;
for(k=1;k<=j;k++){
if(a[i][k-1][0]>max){
max=a[i][k-1][0];
bn=k;
}
}
for(k=0;k<=6;k++){
w=a[i][bn-1][k];
a[i][bn-1][k]=a[i][j-1][k];
a[i][j-1][k]=w;
}
for(k=0;k<=12;k++){
w1=dataGridView1[k,47*i+bn+1]->Value;
dataGridView1[k,47*i+bn+1]->Value=dataGridView1[k,47*i+j+1]->Value;
dataGridView1[k,47*i+j+1]->Value=w1;
}
}
}
}
};
}
実行結果例
3次元配列、3次元ループとなって超難解になってしまいました。
難しくなりすぎてごめんなさい。
今回の課題が卒業研究ぐらいでもよかったですね。
解説は次話で行います。
課題を出しておきましょう。
今回の解答例では、3学期まで処理してありますが、
年間処理を行っていません。
各教科のデータは3学期の平均とします。
年間処理を行いましょう。
vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る