第5講 配列の学習
第10話 3次元配列の利用による年間成績一覧表の作成の解説その2
今日は残りを解説しましょう。
//各生徒の合否・講評の算出と表示
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;
}
}
}
'各学期合否・講評の算出・表示
//各生徒の合否・講評の算出と表示
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"かなりの努力が必要です。";
}
}
は合否と講評です。わかりやすさを優先してIf...Else...文は使わず、すべて肯定表現
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++)となっていますので同様なことを3回繰り返しています。
1回目が1学期、2回目が2学期、3回目が3学期です。すべての処理が3回繰り返されます。
//各教科の合計・平均・最高点・最低点の算出と表示
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;
}
}
ここでは、各学期の各教科および合計点の合計を計算して、
それぞれの合計と平均を表示しています。
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;
では赤の枠を計算しています。平均は小数になってしまうので、配列の対象にしていませんでした。
そこで茶色の枠の値を使い、平均の合計と平均の平均を計算しています。
合計の合計を5教科の5で割れば、平均の合計値になります。
また、合計の合計を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;
}
}
}
ですが、 a[i][j-1][k]のj-1とdataGridView1[k,47*i+j+1]->Valueのj+1の間に2つのずれがあることを把握すれば、
第7話で解説したものと代わりありません。第7話では1つのずれだったのが2つになったのは、各学期の見出し行に1行追加したからです。
見出し行と列見出しの2行分ずれているわけです。
//順位付け
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;
}
}
第7話で解説したとおりです。それが3回繰り返されている点以外は変わりません。
//出席順並び替え
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;
}
}
}
については、
//成績順並び替え
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;
}
}
}
と基本的に同じです。
基準になっているのがa[i][k-1][6] かa[i][k-1][0]の違いと
降順と昇順の違いがあるだけです。a[i][k-1][6]とは合計値、a[i][k-1][0]とは出席番号でした。
この講は難解になってしまって申し訳ありません。
成績一覧表を題材にしてしまったことが原因です。
これでこの講は閉じて、次講ではC言語のもっとも大きな特徴の1つであるポインタについて学習していきます。
第9話へ 第6講第1話へ
vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る